[ c ]Funzione di gestione data:
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(<); //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 }
Tag associati: c







