seawolf Napisano Listopad 22, 2006 Zgłoszenie Share Napisano Listopad 22, 2006 Witam! Próbuje napisać prosty program liczący n-ty wyraz ciągu arytmetycznego. Problem w tym, że: Podaj pierwszy wyraz ciągu: 1 Podaj wyraz który chcesz obliczyć: 1 1 wyraz ciągu równa się: 1265927056 Aby kontynuować, wciśnij enter ! Podaj wartość pierwszego wyraz ciągu: 10 Podaj wyraz który chcesz obliczyć: 1 1 wyraz ciągu równa się: 1265927056 Aby kontynuować, wciśnij enter ! czyli na końcu wykonywania programu a1=1265927056, mimo iż wcześniej inna wartośc została podana. Gdy natomiast n podam inne niż 1 wszystko jest OK. Podaj pierwszy wyraz ciągu: 2 Podaj wyraz który chcesz obliczyć: 4 Podaj r: 1 4 wyraz ciągu równa się: 5 Aby kontynuować, wciśnij enter ! Oto kod: #include <iostream> using namespace std; main() { long *n, d, a1, r, wynik; d=0; n = new long[d]; cout <<"Podaj wartość pierwszego wyraz ciągu: "; cin >>a1; cout <<"Podaj wyraz który chcesz obliczyć: "; cin >>n[d]; if (n[d]==1) { cout <<n[d]<<" wyraz ciągu równa się: "<<wynik<<'\n'; goto dalej; } else { cout <<"Podaj r: "; cin >>r; wynik=a1+(--n[d])*r; ++n[d]; cout <<n[d]<<" wyraz ciągu równa się: "<<wynik<<'\n'; } dalej: delete [] n; getchar(); return 0; } Pytanie moje brzmi tak: Czemu gdy n=1, a wartość a1 jest dowolna czemu wartość na końcu programu jest zawsze 1265927056? Debugowanie: /bin/sh -c /home/Seawolf/Programowanie/KDevelop/ciagi/debug/libtool gdb /home/Seawolf/Programowanie/KDevelop/ciagi/debug/src/ciagi -fullname -quiet (gdb) set edit off (gdb) set confirm off *** Warning: inferring the mode of operation is deprecated. *** Future versions of Libtool will require -mode=MODE be specified. Using host libthread_db library "/lib/libthread_db.so.1". (gdb) (gdb) (gdb) set print static-members off (gdb) tty /dev/pts/4 (gdb) set width 0 (gdb) set height 0 (gdb) set stop-on 1 (gdb) handle SIG32 pass nostop noprint (gdb) handle SIG41 pass nostop noprint (gdb) handle SIG42 pass nostop noprint (gdb) handle SIG43 pass nostop noprint (gdb) set print asm-demangle on (gdb) set output-radix 10 (gdb) cd /home/Seawolf/Programowanie/KDevelop/ciagi/debug/src (gdb) run Stopped due to shared library event (gdb) continue Stopped due to shared library event (gdb) continue Używam KDevelop. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
@WalDo Napisano Listopad 22, 2006 Zgłoszenie Share Napisano Listopad 22, 2006 Nie jestem programer i może jakieś bzdury piszę, ale mam wrażenie, że dla n[d]==1 nie inicjujesz zmiennej wynik, więc jej zawartość jest przypadkowa. Również przypadkowo ta sama. Jeśli zresetujesz kompa i odpalisz ten program, to pewnie wynik będzie != 1265927056. W przykładzie, który działa poprawnie n[d] != 1 więc wykonywana jest część 'else' warunku, gdzie zmienna jest inicjowana ( wynik=a1+(--n[d])*r; ) BTW w liczebnikach porządkowych piszemy '.' (kropkę) po liczbie Czyli napis "1 wyraz ciągu równa się" czytamy "jeden wyraz ciągu równa się". Jeśli chcemy czytać "pierwszy" to należy napisać "1." Tę kropkę pisze się nawet w srodku zdania. Ależ ja się przemądrzały robię... [Edit] Mam rację Sprawdziłem, fragment który zmieniłem if (n[d]==1) { wynik = a1; //TUTAJ DODAŁEM LINIĘ cout <<n[d]<<" wyraz ciągu równa się: "<<wynik<<'\n'; goto dalej; Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
seawolf Napisano Listopad 22, 2006 Autor Zgłoszenie Share Napisano Listopad 22, 2006 Dobra... poprawiłem błąd... ;/ ehh... ślepy jestem. Miałem cout <<n[d]<<" wyraz ciągu równa się: "<<wynik <<'\n'; zamiast cout <<n[d]<<" wyraz ciągu równa się: "<<a1 <<'\n'; Dzieki WalDo za odpowiedz. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
@WalDo Napisano Listopad 22, 2006 Zgłoszenie Share Napisano Listopad 22, 2006 Dzieki WalDo za odpowiedz.Troche inaczej to rozwiązełem - patrz wyżej, ale Twoje "oczywiście oczywistsze" Kurczę, zbieram się do tego programowania i zbieram i zebrać nie mogę A to fajna zabawa jest. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
seawolf Napisano Listopad 22, 2006 Autor Zgłoszenie Share Napisano Listopad 22, 2006 Troche inaczej to rozwiązełem - patrz wyżej, ale Twoje "oczywiście oczywistsze" Kurczę, zbieram się do tego programowania i zbieram i zebrać nie mogę A to fajna zabawa jest. Ojjj... to się weź za programowanie Masz racje, że to jest fajna zabawa Jeszcze raz dzięki Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
menth0l Napisano Listopad 23, 2006 Zgłoszenie Share Napisano Listopad 23, 2006 Ale namieszałeś w tym kodzie... Rozumiem że dopiero zacząłeś się uczyć programowania? Inaczej nie potrafię sobie wytłumaczyć obecności "goto" w kodzie Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
seawolf Napisano Listopad 23, 2006 Autor Zgłoszenie Share Napisano Listopad 23, 2006 Ale namieszałeś w tym kodzie... Rozumiem że dopiero zacząłeś się uczyć programowania? Inaczej nie potrafię sobie wytłumaczyć obecności "goto" w kodzie tak jestem początkujący. "ale namieszałeś w tym kodzie" masz na myśli dynamiczne tablice? program ciągle rozbudowywuje i już są wykorzystywane . "Inaczej nie potrafię sobie wytłumaczyć obecności "goto" w kodzie ". Czemu? Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
menth0l Napisano Listopad 23, 2006 Zgłoszenie Share Napisano Listopad 23, 2006 Rzuć okiem na to: GOTO Po co ci goto skoro umieściłeś go w if ? Przeskakujesz nim else które z definicji przecież nie wykona się jeśli wykona się if.. Zwróć uwagę także na inicjalizację zmiennych, bo jak widać może to później przysporzyć masę kłopotów... Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się