Definujte strukturu, která bude mít polozky jmeno, prijmeni, rok_narozeni
a polozku next typu ukazatel na stejnou strukturu. Maximální délku jména
stanovte na 15 a príjmení na 20 znaku.
Napiste funkci napln(), která tuto strukturu naplní daty o
jedné osobe. Data se budou
císt z textového souboru (vsechny údaje budou pro danou osobu na jednom rádku oddeleny
mezerou ci tabulátorem).
Ve funkci main zorganizujte jednosmerne zretezený dynamický seznam
techto struktur a do nej ukládejte nactené údaje. U poslední polozky
seznamu bude ukazatel na dalsí polozku mít hodnotu NULL.
Vypoctete prumerný vek a vytisknete jména vsech lidí, kterí jsou letos v tomto veku.
prumvek.c . strtok.
(Její popis najdete unixovským príkazem man.)
/dev/tty), ukoncíte vstup klávesovou kombinací Ctrl D.time,
localtime, resp. ctime; jejich popis najdete príkazem man 2
time a man 3c ctime.
#include<stdio.h>
#include<time.h>
#include<string.h>
#include<stdlib.h>
#include<ctype.h>
#include<math.h>
typedef struct xclovek{char meno[16];
char prijmeni[21];
int vek;
struct xclovek* next;
}
clovek ;
char *file,*lp,line[101],riadok[101],*ret,str[101];
FILE *fp;
int i,j,k,pocet_riadkov=0,tento_rok,vek;
long int priem_vek=0;
clovek *data;
clovek *p_akt;
/*---------------------------- NAPLN -----------------------------------------*/
int napln(void)
{
lp=line;
if (fgets(lp,100,fp)==NULL ) /*do line sa ulozi nacitany riadok*/
{ (p_akt->next)=NULL;
fclose(fp);
return 1;}
strcpy(riadok,line);
ret=strtok(line ," \t");
if ((ret == NULL)||(*ret == '\n')) return 0;
/*ignoruje priazdny riadok/nic*/
if (strlen(ret)>17) {printf("CHYBA: Prilis dlhe meno: %s ",riadok);
return 0;}
strcpy(p_akt->meno,ret);
ret=strtok(NULL," \t\n");
if ((ret==NULL)||(*ret=='\n')){printf("CHYBA: nenasiel priezvisko: %s",
riadok); return 0;}
if (strlen(ret)>22) {printf("CHYBA: Prilis dlhe priezvisko: %s ",riadok);
return 0;}
strcpy(p_akt->prijmeni,ret);
k=atoi(strtok(NULL," \t\n"));
if ((k==0)||(k>tento_rok)||(&k==NULL))
{printf("CHYBA: vo formate roku: %s",riadok);return 0;}
(p_akt->vek)=tento_rok-k;
priem_vek+=tento_rok-k;
pocet_riadkov++;
p_akt->next=(clovek*) malloc(sizeof(clovek));
p_akt=p_akt->next;
return 0;
}
/*============================ MAIN ==========================================*/
int main(int argc,char *argv[])
{
if (argc==1)
{printf("Zadaj meno suboru ako parameter!\n");
return 1;}
if (argc>=2)
if((fp=fopen(argv[1],"r"))==NULL)
{printf("Chyba: Zadany subor sa nepodarilo otvorit.\n");return 2; };
time_t sec;
sec=time(0);
tento_rok=(((int)sec)/(365.25*24*3600)+1970);
data=(clovek*) malloc(sizeof(clovek));
p_akt=data;
while(!napln())
{
}
if (pocet_riadkov==0) {printf("Subor je prazdny.\n");return 0;}
vek=(int)((priem_vek/pocet_riadkov));
printf("Priemerny vek je:%d \n",vek);
printf("V tomto veku su tieto osoby:\n");
for(;;)
{
if ((data->vek)==vek)
{printf("%s %s \n",(data->meno),(data->prijmeni));}
if ((data->next)==NULL) break;
data=(data->next);
}
return 0;
}