Elemi alkalmazások fejlesztése I. 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
Feladat 4 7 9 6 Keressük meg egy tömb valamely maximális elemét. Az eredményt írjuk ki a szabványos outputra. 4 7 9 6 Maximális elemek
Absztrakt megoldó program Eredmény megjelenítése 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 1 2 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. 3 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
"Kódolás"
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;
Tömbök indexelése 4 7 9 6 v[0] v[3] v[n-1] v.lob 0 v.hib n-1 Az első elem indexe: 0. Az utoló elem indexe: n-1. 4 7 9 6 v[0] v[3] v[n-1] v.lob 0 v.hib n-1 v.lov v[0]
Index túlcsordulás ? 4 7 9 6 ? v[n] v[-1] 9 6 ? 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!!!!!
Main függvény int main() { //Adatok beolvasása //Maximumkeresés 1 //Eredmény megjelenítése return 0; } 1 visszatérési érték 2 3
Main függvény 2 int main() { //Adatok beolvasása //Maximumkeresés //Eredmény megjelenítése return 0; } 1 1 2 2 3
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
Main függvény 3 int main() { //Adatok beolvasása //Maximumkeresés 1 //Eredmény megjelenítése return 0; } 1 2 2 3 3
//Eredmény megjelenítése cout << "A tömb egyik maximális eleme: " << max << "." << endl ; cout << "Ez a tömb " << ind+1 << ". eleme." << endl; A tömb egyik maximális eleme: 9. Ez a tömb 7. eleme.
Main függvény 1 int main() { //Adatok beolvasása //Maximumkeresés 1 //Eredmény megjelenítése return 0; } 1 1 2 2 3 3
Háromféle megoldás a tömb használatára konstans tömb statikus helyfoglalású tömb dinamikus helyfoglalású tömb
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 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; } A tömb elemei: 4,7,0,9,6,7,9.
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 = new int[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 v[0] v[1] v[2] v[3] v[0] v[1] v[2] v[3] int *v; 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 = new int[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’)
Vége