Waňov web

PB071 - 9. cvicení

Prumerný vek

(práce se strukturou, dynamická alokace pameti, zretezený seznam)

Zadání

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.

Pozadavky:

Poznámky:


Riešenie:


prumvek.c
#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;
}