Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <conio.h>
- #include <stdlib.h>
- #include <string.h>
- char sir[100], sirAux[100], SirEsential[100], vectorC[64];
- int a[64][64], nr = 0, putere = 1, aux2;
- char auxiliar[100]="a";
- void notatii() {
- printf("Negatia = ~");
- printf("\nConjunctia = ^");
- printf("\nDisjunctia = v");
- printf("\nImplicatia = -");
- printf("\nEchivalenta = =");
- printf("\nDisjunctia exclusiva = +");
- }
- void initializare() {
- for (int i = 0; i < 64; i++)
- for (int j = 0; j < 64; j++)
- a[i][j] = -1;
- }
- void VectorCunostinta() {
- int i, j, ok, contor;
- vectorC[0] = '\0';
- contor = 0;
- for (i = 0; i < strlen(sir); i++)
- if ((sir[i] >= 'A') && (sir[i] <= 'Z')) {
- ok = 1;
- for (j = 0; j < contor; j++)
- if (sir[i] == vectorC[j])
- ok = 0;
- if (ok) {
- vectorC[contor] = sir[i];
- contor++;
- nr++;
- }
- }
- vectorC[contor] = '\0';
- printf("Variabilele sunt: %s\n", vectorC);
- }
- void negatia(char P, int pozitia) {
- int poz = 0, i;
- for (i = 0; i < nr; i++)
- if (vectorC[i] == P)
- poz = i;
- for (i = 0; i < putere; i++) {
- if (a[i][poz] == 1)
- a[i][nr] = 0;
- else
- a[i][nr] = 1;
- }
- strcat_s(vectorC, auxiliar);
- strcpy_s(SirEsential + pozitia,100, SirEsential + pozitia + 1); // Sterg ~Q si pun rezultatul ( de ex: Pv~Q <--> Pva )
- SirEsential[pozitia] = auxiliar[0];
- auxiliar[0] = auxiliar[0] + 1;
- nr++;
- }
- void conjunctia(char P, char Q) {
- int poz1 = 0, poz2 = 0, i;
- for (i = 0; i < nr; i++) {
- if (vectorC[i] == P)
- poz1 = i;
- if (vectorC[i] == Q)
- poz2 = i;
- }
- for (i = 0; i < putere; i++) {
- if ((a[i][poz1] == 1) && (a[i][poz2] == 1))
- a[i][nr] = 1;
- else
- a[i][nr] = 0;
- }
- strcat_s(vectorC, auxiliar);
- auxiliar[0] = auxiliar[0] + 1;
- nr++;
- }
- void disjunctia(char P, char Q, int pozitia) {
- int poz1 = 0, poz2 = 0, i;
- for (i = 0; i < nr; i++) {
- if (vectorC[i] == P)
- poz1 = i;
- if (vectorC[i] == Q)
- poz2 = i;
- }
- for (i = 0; i < putere; i++) {
- if ((a[i][poz1] == 0) && (a[i][poz2] == 0))
- a[i][nr] = 0;
- else
- a[i][nr] = 1;
- }
- strcat_s(vectorC, auxiliar);
- pozitia = pozitia - 1;
- strcpy_s(SirEsential + pozitia, 100, SirEsential + pozitia + 2); // Sterg PvQ si pun rezultatul ( de ex: PvQ^R <--> a^R )
- SirEsential[pozitia] = auxiliar[0];
- auxiliar[0] = auxiliar[0] + 1;
- nr++;
- }
- void implicatia(char P, char Q) {
- int poz1 = 0, poz2 = 0, i;
- for (i = 0; i < nr; i++) {
- if (vectorC[i] == P)
- poz1 = i;
- if (vectorC[i] == Q)
- poz2 = i;
- }
- for (i = 0; i < putere; i++) {
- if ((a[i][poz1] == 1) && (a[i][poz2] == 0))
- a[i][nr] = 0;
- else
- a[i][nr] = 1;
- }
- strcat_s(vectorC, auxiliar);
- auxiliar[0] = auxiliar[0] + 1;
- nr++;
- }
- void echivalenta(char P, char Q) {
- int poz1 = 0, poz2 = 0, i;
- for (i = 0; i < nr; i++) {
- if (vectorC[i] == P)
- poz1 = i;
- if (vectorC[i] == Q)
- poz2 = i;
- }
- for (i = 0; i < putere; i++) {
- if (((a[i][poz1] == 1) && (a[i][poz2] == 1)) || ((a[i][poz1] == 0) && (a[i][poz2] == 0)))
- a[i][nr] = 1;
- else
- a[i][nr] = 0;
- }
- strcat_s(vectorC, auxiliar);
- auxiliar[0] = auxiliar[0] + 1;
- nr++;
- }
- void disjunctiaexclusiva(char P, char Q) {
- int poz1 = 0, poz2 = 0, i;
- for (i = 0; i < nr; i++) {
- if (vectorC[i] == P)
- poz1 = i;
- if (vectorC[i] == Q)
- poz2 = i;
- }
- for (i = 0; i < putere; i++) {
- if (((a[i][poz1] == 1) && (a[i][poz2] == 0)) || ((a[i][poz1] == 0) && (a[i][poz2] == 1)))
- a[i][nr] = 1;
- else
- a[i][nr] = 0;
- }
- strcat_s(vectorC, auxiliar);
- auxiliar[0] = auxiliar[0] + 1;
- nr++;
- }
- void operatii(char operatie, char op1, char op2, int pozitia) {
- int cazul = 0;
- if (operatie == '~')
- cazul = 1;
- else
- if (operatie == '^')
- cazul = 2;
- else
- if (operatie == 'v')
- cazul = 3;
- else
- if (operatie == '-')
- cazul = 4;
- else
- if (operatie == '=')
- cazul = 5;
- else
- if (operatie == '+')
- cazul = 6;
- switch (cazul) {
- case 1:
- negatia(op2, pozitia);
- break;
- case 2:
- conjunctia(op1, op2);
- break;
- case 3:
- disjunctia(op1, op2, pozitia);
- break;
- case 4:
- implicatia(op1, op2);
- break;
- case 5:
- echivalenta(op1, op2);
- break;
- case 6:
- disjunctiaexclusiva(op1, op2);
- break;
- default:printf("In propozitie exista o operatie incorecta!!!\n");
- }
- }
- void paranteze() {
- int find=1, poz1 = -1, poz2 = -1, i, pozitie = 0;
- char operatia, op1, op2;
- while (find==1) {
- find = 0;
- for (i = 0; i < strlen(sir); i++) {
- if (sir[i] == '(')
- poz1 = i;
- if (sir[i] == ')') {
- poz2 = i;
- find = 1;
- break;
- }
- }
- if (find == 1) {
- sir[poz2] = '\0';
- SirEsential[0] = '\0';
- strcpy_s(SirEsential, 100, sir + poz1 + 1);
- printf("Sirul esential este: %s", SirEsential); // * - merge
- sir[poz2] = ')';
- strcpy_s(sir + poz1, 100, sir + poz2);
- printf("\nSirul initial acum este: %s", sir); // ** - merge
- int gaseste = 1;
- while (gaseste == 1) {
- gaseste = 0;
- for (i = 0; i < strlen(SirEsential); i++)
- if (SirEsential[i] == '~') {
- gaseste = 1;
- operatia = '~';
- op1 = SirEsential[i + 1];
- op2 = SirEsential[i + 1];
- pozitie = i;
- operatii(operatia, op1, op2, pozitie);
- printf("\nSirul esential este 2 : %s\n", SirEsential); // *** - merge
- break;
- }
- }
- while (strlen(SirEsential) > 1) {
- for (i = 0; i < strlen(SirEsential); i++) {
- if (((SirEsential[i] < 'A') || (SirEsential[i] > 'Z')) && ((SirEsential[i] < 'a') || (SirEsential[i] >= 'v'))) {
- operatia = SirEsential[i];
- op1 = SirEsential[i - 1];
- op2 = SirEsential[i + 1];
- pozitie = i;
- operatii(operatia, op1, op2, pozitie);
- printf("\nUn alt sir esential: %s", SirEsential);
- break;
- }
- }
- }
- sir[poz1] = SirEsential[0];
- }
- }
- printf("\nNu am mai gasit paranteze\n Sirul final este: %s\n", sir);
- for (int k = 0; i < putere; i++) {
- for (int j = 0; j < nr; j++)
- printf("%d ", a[k][j]);
- printf("\n");
- }
- }
- void main() {
- char operatie;
- int i, j, numar = 0;
- notatii(); //Notatiile folosite
- printf("\nIntroduceti propozitia: ");
- gets_s(sir);
- sirAux[0] = '\0';
- strcpy_s(sirAux, sir); //Salvam propozitia in alt sir pentru orice eventualitate
- VectorCunostinta(); //Salvam variabilele intr-un vector de cunostinta
- aux2 = nr; //Salvam numarul de variabile pentru orice eventualitate
- initializare(); //Initializam matricea(tabela de adevar) cu -1
- for (i = 0; i < nr; i++)
- putere = putere * 2;
- numar = putere - 1;
- for (i = 0; i < putere; i++) { // Adaugam in tabela de adevar valorile de adevar ale variabilelor
- int aux = numar;
- for (j = nr - 1; j >= 0; j--) {
- a[i][j] = aux & 1;
- aux = aux >> 1;
- }
- numar--;
- }
- for (i = 0; i < putere; i++) {
- for (j = 0; j < nr; j++)
- printf("%d ", a[i][j]);
- printf("\n");
- }
- /*char op1 = sir[0];
- char op2 = sir[2];
- char op3 = sir[1];
- int pozitie = 1;
- operatii(op3, op1, op2, pozitie);
- for (i = 0; i < putere; i++) {
- for (j = 0; j < nr; j++)
- printf("%d ", a[i][j]);
- printf("\n");
- }*/
- paranteze();
- _getch();
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement