{"id":1135,"date":"2021-05-17T20:02:00","date_gmt":"2021-05-17T18:02:00","guid":{"rendered":"https:\/\/trzykody.pl\/?page_id=1135"},"modified":"2026-02-20T22:16:26","modified_gmt":"2026-02-20T21:16:26","slug":"petle","status":"publish","type":"page","link":"https:\/\/trzykody.pl\/index.php\/c-2\/petle\/","title":{"rendered":"P\u0119tle"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><strong>P\u0119tle s\u0105 jednym z podstawowych mechanizm\u00f3w sterowania przep\u0142ywem programu. Umo\u017cliwiaj\u0105 wielokrotne wykonywanie tego samego fragmentu kodu przy spe\u0142nieniu okre\u015blonego warunku lub dla ustalonego zakresu warto\u015bci. Bez nich praktycznie nie da si\u0119 pisa\u0107 program\u00f3w operuj\u0105cych na tablicach, danych wej\u015bciowych, plikach czy strukturach dynamicznych. W praktyce wi\u0119kszo\u015b\u0107 realnych algorytm\u00f3w opiera si\u0119 na iteracji. W j\u0119zyku C++ mechanizmy iteracyjne s\u0105 rozbudowane i obejmuj\u0105 kilka konstrukcji sk\u0142adniowych, kt\u00f3re r\u00f3\u017cni\u0105 si\u0119 semantyk\u0105 i zastosowaniem. W\u0142a\u015bnie temu zagadnieniu po\u015bwi\u0119cone s\u0105 P\u0119tle C++.<\/strong><\/p>\n\n\n\n<div class=\"wp-block-rank-math-toc-block\" id=\"rank-math-toc\"><h2>Spis tre\u015bci<\/h2><nav><ol><li class=\"\"><a href=\"#petle-c-podstawowe-konstrukcje-iteracyjne-for-while-do-while\">P\u0119tle C++ &#8211; podstawowe konstrukcje iteracyjne: for, while, do-while<\/a><ol><li class=\"\"><a href=\"#petla-while\">P\u0119tla while<\/a><\/li><li class=\"\"><a href=\"#petla-do-while\">P\u0119tla do-while<\/a><\/li><li class=\"\"><a href=\"#petla-for\">P\u0119tla for<\/a><\/li><\/ol><\/li><li class=\"\"><a href=\"#petle-c-zasieg-zmiennych-czas-zycia-i-wplyw-na-poprawnosc-algorytmu\">P\u0119tle C++ &#8211; zasi\u0119g zmiennych, czas \u017cycia i wp\u0142yw na poprawno\u015b\u0107 algorytmu<\/a><\/li><li class=\"\"><a href=\"#petle-c-sterowanie-przebiegiem-break-continue-return-goto\">P\u0119tle C++ &#8211; sterowanie przebiegiem: break, continue, return, goto<\/a><ol><li class=\"\"><a href=\"#break\">break<\/a><\/li><li class=\"\"><a href=\"#continue\">continue<\/a><\/li><li class=\"\"><a href=\"#return\">return<\/a><\/li><li class=\"\"><a href=\"#goto\">goto<\/a><\/li><\/ol><\/li><li class=\"\"><a href=\"#petle-c-petle-zagniezdzone-i-zlozonosc-obliczeniowa\">P\u0119tle C++ &#8211; p\u0119tle zagnie\u017cd\u017cone i z\u0142o\u017cono\u015b\u0107 obliczeniowa<\/a><\/li><li class=\"\"><a href=\"#petle-c-petla-zakresowa-range-based-for-i-iteracja-po-kontenerach\">P\u0119tle C++ &#8211; p\u0119tla zakresowa (range-based for) i iteracja po kontenerach<\/a><\/li><li class=\"\"><a href=\"#petle-c-petle-nieskonczone-i-ich-kontrolowane-zastosowanie\">P\u0119tle C++ &#8211; p\u0119tle niesko\u0144czone i ich kontrolowane zastosowanie<\/a><\/li><li class=\"\"><a href=\"#petle-c-typowe-bledy-logiczne-i-problemy-implementacyjne\">P\u0119tle C++ &#8211; typowe b\u0142\u0119dy logiczne i problemy implementacyjne<\/a><\/li><li class=\"\"><a href=\"#petle-c-zaleznosc-miedzy-konstrukcja-petli-a-czytelnoscia-algorytmu\">P\u0119tle C++ &#8211; zale\u017cno\u015b\u0107 mi\u0119dzy konstrukcj\u0105 p\u0119tli a czytelno\u015bci\u0105 algorytmu<\/a><\/li><\/ol><\/nav><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"petle-c-podstawowe-konstrukcje-iteracyjne-for-while-do-while\">P\u0119tle C++ &#8211; podstawowe konstrukcje iteracyjne: for, while, do-while<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">W C++ istniej\u0105 trzy klasyczne konstrukcje p\u0119tli:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>for<\/code><\/li>\n\n\n\n<li><code>while<\/code><\/li>\n\n\n\n<li><code>do { } while<\/code><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Ka\u017cda z nich realizuje ten sam og\u00f3lny cel: powtarzanie bloku instrukcji. R\u00f3\u017cni\u0105 si\u0119 jednak miejscem sprawdzania warunku oraz typowym zastosowaniem.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"petla-while\">P\u0119tla <code>while<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Sk\u0142adnia:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">while (warunek) {<br>    instrukcje;<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Mechanizm dzia\u0142ania:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Sprawdzenie warunku logicznego.<\/li>\n\n\n\n<li>Je\u015bli warunek jest prawdziwy &#8211; wykonanie bloku.<\/li>\n\n\n\n<li>Powr\u00f3t do punktu 1.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u017celi warunek od pocz\u0105tku jest fa\u0142szywy, blok nie zostanie wykonany ani razu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad &#8211; wypisanie liczb od 0 do 4:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#include &lt;iostream&gt;int main() {<br>    int i = 0;    while (i &lt; 5) {<br>        std::cout &lt;&lt; i &lt;&lt; std::endl;<br>        i++;<br>    }    return 0;<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Istotne jest, \u017ce modyfikacja zmiennej steruj\u0105cej musi nast\u0105pi\u0107 wewn\u0105trz bloku. Je\u017celi jej zabraknie, powstanie p\u0119tla niesko\u0144czona.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Odpowiednik w C:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#include &lt;stdio.h&gt;int main() {<br>    int i = 0;    while (i &lt; 5) {<br>        printf(\"%d\\n\", i);<br>        i++;<br>    }    return 0;<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Odpowiednik w Pythonie:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">i = 0while i &lt; 5:<br>    print(i)<br>    i += 1<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"petla-do-while\">P\u0119tla <code>do-while<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Sk\u0142adnia:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">do {<br>    instrukcje;<br>} while (warunek);<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">R\u00f3\u017cnica wzgl\u0119dem <code>while<\/code> polega na tym, \u017ce warunek sprawdzany jest na ko\u0144cu. Oznacza to, \u017ce blok wykona si\u0119 co najmniej jeden raz.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad &#8211; wczytywanie liczby dodatniej:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#include &lt;iostream&gt;int main() {<br>    int x;    do {<br>        std::cout &lt;&lt; \"Podaj liczbe dodatnia: \";<br>        std::cin &gt;&gt; x;<br>    } while (x &lt;= 0);    return 0;<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Ten mechanizm stosuje si\u0119 wtedy, gdy pierwsze wykonanie musi nast\u0105pi\u0107 niezale\u017cnie od warunku, np. przy walidacji danych wej\u015bciowych.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W Pythonie brak dok\u0142adnego odpowiednika, symuluje si\u0119 to przez:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">while True:<br>    x = int(input(\"Podaj liczbe dodatnia: \"))<br>    if x &gt; 0:<br>        break<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"petla-for\">P\u0119tla <code>for<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Najbardziej klasyczna konstrukcja iteracyjna.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sk\u0142adnia:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for (inicjalizacja; warunek; modyfikacja) {<br>    instrukcje;<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Rozk\u0142ad logiczny:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Wykonanie inicjalizacji.<\/li>\n\n\n\n<li>Sprawdzenie warunku.<\/li>\n\n\n\n<li>Wykonanie bloku.<\/li>\n\n\n\n<li>Wykonanie modyfikacji.<\/li>\n\n\n\n<li>Powr\u00f3t do punktu 2.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#include &lt;iostream&gt;int main() {<br>    for (int i = 0; i &lt; 5; i++) {<br>        std::cout &lt;&lt; i &lt;&lt; std::endl;<br>    }<br>    return 0;<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Zmienna <code>i<\/code> ma zasi\u0119g ograniczony do p\u0119tli. To wa\u017cne z punktu widzenia bezpiecze\u0144stwa kodu.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Odpowiednik w C:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#include &lt;stdio.h&gt;int main() {<br>    for (int i = 0; i &lt; 5; i++) {<br>        printf(\"%d\\n\", i);<br>    }<br>    return 0;<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">W Pythonie:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for i in range(5):<br>    print(i)<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"petle-c-zasieg-zmiennych-czas-zycia-i-wplyw-na-poprawnosc-algorytmu\">P\u0119tle C++ &#8211; zasi\u0119g zmiennych, czas \u017cycia i wp\u0142yw na poprawno\u015b\u0107 algorytmu<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">W C++ zmienna zadeklarowana w nag\u0142\u00f3wku p\u0119tli <code>for<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for (int i = 0; i &lt; 10; i++)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">istnieje tylko wewn\u0105trz tej p\u0119tli. Po jej zako\u0144czeniu nie mo\u017cna si\u0119 do niej odwo\u0142a\u0107.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Natomiast w <code>while<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">int i = 0;<br>while (i &lt; 10) {<br>    i++;<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>i<\/code> istnieje r\u00f3wnie\u017c po zako\u0144czeniu p\u0119tli.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To ma znaczenie przy bardziej z\u0142o\u017conych algorytmach, np. przy przeszukiwaniu tablicy:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">int i;<br>for (i = 0; i &lt; n; i++) {<br>    if (tab[i] == x)<br>        break;<br>}if (i &lt; n) {<br>    std::cout &lt;&lt; \"Znaleziono\";<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u017celi <code>i<\/code> by\u0142oby zadeklarowane w nag\u0142\u00f3wku, nie by\u0142oby dost\u0119pne po zako\u0144czeniu p\u0119tli.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Czas \u017cycia zmiennej wp\u0142ywa te\u017c na optymalizacj\u0119 &#8211; kompilator mo\u017ce \u0142atwiej zarz\u0105dza\u0107 pami\u0119ci\u0105, gdy zakres jest ograniczony.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"petle-c-sterowanie-przebiegiem-break-continue-return-goto\">P\u0119tle C++ &#8211; sterowanie przebiegiem: break, continue, return, goto<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"break\"><code>break<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Natychmiast przerywa dzia\u0142anie p\u0119tli.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for (int i = 0; i &lt; 10; i++) {<br>    if (i == 5)<br>        break;<br>    std::cout &lt;&lt; i &lt;&lt; std::endl;<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Wypisze 0-4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"continue\"><code>continue<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Pomija reszt\u0119 bie\u017c\u0105cej iteracji.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for (int i = 0; i &lt; 5; i++) {<br>    if (i == 2)<br>        continue;<br>    std::cout &lt;&lt; i &lt;&lt; std::endl;<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Wypisze 0,1,3,4.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"return\"><code>return<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ko\u0144czy funkcj\u0119 &#8211; a wi\u0119c i p\u0119tl\u0119.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">while (true) {<br>    int x;<br>    std::cin &gt;&gt; x;<br>    if (x == 0)<br>        return 0;<br>}<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"goto\"><code>goto<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Mo\u017cliwy, ale w praktyce unika si\u0119 go. Mo\u017ce prowadzi\u0107 do kodu trudnego w analizie.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"petle-c-petle-zagniezdzone-i-zlozonosc-obliczeniowa\">P\u0119tle C++ &#8211; p\u0119tle zagnie\u017cd\u017cone i z\u0142o\u017cono\u015b\u0107 obliczeniowa<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">P\u0119tla mo\u017ce zawiera\u0107 inn\u0105 p\u0119tl\u0119.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for (int i = 0; i &lt; 3; i++) {<br>    for (int j = 0; j &lt; 3; j++) {<br>        std::cout &lt;&lt; i &lt;&lt; \" \" &lt;&lt; j &lt;&lt; std::endl;<br>    }<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Liczba wykona\u0144 wynosi 3 \u00d7 3 = 9.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Z punktu widzenia analizy algorytm\u00f3w:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>jedna p\u0119tla do <code>n<\/code> \u2192 O(n)<\/li>\n\n\n\n<li>dwie zagnie\u017cd\u017cone \u2192 O(n\u00b2)<\/li>\n\n\n\n<li>trzy \u2192 O(n\u00b3)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad sumowania macierzy:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for (int i = 0; i &lt; n; i++) {<br>    for (int j = 0; j &lt; m; j++) {<br>        suma += tab[i][j];<br>    }<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Z\u0142o\u017cono\u015b\u0107: O(nm).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W Pythonie analogicznie:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for i in range(n):<br>    for j in range(m):<br>        suma += tab[i][j]<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"petle-c-petla-zakresowa-range-based-for-i-iteracja-po-kontenerach\">P\u0119tle C++ &#8211; p\u0119tla zakresowa (range-based for) i iteracja po kontenerach<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Od C++11 dost\u0119pna jest p\u0119tla zakresowa:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for (typ zmienna : kolekcja) {<br>    instrukcje;<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Przyk\u0142ad z tablic\u0105:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">int tab[5] = {1,2,3,4,5};for (int x : tab) {<br>    std::cout &lt;&lt; x &lt;&lt; std::endl;<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Dla kontener\u00f3w STL:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#include &lt;vector&gt;<br>#include &lt;iostream&gt;int main() {<br>    std::vector&lt;int&gt; v = {1,2,3};    for (int x : v) {<br>        std::cout &lt;&lt; x &lt;&lt; std::endl;<br>    }    return 0;<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u017celi chcemy modyfikowa\u0107 elementy, u\u017cywamy referencji:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for (int &amp;x : v) {<br>    x *= 2;<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Brak referencji powoduje prac\u0119 na kopii.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"petle-c-petle-nieskonczone-i-ich-kontrolowane-zastosowanie\">P\u0119tle C++ &#8211; p\u0119tle niesko\u0144czone i ich kontrolowane zastosowanie<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">P\u0119tla niesko\u0144czona:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">while (true) {<br>    \/\/ ...<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">lub<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">for (;;) {<br>    \/\/ ...<br>}<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Stosowana w:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>serwerach<\/li>\n\n\n\n<li>programach interaktywnych<\/li>\n\n\n\n<li>systemach wbudowanych<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Warunek zako\u0144czenia musi by\u0107 realizowany przez <code>break<\/code>, <code>return<\/code> lub sygna\u0142 zewn\u0119trzny.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"petle-c-typowe-bledy-logiczne-i-problemy-implementacyjne\">P\u0119tle C++ &#8211; typowe b\u0142\u0119dy logiczne i problemy implementacyjne<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Brak modyfikacji zmiennej steruj\u0105cej<\/strong>\n<ul class=\"wp-block-list\">\n<li>prowadzi do p\u0119tli niesko\u0144czonej.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>B\u0142\u0105d granicy (off-by-one)<\/strong><\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-preformatted\">for (int i = 0; i &lt;= n; i++)<\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">Je\u017celi tablica ma rozmiar <code>n<\/code>, ostatni poprawny indeks to <code>n-1<\/code>.<\/p>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li><strong>Modyfikacja kolekcji podczas iteracji<\/strong>\n<ul class=\"wp-block-list\">\n<li>w przypadku wektor\u00f3w mo\u017ce uniewa\u017cni\u0107 iterator.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>U\u017cycie nieprawid\u0142owego typu licznika<\/strong>\n<ul class=\"wp-block-list\">\n<li>np. <code>unsigned<\/code> przy por\u00f3wnaniach z warto\u015bci\u0105 ujemn\u0105.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><strong>Zbyt z\u0142o\u017cone warunki w nag\u0142\u00f3wku<\/strong>\n<ul class=\"wp-block-list\">\n<li>utrudniaj\u0105 analiz\u0119 poprawno\u015bci.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"petle-c-zaleznosc-miedzy-konstrukcja-petli-a-czytelnoscia-algorytmu\">P\u0119tle C++ &#8211; zale\u017cno\u015b\u0107 mi\u0119dzy konstrukcj\u0105 p\u0119tli a czytelno\u015bci\u0105 algorytmu<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Dob\u00f3r rodzaju p\u0119tli powinien wynika\u0107 z charakteru problemu:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>znana liczba iteracji \u2192 <code>for<\/code><\/li>\n\n\n\n<li>iteracja zale\u017cna od warunku logicznego \u2192 <code>while<\/code><\/li>\n\n\n\n<li>konieczno\u015b\u0107 wykonania co najmniej jednej iteracji \u2192 <code>do-while<\/code><\/li>\n\n\n\n<li>przej\u015bcie po kolekcji \u2192 range-based for<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Nie chodzi tylko o sk\u0142adni\u0119, ale o semantyk\u0119. Dobrze dobrana konstrukcja upraszcza analiz\u0119 poprawno\u015bci i zmniejsza ryzyko b\u0142\u0119d\u00f3w.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">W algorytmach klasycznych (sortowanie, przeszukiwanie, operacje na grafach) konstrukcja p\u0119tli bezpo\u015brednio przek\u0142ada si\u0119 na z\u0142o\u017cono\u015b\u0107 czasow\u0105 i pami\u0119ciow\u0105. W systemach czasu rzeczywistego dodatkowo znaczenie ma deterministyczno\u015b\u0107 liczby iteracji.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Na poziomie podstawowym p\u0119tle wydaj\u0105 si\u0119 prost\u0105 konstrukcj\u0105 sk\u0142adniow\u0105, ale w praktyce s\u0105 fundamentem ca\u0142ej struktury algorytmicznej programu. R\u00f3\u017cnice mi\u0119dzy <code>for<\/code>, <code>while<\/code> i <code>do-while<\/code>, kwestie zasi\u0119gu zmiennych, kontrola przep\u0142ywu oraz wp\u0142yw na z\u0142o\u017cono\u015b\u0107 obliczeniow\u0105 maj\u0105 realne konsekwencje w projektowaniu oprogramowania. Zrozumienie tych mechanizm\u00f3w na poziomie semantycznym, a nie tylko sk\u0142adniowym, jest konieczne do pisania poprawnych i przewidywalnych program\u00f3w w C++.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><\/p>\n","protected":false},"excerpt":{"rendered":"<p>P\u0119tle s\u0105 jednym z podstawowych mechanizm\u00f3w sterowania przep\u0142ywem programu. Umo\u017cliwiaj\u0105 wielokrotne wykonywanie tego samego fragmentu kodu przy spe\u0142nieniu okre\u015blonego warunku lub dla ustalonego zakresu warto\u015bci. Bez nich praktycznie nie da si\u0119 pisa\u0107 program\u00f3w operuj\u0105cych na tablicach, danych wej\u015bciowych, plikach czy strukturach dynamicznych. W praktyce wi\u0119kszo\u015b\u0107 realnych algorytm\u00f3w opiera si\u0119 na iteracji. W j\u0119zyku C++ mechanizmy iteracyjne s\u0105 rozbudowane i obejmuj\u0105 kilka konstrukcji sk\u0142adniowych, kt\u00f3re r\u00f3\u017cni\u0105 si\u0119 semantyk\u0105 i zastosowaniem. W\u0142a\u015bnie temu zagadnieniu po\u015bwi\u0119cone s\u0105 P\u0119tle C++. P\u0119tle C++ &#8211; podstawowe konstrukcje iteracyjne: for, while, do-while W C++ istniej\u0105 trzy klasyczne konstrukcje p\u0119tli: Ka\u017cda z nich realizuje ten sam og\u00f3lny cel: powtarzanie bloku instrukcji. R\u00f3\u017cni\u0105 si\u0119 jednak miejscem sprawdzania warunku oraz typowym zastosowaniem. P\u0119tla while Sk\u0142adnia: while (warunek) { instrukcje;} Mechanizm dzia\u0142ania: Je\u017celi warunek od pocz\u0105tku jest fa\u0142szywy, blok nie zostanie wykonany ani razu. Przyk\u0142ad &#8211; wypisanie liczb od 0 do 4: #include &lt;iostream&gt;int main() { int i = 0; while (i &lt; 5) { std::cout &lt;&lt; i &lt;&lt; std::endl; i++; } return 0;} Istotne jest, \u017ce modyfikacja zmiennej steruj\u0105cej musi nast\u0105pi\u0107 wewn\u0105trz bloku. Je\u017celi jej zabraknie, powstanie p\u0119tla niesko\u0144czona. Odpowiednik w C: #include &lt;stdio.h&gt;int main() { int i = 0; while (i &lt; 5) { printf(&#8222;%d\\n&#8221;, i); i++; } return 0;} Odpowiednik w Pythonie: i = 0while i &lt; 5: print(i) i += 1 P\u0119tla do-while Sk\u0142adnia: do { instrukcje;} while (warunek); R\u00f3\u017cnica wzgl\u0119dem while polega na tym, \u017ce warunek sprawdzany jest na ko\u0144cu. Oznacza to, \u017ce blok wykona si\u0119 co najmniej jeden raz. Przyk\u0142ad &#8211; wczytywanie liczby dodatniej: #include &lt;iostream&gt;int main() { int x; do { std::cout &lt;&lt; &#8222;Podaj liczbe dodatnia: &#8222;; std::cin &gt;&gt; x; } while (x &lt;= 0); return 0;} Ten mechanizm stosuje si\u0119 wtedy, gdy pierwsze wykonanie musi nast\u0105pi\u0107 niezale\u017cnie od warunku, np. przy walidacji danych wej\u015bciowych. W Pythonie brak dok\u0142adnego odpowiednika, symuluje si\u0119 to przez: while True: x = int(input(&#8222;Podaj liczbe dodatnia: &#8222;)) if x &gt; 0: break P\u0119tla for Najbardziej klasyczna konstrukcja iteracyjna. Sk\u0142adnia: for (inicjalizacja; warunek; modyfikacja) { instrukcje;} Rozk\u0142ad logiczny: Przyk\u0142ad: #include &lt;iostream&gt;int main() { for (int i = 0; i &lt; 5; i++) { std::cout &lt;&lt; i &lt;&lt; std::endl; } return 0;} Zmienna i ma zasi\u0119g ograniczony do p\u0119tli. To wa\u017cne z punktu widzenia bezpiecze\u0144stwa kodu. Odpowiednik w C: #include &lt;stdio.h&gt;int main() { for (int i = 0; i &lt; 5; i++) { printf(&#8222;%d\\n&#8221;, i); } return 0;} W Pythonie: for i in range(5): print(i) P\u0119tle C++ &#8211; zasi\u0119g zmiennych, czas \u017cycia i wp\u0142yw na poprawno\u015b\u0107 algorytmu W C++ zmienna zadeklarowana w nag\u0142\u00f3wku p\u0119tli for: for (int i = 0; i &lt; 10; i++) istnieje tylko wewn\u0105trz tej p\u0119tli. Po jej zako\u0144czeniu nie mo\u017cna si\u0119 do niej odwo\u0142a\u0107. Natomiast w while: int i = 0;while (i &lt; 10) { i++;} i istnieje r\u00f3wnie\u017c po zako\u0144czeniu p\u0119tli. To ma znaczenie przy bardziej z\u0142o\u017conych algorytmach, np. przy przeszukiwaniu tablicy: int i;for (i = 0; i &lt; n; i++) { if (tab[i] == x) break;}if (i &lt; n) { std::cout &lt;&lt; &#8222;Znaleziono&#8221;;} Je\u017celi i by\u0142oby zadeklarowane w nag\u0142\u00f3wku, nie by\u0142oby dost\u0119pne po zako\u0144czeniu p\u0119tli. Czas \u017cycia zmiennej wp\u0142ywa te\u017c na optymalizacj\u0119 &#8211; kompilator mo\u017ce \u0142atwiej zarz\u0105dza\u0107 pami\u0119ci\u0105, gdy zakres jest ograniczony. P\u0119tle C++ &#8211; sterowanie przebiegiem: break, continue, return, goto break Natychmiast przerywa dzia\u0142anie p\u0119tli. for (int i = 0; i &lt; 10; i++) { if (i == 5) break; std::cout &lt;&lt; i &lt;&lt; std::endl;} Wypisze 0-4. continue Pomija reszt\u0119 bie\u017c\u0105cej iteracji. for (int i = 0; i &lt; 5; i++) { if (i == 2) continue; std::cout &lt;&lt; i &lt;&lt; std::endl;} Wypisze 0,1,3,4. return Ko\u0144czy funkcj\u0119 &#8211; a wi\u0119c i p\u0119tl\u0119. while (true) { int x; std::cin &gt;&gt; x; if (x == 0) return 0;} goto Mo\u017cliwy, ale w praktyce unika si\u0119 go. Mo\u017ce prowadzi\u0107 do kodu trudnego w analizie. P\u0119tle C++ &#8211; p\u0119tle zagnie\u017cd\u017cone i z\u0142o\u017cono\u015b\u0107 obliczeniowa P\u0119tla mo\u017ce zawiera\u0107 inn\u0105 p\u0119tl\u0119. for (int i = 0; i &lt; 3; i++) { for (int j = 0; j &lt; 3; j++) { std::cout &lt;&lt; i &lt;&lt; &#8221; &#8221; &lt;&lt; j &lt;&lt; std::endl; }} Liczba wykona\u0144 wynosi 3 \u00d7 3 = 9. Z punktu widzenia analizy algorytm\u00f3w: Przyk\u0142ad sumowania macierzy: for (int i = 0; i &lt; n; i++) { for (int j = 0; j &lt; m; j++) { suma += tab[i][j]; }} Z\u0142o\u017cono\u015b\u0107: O(nm). W Pythonie analogicznie: for i in range(n): for j in range(m): suma += tab[i][j] P\u0119tle C++ &#8211; p\u0119tla zakresowa (range-based for) i iteracja po kontenerach Od C++11 dost\u0119pna jest p\u0119tla zakresowa: for (typ zmienna : kolekcja) { instrukcje;} Przyk\u0142ad z tablic\u0105: int tab[5] = {1,2,3,4,5};for (int x : tab) { std::cout &lt;&lt; x &lt;&lt; std::endl;} Dla kontener\u00f3w STL: #include &lt;vector&gt;#include &lt;iostream&gt;int main() { std::vector&lt;int&gt; v = {1,2,3}; for (int x : v) { std::cout &lt;&lt; x &lt;&lt; std::endl; } return 0;} Je\u017celi chcemy modyfikowa\u0107 elementy, u\u017cywamy referencji: for (int &amp;x : v) { x *= 2;} Brak referencji powoduje prac\u0119 na kopii. P\u0119tle C++ &#8211; p\u0119tle niesko\u0144czone i ich kontrolowane zastosowanie P\u0119tla niesko\u0144czona: while (true) { \/\/ &#8230;} lub for (;;) { \/\/ &#8230;} Stosowana w: Warunek zako\u0144czenia musi by\u0107 realizowany przez break, return lub sygna\u0142 zewn\u0119trzny. P\u0119tle C++ &#8211; typowe b\u0142\u0119dy logiczne i problemy implementacyjne for (int i = 0; i &lt;= n; i++) Je\u017celi tablica ma rozmiar n, ostatni poprawny indeks to n-1. P\u0119tle C++ &#8211; zale\u017cno\u015b\u0107 mi\u0119dzy konstrukcj\u0105 p\u0119tli a czytelno\u015bci\u0105 algorytmu Dob\u00f3r rodzaju p\u0119tli powinien wynika\u0107 z charakteru problemu: Nie chodzi tylko o sk\u0142adni\u0119, ale o semantyk\u0119. Dobrze dobrana konstrukcja upraszcza analiz\u0119 poprawno\u015bci i zmniejsza ryzyko b\u0142\u0119d\u00f3w. W algorytmach klasycznych (sortowanie, przeszukiwanie, operacje na grafach) konstrukcja p\u0119tli bezpo\u015brednio przek\u0142ada si\u0119 na z\u0142o\u017cono\u015b\u0107 czasow\u0105 i pami\u0119ciow\u0105. W systemach czasu rzeczywistego dodatkowo znaczenie ma deterministyczno\u015b\u0107 liczby iteracji. Na poziomie podstawowym p\u0119tle wydaj\u0105 si\u0119 prost\u0105 konstrukcj\u0105 sk\u0142adniow\u0105, ale w praktyce s\u0105 fundamentem ca\u0142ej struktury algorytmicznej programu. R\u00f3\u017cnice mi\u0119dzy for, while i do-while, kwestie zasi\u0119gu zmiennych, kontrola przep\u0142ywu oraz wp\u0142yw na z\u0142o\u017cono\u015b\u0107 obliczeniow\u0105 maj\u0105 realne konsekwencje w projektowaniu oprogramowania. Zrozumienie tych mechanizm\u00f3w na poziomie semantycznym, a nie tylko sk\u0142adniowym, jest konieczne do pisania poprawnych i przewidywalnych program\u00f3w w C++.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":1054,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1135","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/pages\/1135","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/comments?post=1135"}],"version-history":[{"count":1,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/pages\/1135\/revisions"}],"predecessor-version":[{"id":1136,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/pages\/1135\/revisions\/1136"}],"up":[{"embeddable":true,"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/pages\/1054"}],"wp:attachment":[{"href":"https:\/\/trzykody.pl\/index.php\/wp-json\/wp\/v2\/media?parent=1135"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}