Stránka 1 z 1
Dynamická matice
Napsal: 28 říj 2012, 10:00
od Velous
Zdravím, mám za úkol udělat program, ve kterém budu za běhu programu zadávat počet řádku a sloupců matice a budou se tisknout náhodná čísla ve formě matice. Prosím poraďte. Díky. Zatím mám jen toho a nevím jak dál:
#include <stdio.h>
#include <stdlib.h>
}
Napsal: 29 říj 2012, 08:35
od piitr
Velous píše:Zdravím, mám za úkol udělat program, ve kterém budu za běhu programu zadávat počet řádku a sloupců matice a budou se tisknout náhodná čísla ve formě matice. Prosím poraďte. Díky. Zatím mám jen toho a nevím jak dál:
Zkusím opravit, čeho jsem si tak všiml, ale nevím, jestli je to všechno:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
int sloupce, radky, i;
int *PrvkyvMatici=radky*sloupce;
Tohle je blbost. Typ proměnné PrvkycMatici je ukazatel na int, ale má obsahovat počet prvků, takže by měla být typu int. Taky je blbost počítat ten součin tady, když v těch proměnných radky a sloupce ještě nemáš správné hodnoty. To musíš udělat až pak. Takže zde bych napsal:
int PrvkyvMatici;
srand(time(0));
printf("\n Program pro generovani dynamicke matice"
"\n ------------------------------------------- ");
printf("\n Zadejte pocet radku matice : ");
scanf("%d", &radky);
printf("\n Zadejte pocet sloupcu matice : ");
scanf("%d", &sloupce);
Tady bych teprve spočítal ten počet prvků:
PrvkyvMatici = radky * sloupce;
int matice=(int*) malloc (*PrvkyvMatici * sizeof(int));
Před tím PrvkyvMatici nemá být hvězdička, už to není ukazatel.
if(matice != NULL)
{
for(i=0; i<PrvkyvMatici; i++)
{
printf("%i\n",(matice + i));
Ten výraz matice+i vrací ukazatel na ten prvek. Pokud chceš jeho hodnotu, musíš přidat hvězdičku:
*(matice + i)
To samé lze také zapsat čitelněji:
matice[i]
Ovšem, ty tiskneš hodnotu v matici, ale žádnou jsi do ní nedal, takže tam budou jen nějaké blbosti.
Nejdřív bys to měl asi naplnit.
}
}
free(matice);
return 0;
}
Napsal: 29 říj 2012, 12:42
od Velous
for(i=0; i<PrvkyvMatici; i++)
{
printf("%i\n",(matice + i));
}
Pokud já dám *(matice + i), nebo matice[i], tak mi kompilátor hází error.
Jinak před tento cyklus jsem dal ještě jeden, kterým by se měla plnit matice:
for(i=0; i < PrvkyvMatici; i++)
{
*(matice + i) = rand()%10;
}
Napsal: 29 říj 2012, 14:12
od piitr
Aha.
Máš blbě ještě typ proměnné matice.
Teď je to int, tj. jedno číslo.
Asi jsi chtěl spíš, aby to byl ukazatel na první prvek, ne?
Napsal: 29 říj 2012, 14:47
od Andrea
A určitě je nutné tu matici cpát do paměti, když zadání je zobrazit náhodná čísla ve formě matice? Nestačily by dva for cykly v sobě a v nich rand() a prinf()?
Napsal: 29 říj 2012, 20:19
od Crifodo
Andrea píše:A určitě je nutné tu matici cpát do paměti, když zadání je zobrazit náhodná čísla ve formě matice?
a co když bude požadavek tu samou matici zobrazit dvakrát? nebo jednou od prvního členu a pak od posledního. Smysl toho cvičení je nejspíš provětrat znalosti s používáním ukazatelů a práce s pamětí
Napsal: 29 říj 2012, 20:27
od Andrea
Zadání je zadané, proč si vymýšlet vlastní?
Napsal: 29 říj 2012, 21:18
od Crifodo
no a to zadání mluví o dynamicky alokované matici, ne o obcházení pseudomaticí.
Napsal: 29 říj 2012, 21:54
od Andrea
No já vidím
"mám za úkol udělat program, ve kterém budu za běhu programu zadávat počet řádku a sloupců matice a budou se tisknout náhodná čísla ve formě matice."
Nevídim tam nic o tvorbě matice, plnění matice, jen o tisku čísel ve formě matice. Proto jsem se zeptala, není třeba hned hysterčit.

Napsal: 29 říj 2012, 23:06
od mtajovsky
Skutečná dynamická alokace dvourozměrné matice. Uvolnění paměti neřeším:
Kód: Vybrat vše
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
int** matice, radky=3, sloupce=4, prvek=5;
// ------ vektor pointeru na radky ---------
matice = (int**)calloc(radky, sizeof(int*));
if(matice == NULL)
{
printf("Nedostatek pameti\n");
exit(1);
}
// ----------- alokace radku -----------
for(int i=0; i<radky; i++)
{
matice[i] = (int*)calloc(sloupce, sizeof(int));
if(matice[i] == NULL)
{
printf("Nedostatek pameti\n");
exit(1);
}
}
// ----- pouziti matice s beznou syntaxi pro pole -----
matice[1][2] = prvek;
printf("Prvek = %d\n", matice[1][2]);
return 0;
}
Napsal: 30 říj 2012, 08:07
od piitr
Mně ta Andreina poznámka přijde rozumná. Klidně je možné, že k tomu alokování se došlo tak, že se do googla zadalo "dynamická matice", a zadávající to tak možná vůbec nechce. Ale to my asi nevyřešíme. A mně osobně se tohle řešit ani nechce. Kdo chodí do školy, to ví. Kdo nechodí, ať si to nějak zařídí.