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
Fórum › Pascal
Množina s libovolnou mocností
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 ;-).
Moje stránka.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Množina s libovolnou kardinalitou — založil chokolate
Množina — založil ukulele
Juliova množina z JS — založil Matěj Andrle
Množina relacie — založil Nika
Množina bez násobků — založil Sak
Moderátoři diskuze