C - wskaźniki na tablice dwuwymiarowe

0

Witam, mam mały problem ze wskaźnikami do tabliucy dwuwymiarowej. Wszystkie funkcje są jasne mam nadzieje i uprzejmie bym prosił powiedzieć gdzie robie błąd i co poprawić. Próbowałem różnych sposobów i zawsze po kompilacji program i tak wyrzuca błąd. Muszę na zajęcia na uczelnie zrobić kilka programów z tablicami i macierzami dlatego postanowiłem to zrobić na wskaźnikach żeby funkcje były jak najbardziej przenośne ale niestety nic nie działa. Pomóżcie ^^

/* LAB_02
 *
 * zad1.c - suma dwoch tablic 10x10
 *
 * autor: Staszek Misztalski
 *
 * created on Code::Blocks
 *
 */

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

void losuj_do_tablicy(int**);
void wypisz_tablice(int**);
int losuj_calkowita();

int main()
{
    int zarodek;
    int tab_a[10][10], tab_b[10][10];
    int **p_tab_a, **p_tab_b;

    p_tab_a = tab_a;
    p_tab_b = tab_b;

    zarodek = time(NULL);
    srand(zarodek);
    losuj_do_tablicy(p_tab_a);
    losuj_do_tablicy(p_tab_b);

    printf("TABLICA PIERWSZA:\n");
    wypisz_tablice(p_tab_a);
    printf("\n\n");
    printf("TABLICA DRUGA:\n");
    wypisz_tablice(p_tab_b);

    return 0;
}

int losuj_calkowita()
{
    int liczba;
    liczba = rand();

    return liczba;
}

void losuj_do_tablicy(int **tab)
{
    int i,j;
    for(i=0;i<10;i++)
    {
        for(j=0;j<10;j++)
        {
            * (*(tab+i)+j) = losuj_calkowita();
        }
    }
}

void wypisz_tablice(int **tab)
{
    int i,j;
    printf("\nOto liczby zapisane w twojej tablicy:");
    for(i=0;i<10;i++)
    {
        for(j=0;j<10;j++)
        {
            printf("\ntab[%d] = %d",i, *(*(tab+i)+j));
        }

    }
}
0

Kompilowane pod devem


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

void losuj_do_tablicy(int*);
void wypisz_tablice(int*);
int losuj_calkowita();

int main()
{
    int zarodek;
    int tab_a[10][10], tab_b[10][10];
    int *p_tab_a, *p_tab_b;

    p_tab_a = &tab_a[0][0];
    p_tab_b = &tab_b[0][0];

    zarodek = time(NULL);
    srand(zarodek);
    losuj_do_tablicy(p_tab_a);
    losuj_do_tablicy(p_tab_b);

    printf("TABLICA PIERWSZA:\n");
    wypisz_tablice(p_tab_a);
    printf("\n\n");
    printf("TABLICA DRUGA:\n");
    wypisz_tablice(p_tab_b);

    for(;;); 
    return 0;

}

int losuj_calkowita()
{
    int liczba;
    liczba = rand();

    return liczba;
}

void losuj_do_tablicy(int *tab)
{
    int i,j;
    for(i=0;i<10;i++)
    {
        for(j=0;j<10;j++)
        {
             *((tab+i*sizeof(int))+j) = losuj_calkowita();
        }
    }
}

void wypisz_tablice(int *tab)
{
    int i,j;
    printf("\nOto liczby zapisane w twojej tablicy:");
    for(i=0;i<10;i++)
    {
        for(j=0;j<10;j++)
        {
            printf("\ntab[%d][%d] = %d",i,j, *((tab+i)+j));
        }

    }
}
0

Dziękuję wam bardzo : ) Jeszcze bym prosił o jedną radę jak można; Chciałbym wypisać tablicę tak żeby każda liczba była wyrównana w pionie do lewej żeby to ładnie wyglądało. Jak to zrobić przez printf?

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

void losuj_do_tablicy(int*);
void wypisz_tablice(int*);
void suma_tablic(int *tab_a,int *tab_b,int *tab_c);
int losuj_calkowita();

int main()
{
    int zarodek;
    int tab_a[10][10], tab_b[10][10],tab_c[10][10];
    int *p_tab_a, *p_tab_b, *p_tab_c;

    p_tab_a = &tab_a[0][0];
    p_tab_b = &tab_b[0][0];
    p_tab_c = &tab_c[0][0];

    zarodek = time(NULL);
    srand(zarodek);
    losuj_do_tablicy(p_tab_a);
    losuj_do_tablicy(p_tab_b);
    suma_tablic(p_tab_a,p_tab_b,p_tab_c);

    printf("TABLICA PIERWSZA:\n");
    wypisz_tablice(p_tab_a);
    printf("\n\n");
    printf("TABLICA DRUGA:\n");
    wypisz_tablice(p_tab_b);
    printf("SUMA TABLIC:\n");
    wypisz_tablice(p_tab_c);

    for(;;);
    return 0;

}

int losuj_calkowita()
{
    int liczba;
    liczba = rand();

    return liczba;
}

void suma_tablic(int *tab_a,int *tab_b,int *tab_c)
{
    int i,j;
    for(i=0;i<10;i++)
    {
        for(j=0;j<10;j++)
        {
             *((tab_c+i*sizeof(int))+j) = *((tab_a+i*sizeof(int))+j) + *((tab_b+i*sizeof(int))+j);
        }
    }
}

void losuj_do_tablicy(int *tab)
{
    int i,j;
    for(i=0;i<10;i++)
    {
        for(j=0;j<10;j++)
        {
             *((tab+i*sizeof(int))+j) = losuj_calkowita();
        }
    }
}

void wypisz_tablice(int *tab)
{
    int i,j;
    printf("\nOto liczby zapisane w twojej tablicy:");
    for(i=0;i<10;i++)
    {
        printf("\n");
        for(j=0;j<10;j++)
        {
            printf("%d ",*((tab+i)+j)); //CHODZI O TĄ CZĘŚĆ KODU 
        }

    }
}
0

Musisz dać jakiegoś if'a i jeżeli liczba ma np jedną cyfrę to dać pięć spacji przed licbą, dwie cyfry to cztery spacje itd. sorry, ale jest już późno i nie chce mi się tego kompilować.

0

Witam, znow mam problem ;< Przepraszam że tak was zadręczam, ale po prostu sam próbowałem różnych sposobów i dalej nic. Dodawanie macierzy - przy wprowadzaniu od razu sprawdzam czy wprowadzone dane są dobre, ale jak je wyprowadzam drugą funkcją to pierwsze 3 liczby macierzy są inne niż powinny być

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void menu_kalkulator_macierzowy();

void wypelnij_macierz(int*);
void wypisz_macierz(int*);

void dodaj_macierze(int *tab_a,int *tab_b,int *tab_c);

int main()
{
    int a,b,switch_a, switch_b;
    int *wsk_a = &a, *wsk_b = &b;

    int tab_a[3][3], tab_b[3][3],tab_c[3][3];
    int *p_tab_a, *p_tab_b, *p_tab_c;

    p_tab_a = &tab_a[0][0];
    p_tab_b = &tab_b[0][0];
    p_tab_c = &tab_c[0][0];

    char end = 't';

    do
    {
        scanf("%d",&switch_a);
        switch(switch_a)
        {
            case 0:
                goto wyjscie;
                break;

            case 2: // KALKULATOR MACIERZOWY
                    // Ze względów wygody testowania macierze są statyczne [3][3] -
                    //    możliwość późniejszej zmiany na macierze dynamiczne bądz o innej wielkości

                menu_kalkulator_macierzowy();

                scanf("%d",&switch_b);

                switch(switch_b)
                {
                    case 1:
                        printf("Macierz pierwsza: \n");
                        wypelnij_macierz(p_tab_a);
                        printf("\n\nMacierz druga:\n");
                        wypelnij_macierz(p_tab_b);

                        //dodaj_macierze(p_tab_a,p_tab_b,p_tab_c); - występuje błąd w programie
                        printf("\nMACIERZ PIERWSZA:\n");
                        wypisz_macierz(p_tab_a); // tab[0][1], tab[0][2], tab[0][3] - mają złe wartości ?
                        printf("\n\n");
                        printf("MACIERZ DRUGA:\n");
                        wypisz_macierz(p_tab_b);
                        printf("\n\nSUMA MACIERZY:\n");
                        wypisz_macierz(p_tab_c);
                        break;
                    case 2:
                        break;
                    case 3:
                        break;
                    case 4:
                        break;
                    default: goto wyjscie;
                }

                break;

            default:
            printf("Podaj poprawna wartosc !!\n");

        }

        printf("\nCzy chcesz powtorzyc program? (t/n)");
        wyjscie:
        getchar();
        end = getchar();

    }while(end == 't');

    return 0;
}

void menu_kalkulator_macierzowy()
{
    printf("\n\n::::::: KALKULATOR MACIERZOWY ::::::\n");
    printf(" 1 - dodaj\n");
    printf(" 2 - odejmij\n");
    printf(" 3 - pomnoz\n");
    printf(" 4 - podziel\n\n");
    printf(" 0 - wyjscie z programu");
}

void wypelnij_macierz(int *tab)
{
    int i,j,a;
    for(i=0;i<3;i++)
    {
        for(j=0;j<3;j++)
        {
            printf("\ntab[%d][%d] = ",i,j);
            scanf("%d",&a);
            printf("%d",a); //do testowania zmiennej "a" - działa i jest OK
            *((tab+i*sizeof(int))+j) = a;
            printf(" %d",*((tab+i*sizeof(int))+j)); //testowanie wprowadzanych zmiennych - zle dane
        }
    }
}

void wypisz_macierz(int *tab)
{
    int i,j;
    for(i=0;i<3;i++)
    {
        printf("\n");
        for(j=0;j<3;j++)
        {
            printf(" %d",*((tab+i*sizeof(int))+j));
        }

    }
}

void dodaj_macierze(int *tab_a,int *tab_b,int *tab_c)
{
    int i,j;
    for(i=0;i<10;i++)
    {
        for(j=0;j<10;j++)
        {
             *((tab_c+i*sizeof(int))+j) = *((tab_a+i*sizeof(int))+j) + *((tab_b+i*sizeof(int))+j);
        }
    }
}

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