Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

Dynamická matice

 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Velous



Založen: Mar 12, 2010
Příspěvky: 99

PříspěvekZaslal: ne říjen 28 2012, 10:00    Předmět: Dynamická matice Citovat

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>


}


Naposledy upravil Velous dne st prosinec 05 2012, 19:31, celkově upraveno 1 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
piitr



Založen: Oct 19, 2007
Příspěvky: 1003

PříspěvekZaslal: po říjen 29 2012, 8:35    Předmět: Citovat

Velous napsal(a):
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;
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
Velous



Založen: Mar 12, 2010
Příspěvky: 99

PříspěvekZaslal: po říjen 29 2012, 12:42    Předmět: Citovat

citace:

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;
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
piitr



Založen: Oct 19, 2007
Příspěvky: 1003

PříspěvekZaslal: po říjen 29 2012, 14:12    Předmět: Citovat

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?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
Andrea



Založen: Sep 07, 2007
Příspěvky: 9340

PříspěvekZaslal: po říjen 29 2012, 14:47    Předmět: Citovat

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()?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Crifodo



Založen: Oct 11, 2005
Příspěvky: 15005

PříspěvekZaslal: po říjen 29 2012, 20:19    Předmět: Citovat

Andrea napsal(a):
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í
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Andrea



Založen: Sep 07, 2007
Příspěvky: 9340

PříspěvekZaslal: po říjen 29 2012, 20:27    Předmět: Citovat

Zadání je zadané, proč si vymýšlet vlastní?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Crifodo



Založen: Oct 11, 2005
Příspěvky: 15005

PříspěvekZaslal: po říjen 29 2012, 21:18    Předmět: Citovat

no a to zadání mluví o dynamicky alokované matici, ne o obcházení pseudomaticí.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Andrea



Založen: Sep 07, 2007
Příspěvky: 9340

PříspěvekZaslal: po říjen 29 2012, 21:54    Předmět: Citovat

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. Rolling Eyes
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mtajovsky



Založen: Sep 19, 2007
Příspěvky: 3698
Bydliště: Praha

PříspěvekZaslal: po říjen 29 2012, 23:06    Předmět: Citovat

Skutečná dynamická alokace dvourozměrné matice. Uvolnění paměti neřeším:

kód:

#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;
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
piitr



Založen: Oct 19, 2007
Příspěvky: 1003

PříspěvekZaslal: út říjen 30 2012, 8:07    Předmět: Citovat

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í.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovy WWW stránky
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra.
Nemůžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Nemůžete připojovat soubory k příspěvkům
Můžete stahovat a prohlížet přiložené soubory

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.29 sekund