Programozási segédlet Programozási tételek Az alábbiakban leírtam néhány alap algoritmust, amit ismernie kell annak, aki programozásra adja a fejét. A lista korántsem teljes, ám ennyi elég kell legyen ahhoz, hogy a kezdő programozó néhány egyszerűbb feladatot sikeresen meg tudjon oldani. Mennyire kell ( érdemes ) ezeket tudni? Úgy, hogy bármikor szükség lehet rájuk. Vizsgán, zh-n sokkal könnyebb átmenni, ha nem ott kell kitalálni ezeket az algoritmusokat. Csere Van két változónk ( A és B ), és azok értékét szeretnénk felcserélni. Az egyik lehetséges módszer az, hogy használunk egy segédváltozót. Ebbe elmentjük A változó értékét: SEGED = A Mivel A értékét így elmentettük, felülírhatjuk B értékével: A = B Majd B értékét felülírjuk A eredeti értékével, amit most a SEGED-ben tárolunk: B = SEGED int a, b, seged; a = 10; b = 20; /****** Csere ******/ seged = a; a = b; b = seged; printf("csere utan:\n"); Számok esetén van olyan módszer is, ami nem igényel segédváltozót, csak összeadást és kivonást: A = A + B B = A B A = A B int a, b; a = 100; b = 120; printf("***************\n"); a = a + b; 1/6
printf("***************\n"); b = a b; printf("***************\n"); a = a b; Lineáris keresés Adott egy N elemű vektor, amely valamilyen objektumokat tárol. A vektor rendezetlen, tehát az elemek nincsenek nagyság szerint sorba rendezve. Az a feladat, hogy keressünk meg egy bizonyos értékű elemet a vektorban. Az algoritmus a következő elven működik: elindulunk a vektor elején, és sorra megvizsgáljuk az elemeket. Akkor állunk meg, ha megtaláltuk azt amit kerestünk, vagy ha elértük a vektor végét. Tehát egy ciklusra lesz szükségünk, valamint egy index változóra. A vektor indexelését most 0-tól kezdjük N-1-ig. ciklus amíg ( index < N ) és ( vektor[ index ] keresendő érték ) index = index + 1 Ha ( index < N ) Kiír A keresett érték helye a vektorban: index egyébként Kiír A keresett elem nincs benne a vektorban Megjegyzés: A feltételben fontos, hogy előbb az i < N feltételt ellenőrizzük. Mivel ha az elem nincs benne a tömbben, akkor a ciklus azért fog leállni, mert az i index olyan értéket vesz fel, amivel már kilépünk a vektorból. Ekkor az i < N kifejezés hamis lesz, és ilyenkor a program az és kapcsolat miatt már nem fogja kiértékelni a feltétel második részét ( vektor[ i ] keresendő érték ), így nem fog a program olyan memóriaterületen vizsgálódni, ahol már nem szabad. int i = 0; int mit_keres = 7; while (( i < N ) && ( vektor[i]!= mit_keres )) i++; if ( i < N ) printf("a %d a %d. helyen van\n", mit_keres, i); else printf("a %d nem talalhato meg a vektorban!\n", mit_keres); 2/6
Eldöntés Kicsit hasonlít a lineáris kereséshez, de itt csak annyi a feladat, hogy megmondjuk hogy egy adott elem benne van-e a vektorban ( a hely most nem érdekes ). ciklus amíg ( index < N ) és ( vektor[ index ] keresendő érték ) index = index + 1 Talalat = index < N Ha ( Talalat ) Kiír A keresett érték benne van a vektorban egyébként Kiír A keresett elem nincs benne a vektorban int i = 0; int mit_keres = 7; int talalat = 0; while (( i < N ) && ( vektor[i]!= mit_keres )) i++; talalat = i < N; if ( talalat ) printf("a %d benne van a vektorban\n", mit_keres); else printf("a %d nem talalhato meg a vektorban!\n", mit_keres); Megszámlálás Egy adott N elemű rendezetlen vektor T tulajdonságú elemeinek számát kell meghatározni. Használjunk szintén egy ciklust. Ezúttal az összes elemet meg kell vizsgálni. Használjunk a ciklusváltozón kívül még egy számlálásra használt változót is. mennyi = 0 ciklus -tól N 1-ig ha vektor[ index ] T tulajdonságú, akkor mennyi = mennyi + 1 elágazás vége Kiír mennyi példa c-ben: int i = 0; int mit_keres = 4; int mennyi = 0; for (i = 0; i < N; i++) { 3/6
if (vektor[i] == mit_keres) mennyi++; printf("%d talalat\n", mennyi); Minimum kiválasztás Adott egy N elemű rendezetlen vektor. A feladatunk az, hogy megkeressük a legkisebb elemet. Ehhez végig kell néznünk a teljes vektort. Kezdetben a legelső elemet tekintjük minimálisnak. Ha találunk kisebbet, akkor ez utóbbit tekintjük minimális elemnek. minimum_ ciklus index = 1-től N-1-ig Ha vektor[ index ] < vektor[ minimum_index ] akkor minimum_index = indexelését elágazás vége int i; int min_; for (i = 1; i < N; i++) { if (vektor[i] < vektor[min_index]) min_index = i; printf("a legkisebb elem a %d., ami a %d\n", min_index, vektor[min_index]); Megjegyzés: A reláció megfordításával az algoritmus a maximális elemet fogja megtalálni. Rendezés Adott egy N elemű rendezetlen vektor. A feladat ezen vektor elemeinek rendezése növekvő vagy csökkenő sorrendbe. Erre számos algoritmus létezik, az alábbiakban az egyik legegyszerűbbet, a minimumkiválasztásos rendezést írom le, amivel növekvő sorrendbe lehet rendezni az elemeket. Első lépésben meghatározzuk az egész vektor legkisebb elemét. Ezt, és az első elemet felcseréljük. Ekkor az első elem utáni elemeket kell rendezni. Tehát a 2. elemtől indulva megkeressük a legkisebbet, majd ezt felcseréljük a második elemmel. Ezt így folytatjuk, míg el nem érünk a vektor végére: Példa: legyenek az elemek a következők: 4, 1, 4, 2, 0, 5, 7, 3, 8, 4 N = 10 i = 0 Megkeressük a legkisebb elemet, ez a 0, amit felcserélünk az i. elemmel: 0, 1, 4, 2, 4, 5, 7, 3, 8, 4 4/6
Ezután i-t növeljük. Most az i. indexű elemtől kezdve keressük meg a legkisebbet. Ez az 1 lesz, most nem kell cserélni, majd i-t újra növeljük. Most az i = 2. indexű elemtől keresünk, és azt találjuk, hogy a 3-as indexű elem a legkisebb ( ami 2 ), ezt felcseréljük az i. elemmel: 0, 1, 2, 4, 4, 5, 7, 3, 8, 4 Az algoritmust folytatva így rendeződik a vektor: i = 3 0, 1, 2, 3, 4, 5, 7, 4, 8, 4 i = 4 0, 1, 2, 3, 4, 4, 7, 5, 8, 4 i = 5 0, 1, 2, 3, 4, 4, 7, 5, 8, 4 i = 6 0, 1, 2, 3, 4, 4, 4, 5, 8, 7 i = 7 0, 1, 2, 3, 4, 4, 4, 5, 8, 7 i = 8 0, 1, 2, 3, 4, 4, 4, 5, 7, 8 Ciklus i = 0-tól N 2-ig min_index = i Ciklus j = i + 1-től N 1-ig Ha vektor[ j ] < vektor[ min_index ] akkor min_index = j elágazás vége Ciklus vége Az i. és min_index-ik elem cseréje int vektor[n] = { 4, 1, 4, 2, 0, 5, 7, 3, 8, 4 ; int i, j; int min_index; int seged; printf("rendezes elott:\n"); for (i = 0; i < N; i++) printf("%d ", vektor[i]); printf("\n"); for (i = 0; i < N - 1; i++) { min_index = i; for (j = i + 1; j < N; j++) { if (vektor[j] < vektor[min_index]) min_index = j; seged = vektor[i]; vektor[i] = vektor[min_index]; vektor[min_index] = seged; printf("rendezes utan:\n"); for (i = 0; i < N; i++) printf("%d ", vektor[i]); 5/6
printf("\n"); 6/6