#include <iostream> #include <stdio.h> #include <limits.h> //tylko do INT_MAX using namespace std; struct Data { int rok,miesiac,dzien; void Wypisz() { printf("%d.%d.%d (DD:MM:YY)\n", dzien,miesiac,rok); } }; bool CzyPoprawnaData(Data); //przyjmuje struct Data Data NastepnyDzien(Data); int MiesiacParser(int miesiac, int rok); // zwraca ile dni jest w miesiacu danym! + przestepne Data PierwszaData(Data TablicaZDatami[], int n); // n - size int main() { Data tablica[3]; tablica[0].dzien = 1; tablica[0].miesiac = 10; tablica[0].rok = 2012; tablica[2].dzien = 23; tablica[2].miesiac = 11; tablica[2].rok = 1999; tablica[0].Wypisz(); printf("%d\n",CzyPoprawnaData(tablica[0])); printf("Podaj swoja date (DD:MM:YY)\n"); scanf("%d",&tablica[1].dzien); scanf("%d",&tablica[1].miesiac); scanf("%d",&tablica[1].rok); printf("Isvalid: %d\n", CzyPoprawnaData(tablica[1])); printf("Next-day:"); NastepnyDzien(tablica[1]).Wypisz(); printf("\nNajwczesniejsza tablica z podanych:\n"); PierwszaData(tablica, 3).Wypisz(); return 0; } bool CzyPoprawnaData(Data Wejscie) { if(Wejscie.rok < 1 || Wejscie.miesiac < 0 || Wejscie.dzien < 0) { // ujemny check return 0; } if(MiesiacParser(Wejscie.miesiac,Wejscie.rok) > 99 ){ //Invalid miesiac return 0; } if (Wejscie.dzien > MiesiacParser(Wejscie.miesiac,Wejscie.rok) ) { return 0; } return 1; } int MiesiacParser(int x,int y) { //x - miesiac, y-rok int tab[14]; tab[0] = 100; tab[1] = 31; tab[2] = 28; tab[3] = 31; tab[4] = 30; tab[5] = 31; tab[6] = 30; tab[7] = 31; tab[8] = 28; tab[9] = 30; tab[10] = 31; tab[11] = 30; tab[12] = 31; tab[13] = 29; // 0 - error, 13 - luty przestępny, jendak nie wykorzystany if ((y % 4 == 0 && (y % 100 != 0 || y % 400 == 0)) && x == 2 ) { // (1 && 1) || (0 && 1) //x = 13; return 29; } //Jak jest przestępny to zmień na przestępny miesiąc if (x < 0 || x > 12) { return 100; //invalid! } return tab[x]; // returnuje int (ilosc dni) } Data NastepnyDzien(Data Wejscie) { if(CzyPoprawnaData(Wejscie) != 1) { printf("Niewlasciwa data!"); return Wejscie; } Wejscie.dzien++; if(Wejscie.dzien > MiesiacParser(Wejscie.miesiac,Wejscie.rok)) { //CzyNastepnyMiesiac? Wejscie.dzien = 1; Wejscie.miesiac++; if(Wejscie.miesiac > 12) { Wejscie.miesiac = 1; Wejscie.rok++; } } return Wejscie; } Data PierwszaData(Data tab[], int n) { int rok = INT_MAX; // !Watch out! Pierwsza data nie musi być wgle poprawna OR max(int) int x = -1; //który index jest najmniejszy, -1 = not exist int ilednimin = INT_MAX; for (int i = 0; i < n; i++) { int iledni = 0; for (int i2=1; i2 < tab[i].miesiac; i2++) { iledni = iledni + MiesiacParser(i2, tab[i].rok); } //printf("Data: \n");tab[i].Wypisz(); iledni = iledni + tab[i].dzien; // ile dni if(CzyPoprawnaData(tab[i]) == true) { if (rok > tab[i].rok) { x = i; rok = tab[i].rok; ilednimin = iledni; } else if (rok == tab[i].rok && iledni < ilednimin) { x = i; ilednimin = iledni; } } } if (x == -1) { printf("Nie ma zadnej prawidlowej daty!\n"); tab[0].rok = 0; tab[0].miesiac = 0;tab[0].dzien = 0; return tab[0]; } return tab[x]; } // Najpierw ROK // Potem zamienić miesiące na ilość dni: np Marzec = 31 + 28(+przestępny ewentualnie) + dodać dni.. i compare
demp