-
Notifications
You must be signed in to change notification settings - Fork 0
/
data.c
81 lines (77 loc) · 2.58 KB
/
data.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
/*
* Programma di esempio: lettura e controllo di una data
* Author: ER
* Date: 2022/10/19
* Note:
*/
#include <stdio.h>
// per comodità (in C non esiste il tipo bool...)
#define FALSE 0
#define TRUE 1
int main(int argc, char *args[])
{
printf("Esempio di input di una data in formato GG/MM/AAAA\n");
printf("con controllo di validità e opportuni messaggi di errore\n");
int giorno, mese, anno;
int valido = FALSE;
do
{
printf("Immetti una data in formato GG/MM/AAAA: ");
// int letti = scanf("%d/%d/%d", &giorno, &mese, &anno);
// the following should match also GG-MM-AAAA and GG.MM.AAAA
int letti = scanf("%d%*[-./]%d%*[-./]%d", &giorno, &mese, &anno);
if (letti != 3) // manca qualcosa ...
{
printf("La data non è nel formato valido\n");
}
else if (mese < 1 || mese > 12)
{
printf("Il mese dev'essere compreso tra 1 (gennaio) e 12 (dicembre)\n");
}
else
{
int giorni;
if (mese == 2) // febbraio
{
giorni = (anno % 400 == 0) || ((anno % 4 == 0) && (anno % 100 != 0)) ? 29 : 28;
}
else if (mese < 8) // gennaio, marzo-luglio
{
giorni = 30 + (mese % 2); // 31 per 1 gennaio, 3 marzo, 5 maggio, 7 luglio
}
else // agosto-dicembre
{
giorni = 31 - (mese % 2); // 30 per 9 settembre, 11 novembre
}
// possibile alternativa
if (mese == 2) // febbraio
{
giorni = (anno % 400 == 0) || ((anno % 4 == 0) && (anno % 100 != 0)) ? 29 : 28;
}
else if (mese == 4 || mese == 6 || mese == 9 || mese == 11) // aprile, giugno, settembre, novembre
{
giorni = 30;
}
else // tutti gli altri
{
giorni = 31;
}
if (giorno < 1 || giorno > giorni)
{
printf("Il giorno dev'essere compreso tra 1 e %d \n", giorni);
}
else
{
valido = TRUE;
}
}
scanf("%*[^\n]"); // discard rest of the buffer...
} while (!valido);
printf("La data accettata e': %02d/%02d/%04d \n", giorno, mese, anno);
// data come numero AAAAMMGG
// (in quest'ordine perché così posso confrontare date come numeri)
int data = ((anno * 100) + mese) * 100 + giorno;
printf("La data numerica e': %08d \n", data);
// termine con codice 0 = successo
return 0;
}