Newsgroup: it.comp.lang.c
Titolo: Programma che calcoli la data di nascita

Ciao a tutti!
Avrei bisogno di sapere come si fa a creare un programma che calcoli
la data di nascita, controllando che la data sia esatta (nel senso che
non deve accettare date come per esempio 32/13/3330);
Dovrei realizzare il tutto con degli if annidati;
Aiutatemi!!!
Grazie in anticipo per la collaborazione!

Andy Warner ha scritto:

(Dopo le recenti discussioni, non so più bene se siamo OT o no.
Comunque...)
Dipendesse da me, farei innanzi tutto l'input dei tre numeri senza nessun
controllo (odio i controlli sintattici durante la digitazione!). Ottenuti
i tre numeri, li controllerei in ordine di durata decrescente: anno, mese,
giorno.
Per l'anno, l'unica regola assoluta è che non è accettabile il valore
zero: l'anno precedente l'1 dopo Cristo fu infatti l'1 avanti Cristo (cioè
il -1).
Per il mese, basta ovviamente controllare che il numero sia compreso fra 1
e 12.
Per il giorno, le specifiche di programma dicono:
   "Trenta giorni ha novembre con april, giugno e settembre.
   Di ventotto ce n'è uno, tutti gli altri ne han trentuno."
Il modo migliore di tradurre la vecchia filastrocca in C è di fare un
array di 12 int da indicizzare con il numero del mese (meno uno, perché il
primo elemento di un array ha indice zero).
Ma se il mese vale 2 (febbraio), bisogna anche determinare se l'anno è
bisestile, nel qual caso i giorni sono 29. Il project manager (papa
Gregorio XIII) ha stabilito la seguente regola:
   "Un anno è bisestile se il suo numero è divisibile per 4,
   tranne che se sia divisibile per 100, ma è bisestile se
   è divisibile per 400)."
   [
http://it.wikipedia.org/wiki/Anno_bisestile
]
Ora bisogna tener conto del fatto che, sempre per ordine di papa Gregorio
XIII, non sono mai esistiti i dieci giorni compresi fra il 5 e il 14
ottobre 1582 (furono elimitati per far tornare i conti nel passaggio fra
calendario giuliano e gregoriano:
[
http://it.wikipedia.org/wiki/Calendario_giuliano]
).
A questo punto, hai determinato se la data è valida in assoluto. Per
determinare se è valida per i tuoi scopi, bisogna vedere quali "date di
nascita" ti interessano.
È probabile che ti interessino solo le date di nascita di persone *già*
nate (a meno che si tratti di un'applicazione per ostetrici...), quindi
dovrai verificare che la data immessa non sia superiore alla data odierna.
Per ottenere la data odierna, vedi sul manuale del C l'accoppiata di
funzioni time() e mktime().
Se ti interessano solo le date di persone presumibilmente ancora in vita,
pare che la persona più vecchia che si conosca sia un certo Shigechiyo
Izumi, morto a 121 anni (Lo dice il "Libro Guinnes dei primati":
[
http://www.logicjungle.com/wiki/Supercentenarian]
).
Per non escludere qualche povero ultracentenario, potresti arrotondare a
150; meglio comunque fare una #define, ché non si sa mai dove può arrivare
la medicina...
Be', mi pare che le info di base ci siano tutte: buona pedalata.
--
Cingar
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Certo che i NG sono proprio uno spasso cosě :)
ROTFL :) :) :)
-- 
Quando noi ignoranti eravamo di piů, tutto era piů bello (A. Celentano).
  ___   _   ___ _  _______   _______ ___
|   \ /_\ | _ \ |/ / _ ) \ / /_   _| __|
| |) / _ \|   / ' <| _ \\ V /  | | | _|
|___/_/ \_\_|_\_|\_\___/ |_|   |_| |___|

 ROTFL :) :) :)
Che c'è da ridere? Se hai da ridire sulle specifiche, parlane con il
project manager. Io intanto vado a Castel Sant'Angelo a preparare il rogo.
:-)
BTW, dimenticavo una cosa per il calcolo dell'anno bisestile: per
verificare se un numero è divisibile per un altro, in C si usa
naturalmente l'operatore % ("modulo" o resto della divisione).


 :-)
Ma dài! Che cattivo... o_o
-- 
Quando noi ignoranti eravamo di più, tutto era più bello (A. Celentano).
