Salut ! Trebuie sa realizez un program in C care sa-mi genereze tabelul de adevar pentru orice propozitie logica introdusa de utilizator.
Input : p && q -> !r
Output :
p q r ((p ∧ q) → ¬r)
0 0 0 1
0 0 1 1
0 1 0 1
0 1 1 1
1 0 0 1
1 0 1 1
1 1 0 1
1 1 1 0
Fac programare de cateva luni si nu stiu cum as putea implementa acest program destul de simplu.
Nu vreau codul propriu zis ci doar niste sfaturi / etape pe care sa le urmez ca sa-mi duc task-ul la bun sfarsit.
Va multumesc mult
In ce context ai problema asta? Parsarea e o problema mai avansata, nu neaparat abordabila de cineva abia la inceput. Ai alte constrangeri la expresia de input care ar putea sa simplifice problema?
OK, fair enough. Sfatul meu e sa vorbesti cu persoana care ti-a cerut asta si sa mai slefuiasca putin definitia problemei si sa mai reduca din scope. Vad ca ai descris mai sus programul ca fiind “destul de simplu”, dar e departe de adevar. E un program relativ complicat. Nu-i mare, dar se foloseste de niste tehnici care nu fac parte din toolkit-ul standard al unui programator - parsare si compilatoare pe deo-parte, enumerare combinatorica si ceva algebra Booleana pe cealalta parte.
Ca si idee trebuie sa rezolvi trei subprobleme:
sa parsezi textul formulei intr-o structura cu care poti sa operezi pe calculator. Trebuie sa formezi din text un AST al formulei. Primele 5 capitole din The Dragon Book ar trebui sa acopere domeniul. Poate asta sa fie mai digerabila. Dar in principiu e mult material pana sa poti sa faci ceva pe care sa-l intelegi. Desi gramatica pentru expresii de genul asta e destul de simpla, si poti sa generezi un lexer/parstor de mana relativ direct.
Un by-product al parsarii este setul de variabile cu care operezi - p,q,a,b etc. Asta formeaza environmentul de executie al expresiei. Pornind de la AST-ul ala si o asociere gen p=1,q=0,a=0,b=1, vrei sa vezi ce valoare ar avea formula. E un procedeu relativ mecanic asta din fericire.
Ultimul pas este sa generezi toate variantele de asocieri - toate 2^n, pentru fiecare sa evaluezi cu prodecura de mai sus, si sa produci astfel tabelul. Daca ai mai putin de 64 de variabile (si o sa ai - chiar si pentru 32 programul risca sa nu termine intr-un an), un truc e sa numeri de la 0 la 1<<n - 1. Ai o reprezentare mult mai compacta a asocierii si nu trebuie sa faci tot backtrackingul complex.
Cam atatea ar fi idei. Sper sa ajute la gasirea solutiei.
Pas 1. Studierea limbajului C.
Pas 2. Shit, this is boring like fuck. Better go out now
Pas 3. Studierea limbajului C.
Pas 4. Chinuiala, incerci sa scrii codul dar nu merge.
Pas 5. Shit, this is still boring like fuck. Better go out now
Pas 6. Chinuiala, incerci sa scrii codul dar nu merge.
Pas 7. Go to Pas 3
Mi-a fost greu sa fac programul sa genereze tabel pentru propozitiile compuse, am luat meticulos toate cazurile in parte si mi-am facut alte functii incluzand multe switchuri. Alta bataie de cap am avut cand le-am pus in functia main , dar mi-am facut o schema logica si-am scos-o la cap intr-un final.