Odebrání prvku pole v C,problem s vypisem pole – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Odebrání prvku pole v C,problem s vypisem pole – C / C++ – Fórum – Programujte.comOdebrání prvku pole v C,problem s vypisem pole – C / C++ – Fórum – Programujte.com

 

Standa
~ Anonymní uživatel
122 příspěvků
11. 11. 2008   #1
-
0
-

Chtěl bych se zeptat jak se dá odstranit prvek pole v C.A také bych chtěl poprosit jestli by se někdo nepodíval na můj zdroják s C začínám a dělám program pro práci s množinami a u sjednoceni ,pruniku a rozdilu mi to vypisuje uplne nesmyslne hodnoty.

Nahlásit jako SPAM
IP: 213.226.226.–
ondra
~ Anonymní uživatel
244 příspěvků
11. 11. 2008   #2
-
0
-

Prvek z pole se odstraní tak, že všechny prvky za ním se přesunou o jedno místo k začátku a zmenší se nějaké počítadlo počtu volných prvků.

Alternativně je možné někde zvlášť udržovat nějaká data popisující, které prvky jsou platné a které ne. Nebo do neplatného prvku přiřadit speciální hodnotu.

Nahlásit jako SPAM
IP: 194.138.12.–
ondra
~ Anonymní uživatel
244 příspěvků
11. 11. 2008   #3
-
0
-

Jinak v tomto programu vidím několik problémů:

1. Nejde přeložit. Vypadá to (minimálně podle koncovky souboru a podle void ve funkcích bez parametrů) jako C, ale např. na řádku 27 je delete, což je C++

2. Ve funkci main se volá opět funkce main. To je chyba. Jednak se to vůbec nemá dělat a za druhé je tam zbytečná rekurze.

Celý switch by měl jít do nějakého cyklu, klidně nekonečného (např. for(;;) ) a na nějakou volbu z menu vyskočit ven (buď break nebo rovnou return 0).

3. Řádky 13, 43, 60, 100: parametr funkce je pole s proměnnou délkou. To sice projde v gcc, ale není to standardní a není to přenositelné. Pokud je potřeba předat pole proměnlivé délky, předává se obvykle ukazatel na první prvek a v nějakém dalším parametru délka.

4. Zbytečně se tam používají globální proměnné i, j, k. Cykly ve funkcích nepoužívají lokální proměnné.

Pro začátek bych zkusil udělat ta pole s fixní velikostí, zrušit globální proměnné a rozchodit to v této verzi.

Až to bude fungovat, tak udělat ta pole dynamická. To znamená, že se na začátku zjistí, jak to pole má být dlouhé a pak se dynamicky naalokuje potřebná paměť funkcí malloc.


Nahlásit jako SPAM
IP: 194.138.12.–
MaS0
Návštěvník
11. 11. 2008   #4
-
0
-

To ondra : bod 2: Asi máš pravdu, ale nevíš proč to tak je, mě by to docela zajímalo, protože je podle mě jednodušší volat main (pokud je argumentů) než psát další funkci nebo to dávat do cyklu ??

Nahlásit jako SPAM
IP: 195.146.114.–
KIIV
~ Moderátor
+43
God of flame
11. 11. 2008   #5
-
0
-

To MaS : no je to jednodussi ale kazdou rekurzi zaberes nejaky misto na halde...
asi nemusim podotykat ze nemas neomezene velkou ram...

Nahlásit jako SPAM
IP: 80.250.27.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Anonymní uživatel
~ Anonymní uživatel
0 příspěvků
11. 11. 2008   #6
-
0
-

n prvkové pole, na které ukazuje ukazatel ptr, mažeme k-tý prvek, každý prvek je široký b bajtů



memmove(ptr + (k - 1) * b, ptr + k * b, (n - k) * b);

Nahlásit jako SPAM
IP: 213.211.34.–
standa
~ Anonymní uživatel
122 příspěvků
11. 11. 2008   #7
-
0
-

To jak jsi podor nejde přeložit je proto že je napsaný v C a ne c++ to delete jsem jenom zkoušel jsem ho našel, a jelikož jsem si nevěděl rady tak jsem ho zkusil.

Nahlásit jako SPAM
IP: 213.226.226.–
standa
~ Anonymní uživatel
122 příspěvků
11. 11. 2008   #8
-
0
-

int i,j,k;
pocet=0;
for(k=0;k<n1;k++){
c[k]=a[i];
i++;}
for (j=0;j<n2;j++){
if (b[j]==a[i]){
i++;
pocet++;}
else {
k=n1+1;
c[k]=b[j];
k++;
i++;


}

}

printf("Vysledkem sjednoceni mnozin A a B je mnozina C: ");
for(k=0;k<(n1+n2-pocet);k++){
printf("%d ",c[k]);
printf("\n\n");

Nahlásit jako SPAM
IP: 213.226.226.–
standa
~ Anonymní uživatel
122 příspěvků
11. 11. 2008   #9
-
0
-

Ty pole jsem předělal ale i tak mi při sjednoceni tech mnozin atd kdyz vkladam prvky z jednoho pole do druheho vypisu je nesmyslna cisla

Nahlásit jako SPAM
IP: 213.226.226.–
MaS0
Návštěvník
11. 11. 2008   #10
-
0
-

To KIIV : chápu...a kolik tak pro orientaci zabere jedno rekurzivní volání......jestli je to s tou ramkou jen teoretický, nebo prakticky dosažitelný (pochybuju že někoho bude bavit opakovat program př. 100x) ??

Nahlásit jako SPAM
IP: 195.146.114.–
KIIV
~ Moderátor
+43
God of flame
11. 11. 2008   #11
-
0
-

testuju ted neco na tom principu ... zda se je nejakej limit pro rekurzi... dostanu maximalne neco kolem 43tisic zanoreni ...(43396 ci 7)
zabere to jen neco kolem 4MB v ram

#include <stdio.h>

#include <stdlib.h>

int zanoreni = 0;

int main(int a, char ** b)
{
printf("%d\n", zanoreni);
if ( ++zanoreni < 30000 ) {
main(a, b);
} else {
system("pause");
}
return EXIT_SUCCESS;
}

ale kdyz tam dam neco kolem 43300 tak uz to nefunguje spravne

ale mozna to bude zavisly na systemu :D

Nahlásit jako SPAM
IP: 80.250.27.–
Program vždy dělá to co naprogramujete, ne to co chcete...
MaS0
Návštěvník
11. 11. 2008   #12
-
0
-

To KIIV : tak to pochybuju, že by někdo tolikrát opakoval main, v které by uživatel něco zadával :smile1: .......takže to nevadí ničemu jinýmu než "ubírání" paměti ??.......pokud jo, tak nevím, jestli stojí zato respektovat nějaký předpisy (pokud to je jen tak nějaká malá soukromá aplikace): "že se main nemá rekurzivně volat" ??

Nahlásit jako SPAM
IP: 195.146.114.–
KIIV
~ Moderátor
+43
God of flame
11. 11. 2008   #13
-
0
-

To MaS : no kazdopadne bych to nenasadil na nejake zpracovani treba souboru...
krom toho se da do progamu soubor i presmerovat... takze to ze by se nekdo nevypisoval s tolika hodnotama muze i hrozit...
treba bude chtit zpracovat 30milionu kodu a kazdej na jednom radku... tady by s rekurzi tezce shorel :D
obzvlaste kdyz by se najednou objevila verze se 100000000 kodama :D

u rekurze taky prave hrozi ze si pak zacne clovek prepisovat vlastni kod... promenny a tak...

asi si umis predstavit neco jako "seq 100000 | ./program_s_rekurzi"

Nahlásit jako SPAM
IP: 80.250.27.–
Program vždy dělá to co naprogramujete, ne to co chcete...
MaS0
Návštěvník
12. 11. 2008   #14
-
0
-

To KIIV : takže pro všechny případy je asi dobrý si prostě navyknout rekurzivně main nevolat.....dík za vysvětlení

Nahlásit jako SPAM
IP: 195.146.114.–
KIIV
~ Moderátor
+43
God of flame
12. 11. 2008   #15
-
0
-

no hlavne na co rekurze kdyz to daleko lepe zastane cyklus... a bez rizika ze si zasobnikem zacnu prepisovat pamet :D

Nahlásit jako SPAM
IP: 80.250.27.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 35 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý