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.
Dynamické 2D pole
Re: Dynamické 2D pole
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)
(pravil K. H. Borovský o cenzuře internetu)
-
- Pohlaví:
Re: Dynamické 2D pole
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.
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.
Re: Dynamické 2D pole
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.
Re: Dynamické 2D pole
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)
Deklarace proměnných: (neboli ukazatel na řetězec, a ukazatel na ukazatele na řetězce)
Alokace prvního řetězce: (to je pro ten první řádek)
Alokace pole řetězců: (tohle budou jednotlivé řádky)
Připojení bufferu jako prvního řádku: (přece nebudeme alokovat další paměť a kopírovat ho)
Alokace paměti pro ostatní řetězce: (s kontrolou chyby)
A pak už si s tou tabulkou můžeš dělat co chceš:
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...
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)
(pravil K. H. Borovský o cenzuře internetu)
- CZechBoY
- Master Level 9.5
- Příspěvky: 8813
- Registrován: srpen 08
- Bydliště: Brno
- Pohlaví:
- Stav:
Offline
- Kontakt:
Re: Dynamické 2D pole
jo a bacha na vkládání nuly na konec řetězce, u osmisměrky mi to teď dělalo solidní bordel 

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
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW
Re: Dynamické 2D pole
Tahle je na začátku, ale s ukončením jsem pro jistotu počítal, kvůli tomu printf, proto to +1 

"Král Lávra má dlouhé oslí uši, král je ušatec!
(pravil K. H. Borovský o cenzuře internetu)
(pravil K. H. Borovský o cenzuře internetu)
- CZechBoY
- Master Level 9.5
- Příspěvky: 8813
- Registrován: srpen 08
- Bydliště: Brno
- Pohlaví:
- Stav:
Offline
- Kontakt:
Re: Dynamické 2D pole
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 
nahrazení CH => 2 písmena nahradím 1, vzniká díra 1 bytu za písmenem

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
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 4 hosti