Python - while True:

Végtelen ismétléses vezérlés (while ciklus)

A while ciklust elsősorban akkor használjuk, amikor előre nem tudható, hogy hány ismétlődést szeretnénk végrehajtani. A while ciklus előnye a for ciklussal szemben az, hogy nem kell előre megadni az ismétlődések számát, hanem az menet közben derülhet ki.

A végtelen ismétléses vezérlést valamilyen feltétellel if ... :a breakutasítással állítjuk meg.

Egyszerű számolás

1. példa: A program beolvas akármennyi (érdemjegyet) 1 és 5 közötti egész számot, majd kiszámolja azok átlagát:
Mivel előre nem tudjuk, hogy a felhasználó hány darab jegyet szeretne megadni, ezért a jegyeket egy előre megadott üres listába töltjük és a jegyek feltöltését egy előre meghatározott kulcsszóval állítjuk le. Legyen ez a kulcsszó: vege

         
1print("Átlagszámoló: Add meg a jegyeket!")
2print("Befejezéshez írd be a stop szót!")
3
4print("1. rész: beolvasás")
5
6jegyek = []
7
8while True:
9	jegy = input("Add meg a jegyet!")
10	if jegy=="stop":
11		break
12	jegy = int(jegy)
13	jegyek.append(jegy)
14
15print("2. rész:")
16
17darab = 0
18szumma = 0
19
20for jegy in jegyek:
21	darab = darab + 1
22	szumma = szumma + jegy
23
24print("A jegyek száma:", darab)
25print("A jegyek összege:", szumma)
26if darab > 0:
27    print("A jegyek átlaga:", szumma/darab)
1#include <iostream>
2#include <vector> // dinamikusan feltölthető tömb
3#include <string>
4using namespace std;
5
6int main() {
7	cout << "Átlagszámoló: Add meg a jegyeket!" << endl;
8	cout << "Befejezéshez írd be a stop szót!" << endl;
9
10	cout << "1. rész: beolvasás" << endl;
11
12	vector<int> jegyek;
13
14	while (true) {
15		string beolvas;
16		cout << "Add meg a jegyet: ";
17		cin >> beolvas;
18        if (beolvas == "stop") {
19			break;
20			}
21        int jegy = stoi(beolvas); // string -> int
22        jegyek.push_back(jegy);
23		}
24
25	cout << "2. rész:" << endl;
26
27	int darab = 0;
28	int szumma = 0;
29
30	for (int jegy : jegyek) {
31		darab = darab + 1;
32		szumma = szumma + jegy;
33		}
34
35    cout << "A jegyek száma: " << darab << endl;
36    cout << "A jegyek összege: " << szumma << endl;
37    if (darab > 0) {
38		cout << "A jegyek átlaga: " << static_cast<double>(szumma)/darab << endl;
39		}
40
41    return 0;
42}
1<?php // adatbevitel URL-ből például GET metódussal így: URL?jegyek=5, 4, 5, 5, 3, 4
2print("Átlagszámoló: Add meg a jegyeket!<br>");
3 // A PHP szerveroldali nyelv,
4 // ezért egyszerre küldjük el a vesszővel elválasztott jegyeket
5 // és a szerveren bontjuk szét tömbre
6
7if (!empty($_GET["jegyek"])){
8	echo "1. rész: beolvasás<br>";
9	$jegyek = explode(",",$_GET["jegyek"]); // tömbbé alakítás
10	$jegyek = array_map('trim', $jegyek); // szóközök eltávolítása
11	$jegyek = array_map('intval', $jegyek); // egész számmá alakítás
12
13	echo "2. rész:<br>";
14	$darab = 0;
15	$szumma = 0;
16	foreach($jegyek as $jegy){
17		$darab = $darab + 1;
18		$szumma = $szumma + $jegy;
19		}
20
21	echo "A jegyek száma:" . $darab . "<br>";
22	echo "A jegyek összege:" . $szumma . "<br>";
23	if ($darab>0){
24		echo "A jegyek átlaga:" . $szumma/$darab . "<br>";
25		}
26	}
27?>

Ebben a példában a while ciklus addig ismétli a beolvasást, amíg a "vege" szóval le nem állítjuk a beolvasást. A leállításról az if ... és a break sorok gondoskodnak. Az int() függvény egész számmá alakítja a beolvasott értéket, a jegyek.append() függvény pedig betölti a jegyet a jegyek listába.

A program második részében a jegyek listán egy for ciklussal megyünk végig és elvégezzük a jegyek összegzését, valamint megszámlálását, végül kiírjuk az eredményeket.

2. példa: Az előbbi feladat egyetlen while ciklusban lista nélkül elkészítve.

         
1print("Átlagszámoló: Add meg a jegyeket!")
2print("Befejezéshez írd be a stop szót!")
3
4darab = 0
5szumma = 0
6
7while True:
8	jegy = input("Add meg a jegyet!")
9	if jegy=="stop":
10		break
11	jegy = int(jegy)
12	darab = darab + 1
13	szumma = szumma + jegy
14
15print("A jegyek száma:", darab)
16print("A jegyek összege:", szumma)
17if darab > 0:
18    print("A jegyek átlaga:", szumma/darab)
1#include <iostream>
2#include <string>
3using namespace std;
4
5int main() {
6	cout << "Átlagszámoló: Add meg a jegyeket!" << endl;
7	cout << "Befejezéshez írd be a stop szót!" << endl;
8
9	int darab = 0;
10	int szumma = 0;
11
12	while (true) {
13		string beolvas;
14		cout << "Add meg a jegyet: ";
15		cin >> beolvas;
16        if (beolvas == "stop") {
17			break;
18			}
19        int jegy = stoi(beolvas); // string -> int
20		darab = darab + 1;
21		szumma = szumma + jegy;
22		}
23
24
25    cout << "A jegyek száma: " << darab << endl;
26    cout << "A jegyek összege: " << szumma << endl;
27    if (darab > 0) {
28		cout << "A jegyek átlaga: " << static_cast<double>(szumma)/darab << endl;
29		}
30
31    return 0;
32}
1<?php // adatbevitel URL-ből például GET metódussal így: URL?jegyek=5, 4, 5, 5, 3, 4
2print("Átlagszámoló: Add meg a jegyeket!<br>");
3 // A PHP szerveroldali nyelv,
4 // ezért egyszerre küldjük el a vesszővel elválasztott jegyeket
5 // és a szerveren bontjuk szét tömbre
6
7if (!empty($_GET["jegyek"])){
8	$jegyek = explode(",",$_GET["jegyek"]);
9	$jegyek = array_map('trim', $jegyek); // szóközök eltávolítása
10	$jegyek = array_map('intval', $jegyek); // egész számmá alakítás
11
12	$darab = 0;
13	$szumma = 0;
14	foreach($jegyek as $jegy){
15		$jegy = $jegy*1;
16		$darab = $darab + 1;
17		$szumma = $szumma + $jegy;
18		}
19	echo "A jegyek száma:" . $darab . "<br>";
20	echo "A jegyek összege:" . $szumma . "<br>";
21	if ($darab>0){
22		echo "A jegyek átlaga:" . $szumma/$darab . "<br>";
23		}
24	}
25?>

Ebben a példában a while ciklusban történik a jegyek összegzése és a megszámlálása is.

 

A 2. példa előnye, hogy nincs szükség lista készítésére és két ciklus alkalmazására.

Az 1. példa előnye, hogy bonyolultabb, vagy több részből álló feladat esetén a beolvasás közben létrehozott jegyek elnevezésű listát a későbbiekben fel tudjuk használni további részfeladatok megoldásához a for ciklus mintájára.

3. példa: Generáljunk 5 különböző 1 és 10 közötti számot és tegyük be egy listába!
Mivel előfordulhat, hogy többször is ugyanazt a számot generáljuk, nem tudhatjuk előre hány generálásból kapounk meg 5 különböző számot.

         
1import random
2kisorsolt = []
3
4while True:
5	x = random.randint(1,10)
6	if x not in kisorsolt:
7		kisorsolt.append(x)
8	if len(kisorsolt)>=5:
9		break
10
11print("Kisorsolt, különböző számok:", kisorsolt)
1#include <iostream>
2#include <vector> // dinamikusan feltölthető tömb
3#include <cstdlib> // rand, srand miatt
4#include <ctime> // random: time nullptr miatt
5using namespace std;
6
7int main() {
8    srand(time(nullptr)); // random inicializálás
9	vector<int> kisorsolt;
10
11	while (true) {
12		int x = rand() % 10 + 1; // 1-10 zárt intervallum
13		bool bennevan= false;
14		for (int y : kisorsolt) {
15			if (x == y) {
16				bennevan=true;
17				break;
18				}
19			}
20		if (bennevan==false){
21			kisorsolt.push_back(x);
22			}
23		if (kisorsolt.size()>=5){
24			break;
25			}
26		}
27
28	cout << "Kisorsolt, különböző számok:";
29    for (int szam : kisorsolt)
30        cout << szam << " ";
31    cout << endl;
32
33    return 0;
34}
1<?php
2
3$kisorsolt = [];
4
5while (true) {
6    $x = random_int(1, 10);
7    if (!in_array($x, $kisorsolt)) {
8        $kisorsolt[] = $x;
9		}
10	if (count($kisorsolt) >= 5){
11		break;
12		}
13	}
14
15print_r($kisorsolt);
16?>
Megjegyzések

A break utasítás a for ciklust is meg tudja szakítani

A continue utasítás szintén használható a for és a while ciklusokhoz, de ez nem állítja meg az ismétlődést, hanem csak egy-egy ciklusról ugrik át a következőre anélkül, hogy a további alárendelt utasításokat végrehajtaná.