Premi qui per scaricare il PDF
In questa lezione vedremo degli esercizi di programmazione in C sugli array, sulle stringhe (gets) e sulle struct.
Esercizio 1
Scrivere un programma che chiede all’utente di inserire una stringa (di al più 1000 caratteri) e stampa a video sia il numero di parole presenti nella frase sia il numero di vocaboli che iniziano con il carattere ‘C’ (oppure ‘c’). La frase termina con un punto; nella frase non sono presenti altri segni di interpunzione e le parole sono separate unicamente da 1 spazio.
Ad esempio inserendo la frase “Tutte le variabili C prima di essere utilizzate devono essere dichiarate.” si avrà come risultato: 11 parole, 1 inizia con la lettera C.
#include < stdio.h>
#include < string.h>
#define MAXCHAR 1000
int main()
{
char frase [MAXCHAR+1];
int i, numparole, numc;
numparole = 0;
numc = 0;
printf("Immetti una frase");
gets(frase);
if (frase[0] == 'c' || frase[0] == 'C')
numc++;
for (i = 0; frase[i] != '\0'; i++)
if(frase[i] == ' ' || frase[i] == '.')
{
numparole++;
if (frase[i+1] == 'c' || frase[i+1] == 'C')
numc++;
}
printf("Il numero di parole è: %d, delle quali %d iniziano per C", numparole, numc);
return 0;
}
gets(nome_array); → acquisisce tutto quello che è stato scritto fino all’invio (anche gli spazi, che la scanf non riesce ad acquisire).
Esercizio 2
Si sviluppi un programma che svolga le seguenti operazioni:
‐ Acquisisce le informazioni relative a 5 studenti e le memorizza in un array. I dati identificativi degli utenti sono:
- Nome (stringa di massimo 20 caratteri)
- Cognome (stringa di massimo 50 caratteri)
- Matricola (numero intero).
- ‐ Completata l’acquisizione, richiede all’utente di inserire il numero di matricola di uno studente di cui cercare le informazioni nell’array.
- ‐ Effettua la ricerca e stampa i dati che eventualmente verranno trovati nell’array.
#include < stdio.h>
#define DIM_cognome 50
#define DIM_nome 20
#define num_studenti 5
typedef struct studente
{
char nome[DIM_nome];
char cognome[DIM_cognome];
int matricola;
} studente;
int main()
{
studente classe[num_studenti];
int i, trova_matricola, sentinella;
//ACQUISISCO I DATI DEGLI STUDENTI
for (i = 0; i < num_studenti; i++)
{
printf("Inserisci il nome del %d studente", i+1);
gets (classe[i].nome);
printf("Inserisci il cognome del %d studente", i+1);
gets (classe[i].cognome[i]);
printf("Inserisci il nome del %d studente", i+1);
scanf ("%d",&classe[i].matricola);
}
printf("Inserisci la matricola di uno studente per vedere i suoi dati");
scanf("%d", &trova_matricola);
//SCANDISCO L'ARRAY PER STAMPARE I DATI DELLO STUDENTE
for(i = 0, sentinella = 0; i < num_studenti && !sentinella; i++)
if (trova_matricola == classe[i].matricola)
{
sentinella = 1;
printf("I dati della matricola numero %d\n", trova_matricola);
printf("Nome: %s\n", classe[i].nome);
printf("Cognome: %s\n", classe[i].cognome);
}
if(!trovato) //!trovato equivale a trovato == 0
{
printf("ATTENZIONE, La matricola inserita non e' stata trovata\n");
}
return 0;
}
La variabile sentinella ci serve per controllare che la matricola non sia stata ancora trovata. Appena la variabile cambiavalore, il ciclo termina. Sentinella è uguale a 0, per rimanere nel ciclo deve essere !sentinella che equivale a sentinella == 0
Esercizio 3
Sviluppare un programma che svolga le seguenti operazioni:
‐ Acquisisce informazioni relative ad una serie di rilievi altimetrici, fino ad un massimo di 10 rilievi.
Ogni rilievo è caratterizzato da:
- latitudine (float);
- longitudine (float);
- altitudine (float, da considerarsi in metri).
- Terminata la fase di acquisizione, richiede all’utente un valore di altitudine di riferimento;
- Stampa sullo schermo le informazioni relative a tutti i rilievi per i quali il valore dell’altitudine è superiore al valore di riferimento inserito.
#include < stdio.h>
#define NUM 10
#typedef struct dato
{
float longi;
float lat;
float alt;
}dato;
int main()
{
dato rilevamenti[NUM];
int i, trovato;
float alt_rif;
for(i = 0; i < NUM; i++)
{
printf("Inserisci i dati della longitudine del %d rilevamento", i+1);
scanf("%f",&rilevamenti[i].longi);
printf("Inserisci i dati della latitudine del %d rilevamento", i+1);
scanf("%f",&rilevamenti[i].lat);
printf("Inserisci i dati dell'altezza del %d rilevamento", i+1);
scanf("%f",&rilevamenti[i].alt);
}
printf("Inserisci il valore dell'altitudine di riferimento");
scanf("%f", alt_rif);
for(i = 0, trovato = 0; i < NUM; i++)
if(alt_rif < rilevamenti[i].alt)
{
trovato++;
printf("I dati del %d rilevamento sono:\n", i+1);
printf("latitudine: %f\n longitudine:%f\n, altezza:%f\n", &rilevamenti[i].lat, &rilevamenti[i].longi, &rilevamenti[i].alt);
}
if (!trovato) //se trovato è rimasto a 0
{
printf("ATTENZIONE, non esiste nessuna rilevazione maggiore dell'altezza inserita");
}
return 0;
}