Programozási alapismeretek :: beadandó feladat Készítő adatai Név: Molnár Tamás EHA: MOTIABT.ELTE E-mail cím: motiabt@inf.elte.hu Gyakorlatvezető: Horváth László Feladat sorszáma: 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 adat m 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: 0 < n 15, 1 < m 30 Kimenet: jonapok jodb Utófeltétel: n N, m N, adatok m n : adatok[d][s] N (0 d m-1, 0 s n-1) 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 <iostream> #include <fstream> 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) { be_file >> 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 << " "; cout << ind << j+1 << ". tlp"; cout << endl; for (i=0; i<m; i++) { cout << ind << i+1 << ". nap: "; cout << ind << a[i][j] << " "; cout << endl; // A teszt file kivalasztasa void file_kivalaszt (string &fn) { const int max_f=5; int tn=0; string tf[max_f]={"teszt1.txt","teszt2.txt","teszt3.txt","teszt4.txt","teszt5.txt"; cout << endl << "Teszt file-ok:" << endl << endl; for (int i=0; i<max_f; i++) { cout << ind << i+1 << " - " << tf[i] << endl; while (tn<1 tn>max_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; j<i; j++) { if (j!=0) { cout << ", "; cout << jo[j]+1 << ". nap"; cout << " megfelelo." << endl; else { cout << "Nincs megfelelo nap." << endl << endl; return; // A megoldo algoritmus int megold (int adatok[m_max][n_max], int m, int n, int jonapok[m_max]) { int i=0; int s; for (int d=1; d<m; d++) { s=0; while (s<n && adatok[d][s]>adatok[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 7 5 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 3 5 12 7 15 24 20 13 15 14 17 22 16 16 17 25 23 teszt3.txt 8 7 12 7 12 14 20 12 23 13 15 14 17 22 23 27 16 16 17 25 23 23 12 24 32 13 31 22 12 8 13 23 23 33 10 12 13 22 25 24 35 17 20 15 20 21 23 19 21 20 30 21 20 18 16 15 13 18 teszt4.txt 12 5 teszt5.txt 1 7 30 27 Érvényes tesztesetek Bemenet Bemeneti fájl Kimenet m=7, n=5, adatok={... teszt1.txt jonapok={5, 7 m=3, n=5, adatok={... teszt2.txt jonapok={3 m=8, n=7, adatok={... teszt3.txt jonapok={2, 6 m=12, n=5, adatok={... teszt4.txt jonapok={2, 3, 7, 8, 11, 12 Érvénytelen tesztesetek Bemenet Bemeneti fájl Kimenet m=1, n=7, adatok={... teszt5.txt Hibaüzenet Hibaüzenet