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

trójkąt Pascala prawie gotowy

Ostatnio zmodyfikowano 2008-06-26 10:08
Autor Wiadomość
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:
C/C++
#include <iostream>
#include <conio.h>

using namespace std;
main()
{
    long int i, r, k, max; //rząd, kolumna
    cout << "program wypisuje trojkat Pascala\n";
    cout << "podaj poziom: ";
    cin >> r;
    r = r - 1;
    k = r;
    max = r;
    long int tab[ r ][ k ]; //utworzyłem tablicę dwuwymiarową
    for( r = 0; r <= max; r++ )
    {
        for( k = 0; k <= max; k++ )
        {
            tab[ r ][ k ] = 0;
        }
    } //czyszczenie tablicy
    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 ];
        }
    } //obliczenie wartości komórek
    for( r = 0; r <= max; r++ )
    {
        for( k = 0; k <= r; k++ )
        {
            cout << tab[ r ][ k ] << " ";
        }
        cout << endl;
    } //wypisanie wyniku na ekranie
    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.
P-880
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.
P-881
DejaVu
» 2008-06-25 22:28:47
C/C++
#include <iostream>
#include <conio.h>

using namespace std;
int main()
{
    long int r, k, max; //rząd, kolumna
    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 ]; //utworzyłem tablicę dwuwymiarową
    for( r = 0; r <= max; r++ )
    {
        for( k = 0; k <= max; k++ )
        {
            tab[ r ][ k ] = 0;
        }
    } //czyszczenie tablicy
    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 ];
        }
    } //obliczenie wartości komórek
    for( r = 0; r <= max; r++ )
    {
        for( k = 0; k <= r; k++ )
        {
            cout << tab[ r ][ k ] << " ";
        }
        cout << endl;
    } //wypisanie wyniku na ekranie
    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
P-884
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
P-885
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).
P-886
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
P-887
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 :)
P-888
« 1 »
  Strona 1 z 1