Stránka 1 z 1
Program pro práci s množinami v jazyce C
Napsal: stř 19. lis 2008, 08:12
od N@$ty
Ahoj všichni,
mám do školy vytvořit program pro práci s množinami, ale nějak jsem se zasekl na načítání množiny.
Potřeboval bych funkcí "ctiMnozinu" načítat množinu do proměnné (pole) "mnozina", ale aby ta proměnná byla dostupná i mimo funkci, abych ji pak mohl potom v main vypsat.
Zkoušel jsem:
Kód: Vybrat vše
void ctiMnozinu (char *text, char *mnozina[20], int *def) {
int i, p;
...
p=scanf("%c", &mnozina);
...
}
Když proměnná *mnozina bude jen proměnná a ne pole, tak se do ní číslo uloží a není problém, ale ve chvíli, kdy je to pole, tak to dělá problém - program spadne hned po zadání prvního čísla a kompilátor hlásí také chyby.
Byl bych vděčný za vše.
V C jsme nováček a s tímhle si nějak neumím poradit.
Děkuji.
Re: Program pro práci s množinami v jazyce C
Napsal: stř 19. lis 2008, 12:11
od OndraSter
No ukládat do pole přímo nejde, musíš specifikovat index v tom poli.
http://www.cplusplus.com/doc/tutorial/arrays.html (je to c++, ale samotná práce s nimi je stejná.)
Re: Program pro práci s množinami v jazyce C
Napsal: stř 19. lis 2008, 19:30
od N@$ty
Jsem to psal z paměti, teď koukám do PC a já to opsal špatně. Současná situace je:
Kód: Vybrat vše
void prectiMnozinu(char *text, char *mnozina[20], int *def) {
int p, i;
do {
printf("Zadejte prvky %s: ", text);
p = scanf("%c", mnozinaA[i]);
ignorujZbytekRadku();
if (p==0) printf("spatne, znovu\n");
i++;
}
while (mnozinaA[i]!=')');
*def = 1;
}
potom v main
Kód: Vybrat vše
int main {
...
prectiMnozinu("mnoziny A", &mnozinaA, &defA); //*
...
}
*ani kdyz dam mnozinaA, &mnozinaA[20], mnozinaA[20] misto &mnozinaA.
Jak jsem psal výše, potřebuji to po načtení vypsat jinou funkcí z proměnné mnozinaA.
Kompilátor hlásí tyto chyby:
Kód: Vybrat vše
In function `main':
[Warning] passing arg 2 of `prectiMnozinu' from incompatible pointer type
Re: Program pro práci s množinami v jazyce C
Napsal: stř 19. lis 2008, 22:04
od OndraSter
Jak máš deklarovanou mnozinaA v main()u?
Jinak na první pohled (nezkoumal jsem ten kód přesně, mám zalepené oči kouřem z kotle) jsem si všimnul pár detailů (nejspíš ale neřeší ten problém):
Máš prectiMnozinu(.. char *mnozina[20] ..)
ale p = scanf("%c", mnozinaA);
Potom v prectiMnozinu nemáš výchozi hodnotu i, takže to bude další chyba (i když tady nevim jak se c kompiler zachová, c# by zařval chybu).
Re: Program pro práci s množinami v jazyce C
Napsal: čtv 20. lis 2008, 01:10
od €agle
char *mnozina[20] ti vytvoří 20 char pointerů, což myslím není to co chceš... změnil bych na
char *mnozina
Ve
void prectiMnozinu používáš
mnozinaA, která ale předtím není deklarovaná (pokud není globálně).
u
int i nemáš definovanou hodnotu, program vezme to co je zrovna v paměti, což asi nechceš, změnil bych na
int i = 0
Celkově bych to viděl asi takhle
Kód: Vybrat vše
int prectiMnozinu(char *text, char *mnozina)
{
int p, i = 0;
printf("Zadejte prvky %s: ", text);
do
{
p = scanf("%c", mnozina[i]);
ignorujZbytekRadku();
if (p==0) printf("spatne, znovu\n");
}
while (mnozina[i++]!=')');
return i;
}
int main
{
...
char mnozinaA[20];
int defA = prectiMnozinu("mnoziny A", mnozinaA);
...
}
Re: Program pro práci s množinami v jazyce C
Napsal: čtv 20. lis 2008, 06:31
od N@$ty
proměnná
mnozinaA je opravdu deklarována globálně. Ta inicializace
i mi nějak utekla

.
Momentálně to nějak mám, podobně, jak si psal, už to nehlásí chyby, ale zatím jsem nestihnul ověřit, jestli to dělá to co má, protože mi to nějak nereaguje na podmínku pro zastavení cyklu.
Jdu to zkoumat.
Zatím všem moc dík.
Re: Program pro práci s množinami v jazyce C
Napsal: pát 5. pro 2008, 13:29
od Trek
Tyhle ulohy jsou stejne zvlastni, nevim proc treba nepouzivate C++ STL (Set a tak podobne).
Jinak nejdulezitejsi v C je pochopit, ze identifikator pole napr char pole[20] je ukazatel na prvni prvek toho pole, pak uz to de samo
Re: Program pro práci s množinami v jazyce C
Napsal: stř 10. pro 2008, 11:31
od N@$ty
Trek píše:Tyhle ulohy jsou stejne zvlastni, nevim proc treba nepouzivate C++ STL (Set a tak podobne).
Jinak nejdulezitejsi v C je pochopit, ze identifikator pole napr char pole[20] je ukazatel na prvni prvek toho pole, pak uz to de samo
Je to protože v "programování jedna" se učí C a v "programování dvě" C++

.
Nakonec jsem to nějak pořešil, že jsem tu proměnnou udělal globální.