DOKUMENTÁCIÓ KÉSZÍTETTE: Naszári László I. évf. levelező Informatika tanári szak 2003.
Holtverseny 2 Feladat: Egy iskolában egyéni és összetett tanulmányi versenyt tartottak. A versenyeken összesen N tanuló vett részt. A versenyek száma M. Rendelkezésre áll a tanulók neve és elért pontszáma egy-egy szekvenciális fájlban. Összesített versenyben csak azon tanulók eredményét értékelik, akik az összes egyéni versenyen indultak és elérték a versenyeken adott minimális pontszámot. Készíts Pascal programot, mely eldönti, hogy az összetett verseny győztese holtversenyben győzött- e! FELHASZNÁLÓI DOKUMENTÁCIÓ Feladat: Megállapítani, hogy a versenyzők összesítésben elért eredményei alapján kihirdethetünk- e abszolút győztest, vagy az aranyérmen több versenyző is osztozik. Környezet: IBM PC, legalább MS DOS 5.0 operációs rendszer. Használat: A program holtv6.exe néven található az A:\ meghajtón, amely nevének leírásával indítható. Az A:\ - n kell lenni a v1.txt, v2.txt vn.txt fájloknak is, melyek az egyes versenyek eredményeit tartalmazzák Indítás után a következő képet kapjuk: A kérdésre 1-nél nagyobb egész szám begépelésével kell válaszolni. Addig nem enged továbblépni, amíg jó adatot nem közlünk a géppel. A hibára hangjelzés is figyelmeztet.
Holtverseny 3 A következőkben a program egyik extra szolgáltatását láthatjuk, melynek során megtudhatjuk kik kerültek be az összetett versenybe, tehát kik vettek részt minden versenyen olyan eredménnyel, hogy versenyenként túlszárnyalták az ott megkövetelt minimumpontszámot. Valamely gomb megnyomására a következő versenyző nevét és az összes versenyben elért pontszámát olvashatjuk. Miután végignéztük a döntősöket Megtudhatjuk, hogy holtverseny alakult- e ki, vagy sem. Másik extra szolgáltatása a programnak, hogy tudatja velünk a győztes(ek) maximális pontszámát, illetve holtverseny esetén, megtudhatjuk a nyertesek neveit is. Keletkezik a program használatakor egy, vagy két új fájl. Egyiknek ny0.txt, másiknak ny1.txt a neve. A fájlok átmeneti tárként szolgálnak a program futása közben. A program lefutása után letörölhetőek.
Holtverseny 4 Fontos szabályok a v1.txt..vn.txt fájlok elkészítéséhez: A fájlok elnevezése: Minden verseny eredményeit v betűvel kezdődő, majd a verseny sorszámára utaló maximum 7 jegyű számmal folytatódó txt kiterjesztésű fájlnevű állományban kell tárolni. Pl.: v01.txt, v1024.txt. A fájlok tartalma Minden fájlt egy számmal kezdünk, melyben az adott verseny minimális pontszámát adjuk meg. <ENTER>-t ütünk, A továbbiakban a versenyző neve, <ENTER>, elért pontszáma <ENTER> kövelkezik A fájlok elhelyezése A versenyekről készült össze fájlt ugyanabba a könyvtárba kell elhelyezni, ahol a holtv6.exe állomány van. Hibalehetőségek: Az első lehetséges hiba: a versenyek mennyiségét rosszul adjuk meg. A program addig kérdezi újból és újból a felhasználót, amíg az 1- nél nagyobb egész számot nem gépel be. Sem karaktert, sem tört számot nem fogad el. Hiányzik, nem olvasható, vagy nem felel meg valamely versenyhez tartozó a fájl a tartalmi, formai követelményeknek. Hibaüzenet jelenik meg hangjelzés kíséretében, melyben megtudjuk, melyik volt az első hibás fájl. A program ezek után valamely gomb megnyomására kilép. A felhasználónak kell gondoskodni arról, hogy megfelelő helyen és állapotban rendelkezésre álljanak a bemenő adatok.
Holtverseny 5 FEJLESZTŐI DOKUMENTÁCIÓ Feladat: Megállapítani, hogy a versenyzők összesítésben elért eredményei alapján kihirdethetünk- e abszolút győztest, vagy az aranyérmen több versenyző is osztozik. Specifikáció: Bemenet: M N, mini N, szöveg szekenciálisfájl M, pont N Kimenet: holtverseny_e L Előfeltétel: M>1 Utófeltétel: nyer= szöveg M {1 i M} és nyer.pont>=mini {1 i M} Maxpont nyer.pont[i] {minden i=1 től fájlonkéni elemszámig} Holtverseny_e= i: maxpont=nyer.pont[i] { i=1 től nyer file elemszámáig} Fontosabb konstansok, változók: Konstans: Kepmeret=2;... Képernyőre listázás esetén hány sort jelenítsen meg Globális változók: fbe1 szöveg...metszetképzés: egyik bemenő halmaz fájlneve fbe2 szöveg... metszetképzés: másik bemenő halmaz fájlneve fki szöveg...metszetképzés: eredmény halmaz fájlneve si :szöveg... karakterré alakított ciklusváltozó (a metszetképzésekhez) fájlok azonosításához pj, pozy egész... segédváltozó képernyőn való pozícionáláshoz maxpont egész...a versenyeken elért maximális pontszám i, ii egész... ciklusváltozók m, egész... versenyek száma holtverseny_e...holtverseny alakult-e ki hiba logikai... Fájlműveletek, vagy beolvasás esetén volt-e hiba Lokális változók: filea, szekvenciális fájl... metszetképzés: egyik bemenő halmaz logikai azonosítója fileb szekvenciális fájl...metszetképzés: másik bemenő halmaz logikai azonosítója filem szekvenciális fájl... metszetképzés: eredmény halmaz logikai azonosítója mini1 egész... versenyenkénti minimumpontszám mini2 egész... versenyenkénti minimumpontszám elem1 szöveg...metszetképzés: versenyző neve egyik halmaz - ban (amihez hasonlítom) pont1 egész...a fenti versenyző által elért pontszám elem2 szöveg... metszetképzés: versenyző neve másik halmaz - ban (amit hasonlítok) pont2 egész...a fenti versenyző által elért pontszám st szöveg...maximum-kiválasztás: nyertes (?) neve pont egész... maximum-kiválasztás: nyertes (?) pontszáma fmax szekvenciális fájl...utolsó metszetképzés: eredmény halmaz -ának logikai azonosítója megjegyzés: a halmaz kifejezés nem egészen helytálló, mert az így jelölt állományok eleminek van sorrendisége.
Holtverseny 6 Algoritmus program osszetettben_a_gyoztes_holtversenyben_gyozott_e; {főprogram} kezdete beolvas; fbe1:='v1.txt'; fbe2:='v2.txt'; fki:='m1.txt'; elsőmetszet_kivalogatassal; {kivételes eset kiemelés. A metszetbe először bekerülő eredmények esetén a mindkét halmaz elemeinél meg kell vizsgálni elérték-e a minimumpontot. Az ezek után keletkezett metszetben már csk olyan versenyzők vannek, akik elérték a minimum pontot. A többi metszet képzésekor csak az újonnan vizsgálandó halmaz elemeire kell ezt a vizsgálatot elvégezni. } ha hiba akkor kilépés a programból; ciklus i:=3 m -ig {be1} ii:=i mod 2 ; str(ii,si) ; fbe1:='m'+si+'.txt'; {be2} str(i,si) ; fbe2:='v'+si+'.txt'; {ki } ii:=abs((i mod 2)-1); str(ii,si) ; fki :='m'+si+'.txt'; metszet_kivalogatassal; ciklus vége; xy pozició a képernyőn(20,5);pozy:=7; ki('bekerült az összesített versenybe:'); filetoscreen(fki); maximumkivalasztas(fki,holtverseny_e,fbe1); xy pozició a képernyőn(22,10);pozy:=15; ha holtverseny_e akkor holtverseny különben ki(' Nem holtversenyben'); ki('abszolút győztes: ',fbe1); ki('pontszáma: : ',maxpont); elágazás vége; vár_egy_billentyűleütésre; program vége. eljárás beolvas; ciklus hiba:=hamis; ki('hány versenyt rendeztek? M= ');be(m); Ha ((Helyes a kiírás, beolvasás) vagy (m<=1)) akkor Ki(<hangjeljés> 'Rossz adat! 1-nél nagyobb egész számot kérek'); hiba:=igaz; Elágazás Vége; amíg ((nem hiba) és (M>1));
Holtverseny 7 eljárás elsőmetszet_kivalogatassal; változók filea,fileb,filem:text; elem1,elem2:szöveg; mini1,mini2,pont1,pont2:egész; hiba:=hamis; rendeld_össze(filea,fbe1);file megnyitása olvasásra (filea); be(filea,mini1); datavalid(fbe1); rendeld_össze(filem,fki); új_fájl(filem); ki(filem,mini1); rendeld_össze(fileb,fbe2); ciklus be(filea,elem1); be(filea,pont1); datavalid(fbe1); file megnyitása olvasásra (fileb); be(fileb,mini2);datavalid(fbe2) ; ciklus be(fileb,elem2); be(fileb,pont2); datavalid(fbe2); ha elem1=elem2 akkor ha pont2>=mini2 és pont1>=mini1 akkor ki(filem,elem1); ki(filem,pont1+pont2); elágazás vége; elágazás vége; amíg fájlvége(fileb); amíg fájlvége(filea); file_zárása(filea); file_zárása(fileb); file_zárása(filem); eljárás metszet_kivalogatassal; változók filea,fileb,filem:text; elem1,elem2:szöveg; mini1,mini2,pont1,pont2:egész; hiba:=hamis; rendeld_össze(filea,fbe1);file megnyitása olvasásra (filea); be(filea,mini1); datavalid(fbe1); rendeld_össze(filem,fki); új_fájl(filem); ki(filem,mini1); rendeld_össze(fileb,fbe2); ciklus be(filea,elem1); be(filea,pont1); datavalid(fbe1); file megnyitása olvasásra (fileb); be(fileb,mini2);datavalid(fbe2) ; ciklus be(fileb,elem2); be(fileb,pont2); datavalid(fbe2); ha elem1=elem2 akkor ha pont2>=mini2 akkor ki(filem,elem1); ki(filem,pont1+pont2); elágazás vége; elágazás vége; amíg fájlvége(fileb); amíg fájlvége(filea); file_zárása(filea); file_zárása(fileb); file_zárása(filem);
Holtverseny 8 eljárás maximumkivalasztas(filename:szöveg; változók holtverseny:logikai; változók nyertes:szöveg); változók fmax:text; st:szöveg; pont:egész; st:='ny.txt'; rendeld_össze(fmax,filename);file megnyitása olvasásra(fmax); maxpont:=0;holtverseny:=hamis; be(fmax,pont); ciklus be(fmax,st);be(fmax,pont); ha pont>=maxpont akkor kezdete ha maxpont = pont akkor holtverseny:=igaz else holtverseny:=hamis; maxpont:=pont;nyertes:=st vége; amíg file_vége(fmax); file_zárása(fmax); eljárás holtverseny; változók fh:text; st:szöveg; j,p:egész; SZÖVEG_SZÍNE (11);HÁTTÉRSZÍN (0); xy pozició a képernyőn(25,14); ki(' HOLTVERSENY ALAKULT KI'); xy pozició a képernyőn(20,16); ki(' A GYŐZTESEK ',maxpont,' PONTOT ÉRTEK EL'); pozy:=20; rendeld_össze(fh,fki);file megnyitása olvasásra(fh);pj:=1; datavalid(fki); be(fh,st); ciklus be(fh,st); be(fh,p); ha p=maxpont akkor xy pozició a képernyőn( 7,pozy+pj);ki('Holtversenyben győztes: ',st); pj:= pj+1; ha pj>kepmeret akkor ablakratores elágazás vége; amíg file_vége(fh); file_zárása(fh) eljárás datavalid(fileneve:szöveg); Ha Helyes a kiírás, beolvasás akkor Ki(<hangjeljés> ' Hiba van a ',fileneve,' File kezelésével!!!'); Ki('1. Ellenőrizze, hogy olvasható-e, vagy létezik-e a jelzett file!'); Ki('2. Ellenőrizze, hogy a file tartalmi, formai követelményenek eleget tesz-e!'); zar; kilépés az op. rendszerbe; elágazás Vége;
Holtverseny 9 eljárás ablakratores; kezdete xy pozició a képernyőn( 7,pozy+pj); ki (' Ha elolvastad, nyomj egy gombot'); vár_egy_billentyűleütésre; töröld_a_képernyőt_a_sor_végéig; pj:=1; ciklus xy pozició a képernyőn( 1,pozy+pj); töröld_a_képernyőt_a_sor_végéig; pj:= pj+1 ; amíg pj>kepmeret; pj:=1; eljárás filetoscreen(filename:szöveg); változók fh:text; st:szöveg; rendeld_össze(fh,filename);file megnyitása olvasásra(fh);pj:=1; datavalid(filename); be(fh,st); ciklus be(fh,st); xy pozició a képernyőn( 7,pozy+pj); ki('név : ',st); pj:= pj+1; be(fh,st); xy pozició a képernyőn( 7,pozy+pj); ki('összpontszám : ',st); pj:= pj+1 ; xy pozició a képernyőn( 7,pozy+pj); ha pj>kepmeret akkor ablakratores amíg file_vége(fh); file_zárása(fh) eljárás zar; ki('.. A program egy gombnyomás után bezáródik...'); vár_egy_billentyűleütésre; Környezet: IBM PC, legalább MS DOS 5.0 operációs rendszer, Turbo Pascal 7.0 fejlesztői környezet, Crt, Util unit.
Holtverseny 10 Forráskód: A program holtv6.pas néven található az A:\ meghajtón. program osszetettben_a_gyoztes_holtversenyben_gyozott_e; uses crt,util; const maxm=100;kepmeret=2; var fbe1,fbe2,fki,si:string; pj,maxpont,pont1,pont2:integer; i,ii,m,mi,pozy:integer; holtverseny_e,hiba:boolean; szin:menucolors; procedure zar; TEXTCOLOR (0);TEXTBACKGROUND (4); gotoxy(15,15); write('.. A program egy gombnyomás után bezáródik...'); readkey; procedure datavalid(fileneve:string); If IOResult<>0 then Begin TEXTCOLOR (0); TEXTBACKGROUND (4); gotoxy(1,10); hiba:=true; clreol; Writeln(#7' Hiba van a ',fileneve,' File kezelésével!!!'); gotoxy(1,11);clreol; Writeln('1. Ellenőrizze, hogy olvasható-e, vagy létezik-e a jelzett file!'); Writeln('2. Ellenőrizze, hogy a file tartalmi, formai követelményenek eleget tesz-e!'); zar; halt; End; procedure beolvas; {$i-} repeat hiba:=false; window(1,1,80,7); TEXTCOLOR (2); TEXTBACKGROUND (0); gotoxy(5,3); write('hány versenyt rendeztek? M= ');window(33,3,39,3); read(m); window(1,1,80,25); If ((IOResult<>0) or (m<=1)) then Begin TEXTCOLOR (0);TEXTBACKGROUND (4); gotoxy(15,10); Write(#7'Rossz adat! 1-nél nagyobb egész számot kérek'); hiba:=true; End; until ((not hiba) and (M>1)); clrscr; {$i+}
Holtverseny 11 procedure elsometszet_kivalogatassal; var filea,fileb,filem:text; elem1,elem2:string; mini1,mini2,pont1,pont2:integer; hiba:=false; {$i-} assign(filea,fbe1);reset (filea); readln(filea,mini1); datavalid(fbe1); assign(filem,fki); rewrite(filem); writeln(filem,mini1); assign(fileb,fbe2); repeat readln(filea,elem1); readln(filea,pont1); datavalid(fbe1); reset (fileb); readln(fileb,mini2);datavalid(fbe2) ; repeat readln(fileb,elem2); readln(fileb,pont2); datavalid(fbe2); if elem1=elem2 then if ((pont2>=mini2) and (pont1>=mini1)) then writeln(filem,elem1); writeln(filem,pont1+pont2); until eof(fileb); until eof(filea); close(filea); close(fileb); close(filem); {$i-} procedure metszet_kivalogatassal; var filea,fileb,filem:text; elem1,elem2:string; mini1,mini2,pont1,pont2:integer; hiba:=false; {$i-} assign(filea,fbe1);reset (filea); readln(filea,mini1); datavalid(fbe1); assign(filem,fki); rewrite(filem); writeln(filem,mini1); assign(fileb,fbe2); repeat readln(filea,elem1); readln(filea,pont1); datavalid(fbe1); reset (fileb); readln(fileb,mini2);datavalid(fbe2) ; repeat readln(fileb,elem2); readln(fileb,pont2); datavalid(fbe2); if elem1=elem2 then if pont2>=mini2 then writeln(filem,elem1); writeln(filem,pont1+pont2); until eof(fileb); until eof(filea); close(filea); close(fileb); close(filem); {$i-}
Holtverseny 12 procedure ablakratores; gotoxy( 7,pozy+pj); write (' Ha elolvastad, nyomj egy gombot'); readkey; clreol; pj:=1; repeat gotoxy( 1,pozy+pj); clreol; inc(pj); until pj>kepmeret; pj:=1; procedure filetoscreen(filename:string); var fh:text; st:string; {$i-} assign(fh,filename);reset(fh);pj:=1; datavalid(filename); readln(fh,st); repeat readln(fh,st); gotoxy( 7,pozy+pj); write('név : ',st); inc(pj); readln(fh,st); gotoxy( 7,pozy+pj); write('összpontszám : ',st); inc(pj); gotoxy( 7,pozy+pj); if pj>kepmeret then ablakratores until eof(fh); close(fh) {$i+}
Holtverseny 13 procedure maximumkivalasztas(filename:string;var holtverseny:boolean;var nyertes:string); var fmax:text; st:string; pont:integer; st:='ny.txt'; assign(fmax,filename);reset(fmax); maxpont:=0;holtverseny:=false; readln(fmax,mi); repeat readln(fmax,st);readln(fmax,pont); if pont>=maxpont then if maxpont = pont then holtverseny:=true else holtverseny:=false; maxpont:=pont;nyertes:=st until eof(fmax); close(fmax); procedure holtverseny; var fh:text; st:string; j,p:integer; TEXTCOLOR (11);TEXTBACKGROUND (0); gotoxy(25,14); write(' HOLTVERSENY ALAKULT KI'); gotoxy(20,16); write(' A GYŐZTESEK ',maxpont,' PONTOT ÉRTEK EL'); {$i-} pozy:=20; assign(fh,fki);reset(fh);pj:=1; datavalid(fki); readln(fh,st); repeat readln(fh,st); readln(fh,p); if p=maxpont then gotoxy( 7,pozy+pj);write('Holtversenyben győztes: ',st); inc(pj); if pj>kepmeret then ablakratores until eof(fh); close(fh) {$i+}
Holtverseny 14 {főprogram} clrscr; beolvas; fbe1:='v1.txt'; fbe2:='v2.txt'; fki:='m1.txt'; elsometszet_kivalogatassal; if hiba then zar ;exit; for i:=3 to m do {be1} ii:=i mod 2 ; str(ii,si) ; fbe1:='m'+si+'.txt'; {be2} str(i,si) ; fbe2:='v'+si+'.txt'; {ki } ii:=abs((i mod 2)-1); str(ii,si) ; fki :='m'+si+'.txt'; metszet_kivalogatassal; clrscr; gotoxy(20,5);pozy:=7;write('bekerült az összesített versenybe:'); filetoscreen(fki); maximumkivalasztas(fki,holtverseny_e,fbe1); clrscr; gotoxy(22,10);pozy:=15; if holtverseny_e then holtverseny else write(' Nem holtversenyben'); gotoxy(22,13); write('abszolút győztes: ',fbe1); gotoxy(22,15); write('pontszáma: : ',maxpont); readkey; end. Tesztelés: A bemenő fájlok tartalma V1.txt V2.txt V3.txt V4.txt V5.txt 50 50 50 50 x50 Nagy Béla Alfa Béla Lényi Ágota Alfa Béla Alfa Béla 20 120 50 1500 1500 Kovács István Horváth Lajos Gipsz Jakab Gipsz Jakab Gipsz Jakab 30 30 20 20 20 Horváth Aladár Benkő Zsazsa Bürke Lajos Bürke Lajos Bürke Lajos 2 60 20 20 20 Alfa Béla Kiss Virág Borsózó Imre Borsózó Imre Borsózó Imre 100 80 40 40 40 Dévai Virág Éltető Napsugár Alfa Béla Dévai Virág Dévai Virág 100 90 100 100 100 Lapos Elemér Dévai Virág Dévai Virág Lapos Elemér Lapos Elemér 100 100 100 10 10 Oriza Triznyák Lapos Elemér Lapos Elemér Oriza Triznyák Oriza Triznyák 100 120 100 100 100 Kovács Viktor Oriza Triznyák Oriza Triznyák Benkő Zsazsa Benkő Zsazsa 100 100 120 63 63 Hortobágyi Pali Kovács Viktor Benkő Zsazsa Kiss Virág Kiss Virág 100 120 63 100 100 Hortobágyi Pali Kiss Virág Kovács Viktor Kovács Viktor 120 100 100 100 Kovács Viktor Hortobágyi Pali Hortobágyi Pali 100 100 100 Hortobágyi Pali 100
Holtverseny 15 Érvényes tesztesetek M=2 esetén: Holtverseny, nyertesek: Alfa Béla, Lapos Elemér, Kovács Viktor, Hortobágyi Pali M=3 esetén: Holtverseny, nyertesek: Alfa Béla, Lapos Elemér, Oriza Triznyák, Kovács Viktor, Hortobágyi Pali M=4 esetén: Abszolút győztes: Alfa Béla Érvénytelen tesztesetek M>4 esetén: pl M=5 Ha létezik v5.txt file: Hiba van a v5.txt file kezelésével 1. Ellenőrizze, hogy olvasható-e, vagy létezik-e a jelzett fájl, 2. Ellenőrizze, hogy a file tartalmi, formai követelményeknek eleget tesz-e! Sajnos a felhasználó a fájl valamelyik sorában ( jelen esetben, az első sorában ) gépelési hibát ejtett (numerikus érték helyett szöveget írt), ki kell javítani, elmenteni és a programot újra futtatni. Ha nem létezik v5.txt file: Hiba van a v5.txt file kezelésével 1. Ellenőrizze, hogy olvasható-e, vagy létezik-e a jelzett fájl, Sajnos a felhasználó vagy nem jó helyre tette a v5.txt nevű fájlt, vagy hibás a fájl, de az is lehet, hogy nem volt 5 verseny, csak az M értékét gépelte el. 2. Ellenőrizze, hogy a fájl tartalmi, formai követelményeknek eleget tesz-e! M<2 esetén, illetve ha M egy szöveg: pl M=1, M=xxx Rossz adat, 1-nél nagyobb számot kér a program, addig, amíg jó adatot nem adunk Fejlesztési lehetőségek: 1. A fájlokat tallózva lehessen beolvasni. Készítette: Naszári László I. évf. levelező informatika tanári szak 2003.
Holtverseny 16 Programozás módszertan 3. beadandó feladat Naszári László I. évf. levelező Informatika tanári szak 2003.