Ciò che sono riuscito ad ideare è quanto segue:
- Codice: Seleziona tutto
#include <stdio.h>
/*scrivere un programma che, inserita una data, calcoli il giorno della settimana*/
main() {
int k; /*variabile che serve per calcolare il giorno*/
int j; /*variabile che serve per calcolare se un anno è bistestile o no*/
int l; /*variabile che serve per calcolare se una data è valida o no*/
int scelta; /*varaibile che, una volta che il programma ha calcolato il giorno, permette all'utente di poter
continuare (dove per "continuare" si intede la possbilità di ricominciare con l'inserimento di una nuova data*/
int giorno_di_riferimento, mese_di_riferimento, anno_di_riferimento;
int giorno, mese, anno;
do {
/*data di riferimento*/
giorno_di_riferimento=1; /*corrisponde a lunedì*/
mese_di_riferimento=1; /*corrisponde a gennaio*/
anno_di_riferimento=2017; /*corrisponde all'anno 2017*/
k=7; /*corrisponde a domenica*/
j=1; /*corrisponde al primo anno dopo l'anno bisestile del 2016*/
l=0; /*se tale variabile resta uguale a zero, allora significa che la data inserita è valida. Se tale variabile
risulta essere diversa da zero, allo significa che la data inserita non è valida*/
printf("Inserisci una data per sapere a quale giorno corrisponde\n");
do {
printf("Giorno: ");
scanf("%d", &giorno);
}while(giorno<1 || giorno>31);
do {
printf("Mese: ");
scanf("%d", &mese);
}while(mese<1 || mese>12);
do {
printf("Anno: ");
scanf("%d", &anno);
}while(anno<1);
if(giorno>29 && mese==2) {
l++;
}
if(giorno==31) {
switch(mese) {
case 4: case 6: case 9: case 11:
l++;
break;
default:
break;
}
}
if(anno>=2017 && l==0) {
for( ; giorno_di_riferimento!=giorno || mese_di_riferimento!=mese || anno_di_riferimento!=anno; ) {
giorno_di_riferimento++;
k++;
if(k>7) {
k=1;
}
if(j>4) {
j=1;
}
if(giorno_di_riferimento>28 && mese_di_riferimento==2 && j!=4) {
giorno_di_riferimento=1;
mese_di_riferimento++;
}
if(giorno_di_riferimento>29 && mese_di_riferimento==2 && j==4) {
giorno_di_riferimento=1;
mese_di_riferimento++;
}
if(giorno_di_riferimento>30) {
switch(mese_di_riferimento) {
case 4: case 6: case 9: case 11:
giorno_di_riferimento=1;
mese_di_riferimento++;
break;
default:
break;
}
}
if(giorno_di_riferimento>31) {
giorno_di_riferimento=1;
mese_di_riferimento++;
}
/*il ciclo if sottostante serve per calcolare gli anni*/
if(mese_di_riferimento==12 && giorno_di_riferimento==31 && giorno_di_riferimento!=giorno) {
mese_di_riferimento=0;
anno_di_riferimento++;
j++;
}
/*il ciclo if sottostante serve per capire se è stata inserita una data contente il 29 di febbraio in un anno non
bisestile. Se il ciclo if si attiva, allora "l" diventa diverso da zero, il ciclo for si interrompe e la data,
siccome "l" risulta essere diverso da zero, risulterà essere non valida*/
if(j==4 && giorno==29 && mese==2 && anno_di_riferimento>anno) {
l++;
break;
}
}
}else if(anno<2017 && l==0) {
for( ; giorno_di_riferimento!=giorno || mese_di_riferimento!=mese || anno_di_riferimento!=anno; ) {
giorno_di_riferimento--;
k--;
if(k<1) {
k=7;
}
if(j<1) {
j=4;
}
if(giorno_di_riferimento<1 && mese_di_riferimento==3 && j!=4) {
giorno_di_riferimento=28;
mese_di_riferimento--;
}
if(giorno_di_riferimento<1 && mese_di_riferimento==3 && j==4) {
giorno_di_riferimento=29;
mese_di_riferimento--;
}
if(giorno_di_riferimento<1) {
switch(mese_di_riferimento) {
case 5: case 7: case 10: case 12:
giorno_di_riferimento=30;
mese_di_riferimento--;
break;
default:
break;
}
}
if(giorno_di_riferimento<1) {
giorno_di_riferimento=31;
mese_di_riferimento--;
}
if(mese_di_riferimento==0 && giorno_di_riferimento==31 && giorno_di_riferimento==giorno) {
mese_di_riferimento=12;
anno_di_riferimento--;
j--;
}
if(mese_di_riferimento==0 && giorno_di_riferimento==31 && giorno_di_riferimento!=giorno) {
mese_di_riferimento=12;
anno_di_riferimento--;
j--;
}
if(j==4 && giorno==29 && mese==2 && anno_di_riferimento<anno) {
l++;
break;
}
}
}
if(l==0) {
printf("\nLa data %d/%d/%d corrisponde a ", giorno, mese, anno);
switch(k) {
case 1:
printf("LUNEDI'");
break;
case 2:
printf("MARTEDI'");
break;
case 3:
printf("MERCOLEDI'");
break;
case 4:
printf("GIOVEDI'");
break;
case 5:
printf("VENERDI'");
break;
case 6:
printf("SABATO");
break;
case 7:
printf("DOMENICA");
break;
default:
printf("\nERRORE\n");
break;
}
}else {
printf("\nLa data inserita non e' valida.");
}
printf("\n\n");
do {
printf("Digita 1 per continuare, 0 per finire: ");
scanf("%d", &scelta);
}while(scelta<0 || scelta>1);
printf("\n");
}while(scelta==1);
}
Spero che con i commenti si riesca a capire senza troppi sforzi. Il ciclo for che si attiva se l'anno inserito è minore di 2017 non l'ho commentato perché credo che quel ciclo for funzioni in modo corretto e che non influisca sull'errore che si verifica, quindi credo che non ci sia la necessità di analizzarlo.
Ho aperto questa discussione perché il programma non funziona e mi piacerebbe capire dov'è che ho sbagliato. Il problema è questo: quando inserisco una data contenente il 31 di dicembre con un anno maggiore di 2017, capita che il ciclo for è come se continuasse all'infinito... di conseguenza non viene fornito il giorno a cui tale data corrisponde. I giorni, con l'inserimento di date diverse dal 31 di dicembre con un anno maggiore di 2017, vengono calcoli correttamente (almeno quelli che ho testato io).
Dov'è che ho sbagliato?
Comunque, per risolvere tale esercizio, mi piacerebbe sapere anche se esistesse un metodo più semplice. Non chiedo di sapere qual è, vorrei solo sapere se esistesse.
P.S. se si attiva il ciclo if preceduto dal commento "il ciclo if sottostante serve per calcolare gli anni", la variabile mese_di_riferimento viene azzerata e non dichiarata al valore di 1 perché poi, la variabile giorno_di_riferimento, diventando maggiore di 31 al ciclo successivo del ciclo for, fa attivare il ciclo "if(giorno_di_riferimento>31)" e di conseguenza la variabile mese_di_riferimento viene incrementata, e siccome dopo l'incremento della variabile anno_di_riferimento la variabile mese_di_riferimento deve iniziare da 1, allora ecco che mese_di_riferimento, prima del ciclo "if(giorno_di_riferimento>31)" dopo che è stata incrementata la variabile anno_di_riferimento, deve valere zero.

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)





