Università degli Studi di Brescia Fondamenti di Programmazione Docente: Alessandro Saetti A.A. 2012/2013 ESERCITAZIONE STRUTTURE DI CONTROLLO E VETTORI Università degli Studi di Brescia A.A. 2012/2013 Scrivere un programma C che - Acquisisca da tastiera date fintantoché la data immessa è diversa da 0/0/0 - Stampi a video la data che viene prima nel calendario (quella più vecchia) Scrivere un programma C che - Acquisisca da tastiera date fintantoché la data immessa è diversa da 0/0/0 - Stampi a video la data che viene prima nel calendario (quella più vecchia) Impostiamo la struttura di partenza di un programma C Scrivere un programma C che - Acquisisca da tastiera date fintantoché la data immessa è diversa da 0/0/0 - Stampi a video la data che viene prima nel calendario (quella più vecchia) #include <stdio.h> #include <stdlib.h> int main() { // . . . system("pause"); return(0); } START int a,m,g; printf("Immetti le date (0/0/0)\n"); do { printf("-->"); scanf("%d/%d/%d",&g,&m,&a); Leggo giorno/mese/anno // Determino se è la minima Determino se è la minima } while (!(g==0 && m==0 & a==0)); S I g/m/a!=0/0/0 STOP Scrivere un programma C che - Acquisisca da tastiera date fintantoché la data immessa è diversa da 0/0/0 - Stampi a video la data che viene prima nel calendario (quella più vecchia) Iniziamo a considerare la massima data minima possibile. Ad esempio 31/12/2099: int min_a=2099,min_m=12, min_g=31; // Determino il minimo Man mano procediamo con la lettura valutiamo se la data appena letta g/m/a (che deve essere diversa da 0/0/0) risulta minore rispetto a quella minima attuale min_g/min_m/min_a. Se così fosse aggiorno la data minima attuale con g/m/a. if (a > 0 && m > 0 && g >0) { if (a < min_a) { min_a=a; min_m=m; min_g=g; } else if ((m<min_m) && (a==min_a) ) { min_m=m; min_g=g; } else if ((g<min_g) && (m==min_m) && (a==min_a)) min_g=g; } START Ipotizzo una data minima iniziale: min_g/min_m/min_a 31/12/2099 Leggo il giorno, il mese e l’anno: g/m/a g/m/a!=0/0/0 SI NO min_g/min_m/min_a < g/m/a S I min_g/min_m/min_a = g/m/a g/m/a != 0/0/0 NO printf("%d/%d/%d\n",min_g,min_m,min_a); NO Stampa data minima STOP S I Scrivere un programma C che - Acquisisca da tastiera date fintantoché la data immessa è diversa da 0/0/0 - Stampi a video la data che viene prima nel calendario (quella più vecchia) #include <stdio.h> #include <stdlib.h> int main() { int a,m,g; int min_a=2099,min_m=12, min_g=31; printf("Immetti le date (0/0/0)\n"); do { printf("-->"); scanf("%d/%d/%d",&g,&m,&a); if (a > 0 && m > 0 && g >0) // Determino il minimo { if (a < min_a) { min_a=a; min_m=m; min_g=g; } else if ((m<min_m) && (a==min_a) ) { min_m=m; min_g=g; } else if ((g<min_g) && (m==min_m) && (a==min_a)) min_g=g; } } while (!(g==0 && m==0 & a==0)); printf("%d/%d/%d\n",min_g,min_m,min_a); system("pause"); return(0); } SOLUZIONE ALTERNATIVA: Se trasformiamo ogni data g/m/a nel numero a*10000+m*100+g otteniamo una sequenza che ordinata numericamente mantiene la stessa corrispondenza con l’ordinamento cronologico. Trasformando g/m/a in un numero riusciamo a semplificare le condizioni #include <stdio.h> #include <stdlib.h> int main() { int a,m,g; int min_d=20991231, d; printf("Immetti le date (0/0/0)\n"); do { printf("-->"); scanf("%d/%d/%d",&g,&m,&a); d=a*10000+m*100+g; if ( (d > 0) && (d < min_d) ) min_d=d; } while (d>0); g=min_d % 100; m=( (min_d - g)/100) % 100; a=(min_d - m*100-g )/10000; printf("%d/%d/%d\n",g,m,a); system("pause"); return(0); }