Sottoprogramma in C...

kioccolatino90
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:

#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
kioccolatino90
ho messo il return nel primo ramo dell'if:
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.....

apatriarca
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.

kioccolatino90
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;
}

apatriarca
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..

kioccolatino90
cioè devo eliminare solo il programma per l'utilizzatore oppure anche la funzione?

apatriarca
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.

kioccolatino90
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ì???
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....

vict85
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");

kioccolatino90
ok.... ma a parte questo il programma non mi funziona qualunque modifica apporti...

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