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á.