Dynamické 2D pole

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

deffdread
nováček
Příspěvky: 2
Registrován: listopad 12
Pohlaví: Muž
Stav:
Offline

Dynamické 2D pole

Příspěvekod deffdread » 28 lis 2012 00:28

Zdravím,

na střední právě probíráme základy programování a na příští týden máme nepovinný bonusový test, který bych měl rád za dobrou známku, nicméně se trápím s jedním tématem a tím jsou dynamická pole. Moc jim nerozumím a rád bych si na procvičení udělal malý program, kde si do dynamického 2D pole napíšu řádek textu (každý písmeno mi to pošle do jiného sloupce pole), poté odentruju a píšu druhý řádek, atd. s tím, že to 2D pole bude ve tvaru čtverce (kolik sloupců bude v prvním řádku, tolik musí být celkový počet řádků.)

Samozřejmě, jestli se to nikomu vypisovat nechce, nepotřebuji to nutně celé od vás udělat, stačilo by i nakopnout, jak to řešit. Mockrát děkuju.

Reklama
Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Dynamické 2D pole

Příspěvekod faraon » 28 lis 2012 08:52

V jakém jazyce?
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uziv00
Pohlaví: Nespecifikováno

Re: Dynamické 2D pole

Příspěvekod Uziv00 » 28 lis 2012 09:32

Když se jedná o dynamické pole, pak nechápu počet sloupců podle prvního řádku - co když v druhém bude více písmen než v prvním?
Jinak první vstup - dostanu text, ten rozkouskuju třeba pomocí Do While. V cyklu nechám inkrementovat proměnnou dejme tomu i. Tím dostanu počet písmen v prvním textu a počet sloupců (tedy i řádků). Tím dostanu i počet chybějících dotazů (i-1), takže na vyžádání dalších textů použiji For - Next i-1 krát. Na doplnění do pole už pak nebudeš používat Do While, ale For - Next (i) s tím, že když bude text kratší, tak se doplní prázdný znak a když delší tak se přebývající znaky nedoplní. Snad ti to pomůže.

deffdread
nováček
Příspěvky: 2
Registrován: listopad 12
Pohlaví: Muž
Stav:
Offline

Re: Dynamické 2D pole

Příspěvekod deffdread » 28 lis 2012 12:52

faraon píše:V jakém jazyce?

Jej já úplně zapomněl, klasické céčko.

ITCrowd, děkuju za odpověď. Když v druhém řádku bude více písmen, tak to vyplivne chybu. V podstatě je tam to dynamické pole jen kvůli tomu prvnímu řádku. To rozkouskování mě zprvu nenapadlo, jak se vrátím ze školy, tak si nad tím zkusím sednout.

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Dynamické 2D pole

Příspěvekod faraon » 29 lis 2012 11:20

ITCrowd ten postup popsal docela pěkně, tak bych jen přidal pár technických termínů, jak bych to řešil já:

Konstanta: (tisíc řádků by snad pro domácí úkol mohlo stačit)

Kód: Vybrat vše

#define MAXDELKA 1000


Deklarace proměnných: (neboli ukazatel na řetězec, a ukazatel na ukazatele na řetězce)

Kód: Vybrat vše

char *vstup,**pole;


Alokace prvního řetězce: (to je pro ten první řádek)

Kód: Vybrat vše

vstup=(char*)malloc(MAXDELKA*sizeof(char)+1)


Alokace pole řetězců: (tohle budou jednotlivé řádky)

Kód: Vybrat vše

pole=(char**)malloc(delka*sizeof(char*))


Připojení bufferu jako prvního řádku: (přece nebudeme alokovat další paměť a kopírovat ho)

Kód: Vybrat vše

pole[0]=vstup;


Alokace paměti pro ostatní řetězce: (s kontrolou chyby)

Kód: Vybrat vše

for (i=1;i<delka;++i)
    if ((pole[i]=(char*)malloc(delka*sizeof(char)+1)))
       pole[i][0]='\0';
    else
       {
       fprintf(stderr,"Nelze alokovat řádek!\n");
       return 1;
       }


A pak už si s tou tabulkou můžeš dělat co chceš:

Kód: Vybrat vše

pole[i][j]=getchar();
...
printf("%s\n",pole[i]);


Nezapomeň ani u předchozích malloc() ohlídat návratovou hodnotu, protože kdyby se nepodařilo paměť alokovat, budeš zapisovat na adresu NULL, a ten program okamžitě spadne na Segmentation fault!

Slušnost je po použití nepotřebnou paměť zase vracet, takže free(), ale to také jde jen pokud v tom ukazateli není NULL...
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
CZechBoY
Master Level 9.5
Master Level 9.5
Příspěvky: 8813
Registrován: srpen 08
Bydliště: Brno
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Dynamické 2D pole

Příspěvekod CZechBoY » 29 lis 2012 11:24

jo a bacha na vkládání nuly na konec řetězce, u osmisměrky mi to teď dělalo solidní bordel :D
PHP, Nette, MySQL, C#, TypeScript, Python
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7397
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Dynamické 2D pole

Příspěvekod faraon » 29 lis 2012 11:35

Tahle je na začátku, ale s ukončením jsem pro jistotu počítal, kvůli tomu printf, proto to +1 8)
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
CZechBoY
Master Level 9.5
Master Level 9.5
Příspěvky: 8813
Registrován: srpen 08
Bydliště: Brno
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Dynamické 2D pole

Příspěvekod CZechBoY » 29 lis 2012 11:41

já jsem měl u tý osmisměrky právě problém s funkcí na přepis CH.. všechno jelo, najednou bylo CH na konci a já měl problém s ukončením toho řetězce :D

nahrazení CH => 2 písmena nahradím 1, vzniká díra 1 bytu za písmenem
PHP, Nette, MySQL, C#, TypeScript, Python
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW


Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 3 hosti