[itk] Számítástechnika kezdőknek

C++ programozás kezdőknek - continue és break utasítás

[2021. október 22.] [ christo161 ]

Ebben a tananyagrészben arról lesz szó, hogy egy ciklusban hogyan tudjuk a ciklus egy adott lépését kihagyni,vagy egy adott feltétel teljesülése esetén hogy tudunk a ciklusból kilépni.

Előző tananyagrész: do-while ciklus, input ellenőrzés
Következő tananyagrész: kétdimenziós tömbök

continue utasítás

Ha azt szeretnénk, hogy egy általunk megadott feltétel teljesülése esetén a ciklusmag hátralévő utasításait hagyja ki a ciklus annál a lépésnél, ahol éppen tart (de utána folytatódjon tovább a következő lépéssel), akkor a continue; utasítást használhatjuk.
Ez például akkor lehet hasznos, ha például egy tömb elemeinek feldolgozásánál bizonyos típusú elemeket, vagy akár egy bizonyos elemet ki szeretnénk hagyni.

Szemléltető példa:

for (int i = 0; i < arr_size; ++i ) {
  //statements
  if ( /* condition */ ) {
    continue;
  }
  //statements executed if the condition is false
}

Ebben az esetben nem kell a feltételtől függő utasításokat else ágba foglalni, hiszen a continue utasítás rögtön a ciklus következő lépéséhez ugrik, anélkül, hogy a ciklus blokkjában lévő hátralévő utasítások végrehajtódnának.

Utasítások végrehajtása, vagy nem végrehajtása mindig a ciklus egy adott lépésében értendő. Például lehetséges, hogy a feltétel igaz a ciklus harmadik lépésében (mondjuk amikor i értéke 2), így a ciklusmagban hátralévő utasítások nem hajtódnak végre a ciklus harmadik lépésében. Viszont mondjuk a ciklus negyedik lépésében a feltétel hamis, így ekkor a ciklusmag hátralévő utasításai végrehajtódnak.

1. continue példa: egy bizonyos elem kihagyása (index alapján)

Ha ki szeretnénk hagyni egy tömb egyik elemét, például mondjuk egy tömb tizenharmadik elemet, akkor a feltétel: i == 12.

for (int i = 0; i < arr_size; i++) {
  if (i == 12) {
    continue;
  }
  //statements executed if i != 12
}

2. continue példa: nem 0 értékű számok összeszorzása

Ez a rövidke példaprogram összeszorozza egy adott tömbben található nem 0 értékű számokat. Ha a for ciklusban egy 0 értékű szám a soron következő elem, akkor a ciklus azon lépésében nem lesz elvégezve a szorzás művelet. Mivel a tizedestörtek között -0.0 is előfordulhat, így a teljesség kedvéért ez is szerepel a feltételben.
Ügyeljünk arra, hogy az eredmény változó kezdőértéke 1 és ne 0 legyen.
Ebben a példában az egyszerűség kedvéért nem a felhasználótól kérjük be a tömb elemeit, de természetesen azt is megtehetnénk.

#include <iostream>

int main () {
  float numbers[] = {2, 0, 2.4, 3.6, 0, 9, 2, -2.3, 0, 1};
  const int arr_size = sizeof(numbers)/sizeof(numbers[0]);
  
  float result = 1.0;

  for (int i = 0; i < arr_size; i++) {
    if (numbers[i] == 0 || numbers[i] == -0.0 ) {
      continue;
    }
    result *= numbers[i];
  }
  std::cout << "Product of elements with not 0 value: " << result << '\n';
}

break utasítás

Ha pedig azt szeretnénk, hogy a ciklus egy bizonyos feltétel teljesülése esetén ne folytatódjon tovább (tehát ne hajtódjanak végre a ciklus jelenlegi lépésében hátralévő (a break utasítást követő) utasítások, és a ciklus következő lépései sem), akkor a break utasítást használhatjuk.

Általában megvetendőnek tartják, ha a ciklusból való kilépést a break utasítással érjük el. Ezzel kapcsolatban 3 dolgot érdemes tudni:

  • ciklusok esetén a break használata kiváltható azzal, ha módosítjuk a ciklus feltételét
  • ranged for ciklusból elfogadottnak tartják a break utasítással való kilépést
  • ha függvényeket használunk, akkor a return utasítás kiváltja a break utasítást

1. break példa: nagyon egyszerű keresés

A példában definiálunk egy 1000 elemű tömböt, amit feltöltünk véletlenszerűen generált egész számokkal (1 és 100 között), és megkeressük benne a felhasználó által megadott szám első előfordulásának helyét. Ha van ilyen érték, akkor kiíratjuk a tömb adott elemének indexénél egyel nagyobb számot, ha nincs, akkor pedig egy erre vonatkozó üzenetet.
Ha a felhasználó nem 1 és 100 közötti számot ad meg, a program (az egyszerűség kevéért) leáll. Később arra is nézünk példát, hogyan oldhatjuk meg, hogy újra meg újra bekérjük az értéket, egészen addig, amíg a felhasználó nem 1 és 100 közötti értéket ad meg (vagy a program bezárásra nem kerül).

Véletlenszerű számok generálásához például a standard library cstdlib header fájljában található rand() függvényt használhatjuk. Ebben a tananyagban az emögött álló matematikai háttér ismertetésébe nem megyünk bele, hanem csak néhány példát nézünk át, melyek alapján intuícióval kikövetkeztethető ezen utasítás működése:
int b;
b = rand() % 100; //b értéke egy 0 és 99 közötti egész szám lesz
b = rand() % 100 + 1; //b értéke egy 1 és 100 közötti egész szám lesz
b = rand() % 31 + 1987; //b értéke egy 1987 és 2017 közötti egész szám lesz

A break utasítást ebben a példában arra használjuk, hogyha a keresett számot a program megtalálta, akkor a ciklusnak már fölösleges tovább futnia (legalábbis e példa szerint). Persze akár az összes előfordulását is kiírathatnánk a keresett számnak (annak megvalósításához nem lenne szükség break utasításra).

#include <iostream>
#include <random>

int main() {

  std::random_device rnd_device;
  std::mt19937 rnd_generator(rnd_device());
  std::uniform_int_distribution<int> int_dist(1,100);

  const int arr_size = 1000;
  int random_numbers[arr_size];

  for (int& element : random_numbers) {
    element = int_dist(rnd_generator);
  }

  std::cout << "Please enter a number between 1 and 100" << '\n';
  int find_number;
  std::cin >> find_number;

  if (find_number > 100 || find_number < 1) {
  std::cout << "Error: input number is not between 1 and 100" << '\n';
    return 0;
  }

  bool found = false;
  for (int i = 0; i < arr_size; ++i) {
    if (random_numbers[i] == find_number) {
      found = true;
      std::cout << "Index of searched number: " << i+1 << '\n';
      break;
    }
  }
  if (!found) {
    std::cout << "The input number is not in the array"  << '\n';
  }
}

2. break példa: ciklus befejezése egy adott elemnél

Természetesen a break utasítás esetén is megtehetjük, hogy a feltételben egy konkrét tömbindexet adunk meg, hasonlóan, mint a continue utasítás esetén.
Ebben a nagyon egyszerű példában ha a felhasználó egy 1 és 10 közötti számot ad meg, akkor a program 1-től írja ki az egész számokat a felhasználó által megadott számmal bezárólag, egyébként pedig 1-től tízig.

//end loop at a specified element
#include <iostream>

int main() {
  std::cout << "Please enter a number between 1 and 10" << '\n';
  int input_number;
  std::cin >> input_number;

  if (input_number < 1 || input_number > 10) {
    std::cout << "The input number is not between 1 and 10\n";
    return 0;
  }

  for (int i=0; i < 10; i++ ) {
    if ( i == input_number) {
      break; 
    }
    std::cout << i+1 << '\n';
  }
}

Ehelyett a megoldás helyett a break utasítás elágazásában lévő feltételt érdemes inkább összefűzni a for ciklus feltételével, ennél a példánál i < 10 && i != input_number.

A continue és break utasítások nem csak for cikluson belül használhatóak.

Előző tananyagrész: do-while ciklus, input ellenőrzés
Következő tananyagrész: kétdimenziós tömbök

A bejegyzés trackback címe:

https://itkezdoknek.blog.hu/api/trackback/id/tr2716731668

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása