/* iz slijedne formatizirane datoteke 'upis' treba formirati direktnu neformatiziranu datoteku 'tezine'. u svakom zapisu datoteke 'upis' nalazi se maticni broj (4 znamenke), prezime i ime (40 znakova), godina rodjenja (4 znamenke) i tjelesna tezina (realni broj sa 3 cijela mjesta i jednom decimalom). zapis datoteke 'tezine' sastoji se od maticnog broja, prezimena i imena, godine starosti i tezine, pri cemu redni broj zapisa odgovara maticnom broju. izracunati prosjecnu tjelesnu tezinu. nakon sto su svi podaci upisani treba ucitavati sa tipkovnice maticni broj i za njega iz datoteke 'tezine' godine starosti i tezinu. na zaslon ispisati podatke za zadani maticni broj uz posebnu napomenu ako osoba ima tjelesnu tezinu manju od prosjeka program treba zavrsiti kada se zada neispravan ili nepostojeci maticni broj */ #include #include void fatal (char *poruka) { fputs(poruka, stderr); fputs("\n",stderr); exit(1); } #include int uzmi_godinu(void) { struct date datum; getdate(&datum); return datum.da_year; } void main() { FILE *du,*di; struct zapis_osobe { int mat_br; char prez_ime[40+1]; int starost; float tezina; } zapis; int n=0, godina, god_rod, mat_br; float prosjek=0; if ((du=fopen("upis","r"))==NULL) fatal("Ne mogu otvoriti datoteku \"upis\""); if ((di=fopen("tezine","w+b"))==NULL) fatal("Ne mogu otvoriti datoteku \"tezine\""); godina=uzmi_godinu(); while (fscanf(du,"%4d%40[^\n]%4d%5f.1", &zapis.mat_br,zapis.prez_ime,&god_rod,&zapis.tezina)==4) { zapis.starost=godina-god_rod; if (fseek(di,(long)(zapis.mat_br-1)*sizeof(zapis),SEEK_SET)!=0) fatal("Nije uspjelo pozicioniranje u \"tezine\""); if (fwrite(&zapis,sizeof(zapis),1,di)!=1) fatal("Nije uspjelo zapisivanje u \"tezine\""); prosjek+=zapis.tezina; ++n; } fclose(du); if (n>0) { prosjek/=n; printf("Prosjecna tezina: %5.2f\n",prosjek); } else { fprintf(stderr,"Datoteka \"upis\" je prazna!\n"); exit(1); } while (1) { printf("\nUnesite maticni broj:"); scanf("%d",&mat_br); if (fseek(di,(long)(mat_br-1)*sizeof(zapis),SEEK_SET)!=0) fatal("Nije uspjelo pozicioniranje u \"tezine\""); if (fread(&zapis,sizeof(zapis),1,di)!=1 || zapis.mat_br!=mat_br) break; printf("%04d %s %4d %5.1f\n", zapis.mat_br, zapis.prez_ime, zapis.starost, zapis.tezina); if (zapis.tezina < prosjek) printf("Osoba ima tezinu manju od prosjecne!\n"); } fclose(di); }