Algoritmusok 1
Megszámlálás
Számoljuk meg a lista elemeit!
1adatok = [6, 12, 5, 26, 13, 2, 7, 8]
2
3darab = 0
4for adat in adatok:
5 darab = darab + 1
6
7print("Az adatok listában", darab, "szám található")
1#include <iostream>
2using namespace std;
3
4int main()
5{
6 int adatok[] = {6, 12, 5, 26, 13, 2, 7, 8};
7
8 int darab = 0;
9 for (int adat : adatok){
10 darab = darab + 1;
11 }
12
13 cout << "Az adatok listaban " << darab << " szam talalhato";
14
15 return 0;
16}
1<?php
2 $adatok = [6, 12, 5, 26, 13, 2, 7, 8];
3
4 $darab = 0;
5
6 foreach($adatok as $adat){
7 $darab = $darab + 1;
8 }
9
10 echo "Az adatok listában " . $darab . " szám található";
11?>
Lista elemeinek megszámlálására a len() függvény is használható darab = len(adatok), ezért ennek az algoritmusnak például akkor van értelme, ha valamilyen feltételnek megfelelő listaelemeket szeretnénk megszámolni.
Feltételes megszámlálás
Számoljuk meg a listában szereplő páratlan számokat!
1adatok = [6, 12, 5, 26, 13, 2, 7, 8]
2
3darab = 0
4for adat in adatok:
5 if adat%2 == 1:
6 darab = darab + 1
7
8print("Az adatok listában", darab, "páratlan szám található")
1#include <iostream>
2using namespace std;
3
4int main()
5{
6 int adatok[] = {6, 12, 5, 26, 13, 2, 7, 8};
7
8 int darab = 0;
9 for (int adat : adatok){
10 if (adat%2==1){
11 darab = darab + 1;
12 }
13 }
14
15 cout << "Az adatok listaban " << darab << " paratlan szam talalhato";
16
17 return 0;
18}
1<?php
2 $adatok = [6, 12, 5, 26, 13, 2, 7, 8];
3
4 $darab = 0;
5
6 foreach($adatok as $adat){
7 if ($adat%2==1){
8 $darab = $darab + 1;
9 }
10 }
11
12 echo "Az adatok listában " . $darab . " páratlan szám található";
13?>
Összegzés
Adjuk össze a listában szereplő számokat!
1adatok = [6, 12, 5, 26, 13, 2, 7, 8]
2
3szumma = 0
4for szam in adatok:
5 szumma = szumma + szam
6
7print("Az adatok listában található számok összege:", szumma)
1#include <iostream>
2using namespace std;
3
4int main()
5{
6 int adatok[] = {6, 12, 5, 26, 13, 2, 7, 8};
7
8 int szumma = 0;
9 for (int szam : adatok){
10 szumma = szumma + szam;
11 }
12
13 cout << "Az adatok listaban talalhato szamok osszege: " << szumma;
14
15 return 0;
16}
1<?php
2 $adatok = [6, 12, 5, 26, 13, 2, 7, 8];
3
4 $szumma = 0;
5
6 foreach($adatok as $adat){
7 $szumma = $szumma + $adat;
8 }
9
10 echo "Az adatok listában található számok összege: " . $szumma . "<br>";
11?>
Feltételes összegzés
Adjuk össze a listában szereplő 3-mal osztható számokat!
1adatok = [6, 12, 5, 26, 13, 2, 7, 8]
2
3szumma = 0
4for szam in adatok:
5 if szam%3 == 0:
6 szumma = szumma + szam
7
8print("Az adatok listában található 3-mal osztható számok összege:", szumma)
1#include <iostream>
2using namespace std;
3
4int main()
5{
6 int adatok[] = {6, 12, 5, 26, 13, 2, 7, 8};
7
8 int szumma = 0;
9 for (int szam : adatok){
10 if (szam%3==0){
11 szumma = szumma + szam;
12 }
13 }
14
15 cout << "Az adatok listaban talalhato 3-aml oszthato szamok osszege: " << szumma;
16
17 return 0;
18}
1<?php
2 $adatok = [6, 12, 5, 26, 13, 2, 7, 8];
3
4 $szumma = 0;
5
6 foreach($adatok as $adat){
7 if ($adat%3==0){
8 $szumma = $szumma + $adat;
9 }
10 }
11
12 echo "Az adatok listaban talalhato 3-mal oszthato szamok osszege: " . $szumma . "<br>";
13?>
Eldöntés (True/False)
Az eldöntés algoritmus megnéz egy adatsort és ha abban talál megadott feltételnek megfelelő adatot, akkor az eredmény True, ha pedig nem talál, akkor az eredmény False lesz.
Kérdés: van-e a listában 3-ra végződő szám?
1adatok = [6, 12, 5, 26, 13, 2, 7, 8]
2
3valasz = False
4for adat in adatok:
5 if adat%10 == 3:
6 valasz = True
7 break
8
9print("Van-e 3-ra végződő szám?", valasz)
1#include <iostream>
2using namespace std;
3
4int main()
5{
6 int adatok[] = {6, 12, 5, 26, 13, 2, 7, 8};
7
8 bool valasz = false;
9 for (int adat : adatok){
10 if (adat%10 == 3){
11 valasz = true;
12 break;
13 }
14 }
15
16 cout << "Van-e 3-ra végződő szám? " << valasz;
17
18 return 0;
19}
1<?php
2 $adatok = [6, 12, 5, 26, 13, 2, 7, 8];
3
4 $valasz = false;
5 foreach($adatok as $adat){
6 if ($adat%10==3){
7 $valasz = true;
8 break;
9 }
10 }
11
12 echo "Van-e 3-ra végződő szám? " . $valasz . "<br>";
13?>
Ha for ciklusban megadott feltétel talál megfelelő elemet, akkor a válasz True és a break utasítással meg is állíthatjuk a további keresést. Ha nem talál, akkor viszont marad a kezdőértéknek megadott False válasz.
Kérdés: x prím-e?
1x = input("Add meg a számot!")
2x = int(x)
3
4valasz = True
5for i in range(2,x):
6 if x%i == 0:
7 valasz = False
8 break
9
10print("X prím?", valasz)
1#include <iostream>
2using namespace std;
3
4int main()
5{
6 int x;
7 cout << "Add meg a számot!";
8 cin >> x;
9
10 bool valasz = true;
11 for (int i=2;i<x;i++){
12 if (x%i == 0){
13 valasz = false;
14 break;
15 }
16 }
17
18 cout << "X prím? " << valasz;
19
20 return 0;
21}
1<?php // adatbevitel URL-ből például GET metódussal így: URL?x=8
2echo "Add meg az 'x' számot!<br>";
3
4if (isset($_GET["x"])){
5 $x=$_GET["x"];
6
7 $valasz = true;
8 for($i=2;$i<$x;$i++){
9 if ($x%$i == 0){
10 $valasz = false;
11 break;
12 }
13 }
14
15 echo "X prím? " . $valasz . "<br>";
16 }
17?>
2-től kezdve (x-1)-ig minden számmal elosztjuk az x-et és ha talál oszthatóságot, akkor megállunk. (megjegyzés: nagy számok esetén nem ez a legjobb módszer és gyök(x)-nél nagyobb számokkal oszthatóságot nem is kell vizsgálni.)
kiválasztás
Feltételezve, hogy egy adott adatsorban (pl. listában) megtalálható egy valamilyen feltételnek megfelelő elem, megmondjuk annak helyét/értékét.
Sokszor elegendő az első megfelelő elemet megtalálni és break utasítással befejezni a keresést.
Kérdés: Hol van a listában a 3-ra végződő szám?
1adatok = [6, 12, 5, 26, 13, 2, 7, 8]
2
3x = 0
4n = len(adatok)
5for i in range(n):
6 if adatok[i]%10 == 3:
7 x = i
8 break
9
10print("Az első 3-ra végződő szám sorszáma", x)
11
12 # Abból indulunk ki, hogy van találat, de ha nem lenne,
13 # akkor utolsó elemet írna ki a program,
14 # így helytelen eredményt írna ki.
15 # Megoldás: keresés algoritmus.
1#include <iostream>
2using namespace std;
3
4int main()
5{
6 int adatok[] = {6, 12, 5, 26, 13, 2, 7, 8};
7
8 int x = 0;
9 int n = sizeof(adatok) / sizeof(adatok[0]);
10 for (int i=0;i<n;i++){
11 if (adatok[i]%10 == 3){
12 x = i;
13 break
14 }
15 }
16
17 cout << "Az első 3-ra végződő szám sorszáma: " << x;
18
19 // Abból indulunk ki, hogy van találat, de ha nem lenne,
20 // akkor utolsó elemet írna ki a program,
21 // így helytelen eredményt írna ki.
22 // Megoldás: keresés algoritmus.
23
24 return 0;
25}
1<?php
2 $adatok = [6, 12, 5, 26, 13, 2, 7, 8];
3
4 $x=0;
5 foreach($adatok as $i => $adat){
6 if ($adat%10==3){
7 $x = $i;
8 break;
9 }
10 }
11
12 echo "Az első 3-ra végződő szám sorszáma: " . $x . ", értéke: " . $adat . "<br>";
13
14 // Abból indulunk ki, hogy van találat, de ha nem lenne,
15 // akkor utolsó elemet írna ki a program,
16 // így helytelen eredményt írna ki.
17 // Megoldás: keresés algoritmus.
18?>
Ugyanez a példa enumerate() függvénnyel
1adatok = [6, 12, 5, 26, 13, 2, 7, 8]
2
3for i, adat in enumerate(adatok):
4 if adat%10 == 3:
5 break
6
7print("Az első 3-ra végződő szám sorszáma", i, "értéke", adat)
8
9 # Abból indulunk ki, hogy van találat, de ha nem lenne,
10 # akkor utolsó elemet írná ki a program,
11 # így helytelen eredményt írna ki.
12 # Megoldás: keresés algoritmus.
1<?php
2 $adatok = [6, 12, 5, 26, 13, 2, 7, 8];
3
4 foreach($adatok as $i => $adat){
5 if ($adat%10==3){
6 break;
7 }
8 }
9
10 echo "Az első 3-ra végződő szám sorszáma: " . $i . ", értéke: " . $adat . "<br>";
11
12 // Abból indulunk ki, hogy van találat, de ha nem lenne,
13 // akkor utolsó elemet írna ki a program,
14 // így helytelen eredményt írna ki.
15 // Megoldás: keresés algoritmus.
16?>
keresés
Az eldöntés és a kiválasztás együtt, azaz eldöntjük, hogy van-e adott feltételnek megfelelő adatelem és ha van, akkor megmondjuk annak a helyét/értékét.
Kérdés: Van-e és ha igen, akkor hol van a listában a 3-ra végződő szám?
1adatok = [6, 12, 5, 26, 13, 2, 7, 8]
2
3x = -1
4n = len(adatok)
5for i in range(n):
6 if adatok[i]%10 == 3:
7 x = i
8 break
9
10if x >= 0:
11 print("Az első 3-ra végződő szám sorszáma", x, "értéke:", adatok[x])
12else:
13 print("Nincs háromra végződő szám a listában")
1#include <iostream>
2using namespace std;
3
4int main()
5{
6 int adatok[] = {6, 12, 5, 26, 13, 2, 7, 8};
7
8 int x = -1;
9 int n = sizeof(adatok) / sizeof(adatok[0]);
10 for (int i=0;i<n;i++){
11 if (adatok[i]%10 == 3){
12 x = i;
13 break
14 }
15 }
16
17 if (x >= 0){
18 cout << "Az első 3-ra végződő szám sorszáma: " << x << ", értéke: " << adatok[x];
19 }
20 else{
21 cout << "Nincs háromra végződő szám a listában";
22 }
23
24 return 0;
25}
1<?php
2 $adatok = [6, 12, 5, 26, 13, 2, 7, 8];
3
4 $x = -1;
5 $n = count($adatok);
6 for($i=0;$i<$n;$i++){
7 if ($adatok[$i]%10==3){
8 $x = $i;
9 break;
10 }
11 }
12
13 if ($x>=0){
14 echo "Az első 3-ra végződő szám sorszáma " . $x . ", értéke:" . $adatok[$x] . "<br>";
15 }
16 else{
17 echo "Nincs háromra végződő szám a listában<br>";
18 }
19?>
Ugyanez a példa enumerate() függvénnyel
1adatok = [6, 12, 5, 26, 13, 2, 7, 8]
2
3x = -1
4for i, adat in enumerate(adatok):
5 if adat%10 == 3:
6 x = i
7 break
8
9if x >= 0:
10 print("Az első 3-ra végződő szám sorszáma", x, "értéke:", adatok[x])
11else:
12 print("Nincs háromra végződő szám a listában")
1<?php
2 $adatok = [6, 12, 5, 26, 13, 2, 7, 8];
3
4 $x = -1;
5 foreach($adatok as $i => $adat){
6 if ($adat%10==3){
7 $x = $i;
8 break;
9 }
10 }
11
12 if ($x>=0){
13 echo "Az első 3-ra végződő szám sorszáma " . $x . ", értéke: " . $adatok[$x] . "<br>";
14 }
15 else{
16 echo "Nincs háromra végződő szám a listában<br>";
17 }
18?>
Kezdőérték: x=-1 A lista elemeit 0-tól kezdve sorszámozzuk, így nem találat esetén a megmaradt negatív kezdőérték fogja jelenteni, hogy nem szerepel a listában a keresett feltétel szerinti érték.
maximum-kiválasztás, minimum kiválasztás
1adatok = [6, 12, 5, 26, 13, 2, 7, 8]
2
3legnagyobb_ertek = adatok[0]
4legnagyobb_hely = 0
5legkisebb_ertek = adatok[0]
6legkisebb_hely = 0
7
8i=0
9for adat in adatok:
10 if legnagyobb_ertek < adat:
11 legnagyobb_ertek = adat
12 legnagyobb_hely = i
13 if legkisebb_ertek > adat:
14 legkisebb_ertek = adat
15 legkisebb_hely = i
16 i = i+1
17
18print("Az adatok listában a legnagyobb szám:", legnagyobb_ertek, ", a sorszáma:", legnagyobb_hely)
19print("Az adatok listában a legkisebb szám:", legkisebb_ertek, ", a sorszáma:", legkisebb_hely)
1#include <iostream>
2using namespace std;
3
4int main()
5{
6 int adatok[] = {6, 12, 5, 26, 13, 2, 7, 8};
7
8 int legnagyobb_ertek = adatok[0];
9 int legnagyobb_hely = 0;
10 int legkisebb_ertek = adatok[0];
11 int legkisebb_hely = 0;
12
13 int i = 0;
14 for (int adat : adatok){
15 if (legnagyobb_ertek < adat){
16 legnagyobb_ertek = adat;
17 legnagyobb_hely = i;
18 }
19 if (legkisebb_ertek > adat){
20 legkisebb_ertek = adat;
21 legkisebb_hely = i;
22 }
23 i = i+1;
24 }
25
26 cout << "Az adatok listában a legnagyobb szám: " << legnagyobb_ertek << ", a sorszáma: " << legnagyobb_hely << endl;
27 cout << "Az adatok listában a legkisebb szám: " << legkisebb_ertek << ", a sorszáma: " << legkisebb_hely << endl;
28
29 return 0;
30}
1<?php
2 $adatok = [6, 12, 5, 26, 13, 2, 7, 8];
3
4 $legnagyobb_ertek = $adatok[0];
5 $legnagyobb_hely = 0;
6 $legkisebb_ertek = $adatok[0];
7 $legkisebb_hely = 0;
8
9 $i = 0;
10 foreach($adatok as $adat){
11 if ($legnagyobb_ertek < $adat){
12 $legnagyobb_ertek = $adat;
13 $legnagyobb_hely = $i;
14 }
15 if ($legkisebb_ertek > $adat){
16 $legkisebb_ertek = $adat;
17 $legkisebb_hely = $i;
18 }
19 $i++;
20 }
21
22 echo "Az adatok listában a legnagyobb szám: " . $legnagyobb_ertek . ", a sorszáma: " . $legnagyobb_hely;
23 echo "Az adatok listában a legkisebb szám: " . $legkisebb_ertek . ", a sorszáma: " . $legkisebb_hely;
24?>
Legkisebb, legnagyobb kezdőértéknek érdemes a lista első elemét megadni, mert például, ha mindkettőnek 0-át adnánk, akkor a legkisebb értéke ebben az esetben mindvégig 0 maradna és hibás eredményhez vezetne.
Az i = i + 1 sor mindenképpen a ciklusmag utolsó sora legyen, ellenkező esetben elcsúszik az elemek sorszámozása!
Az alábbi táblázat mutatja, hogy az i-edik ismétlődésben éppen hogy állnak az értékek
| ciklus sorszáma | lista eleme | legkisebb_ertek | legkisebb_hely | legnagyobb_ertek | legkisebb_hely |
|---|---|---|---|---|---|
| 0 | 6 | 6 | 0 | 6 | 0 |
| 1 | 12 | 6 | 0 | 12 | 1 |
| 2 | 5 | 5 | 2 | 12 | 1 |
| 3 | 26 | 5 | 2 | 26 | 3 |
| 4 | 13 | 5 | 2 | 26 | 3 |
| 5 | 2 | 2 | 5 | 26 | 3 |
| 6 | 7 | 2 | 5 | 26 | 3 |
| 7 | 8 | 2 | 5 | 26 | 3 |
Ugyanez a példa enumerate() függvénnyel
1adatok = [6, 12, 5, 26, 13, 2, 7, 8]
2
3legnagyobb_ertek = adatok[0]
4legnagyobb_hely = 0
5legkisebb_ertek = adatok[0]
6legkisebb_hely = 0
7
8for i, adat in enumerate(adatok):
9 if legnagyobb_ertek < adat:
10 legnagyobb_ertek = adat
11 legnagyobb_hely = i
12 if legkisebb_ertek > adat:
13 legkisebb_ertek = adat
14 legkisebb_hely = i
15
16print("Az adatok listában a legnagyobb szám:", legnagyobb_ertek, ", a sorszáma:", legnagyobb_hely)
17print("Az adatok listában a legkisebb szám:", legkisebb_ertek, ", a sorszáma:", legkisebb_hely)
1<?php
2 $adatok = [6, 12, 5, 26, 13, 2, 7, 8];
3
4 $legnagyobb_ertek = $adatok[0];
5 $legnagyobb_hely = 0;
6 $legkisebb_ertek = $adatok[0];
7 $legkisebb_hely = 0;
8
9 foreach($adatok as $i => $adat){
10 if ($legnagyobb_ertek < $adat){
11 $legnagyobb_ertek = $adat;
12 $legnagyobb_hely = $i;
13 }
14 if ($legkisebb_ertek > $adat){
15 $legkisebb_ertek = $adat;
16 $legkisebb_hely = $i;
17 }
18 }
19
20 echo "Az adatok listában a legnagyobb szám: " . $legnagyobb_ertek . ", a sorszáma: " . $legnagyobb_hely;
21 echo "Az adatok listában a legkisebb szám: " . $legkisebb_ertek . ", a sorszáma: " . $legkisebb_hely;
22?>