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ámalista elemelegkisebb_erteklegkisebb_helylegnagyobb_erteklegkisebb_hely
066060
11260121
2552121
32652263
41352263
5225263
6725263
7825263
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?>