Práce s ukazateli – dvourozměné pole
Napište funkce pro práci s dvourozměrnými maticemi realizující následující činnosti:
Naalokování dvourozměrného pole (matice) s inicializací všech prvků na danou hodnotu
výpis (tisk) dvourozměrného pole (matice) na konzolu
součet matic
transpozici matice
odalokování dvourozměrného pole (matice)
Funkce ověřte pomocí (doplnění) vzoru uvedeného na konci tohoto souboru. Hlavičkový soubor vytvořte sami.
Správnost programu ověřte přidáním modulů check, kterým dosáhnete kontroly naalokované paměti a tedy i správné činnosti programu. Popis přidání do programu a funkce pro volání jsou popsány v check.h.
(související kapitoly skript:
kapitola 5.2.24 – dvourozměrná pole – základní práce
kapitola 5.2.18 – ukazatel a pole – použití ukazatele pro práci s polem
kapitola 5.2.17 – ukazatel a funkce – jak předávat paměťové odkazy z a do funkce
kapitola 5.2.16 – dynamická paměť – jak získat a vrátit paměťový blok
kapitola 5.2.15 – základní vlastnosti a práce s ukazateli)
Pozn.:
Dvourozměrné pole PPP je typu double **. To znamená, že se jedná o ukazatel na (pole) ukazatel(ů). Každý z ukazatelů v tomto poli dále ukazuje na prvky 1D pole. Pole ukazatelů je možné brát například jako pole ukazatelů na řádky (přístupné pomocí prvního indexu) a druhé indexy jako prvky v poli doublů jako pozice sloupců. Samozřejmě lze představit i „obrácenou“ variantu – zaměnit v předešlém sloupce<=>řádky.
Alokace pole tedy vypadá tak, že naalokujeme pole ukazatelů na double, které má velikost shodnou s počtem řádků/sloupců. Pro každý z prvků tohoto pole je dále naalokováno pole prvků double o délce rovné počtu sloupců/řádků.
Přístup k řádkům je PPP[i], přístup k prvkům pole (sloupci v daném řádku) je PPP[i][j] – jedná se tedy o postupnou indexaci ukazatelů.
(pozn. Zakomentované příkazy příkladu měly smysl v DOS. V příkladu mohou být drobné „testovací“ chyby, které bude nutno ve vzoru upravit.
Pro procvičení můžete nejprve zkusit překládat soubory s názvy matice.c a hlavni.c a potom v novém projektu s příponami cpp. Prostředí podle přípony volí typ překladače C/C++. Ozřejmili byste si tedy některé rozdíly mezi C a C++
V případě nejasností zkuste dotazy. )
============= vzor ==================
============= matice.cpp ==============
int init_matrix (int ***mat,int x, int y,int value) { // Dyn. alokace dvourozmern. pole velikosti x,y // s prvky nastavenymi na hodnotu value // vraci: 1 kdyz ok, jinak 0 return (1); // Vse je vporadku } void print_matrix (int** mat,int x,int y) { // Vytisknuti pole mat o velikosti x,y } void soucet_matrix (int** mat_a,int** mat_b,int *** mat_c,int x,int y) { // Soucet mat_c=mat_a+mat_b o velikosti x,y } void disp_matrix (int*** mat,int x, int y) { // Dealokace dvourozmer. pole o velikosti x,y } void transp(int ***mat, int x, int y) { // transpozice matice } ============== hlavni.cpp ========================= #include <stdio.h> #include <stdlib.h> #define X 5 #define Y 6 int main () { int **a =NULL; int **b =NULL; int **c =NULL; printf("\nAlokuju.........\n"); if (init_matrix (&a,X,Y,2)==0) { printf("Nedostatek pameti.\n");return; } if (init_matrix (&b,X,Y,3)==0) { printf("Nedostatek pameti.\n");return; } if (init_matrix (&c,X,Y,0)==0) { printf("Nedostatek pameti.\n");return; } a[0][0]=4; // Pristup do pole print_matrix (a,X,Y); print_matrix (b,X,Y); soucet_matrix(a,b,&c,X,Y); print_matrix (c,X,Y); transp(&c); print_matrix (c,X,Y); //memory_stat(); printf("\nDealokuju.........\n"); disp_matrix(&a,X,Y); disp_matrix(&b,X,Y); disp_matrix(&c,X,Y); print_matrix (a,X,Y); print_matrix (b,X,Y); soucet_matrix(a,b,&c,X,Y); print_matrix (c,X,Y); transp(&c); print_matrix (c,X,Y); printf("\nKonec programu.........\n"); return 0; }
=========== konec vzoru ===============
Poslední změna 2008-10-23