Sunteți pe pagina 1din 3

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

h> char X[10], Y[10]; void SetFlag (char M[10], int pozitie) { M[pozitie/8] = M[pozitie/8] | (1 << pozitie % 8); } int GetFlag (char M[10], int pozitie) { return 1 & (M[pozitie/8] >> pozitie % 8); } void main() { FILE *f; f = fopen("in.txt","rt"); int i, n=1, m=1, element; char caracter, optiune, Z[10]; // Deoarece nu ni se dau lungimile multimilor X si Y, trebuie sa le determina m. // Citim caracter cu caracter si numaram cate spatii gasim pe fiecare linie. // Lungimile multimilor sunt egale cu numarul de spatii gasite pe fiecare lin ie + 1. fscanf (f,"%c",&caracter); while (caracter != '\n') { fscanf (f,"%c",&caracter); if ((int)caracter == 32) n++; // Daca caracterul curent este spatiu (codu l lui ascii = 32) atunci contorizam. } // Analog pentru a doua linie din fisier fscanf (f,"%c",&caracter); while (caracter != '\n') { fscanf (f,"%c",&caracter); if ((int)caracter == 32) m++; } // Redeschidem fisierul pentru a incepe citirea propriu-zisa a elementelor fclose(f); f = fopen("in.txt","rt"); // Citirea elementelor for (i=1;i<=n;i++) { fscanf (f,"%d",&element); SetFlag (X,element); } for (i=1;i<=m;i++) { fscanf (f,"%d",&element); SetFlag (Y,element);

} // Citirea optiunilor while (!feof(f)) { fscanf (f,"%c",&optiune); // Daca optiunea este reuniune, atunci construim un vector Z si ii punem 1 pe pozitia pe care si X si Y au 1 if (optiune == 'R') { for (i=0;i<80;i++) { Z[i] = 0; if (GetFlag(X,i) == 1 || GetFlag(Y,i) == 1) SetFlag(Z,i); } strcpy(X,Z); // Apoi copiem pe Z in X } // Analog pentru intersectie doar ca punem 1 acolo unde cel putin unul din tre X si Y au 1 else if (optiune == 'I') { for (i=0;i<80;i++) { Z[i] = 0; if (GetFlag(X,i) == 1 && GetFlag(Y,i) == 1) SetFlag(Z,i); } strcpy(X,Z); } // Pentru diferenta punem 1 pe pozitia pe care X are 1 iar Y are 0 else if (optiune == 'D') { for (i=0;i<80;i++) { Z[i] = 0; if (GetFlag(X,i) == 1 && GetFlag(Y,i) == 0) SetFlag(Z,i); } strcpy(X,Z); } // Daca optiunea incepe cu 'X' inseamna ca urmeaza un numar ce trebuie ada ugat la multimea X else if (optiune == 'X') { fscanf (f," %d",&element); // Citim numarul si il adaugam la multime SetFlag(X,element); } // Analog pentru 'Y' else if (optiune == 'Y') { fscanf (f," %d",&element); SetFlag(Y,element); } // Daca optiunea incepe cu 'P' inseamna ca urmeaza fie 'X' fie 'Y' else if (optiune == 'P') { fscanf (f," %c",&caracter); // Citim caracterul ce urmeaza si scriem in fisier multimea corespunzatoare if (caracter == 'X') { for (i=0;i<80;i++)

if (GetFlag(X,i) == 1) printf ("%d ",i); printf ("\n"); } else if (caracter == 'Y') { for (i=0;i<80;i++) if (GetFlag(Y,i) == 1) printf ("%d ",i); printf ("\n"); } } } fclose(f); getch(); }

S-ar putea să vă placă și