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

Maly problem. Zadanie 11.6 - 2 (powtarzajaca sie w nieskonczonosc petla)

Ostatnio zmodyfikowano 2010-04-19 17:02
Autor Wiadomość
Hajt.MoRuS
Temat założony przez niniejszego użytkownika
Maly problem. Zadanie 11.6 - 2 (powtarzajaca sie w nieskonczonosc petla)
» 2010-04-18 20:57:20
Tak jak w temacie, mam problem z tym zadaniem. Kiedy chce zakonczyc program, wciskam litere 'z' badz 'Z' i wtedy petla powtarza sie w nieskonczonosc. Kiedy ta linijke
} while( film != koniec[ 0 ] );
zmienie na ta
} while( film == koniec[ 0 ] );
petla wykona sie tylko jeden raz. W czym tkwi problem? Prosze o podpowiedz ;d
C/C++
#include <iostream>
#include <conio.h>

int main()
{
    using namespace std;
   
    cout << "Kino Relax zaprasza!" << endl;
    cout << "Dzisiejsza oferta filmow to:" << endl;
    cout << "1. Transporter\t2. 2Fast 2Forious" << endl;
    cout << "3. Zohan\t4. Rocky" << endl;
   
    int bilety;
    int miejsca[ 4 ] =
    {
        20,
        20,
        20,
        20,
    };
    int film;
    char koniec[ 2 ];
    koniec[ 0 ] = 'z';
    koniec[ 1 ] = 'Z';
    koniec[ 2 ] = 'p';
   
    do {
        cout << "Wybierz seans na ktory chcesz isc: ";
        cin >> film;
       
        if( film == 1 )
        {
            cout << "Wybrales film Transporter." << endl;
            cout << "Liczba dostepnych miejsc: " << miejsca[ 0 ];
            cout << "\nIle chcialbys kupic biletow? ";
            cin >> bilety;
            miejsca[ 0 ] -= bilety;
            if( miejsca[ 0 ] <= 0 )
            {
                cout << "Nie ma tylu biletow lub miejsc" << endl;
                miejsca[ 0 ] += bilety;
            }
        }
       
        if( film == 2 )
        {
            cout << "Wybrales film 2Fast 2Forious" << endl;
            cout << "Liczba dostepnych miejsc: " << miejsca[ 1 ];
            cout << "\nIle chcialbys kupic biletow? ";
            cin >> bilety;
            miejsca[ 1 ] -= bilety;
            if( miejsca[ 1 ] <= 0 )
            {
                cout << "Nie ma tylu biletow lub miejsc" << endl;
                miejsca[ 1 ] += bilety;
            }
        }
        if( film == 3 )
        {
            cout << "Wybrales film Zohan" << endl;
            cout << "Liczba dostepnych miejsc: " << miejsca[ 2 ];
            cout << "\nIle chcialbys kupic biletow? ";
            cin >> bilety;
            miejsca[ 2 ] -= bilety;
            if( miejsca[ 2 ] <= 0 )
            {
                cout << "Nie ma tylu biletow lub miejsc" << endl;
                miejsca[ 2 ] += bilety;
            }
        }
        if( film == 4 )
        {
            cout << "Wybrales film Rocky" << endl;
            cout << "Liczba dostepnych miejsc: " << miejsca[ 3 ];
            cout << "\nIle chcialbys kupic biletow? ";
            cin >> bilety;
            miejsca[ 3 ] -= bilety;
            if( miejsca[ 3 ] <= 0 )
            {
                cout << "Nie ma tylu biletow lub miejsc" << endl;
                miejsca[ 3 ] += bilety;
            }
        }
    } while( film != koniec[ 0 ] );
   
    cout << "\nKoniec programu" << endl;
   
    getch();
    return 0;
}
P-16226
jacek_k
» 2010-04-18 21:12:49
Do zmiennej int wczytujesz znak, zatem w tym tkwi błąd (zmienna film powinna być typu char). Poza tym w jednym miejscu piszesz po pamięci
  char koniec[2];
  koniec[0] = 'z';
  koniec[1] = 'Z';
  koniec[2] = 'p';
P-16228
Hajt.MoRuS
Temat założony przez niniejszego użytkownika
» 2010-04-18 21:41:35
Do zmiennej film wczytuje cyfry, jezeli podmienie int na char to nie wybiore na ktory film chce pojsc ... i nie wiem o co ci chodzi z tym pisaniem po pamieci.
P-16229
madmike44
» 2010-04-19 07:36:09
Element koniec[0] to znak (konkretnie 'z'), a ty w warunku while(film == koniec[0]) dokonujesz porównania liczby całkowitej ze znakiem 'z', czyli z reprezentacją znaku 'z' w kodzie ASCII - a to jest akurat 122. Natomiast jeżeli z konsoli wczytasz do inta znak inny niż jakąś liczbę, to w tej zmiennej całkowitej będziesz miał jakąś wartość, która nie będzie wynosić 122, przy wpisaniu znaku 'z'. Taki warunek: (film == koniec[0]) jest błędny, ponieważ program będzie działał tylko, jeżeli do zmiennej wpiszemy wartość 122. A chodzi nam o coś zupełnie odwrotnego.

Jeżeli chcesz, to możesz to zrobić na znakach - bo cyfry 0-9 można traktować jak znaki.

Zmiany, jakie musisz wprowadzić, to:

Zamiana
int film;
 na
char film;
Zamiana warunków
if( film == 1 )
 na
if( film == '1' )
Zamiana warunku
while( film != koniec[ 0 ] )
 na
while( film != 'z' && film != 'Z' )

Możesz też oczywiście potraktować to tak, że zostawić wszystko tak, jak jest, a sprawdzać jedynie, czy liczba wpisana do zmiennej "film" jest z przedziału 1-4. Wtedy każda inna wartość będzie traktowana jak chęć wyjścia z programu.
P-16230
GoldWolf
» 2010-04-19 08:36:23
madmike44 To nie zadziała! Strumień czeka na liczbę a dostaje literę i ustawia flagę błędu!
W tym wypadku najlepiej posłużyć się cyframi. Czyli np.5 to koniec.
Nie musisz używać tej tablicy, którą i tak źle zadeklarowałeś!

Radzę się też zapoznać dokładnie z 7.3. Kłopoty przy wprowadzaniu tekstu, aż do końca kursu!
P-16231
madmike44
» 2010-04-19 09:31:38
Fakt - nie można tak wpisać znaku do inta. Tego nie sprawdziłem. Ale mając zmienną "film" typu znakowego spokojnie może zrobić to co chce - czyli zamknięcie programu po wprowadzeniu litery "z".

Pomijając już takie rzeczy, że do dwuelementowej tablicy Hajt.MoRuS chce wpisać 3 elementy :)
P-16232
Hajt.MoRuS
Temat założony przez niniejszego użytkownika
» 2010-04-19 17:02:39
Ok dzieki chlopaki udalo mi sie zrobic to zadanko ;d Pewnie bede mial problem z kolejnym, ale poczekamy zobaczymy ;d Problem rozwiazany - zamykam temat.
P-16235
« 1 »
  Strona 1 z 1