[C] Tablica dwuwymiarowa - wyświetlanie wierszy i kolumn

Transpluton
Użytkownik
Użytkownik
Posty: 125
Rejestracja: 1 gru 2012, o 14:45
Płeć: Mężczyzna
Lokalizacja: Zależna od przestrzeni metrycznej...
Podziękował: 94 razy

[C] Tablica dwuwymiarowa - wyświetlanie wierszy i kolumn

Post autor: Transpluton »

Kod: Zaznacz cały

#include <stdio.h>
int main()
{
    int tablica[3][3];
    int i,j;
    int k=0;
    for(i=0;i<3;i++)
        for(j=0;j<3;j++)
            tablica[i][j]=k++;
    for(i=0;i<3;i++)
    {
        printf("%3d",tablica[i][j]);
        for(j=0;j<3;j++)
            printf("%3d",tablica[i][j]);
        printf("
");
    }
    return 0;
}
Dlaczego na wyjściu zamiast otrzymać macierz 3 na 3 otrzymuję coś takiego:

Kod: Zaznacz cały

  3  0  1  2
  6  3  4  5
  9  6  7  8
Process returned 0 (0x0)   execution time : 0.016 s
Press any key to continue.
Awatar użytkownika
NogaWeza
Użytkownik
Użytkownik
Posty: 1481
Rejestracja: 22 lis 2012, o 22:24
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 147 razy
Pomógł: 300 razy

[C] Tablica dwuwymiarowa - wyświetlanie wierszy i kolumn

Post autor: NogaWeza »

Linijka 12 wszystko psuje, usuń ją.
Awatar użytkownika
morsisko
Użytkownik
Użytkownik
Posty: 9
Rejestracja: 10 lut 2015, o 17:46
Płeć: Mężczyzna
Lokalizacja: Antarktyda

[C] Tablica dwuwymiarowa - wyświetlanie wierszy i kolumn

Post autor: morsisko »

W takim razie osoba wyżej ma racje. Jeśli mogę coś zasugerować, to zmienne, które są przeznaczone do pracy w pętli(i, j) deklarowałbym właśnie w niej, tj "for(int i = 0....)", zastosowałbym też pre-inkrementacje. Co prawda zmiany te nie wpłyną znacząco na działanie programu, ale lepiej od początku uczyć się moim zdaniem dobrych praktyk.
Ostatnio zmieniony 1 maja 2016, o 12:29 przez morsisko, łącznie zmieniany 1 raz.
Awatar użytkownika
miki999
Użytkownik
Użytkownik
Posty: 8691
Rejestracja: 28 lis 2007, o 18:10
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 36 razy
Pomógł: 1001 razy

[C] Tablica dwuwymiarowa - wyświetlanie wierszy i kolumn

Post autor: miki999 »

morsisko pisze:Jeśli chcesz otrzymać macierz 3x3 (z dziewięcioma elementami) to musisz ją zadeklarować jako

Kod: Zaznacz cały

int tablica[2][2]; 
W programowniu, a przynajmniej w c++ indexy lecą od zera, dlatego int tablica[3][3] tworzy macierz 4x4.
Niestety jest to nieprawda.

Indeksowanie jest od zera, ale to nie wpływa na deklarację. Po prostu ostatnim elementem int array[length] jest array[length-1].
Awatar użytkownika
morsisko
Użytkownik
Użytkownik
Posty: 9
Rejestracja: 10 lut 2015, o 17:46
Płeć: Mężczyzna
Lokalizacja: Antarktyda

[C] Tablica dwuwymiarowa - wyświetlanie wierszy i kolumn

Post autor: morsisko »

@miki999
Racja, mój poważny błąd.
Nie wiem jak mogłem tym pomyśleć.
Awatar użytkownika
NogaWeza
Użytkownik
Użytkownik
Posty: 1481
Rejestracja: 22 lis 2012, o 22:24
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 147 razy
Pomógł: 300 razy

[C] Tablica dwuwymiarowa - wyświetlanie wierszy i kolumn

Post autor: NogaWeza »

morsisko pisze:W takim razie osoba wyżej ma racje. Jeśli mogę coś zasugerować, to zmienne, które są przeznaczone do pracy w pętli(i, j) deklarowałbym właśnie w niej, tj "for(int i = 0....)", zastosowałbym też pre-inkrementacje. Co prawda zmiany te nie wpłyną znacząco na działanie programu, ale lepiej od początku uczyć się moim zdaniem dobrych praktyk.

Lepiej uczyć się dobrych praktyk, o ile rzeczywiście są one dobre. W języku C (a przynajmniej w kompilatorach, z którymi zetknąłem się do tej pory) deklarowanie zmiennych w pętli w sposób, w jaki chciałbyś to zrobić, jest niedozwolone.
Awatar użytkownika
morsisko
Użytkownik
Użytkownik
Posty: 9
Rejestracja: 10 lut 2015, o 17:46
Płeć: Mężczyzna
Lokalizacja: Antarktyda

[C] Tablica dwuwymiarowa - wyświetlanie wierszy i kolumn

Post autor: morsisko »

@NogaWeza
Kompilator nie informuje o żadnych błędach, program wykonuje się poprawnie, więc jak widać istnieją takie kompilatory:
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C] Tablica dwuwymiarowa - wyświetlanie wierszy i kolumn

Post autor: Afish »

NogaWeza pisze:W języku C (a przynajmniej w kompilatorach, z którymi zetknąłem się do tej pory) deklarowanie zmiennych w pętli w sposób, w jaki chciałbyś to zrobić, jest niedozwolone.
Jeżeli ktoś programuje w C90, to rzeczywiście tak może być, ale ta wersja języka ma już ponad ćwierć wieku, więc naprawdę warto ruszyć do przodu (szczególnie że najnowszy standard ma już niemal 5 lat).
Awatar użytkownika
NogaWeza
Użytkownik
Użytkownik
Posty: 1481
Rejestracja: 22 lis 2012, o 22:24
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 147 razy
Pomógł: 300 razy

[C] Tablica dwuwymiarowa - wyświetlanie wierszy i kolumn

Post autor: NogaWeza »

Tak mnie nauczyli, a ja chciałem się powymądrzać, nigdzie nie sprawdziłem tej informacji no i mam za swoje. Przepraszam za wprowadzenie w błąd.
Afish
Moderator
Moderator
Posty: 2828
Rejestracja: 15 cze 2008, o 15:45
Płeć: Mężczyzna
Lokalizacja: Seattle, WA
Podziękował: 3 razy
Pomógł: 356 razy

[C] Tablica dwuwymiarowa - wyświetlanie wierszy i kolumn

Post autor: Afish »

Niestety z C i C++ jest tak, że masa wykładowców twierdzi, że zna te języki, a potem studenci uczą się dinozaurów i masy głupot. Trzeba być bardzo ostrożnym na tym gruncie, bo w ostatnich latach oba języki bardzo się rozwinęły (C11, C++14) i bardzo łatwo trzymać się starych konwencji, konstrukcji i bibliotek, które odeszły do lamusa.
Gouranga
Użytkownik
Użytkownik
Posty: 1592
Rejestracja: 16 maja 2013, o 17:56
Płeć: Mężczyzna
Lokalizacja: Trójmiasto
Podziękował: 11 razy
Pomógł: 246 razy

[C] Tablica dwuwymiarowa - wyświetlanie wierszy i kolumn

Post autor: Gouranga »

Afish, są też tacy, którzy mówią wprost "teraz można pisać tak, ale niestety podstawa programowa zakłada C89 i wam to nie zadziała".
ODPOWIEDZ