Szerző Név: Lővei Péter ETR-azonosító: LOPSAAI.ELTE Drótposta-cím: petyalovei@gmail.com Kurzuskód: IP-08PAEG/25 Gyakorlatvezető neve: Daiki Tennó Feladatsorszám: 11 1
Tartalom Szerző... 1 Tartalom... 2 Felhasználói dokumentáció... 1 Feladat... 1 Környezet... 1 Használat... 1 A program indítása...1 A program bemenete...2 Egy lehetséges párbeszéd...2 A program eredménye...2 Egy lehetséges kimenet...3 Hibalehetőségek...3 Egy lehetséges párbeszéd...3 Fejlesztői dokumentáció... 1 Feladat... 1 Specifikáció...1 Környezet... 1 Forráskód... 1 Megoldás... 1 Fontos típusok, változók...1 Programfelépítés...1 Algoritmus...2 C++ kód... 3 Tesztelés... 3 Érvényes tesztesetek...5 Érvénytelen tesztesetek...6 Fejlesztési lehetőségek... 6 2
Felhasználói dokumentáció Feladat Az ország N helységében végeztünk madármegfigyeléseket. Mindegyikben megadtuk, hogy milyen fajú madárból hányat láttunk. A madárfajok száma összesen M. Készíts programot, amely eldönti, hogy volt-e olyan madár, amely csak 1 helyen fordul elő! Környezet IBM PC, exe futtatására alkalmas operációs rendszer (pl. Windows 7). Nem igényel egeret. Használat A program indítása A program LOPSAAI_11\bin\Release\BEADANDO.EXE néven található a telepítő anyagban. A beadando.exe program indítása. 1
Felhasználói dokumentáció Fájlos input/output esetén az előbbi könyvtárból a fentihez hasonló módon a fájlparaméterek megadásával így indítható: BEADANDO.EXE >eredmeny.ki <bemenet.be vagy BEADANDO.EXE >>eredmeny.ki <bemenet.be Megjegyzések: 1. Ha az output fájlparamétert elhagyjuk, akkor az eredmény a képernyőn fog megjelenni. 2. A bemeneti tesztadat-fájlok az EXE mellett találhatók. 3. Az utóbbi híváskor minden indítás eredménye az eredmeny.ki fájlba, folytatólag kerül beírásra, míg az első esetben a beleírás előtt a fájl tartalma törlődik. A program bemenete A program először megkérdezi a helységek számát (N), majd megkérdezi a madárfajok számát (M). Ezután N][M-szer megkérdezi az adott helységben az adott madárfajból látott madarak számát. Sorindex Adat Magyarázat 1. N, M A helységek száma (N), a madárfajok száma (M) 2. MAD 1,1 Az első helység első madárfajából látott madarak száma i+1. MAD i,j Az i. helység j. madárfajából látott madarak száma N][M+1 MAD N,M Az N. helység M. madárfajából látott madarak száma Egy lehetséges párbeszéd A program eredménye Példa a beadando.exe klaviatúra-inputjára. A program kiírja, hogy melyek voltak azok a madárfajok, melyek csak egy helységben fordultak elő. 2
Felhasználói dokumentáció Egy lehetséges kimenet Hibalehetőségek Példa a beadando.exe képernyő-outputjára. A helységek száma és a madárfajok száma nem lehet kisebb 0-nál. Ha a felhasználó 0- nál kevesebbet ad meg, akkor a program az adatot újra kérdezi. (Figyelem, ezért is a fájlos input különleges gondosságot igényel, hiszen ekkor teljességgel hiába való a program újrakérdezése: az adatok elcsúszása a program rendellenes viselkedéséhez vezet.) Egy lehetséges párbeszéd Példa a beadando.exe hibás klaviatúra-inputjára. 3
Fejlesztői dokumentáció Feladat Az ország N helységében végeztünk madármegfigyeléseket. Mindegyikben megadtuk, hogy milyen fajú madárból hányat láttunk. A madárfajok száma összesen M. Készíts programot, amely eldönti, hogy volt-e olyan madár, amely csak 1 helyen fordul elő! Specifikáció Bemenet: N:Egész [helységek száma] M:Egész [madárfajok száma] Mad:Tömb[1..N][1..M] [a madarak számát tartalmazó tömb] Kimenet: EGY(i):Egész [a madárfaj(ok) sorszáma, amelyik csak egy helyen fordul elő] Előfeltétel: 0 N,M Utófeltétel: 0 EGY(i) M Környezet IBM PC, exe futtatására alkalmas operációs rendszer (pl. Windows 7). C++ fordítóprogram (pl. gcc), Code::Blocks fejlesztői környezet. Forráskód A teljes fejlesztői anyag a LOPSAAI_11 nevű könyvtárban található meg. A fejlesztés során használt könyvtár-struktúra (LOPSAAI_11-relatív): \bin\debug\beadando.exe nyomkövethető állapotú futtatható kód \bin\release\beadando.exe végleges futtatható kód \mad1.be 1. tesztadat fájl \mad2.be 2. tesztadat fájl \mad3.be 3. tesztadat fájl \mad4.be 4. tesztadat fájl \obj\debug\beadando.o nyomkövethető állapotú, féliglefordított (object-) kód \obj\release\beadando.o végleges, féliglefordított (object-) kód \beadando.cbp projektfájl, \beadando.cpp C++ forrás. Megoldás Fontos típusok, változók Változó N,M:Egész MAD:Tömb[N:Egész][M:Egész] SZ:Tömb[M:Egész] Programfelépítés A program által használt modulok (és helye): beadando beadando.cpp iostream a C++ rendszer része 1
Fejlesztői dokumentáció stdio.h - a C++ rendszer része stdlib.h - a C++ rendszer része A skalar.cpp függvénystruktúrája az alábbi: main beolvasas vizsgalat kiiras billentyurevar A beadando.cpp felépülése függvényekből. Algoritmus Az algoritmizálás szempontjából két függvény mondható érdekesnek: a vizsgalat. Ennek algoritmusa az alábbi: A másik függvény a kiiras: 2
Fejlesztői dokumentáció C++ kód //Szerzõ: Lõvei Péter //ETR-azonosító: LOPSAAI.ELTE //Drótposta-cím: petyalovei@gmail.com // //Feladat: // Madármegfigyelés 11.feladat //Specifikáció //Bemenet: N:Egész [helységek száma] // M:Egész [madárfajok száma] // Mad:Tömb[1..N][1..M] [a madarak számát tartalmazó tömb] //Kimenet:EGY:Egész [a madárfaj(ok) sorszáma, amelyik csak egy helyen f //Elõfeltétel: //Utófeltétel: 0<N,M 0<EGY<=M #include <iostream> using namespace std; int z,n,m; int **tomb; void beolvasas(int &n, int &m, int** &mad); void vizsgalat(int n, int m, int** mad, float sz[]); void kiiras(int m, const float sz[]); void billentyurevar(); int main(){ int **mad; float sz[m+1]; beolvasas(n,m,mad); vizsgalat(n,m,mad,sz); 3
Fejlesztői dokumentáció kiiras(m,sz); billentyurevar(); return 0; } void beolvasas(int &n, int &m,int** &mad){ //ez a rész felelős a beolvasá- do { sért cout<<"n: "; cin>>n;} while (n<0); do { cout<<"m: "; cin>>m;} while (m<0); mad=new int*[n+1]; for (int i=1;i<=n;++i){mad[i]=new int[m+1];} for (int i=1; i<=n; i++) { cout<<i<<". helyseg: "<<endl; for (int j=1; j<=m; j++){ cout<<j<<". madarfaj: "; cin>>mad[i][j];} }} void vizsgalat(int n, int m, int** mad, float sz[]){ for (int k=1; k<=m; k++) {sz[k]=0;} for (int j=1; j<=m; j++) { //ebben a részben megszamlaljuk hany telepulesben fordultak elo a madarfajok }} for (int i=1; i<=n; i++) { if (mad[i][j]>0){ } } sz[j]=sz[j]++; void kiiras(int m, const float sz[]){ 4
Fejlesztői dokumentáció cout<<"a kovetkezo madarfajok fordultak elo csak egy helyen:"<<endl; //ebben a reszben iratjuk ki azokat a madarfajokat, amik z=0; //csak egy helyen fordulnak elő, itt is döntjük ezt el for (int i=1; i<=m; i++) { if (sz[i]==1) { cout<<i<<" ";} else { z=z+1;}} if (z==m) {cout<<"nem volt olyan madarfaj, ami csak egy helyen fordult volna elo.";} cout<<endl;} Tesztelés void billentyurevar(){system("pause");} Érvényes tesztesetek Bemenet Kimenet Bemeneti fájl N=1 M=1 MAD[1][1]>0 1 N=2, M=3 MAD[1][1]=0, MAD[1][2]=3, MAD[1][3]=5 MAD[2][1]=1, MAD[2][2]=8, MAD[2][3]=3 N=2, M=3 MAD[1][1]=0, MAD[1][2]=5, MAD[1][3]=5 MAD[2][1]=1, MAD[2][2]=0, MAD[2][3]=3 N=3, M=1 MAD[1][1]=0 MAD[1][2]=3 MAD[1][3]=1 N=5, M=2 MAD[1][1]=0, MAD[1][2]=1 MAD[2][1]=1, MAD[2][2]=0 MAD[3][1]=0, MAD[3][2]=1 MAD[4][1]=0, MAD[4][2]=1 MAD[5][1]=0, MAD[5][2]=1 1 mad1.be 1, 2 mad2.be Nem volt olyan mad3.be 1 mad4.be 5
Fejlesztői dokumentáció Érvénytelen tesztesetek Bemenet N 0; M 0; MAD[i][j] 0 Kimenet hibaüzenet Fejlesztési lehetőségek A beolvasás szigorúbb kontroljának megoldása. A teszteseteket generálhatná a program, így sokkal véletlenebb eredményt elérve. 6