01 marca 2015

PESEL – C/C++

// PESEL 0.5 // patryk.gradys@gmail.com // ©2015 Patryk Gradys //

#include 
#include 

const short biezacyRok = 2015;

// metoda na liczenie "enterow"
int ileRekordow() {
    FILE * pFile = fopen ("plik.txt","r");;
    char c;
    int n = 0;

    do {
        c = fgetc(pFile);

        if (c == '\n') {
            n++;
        }

    }
    while (c != EOF);
    n += 1;     // ostatni rekord pliku nie ma "entera" na koncu
    fclose (pFile);
    printf ("Ilosc rekordow w pliku: %d\n", n);

  return n;
}

bool zbadajPesel(char* nrPesel) {
    char pesel[11];

    if (strlen(nrPesel) != 11) {
        return false;
    }
    else {
        int i;
        for(i = 0; i < 11; i++) {
            pesel[i] = nrPesel[i] - '0';
        }

        // a+3b+7c+9d+e+3f+7g+9h+i+3j+k

        int suma    =     pesel[0]
                    + 3 * pesel[1]
                    + 7 * pesel[2]
                    + 9 * pesel[3]
                    +     pesel[4]
                    + 3 * pesel[5]
                    + 7 * pesel[6]
                    + 9 * pesel[7]
                    +     pesel[8]
                    + 3 * pesel[9]
                    +     pesel[10];

        if (suma % 10 == 0) {
            return true;
        }
        else {
            return false;
        }
    }
}

short obliczWiek(char* nrPesel) {
    char pesel[11];

    int i;
    for(i = 0; i < 11; i++) {
        pesel[i] = nrPesel[i] - '0';
    }

    short wiek;
    short rokUrodzenia        = 10 * pesel[0] + pesel[1];     // w formacie RR
    short miesiacUrodzenia    = 10 * pesel[2] + pesel[3];     // w formacie MM

    if      (miesiacUrodzenia >= 81 && miesiacUrodzenia <= 92){
        wiek = biezacyRok - (rokUrodzenia + 1800);
    }
    else if (miesiacUrodzenia >= 1  && miesiacUrodzenia <= 12){
        wiek = biezacyRok - (rokUrodzenia + 1900);
    }
    else if (miesiacUrodzenia >= 21 && miesiacUrodzenia <= 32){
        wiek = biezacyRok - (rokUrodzenia + 2000);
    }
    else if (miesiacUrodzenia >= 41 && miesiacUrodzenia <= 52){
        wiek = biezacyRok - (rokUrodzenia + 2100);
    }
    else if (miesiacUrodzenia >= 61 && miesiacUrodzenia <= 72){
        wiek = biezacyRok - (rokUrodzenia + 2200);
    }

    return wiek;
}

int main()
{
    FILE * fileIn   = fopen ("plik.txt", "r");
    FILE * fileOut  = fopen ("data_out.txt", "w");
    fseek(fileOut, 0, SEEK_SET);

    if (fileIn != NULL)
    {
        int n = ileRekordow();
        char imie[30], nazwisko[30], pesel[12];
        int i, wzrost, wiek;

        for(i = 0; i < n; i++) {
            fscanf(fileIn, "%s %s %s %d", &imie, &nazwisko, &pesel, &wzrost);
                if (zbadajPesel(pesel)) {
                wiek = obliczWiek(pesel);
                fprintf(fileOut, "%s %s %d\n", imie, nazwisko, wiek);
            }
        }

        fclose (fileIn);
        fclose (fileOut);

    }
    else {
        printf("Blad odczytu pliku");
    }

    return 0;
}