ELEMI ALKALMAZÁSOK FEJLESZTÉSE I. Maximum kiválasztás tömbben Készítette: Szabóné Nacsa Rozália Gregorics Tibor tömb létrehozási módozatok maximum kiválasztás kódolása for ciklus adatellenőrzés do-while ciklus Adjunk meg egy tömbben egész számokat, keressük meg a tömb valamely maximális elemét, és az eredményt írjuk ki a szabványos outputra. Készítsünk többféle megoldást attól függően, hogy a tömböt hogyan hozzuk létre! Adatok előkészítése Absztrakt megoldó program Megoldás vázlata Itt biztosítjuk, hogy a feladat elvégzéséhez szükséges adatok megfelelő formában álljanak rendelkezésünkre. A számítások elvégzéséhez felhasználunk egy maximum kiválasztást. Maximális elemek Eredmény megjelenítése Itt írjuk ki a maximális elem értékét és azt, hogy ez a tömb hányadik eleme. Megoldás terve A = vect(z) Z Z v max ind B = vect(z) Bemenő változók: v : vect(z) v Q = ( v=v v.dom>0) Kimenő változók : max, ind : Z R=( Q max = Előfeltétel: v.dom > 0 v.hib v[ind] = max (v[i]) i=v.lob max, ind, i := v.lov, v.lob, v.lob+1 ind [v.lob..v.hib] ) i v.hib #include <iostream> using namespace std; int main() { // Adatok beolvasása és ellenőrzése // Absztrakt program C++ program kerete max, ind:= v[i], i max < v[i] i:=i+1 SKIP // Eredmény kiírása várakozás return 0; a program végén char ch; ch; cin cin >> >> ch; ch; 1
++i i++ i = i+1 --i 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; Speciális értékadások j = i++; j = i; i = i+1; j = ++i; j = i = i+1; program_1 feltétel program_2 for(program_1;feltétel;program_2){ for(int i=0;i<n;++i){ for(int i=0;i<n;++i) utasítás; for ciklus ciklusváltozó Tömb deklarálása Legyen a v egy egészeket tartalmazó tömb Deklaráció, helyfoglalás, feltöltés int v[] = { 4, 7, 0, 9, 6, 7, 9, 4 ; Deklaráció, helyfoglalás int v[8]; Ide csak konstans írható Külön a deklaráció, külön a hossz megadása, külön a helyfoglalás int n = 8; Tömbök indexelése C++-ban Legyen a v egy n elemű tömb Az első elem indexe: 0 Az utoló elem indexe: n-1 Legyen a v egy n elemű tömb Index túlcsordolás?? v[-1] v[n] v[0] v[3] v.lob 0 v.hib n-1 v.lov v[0] v[n-1] Ha a vektor -1-dik vagy az az n - dik elemére hivatkozunk - SAJNOS!!!! - nincs hibajelzés, de természetesen ilyenkor akármi is is történhet. 2
Tömb kiírása Maximum kiválasztás kódolása max, ind, i := v.lov, v.lob, v.lob+1 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. i v.hib max, ind:= v[i], i max < v[i] i:=i+1 //Maximumkeresés SKIP int ind, max ; max=v[0]; ind = 0; 0; for(int i=1; i<n; ++i){ if( v[i]>max ){ ){ max = v[i]; ind = i; i; Eredmény kiírása //Eredmény megjelenítése cout << "A tömb egyik maximális eleme: " << max << "." << endl ; cout << "Ez a tömb " << ind+1 << ". eleme." << endl; konstans tömb statikus helyfoglalású tömb dinamikus helyfoglalású tömb A tömb egyik maximális eleme: 9. Ez a tömb 7. eleme. A tömb elemeinek értékét a program futása közben nem változtatjuk meg. A tömb egész const int v[] = {4, 7, 0, 9, 6, 7, 9, 4; const int n = sizeof(v)/sizeof(v[0]); futása közben nem változtatjuk meg. Konstans tömb A tömb egész int v[100]; cin >> n; // Kell még egy ellenőrzés: 0<n<=100 futása közben olvassuk be és ellenőrizzük Statikus helyfoglalású tömb A tömb elemeinek számára adott felső korlát. A tömb elemeinek beolvasása 3
A tömb egész Dinamikus helyfoglalású tömb ellenőrizzük cin >> n; // Kell még egy ellenőrzés: n>0 A tömb elemei számára lefoglal elegendő helyet... delete[] v; futása közben olvassuk be és A tömb elemeinek beolvasása A tömb számára lefoglalt terület felszabadításaa #include <iostream> using namespace std; int main() { //Adatok beolvasása cin >> n; if(n<=0){ cout << "Hibás adat!" << endl; exit(1); Teljes program //Eredmény megjelenítése cout << "A tömb egyik maximális eleme: " << max << "." << endl ; //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; cout << "Ez a tömb " << ind+1 << ". eleme." << endl; delete[] v; return 0; Adatellenőrzés: számok do-while ciklus #include <string> int i; string str; feltétel cin >> str; i = atoi(str.c_str()); bool hiba = (i == 0 && str!= 0 ); atoi() atof() while ( feltétel ) 4
Ellenőrzött adatbevitel Program végtelenítése bool hiba; 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); // Beolvasás // Főprogram // Kiíratás cout << endl << Futtassam újra? (I/N) ; char ch; cin >> ch; while(ch!= n && ch!= N ) 5