Per vari motivi mi sono trovato nella situazione di dover implementare una funzione in c che una volta ricevuto il puntatore ad una stringa di 11 caratteri dovesse gestirla come una data nel formato gg/mm/aaaa e farne i relativi controlli di consistenza per verificarne l’immssione nella corretta formattazione, verificare se si trattasse di una data veritiera con i dovuti controlli sui mesi e massimo di giorni in ogni mese e naturalmente routine per il controllo degli anni bisetili, controllare se l’anno immesso non sia minore del 1900 ed inoltre che la data non sia nel futuro (cioè la data immessa non sia superiore rispetto a quella di sistema). La funzione restituisce un intero: 1 nel caso tutto sia andato bene, 0 altrimenti (oltre a stampare i dovuti errori differenziati per caso). Non è necessario far acquisire la data prima poiche la funzione si preoccupa dell’acquisizione e una volta terminato tutto ciò fa una copia della data nella stringa passata per riferimento. E’ inoltre presente una funzione copia_stringa utilizzata dalla funzione principale che funge come una specie di substring. Il codice non è molto ottimizzato ma funzionante. Lo metto a disposizione per chi sta cominciando ad imparere il c e magari è alla ricerca di qualche esmepio di implementazione. Il codice è abbastanza commentato e comprensibile… comunque sia non esitate a postare.

Ricordatae di includere le librerie: stdio.h, time.h, ctype.h e string.h

Di seguito il codice:

copia_stringa(char *destinazione, char* inizio, char* fine){
                   int x;
                   for(x = 0;inizio <= fine; x++){
                         destinazione[x] = *inizio++;
                         }
                   destinazione[x] = '\0';
                   }
 
int bisestile(int anno){
    if(anno%400 == 0 || anno%100 != 0 && anno%4 == 0)
                return 1;
    else
                return 0;
}<span id="more-410"></span>
 
 
 
//Funzione per l'inserimento data, se è avvenuto qualche errore ritorna 0 altrimenti 1
int setdata(char* data){
       char tmp_data[11];
       printf("Inserisci la data dell'esame (gg/mm/aaaa): ");
       gets(tmp_data);
 
       //controlli di consistenza formattazione
       int x;
       for(x = 0; x<10; x++){
               if(x == 2 || x == 5){
                    if(tmp_data[x] != '/'){ // controllo le formattazione
                    printf("Errore nella formattazione della data.\n");
                    return 0;
                    }
                    }
               else{
                    if(isdigit(tmp_data[x])==0){ //controllo se sono state inserite lettere al posto di mumeri
                    printf("Si prega di non inserire lettere ne altri simboli ma solo numeri.\n");
                    return 0;
                    }
                    }
 
       }
 
       if(tmp_data[10] != '\0'){ //controllo se la lunghezza è esatta
       printf("Errore nella formattazione della data.\n");
       return 0;
       }
       //fine controlli consistenza formattazione
 
       //prelevo la data di sistema
       struct tm *data_sistema;
       time_t lt;
       lt = time(NULL);
       data_sistema = localtime(&lt);
       //fine
 
       //prelevo tutti i campi della data e li converto in intero per controllo consistenza sulla veridicità della data
       char anno[5]; //prelevo l'anno
       copia_stringa(anno,&tmp_data[6],&tmp_data[9]);
       int anno_num = atoi(anno);
 
       char mese[3]; //prelevo il mese
       copia_stringa(mese,&tmp_data[3],&tmp_data[4]);
       int mese_num = atoi(mese);
 
       char giorno[3]; //prelevo il giorno
       copia_stringa(giorno,tmp_data,&tmp_data[1]);
       int giorno_num = atoi(giorno);
       //fine
 
       //controlli consistenza sulla data
       if(anno_num < 1900){ //anno
                   printf("Impossibile inserire date prima del 1900.\n");
                   return 0;
                   }
       if(mese_num < 1 || mese_num > 12){ //mese
                   printf("Errore, mese inesistente.\n");
                   return 0;
                   }
       const int giorni[]={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};  //array del numero dei giorni dei diversi mesi
       int bis = 0;
       if(mese_num == 2 && bisestile(anno_num)){ //controllo bisestile
               bis = 1;
               if(giorno_num > 29){
                                 printf("Errore,giorno inesistente.\n");
                                 return 0;
                                 }
                                 }
       if((giorno_num < 0 || giorno_num > giorni[mese_num]) && bis == 0){ //giorno
                     printf("Errore, giorno inesistente.\n");
                     return 0;
                     }
        //fine
 
        //controllo se la data e' nel futuro
        if(anno_num > (data_sistema->tm_year+1900)){ //anno
                   printf("Errore, la data e' nel futuro.\n");
                   return 0;
                   }
         if(mese_num > (data_sistema->tm_mon + 1)){  //mese
                   printf("Errore, la data e' nel futuro.\n");
                   return 0;
                   }
          if(giorno_num > (data_sistema->tm_mday)){ //giorno
                     printf("Errore, la data e' nel futuro.\n");
                     return 0;
                     }
          //fine
 
           strcpy(data,tmp_data); //se tutto e' soddisfatto copio la data nel puntatore passato
           return 1; // e restituisco 1 per indicare che tutto e' andato bene
           }
Be Sociable, Share!
Be Sociable, Share!