Skocz do zawartości

[c++] Pyt. O While ;]


lszk

Rekomendowane odpowiedzi

Przeglądałeś sobie dzisiaj Megatutorial i postanowiłem się pobawić. Do zilustrowania pętli while jest tam przykładowy kod, a pod koniec rozdziału jest zadanie, aby obliczyć, ile iteracji tej pętli było. Więc dopisuje od siebie kod do tego obliczenia. Kod jest taki

#include <iostream>
#include <ctime>

using namespace std;

int main(int argc, char *argv[])
{
    cout << "   ZGADYWANKA   " << endl;
    cout << "----------------" << endl;
    cout << endl;
    srand ((int) time(NULL));
    int wylosowana = rand() % 100 + 1;
    cout << "Wylosowano liczbe z przedzialu 1-100." << endl;
    int wprowadzona;
    cout << "Sprobuj ja odgadnac: ";
    cin >> wprowadzona;
    int x = 0;
    
    while (wprowadzona != wylosowana)
    {
 if (wprowadzona < wylosowana)
     cout << "Liczba jest zbyt mala.";
 else
     cout << "Za duza liczba.";

 cout << " Sprobuj jeszcze raz: ";
 cin >> wprowadzona;

    
    if (wprowadzona != wylosowana){ x++; }

    }
    
    cout << "Celny strzal :) Brawo!"  << "Trafiles za " << x << " razem;-)" << endl;
    return 0;
}

I teraz log

Wylosowano liczbe z przedzialu 1-100.
Sprobuj ja odgadnac: 10
Liczba jest zbyt mala. Sprobuj jeszcze raz: 30
Za duza liczba. Sprobuj jeszcze raz: 25
Liczba jest zbyt mala. Sprobuj jeszcze raz: 27
Za duza liczba. Sprobuj jeszcze raz: 26
Celny strzal :) Brawo!Trafiles za 3 razem;-)

Właśnie. Jakby na to nie patrzeć, to z byka tam nie może być 3 ;-) I właśnie pytanie czemu tak jest?

Odnośnik do komentarza
Udostępnij na innych stronach

Spieszy mi się, więc krótko: z tego co widze to chyba wina x=0, zatem jeśli zgadniesz za 4 razem wyświetla Ci 3, za 5 będzie 4 itd... Ponieważ postinkrementujesz x na koniec, powinnienneś zainicjalizować x z wartością 1...

Odnośnik do komentarza
Udostępnij na innych stronach

#include <iostream>
#include <ctime>
#include <conio>
using namespace std;
//***************************************************************
int main()
{
    int x = 1;
    int wylosowana, wprowadzona;
    cout << "   ZGADYWANKA   " << endl;
    cout << "----------------\n" << endl;
    srand ((int) time(NULL));
    wylosowana = rand() % 100 + 1;
    cout << "Wylosowano liczbe z przedzialu 1-100." << endl;
    cout << "Sprobuj ja odgadnac: ";
    cin >> wprowadzona;
    while (wprowadzona != wylosowana)
    {
 if (wprowadzona < wylosowana)
 cout << "Liczba jest zbyt mala.";
    else
 cout << "Za duza liczba.";
    cout << " Sprobuj jeszcze raz: ";
    cin >> wprowadzona;
    if (wprowadzona != wylosowana){ x++; }
    }
    cout << "Celny strzal :) Brawo!\n"  << "Trafiles za " << x << " razem;-)";
    getch();
    return 0;
}

Działa, rada sorror'a trafną jest.

P.S: Drobne zmiany w kodzie wprowadziłem, kosmetyczne raczej ;)

Odnośnik do komentarza
Udostępnij na innych stronach

Hmm ncurses :)

Nie chce mi się teraz w to zagłębiać, bo już późno, ale po zmianie ... <conio.h> na ... <ncurses.h> można normalnie używać funkcji getch() ? Bo teraz, jak to w taki sposób skompiluje, to wywala mi

Wylosowano liczbe z przedzialu 1-100.
Sprobuj ja odgadnac: 50
Liczba jest zbyt mala. Sprobuj jeszcze raz: 70
Celny strzal :) Brawo!
Naruszenie ochrony pamiêci

Jutro się jeszcze zainteresuje tym dokładniej :)

Odnośnik do komentarza
Udostępnij na innych stronach

a swoją drogą dlaczego

 

if (wprowadzona != wylosowana){ x++; }

 

skoro warunkiem działania pętli jest wprowadzona != wylosowana ?

Wystarczy x++;

 

#include <iostream>
#include <ctime>

using namespace std;

int main(int argc, char *argv[])
{
cout << "   ZGADYWANKA   " << endl;
cout << "----------------" << endl;
cout << endl;
srand ((int) time(NULL));
int wylosowana = rand() % 10 + 1;
cout << "Wylosowano liczbe z przedzialu 1-10." << endl;
int wprowadzona;
int x = 1;
cout << "Sprobuj ja odgadnac: ";
cin >> wprowadzona;


while (wprowadzona != wylosowana)
{
if (wprowadzona < wylosowana)
 cout << "Liczba jest zbyt mala.";
else
 cout << "Za duza liczba.";

cout << " Sprobuj jeszcze raz: ";
cin >> wprowadzona;
x++; 

}

cout << "Celny strzal :) Brawo!"  << "Trafiles za " << x << " razem;-)" << endl;
cin.ignore();cin.ignore();
return 0;

}

Odnośnik do komentarza
Udostępnij na innych stronach

Jasne ;) W przypadku błędnego strzału x (czyli pseudolicznik) zwiększa się o jeden... Jeśli zabrać warunek o którym wspomniałeś licznik zwiększy się nawet jeśli padła właściwa liczba i na skutek tego zawsze będzie pokazywał liczbę za dużą o 1...

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...