Skocz do zawartości

[c++] Mały Problem.


seawolf

Rekomendowane odpowiedzi

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

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ę... B);)

 

[Edit] Mam rację :D 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

Troche inaczej to rozwiązełem - patrz wyżej, ale Twoje "oczywiście oczywistsze" :P

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 :P

Odnośnik do komentarza
Udostępnij na innych stronach

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? :P 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

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ę
×
×
  • Dodaj nową pozycję...