10-es Keressünk egy egész számokat tartalmazó négyzetes mátrixban olyan oszlopot, ahol a főátló alatti elemek mind nullák! Megolda si terv: Specifika cio : A = (mat: Z n m,ind: N, l: L) Ef =(mat = mat`) n-1 Uf =( Ef ^ (l,ind) = SEARH (mind_nulla(i)) i=1 függvény szignatúra: mind_nulla: Z L függvény definíciója: n mind_nulla (k) : SEARCH (mat [i,j] 0) j=1+i Lineáris keresésbe ágyazott optimista lineáris keresés. Struktogram: 1
Alternatív Megolda si terv: Specifika cio : A = (matrix: Z n m, l: L) Ef =( matrix = matrix` ^ n 2) n-1 Uf =( Ef ^ l= SEARH (matrix [n+1][n] ==0)) i=1 függvény szignatúra: mind_nulla: Z L függvény definíciója: n-1 mind_nulla (k) : SEARCH (matrix [n+1][n]==0) j=1 Lineáris keresésbe ágyazott optimista lineáris keresés. Struktogram: 2
Implementa cio : Program va z Függvények egyszerű kapcsolódási szerkezete: main() beolvas_param() beolvas() oszlop_nulla() mind_nulla() fileki() Bemeno adatok forma ja A program az adatokat be egy külső fájlból olvassa be, közvetlenül nem lehet megadni őket. 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 a program újra megkérdezi az adatbevitelhez az állomány nevét. Ha rosszul adja meg az állománynevet vagy nem létező fájlnevet ad meg a felhasználó, akkor a program újra bekéri a beolvasni kívánt adatot, azaz a fájl nevét a kiterjesztésével. A bemeneti állomány formája kötött, s arról feltesszük, hogy helyesen van kitöltve, ezért ezt külön nem ellenőrizzük. Az első sorban a mátrix sor és oszlopszáma szerepel, szóközökkel elválasztva. (Mivel négyzetes mátrixokra akarjuk használni a programot, az oszlop és sorszáma azonos, de ha nem a program úgyis lefut, csak rossz eredményt ad.) Ezt követően olvashatók a mátrix elemei csak a konzolablakban, ezek is szóközökkel elválasztva, majd egy szöveges válasz. Igaz eredményt kapva a program azt is megmondja, melyik oszlopban van a főátló alatt csak nulla. Minden sor végén (az utolsó sor végén is) sorvége jel legyen. Példák: 2 2 0 0 1 0 3 3 1 2 3 2 0 4 1 0 0 4 4 1 2 3 4 0 6 7 8 0 0 1 2 0 0 0 5 5 5 9 8 7 6 5 4 3 2 1 0 1 2 3 4 5 6 7 8 9 0 0 0 0 1 0 3
A program fu ggve nyei main() A főprogram gondoskodik a beolvasás, a kiértékelés és a kiíratás részek aktivizálásáról. int n, m a mátrix méreteit tartalmazó azonos értékű változók vector<vector<int> > matrix a mátrix elemeit tartalmazó mátrix Válasz: Volt ilyen oszlop, Nem volt ilyen oszlop. (szöveges válasz) Válasz: Melyik oszlop volt, ha volt. (visszatérési-érték) Elvégzi a fájlból való beolvasást. Ezután meghívja a feladatot megoldó mind_nulla() függvényt. Ennek eredményétől függően pozitív vagy negatív választ ír a standard kimenetre és a fájlba. beolvas() A mátrix sor- és oszlop nagyságát, illetve a mátrix elemeit olvassa be a megadott beviteli állományból. string fajlnev az inputfájl neve int n, m a mátrix méreteit tartalmazó azonos értékű változók vector<vector<int> > matrix a mátrix elemeit tartalmazó mátrix Elvégzi a fájlból való beolvasást és megfelelő méretűre (n és m ) állítja be a mátrix sor és oszlop tömbjét, majd feltölti az értékeit intekkel. A beolvasott adatok a konzolablakban is megjelennek. void beolvas(vector<vector<int> > &mat) beolvas_param() Csupán annyiban különbözik a beolvas() függvénytől, hogy a cmd-ből való indításánál hat. void beolvas_param(vector<vector<int> > &mat, string fname) 4
bool oszlop_nulla() Megnézi, hogy van-e olyan oszlop, amiben a főátló alatti elemek mind nullák. vector<vector<int> > matrix a mátrix neve bool értékt ami vagy true vagy false Optimista Lineáris Keresés: Végigmegy a mátrix oszlopainak (a főátló alatti) elemein és amint olyan elemet talál köztük, ami nem nulla, továbblép a következő oszlopra. Ezt a műveletet az utolsó előtti oszlopig ismételi. Ha nem talált olyan oszlopot, ami mind 0 visszaadja a p változónak a hamis értéket, ha talált csak 0-ból álló főátló alatti elemeket, akkor kilép a ciklusból és a p értékét beállítja igaznak. bool oszlop_nulla(vector< vector<int> > &mat,bool &p, int i, int &ind) mind_nulla() Megnézi, hogy van-e olyan oszlop, amire igazat ad az oszlop_nulla() függvény. vector<vector<int> > matrix a négyzetes mátrix neve. bool változó ami vagy true vagy false Lineáris Keresés: Végigmegy a mátrix oszlopaira kapott logikai eredményeken, melyet a bool oszlop_nulla() függvény adott az adott oszlopoknak és megkeresi az első olyat, mely igaz. Ha nem talált, akkor a mátrixnak egyik oszlopában sincs a főátló alatt csak 0. bool mind_nulla(vector<vector<int> > &mat, int &ind,bool &l) fileki() Az eredmeny.txt fájlba kiírja a választ. válasz Volt ilyen oszlop és melyik; Nem volt ilyen oszlop. void fileki(string valasz, bool l,int ind) 5
Tesztele si terv Tesztesetek a feladat specifikációja alapján (fekete doboz tesztelés) 1. Ha a mátrix elemeinek száma kisebb, mint 2, a program lefut, eredmény: nem volt ilyen nap. (6.txt) 2. Ha egyáltalán nincs benne olyan sor akkor válaszként hamisat ad. (1.txt) 3. Ha rosszul van kitöltve a fájl, akkor is lefut, de hamis értéket ad vissza. (3.txt) 4. Ha minden eleme 0, akkor már az első oszlop után igaz eredményt ad vissza. (4.txt) 5. Ha a legutolsó elem 0, akkor is hamisat dob, hiszen az még maga a főátló. (2.txt) 6. Ha az elemek helyett karaktereket tartalmazó fájlt nyit meg. (7.txt) Tesztesetek a megoldó kód alapján (fehér doboz tesztelés) 1. A beolvasást végző függvények tesztelése: Parancssorból indítás fájlnévvel és anélkül. Nem létező vagy rossz fájlnév megadása. Üres állomány esetén a program áll, majd hibát észlel és leáll. (5.txt) 2. Az oszlop _nulla () függvény tesztelése: 1. ha sehol sincs benne nulla (1.txt) 2. ha az első oszlop mind nulla (8.txt) 3. ha a második oszlop nulla (matrix.txt) 4. ha mind nulla (4.txt) 5. ha a főátló nulla (9.txt) 3. A mind_nulla () függvény tesztelése: 1. igaz eredmények: a. matrix.txt, 4.txt, 8.txt 2. hamis eredmények: a. 1.txt, 2.txt 6