Sottoprogramma in C...
ciao a tutti devo fare un programma all'apparenza semplice, cioè scrivere un prog che letto da tastiera una data mi dice se la data è esatta.... non devo usare la funzione per le date nemmeno i puntatori o i vettori...
io il programma l'ho scritto però non funziona bene... questo è il codice:
solo che non funziona correttamente se metto la data 31/3/1990 non funziona (l'anno è irrilevante può anche essere un altro anno qualsiasi)...
io credo che è sbagliata l'istruzione
io il programma l'ho scritto però non funziona bene... questo è il codice:
#include <stdio.h> #include <stdlib.h> int data_esatta (int g, int m, int a); main (){ int g,m,a; int data_corretta; printf ("inserisci il giorno mese e l'anno: "); scanf ("%d,%d,%d",&g,&m,&a); data_corretta = data_esatta(g,m,a); printf("la data iserita e' correta."); system ("PAUSE"); } /*funzione*/ int data_esatta (int gg, int mm, int aa){ do { printf ("inserisci il giorno mese e l'anno: "); scanf("%d,%d,%d", &gg,&mm,&aa); } while (((gg<0)||(mm<0)||(aa<0))||((gg>31)||(mm>12)||(aa>2011))); if (mm =! 2) { if( (mm==11 || mm==4 || mm==6 || mm==9) && (gg<=30) || (mm==11 || mm==4 || mm==6 || mm==9) && (gg<=31) ) printf("la data e' esatta."); } else{ if ( aa % 400==0 || aa % 4==0 && !(aa % 100==0)){ do{ printf ("inserisci il giorno mese e l'anno: "); scanf("%d,%d,%d", &gg,&mm,&aa); } while (gg>29); printf("la data e' corretta.");} else { do{ printf ("inserisci il giorno mese e l'anno: "); scanf("%d,%d,%d", &gg,&mm,&aa); } while (gg>28); printf ("la data è corretta."); } } }
solo che non funziona correttamente se metto la data 31/3/1990 non funziona (l'anno è irrilevante può anche essere un altro anno qualsiasi)...
io credo che è sbagliata l'istruzione
(mm==11 || mm==4 || mm==6 || mm==9) && (gg<=30) || (mm==11 || mm==4 || mm==6 || mm==9) && (gg<=31)
Risposte
ho messo il return nel primo ramo dell'if:
però credo che non è neanche questo il problema perchè una data scorretta dice che è corretta una data scorretta non riesco a visualizzare nulla perchè l'eseguibile si chiude prima che mi visualizzi il risultato.... apatriarca scusami per il tempo che ti sto facendo perdere.....
if (data_corretta == 0) { printf("la data iserita e' correta."); return 0; } else { printf("la data iserita e' scorreta. Riprovare\n") }
però credo che non è neanche questo il problema perchè una data scorretta dice che è corretta una data scorretta non riesco a visualizzare nulla perchè l'eseguibile si chiude prima che mi visualizzi il risultato.... apatriarca scusami per il tempo che ti sto facendo perdere.....
Il motivo per cui si chiude senza visualizzare il risultato è che stai usando un programma bacato e non più supportato dai suoi sviluppatori come ambiente di sviluppo. Se proprio devi, aggiungici dei system("PAUSE") o delle funzioni di input per bloccare il programma e mostrarti il risultato. O il problema è un altro? Non ho ancora avuto tempo di testarlo.
si si infatti mi sono dimenticato di dire che la system("PAUSE") c'è..... posto il codice del programma con tutte le modifiche apportate fino ad ora:
#include <stdio.h> #include <stdlib.h> int data_esatta (int gg, int mm, int aaaa); main (){ while(1) { int g,m,a; int data_corretta; printf ("inserisci il giorno mese e l'anno nel formato gg/mm/aaaa: "); scanf ("%d/%d/%d",&g,&m,&a); data_corretta = data_esatta(g,m,a); if (data_corretta == 0){ printf("la data iserita e' correta."); return 0; } else { printf("la data iserita e' scorreta. Riprovare\n"); } } system ("PAUSE"); } /*funzione*/ int data_esatta (int gg, int mm, int aaaa){ int Err; if ((gg<=0)||(mm<=0)||(aaaa<=0)||(gg>31)||(mm>12)||(aaaa>2011)) Err = 1; else { Err = 0; } if ((mm==11 || mm==4 || mm==6 || mm==9) && (gg>30)) Err = 1; else { Err = 0; } if ((mm==2) && (gg >29)) Err = 1; else { Err = 0; } if ((mm==2) && (gg >28)) { if (!((aaaa % 400)==0 || ((aaaa % 4)==0 && !((aaaa % 100)==0)))) Err = 1; else { Err = 0; } } return Err; }
Ma system("PAUSE") è messo fuori dal ciclo e il codice non esce mai dal ciclo (nel senso che il programma termina dall'interno del ciclo). Se vuoi che si fermi dopo averti stampato che la data è corretta devi inserirlo subito prima di return 0. Ovviamente sarebbe meglio utilizzare direttamente un programma migliore..
cioè devo eliminare solo il programma per l'utilizzatore oppure anche la funzione?
Non ho capito che intendi dire.. Se esegui il programma usando praticamente qualsiasi altro IDE oppure lo esegui da linea di comando non esiste il problema della chiusura della finestra. Code::Blocks ad esempio mantiene aperta la finestra e mostra alcune statistiche dopo l'esecuzione del programma. Non c'è quindi alcun bisogno di inserire system("PAUSE") nel programma. In effetti, l'abitudine di inserire tale funzione nei programmi deriva dall'uso di Dev-C++. Ma se pensi che questo programma è in versione beta da credo ormai praticamente un decennio (da prima che Microsoft rilasciasse Windows Vista con il quale non è per niente compatibile) e che non c'è alcun interesse da parte dei loro sviluppatori di proseguirne lo sviluppo, ti dovresti facilmente rendere conto di quanto non valga la pena di usarlo. Il già citato Code::Blocks è decisamente meglio.
In ogni caso il problema è nella posizione del system("PAUSE") nel tuo programma come già spiegato.
In ogni caso il problema è nella posizione del system("PAUSE") nel tuo programma come già spiegato.
Si infatti uso il Dev-C++.....il programma lo eseguo dalla barra che mette a disposizione il programma Dev-C++ con il tasto Compile....
intendi così???
se si non funziona lo stesso....è troppo difficile questo programma....
intendi così???
if (data_corretta == 0){ printf("la data iserita e' correta."); return 0; system ("PAUSE"); } else { printf("la data iserita e' scorreta. Riprovare\n"); }
se si non funziona lo stesso....è troppo difficile questo programma....
Vai qui poi clicca su codeblocks-10.05mingw-setup.exe oppure codeblocks-10.05-setup.exe a seconda che tu abbia o meno mingw (penso di si ma non so se è l'ultima versione) e una volta installato disinstalla Dev-C++. Il tasto compile ce l'hanno tutti, ma gli altri almeno ti mettono la pausa loro e non devi inserire un assurdo system("PAUSE");
ok.... ma a parte questo il programma non mi funziona qualunque modifica apporti...