Algoritmizálás és adatmodellezés tanítása beadandó feladat: Algtan1 tanári beadandó /99 1 Készítette: Gipsz Jakab Neptun-azonosító: ABC123 E-mail: gipszjakab@seholse.hu Kurzuskód: IT-13AAT1EG 1 A fenti feladatsor itt érhető el: http://biro.inf.elte.hu/. Értelemszerűen töltendők itt ki a szerzőre vonatkozó adatok. A lábjegyzetek a végső dokumentációból törlendők! Csak az Ön segítését szolgálja. 1/13
Gyakorlatvezető neve:??? 2016. február 8. Tartalom Felhasználói dokumentáció... 4 Feladat... 4 Futási környezet... 4 Használat... 4 A program indítása... 4 A program bemenete... 4 A program kimenete... 4 Minta bemenet és kimenet... 5 Hibalehetőségek... 5 Fejlesztői dokumentáció... 7 Feladat... 7 Specifikáció... 7 Fejlesztői környezet... 7 Forráskód... 8 Megoldás... 8 Programparaméterek... 8 Programfelépítés... 8 Függvénystruktúra... 8 Algoritmus... 9 2/13
A kód... 10 Tesztelés... 12 Érvényes tesztesetek... 12 Érvénytelen tesztesetek... 13 Fejlesztési lehetőségek... 13 3/13
Felhasználói dokumentáció Feladat Egy repülőút során egyenlő távolságonként mértük a felszín tengerszint feletti magasságát. Zéró magasságot ott mértünk, ahol állóvíz volt, pozitív magasságot pedig ott, ahol szárazföld. Három egymást követő mérési eredményt jelöljön A, B és C. Ekkor B bal oldali partot jelez, ha B>0 és A=0; jobb oldali partot jelez, ha B>0 és C=0. Készítsen programot, amely meghatároz két szigetet, melyeknél nincs egymáshoz közelebbi szigetpár, ha nincs ilyen, akkor ezt egyetlen 0-val jelezze! Futási környezet IBM PC, exe futtatására alkalmas, 32-bites operációs rendszer (pl. Windows 7). Nem igényel egeret. Használat A program indítása A program az ABC123\szigetek.exe néven található a tömörített állományban. A szigetek.exe fájl kiválasztásával indítható. A program bemenete A program az adatokat a billentyűzetről vagy fájlból olvassa be a következő sorrendben: # Adat Magyarázat 0. Bemód A beolvasás módja (fájlból olvasás esetén 1, billentyűzetről olvasás esetén 0). 1. N A magasságmérés hossza (2 N 10000). 2. Magasság1 Az első magasság (0 Magasság1 9000). 3. Magasság2 A második magasság (0 Magasság2 9000).... N+1. MagasságN Az N-edik magasság (0 MagasságN 9000). A program kimenete A program kiírja az egymáshoz legközelebbi két sziget bal és jobb partját jelző mérés sorszámát. A kimenet első sorába az első szigetet, a második sorba a második szigetet azonosító két adat kerül. Ha nincs két sziget, akkor az egyetlen kimeneti sorba egyetlen 0 kerül. Ha több szigetpárra is igaz, hogy távolságuk minimális, akkor az első párhoz tartozó adatot írja ki a program. 4/13
Minta bemenet és kimenet Mintafutás billentyűzetről való beolvasás esetén Mintafutás fájlból való beolvasás esetén A bemeneti állomány nevét a kiterjesztésével együtt kell megadni, és a bemeneti állományt közvetlenül a futtatható állomány mellett kell elhelyezni. Megadható a könyvtári útvonal is, amennyiben nem az exe mellett található az adatfájl. Hibalehetőségek Adat-beolvasási mód nem 0 vagy 1. Ha fájlból jönnek az adatok, akkor nem létezik (az adott könyvtárban) a paraméterként megadott nevű fájl. Az operációs rendszer által az útvonal-megadásra megkívánt szintaktikai elvárások megsértése esetén a fájl nem lesz megnyitható. A mérések száma nem egész szám, vagy nem esik a 2..10 000 intervallumba. Valamely magassági érték nem szám, vagy nem esik a 0..9 000 intervallumba. Fájlos input esetén az adatok helyességét nem vizsgálja a program. Billentyűzet-inputnál hiba esetén a program azzal jelzi a hibát, hogy újra kérdezi azt. 5/13
Mintafutás hibás bemeneti adatok esetén: Hibás adatforrás-, majd fájl-választás: Hibás numerikus adat-megadás: 6/13
Fejlesztői dokumentáció Feladat Egy repülőút során egyenlő távolságonként mértük a felszín tengerszint feletti magasságát. Zéró magasságot ott mértünk, ahol állóvíz volt, pozitív magasságot pedig ott, ahol szárazföld. Három egymást követő mérési eredményt jelöljön A, B és C. Ekkor B bal oldali partot jelez, ha B>0 és A=0; jobb oldali partot jelez, ha B>0 és C=0. Készítsen programot, amely meghatároz két szigetet, melyeknél nincs egymáshoz közelebbi szigetpár, ha nincs ilyen, akkor ezt egyetlen 0-val jelezze! Specifikáció A specifikációban nem foglalkozunk az adatforrással, csak a feladat lényegi részére koncentrálunk. Bemenet: N N, Magasságok N * : VanE L, Szig1,Szig2 Sziget, Sziget=Bal Jobb, Bal,Jobb=N Előfeltétel: N [2..10000] i [1..N]: Magasságoki [0..9000] N 1 Utófeltétel: db= i=2 SzigetKezdet(i) szigek Sziget * i [1..db]: (szigeki.bal [2..N] szigeki.jobb [1..N-1] szigeki.bal szigeki.jobb SzigetKezdet(szigeki.Bal) SzigetVég(szigeki.Jobb) i [szigeki.bal..szigeki.jobb]: Magasságoki>0) db<2 VanE=Hamis db 2 VanE=Igaz i [1..db-1]: Szig1=szigeki Szig2=szigeki+1 i [1..db-1]: szigeki+1.bal-szigeki.jobb Szig2.Bal-Szig1.Jobb Definíció: SzigetKezdet: N L SzigetKezdet(i):=Magasságoki>0 Magasságoki-1=0 SzigetVég: N L SzigetVég(i):=Magasságoki>0 Magasságoki+1=0 Megjegyzés: a ha nincs ilyen kitételt (a VanE=Hamis esetben) a program egyetlen 0 kiírásával fogja jelezni, nem pedig a logikai érték megjelenítésével (hűen a feladat eredeti kiírásához). Fejlesztői környezet IBM PC, exe futtatására alkalmas operációs rendszer (pl. Windows 7). fpc Pascal-fordítóprogram (v2.6.4), Geany (v1.23.1) fejlesztői környezet. 7/13
Forráskód A teljes fejlesztői anyag kicsomagolás után az ABC123 nevű könyvtárban található meg. A fejlesztés során használt könyvtár-struktúra: Állomány ABC123\szigetek.exe ABC123\forras\szigetek.pas ABC123\teszt1.txt ABC123\teszt2.txt ABC123\teszt3.txt ABC123\teszt4.txt ABC123\teszt5.txt futtatható kód Pascal forrás teszt-bemeneti fájl1 teszt-bemeneti fájl2 teszt-bemeneti fájl3 teszt-bemeneti fájl4 teszt-bemeneti fájl5 Magyarázat ABC123\doksi\szigetek.docx dokumentációk (ez a fájl) Megoldás Programparaméterek Konstans MaxN MaxMagasság Típus TMaggasságok TSziget Változó N Magasságok Szig1,Szig2 : Egész(10000) [a mérések maximális száma] : Egész(9000) [a maximális magasság] = Tömb(1..MaxN:Egész) = Rekord(bal,jobb:Egész) : Egész : TMagasságok : TSziget Programfelépítés A program által használt modulok (és helyük): szigetek.pas Függvénystruktúra program, a forráskönyvtárban OlvasásraNyit 8/13
A teljes program algoritmusa Program Szigetek: [programparaméterek:] Konstans MaxN:Egész(10000) [a mérések maximális száma, a bekéréshez] MaxMagasság:Egész(9000) [a maximális magasság, a bekéréshez] Típus TMagasságok=Tömb(1..MaxN:Egész) TSziget=Rekord(bal,jobb:Egész) Változó [Bemenet:] N:Egész Magasságok:TMagasságok [:] VanE:Logikai Szig1,Szig2:TSziget [főprogram:] AdatBeolvasás(N,Magasságok) LegközelebbiSzigetek(N,Magasságok,VanE,Szig1,Szig2) EredményKiirás(VanE,Szig1,Szig2) Program vége. [alprogramok:] Eljárás AdatBeolvasás(Változó n:egész, magok:tmagasságok): Változó bemod:egész f:szövegfájl fn:szöveg Be:beMod [ 0 vagy 1 ] Ha bemod= 1 akkor [fájlból olvasás:] Be:fN [OlvasásraNyit(f,fN)] Olvas(f,n) Olvas(f,magok(1..n)) 2 Lezár(f) különben [billentyűről olvasás:] Be:n [n [2..MaxN]] Be:magok(1..n) [n [0..MaxMagasság]] Elágazás vége Eljárás vége. Eljárás LegkozelebbiSzigetek(Konstans n:egész, magok:tmagasságok, Változó vane:logikai, sz1,sz2:tsziget): [Lokális konstansok, típusok, változók:] Kosntans MaxSz:Egész(MaxN Div 2) sziget0:tsziget=(bal:0,jobb:0) Típus TSzigetek=Tömb(0..MaxSz:TSziget) 2 Ez az alábbi rövidített leírása: Ciklus i=1-től n-ig Olvas(f,magok(i)) Ciklus vége 9/13
Változó db,i, mini,mint:egész szigek:tszigetek [szigetek inicializálása:] szigek(0..maxsz):=sziget0 3 [szigetek kiválogatása:] db:=0 Ciklus i=2-től n-1-ig Ha magok(i)>0 és magok(i-1)=0 akkor db:+1 szigek(db).bal:=i Elágazás vége Ha magok(i)>0 és magok(i+1)=0 akkor szigek(db).jobb:=i Elágazás vége Ciklus vége Ha db>0 és szigek(db).jobb=0 akkor db:-1 [a túlpart bal partja, amely nem sziget] Ha db<2 akkor [nincs két legközelebbi sziget:] vane:=hamis különben [van legalább két sziget:] [minimális távolság:] mini:=1; mint:=szigek(2).bal-szigek(1).jobb Ciklus i=2-től db-1-ig Ha szigek(i+1).bal-szigek(i).jobb<mint akkor mini:=i; mint:=szigek(i+1).bal-szigek(i).jobb Elágazás vége Ciklus vége szig1.bal:=szigek(mini).bal; szig1.jobb:=szigek(mini).jobb sz2.bal:=szigek(mini+1).bal; sz2.jobb:=szigek(mini+1).jobb vane:=igaz Elágazás vége Eljárás vége. Eljárás EredményKiirás(Konstans vane:logikai, sz1,sz2:tsziget): Ha nem vane akkor Ki: 0 Különben Ki: sz1.bal,sz1.jobb,sz2.bal,sz2.jobb [a megkívánt formátum szerint] Elágazás vége Eljárás vége. 3 Ez az alábbival ekvivalens, rövidebb leírás: Ciklus i=0-tól MaxSz-ig szigek(0.maxsz):=sziget0 Ciklus vége 10/13
A kód A sziget.pas fájl tartalma: (* Készítette: Gipsz Jakab Neptun: ABC123 E-mail: gipszjakab@seholse.hu Feladat: Algtan1 tanári beadandó/99 *) Program Szigetek; //Programparaméterek: Const MaxN=10000; MaxMagassag=9000; Type TMagassagok=Array [1..MaxN] of Integer; TSziget=Record bal,jobb:integer End; Var //Bemenet: N:Integer; Magassagok:TMagassagok; //: VanE:Boolean; Szig1,Szig2:TSziget; //Alprogramok: Function OlvasasraNyit(Var f:text; Const fn:string):boolean; Begin End; Procedure AdatBeolvasas(Var n:integer; Var magok:tmagassagok); Begin End; Procedure LegkozelebbiSzigetek(Const n:integer; magok:tmagassagok; Var vane:boolean; Var sz1,sz2:tsziget); Begin End; Procedure EredmenyKiir(Const VanE:Boolean; Const sz1,sz2:tsziget); Begin End; Begin//Főprogram: AdatBeolvasas(N,Magassagok); LegkozelebbiSzigetek(N,Magassagok,VanE,Szig1,Szig2); EredmenyKiir(VanE,Szig1,Szig2); End. 11/13
Tesztelés Érvényes tesztesetek 1. teszteset: be1.txt N = 2 Magasság1 = 0 Magasság2 = 0 0 Bemenet nincs sziget; minimális hossz 2. teszteset: be2.txt N = 12 Magasság1 = 3 Magasság2 = 0 Magasság3 = 2 Magasság4 = 0 Magasság5 = 4 Magasság6 = 3 Magasság7 = 0 Magasság8 = 0 Magasság9 = 3 Magasság10 = 0 Magasság11 = 2 Magasság12 = 0 Szig1 = 3 3 Szig1 = 5 6 Bemenet kontinenssel kezdődik, van legalább 2 sziget 3. teszteset: be3.txt N = Magasság1 = Bemenet kontinenssel végződik, van legalább 2 sziget 12/13
4. teszteset: be4.txt N = Magasság1 = Bemenet nincs kontinens, egy sziget van 5. teszteset: be5.txt N = Magasság1 = Bemenet csak kontinens van Érvénytelen tesztesetek 6. teszteset Adatforrás = fájlból Újrakérdezés Bemenet Rossz adatforrás 7. teszteset Adatforrás = 1 Fájlnév= C:\rosszKonyvtar Fájlnév= C:\joKonyvtar\rosszFajlnev Újrakérdezés Újrakérdezés 8. teszteset Fejlesztési lehetőségek Bemenet Rossz fájlnév 1. Hibás fájl-bemenetek felismerése, és a hiba helyének (sor sorszámának) kiírása. 2. A hibára utaló hibaüzenetek megadása. 3. A felhasználóval igényesebb párbeszéd klaviatúra input esetén. 4. Többszöri futtatás megszervezése 13/13