Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Lekcja 15 "Pętla do...while"

Ostatnio zmodyfikowano 2012-01-16 15:07
Autor Wiadomość
darvd29
Temat założony przez niniejszego użytkownika
Lekcja 15 "Pętla do...while"
» 2012-01-14 20:35:08
Siema!
Po nauczeniu się tej lekcji chcę zrobić prosty kalkulator mający 5 opcji:

[1] Dodawanie
[2] Odejmowanie
[3] Mnozenie
[4] Dzielenie
[5] Zakoncz program

Co zresztą jest zadaniem domowym ale dopiero potem to zauważyłem :D Robię taki kalkulator od dawna. W 1 wersji wpisywalo sie 2 liczby i wyswietlone zostały wyniki z 4 typów działań. Później, za pomocą "if" i "else" zrobiłem opcje do wyboru, ale po obliczeniu program się zakańczał. Po tym ulepszyłem go jeszcze - zmieniłem if i else na switch i case. W najnowszej wersji użyłem do...while by program mógł obliczać cały czas, aż użytkownik go nie wyłączy.

To koniec historii programu :PP

A teraz przejdźmy do rzeczy. Oto kod:

C/C++
#include <iostream>
int main()
{
    int a;
    std::cout << "Programik sluzy do obliczania wynikow z dzialan. W liczbach z przecinkiem uzywaj kropki." << std::endl;
    do
    {
        std::cout << "Wybierz typ dzialania:" << std::endl << "[1] Dodawanie" << std::endl << "[2] Odejmowanie" << std::endl << "[3] Mnozenie" << std::endl << "[4] Dzielenie" << std::endl << "[0] Wylacz program" << std::endl;
        std::cin >> a;
        double x, z;
        switch( a )
        {
        case 1:
            {
                std::cout << "Wprowadz 1 liczbe: \t";
                std::cin >> x;
                std::cout << std::endl << "Wprowadz 2 liczbe: \t";
                std::cin >> z;
                std::cout << std::endl << "Wynik z dodawania: \t" << x + z << std::endl << std::endl << std::endl;
                break;
            }
        case 2:
            {
                std::cout << "Wprowadz 1 liczbe: \t";
                std::cin >> x;
                std::cout << std::endl << "Wprowadz 2 liczbe: \t";
                std::cin >> z;
                std::cout << std::endl << "Wynik z odejmowania: \t" << x - z << std::endl << std::endl << std::endl;
                break;
            }
        case 3:
            {
                std::cout << "Wprowadz 1 liczbe: \t";
                std::cin >> x;
                std::cout << std::endl << "Wprowadz 2 liczbe: \t";
                std::cin >> z;
                std::cout << std::endl << "Wynik z mnozenia: \t" << x * z << std::endl << std::endl << std::endl;
                break;
            }
        case 4:
            {
                std::cout << "Wprowadz 1 liczbe: \t";
                std::cin >> x;
                std::cout << std::endl << "Wprowadz 2 liczbe: \t";
                std::cin >> z;
                std::cout << std::endl << "Wynik z dzielenia: \t" << x / z << std::endl << std::endl << std::endl;
                break;
            }
            default:
            {
                std::cout << "Nie istnieje taki typ dzialania." << std::endl << std::endl << std::endl;
            }
        }
    } while( a = 0 );
   
    system( "PAUSE" );
    return 0;
}

Przepraszam że nie wpisałem kodu w funkcję (?) dla niego, próbowałem użyć <code> </code> ale nie działa :P

A teraz problem - gdy napisałem ten programik, wszystko działało. Programik się zapętlał, obliczał itp. więc go zapisałem i wyłączyłem. Później, gdy chciałem się pochwalić przed kolegą (nic nie zmieniałem!), zapętlenie już nie działa. Po obliczeniu np. sumy jest "wciśnij dowolny klawisz aby kontynuować" i można tylko wyłączyć... Prawdopodobnie nieopatrznie coś zmieniłem - a teraz moje pytanie: Co jest tutaj źle?


//SeaMonster131: » Kurs STC » Kolorowanie składniKolorowanie składni języka C++ lekcja
P-48222
konri1990
odpowiedz
» 2012-01-14 20:47:12
Musisz zmienić warunek w pętli do{} while. Zmień = (podstawienie), na != (różne), i będzie dobrze:)
Tak to powinno wyglądać:>
while (a!=0);
P-48224
SeaMonster131
» 2012-01-14 20:53:20
} while( a = 0 );

= to operator przypisania :)
== to operator porównania, lecz jak @up powiedział, musisz tutaj dać !=, ponieważ pętle do{}while można tak zapisac w Twoim wypadku:

C/C++
rob
{
    to..
} dopoki( a != 0 );
Czyli pętla ma się wykonywać, dopóki a jest różne od 0.
P-48225
darvd29
Temat założony przez niniejszego użytkownika
» 2012-01-15 11:14:55
Dzięki za pomoc!
P-48265
darvd29
Temat założony przez niniejszego użytkownika
» 2012-01-15 20:31:36
Siema! Otwarłem znów temat, ponieważ mam problem z następną lekcją, a nie chcę znów zakładać nowego tematu :)

Tak więc zadaniem w tamtej lekcji jest zrobienie gry liczbowej (autor czyta mi w myśli, już 2 raz każe zrobić to co ja chciałem bez jego zadania :D). Zrobiłem coś takiego, ale po wprowadzeniu 1 liczby program się wyłącza... Tzn. zapętlenie się zepsuło :)
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
int main()
{
    int proba;
    srand( time( NULL ) );
    int wylosowana =( rand() % 10 );
    std::cout << "Witaj w grze liczbowej. Gra polega na tym, ze uzytkownik zgaduje liczbe, a program informuje czy sie udalo. Wpisuj liczby od 1 do 10." << std::endl;
    do
    {
        std::cout << "Podaj liczbe: \t";
        std::cin >> proba;
        if( proba > wylosowana )
        {
            std::cout << "Wylosowana liczba jest mniejsza od: " << proba << std::endl;
        }
        if( proba < wylosowana )
        {
            std::cout << "Wylosowana liczba jest wieksza od: " << proba << std::endl;
        }
        if( proba == wylosowana )
        {
            std::cout << "BRAWO!! Wygrales!!! Wylosowana liczba to: " << wylosowana << std::endl;
        }
    } while( proba == wylosowana );
   
    system( "PAUSE" );
    return 0;
}

Próbowałem też "na logikę", bo nie było o tym mowy, zrobić ograniczoną liczbę szans, powiedzmy 5. Zrobiłem to tak:

C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
int main()
{
    int szansa = 6; to od ilosci szans
    int proba;
    srand( time( NULL ) );
    int wylosowana =( rand() % 10 );
    std::cout << "Witaj w grze liczbowej. Gra polega na tym, ze uzytkownik zgaduje liczbe, a program informuje czy sie udalo. Wpisuj liczby od 0 do 10. Masz 5 szans." << std::endl;
    do
    {
        std::cout << "Pozostalo prob:" << szansa - 1 << std::endl << "Podaj liczbe: \t"; tu powinno mowic ile szans zostalo i wyliczac to: )
        std::cin >> proba;
        if( proba > wylosowana )
        {
            std::cout << "Wylosowana liczba jest mniejsza od: " << proba << std::endl; warunek 1
        }
        if( proba < wylosowana )
        {
            std::cout << "Wylosowana liczba jest wieksza od: " << proba << std::endl; warunek 2
        }
        if( proba == wylosowana )
        {
            std::cout << "BRAWO!! Wygrales!!! Wylosowana liczba to: " << wylosowana << std::endl; warunek 3
        }
        if( szansa == 0 )
        {
            std::cout << "Niestety przegrales. Sprobuj jeszcze raz." << std::endl; warunek 4
        }
    } while( szansa == 0, proba == wylosowana ); tutaj dalem 2 rzeczy do nawiasu bo chcialem zrobic ze jesli jeden z tych warunkow jest spelniony to koniec zapetlenia.Ale pewnie przekombinowalem: P
   
    system( "PAUSE" );
    return 0;
}

W tym drugim kodzie jest wiele rzeczy jak mówiłem "na logikę", gdyż ich nie było jeszcze w kursie. Moje pytanie - Jestem blisko rozwiązania czy to już całkiem trudniejszy poziom i będzie to za 15 lekcji :)? Ogólnie program jest chyba ok, ale po 1 ilość szans jest ciągle taka sama (chyba wiem czemu), po 2 zapętlenie także nie działa bo wpisałem 2 warunki czy co to tam jest :), a po 3 nawet jak się wygra to zapętlenie jest dalej.  (Tak dokładniej to pkt.3 był a pkt.2 nie było zanim zacząłem kombinować z while i wpisywać 2 argumenty, bo przedtem było chyba while (szansa==0) ale jak pisałem ilość szans jest ciągle taka sama i program się nie kończy, tak samo jak jest while (proba==wylosowana))


Na koniec: wiem że trochę skomplikowałem sprawę, ale jeśli jacyś pomocni userzy są cierpliwi do takich noobów jak ja to proszę o pomoc :D
P-48329
SeaMonster131
» 2012-01-15 20:34:24
Siema! Otwarłem znów temat, ponieważ mam problem z następną lekcją, a nie chcę znów zakładać nowego tematu :)
1 temat = 1 problem.
P-48330
darvd29
Temat założony przez niniejszego użytkownika
» 2012-01-16 09:16:50
Siema... Kompilator non stop źle przypisuje klamry -.- Oto kod:
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
int main()
{
    int proba, wybor;
    int szansa = 6;
    int a;
    do
    { //klamra od do...while
        srand( time( NULL ) );
        int wylosowana =( rand() % 10 );
        std::cout << "Witaj w grze liczbowej. Wybierz opcje:" << std::endl << "[1] Zasady" << std::endl << "[2] Graj" << std::endl << "[3] Wylacz" << std::endl;
        std::cin >> wybor;
        switch( wybor )
        { //klamra od switch
        case 1:
            {
                std::cout << "1. Komputer losuje liczbe z zakresu od 0 do 10. Ty musisz ja zgadnac." << std::endl;
                std::cout << "2. Masz 5 prob. Jesli nie zgadniesz - przegrywasz." << std::endl;
                std::cout << "3. Nie wpisuj liczb innych niz z zakresu podanego wyzej, bo gra sie scrashuje." << std::endl;
                std::cout << "Wpisz 1 aby rozpoczac gre: \t";
                std::cin >> a;
            }
        case 2:
            {
                do
                {
                    std::cout << "Pozostalo prob:" << szansa - 1 << std::endl << "Podaj liczbe: \t";
                    std::cin >> proba;
                    if( proba > wylosowana )
                   
                         std::cout << "Wylosowana liczba jest mniejsza od: " << proba << std::endl;
                   
                    if( proba < wylosowana )
                   
                         std::cout << "Wylosowana liczba jest wieksza od: " << proba << std::endl;
                   
                    if( proba == wylosowana )
                   
                         std::cout << "BRAWO!! Wygrales!!! Wylosowana liczba to: " << wylosowana << std::endl;
                   
                    if( szansa == 0 )
                   
                         std::cout << "Niestety przegrales. Sprobuj jeszcze raz." << std::endl;
                   
                } while( szansa != 0, proba != wylosowana );
               
            }
        } while( wybor != 3 ); //kompilator mysli ze to jest klamra od switch
       
    case 3:
        {
            std::cout << "Zapraszam ponownie! Autor: Dawid Data" << std::endl;
        }
    } //a to klamra od do...while, a ma byc na odwrot...
   
    system( "PAUSE" );
    return 0;
}

Zapewne to dlatego że "switch" jest w instrukcji "do...while" a case 3 już poza nią... nie da się tego jakoś zrobić żeby działało?
P-48358
konri1990
» 2012-01-16 14:17:09
I dobrze myśli. Przyjrzyj się dokładnie swojemu programowi i jak zamykasz warunek w case 2:. Zaraz jak zamykasz jedna klamrą piszesz 2 klamrę która logicznie rzecz biorąc zamyka switcha. Nie wiem za bardzo co chcesz osiągnąć ale domyślam się, że poprostu ten kawełek kodu:        

} while( wybor != 3 ); //kompilator mysli ze to jest klamra od switch

Musisz przenieść na koniec switcha. Nie powiem Ci gdzie bo myślę, że i tak za dużo już podpowiedziałem:)
P-48365
« 1 » 2
  Strona 1 z 2 Następna strona