Množina s libovolnou mocností – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Množina s libovolnou mocností – Pascal – Fórum – Programujte.comMnožina s libovolnou mocností – Pascal – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Mich
~ Anonymní uživatel
4 příspěvky
14. 4. 2009   #1
-
0
-

Tak pěkné dopoledne, pokud si chcete trochu zamyslet v jiném jazyce a s množinami..mohli byste mi poradit..jak to tu mám doplnit, aby to fungovalo, jak má? A jestli byste mohli i s výkladem, proč kde co. Něco mi jede a něco ne..a nějak mi to algoritmicky nemyslí, předem děkuju, jestli se někdo přemůže. :smile1:

//sablona
//Mno?ina s libovolnou mocností

#include <stdio.h>
#include <conio.h>

#define K 100
typedef unsigned char tSet[K/8+1]; //+1 pro pripad kdy K neni nasobkem osmi

//z M se stane prázdná mno?ina
void ClearSet(tSet M)
{
for(int i=0; i<K; i=i+1)
M[i/8] &= ~(1<<(i%8));
//nebo
//for(int i=0; i<(K/8+1); i=i+1)
// M[i] = 0; //vynuluju vsechny prvky pole
}


//vytvoøí novou mno?inu M s kardinalitou K prvkù, kde K je konstanta
void CreateSet(tSet M)
{
ClearSet(M);
for(int i=0; i<K; i=i+1) //pripravim K prvku
M[i/8] |= (1 << (i%8));
}


//Pøidá do mno?iny M prvek n. Pokud dojde k chybì (prvek nemù?e být souèástí mno?iny), nedìlá procedura nic.
void AddSet (tSet M, int n)
{
if( n <= K )
M[n/8] |= (1 << (n%8));
}

//ubere z mno?iny M prvek n. Pokud dojde k chybì (prvek nemù?e být souèástí mno?iny), nedìlá procedura nic.
void DelSet(tSet M, int n)
{
//UKOL
}

//vrátí True, pokud se prvek n v mno?inì M nachází. Vrátí False, pokud se prvek n v mno?inì M nenachází nebo pokud prvek být v mno?inì nemù?e.
bool InSet (tSet M, int n)
{
//UKOL
return false;
}

//rozdíl mno?in M1 a M2 (tj. výsledek obsahuje prvky mno?iny M1, které se nenacházejí v M2).
//Výsledek se vrací v M1.
void DiffSet (tSet M1, tSet M2)
{
//UKOL
}

//Test mno?in M1 a M2 na rovnost.
bool EquSet (tSet M1, tSet M2)
{
//UKOL
return false;
}

//provede sjednocení mno?in M1 a M2, výsledek ulo?í do M1
void UnionSet (tSet M1, tSet M2)
{
//UKOL
}

//provede prùnik mno?in M1 a M2, výsledek ulo?í do M1
void IntersectSet (tSet M1, tSet M2)
{
//UKOL
}

//vypise prvky mnoziny
void PrintSet(tSet M)
{
for(int i=0; i<K; i=i+1)
{
if( M[i/8] & (1<<(i%8)) )
printf("\n%d", i);
}
}

int main()
{
tSet m1;
tSet m2;

CreateSet(m1);
CreateSet(m2);

ClearSet(m1); //nastavim mnozinu na 0
ClearSet(m2);

AddSet(m1, 4);
AddSet(m1, 72);
AddSet(m1, 9);
AddSet(m1, 17);
AddSet(m1, 72);

AddSet(m2, 1);
AddSet(m2, 21);
AddSet(m2, 4);
AddSet(m2, 17);

if( InSet(m1, 9) )
printf("\nCislo 9 je soucasti mnoziny.");
else
printf("\nCislo 9 neni soucasti mnoziny.");

DelSet(m1, 9);

if( InSet(m1, 9) )
printf("\nCislo 9 je soucasti mnoziny.");
else
printf("\nCislo 9 neni soucasti mnoziny.");

if( EquSet(m1, m2) )
printf("\nMnoziny se shoduji.");
else
printf("\nMnoziny jsou ruzne.");

IntersectSet(m1, m2);
printf("\nPrvky mnoziny M1");
PrintSet(m1);

UnionSet(m1, m2);
printf("\nPrvky mnoziny M1");
PrintSet(m1);

printf("\nLibovolnou klavesou ukoncete program.");
getch();
return 0;
}

Ještě jednou předem díky

Nahlásit jako SPAM
IP: 195.178.88.–
Reklama
Reklama
Mircosoft+1
Věrný člen
14. 4. 2009   #2
-
0
-

Jestli to dobre chapu (za coz nerucim, nejsem ceckar; a mimochodem nevim, co dela takovyhle dotaz v pascalske sekci, kdyz tady mame i ceckovou), tak je mnozina reprezentovana bitovym polem, tedy stejne, jako v Pascalu standardni datovy typ Set. Kdyz chces mnozinu pro 16 cisel, alokujes si pole 16 bitu, tj. 2 byty. Kdyz chces do mnoziny vlozit jednicku, nastavis prvni bit na jedna. Kdyz desitku, nastavis desaty bit na 1 atd. Pri vyndavani naopak bity nulujes. Sjednoceni dvou takovych mnozin je v podstate bitovy or (|), prunik je and (&).

Protoze PC pracuje jenom s celymi byty a ne s jednotlivymi bity, musis se k nim prokousat pres bitove posuny (v Pascalu shl a shr, v C << a >>) a maskovani andem. Priklad: chci pracovat s desatym bitem. Kolikaty to bude byte? 10/8=1 a zbytek 2 (v Pascalu operatory div a mod, v C / a %; a kdyz to delis osmickou, staci misto deleni pouzit posun o 3 bity doprava a misto zbytku vyandovani sedmickou). Takze byte 1 (indexovano od 0) a v nem bit 2 (taktez).

Jestli chces neco pro inspiraci, tak tady: http://mircosoft.ic.cz/download/NFSUP.PAS to najdes napsane v Assembleru, preji vesele lusteni ;-).

Nahlásit jako SPAM
IP: 130.119.248.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
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, 12 hostů

Podobná vlákna

Množina — založil ukulele

Množina relacie — založil Nika

Juliova množina z JS — založil Matěj Andrle

Množina bez násobků — založil Sak

Moderátoři diskuze

 

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