lista4cpp.txt

(3 KB) Pobierz
#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
Zgłoś jeśli naruszono regulamin