Instrukcja break w C++. Przerywanie pętli w języku C++

Wprowadzenie

Jeśli wydawało Ci się, że wiesz już zupełnie wszystko o pętlach, to muszę Cię zmartwić: wszystkiego jeszcze nie wiesz. Znasz natomiast już wszystkie typy pętli w języku C++.

W tej i w przyszłej lekcji przedstawię Ci dodatkowe instrukcje związane z pętlami i ich obsługą. Wtedy będziesz wiedzieć już wszystko na temat pętli i więcej o pętlach wspominać już w kursie nie będę - Ty już po prostu będziesz wiedzieć absolutnie wszystko.

Instrukcja break - podstawy

Tym razem przejdę od razu do rzeczy i krótko i rzeczowo wyjaśnię do czego służy instrukcja break.

Instrukcja break pozwoli nam przerwać działanie jednej z pętli: for, while, do while oraz instrukcji switch. O ile o pętlach wiesz już prawie wszystko, o tyle instrukcja switch pozostaje dla Ciebie zagadką - ale już niedługo - wkrótce dowiesz się do czego ona służy.

Najprostszy sposób użycia instrukcji break przedstawia poniższy przykład: staramy się obliczyć sumę elementów tablicy do pierwszego napotkanego elementu ujemnego.

#include <iostream>

using namespace std;

int main()
{
  const unsigned int ile=6; // rozmiar tablicy
  float tab[ile]={3.45, 5, 2.78, -2, 4, 2.22};
  unsigned int i; // zmienna sterujaca
  float suma=0;
 
  for (i=0;i<ile;++i)
  {
     if (tab[i]<0)
       break;
     suma+=tab[i];
  }
 
  cout <<"Suma liczb wynosi "<<suma<<endl;
  cout <<"Zakonczono na indeksie i="<<i;
 
  cout <<endl<<endl<<"Nacisnij ENTER aby zakonczyc..."<<endl;
  getchar();
  return 0;  
}
program nr 17.1

Jak już wspomniałem, program oblicza sumę liczb tablicy aż do momentu gdy dany element tablicy jest ujemny. Jest to realizowane w pętli for. Przed próbą dodania sprawdzane jest, czy element jest ujemny.

Jeśli element jest ujemny, to zostanie wywołana instrukcja break, która powoduje zakończenie pętli for - w tym przypadku oznacza to przejście do instrukcji wypisania sumy, znajdującej się tuż za pętlą. Jeśli natomiast warunek nie jest spełniony, do sumy zostanie dodana wartość bieżącego elementu tablicy.

Zauważ, że warunek sprawdzania jest zapisany tak, że nie używamy słowa else, aby wykonać zwiększenie sumy - nie jest ono w tym przypadku w ogóle potrzebne, chociaż jego zapisanie nie będzie żadnym błędem.

Na dodatek zwróć uwagę, że po zakończeniu pętli, możemy w dość łatwy sposób określić czy instrukcja break została wykonana czy nie. Musimy jednak w tym celu zadeklarować zmienną sterującą pętlą przed pętlą, a nie w części warunków początkowych (tutaj tak właśnie postąpiliśmy).

Sprawdzając wartość zmiennej sterującej pętlą, można ją w bardzo sprytny sposób wykorzystać do wielu różnych celów, sprawiając, że dzięki temu program wykona się szybciej.

Przykład zastosowania

Przykładem niech będzie program sprawdzający, czy liczba jest liczbą pierwszą czy nie. Jeśli liczba jest liczbą pierwszą, to znaczy, że dzieli się tylko przez samą siebie i przez jeden i po zakończeniu pętli zmienna sterująca powinna mieć wartość równą wartości liczby, którą sprawdzamy.

Natomiast, jeśli liczba dzieli się także przez inne liczby, to używając instrukcji break sprawimy, że zmienna sterująca po zakończeniu pętli będzie miała wartość mniejszą i stąd będziemy wiedzieć, że sprawdzana jest liczbą złożoną.

Oto prosty program, który korzystając z instrukcji break ułatwia stwierdzenie, czy dana liczba jest liczbą pierwszą czy złożoną.

#include <iostream>

using namespace std;

int main()
{
  unsigned long int liczba;
  unsigned int i; // zmienna sterujaca
 
  cout <<"Podaj liczbe calkowita wieksza od jednego: ";
  cin >>liczba;
  cin.ignore();
  for (i=2;i<liczba;++i)
  if ((liczba%i)==0)
     break;
 
  cout <<"Liczba "<<liczba<<" jest liczba ";
  if (i==liczba)
     cout <<"pierwsza.";
  else
     cout <<"zlozona.";
 
 
  cout <<endl<<endl<<"Nacisnij ENTER aby zakonczyc..."<<endl;
  getchar();
  return 0;  
}
program nr 17.2

Zagnieżdżone pętle a instrukcja break

Instrukcja break pozwala jedynie na przerwanie pętli w której się znajduje! - jest to bardzo ważne stwierdzenie i trzeba o nim zawsze pamiętać. Tak naprawdę jest to duża wada instrukcji break.

Jeśli stosujemy zagnieżdżone pętle i użyjemy instrukcji break w pętli najbardziej wewnętrznej, to zostanie przerwana jedynie najbardziej wewnętrzna pętla, pozostałe pętle będą się wykonywać - co może również oznaczać powtórzenie pętli, którą właśnie przerwaliśmy. Oto bardzo prosty przykład obrazujący taką sytuację:

#include <iostream>

using namespace std;

int main()
{
  unsigned int i, j; // zmienne sterujace
  for (i=0;i<3;++i)
  {
     cout <<endl<<"zewnetrzna dla i="<<i<<endl;
     for (j=0;j<2;++j)
     {
        if (i==1 && j==1)
           break;
        cout <<"wewnetrzna dla j="<<j<<endl;
     }
  }
 
  cout <<endl<<"Nacisnij ENTER aby zakonczyc..."<<endl;
  getchar();
  return 0;  
}
program nr 17.3

Postaraj się bardzo dokładnie prześledzić działanie powyższego programu, aby zrozumieć wypisywane komunikaty na ekran. Jeśli sprawdzisz działanie powyższego kodu, zauważysz, że mimo że instrukcja break została wykonana, zewnętrzna pętla kontynuowała swoje działanie.

Czasami może chodzić nam właśnie o takie zachowanie, czasami jednak chcielibyśmy, aby instrukcja break wywołana w zagnieżdżonej pętli powodowała zakończenie nawet tej najbardziej zewnętrznej pętli. Takie zadanie możemy zrealizować następująco:

#include <iostream>

using namespace std;

int main()
{
  unsigned int i, j; // zmienne sterujace
  unsigned int end=0;
  for (i=0;i<3;++i)
  {
     cout <<endl<<"zewnetrzna dla i="<<i<<endl;
     for (j=0;j<2;++j)
     {
        if (i==1 && j==1)
        {
           end=1;
           break;            
        }
        cout <<"wewnetrzna dla j="<<j<<endl;
     }
     if (end) // - to samo co if (end!=0)
        break;
  }
 
  cout <<endl<<"Nacisnij ENTER aby zakonczyc..."<<endl;
  getchar();
  return 0;  
}
program nr 17.4

Jak widzisz, aby udało się zrealizować wychodzenie za pomocą jednej instrukcji break z zagnieżdżonych pętli, można wprowadzić dodatkową zmienną i tuż przed wywołaniem instrukcji break w pętli wewnętrznej zmienić wartość tej zmiennej. Następnie w "nadrzędnej" pętli musimy sprawdzać wartość tej zmiennej.

Jest to pewien sposób, chociaż nie jest on tak naprawdę dobry w przypadku dużej liczby zagnieżdżonych pętli, bowiem wówczas należałoby wprowadzić większą liczbę zmiennych pomocniczych i większą liczbę dodatkowych warunków.

Jednak w takim przypadku jak tutaj - czyli gdy mamy dwie zagnieżdżone pętle, warto wiedzieć, jak sobie poradzić. Czasami nie jest łatwo wpaść na takie rozwiązania, więc warto nawet sobie zapisać, jak wykonać wyjście z zagnieżdżonych pętli z użyciem instrukcji break.

Przykład "sprytnego" wykorzystania instrukcji break

W przypadku tablic często się zdarza, że chcemy sprawdzić, czy dany element znajduje się już w tablicy i o ile się znajduje, chcielibyśmy znać jego pozycję. Nie interesuje nas przy tym ile razy ten element się znajduje w tej tablicy, tylko czy w ogóle tam jest.

Takie zadanie realizuje poniższy program:

#include <iostream>

using namespace std;

int main()
{
  const unsigned int ile=8;
  int tab[ile]={5,4,8,2,0,5,-3,6};
  unsigned int i; // zmienna sterujaca
  int elem; // szukany element
 
  cout <<"Podaj wartosc szukanego elementu: ";
  cin >>elem;
  cin.ignore();
 
  for (i=0; i<ile; ++i)
     if (tab[i]==elem)
        break;
 
  if (i!=ile)
     cout <<"Element jest w tablicy i znajduje sie na pozycji "<<i<<endl;
  else
     cout <<"Elementu nie ma w tablicy"<<endl;
 
  cout <<endl<<"Nacisnij ENTER aby zakonczyc..."<<endl;
  getchar();
  return 0;  
}
program nr 17.5

W powyższym programie została wykorzystana cecha pętli for i instrukcja break (ukazana również w przypadku przykładu ze stwierdzeniem czy liczba jest pierwsza czy złożona).

Jeśli element w tablicy się nie znajduje, to zmienna sterująca pętlą będzie miała wartość ile - i to właśnie sprawdzamy po zakończeniu pętli.

Jeśli natomiast element znajduje się w tablicy, pętla jest przerywana i dzięki temu jest zapamiętywany indeks w tablicy, gdzie się ten element znajduje.

Przy takim zastosowaniu zaoszczędziliśmy jedną zmienną, w której powinniśmy pamiętać czy element jest w tablicy czy nie. U nas taką rolę spełnia indeks elementu - zawiera on niejako informację, czy element znajduje się w tablicy oraz dodatkowo ewentualny indeks tego elementu.

Jeśli zależałoby nam na znalezieniu indeksu ostatniego z powtarzających się elementów w tablicy, powinniśmy przeszukiwać tablicę od końca.

Podsumowanie

Instrukcja break na pewno nie jest wykorzystywana w każdym programie, jednak naprawdę warto ją znać, bowiem jak Ci starałem się udowodnić, dzięki jej znajomości, można uzyskać bardzo ciekawe informacje dotyczące liczb czy tablic.

powrót