Programozási alapismeretek :: beadandó feladat Készítő adatai Név: EHA: E-mail cím: Gyakorlatvezető: Feladat sorszáma:
Molnár Tamás MOTIABT.ELTE
[email protected] Horváth László 23.
Felhasználói dokumentáció Program leírása A meteorológiai intézet az ország N településére adott M napos időjárás előrejelzést, az adott településen az adott napra várt legmagasabb hőmérsékletet. A program megadja azokat a napokat, amikor minden településen melegebb lesz, mint az előző nap volt.
Mellékelt állományok Futtatható program: Projekt állomány: C++ forráskód: Object kód: Teszt állományok:
Dokumentáció:
beadando.exe beadando.cbp main.cpp obj/Debug/main.o teszt1.txt teszt2.txt teszt3.txt teszt4.txt teszt5.txt dokumentacio.pdf
Használat A program a bemeneti adatokat teszt állományokból veszi. A használni kívánt teszt állomány neve kiválasztható a program futása alatt, illetve parancssorból való indításkor megadható első paraméterként. A program a fentiek miatt a standard inputon nem fogad fájlt. Teszt állományok felépítése m n adatm×n m: n: adat :
sorok (napok) száma oszlopok (települések) száma hőmérsékleti érték
Fejlesztői dokumentáció Feladat A meteorológiai intézet az ország N településére adott M napos időjárás előrejelzést, az adott településen az adott napra várt legmagasabb hőmérsékletet. Készíts programot, amely megadja azokat a napokat, amikor minden településen melegebb lesz, mint az előző nap volt!
Specifikáció Bemenet: Előfeltétel: Kimenet:
n ∈ , m ∈ , adatokm×n : adatok[d][s] ∈ (0≤d≤m-1, 0≤s≤n-1) 0 < n ≤ 15, 1 < m ≤ 30 jonapokjodb
Utófeltétel:
jonapok[i]=d | d ∈ [1..m-1] ∧ (∀ s ∈ [0..n-1] : adatok[d][s] > adatok[d-1][s])
Az adatokra (hőmérsékleti értékek) nem adunk előfeltételt, elérendő a program minél szélesebb körű felhasználhatóságát (pl. Földön kívüli települések). Bemeneti változók jelentése m: n: adatok :
napok száma települések száma hőmérsékleti értékeket tartalmazó m×n-es mátrix
Kimeneti változók jelentése jonapok : az utófeltételnek megfelelő jodb darab napot tartalmazó tömb (megoldás)
Megoldás A feladat megoldását az 'Eldöntés' programozási tétel m számú ismétlése adja ('Kiválogatás').
Megoldó algoritmus:
C++ kód #include
#include using namespace std; // Programozasi alapismeretek // Beadando feladat // Molnár Tamás // MOTIABT.ELTE const string ind="
";
const int n_max=15; const int m_max=30; // Az adatok fajlbol torteno beolvasasa bool file_beolvas (string fn, int &n, int &m, int a[m_max][n_max]) { ifstream be_file; bool siker; int i; int j; be_file.open(fn.c_str()); siker=be_file.is_open(); if (siker) { be_file >> m; be_file >> n; siker=((n>0) && (m>1) && (n<=n_max) && (m<=m_max)); if (siker) { for (i=0;i<m;++i) { for (j=0; j> a[i][j]; } } be_file.close(); } } return siker; } // A bemeneti adatok kiiratasa void adatok_kiir (int n, int m, int a[m_max][n_max]) { int i; int j; cout << endl << "Bemeneti adatok:" << endl << endl; cout << ind << " "; for (j=0; jmax_f) { cout << endl << "Kerem adja meg a teszt file szamat: "; cin >> tn; if (tn<1 || tn>max_f) { cout << endl << "Hibas szam!" << endl << endl; } }
fn=tf[tn-1]; return; } // Az eredmeny kiiratasa void eredm_kiir (int *jo, int i) { cout << endl << "Eredmeny: " << endl << endl << ind; if (i>0) { for (int j=0; jadatok[d-1][s]) { s=s+1; } if (s==n) { jonapok[i]=d; i=i+1; } } return i; } // FO fv int main (int argc, const char* argv[]) { char futtat='i'; int adatok[m_max][n_max]; int n; int m; string fn=""; if (argc>1) { fn=argv[1]; } while (futtat=='i') { if (fn=="") { file_kivalaszt(fn); } if (file_beolvas(fn, n, m, adatok)) { adatok_kiir(n, m, adatok); int jonapok[m_max]; int jodb; jodb=megold(adatok, m, n, jonapok); eredm_kiir(jonapok, jodb); } else { cout << endl << "File hiba!" << endl; }; cout << endl << endl << "Ujra futtatja a programot (i/n)? "; cin >> futtat; cout << endl << endl; if (futtat=='i') { fn=""; } } return 0; }
Tesztelés A tesztelés a mellékelt teszt állományok felhasználásával történt. Teszt állományok tartalma teszt1.txt
75 12 7 15 24 20 14 19 15 9 18 10 9 16 18 25 9 12 11 15 18 12 13 14 16 19 13 15 14 17 22 16 16 17 25 23
teszt2.txt
35 12 7 15 24 20 13 15 14 17 22 16 16 17 25 23
teszt3.txt
87 12 13 16 24 13 22 20 21
7 15 16 32 23 25 21 20
12 14 17 13 23 24 23 18
14 17 25 31 33 35 19 16
20 22 23 22 10 17 21 15
teszt4.txt
12 5 12 13 16 16 16 12 13 16 16 12 13 16
7 15 16 16 16 7 15 16 16 7 15 16
12 14 17 17 17 12 14 17 17 12 14 17
20 23 26 26 26 20 23 26 26 20 23 26
12 16 19 19 19 12 16 19 19 12 16 19
teszt5.txt
17 12
7
12
20
12
12 23 23 12 12 20 20 13
23 27 12 8 13 15 30 18
30
27
Érvényes tesztesetek Bemenet m=7, n=5, adatok={...} m=3, n=5, adatok={...} m=8, n=7, adatok={...} m=12, n=5, adatok={...}
Bemeneti fájl teszt1.txt teszt2.txt teszt3.txt teszt4.txt
Kimenet jonapok={5, 7} jonapok={3} jonapok={2, 6} jonapok={2, 3, 7, 8, 11, 12}
Bemenet m=1, n=7, adatok={...}
Bemeneti fájl teszt5.txt
∅
∅
Kimenet Hibaüzenet Hibaüzenet
Érvénytelen tesztesetek