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

[XI. Tworzenie warunków złożonych if ... else] Problem z zadaniem 2

Ostatnio zmodyfikowano 2010-07-12 08:36
Autor Wiadomość
Savail
Temat założony przez niniejszego użytkownika
[XI. Tworzenie warunków złożonych if ... else] Problem z zadaniem 2
» 2010-07-11 17:34:02
Witam
Edycja: Żal mi siebie ;d, zapomnialem dodac biblioteke cctype na poczatku i zapomnailem usunac break; z else{} na koncu kodu(eksperymentowalem).Tutaj jest nowy link:
http://rapidshare.com/files/406366327/kino2.rar

Wiec problem jest taki ze nie rozpoznaje mi cyfr ani liter w polu zawsze wykonuje instrukcje w else na koncu. A gdy sie wpisze w polu jakies litery to pojawia sie pozadany komunikat o bledzie ale nie znika nawet po uzyciu metody clrscr z biblioteki ddtconsole.h (zaraz po while jest clrscr();)

Edycja:Teraz zauwazylem ze jak sie doda znak ! do kazdego isdigit(wybor) to program bedzie odroznial liczby od liter chociaz to nielogiczne ale tak dziala. Niestety problem z literami nadal jest ;/
P-19766
Pirotechnik
» 2010-07-11 18:03:15
Trochę chaotycznie napisane a poza tym podaj kod
P-19769
Savail
Temat założony przez niniejszego użytkownika
» 2010-07-11 18:08:41
C/C++
#include <conio.h>
#include <iostream>
#include <string>
#include "ddtconsole.h"
#include <cctype>
int main()
{
    using namespace std;
    using namespace ddt::console;
    int wybor, ilosc[ 4 ] = { 20, 20, 20, 20 }, ile = 0;
    cout << "Wcisnij klawisz enter aby wyswietlic menu lub klawisz Esc aby zamknac program" << endl;
    while( getch() != 27 ) {
        clrscr();
        struct dane {
            int nr;
            string seans;
            int bilety;
        };
        dane filmy[ 4 ] = {
            { 1, "Bolek i Lolek", ilosc[ 0 ] },
            { 2, "Killer", ilosc[ 1 ] },
            { 3, "Krzyzacy", ilosc[ 2 ] },
            { 4, "Zmierzch", ilosc[ 3 ] }
        };
        cout << "Kino Twoja Stara zaprasza" << endl << "Dzisiejsza oferta to:" << endl << endl;
        for( int i = 0; i < 4; i++ ) {
            cout << filmy[ i ].nr << " " << filmy[ i ].seans
            << endl;
        }
        cout << endl << "Wybierz nr: ";
        cin >> wybor;
        if( isdigit( wybor ) && wybor == filmy[ 0 ].nr && filmy[ 0 ].bilety > 0 || isdigit( wybor ) && wybor == filmy[ 1 ].nr && filmy[ 1 ].bilety > 0 || isdigit( wybor ) && wybor == filmy[ 2 ].nr && filmy[ 2 ].bilety > 0 || isdigit( wybor ) && wybor == filmy[ 3 ].nr && filmy[ 3 ].bilety > 0 ) {
            cout << "Wybrano seans " << filmy[ wybor - 1 ].seans << ". Wolnych miejsc: " << filmy[ wybor - 1 ].bilety << endl;
            cout << "Ile biletow chcesz kupic na seans ?";
            cin >> ile;
            if( ile > 0 && ile <= ilosc[ wybor - 1 ] ) {
                ilosc[ wybor - 1 ] -= ile;
                cout << "Bilety zostaly kupione. Aby wrocic do menu wcisnij enter. Aby zamknac program wcisnij Esc";
            }
            else if( ile > ilosc[ wybor - 1 ] ) {
                cout << endl << "Nie ma wystarczajaco duzo wolnych miejsc. Aby wrocic do menu wcisnij enter. Aby zamknac program wcisnij Esc";
            }
        }
        else {
            cout << endl << "Wybrano nieistniejacy nr. Aby wrocic do menu wcisnij enter. Aby zamknac program wcisnij Esc";
        }
    }
}
I tak jak mowilem, jesli do kazdego isdigit dodamy ! to zlikwidujemy problem z nierozpoznawaniem znaków
P-19770
Pirotechnik
» 2010-07-11 19:56:12
po jaką cholerę używasz isdigit??
P-19772
VND
» 2010-07-11 20:02:50
Isdigit zawsze zwróci fałsz ponieważ jej argumentem powinna być zmienna typu char a w niej reprezentacja ASCII danego znaku.
isdigit( wybor + '0' )
Ten zapis rozwiązuje sprawę. Poszczególne warunki pomiędzy || powinny być rozdzielone nawiasami.
if(( isdigit( wybor + '0' ) && wybor == filmy[ 0 ].nr && filmy[ 0 ].bilety > 0 ) ||( isdigit( wybor + '0' ) && wybor == filmy[ 1 ].nr && filmy[ 1 ].bilety > 0 ) ||( isdigit( wybor + '0' ) && wybor == filmy[ 2 ].nr && filmy[ 2 ].bilety > 0 ) ||( isdigit( wybor + '0' ) && wybor == filmy[ 3 ].nr && filmy[ 3 ].bilety > 0 ) )
 Strukturę deklaruj tylko raz, niepotrzebnie dałeś ją do pętli.
Tablica ilość jest Ci do niczego niepotrzebna - ilość biletów przechowujesz w strukturze.
Jeśli zrobisz bazę na 100 filmów to dodasz wszystkie sto warunków do ifa? ;) Ten i tak jest już za długi, pętla będzie wygodniejsza.
Używanie "magicznych numerków" w programie to kiepski pomysł, przy każdej zmianie ilości filmów trzeba przerabiać wiele miejsc. Lepiej zdeklarować jakąś stałą.
Funkcja main powinna coś zwracać.
Używanie conio.h nie jest specjalnie polecane, ale nie będę się już rozpisywał i tak chyba za dużo wystukałem.
C/C++
#include <conio.h>
#include <iostream>
#include <string>
#include <windows.h>

using namespace std;
#define ILEFILMOW 4

int main()
{
    int ile = 0;
    int wybor;
   
    struct dane
    {
        int nr;
        string seans;
        int bilety;
    };
    dane filmy[ ILEFILMOW ] =
    {
        { 1, "Bolek i Lolek", 20 },
        { 2, "Killer", 20 },
        { 3, "Krzyzacy", 20 },
        { 4, "Zmierzch", 20 }
    };
    cout << "Wcisnij klawisz enter aby wyswietlic menu lub klawisz Esc aby zamknac program" << endl;
    while( getch() != 27 )
    {
        system( "cls" );
        cout << "Kino Twoja Stara zaprasza" << endl << "Dzisiejsza oferta to:" << endl << endl;
        for( int i = 0; i < ILEFILMOW; i++ )
        {
            cout << filmy[ i ].nr << " " << filmy[ i ].seans << endl;
        }
        cout << endl << "Wybierz nr: ";
        cin >> wybor;
       
        bool znalazl = false;
        for( int i = 0; i < ILEFILMOW; i++ )
        {
            if( isdigit( wybor + '0' ) && wybor == filmy[ i ].nr && filmy[ i ].bilety > 0 )
            { znalazl = true; break; } // break aby oszczędzić czas ;)
        }
       
        if( znalazl )
        {
            cout << "Wybrano seans " << filmy[ wybor - 1 ].seans << ". Wolnych miejsc: " << filmy[ wybor - 1 ].bilety << endl;
            cout << "Ile biletow chcesz kupic na seans ?";
            cin >> ile;
            if( ile > 0 && ile <= filmy[ wybor - 1 ].bilety )
            {
                filmy[ wybor - 1 ].bilety -= ile;
                cout << "Bilety zostaly kupione. Aby wrocic do menu wcisnij enter. Aby zamknac program wcisnij Esc";
            }
            else
            {
                cout << endl << "Nie ma wystarczajaco duzo wolnych miejsc. Aby wrocic do menu wcisnij enter. Aby zamknac program wcisnij Esc";
            }
        }
        else
        {
            cout << endl << "Wybrano nieistniejacy nr. Aby wrocic do menu wcisnij enter. Aby zamknac program wcisnij Esc";
        }
    }
    return 0;
}

Edit:
isdigit będzie działać jeśli w bazie będzie maksymalnie 10 filmów (0-9).
Jak wspomniał poprzednik to sprawdzenia jest niepotrzebne.

P-19773
Savail
Temat założony przez niniejszego użytkownika
» 2010-07-11 20:52:44
VND znowu pomogles!Twoje porady i uwagi sa dla mnie bardzo cenne. Dzięki za poświęcony czas!:D Zauwaz jednak ze jesli w jakims polu wpiszemy litere to wyswietli sie komunikat ale juz nie zniknie nawet po nacisnieciu klawisza enter. Jak zlikwidować ten problem?
P-19777
VND
» 2010-07-11 23:40:38
Trzeba podrasować wybór ;)
C/C++
while( !( cin >> wybor ) )
{
    cin.clear();
    cin.sync();
}
P-19791
Savail
Temat założony przez niniejszego użytkownika
» 2010-07-12 08:36:12
Działa ^^, jeszcze raz dzięki za pomoc!
P-19797
« 1 »
  Strona 1 z 1