Práce s ukazateli – dvourozměné pole
Napište program, který bude realizovat tyto činnosti pomocí funkcí (v jiném modulu, než je funkce main):
Naalokování dvourozměrného pole (matice) s inicializací všech prvků na danou hodnotu
výpis (tisk) dvourozměrného pole (matice)
součet matic
transpozici matice
odalokování dvourozměrného pole (matice)
Pro realizaci použijte (doplňte) vzor uvedený na konci tohoto souboru. Hlavičkový soubor vytvořte sami.
(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 ==============
#include <stdio.h> #include <conio.h> #include <alloc.h> 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) { // transpozice matice } ============== hlavni.cpp ========================= #define X 5 #define Y 6 int main (void) { int **a =NULL; int **b =NULL; int **c =NULL; // clrscr(); // printf("Volna pamet Near Heapu %lu bytu.\nVolna pamet Far Heapu %lu bytu.\n",(unsigned long)coreleft(),(unsigned long)farcoreleft()); 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; } // printf("Volna pamet Near Heapu %lu bytu.\nVolna pamet Far Heapu %lu bytu.\n",(unsigned long)coreleft(),(unsigned long)farcoreleft()); 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); printf("\nDealokuju.........\n"); disp_matrix(&a,X,Y); disp_matrix(&b,X,Y); disp_matrix(&c,X,Y); // printf("Volna pamet Near Heapu %lu bytu.\nVolna pamet Far Heapu %lu bytu.\n",(unsigned long)coreleft(),(unsigned long)farcoreleft()); return 0; }
=========== konec vzoru ===============
Poslední změna 2007-09-03