Esercizi in C – Lezione del 23 Ottobre

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:

  1. Nome (stringa di massimo 20 caratteri)
  2. Cognome (stringa di massimo 50 caratteri)
  3. 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:

  1. latitudine (float);
  2. longitudine (float);
  3. 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;
}

Premi qui per scaricare il PDF