[c] Zadanie z własnymi funkcjami

0

Dzień dobry, potrzebuję pomocy z następującym zadaniem

Dwuwymiarowa tablica wartości typu bool może być intepretowana jak reprezentacja obrazka, w której wartość true reprezentuje czarne piksle, a wartość false - białe. Napisać program, który zawiera następujące sparametryzowane funkcje:
a. Funkcję wczytującą obrazek o podanych wymiarach do tablicy, która tęz jest parametrem tej funkcji. Na standardowym wejściu czarne piksle są reprezentowane jako znak 'X', a białe przez spacje. Np obrazek 5 na 5 może być zadany jako
screenshot-20191103104622.png
b. Funkcję, która wypisuje obrazek z podanej jako parametr tablicy na standardowym wyjściu używając znaku x jako czarnego piksla.
c. Funkcję, która obraca obrazek w prawo o 90, 180 lub 270 stopni w zależności od wartości dodatkowego parametru.

Następnie napisać program testujący poprawność zdefiniowanych funkcji.

Nie wiem gdzie pojawia się problem, c jest dla mnie stosunkowo nowym językiem...

Mój kod:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

bool wczytaj(int x, int y, bool tab[x][y])
{
    char c;
        for(int i=0; i<x; i++)
        {
            for(int j=0; j<y; j++)
            {
                c=getchar();
                if (c=='X'||c=='x')
                    tab[i][j]=1;
                else
                    tab[i][j]=0;
            }
        }
    return 0;
}

void wypisz(int x, int y, int tab[x][y])
{
    for(int i=0; i<x; i++)
    {
        for(int j=0; j<y; j++)
        {
            if(tab[i][j])
                printf("X");
            else printf(" ");
        }
        printf("\n");
    }
}

bool obrot(int x, int y, bool tab[x][y], int pivot)
{
    int tmp;
    bool tmptab[x][y];
    for(int i=0; i<x; i++)
    {
        for(int j=0; j<y; j++)
        {
            tmptab[i][j]=tab[i][j];
        }
    }
    if(pivot==1)  //90
    {
        tmp=x;
        x=y;
        y=x;
        for(int i=0; i<y; i++)
        {
            for(int j=0; j<x; j++)
            {
                tab[i][j]=tmptab[x-j+1][i];
            }
        }
    }
    if(pivot==2)  //180
    {
        for(int i=0; i<x; i++)
        {
            for(int j=0; j<y; j++)
            {
                tab[i][j]=tmptab[x-i+1][y-j+1];
            }
        }

    }
    if(pivot==3) //270
    {
        tmp=x;
        x=y;
        y=x;
        for(int i=0; i<y; i++)
        {
            for(int j=0; j<x; j++)
            {
                tab[i][j]=tmptab[j][x-i+1];
            }
        }
    }
}

int main()
{
    bool tab[1000][1000];

    wczytaj(5, 5, tab);

    wypisz(5,5,tab);

    return 0;
}

przez chwilę działał, ale źle np wpisując do tablicy tylko 0, teraz po skompilowaniu pojawia się błąd, nawet nic specjalnie w nim nie zmieniłem.

Bardzo docenię każdą pomoc!

0

Dwa razy strzeliłeś sobie w stopę (sabotaż własnej pracy)

  • Zawsze wszystkie tablice muszą mieć tb[Y][X] (Ewentualnie tb[Row][Col], tb[R][C])- jeżeli robisz raz tak, raz owak to masz 50% szans gdzieś się kropnąć;
  • Wszelkie iterację muszą być poprzez zmienne y,x (Ewentualnie r,c) - jeżeli masz inaczej masz 99,9% szans kropnąć się w którymś miejscu.

Zmień program wg tych zasad i zobaczysz błędy natychmiast
Poza tym: http://forum.4programmers.net/1101404 , nawet jak sprzątaczka posprząta to i tak smrodek pozostanie.

0
_13th_Dragon napisał(a):

Dwa razy strzeliłeś sobie w stopę (sabotaż własnej pracy)

  • Zawsze wszystkie tablice muszą mieć tb[Y][X] (Ewentualnie tb[Row][Col], tb[R][C])- jeżeli robisz raz tak, raz owak to masz 50% szans gdzieś się kropnąć;
  • Wszelkie iterację muszą być poprzez zmienne y,x (Ewentualnie r,c) - jeżeli masz inaczej masz 99,9% szans kropnąć się w którymś miejscu.

Zmień program wg tych zasad i zobaczysz błędy natychmiast
Poza tym: http://forum.4programmers.net/1101404 , nawet jak sprzątaczka posprząta to i tak smrodek pozostanie.

Przyznam szczerze, że mam problem ze zrozumieniem Twoich uwag, programuję tak jak mnie nauczono i ważniejsze w tej chwili jest to żeby działał i był dla mnie zrozumiały niż żeby używać 'x' zamiast 'i'. Dlaczego wszelkie iteracje muszą być przez zmienne 'y' i 'x', w moim algorytmie wielokrotnie są potrzebne bez zmieniania ich wartości i zmienna 'i' się przydaje. Chyba, że chodzi o coś innego? Pomysł na algorytm wydaje mi się dobry, gdzie nastąpiło to "kropnięcie"?

0

Zastosuj moje rady a zobaczysz natychmiast błąd, albo możesz (autocenzura) z tym teraz oraz wiele razy w przyszłości, życzę miłych wspomnień ze stosunku.

0

Koledze wyżej chodzi o to, że raz używasz:

for(int i=0; i<x; ++i)
{
  for(int j=0; j<y; ++j)
  {
     // todo
  }
}

a raz:

for(int i=0; i<y; ++i)
{
  for(int j=0; j<x; ++j)
  {
     // todo
  }
}

Nazewnictwo zmiennych w tym wypadku ułatwiłoby Ci pracę i kolega wyżej do tego także dążył. Gdybyś zamiast x, y nazwał zmienne row, column to pewnie takich błędów by nie było. To jako pierwsza uwaga.

Jako druga, to może pytanie - dlaczego używasz statycznej tablicy [1000, 1000] a nie dynamicznej, takiej jakiej chce użyć aktualnie użytkownik?
Po trzecie, jeżeli jest to program na zaliczenie, to proponuję zabezpieczyć go przed podawaniem nieprawidłowych danych (np. ujemne liczby, obrazek większy niż zadeklarowana tablica np. 1500 na 1002).

0
wyebani napisał(a):

Koledze wyżej chodzi o to, że raz używasz:

for(int i=0; i<x; ++i)
{
  for(int j=0; j<y; ++j)
  {
     // todo
  }
}

a raz:

for(int i=0; i<y; ++i)
{
  for(int j=0; j<x; ++j)
  {
     // todo
  }
}

Nazewnictwo zmiennych w tym wypadku ułatwiłoby Ci pracę i kolega wyżej do tego także dążył. Gdybyś zamiast x, y nazwał zmienne row, column to pewnie takich błędów by nie było. To jako pierwsza uwaga.

Jako druga, to może pytanie - dlaczego używasz statycznej tablicy [1000, 1000] a nie dynamicznej, takiej jakiej chce użyć aktualnie użytkownik?
Po trzecie, jeżeli jest to program na zaliczenie, to proponuję zabezpieczyć go przed podawaniem nieprawidłowych danych (np. ujemne liczby, obrazek większy niż zadeklarowana tablica np. 1500 na 1002).

Dziękuję, nie zauważyłem, że y i x mi się pomieszały :) Jednak błąd ten ma miejsce dopiero w funkcji obrót, a funkcje wczytaj i wypisz wciąż nie działają jak powinny...
Odpowiadając na pytanie - to chwilowe rozwiązanie do testów, w tej chwili priorytetem jest dla mnie żeby program po prostu działał.

0

Wczytywanie nie działa dlatego, że błędnie używasz funkcji getchar(). Poczytaj na ten temat, a najprostszym sprawdzeniem dlaczego nie działa będzie, dodanie wypisania na ekran zawartości zmiennej c przed instrukcją warunkową w funkcji wczytaj().

Wskazówka nr 2. Proponuję użyć scanf().

3

Nie rozumiem C, ale ten kod raczej nie zadziała tak jak chciał autor

        tmp=x;
        x=y;
        y=x;

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