/* 2. felev, uj tematika, C nyelv Regebbi ZH feladatok megoldasa 5. gyak, struct, binfile */ /* 1. feladat: Írjon c programot, amely alkalmas az Olimpián pontszerző helyen (első hat hely) végzett sportolók adatainak a következő szerkezetű strukturákból álló bináris fájlban való tárolására: . Az adatokat billentyűzetről kérje be. Példa egy struktúrára: <"Magyar Zoltán", 1, 12>. */ /* #include #include FILE * fajl; typedef struct { char nev[40]; int helyezes; int pontszam; } VERSENYZOTIP; VERSENYZOTIP versenyzo; char fiznev[80]; int n,i; void main() { clrscr(); puts("Olimpia\n"); do {printf("Adja meg a fájl nevét:"); gets(fiznev); fajl= fopen(fiznev,"ab"); } while (fajl == NULL); printf("\n Adja meg a felviendő struktúrák számát="); scanf("%d",&n); for (i=1; i<=n; i++) {printf("\nAz %d. versenyző adatai:", i); printf("\n Neve: "); scanf("%s",versenyzo.nev);// gets(versenyzo.nev); printf(" Helyezése: "); scanf("%d",&versenyzo.helyezes); printf(" Pontszáma: "); scanf("%d",&versenyzo.pontszam); fwrite(&versenyzo, sizeof(versenyzo),1,fajl); } fclose(fajl); getch(); } */ /* 2. feladat: Rendelkezésünkre áll egy, az előző programmal létrehozott bináris fájl. Készítsen olyan C programot, amely a fájl feldolgozásával megszámlálja, hány arany, ezüst és bronz érmet szereztek a sportolók. Határozza meg azt is, mennyi pontot szereztek összesen és ez egy RÉSZTVEVŐ sportolóra vetitve mekkora átlagpontszámot eredményez. Ehhez billentyűzetről kérje be az összes résztvevő sportoló számát! Ábrázolja kördiagrammal a szerzett arany, ezüst és bronz érmek megoszlását! */ #include #include #include FILE * fajl; typedef struct { char nev[40]; int helyezes; int pontszam; } VERSENYZOTIP; VERSENYZOTIP versenyzo; char fiznev[80]; int n,i,arany,ezust,bronz,osszespont,resztvevok; int gd,gm,sugar,szoga,szoge,szogb,osszeserem; void main() { clrscr(); puts("Olimpia kiértékelés\n"); do {printf("Adja meg a fájl nevét:"); gets(fiznev); fajl= fopen(fiznev,"rb"); } while (fajl == NULL); n=arany=ezust=bronz=osszespont= 0; while (!feof(fajl)) {fread(&versenyzo, sizeof(versenyzo),1,fajl); switch (versenyzo.helyezes) {case 1: arany++; break; case 2: ezust++; break; case 3: bronz++; } osszespont+= versenyzo.pontszam; } fclose(fajl); printf("\n %d arany, %d ezust, %d bronz érmet szereztek.", arany, ezust, bronz); printf("\nÖsszesen %d pontot szereztek a pontszerzők.", osszespont); printf("\n Adja meg az összes résztvevő számát= "); scanf("%d",&resztvevok); printf("\n Az olimpia egy résztvevőjére %6.3lf pont jut.", (double)osszespont/resztvevok); printf("\nA kördiagramhoz nyomjon Entert!"); getch(); detectgraph(&gd,&gm); initgraph(&gd,&gm,"..\\BGI");//aktuális út kell!! sugar= (getmaxy()-40) / 2; osszeserem= arany+ezust+bronz; szoga= 360.0*arany/osszeserem;//hány foknak felel meg? szoge= 360.0*ezust/osszeserem;//egészre csonkít értékadásnál szogb= 360.0*bronz/osszeserem;//360 nem jó, mert egészosztást végez setfillstyle(SOLID_FILL,YELLOW); pieslice(getmaxx() / 2, getmaxy() / 2, 0, szoga, sugar); setfillstyle(SOLID_FILL, LIGHTGRAY); pieslice(getmaxx() / 2, getmaxy() / 2, szoga, szoga+szoge, sugar); setfillstyle(SOLID_FILL, BROWN); pieslice(getmaxx() / 2, getmaxy() / 2, szoga+szoge, 360, sugar); //360=szoga+szoge+szogb getch(); closegraph(); }