[C++] Stampare data del giorno successivo

N56VZ
Ciao ragazzi sono alle prese con questo piccolo rimpicapo e non riesco a far funzionare il programma.

Scrivere un programma che legge tre interi (giorno, mese ed anno) che
rappresentano una data e stampa la data del giorno successivo.

#include
#include
#include

int main(){
int x,y,z,a,b,c;
puts("Dammi 3 numeri, rispettivamente giorno, mese ed anno:");
scanf("%d%d%d",&x,&y,&z);
if (x=30){
a=1;
else if (y=12){
b=1;
c=z+1;}
}
a=x+1;
b=y;
c=z;}
printf("%d/%d/%d",&a,&b,&c);
system("PAUSE");
return 0;}

cosa sto sbagliando?
a livello logico ho sicuramente capito cosa succede ma a livello pratico non riesco ad esprimerlo

Risposte
Summerwind78
Ciao


il primo errore è a livello di parentesi graffe.

Ti consiglio vivissimamente di indentare il codice, ti aiuta molto a capirne la struttura

guarda il tuo stesso codice come diventa se lo indenti



#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main()
{
    int x,y,z,a,b,c;
    puts("Dammi 3 numeri, rispettivamente giorno, mese ed anno:");
    scanf("%d%d%d",&x,&y,&z);
    if (x=30)
    {
        a=1;
        else if (y=12)
        {
            b=1;
            c=z+1;
        }
    }
    a=x+1;
    b=y;
    c=z;
}

printf("%d/%d/%d",&a,&b,&c); 
system("PAUSE");
return 0;
}  




noterai che la parte di codice


printf("%d/%d/%d",&a,&b,&c); 
system("PAUSE");
return 0;
}  



è proprio fuori dal "main"



Inoltre vedo controllo si il mese ha 30 giorni, ma non controlli se ne ha 31 o 28 a seconda dei casi

E solo se ne avesse 31 giorni allora vale la pena controllare se il mese è 12 ovvero dicembre


Se poi volessi proprio comprendere tutti i casi, dovresti anche vedere se l'anno è bisestile e quindi considerare febbraio di 29 giorni.

Spero di esseri stato di aiuto

N56VZ
Ciao ti ringrazio per la risposta, comunque in C++ la struttura è tutta indentata solo che copiando e incollando ha perso questa proprietà. Per quanto riguarda i giorni l'esercizo mi fa considerare i giorni tutti uguali (ovvero 30), poi magari quando ho capito alla perfezione cercherò anche di considerare i mesi che non hanno 30,31 o 28 giorni.
Ho provato ad eliminare una parentesi graffa perchè pensavo che facendo ciò avrei fatto rientrare tutta la roba nel main ma non funziona comunque :(
grazie dell'aiuto

Summerwind78
il primo errore è nel primissimo "if"

tu hai scritto

if (x=30) ...


questo è sbagliato per ciò che vuoi fare tu

scrivere x=30 significa assegnare il valore 30 alla variabile x, anche se tu questo lo fai all'interno della condizione dell' if

la comparazione tra il contenuto di una variabile ed un valore lo so fa il doppio simbolo di uguale

if (x==30) ...


giusto per completezza...

scrivendolo come lo hai scritto tu, il programma in quel punto assegna a x il valore 30 e poi, siccome sei nella condizione dell'if, si limita a controllare se x è diverso da zero, se lo è entra nell'if. Nel tuo caso lo è sempre perchè vale 30, quindi entra ogni volta.


la stessa cosa vale per


if (y=12) ...



il secondo problema ce l'hai nel printf finale. Il comando printf non vuole i puntatori delle variabili, ma le variabili stesse.

Devi quindi modificare la tua riga

printf("Il giorno successivo è: %d/%d/%d\n",&a,&b,&c);


in

printf("Il giorno successivo è: %d/%d/%d\n",a,b,c);



ammetto che non ho ancora provato a far girare il tuo codice quindi non so ancora se funziona o no.


Un ultimo suggerimento che mi sento di darti è che credo tu ti sia complicato la vita usando due "set" di variabili, un set (x,y,z) come variabili in ingresso, e un secondo set (a,b,c) come variabili in uscita.

io ne avrei usato uno solo semplicemente incrementando i valori nei vari casi.

E non avrei chiamato le variabili a,b,c bensì giorno, mese e anno; Quest'ultimo suggerimento ovviamente non è molto utile in questo programmino ma quando scriverai cose più complesse penso sia meglio che il nome delle variabili rispecchi il dato che contengono.

vict85
Io penso che sia educativo se sostituisci gli if con dei resti. Non ti dò direttamente la soluzione perché altrimenti non ci pensi a sufficienza.

N56VZ
Grazie a tutti dell'aiuto, adesso penso di essere riuscito nell'intento. Ho testato il programma e mi funziona, ho seguito i vostri consigli e mi sono trovato benissimo!
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

int main()
{
    int giorno,mese,anno;
    puts("Dammi 3 numeri, rispettivamente giorno, mese ed anno:");
    scanf("%d%d%d",&giorno,&mese,&anno);
    if (giorno<30)
    giorno=giorno+1;
    else {
         if (giorno==30 && mese==12){
                         giorno=1;
                         mese=1;
                         anno=anno+1;
                                     }else {
                                             if (giorno==30 && mese<12)
                                               giorno=1;
                                               mese=mese+1;
                                               anno=anno;
                                            }
         }
    printf("%d/%d/%d",giorno,mese,anno);        
    system("PAUSE");
    return 0;
}

vict85
Quello che intendevo era che il seguente codice era sufficiente
unsigned const add_a = (giorno/30) * (mese / 12);
giorno = (giorno % 30) + 1;
anno += add_a;
if(add_a == 1) {
    mese = 1;
}
dove ho usato un if per il mese perché l'uso del resto si comportava male nel caso in cui avessi il mese era 12 e il giorno era diverso da 30. Comunque poteva essere fatto anche così:
mese = (mese - 1 + add_a) % 12 + 1;
ma è inutilmente complicato.

N56VZ
unsigned const add_a = (giorno/30) * (mese / 12);
cosa significa questa stringa? non l'ho mai vista

vict85
Immagino tu non sappia cos'è un unsigned const, è semplicemente un intero positivo (unsigned) che tu non puoi cambiare dopo avergli dato un valore (const). Detto questo il suo valore è \(\displaystyle \biggl\lfloor \frac{g}{30} \biggr\rfloor\cdot \biggl\lfloor \frac{m}{12} \biggr\rfloor \) dove \(\displaystyle g \) è il giorno e \(\displaystyle m \) il mese. Insomma il valore è \(\displaystyle 1 \) se \(\displaystyle g \) e \(\displaystyle m \) sono uguali a \(\displaystyle 30 \) e \(\displaystyle 12 \) rispettivamente ed è 0\(\displaystyle \) negli altri casi.

vict85
Mi sono accorto che non ho aggiornato il mese nel caso in cui il giorno sia l'ultimo di un mese diverso da dicembre. Comunque il punto principale era il giorno era educativo aggiornarlo usando la formula
giorno = (giorno % 30) + 1
e che questo aggiornamento andava fatto dopo aver determinato come cambiare anno e mese.

Nel caso semplificato di questo esempio esiste in realtà un metodo particolare per farlo. La sua generalizzazione al caso più generale è però più complessa. Se ci sono 12 mesi da 30 giorni un anno ha 360 giorni.
int num = (anno-1)*360 + (mese-1)*30 + (giorno-1);
num++;
anno = num/360 + 1;
num = num%360
mese = num/30 + 1;
num = num%30;
mese = num+1;

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.