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. :roll:

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í.