Program pro práci s množinami v jazyce C

Vývojová prostředí, aplikace, skripty, http://www... síťové programy, internet, sdílení...
Odpovědět
N@$ty
Začátečník
Začátečník
Uživatelský avatar
Registrován: 04. říj 2004
Bydliště: Havlíčkův Brod
Kontaktovat uživatele:

Program pro práci s množinami v jazyce C

Příspěvek 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.

Motherboard: ASUS Maximus II Formula; CPU: Intel Core 2 Quad E6600; Cooling: Zalman CNPS7500; RAM: 2×Corsair XMS2 2048MB DHX;
VGA:Leadtek Winfast PX8800 GTS TD 512MB; HDD: Hitachi 160GB SATAII + WesternDigital 750GB SATAII; DVD: DVD±RW LG SuperMulti GSA-H22L;
PSU: Enermax Liberty 620W DXX; Case: Thermaltake Armor Jr. VC3000BWS; OS: Microsoft Windows Vista Ultimate x64; LCD: DELL UltraSharp 2408wfp
Notebook: IBM ThinkPad R61; Intel Core2Duo T7100; 4GB DDR2; 320GB HDD 7200rpm; nVidia Quadro NVS 140M; 15,4" WSXGA+; Microsoft Windows Vista Business
OndraSter
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 22. úno 2006
Bydliště: Praha / ČVUT FIT
Kontaktovat uživatele:

Re: Program pro práci s množinami v jazyce C

Příspěvek 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á.)
PC: i5-2500k 4.5GHz/24GB RAM/GTX560 Ti 1GB/>5TB - W7 Prof x64; Microsoft SideWinder X3 notebook: HP 6715b (4GB RAM) - W7 Prof x64;
mobil: Nokia Lumia 800 Cyan, 16GB; tablet: Toshiba Portege M200 (2GB, 64GB SSD, GeForce FX5200) - W7 Prof x32


Nahraďte Arduino výkonnější variantou!
Vývojová prostředí a nástroje | Webové prohlížeče | Seznam freehostingů
N@$ty
Začátečník
Začátečník
Uživatelský avatar
Registrován: 04. říj 2004
Bydliště: Havlíčkův Brod
Kontaktovat uživatele:

Re: Program pro práci s množinami v jazyce C

Příspěvek 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 

Motherboard: ASUS Maximus II Formula; CPU: Intel Core 2 Quad E6600; Cooling: Zalman CNPS7500; RAM: 2×Corsair XMS2 2048MB DHX;
VGA:Leadtek Winfast PX8800 GTS TD 512MB; HDD: Hitachi 160GB SATAII + WesternDigital 750GB SATAII; DVD: DVD±RW LG SuperMulti GSA-H22L;
PSU: Enermax Liberty 620W DXX; Case: Thermaltake Armor Jr. VC3000BWS; OS: Microsoft Windows Vista Ultimate x64; LCD: DELL UltraSharp 2408wfp
Notebook: IBM ThinkPad R61; Intel Core2Duo T7100; 4GB DDR2; 320GB HDD 7200rpm; nVidia Quadro NVS 140M; 15,4" WSXGA+; Microsoft Windows Vista Business
OndraSter
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 22. úno 2006
Bydliště: Praha / ČVUT FIT
Kontaktovat uživatele:

Re: Program pro práci s množinami v jazyce C

Příspěvek 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).
PC: i5-2500k 4.5GHz/24GB RAM/GTX560 Ti 1GB/>5TB - W7 Prof x64; Microsoft SideWinder X3 notebook: HP 6715b (4GB RAM) - W7 Prof x64;
mobil: Nokia Lumia 800 Cyan, 16GB; tablet: Toshiba Portege M200 (2GB, 64GB SSD, GeForce FX5200) - W7 Prof x32


Nahraďte Arduino výkonnější variantou!
Vývojová prostředí a nástroje | Webové prohlížeče | Seznam freehostingů
€agle
Středně pokročilý
Středně pokročilý
Uživatelský avatar
Registrován: 13. lis 2003
Bydliště: Vlastní 3D svět :)
Kontaktovat uživatele:

Re: Program pro práci s množinami v jazyce C

Příspěvek 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);
...
}
Eagle3D Engine under developement

Hledáme do firmy schopného ASP/VB.NET/C# programátora, více po SZ
N@$ty
Začátečník
Začátečník
Uživatelský avatar
Registrován: 04. říj 2004
Bydliště: Havlíčkův Brod
Kontaktovat uživatele:

Re: Program pro práci s množinami v jazyce C

Příspěvek od N@$ty »

proměnná mnozinaA je opravdu deklarována globálně. Ta inicializace i mi nějak utekla :oops:.
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.

Motherboard: ASUS Maximus II Formula; CPU: Intel Core 2 Quad E6600; Cooling: Zalman CNPS7500; RAM: 2×Corsair XMS2 2048MB DHX;
VGA:Leadtek Winfast PX8800 GTS TD 512MB; HDD: Hitachi 160GB SATAII + WesternDigital 750GB SATAII; DVD: DVD±RW LG SuperMulti GSA-H22L;
PSU: Enermax Liberty 620W DXX; Case: Thermaltake Armor Jr. VC3000BWS; OS: Microsoft Windows Vista Ultimate x64; LCD: DELL UltraSharp 2408wfp
Notebook: IBM ThinkPad R61; Intel Core2Duo T7100; 4GB DDR2; 320GB HDD 7200rpm; nVidia Quadro NVS 140M; 15,4" WSXGA+; Microsoft Windows Vista Business
Trek
Začátečník
Začátečník
Uživatelský avatar
Registrován: 16. kvě 2008

Re: Program pro práci s množinami v jazyce C

Příspěvek 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
N@$ty
Začátečník
Začátečník
Uživatelský avatar
Registrován: 04. říj 2004
Bydliště: Havlíčkův Brod
Kontaktovat uživatele:

Re: Program pro práci s množinami v jazyce C

Příspěvek 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í.

Motherboard: ASUS Maximus II Formula; CPU: Intel Core 2 Quad E6600; Cooling: Zalman CNPS7500; RAM: 2×Corsair XMS2 2048MB DHX;
VGA:Leadtek Winfast PX8800 GTS TD 512MB; HDD: Hitachi 160GB SATAII + WesternDigital 750GB SATAII; DVD: DVD±RW LG SuperMulti GSA-H22L;
PSU: Enermax Liberty 620W DXX; Case: Thermaltake Armor Jr. VC3000BWS; OS: Microsoft Windows Vista Ultimate x64; LCD: DELL UltraSharp 2408wfp
Notebook: IBM ThinkPad R61; Intel Core2Duo T7100; 4GB DDR2; 320GB HDD 7200rpm; nVidia Quadro NVS 140M; 15,4" WSXGA+; Microsoft Windows Vista Business
Odpovědět

Zpět na „Programování a web“