Programovací jazyk C: cvičenie 3

V textovom súbore je n rodných čísiel. Pre každé z nich zistite, či je mužské alebo ženské.

Riešenie 1

Rodné číslo budeme považovať za desaťznakový reťazec, teda za 11 znakové pole (10 znakov + \0 znak na konci). Zjednodušíme si zadanie: prvý riadok v súbore bude obsahovať počet záznamov, aby sme s výhodou použili cyklus for.

3
1212211234
6851184321
7801011111

Dáta budeme načítavať pomocou fscanf(), pričom nezabudneme uviesť veľkosť buffra.

Po spustení pozorujme správanie sa pri nekorektných vstupoch (príliš dlhé rodné číslo.)

#include <stdio.h>

void vypis_pohlavie(char rodne_cislo[]) {
if(rodne_cislo[2] == '5' || rodne_cislo[2] =='6') {
    printf("Zenske rodne cislo: %s\n", rodne_cislo);
} else {
    printf("Muzske rodne cislo: %s\n", rodne_cislo);
}
}

int main(void)
{
FILE * subor;
int pocet_riadkov;
int i = 0;
char rodne_cislo[11];

subor = fopen("C:\\temp\\rodnecisla.txt", "r");
if(subor == NULL) {
    perror("Subor sa nepodarilo otvorit");
    return 1;
}

fscanf(subor, "%d", &pocet_riadkov);

for(i = 0; i < pocet_riadkov; i++) {
    fscanf(subor, "%10s", rodne_cislo);
    vypis_pohlavie(rodne_cislo);
}

fclose(subor);

return 0;
}

Pozorujme situáciu, keď je funkcia uvedená za funkciou, ktorá ju používa. Objasnime si použitie funkčných prototypov.

#include <stdio.h>

void vypis_pohlavie(char rodne_cislo[]);

int main(void) {
    /* ... */
        vypis_pohlavie(rodne_cislo);
    /* ... */
}

void vypis_pohlavie(char rodne_cislo[]) {
    if(rodne_cislo[2] == '5' || rodne_cislo[2] =='6') {
        printf("Zenske rodne cislo: %s\n", rodne_cislo);
    } else {
        printf("Muzske rodne cislo: %s\n", rodne_cislo);
    }
}

Možnosť č. 2

Namiesto fscanf() použime robustnejšiu fgets(), opäť s prihliadnutím na dĺžku buffera. V tomto prípade si vystačíme s bežným obsahom súboru:

1212211234
6851184321
7801011111

Údaj o počte prvkov už nepotrebujeme.

int main(void) {    
    while(1) {
        if(fgets(rodne_cislo, 11, subor) == NULL) {
            break;
        }
        vypis_pohlavie(rodne_cislo);
    }
}

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *