Esercizi in C – Lezione del 30 Ottobre 2020

Premi qui per scaricare il PDF

Prima di Iniziare

getchar() → acquisisce un carattere. Lo utilizziamo per “mangiare” il carattere invio. Quando facciamo una scanf(“%s”, &x) e inseriamo un carattere, alla pressione del tasto invio, questo rimane nella memoria e potremmo avere problemi in una prossima scanf. Inserendo il getchar(), esso acquisisce il carattere invio liberando così la memoria. 

Solitamente questo problema si presenta quando facciamo due scanf consecutive di variabili di tipo diverso (prima un int e dopo una stringa)

fflush() → è analogo a getchar() e ripulisce il buffer di memoria da eventuali caratteri invio.

scanf("%s", &x); //Input X
scanf("%s", &z); //in memoria rimane , Input:Z
//La scanf in questione acquisirà come carattere, l'invio.

//RISOLUZIONE

scanf("%s", &x);//Input X
getchar(); //Acquisisce 
scanf("%s", &z); //input Z

Esercitazione in C

In questa esercitazione, vedremo alcuni esercizi di programmazione in C con le relative soluzioni. Opereremo con struct, array e cicli.

Esercizio 1

Si sviluppi un programma in C che svolga le seguenti operazioni:
  • Definisce un tipo di dato che descrive un prodotto in vendita. Ogni prodotto è caratterizzato dalle seguenti informazioni:
  1. Codice (numero intero), deve essere univoco;
  2.  Nome (stringa di massimo 50 caratteri);  
  3. Prezzo (numero reale);
  4. Numero pezzi disponibili a magazzino (numero intero).
  • Il programma acquisisce fino ad un massimo di 10 prodotti richiedendo le informazioni all’utente e procede con un inserimento ordinato per codice (lo scopo dell’esercizio è ordinare i prodotti durante il processo di inserimento degli stessi e non dopo averli inseriti tutti con un algoritmo di ordinamento). Se l’utente inserisce un codice che già esiste, deve essere richiesto fino all’inserimento di un nuovo codice.
  • Il programma richiede all’utente di inserire un numero di pezzi che verrà usato come valore soglia per estrarre i prodotti che hanno pochi pezzi in magazzino;
  • Il programma stampa a video tutti i prodotti che hanno in magazzino meno del numero di pezzi inserito dall’utente (valore soglia). Se nessun prodotto ha meno pezzi di quanto indicato il programma stampa a video un messaggio opportuno.

#include <'string.h>
#include <'stdio.h>  

#define nomep 50
#define max_prod 10

typedef struct prodotto
{
	int codice;
	char nome[nomep +1];
	float prezzo;
	int numeropezzi;
} prodotto;

int main()
{
	prodotto prodotti [max_prod], p;
	int i, j, numprodotti, decisione, soglia;
	int trovato, controllo = 0;
	numprodotti = 0;
	decisione = 0;
	printf("Vuoi inserire un prodotto? 1 -si, 0 -no\n");
	scanf("%d", &decisione);	

	while (decisione && numprodotti < max_prod)//decisione non deve valere 0
	{
		do
		{
			trovato = 0;
			printf("Codice:\n");
			scanf("%d", &p.codice);
			for (i = 0; i < numprodotti && !trovato; i++) //!trovato equivale a trovato == 0
				if (prodotti[i].codice == p.codice)
					trovato = 1;
		}while (trovato); //trovato != 0
		printf("Inserisci il nome del prodotto\n");
		getchar(); //Per eliminare l' dal buffer di memoria della precedente scanf
		gets(p.nome);
		printf("Inserisci il prezzo:\n");
		scanf("%f", &p.prezzo);
		printf("Immetti il numero di pezzi:\n");
		scanf("%d", &p.numeropezzi);
		
		if (numprodotti == 0)
			prodotti[0] = p; //Copio la struct nella struct con array
		else
		{
			//Ordinamento di prodotti per codice in ordine crescente
			for(i = 0; i < numprodotti && prodotti[i].codice < p.codice; i++); for(j = numprodotti; j > i; j--)
				prodotti[j] = prodotti [j-1]; //Sposto tutti i prodotti di 1 posizione verso destra
			prodotti[i] = p; //Inserisco il prodotto, nell'array di prodotti, ordinato in ordine crescente
		} 
		numprodotti++;
		printf("Vuoi inserire un altro prodotto? 1 -si, 0 -no\n");
		scanf("%d", &decisione);
	}

	printf("Inserisci la soglia minima di pezzi che vuoi visualizzare\n");
	scanf("%d", &soglia);

	for(i = 0; i < numprodotti; i++)
  {
		if (prodotti[i].numeropezzi <= soglia)
		{
      controllo ++;
			printf("Il prodotto che ha un numero di pezzi minore di %d, e'\n", soglia);
			printf("Codice:%d\n", prodotti[i].codice);
			printf("Nome:%s\n", prodotti[i].nome);
			printf("Prezzo:%f\n", prodotti[i].prezzo);
			printf("Numero di pezzi:%d\n", prodotti[i].numeropezzi);
		}
}
if(!controllo)
	printf("NESSUN prodotto ha MENO di %d pezzi", soglia);

	return 0;
}

Esercizio 2

Scrivere un programma in C che permetta di inserire i dati relativi agli esami sostenuti da studenti (Massimo 500). Il programma deve: Definire un tipo di dato che descrive uno studente e l’insieme degli esami da lui sostenuti. Lo studente è caratterizzato da: o Nome (stringa di massimo 50 caratteri); o Cognome (stringa di massimo 50 caratteri); o Data di nascita, nel formato giorno, mese abbreviato, anno (esempio: 25-Gen-2020); o Elenco di massimo 29 esami, dove ogni esame è caratterizzato da:

  • Nome insegnamento (Stringa di massimo 100 caratteri);
  • Data nella quale è stato sostenuto (Stesso formato della data di nascita);
  • *Voto conseguito (Numero intero tra 1 e 30). Chiedere all’utente di inserire dati relativi agli studenti:
  1. Nome, cognome e data di nascita;
  2. Numero di esami sostenuti e relativi dati. Verificare che il voto sia compreso tra 1 e 30.*

Chiedere all’utente di inserire il nome di un insegnamento; Stampare a video gli studenti che hanno sostenuto l’esame per l’insegnamento inserito (nome e cognome studente, data, voto) e la media dei voti conseguiti. Se nessun studente ha sostenuto l’esame il programma stampa a video un messaggio opportuno.

#include <'stdio.h>
#include <'string.h>

#define DIM 50
#define DIM2 100
#define MESI 3
#define n_esami 29
#define stud_corso 2

typedef struct data
{
	int giorno;
	char mese[MESI+1];
	int anno;
}data;

typedef struct esame
{
	char corso[DIM2+1];
	data data_sostenuto;
	int voto; 
}esame;

typedef struct studente
{
	char nome[DIM+1];
	char cognome[DIM+1];
	data nascita;
	esame libretto[n_esami];
  int num_esami_dati;
}studente;

int main()
{
	studente aula[stud_corso];
	int i,j, sostenuto_da = 0, confronta;
  char nome_corso[DIM2+1];
	
	//ACQUISIZIONE DATI STUDENTI
	for(i = 0; i < stud_corso; i++)
	{
		printf("Inserisci il cognome dello studente\\n");
		gets(aula[i].cognome);
		printf("Inserisci il nome dello studente\\n");
		gets(aula[i].nome);
		printf("Inserisci il giorno di nascita dello studente %s\\n", aula[i].cognome);
		scanf("%d", &aula[i].nascita.giorno);
		printf("Inserisci il mese di nascita dello studente %s\\n", aula[i].cognome);
    getchar(); //Libero la memoria dai caratteri invio
		gets(aula[i].nascita.mese);
		printf("Inserisci l'anno di nascita dello studente %s\\n", aula[i].cognome);
		scanf("%d", &aula[i].nascita.anno);
    printf("Quanti esami ha sostenuto lo studente (Max 29 esami) %s\\n", aula[i].cognome);
    scanf("%d", &aula[i].num_esami_dati);
    getchar();
	}
	for (i = 0; i < stud_corso; i++)
	  for (j = 0; j < aula[i].num_esami_dati && j < 29; j++)
	  {
      printf("Inserisci il corso del quale %s ha sostenuto l'esame\\n", aula[i].cognome);
	    gets(aula[i].libretto[j].corso);
      printf("Inserisci il giorno in cui %s ha sostenuto l'esame\\n", aula[i].cognome);
		  scanf("%d", &aula[i].libretto[j].data_sostenuto.giorno);
      printf("Inserisci il mese in cui %s ha sostenuto l'esame\\n", aula[i].cognome);
      getchar(); //Libero la memoria dai caratteri invio
		  gets(aula[i].libretto[j].data_sostenuto.mese);
      printf("Inserisci l'anno in cui %s ha sostenuto l'esame\\n", aula[i].cognome);
		  scanf("%d", &aula[i].libretto[j].data_sostenuto.anno);
      getchar(); //Libero la memoria dai caratteri invio
      do
      {
        printf("Inserisci il voto dell'esame\\n");
		    scanf("%d", &aula[i].libretto[j].voto);
        getchar();
        if (aula[i].libretto[j].voto < 1 || aula[i].libretto[j].voto > 30)
          printf("ATTENZIONE, inserisci un voto compreso tra 1 e 30\\n");
      } while (aula[i].libretto[j].voto < 1 || aula[i].libretto[j].voto > 30);
	  }
  printf("Insersci il nome del corso per vedere quanti studenti lo hanno sostenuto\\n");
  gets(nome_corso);
  
  for (i = 0; i < stud_corso; i++)
    for (j = 0; j < aula[i].num_esami_dati; j++)
    {
      confronta = strcmp(aula[i].libretto[j].corso, nome_corso);
      if(confronta == 0)
      {
        sostenuto_da++;
        printf("Il nome del %d studente che ha sostenuto l'esame e' %s\\n", i+1, aula[i].nome);
        printf("Il cognome del %d studente che ha sostenuto l'esame e' %s\\n", i+1, aula[i].cognome);
        printf("Il voto del %d studente che ha sostenuto l'esame e' %d\\n", i+1, aula[i].libretto[j].voto);
        printf("L'esame e' stato sostenuto in data %d, %s, %d", aula[i].libretto[j].data_sostenuto.giorno, aula[i].libretto[j].data_sostenuto.mese, aula[i].libretto[j].data_sostenuto.anno);
      }
    }
  if(!sostenuto_da)
    printf("Nessuno studente ha sostenuto l'esame di %s", nome_corso);

	return 0;
}

Cambiare i valori nelle define per adattare l’esercizio alla traccia.

Premi qui per scaricare il PDF