trójkąt Pascala prawie gotowy
Ostatnio zmodyfikowano 2008-06-26 10:08
kiniro Temat założony przez niniejszego użytkownika |
trójkąt Pascala prawie gotowy » 2008-06-25 16:11:51 może ktoś nie wiedzieć co to jest więc wytłumaczę. Trójkąt Pascala buduje się z wierzchołka o wartości jeden. Każdy kolejny "poziom" ma jedną liczbę więcej. Brzegi zawsze mają wartość 1. Pozostałe liczby dodając do siebie liczby leżące "na ukos" od liczby szukanej. Początek trójkąta wygląda zatem tak: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 itd. Kod wygląda tak: #include <iostream> #include <conio.h>
using namespace std; main() { long int i, r, k, max; cout << "program wypisuje trojkat Pascala\n"; cout << "podaj poziom: "; cin >> r; r = r - 1; k = r; max = r; long int tab[ r ][ k ]; for( r = 0; r <= max; r++ ) { for( k = 0; k <= max; k++ ) { tab[ r ][ k ] = 0; } } tab[ 0 ][ 0 ] = 1; tab[ 1 ][ 0 ] = 1; tab[ 1 ][ 1 ] = 1; for( long int r = 2; r <= max; r++ ) { for( long int k = 0; k <= r; k++ ) { if( r == k ) tab[ k ][ r ] = 1; if( k == 0 ) tab[ k ][ r ] = 1; tab[ r ][ k ] = tab[ r - 1 ][ k - 1 ] + tab[ r - 1 ][ k ]; } } for( r = 0; r <= max; r++ ) { for( k = 0; k <= r; k++ ) { cout << tab[ r ][ k ] << " "; } cout << endl; } getch(); return 0; }
. Powstają dwa błędy. Przy poziomie 9 program się wysypuje (błąd systemu. A nie chcę wysyłać do microsoftu :) ). Przy poziomach niższych wszystko jest ok za jednym wyjątkiem. Ostatnią liczbą mi wyskakującą jest 2 a powinno być oczywiście 1. Byłbym wdzięczny za wskazanie gdzie błądzę :) P.S. dlaczego próbując dodać zmienną do debuggera nic się nie dzieje? Gdzie jest haczyk? Korzystam z deva. |
|
DejaVu |
» 2008-06-25 16:31:30 Debuggera w Dev-C++ to ja nie ogarniam jak działa :) Proponuję debugować pod Code::Blocks => następnik Dev-C++. Obecny kurs zostanie być może pod koniec tych wakacji dostosowany do Code::Blocks. A jeśli nikt do wieczora się nie zajmie znalezieniem Twojego błędu to ja go poszukam. |
|
DejaVu |
» 2008-06-25 22:28:47 #include <iostream> #include <conio.h>
using namespace std; int main() { long int r, k, max; cout << "program wypisuje trojkat Pascala\n"; cout << "podaj poziom: "; cin >> r; r = r - 1; k = r; max = r; long int tab[ r + 1 ][ k + 1 ]; for( r = 0; r <= max; r++ ) { for( k = 0; k <= max; k++ ) { tab[ r ][ k ] = 0; } } tab[ 0 ][ 0 ] = 1; tab[ 1 ][ 0 ] = 1; tab[ 1 ][ 1 ] = 1; for( long int r = 2; r <= max; r++ ) { for( long int k = 0; k <= r; k++ ) { if( r == k ) tab[ k ][ r ] = 1; if( k == 0 ) tab[ k ][ r ] = 1; tab[ r ][ k ] = tab[ r - 1 ][ k - 1 ] + tab[ r - 1 ][ k ]; } } for( r = 0; r <= max; r++ ) { for( k = 0; k <= r; k++ ) { cout << tab[ r ][ k ] << " "; } cout << endl; } getch(); return 0; }
Wyjście: program wypisuje trojkat Pascala podaj poziom: 9 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1
|
|
kiniro Temat założony przez niniejszego użytkownika |
» 2008-06-25 23:21:29 kod faktycznie działa. Widzę modyfikacje. Ale mógłby Pan jeszcze w tym temacie zamieścić komentarze na temat moich błędów? Bo nie rozumiem tego co tam się dzieje. tzn. tej części, którą pan zmienił :] Pozdrawiam i dziękuję za pomoc |
|
DejaVu |
» 2008-06-25 23:27:50 Tablica jest numerowana od zera. Tak więc tworząc tablicę int tablica[n] tablica ma elementy od 0 do (n-1). Przechodząc pętlą, po tablicy w stylu for(int i=0;i<=n;i++) tablica[i]=rand(); wykonujesz przejścia na indeksach z zakresu 0...n, czyli wychodzisz poza zakres tablicy o jeden indeks i program w konsekwencji się wywali (lub nie jeśli szczęście dopisze). |
|
kiniro Temat założony przez niniejszego użytkownika |
» 2008-06-26 09:06:48 czyli jeśli dobrze rozumiem (chcę żeby temat był do końca wyjaśniony i zamknięty) gdybym przepuścił tablica[n] przez for (i=1; i<=n-1; i++) lub po prostu for (i=1; i<n; i++) to otrzymałbym to samo. Tak? Jeszcze sprawdzę moje przypuszczenia w praktyce ale dyskutuję tu też dla innych mogących czytać ten temat i szukających odpowiedzi. Pozdrawiam. Jest Pan dla mnie taki jak ja dla kumpli z klasy w Pascalu :). Też taka różnica w wiedzy. Dziękuję serdecznie za wyjaśnienie i pozdrawiam |
|
DejaVu |
» 2008-06-26 10:08:54 for( int i = 0; i < n; i++ ) . Jeśli zaczniesz od i=1 ominiesz zerowy indeks tablicy (czyli pierwszy element). Żadnych to konsekwencji oczywiście nie zrobi dla programu poza tym, że pamięć masz nadmiarowo zarezerwowaną. Przeczytaj sobie rozdział poświęcony tablicom - tam są te wszystkie rzeczy wyjaśnione o ile dobrze pamiętam, które poruszyłeś w tym wątku :) /edit: A jednak chyba nie :P czyli dobrze, że wyjaśniłem tu :) |
|
« 1 » |