320 likes | 388 Views
Maximumkeresés tömbökben. Elemi alkalmazások fejlesztése I. Készítette: Gregorics Tibor: gt@inf.elte.hu Szabóné Nacsa Rozália: nacsa@inf.elte.hu Lektorálta: Szendrei Rudolf: szr@inf.elte.hu. 4. 7. 0. 9. 6. 7. 9. 4. Feladat. Keressük meg egy tömb valamely maximális elemét.
E N D
Maximumkeresés tömbökben Elemi alkalmazások fejlesztése I. Készítette: Gregorics Tibor: gt@inf.elte.hu Szabóné Nacsa Rozália: nacsa@inf.elte.hu Lektorálta: Szendrei Rudolf: szr@inf.elte.hu
4 7 0 9 6 7 9 4 Feladat Keressük meg egy tömb valamely maximális elemét. Az eredményt írjuk ki a szabványos outputra. Maximális elemek
1 2 3 Megoldás Itt biztosítjuk, hogy a feladat elvégzéséhez szükséges adatok megfelelő formában álljanak rendelkezésünkre . Adatok előkészítése Absztrakt megoldó program A számítások elvégzéséhez felhasználunk egy maximunkeresést. Itt írjuk ki a maximális elem értékét és azt, hogy ez a tömb hányadik eleme. Eredmény megjelenítése
Maximumkeresés tétele: állapottér f: függvény m: az értelmezési tartomány alsó határa n: az értelmezési tartomány felső határa max: a maximális elem értéke ind: a maximális elem indexe i: segédváltozó Maximumkeresés tétele: előfeltétel m n
Maximumkeresés tétele: struktogram max, ind, i := f(m), m, m+1 i n max < f(i) max, ind:= f(i), i SKIP i:=i+1
Maximumkeresés tétele: tömbökre max, ind, i := v.lov, v.lob, v.lob+1 i v.hib max < v[i] max, ind:= v[i], i SKIP i:=i+1
Speciális értékadások • j = i++; • j = i; i = i+1; • j = ++i; • j = i = i+1; • • i++ i = i+1 • i-- i = i-1 • i+= a i = i+a • i-= a i = i-a • i*= a i = i*a • i/= a i = i/a • i%= a i = i%a • i = j = k; j = k;i = k;
For utasítás program_1 feltétel mag program_2 • for(program_1;feltétel;program_2){ • mag • } ciklusváltozó • for(int i=0;i<n;i++){ • mag • } • for(int i=0;i<n;i++) utasítás;
4 7 0 9 6 7 9 4 Tömbök indexelése Az első elem indexe: 0. Az utoló elem indexe: n-1. v[0] v[3] v[n-1] v.lob 0 v.hib n-1 v.lov v[0]
4 ? ? 7 0 9 6 7 9 4 Index túlcsordulás v[n] v[-1] Ha a vektor -1-dik vagy az n- dik elemére hivatkozunk - SAJNOS!!!! - nincs hibajelzés, de természetesen ilyenkor akármi is történhet. TILOS ILYET CSINÁLNI!!!!!
1 2 3 Main függvény int main() { //Adatok beolvasása //Maximumkeresés //Eredmény megjelenítése return 0; } visszatérési érték
2 1 1 2 3 Main függvény int main() { //Adatok beolvasása //Maximumkeresés //Eredmény megjelenítése return 0; }
max, ind, i := v.lov, v.lob, v.lob+1 i v.hib max < v[i] max, ind:= v[i], i SKIP • //Maximumkeresés • int ind, max ; • max=v[0]; ind = 0; • for(int i=1; i<n; i++){ • if(v[i]>max ){ • max = v[i]; • ind = i; • } • } i:=i+1
1 3 2 2 3 Main függvény int main() { //Adatok beolvasása //Maximumkeresés //Eredmény megjelenítése return 0; }
A tömb egyik maximális eleme: 9. Ez a tömb 7. eleme. • //Eredmény megjelenítése • cout << "A tömb egyik maximális eleme: " • << max << "." << endl ; • cout << "Ez a tömb " << ind+1 << ". eleme." << endl;
1 1 2 3 2 3 Main függvény int main() { //Adatok beolvasása //Maximumkeresés //Eredmény megjelenítése return 0; }
konstans tömb statikus helyfoglalású tömb dinamikushelyfoglalású tömb Háromféle megoldás a tömb használatára
Konstans tömb létrehozása A tömb elemeinek értékét a program futása közben nem változtatjuk meg. A tömb egész számokat tartalmaz const int v[] = {4, 7, 0, 9, 6, 7, 9, 4}; const int n = sizeof(v)/sizeof(v[0]); implicit konverzió A tömb elemszámát a program futása közben nem változtatjuk meg. n a tömb elemeinek száma.
A tömb elemei: 4,7,0,9,6,7,9. A tömb megjelenítése • cout << " A tömb elemei: "; • for (int i=0; i<n; i++){ • cout << v[i]; • if (i != (n-1)) cout << ", "; • else cout << ". " << endl; • }
Statikus helyfoglalású tömb létrehozása és feltöltése A tömb egész számokat tartalmaz A tömb elemeinek számára adott felső korlát. • int v[100]; • int n; • cout << "Adja meg a tomb elemszamat!" << endl; • cin >> n; // Kell még egy ellenőrzés: 0<n<=100 • cout << "Adja meg a tomb elemeit!" << endl; • for(int i=0; i<n; i++){ • cout << i+1 << ". elem: "; • cin >> v[i]; • } n a tömb elemeinek száma. A tömb elemeinek beolvasása A tömb elemszámát a program futása közben olvassuk be és ellenőrizzük
Dinamikus helyfoglalású tömb létrehozása és feltöltése A tömb egész számokat tartalmaz n a tömb elemeinek száma. • int* v; • int n; • cout << "Adja meg a tomb elemszamat!" << endl; • cin >> n; // Kell még egy ellenőrzés: n>0 • v = newint[n]; • cout << "Adja meg a tomb elemeit!" << endl; • for(int i=0; i<n; i++){ • cout << i+1 << ". elem: "; • cin >> v[i]; • } A tömb elemszámát a program futása közben olvassuk be és ellenőrizzük A tömb elemei számára lefoglal elegendő helyet A tömb elemeinek beolvasása
new és delete int *v; 1 v =new int[4]; 2 v[0] v[1] v[2] v[3] delete[ ] v; 3 v[0] v[1] v[2] v[3] Amikor nincs rá tovább szükségünk, felszabadítjuk a lefoglalt területet.
Teljes program • #include <iostream> • using namespace std; • int main() • { • //Adatok beolvasása • int* v; • int n; • cout << "Adja meg a tomb elemszamat!" << endl; • cin >> n; • if(n<=0){ • cout << "Hibás adat!" << endl; • char ch; cin >> ch; • exit(1); • } • v = newint[n];
cout << "Adja meg a tomb elemeit!" << endl; • for(int i=0; i<n; i++){ • cout << i+1 << ". elem: "; • cin >> v[i]; • } • //Maximumkeresés • int ind, max ; • max=v[0]; ind = 0; • for(int i=1; i<n; i++){ • if(v[i]>max ){ • max = v[i]; • ind = i; • } • }
//Eredmény megjelenítése • cout << "A tömb egyik maximális eleme: " • << max << "." << endl ; • cout << "Ez a tömb " << ind+1 << ". eleme." << endl; • delete[] v; • char ch; • cin >> ch; • return 0; • }
Adatellenőrzés (egészek beolvasása) #include <string> • int i; • string str; • cin >> str; • i = atoi(str.c_str()); • bool hiba = (i == 0 && str != ”0”); • atoi() • atof()
Do-while utasítás mag feltétel mag • do{ • mag • }while ( feltétel )
Ellenőrzött adatbevitel • bool hiba; • do{ • cout << endl << ”Kérek egy természetes számot:”; • string str; • cin >> str; • n = atoi(str.c_str()); • if(hiba = ((n==0 && str!=”0”) || n<0)) • cout << ”Hibás adat!”; • }while(hiba);
Program végtelenítése • do{ • // Beolvasás • // Főprogram • // Kiíratás • cout << endl << ”Futtassam újra? (I/N)”; • Char ch; cin >> ch; • }while(ch!=’n’ && ch!=’N’)