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

Błąd w działaniu programu, brak błędu przy kompilacji (Tablice-Ify)

Ostatnio zmodyfikowano 2009-12-18 14:30
Autor Wiadomość
Rantrave
Temat założony przez niniejszego użytkownika
Błąd w działaniu programu, brak błędu przy kompilacji (Tablice-Ify)
» 2009-12-17 19:16:16
Witam wszystkich!

Jak to bywa przy próbie rozwiązania  jakiegoś problemu zaczyna się googlować i tak oto znalazłem tą stronkę. Po kilkunastu próbach rozwiązania pewnego problemu programistycznego rozkładam ręce bo nie wiem czy i gdzie jest błąd. Jak dla mnie mój program jest dobrze napisany i powinien działać OK, natomiast jak wykonuje go nie jest jak chcę :/

Problem:
Program ma w 10-elementowej tablicy symulować działanie stosu, odpowiednio od wydanych poleceń ma dodawać liczby do stosu lub odejmować.
Dla znaku '+' ma w nowej linijce przyjąć jakąś liczbę i ją dodać do stosu, dla '-' ma zdjąć liczbę z góry stosu i pokazać ją na wyjściu. Jeśli przy '+' będzie wszystko OK ma na wyjściu pojawić się ':)' jak  będzie '+' lub '-' i będzie błąd na wyjściu ma pojawić się ':(' (czyli jak zostanie przekroczona tablica/brak liczby w stosie
Do programu przez stronę zostanie z pliku wysłana pewna ilość danych testowych.
Przy wykonaniu programu u mnie pojawia się parę błędów :
przy odejmowaniu liczby ze stosu po '-' zamiast pokazać się liczba z tablicy pojawia się najpierw 1237912462917643291764291763921 (jakaś dziwna liczba) potem przy następnym '-' pojawia się liczba,
w głównej pętli mam warunek zakończający pętlę, jednakże jakoś nie chce działać
jeśli dane są pobierane z pliku jak to można obejść tak aby program wiedział że jest koniec pliku i ma się skończyć?

Mój kod:
C/C++
#include <iostream>

int main()
{
    using namespace std;
    int tablica[ 10 ];
    char znak;
    int i = 0;
    int wpis = 0;
   
    do
    {
        cin >> znak;
       
        if( znak == '+' )
        {
            if( i <= 9 || i > 0 )
            {
                cin >> tablica[ i ];
                cout << ":)";
                cout << endl;
                i = i + 1;
            }
           
            if( i == 0 && wpis == 0 )
            {
                cin >> tablica[ i ];
                cout << ":)";
                cout << endl;
                wpis = 1;
                i = i + 1;
            }
           
            if( i == 10 )
            {
                cout << ":(";
                cout << endl;
            }
        }
       
        if( znak == '-' )
        {
            if( i > 0 || i <= 9 )
            {
                i = i - 1;
                cout << tablica[ i ];
                cout << endl;
               
            }
           
            if( i == 0 && wpis == 0 )
            {
                cout << ":(";
                cout << endl;
            }
           
            if( i == 0 && wpis == 1 )
            {
                cout << tablica[ i ];
                cout << endl;
                wpis = 0;
            }
        }
    }
    while( znak = 0 );
   
    return 0;
}

Pozdrawiam.
P-12256
DejaVu
» 2009-12-17 19:28:02
C/C++
#include <iostream>

int main()
{
    using namespace std;
    int tablica[ 10 ];
    char znak;
    int i = 0;
   
    do
    {
        cin >> znak;
       
        if( znak == '+' )
        {
            if( i < 10 )
            {
                cin >> tablica[ i ];
                cout << ":)";
                cout << endl;
                i = i + 1;
            } else
            {
                cout << ":(";
                cout << endl;
            }
        }
       
        if( znak == '-' )
        {
            if( i > 0 )
            {
                i = i - 1;
                cout << tablica[ i ];
                cout << endl;
               
            } else
            {
                cout << ":(";
                cout << endl;
            }
           
        }
    }
    while( znak != '0' );
   
    return 0;
}
P-12257
Rantrave
Temat założony przez niniejszego użytkownika
» 2009-12-17 20:12:14
Uruchamiając program wszystko u mnie działa na komputerze, nie wyrzuca dziwnych losowych liczb przy minusie, jednakże SPOJ, wyrzuca błędna odpowiedź i o dziwo przy tym zadaniu nie mogę uzyskać rezultatu odpowiedzi, no cóż chyba będę musiał u prowadzącego zajęcia zorientować się co nie tak tym razem.

Dzięki wielkie za poprawkę jednakże mam tylko pytanie do warunku kończącego pętlę:
Czy != '0' jest ogólnie jakimś znakiem końca pliku z którego są wprowadzane dane? Czy jak to tam jest z tym plikiem?
P-12258
DejaVu
» 2009-12-17 21:21:08
Nie. To jest zwykły znak '0'. Koniec możesz uznać wtedy gdy:
C/C++
if( !cin >> costam )
     koniec();
P-12259
Elaine
» 2009-12-17 21:27:24
Ten if nie wykona się, jeśli cin będzie miał ustawioną flagę eof/bad/fail. Ten if wykona się wtedy i tylko wtedy, gdy cin będzie w stanie good, a costam będzie wartością całkowitą równą 0. Jeśli costam będzie większe niż 0 i mniejsze niż rozmiar int w bitach, to if się nie wykona; jeśli costam będzie większe niż rozmiar int w bitach to mamy undefined behavior; jeśli costam nie jest typu całkowitego to mamy błąd kompilacji. Czytaj - nawiasy!
P-12260
Rantrave
Temat założony przez niniejszego użytkownika
» 2009-12-18 12:15:49
Warunek while( znak != '0') nie kończy pętli. Pętla powtarzała się w nieskończoność co powodowało wykrzaczeniem się programu. Natomiast udało mi się znaleść na forumach rocznikowych, że warunek scanf(%c, &zmienna) == 1 kończy działanie programu, z racji, że nie zabardzo rozumiem koncepcji scanf z C, udało mi się znaleść dobry zamiennik czyli

while(cin >> znak) i to już kończyło pętle. Co do błędnego rezultatu, ktoś przerobił jeszcze kod podany przez Piotr Szawdyński z tą różnicą, że dodał continue; na końcu ifów z + i - które dawały rezultat :) lub zdjęcie liczby.

Tutaj zmieniony już kod(może komuś się przyda):
C/C++
#include <iostream>

int main()
{
    using namespace std;
    int tablica[ 10 ];
    char znak;
    int i = 0;
   
    while( cin >> znak )
    {
       
        if( znak == '+' )
        {
            if( i <= 9 && i >= 0 )
            {
                cin >> tablica[ i ];
                cout << ":)";
                cout << endl;
                i++;
                continue;
            }
           
           
            if( i == 10 )
            {
                cout << ":(";
                cout << endl;
            }
        }
       
        if( znak == '-' )
        {
            if( i > 0 && i <= 10 )
            {
                i--;
                cout << tablica[ i ];
                cout << endl;
                continue;
            }
           
           
            if( i == 0 )
            {
                cout << ":(";
                cout << endl;
            }
        }
    }
   
    return 0;
}

@Iname
Flaga, eof/bad fail, chodzi o to, że cin przyjmie tą wartość?
Aaaaa i jeszcze jedno pytanko co robi continue? :X?

Pozdrawiam
P-12269
DejaVu
» 2009-12-18 14:30:50
Jeden temat = jedno pytanie. W tej kwestii będę monotematyczny.
P-12271
« 1 »
  Strona 1 z 1