Pętle C++. Wyjaśnienie


(8radek8) #1

Witam. Jak w temacie.

Jestem bardzo początkujący, ucze się programowania dopiero od tygodnia.

Czy mógłby mi ktoś wyjaśnić bardzo prostym językiem kiedy i do czego stosować daną pętle (do, while, for) ??

Mam z tym bardzo duże problemy, nie mogę się tego nauczyć i załapać co i jak, myślę, że z innymi rzeczami będzie mi łatwiej, a te pętle to jest masakra.

Pozdrawiam.


(Marekglapa) #2

Zaczniemy od pętli do-while. Wykonuje się ona dopóki nie zostanie spełniony warunek (np. i < 5, i mniejsze od 5, jeśli i będzie większe lub równe to przerywa się jej wykonywanie). Pętla do-while wykona się przynajmniej raz. Przydaje się to gdy musisz i tak wykonać jakąś operację zawartą w pętli a warunek i tak jest nie spełniony. Załóżmy, że i=7 i wtedy w pętli do-while można wykonać działanie a=8+i. Mimo że warunek nie jest spełniony to do zmiennej a przypisana zostanie wartość 8+7 czyli 15.

Pętla while tak jak wyżej wykonuje się do kiedy nie zostanie spełniony warunek. Może się ona w ogóle nie wykonać gdy np. i będzie równe 6 (przykład wyżej).

Pętla for jest dobra gdy np. musimy wykonać coś ileś razy (można inne pętle również wykorzystać ale ta jest najwygodniejsza)

Załóżmy że chcesz wyświetlić literę "a" 10 razy.

for(int i=0;i<10;i++)

{

cout<<""a";

}

int i =0 deklaracja zmiennej,

i<10 pętla będzie się wykonywać 10 razy (dopóki i będzie mniejsze od 10)

i++, zwiększanie wartości i o 1 z każdym przebiegiem pętli.

Pętla for jest też niesamowicie przydatna w poruszaniu się po tablicach. Elementy w tablicy są ponumerowane od 0 do n. Tak samo możesz ustawić pętle for żeby startowała od 0 a kończyła na n i dzięki temu do każdego elementu tablicy można przypisać jakąś wartość.


(8radek8) #3

Dzięki za odpowiedź, ale nie mogę tego skumać. Ale napewno te wyjaśnienie mi się przyda.

Jeśli dałbyś radę jeszcze prościej to wytłumaczyć :slight_smile: (chyba, że się nie da) to będę bardzo wdzięczny.


(Johny) #4

for wykonuje się n ilość razy,możesz sobie wstawić wyświetlanie zmiennej i w pętli

while wykonuje się dopóki jest spełniony warunek

klasyczny przykład,odczyt z pliku

ofstream plik;

plik.open ("c:\jakiśplik.txt");

while (plik not eof) //dopóki nie ma końca pliku (jak będzie koniec pliku pętla się kończy)

{

plik.read(a);

plik.read(b);

plik.read©;

}


(klemensior15) #5

Jeśli wiesz dokładnie ile razy ma się wykonać pętla to często używa się for. Ponadto przy tablicach często będziesz je używał.

While używasz jeśli chcesz powtórzyć jakieś czynności jednak nie musi się ona wykonać jeśli problem ,który postawisz dla tej pętli nie będzie spełniony od początku.

Do..while jeśli chcesz coś powtórzyć jednak sprawdzasz czy ma się wykonać jeszcze raz po tym jak się wykona. Przeciwnie do while.

Jednak większość pętli można napisać na każdej z możliwości, kwestia warunku.

Spróbuj w ramach ćwiczeń napisać 3 pętle ,które wypiszą 10 razy "Hello" wykorzystując while, do..while,for.


(Johny) #6

Najlepiej będzie samemu poćwiczyć,jak pisze klemensior,napisz prosty kod i się nim pobaw


(slepcu) #7

pętle while użyjesz w przypadku gdy nie wiesz ile jest elementów, np. pobierasz je kolejno i nie wiesz ile ich jest, jesli brak nowego elementu to koniec pętli. Choćby odczyt kolejnych linii pliku :

jako że pracuje jako programista .NET łatwiej mi o przykład w C++ dla .NET

StreamReader^ sr = gcnew StreamReader("TestFile.txt");

            String^ line;

            // Read and display lines from the file until the end of

            // the file is reached.

            while ((line = sr->ReadLine()) != nullptr)

            {

                Console::WriteLine(line);

            }

jak widać pętla while to wykonanie bloku kodu w jej wnetrzu jesli jest spełniony warunek w nawiasach (). Rozpisując to co jest w nawiasach :

(line = sr->ReadLine()) != nullptr 

// to samo co :

line = sr->ReadLine()

line != nullptr

czyli sprawdzane jest czy line nie jest pustym uchwytem (null pointer), czyli ze nic nie pobrano.


(8radek8) #8

Ok.

Poćwiczę, tylko najpierw muszę dojść do tego jak wypisać kilka razy jakiś teks:)


(Dludwicki) #9

Źle do tego podchodzisz już od samego początku, niepotrzebnie się ograniczasz.

Nie daj sobie wmówić na start, że coś się używa do czegoś bo tak. Eksperymentuj.

Zmorą większościowi podręczników jest to, że wpajają stereotypy.. To tak jakby wmawiać Einsteinowi na starcie, że fizyka Newtonowska jest najlepsza bo wszyscy ją stosują..

Ja na przykład w życiu jeszcze nie użyłem tej durnej pętli do..while.

Prawda jest taka, że każdą pętlą osiągniesz zamierzony efekt.

Tylko w jednej pętli może to być 1 linijka, a w drugiej to samo otrzymasz wypisując kilka linii i zaprzęgając dodatkowe zmienne..

I tutaj po raz pierwszy w programowaniu spotkasz się z pojęciem "optymalizacji kodu".

tu masz link do bardzo ciekawej lekcji po polsku, gdzie na przykładzie tłumaczą działanie tech pętli.

http://cpp0x.pl/kursy/Kurs-C++/Petla-wh ... -while/301


(kowal.luk) #10

proszę czytać manuala danego języka programowania poza tym google nie boli. uczysz się tydzień, ale czego, programować? Programowania nie opanujesz w jakimś nawet kiepskim stopniu jak sam nie napiszesz kilkadziesiąt a nawet kilkaset programów, także powodzenia w dalszej drodze.


(system) #11

Trochę trudne przykłady tutaj podawane są na początek dla Ciebie.

for (int i = 0; i < 10;i++)//i++ postinkrementacja

cout << i << ' ';

do { 

cin >> zmienna;

} while (zmienna != 0); /*Podany przykład będzie się wykonywał dopóki zmienna będzie różna od 0 "!="*/

Podobnie jest z :

while(zmienna != 0){

   cin >> zmienna;

}

Różnica polega na sprawdzeniu warunku do {} while robi to pod koniec. W Pascalu ... teoretycznie kod jest łatwiejszy i może lepiej zrozumiesz

var i:byte;

.....

for i:=1 to 10 do 

  write(i);

while :

while (i <> 0)/*C++ !=*/

 Begin

  readln(i);

 End;

do while w Pascalu nie występuje :slight_smile:

Wyniki będą takie same

Pozdrawiam


(8radek8) #12

Dzięki.

Tylko dzisiaj jak się uczyłem było zadanie żeby napisać program który wypisze liczby od 1 do 100. Wiem, że jest to bardzo łatwe,ale zauważyłem, że już pozapominałem wszystko. Więc chyba nie nadaje się do tego :frowning:


(Drobok) #13

Co do wcześniejszego posta do while to w pascalu repeat until (nazwa inna, ale w działaniu różnicy brak)

Wszystkiego możesz użyć wszędzie, kwestia tego co zajmuje więcej miejsca. Np twój program na 3 sposoby:

for:

#include "iostream"using namespace std;int main(){int i=1;i=100;i++)  cout  i  endl;cin.sync();cin.get();return 0;[/code]

while:


[code=php]#include "iostream"using namespace std;int main(){int i=1;i=100)

(8radek8) #14

A jak można inaczej zrobić pętle while w tym przykładzie ?? Jakby wyglądał kod ?? Sorki za uciążliwość, chcę się tego w miarę nauczyć, a mam największe problemy z tymi pętlami.

include

include

int main()

{

int nLiczba;

do

{

std::cout << "Wprowadz liczbe wieksza od 10: ";

std::cin >> nLiczba;

}

while (nLiczba <= 10);

std::cout << "Dziekuje za wspolprace. ";

getch();

}

O for narazie nie będę pytał, bo zauważyłem, że go się stosuje żeby wypisał np. jakieś liczby np. od 1 do 10000, itp.


(Drobok) #15

Warunek sprawdzany na początku, więc zmienną musiałbyś pobrać przed pętlą, oraz pobierać dopóki nie będzie spełniać warunku.

Btw warunek masz nie adekwatny do zadania, bowiem w warunku jest liczba mniejsza od 10, a w zapytaniu masz na odwrót. Pętla do while, zawsze robi co najmniej jeden przebieg, a while nie.


(8radek8) #16

A jeszcze mam pytanie.

W tym kodzie:

#include

#include


int main()

{


     int jakas;

     std::cout<<"Podaj liczbe: ";

     std::cin>>jakas;



     if (jakas<0)

     {

     std::cout<<"Podales liczbe ujemna"<
     }


     if (jakas>=0 & jakas<10)

     {

     std::cout<<"Liczba jednocyfrowa"<
     }

     if (jakas>=10 & jakas<100)

     {

     std::cout<<"Liczba dwucyfrowa"<
     }

     if (jakas>=100 & jakas<1000)

     {

     std::cout<<"Liczba trzycyfrowa"<
     }



    getch();

     }

Jak użyć pętle do...while i jak samo while, aby po wyświetleniu wyniku np. tym: Podałeś liczbe ujemną wróciło do poczatku programy czyli podania liczby ??


(system) #17

Przykłady :

#include

using namespace std;


int main()

{


     int jakas;

     do {

        cout<<"Podaj liczbe: ";

        cin>>jakas;

     } while (jakas < 0);

     cout << "Ok";

     cin.sync();

     cin.get();

}

#include

using namespace std;


int main()

{


     int jakas;

     while(jakas < 0){

        cout<<"Podaj liczbe: ";

        cin>>jakas;

     }

     cout << "Ok";

     cin.sync();

     cin.get();

}

Tłumacząc na polski to można powiedzieć, że pętla będzie się wykonywać dopóki liczba będzie mniejsza od 0 Bardziej miałeś na myśli :

#include

using namespace std;


int main()

{


     int jakas;

     while (1){

        cout << "Podaj liczbe : ";

        cin >> jakas;

        if (jakas<0){

            cout<<"Podales liczbe ujemna"<
            continue;

        }

        if (jakas>=0 && jakas<10){

            cout<<"Liczba jednocyfrowa"<
            break;

        }

        if (jakas>=10 && jakas<100){

            cout<<"Liczba dwucyfrowa"<
        }

        if (jakas>=100 && jakas<1000){

            cout<<"Liczba trzycyfrowa"<
            break;

        }

     }

     cout << "Ok";

     cin.sync();

     cin.get();

}

Znalazłem jeden błąd u Ciebie koniunkcja w C++ to && lub and

Pozdrawiam


(8radek8) #18

Ok. Dzięki.

Tzn. mi bardziej chodziło o to, żeby po każdym podaniu wyniku wracał do tego, żeby podać liczbę. Ale to co mi podałeś to też może być :slight_smile:

A jeszcze zapytam bo w tym 2 kodzie w nawiasie while jest 1, co to znaczy ??


(Drobok) #19

Ogólnie warunki są true (spełnione), albo false (niespełnione). Te wartości odpowiadają liczbom 1, oraz 0 :slight_smile:


(somekind) #20

A 2 albo -5, to już nie jest true?