/***************************************************************/ /* Prof. Dr. Carsten Vogt */ /* FH Koeln, Fak. 07 / Nachrichtentechnik */ /* http://www.nt.fh-koeln.de/vogt */ /* */ /* Beispielprogramm p08050100.c */ /* aus "C fuer Java-Programmierer", Hanser-Verlag */ /* */ /* Demonstriert wird der Realisierung von Mengen durch Bitmaps.*/ /***************************************************************/ #include #include #define MENGENTYP unsigned long const unsigned int size = sizeof(MENGENTYP)*8; int hinzufuegen(MENGENTYP *menge, unsigned int x) { MENGENTYP h = 1; if (x>size-1) return -1; h <<= size-1-x; *menge = *menge | h; return 0; } int entfernen(MENGENTYP *menge, unsigned int x) { MENGENTYP h = 1; if (x>size-1) return -1; h <<= size-1-x; *menge = *menge & ~h; return 0; } void init(MENGENTYP *menge_a, MENGENTYP *menge_b) { int i; *menge_a = 0; for (i=1;i<=5;i++) hinzufuegen(menge_a,i); *menge_b = 0; for (i=3;i<=8;i++) hinzufuegen(menge_b,i); } void addAll(MENGENTYP *menge_a, MENGENTYP menge_b) { *menge_a = *menge_a | menge_b; } void retainAll(MENGENTYP *menge_a, MENGENTYP menge_b) { *menge_a = *menge_a & menge_b; } void removeAll(MENGENTYP *menge_a, MENGENTYP menge_b) { *menge_a = *menge_a & (~menge_b); } void ausgabe(MENGENTYP menge) { int i; for (i=size-1;i>=0;i--) if (menge>>i & 1) printf("%d ",size-1-i); printf("\n"); } int main(void) { MENGENTYP menge_a, menge_b; int wahl; init(&menge_a,&menge_b); do { do { printf("\nBitte Funktion auswaehlen:\n\n"); printf("( 1 ) Mengeninhalt ausgeben\n"); printf("( 2 ) Vereinigungsmenge bilden: A = A vereinigt mit B\n"); printf("( 3 ) Differenzmenge bilden: A = A ohne B\n"); printf("( 4 ) Schnittmenge bilden: A = A geschnitten mit B\n"); printf("( 5 ) Reset\n"); printf("( 0 ) Programmende\n"); scanf("%d",&wahl); } while (wahl<0 || wahl>5); printf("\n"); switch(wahl) { case 1: printf("Menge A: "); ausgabe(menge_a); printf("Menge B: "); ausgabe(menge_b); break; case 2: addAll(&menge_a,menge_b); printf("Vereinigungsmenge in Menge A gebildet\n"); break; case 3: removeAll(&menge_a,menge_b); printf("Differenzmenge in Menge A gebildet\n"); break; case 4: retainAll(&menge_a,menge_b); printf("Schnittmenge in Menge A gebildet\n"); break; case 5: init(&menge_a,&menge_b); break; } } while (wahl!=0); }