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);
}
Scarica

Eser 1.2