1
Szerző
Név: Lővei Péter
ETR-azonosító: LOPSAAI.ELTE
Drótposta-cím: [email protected]
Kurzuskód: IP-08PAEG/25
Gyakorlatvezető neve: Daiki Tennó
Feladatsorszám: 11
2
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
1
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.
Felhasználói dokumentáció
2
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 ma-
dárfajok számát (M).
Ezután N][M-szer megkérdezi az adott helységben az adott madárfajból látott ma-
darak számát.
Sorindex Adat Magyarázat
1. N, M A helységek száma (N), a madárfajok száma (M)
2. MAD1,1 Az első helység első madárfajából látott mada-rak száma
… … …
i+1. MADi,j Az i. helység j. madárfajából látott madarak száma
… … …
N][M+1 MADN,M Az N. helység M. madárfajából látott madarak
száma
Egy lehetséges párbeszéd
Példa a beadando.exe klaviatúra-inputjára.
A program eredménye
A program kiírja, hogy melyek voltak azok a madárfajok, melyek csak egy helységben
fordultak elő.
Felhasználói dokumentáció
3
Egy lehetséges kimenet
Példa a beadando.exe képernyő-outputjára.
Hibalehetőségek
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áj-
los input különleges gondosságot igényel, hiszen ekkor teljességgel hiába való a prog-
ram ú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.
1
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: 0N,M
Utófeltétel: 0EGY(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
Fejlesztői dokumentáció
2
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:
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:
main
beolvasas vizsgalat kiiras billentyureVar
Fejlesztői dokumentáció
3
C++ kód
//Szerzõ: Lõvei Péter
//ETR-azonosító: LOPSAAI.ELTE
//Drótposta-cím: [email protected]
//
//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 fordul elõ]
//Elõfeltétel: 0<N,M
//Utófeltétel: 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);
Fejlesztői dokumentáció
4
kiiras(m,sz);
billentyureVar();
return 0;
}
void beolvasas(int &n, int &m,int** &mad){
do { //ez a rész felelős a beolvasá-
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[]){
Fejlesztői dokumentáció
5
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;}
void billentyureVar(){system("pause");}
Tesztelés
É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
1 mad1.be
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
1, 2 mad2.be
N=3, M=1
MAD[1][1]=0 MAD[1][2]=3 MAD[1][3]=1
Nem volt
olyan…
mad3.be
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 mad4.be
Fejlesztői dokumentáció
6
Érvénytelen tesztesetek
Bemenet Kimenet
N≤0; M≤0; MAD[i][j]≤0 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.