You are on page 1of 6

#include <stdio.h> #include <stdlib.h> #include "multime.h" #include <ctype.

h> int main() { char ch; char buf[200]; MULTIME A,B; int n; DATA d; printf ("Da nr. de elemente ale universului:"); scanf("%d",&n); A=newSet(n); B=newSet(n); do{ system("cls"); printf("A- inserare in A" "\nB- inserare in B" "\nC- stergere din A" "\nD- stergere din B" "\nE- afisare A" "\nF- afisare B" "\nR- reuninune" "\nN- Intersectie" "\nO- A - B" "\nP- B - A" "\nQ- complementara(A)" "\nM- c" "\nI- Info autor" "\nX- Iesire" "\nAlegeti o optiune:\n "); ch=getche(); ch=toupper(ch); switch(ch) { case 'A': printf("\nDa elementul de adaugat: "); scanf(FORMAT, &d); A=insert(A,d); getch(); break; case 'B': printf("\nDa elementul de adaugat: "); scanf(FORMAT, &d); B=insert(B,d); getch(); break; case 'C': printf("\nDa elementul de sters: "); scanf(FORMAT,&d); A=Delete(A,d); getch();

break; case 'D': printf("\nDa elementul de sters: "); scanf(FORMAT,&d); B=Delete(B,d); getch(); break; case 'E': printf("\nMultimea A este:\n%s", conv_multime_sir(A,buf)); getch(); break; case 'F': printf("\nMultimea B este:\n%s", conv_multime_sir(B,buf)); getch(); break; case 'R': printf("\nReuniunea multimilor A si B:\n"); printf("%s",conv_multime_sir(Union(A,B),buf)); getch(); break; case 'N': printf("\nIntersectia multimilor A si B:\n"); printf("%s",conv_multime_sir(intersect(A,B),buf)); getch(); break; case 'O': printf("\nA / B:\n"); printf("%s",conv_multime_sir(diff(A,B),buf)); getch(); break; case 'P': printf("\nB / A:\n"); printf("%s",conv_multime_sir(diff(B,A),buf)); getch(); break; case 'Q': printf("\ncomplementara lui A este:\n"); printf("%s",conv_multime_sir(complementara(A),buf)); getch(); break; case 'M': printf("Prima expresie este %s", conv_multime_sir(Union(A, B),buf)); printf("\nA doua expresie este %s",conv_multime_sir(complementara(intersect(complementara(A),complementara(B))),buf) ); getch(); break; case 'I': printf("\nProgram realizat de\n" "Popa Cornelia\nGrupa 1111B"); getch(); break; case 'X': exit(0); default: printf("\nOptiune inexistenta!"); getch(); break; } }while(ch!='X'); return 0; }

MULTIME.C #include <stdio.h> #include <stdlib.h> #include <string.h> #include "multime.h" MULTIME newSet(int n) { MULTIME e=(MULTIME) malloc(sizeof(Multime)); if (e!=NULL) { char *q; q=(char *) malloc((n+7)/8); if (q==NULL) { free (e); return NULL; } e->n = n; e->pv = q; for(n=(n+7)/8 -1;n>=0;n--) q[n]=0; } return e; } MULTIME insert(MULTIME e, DATA x) { int ix=(int)x; if (ix>=0 && ix<e->n) e->pv[ix/8] |= 1<< ix%8; return e; } LOGIC member(MULTIME e, DATA x) { int ix=(int)x; if (ix>=0 && ix<e->n) return e->pv[ix/8] & 1 << ix%8; return FALS; } MULTIME Delete(MULTIME e, DATA x) { int ix=(int)x; e->pv[ix/8] &= ~( 1 << ix%8 ); return e; } int cardinal(MULTIME e) { return e->n; } MULTIME Union(MULTIME A,MULTIME B) { MULTIME R; int i; if(A==NULL || B==NULL) { printf("\nErr: cel putin o multime este neinitiaizata."); return NULL; } if(A->n != B->n) {

printf("\nEroare: universuri de cardinali diferiti"); return NULL; } if((R=newSet(A->n))==NULL) return NULL; for(i=0;i<(A->n+7)/8;i++) R->pv[i] = A->pv[i] | B->pv[i]; return R; } MULTIME intersect(MULTIME A,MULTIME B) { MULTIME R; int i; if(A==NULL || B==NULL) { printf("\nErr: cel putin o multime este neinitiaizata."); return NULL; } if(A->n != B->n) { printf("\nEroare: universuri de cardinali diferiti"); return NULL; } if((R=newSet(A->n))==NULL) return NULL; for(i=0;i<(A->n+7)/8;i++) R->pv[i] = A->pv[i] & B->pv[i]; return R; } void destroySet(MULTIME e) { if(e!=NULL) { free(e->pv); free(e); } } MULTIME diff(MULTIME A,MULTIME B) { MULTIME R; int i; if(A==NULL || B==NULL) { printf("\nErr: cel putin o multime este neinitiaizata."); return NULL; } if(A->n != B->n) { printf("\nEroare: universuri de cardinali diferiti"); return NULL; } if((R=newSet(A->n))==NULL) return NULL; for(i=0;i<A->n;i++) if (member(A,i) && !member(B,i)) R=insert(R,i); return R; } MULTIME complementara(MULTIME A) { MULTIME R; int i; if(A==NULL) {

printf("\nErr: multime neinitiaizata."); return NULL; } if((R=newSet(A->n))==NULL) return NULL; for(i=0;i<A->n;i++) if (!member(A,i)) R=insert(R,i); return R; } LOGIC isEmptySet(MULTIME e) { int i; for(i=0;i<(e->n+7)/8;i++) if(e->pv[i] !=0) return FALS; return ADEVARAT; } char *conv_multime_sir(MULTIME e, char *zona) { int i,j; char oct; if(e==NULL) return "Multime neintializata"; if(isEmptySet(e)) return "vida"; else { strcpy(zona,"{"); for(i=0;i<(e->n+7)/8;i++) { oct=e->pv[i]; for(j=0;j<8;j++) { if((oct & 1)!=0) sprintf(zona+strlen(zona), FORMAT",",i*8+j); oct>>=1; } } sprintf(zona+strlen(zona)-1,"}"); return zona; } } MULTIME.H #ifndef _MULTIMI_H_ #define _MULTIMI_H_ #include "data.h" struct multime{ int n; char *pv; }; typedef struct multime Multime,*MULTIME; MULTIME newSet(int n); MULTIME insert(MULTIME e, DATA x); MULTIME Delete(MULTIME e, DATA x); LOGIC member(MULTIME e, DATA x); int cardinal(MULTIME e);

MULTIME Union(MULTIME A, MULTIME B); MULTIME intersect(MULTIME A, MULTIME B); MULTIME diff(MULTIME A, MULTIME B); MULTIME complementara(MULTIME A); char *conv_multime_sir(MULTIME e, char *zona); LOGIC isEmptySet(MULTIME e); LOGIC isUniverse(MULTIME e); void destroySet(MULTIME e); #endif DATA.H #ifndef _DATA_H_ #define _DATA_H_ #define FALS 0 #define ADEVARAT (!FALS) typedef unsigned char LOGIC; typedef int DATA; #define FORMAT "%d" #define ABSENT 0 #endif

You might also like