Błąd w działaniu programu, brak błędu przy kompilacji (Tablice-Ify)
Ostatnio zmodyfikowano 2009-12-18 14:30
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: #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. |
|
DejaVu |
» 2009-12-17 19:28:02 #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; }
|
|
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? |
|
DejaVu |
» 2009-12-17 21:21:08 Nie. To jest zwykły znak '0'. Koniec możesz uznać wtedy gdy: if( !cin >> costam ) koniec(); |
|
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! |
|
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):
#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 |
|
DejaVu |
» 2009-12-18 14:30:50 Jeden temat = jedno pytanie. W tej kwestii będę monotematyczny. |
|
« 1 » |