Programozás Minta programterv a 1. házi feladathoz 1. Gregorics Tibor 1. beadandó/0.feladat 2008. december 6. EHACODE.ELTE gt@inf.elte.hu 0.csoport Feladat Egy osztályba n diák jár, akik m darab tantárgyat tanulnak. Ismerjük a félév végi osztályzataikat. Igaz-e, hogy minden diáknak van legalább két ötöse? Megoldási terv A = (napló: N n m, l: L) Ef =( napló = napló ) Uf =( Ef (l = i [1..n] : ötösdb(i) 2 ) ) = ( Ef ( l search ( ötösdb( i) 2) ) ) m ahol ötösdb(i) : [1..m] N és ötösdb(i) = 1 j=1 napló[i,j]=5 n i 1 l,i:=true,1 l i n l:= ötösdb(i) 2 i:= i+1 s:= ötösdb(i) s:=0 j= 1..m napló[i,j]=5 s:=s+1 SKIP Alternatív megoldási terv (rekurzív függvénnyel) Uf =( Ef (l = i [1..n] : jótanuló(i)) ) = ( Ef ( l search ( jótanuló ( i)) ) ) ahol jótanuló(i) = j [1..m] : ötösdb_i(j) = 2 ahol ötösdb_i : [0..m] N ötösdb_i(0) = 0 1 ha napló[ i, j] 5 ötösdb_i(j) = ötösdb_i(j-1) + 0 ha napló[ i, j] 5 n i 1 (j 1) l,i:=true,1 l i n l:= jótanuló(i) i:= i+1 l:= jótanuló(i) l,j,s:= false,1,0 l j m napló[i,j]=5 s:=s+1 SKIP l:= s=2 j:= j+1
Programozás Minta programterv a 1. házi feladathoz 2. Implementáció Program váz A program több állományból áll. A read csomagban (read.h, read.cpp) a ReadInt(), ReadNat(), és a all() függvényeket találjuk, a többi függvény a naplo.cpp állományban van. Függvények kapcsolódási szerkezete main() ReadInt() egykettoharom() ReadNat() all() Neveket_olvas() Jegyeket_olvas() ReadInt() Jegy() Fájlból_olvas() Mindenkinek_ket_otos() Jotanulo() Bemenő adatok formája Az adatokat be lehet olvasni egy szöveges állományból vagy meg lehet adni közvetlenül. Ha a programot parancssorból indítjuk úgy, hogy paraméterként megadjuk a bemenő adatokat tartalmazó szöveges állomány nevét, akkor innen olvassa be a program az adatokat. Ha nem adunk meg a parancssorban állomány nevet vagy nem parancssorból indul a program, akkor az először megkérdezi az adatbevitel módját, majd a szöveges állományból való olvasást választva bekéri az állomány nevét. A közvetlen adatbevitelt a program párbeszédüzemmódban irányítja, és azt megfelelő adat-ellenőrzésekkel vizsgálja. A szöveges állomány formája kötött, arról feltesszük, hogy helyesen van kitöltve, ezért ezt külön nem ellenőrizzük. Az első sor a tanulók és a tantárgyak számát tartalmazza, szóközökkel vagy tabulátor jelekkel elválasztva. Ezt követően olvashatók a tanulók nevei soronként, majd a tantárgyak nevei ugyancsak soronként. Végül az osztályzatok következnek a tanulók sorrendjében úgy, hogy minden tanuló jegyei egy sorban szóközökkel vagy tabulátor jelekkel legyenek elválasztva a tantárgyak megadott sorrendjében. Minden sor végén (az utolsó sor végén is) sorvége jel legyen.
Programozás Minta programterv a 1. házi feladathoz 3. Példa: 2 3 Kerek Berci Nagy János Matek Föci Orosz 4 3 2 5 4 4 A program függvényei main() Feladat: Bemenő adatok: Kimenő adatok: Tevékenység: Definíció: A főprogram gondoskodik a beolvasás, a kiértékelés, kiíratás részek aktivizálásáról. vector<vector<int> > naplo - osztályzatokat tartalmazó mátrix vector<string> tanulo - tanulók neveit tartalmazó tömb vector<string> targy - tárgyak neveit tartalmazó tömb igen/nem válasz (visszatérési-érték) Eldönti, hogy mi legyen a beolvasás forrása: parancssorban megadott szöveges állomány neve (ez az alapértelmezett, ha megadtuk) vagy menüből választhatunk a billentyűzet illetve szöveges állomány között. Feltölti a bemenő változókat: billentyűzetről beolvassa a tanulók számát, majd a neveiket, ugyanazt teszi a tantárgyakkal, és beolvassa az egyes osztályzatokat. Ezután meghívja a feladatot megoldó mindenkinek_ket_otos() függvényt. Ennek eredményétől függően pozitív vagy negatív választ ír a standard kimenetre. helye naplo.cpp Mindenkinek_ket_otos() Feladat: Megvizsgálja, hogy mindenkinek van-e legalább két ötöse. Bemenő adatok: vector<vector<int> > naplo - osztályzatokat tartalmazó mátrix Kimenő adatok: bool l - válasz: visszatérési érték Tevékenység: Optimista lineáris keresés: eldönti, hogy a mátrix (osztályzási napló) minden sorának (tanulójának) van-e legalább két ötöse. Ehhez minden sorra meghívja a Jotanulo() függvényt. bool Mindenkinek_ket_otos(vector<vector<<int> > v); Jotanulo() Feladat: Megadja van-e egy tanulónak legalább két ötöse. Bemenő adatok: vector<int> v - aktuális tanuló osztályzatai Kimenő adatok: bool l - van-e legalább két ötös: visszatérési-érték Tevékenység: Keresi az első olyan számot, amelyik már a második ötös. bool Jotanulo(vector<int> v);
Programozás Minta programterv a 1. házi feladathoz 4. Neveket_olvas() Feladat: Nevekkel tölt fel egy tömböt. Bemenő adatok: int n - nevek száma string msg - kiírandó üzenet Kimenő adatok: vector<string> v - neveket tartalmazó tömb Tevékenység: Megfelelő méretűre (n) állítja be a tömböt, majd feltölti az értékeit sztringekkel. void Neveket_olvas(int n,string msg,vector<string> &v); Jegyeket_olvas() Feladat: 1 és 5 közötti számokkal tölt fel egy mátrixot. Bemenő adatok: vector<string> tanulo - tanulók neveit tartalmazó tömb vector<string> targy - tárgyak neveit tartalmazó tömb Kimenő adatok: vector<vector<int> > naplo - osztályzatokat tartalmazó mátrix Tevékenység: Megfelelő méretűre (tanulo.size targy.size) állítja be a mátrixot, majd feltölti az értékeit 1 és 5 közötti számokkal úgy, hogy rendre jelzi, hogy ezek a számok melyik tanuló melyik tantárgyára kapott osztályzatok. void Jegyeket_olvas(vector<string> tanulo, vector<string> targy, vector<vector<int> > &naplo); Fajlbol_olvas() Feladat: Tanuló és tantárgy neveket olvas egy szöveges állományból, majd ugyanonnan 1 és 5 közötti számokkal feltölti a naplót. Bemenő adatok: string fajlnev - inputfájl neve Kimenő adatok: vector<string> tanulo - tanulok neveit tartalmazó tömb vector<string> targy - tárgyak neveit tartalmazó tömb vector<vector<int> > naplo - osztályzatokat tartalmazó mátrix Tevékenység: Megfelelő méretűre (n és m) állítja be a tanulo és a targy tömböt, majd feltölti az értékeit sztringekkel. A tanuló neve tartalmazhat szóközt is. Megfelelő méretűre (n m) állítja be a naplo mátrixot, majd feltölti az értékeit 1 és 5 közötti számokkal. A beolvasott adatok a konzolablakban is megjelennek.. void Fajlbol_olvas(const string &fajlnev vector<string> &tanulo, vector<string> &targy, vector<vector<int> > &naplo);
Programozás Minta programterv a 1. házi feladathoz 5. ReadNat() Feladat: Megadott feltételt kielégítő természetes számot olvas be. Bemenő adatok: string msg - kiírandó üzenet string errormsg - kiírandó hibaüzenet Kimenő adatok: int n - beolvasott természetes szám: visszatérési érték Tevékenység: Billentyűzetről olvas be egy a cond() feltételnek megfelelő természetes számot. A cond()feltétel alapértelmezés szerint mindent elfogad, azaz bool c(int) { return true;} Definíció: helye read.cpp int ReadNat(string msg, string errormsg, bool cond(int) = c); ReadInt() Feladat: Megadott feltételt kielégítő egész számot olvas be. Bemenő adatok: string msg - kiírandó üzenet string errormsg - kiírandó hibaüzenet Kimenő adatok: int n - beolvasott egész szám: visszatérési érték Tevékenység: Billentyűzetről olvas be egy a cond() feltételnek megfelelő egész számot. A cond() feltétel alapértelmezés szerint mindent elfogad, azaz bool c(int) { return true;} Definíció: helye read.cpp int ReadInt(string msg, string errormsg, bool cond(int) = c); Jegy() Feladat: Eldönti egy egész számról, hogy osztályzat-e. Bemenő adatok: int n - egész szám Kimenő adatok: bool l - vizsgálat eredménye: visszatérési érték Tevékenység: Eldönti egy egész számról, hogy 1 és 5 közé esik-e. bool Jegy(int n); egykettoharom() Feladat: Eldönti egy egész számról, hogy 1, 2 vagy 3 értékű-e. Bemenő adatok: int s - egész szám Kimenő adatok: bool l - vizsgálat eredménye: visszatérési érték Tevékenység: Eldönti egy egész számról, hogy 1, 2 vagy 3 értékű-e. bool egykettoharom(int s);
Programozás Minta programterv a 1. házi feladathoz 6. Tesztelési terv Tesztesetek a feladat specifikációja alapján (fekete doboz tesztelés) 1. Üres napló: nincs tanuló (válasz: igaz) (t11.txt) vagy nincs tantárgy (válasz: hamis) (t12.txt), illetve egyik sincs (válasz: igaz) (t10.txt) esetei. 2. Egy tanuló, egy tantárgy esete. (adat: 5 válasz: hamis) (t2.txt) 3. Több tanuló, több tantárgy: mindenkinek van legalább két ötöse. (adat: 2 3 [ 5, 3, 5, 5, 5, 5] válasz: igaz) (t3.txt) 4. Több tanuló, több tantárgy: csak az első tanulónak nincs két ötöse. (adat: 3 2 [ 5, 3, 5, 5, 5, 5] válasz: hamis) (t4.txt) 5. Több tanuló, több tantárgy: csak az utolsó tanulónak nincs két ötöse. (adat: 3 2 [ 5, 5, 5, 5, 1, 5] válasz: hamis) (t5.txt) 6. Több tanuló, több tantárgy: senkinek nincs két ötöse. (adat: 3 2 [ 5, 3, 5, 3, 1, 5] válasz: hamis) (t6.txt) Tesztesetek a megoldó kód alapján (fehér doboz tesztelés) 1. A beolvasást végző függvények tesztelése: Menü választás tesztelése (1, 2, 3, más) Beolvasás mindhárom módozatának tesztelése. Parancssorból indítás fájlnévvel és anélkül. Nem létező fájlnév megadása. Hibás adatok a billentyűzetről (negatív tanuló vagy tantárgy szám, hibás osztályzat); 2. A Mindekinek_ket_otos() függvény tesztelése: igenlő válasz esete több tanulónál (ciklus feltételnél való kilépés vagy be se lépés esetei); (adat: 3 2 [5, 5, 5, 5, 5, 5] válasz: igaz) (t7.txt) (adat: 0 2 [] válasz: igaz) (t11.txt) nemleges válasz, amely az első tanulónál jelentkezik (kilépés az első menetben a break utasításnál); (adat: 3 2 [ 5, 3, 5, 3, 1, 5] válasz: hamis) (t6.txt) nemleges válasz, amely az utolsó tanulónál jelentkezik (kilépés több menet után a break utasításnál); (adat: 3 2 [ 5, 5, 5, 5, 1, 5] válasz: hamis) (t5.txt) elágazás feltétel tesztelése (kisebb, épp egyenlő, nagyobb, mint 2 esetei). (adat: 3 2 [ 5, 5, 5, 5, 1, 5] válasz: hamis) (t5.txt) 3. A Jotanulo() függvény tesztelése: olyan adatsorra, amikor egyszer sem lép a ciklusba a vezérlés; (adat: 3 0 [] válasz: hamis) olyan adatsorra, amikor végig megy az intervallumon a keresés; (adat: 3 1 [5, 3, 1] válasz: hamis) olyan adatsorra, amikor háromszor lép a ciklusba a vezérlés; (adat: 3 2 [5, 2, 5, 3, 1, 1] válasz: hamis)