Zadanie z tablicą do sprawdzenia

0

Mam takie zadanie:

W tablicy b rozmiaru n wierszy i m kolumn, wszystkie elementy pierwszego wiersza i pierwszej kolumny przyjmują wartość 0, a pozostałe elementy m-tej kolumny przyjmują wartość 20. Wewnętrzne elementy tablicy oblicza się według wzoru:

bi+1,j = 0.5(bi,j-1 + bi,j-1), i = 1,2, .. n - 1 , j = 2,3, ... m -1

Napisać funkcję wyznaczającą wartość tablicy b.

Jak to poprawić aby zamiast b_i było b przy dolnym indeksie i ?

void(B[n][m])
{
    int i,j;
    
    for(i = 0; i < n; i++)
    {
        B[i][0] = 0;
    }
    for(j = 0; j < m; j++)
    {
        B[0][j] = 0;
    }
    for(i = 1; i < n; i++)
    {
        B[i][m] = 20;
    }
    
    for(i = 1; i < n; i++)
    {
        for(j = 2; j < m; j++)
        {
            B[i + 1][j] = 0.5 * (B[i][j + 1] + B[i][j - 1]);
        }
    }
}
0
  1. W C/C++ indeksacja od 0
  2. Poczytaj o funkcjach bo ci się myli z tablicami
  3. Zawsze możesz bezboleśnie zamienić: T[x+1]=f(T[x]) na T[x]=f(T[x-1])
0

to ostatnie 2 pętlę są złe ? jak indeksacja ma zaczynać się od zera?

for(i = 1; i < n; i++)
    {
        for(j = 2; j < m; j++)
        {
            B[i + 1][j] = 0.5 * (B[i][j + 1] + B[i][j - 1]);
        }
    } 
0

Wygląda na to że musisz zacząć od przeczytania jakiegoś kursu.
Sklejanie kodu na chybił trafił z góry skazane na porażkę.

0

Czytałem tylko pod c++ i dla mnie te pętlę są dobre. W C nie można tak jak tutaj napisałem w tych dwóch ostatnich pętlach ? W czym ja robię błąd ?

Na początku wyzerowałem 1 kolumna, potem wyzerowałem 1 wiersz. Potem nadałem wartość 20 dla pozostałych elementów m-tej kolumny oprócz dla [0][m] ponieważ już dla tego indeksu nadałem wartość w zerowaniu wiersza.
Potem dla pozostałych elementów tablicy podstawiam wzór z zadania.

Co tu jest źle ?

0

Trzy podstawowych błędy wymieniłem tu: http://4programmers.net/Forum/1092765

0
for(i = 1; i < n; i++)
    {
        for(j = 2; j < m; j++)
        {
            B[i][j] = 0.5 * (B[i - 1][j + 1] + B[i][j - 1]);
        }
    }

Bo robiłem to na podstawie wzoru, a ma się zaczynać od i = 1, a dla j = 2.
Teraz trochę lepiej ?

0

Nie zgadniesz, trzeba myśleć nie zgadywać.
Teraz masz totalną kaszane.

0

W 1 poście w tej ostatniej podwójnej pętli przepisałem ten wzór, to wzór jest zły ?
Wiersze mają się zaczynać od i = 1 i kolumny od j = 2 i też tak zrobiłem w pętlach.
A środek pętli to wzór z treści zadania.

0

Wzór jest dobry, ale w matematyce indeksowanie jest od 1 zaś w C/C++ od 0, więc wzór trzeba przerobić.
Poza tym jeżeli c jest funkcją od b zaś b jest funkcją od a to obliczenia trzeba zacząć od b (nie od c).

0

Nadal nie wiem jak ten wzór mogę inaczej rozpisać ?

To mam przerobić tak aby najpierw wpisywał wartość do elementu [0][0] ? Bo przecież już pierwsza kolumna i pierwszy wiersz oraz m-ta kolumna jest zapełniona. Wnętrze trzeba wypełnić.

0

Wywal to co napisałeś i napisz jeszcze raz patrząc tylko na wzór matematyczny oraz pamiętając o indeksacji od zera, po czym porównaj z tym co zrobiłeś wcześniej.

0

Patrzę się w ten wzór i nie wiem jak to inaczej mógłbym zapisać. Mam i+1,j więc zaczynam nadawać wartości od elementu
B[i + 1][j]

Lepiej: ?

 for(i = 0; i < n; i++)
    {
        for(j = 2; j < m; j++)
        {
            B[i + 1][j] = 0.5 * (B[i][j + 1] + B[i][j - 1]);
        }
    } 
0
for (int i = 0; i < n - 1; ++i)
    for (int j = 1; j < m - 1; ++j)
        B[i+1][j] = 0.5 * (B[i][j-1] + B[i][j+1]);
0

Mogę wiedzieć czemu zacząłeś od j = 1 i zmodyfikowałeś trochę wzór ?? ze wzoru (B[i][j + 1] + B[i][j - 1]) zrobiłeś: (B[i][j-1] + B[i][j+1]). Dlaczego tak je j pozmieniałeś ?

A jaka jest różnica między B[i][j-1]+B[i][j+1] a B[i][j+1]+B[i][j-1]?
Bo w C++ druga kolumna ma indeks 1, a nie 2. Zresztą pomyśl, przy Twoim kodzie, gdzie są wypełniane elementy B[1][1], B[2][1], B[3][1] itd.?

0

a zerowanie kolumn i wierszy mam ok ?
Nie istnieją elementy o indeksach B[i][m]

0

Jeśli pierwsza (1-sza) kolumna ma indeks 0, to jaki indeks ma kolumna m-ta?

0

indeks m. Bo m to ostatnia kolumna

0

m - jest ostatnią kolumną w matematyce, ponieważ indeksacja jest od 1. W C/C++ indeksacja od 0.

1

Brakuje Ci bardzo podstawowej wiedzy z C++. Popatrz na swój własny kod:

for(j = 0; j < m; j++)
{
    B[0][j] = 0;
}

Zerujesz cały pierwszy wiersz, ale nigdy nie osiągasz kolumny o indeksie m. Dlaczego?
Bo kolumna m-ta ma indeks m-1

0

w pętli for mam j < m, czyli będzie o jeden mniejsze od m czyli m - 1.

1 użytkowników online, w tym zalogowanych: 0, gości: 1