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

[c++] Zawieszanie się programu przy wpisaniu niektórych liczb.

Ostatnio zmodyfikowano 2014-01-28 18:34
Autor Wiadomość
Asvarox93
Temat założony przez niniejszego użytkownika
[c++] Zawieszanie się programu przy wpisaniu niektórych liczb.
» 2014-01-28 16:51:02
Witam! Jestem tutaj nowy i od jakiegoś czasu zacząłem się uczyć c++. Napisałem tutaj program, takiego jakby bankomatu, ale jest w nim pewien problem, którego nie mogę ogarnąć. Chodzi o to, że po zalogowaniu się i wybraniu opcji wypłata środków podajemy w polu kwotę jaką chcemy wypłacić. Jednak gdy wpiszemy tam np. 550 czy 989 to program jakby przestaje działać, zawiesza się w miejscu i nie rusza. Z innymi liczbami np. 253 sobie radzi. Jak zniwelować to zawieszanie?

O to kod:
C/C++
#include <iostream>
using namespace std;

int wybor = 1;
int stankonta = 1000;
int haslo = 12345;
int login = 55522;

void menu( int );
int wyplata();
int przelew();
int haslox();
int loginx();
int main()
{
    int ohaslo;
    int ologin;
   
   
    while( wybor != 0 )
    {
        ologin = loginx();
        ohaslo = haslox();
       
        if( ohaslo == haslo && ologin == login )
        {
            while( wybor != 0 )
            {
                menu( wybor );
            }
        }
        else
        {
            cout << "Zły login lub hasło." << endl << endl;
        }
    }
    cout << "Milego dnia\n";
   
    system( "pause" );
   
}
void menu( int )
{
   
    cout << " 1.Sprawdzanie stanu konta \n 2.Wypłata pieniedzy \n 3.Przelew\n 0.Koniec\n";
    cin >> wybor;
   
    switch( wybor )
    {
    case 1:
        cout << "Na twoim koncie znajduje sie: " << stankonta << endl;
        break;
    case 2:
        wyplata();
        break;
    case 3:
        przelew();
        break;
    case 0:
        break;
    default:
        cout << "Została wybrana zła opcja, prosze wybrac inna\n";
        break;
       
       
    }
}
int wyplata()
{
    int tablica[] = { 1, 2, 5, 10, 20, 50, 100, 200 };
    int tablicax[] = { 5, 10, 5, 10, 5, 5, 3, 1 };
    int n = 7;
    int x;
    int reszta;
   
    cout << "Prosze podac kwote jaka ma zostac wyplacona: ";
    cin >> reszta;
    x = reszta;
    if( stankonta >= reszta )
    {
        while( n >= 0 )
        {
           
            while( reszta >= tablica[ n ] )
            {
                if( tablicax[ n ] > 0 )
                {
                    reszta = reszta - tablica[ n ];
                    tablicax[ n ] = tablicax[ n ] - 1;
                }
               
            }
           
            n--;
        }
        stankonta = stankonta - x;
    }
    else
    {
        cout << "Brak srodków na koncie" << endl;
    }
    cout << "stan konta: " << stankonta << endl;
    cout << "Zostało nominałów w bankomacie : " << endl;
    for( int y = 7; y >= 0; y-- )
    {
        cout << tablica[ y ] << "zl = " << tablicax[ y ] << endl;
    }
    return 0;
}
int przelew()
{
   
    int reszta;
    cout << "Prosze podac kwote jaka ma zostac przelana: ";
    cin >> reszta;
    if( stankonta >= reszta )
    {
        stankonta = stankonta - reszta;
    }
    else
    {
        cout << "Brak srodkow na koncie" << endl;
    }
    cout << "stan konta po przelewie: " << stankonta << endl;
    return 0;
}
int haslox()
{
    int sHaslo = 0;
    cout << "Podaj haslo konta: " << endl;
    cin >> sHaslo;
    cout << endl << endl;
   
    return sHaslo;
}

int loginx()
{
    int sHaslo = 0;
    cout << "Podaj login konta: " << endl;
    cin >> sHaslo;
    return sHaslo;
}


Domyślam się, że optymalizacja leży i kwiczy, ale jak już mówiłem to moje początki:).
P-103430
leon_w
» 2014-01-28 17:03:19
C/C++
while( reszta >= tablica[ n ] )
{
    if( tablicax[ n ] > 0 )
    {
        reszta = reszta - tablica[ n ];
        tablicax[ n ] = tablicax[ n ] - 1;
    }
   
}
Myślę, że problem może być tutaj. Masz tylko jeden banknot 200-stu złotowy. Jeżeli wypłacasz więcej niż 199, to pętla:
C/C++
while( reszta >= tablica[ n ] )
{
    if( tablicax[ n ] > 0 )
    {
        reszta = reszta - tablica[ n ];
        tablicax[ n ] = tablicax[ n ] - 1;
    }
   
}
wykona się dwa razy, ale już za drugim razem nie będzie banknotu 200 zł, więc if nie jest spełniony, ale pętla nadal się wykonuje. W tym miejscu pewnie się zawiesza.
P-103432
Asvarox93
Temat założony przez niniejszego użytkownika
» 2014-01-28 18:34:37
Okey, dzięki za pomoc:). Problem został rozwiązany. Kto by pomyślał, że wystarczyło jednego else dodać:).
P-103443
« 1 »
  Strona 1 z 1