Programarea calculatoarelor 2 - Laborator 12

Pornind de la un fișier text care descrie un circuit combinațional și valorile intrărilor sale, să se calculeze valoarea la ieșirea circuitului.
Circuitul e descris în fișier în felul următor: pe prima linie, două numere întregi nenegative, reprezentând numărul N al intrărilor circuitului și numărul M de semnale întermediare. Pe linia următoare, în ordine, un șir de 0 și 1 separat prin spații, reprezentând în ordine valorile celor N intrări. Pe următoarele M linii, până la sfârșitul fișierului, câte o descriere a porților din circuit, în formatul următor:
out AND in1 in2 ... ink
out NOT in

Pe prima poziție se află ieșirea fiecărei funcții logice (un semnal din cele M),iar dupa tipul portii, intrarile. Porțile AND pot avea oricâte intrări (cel puțin două), poarta NOT una singură. Campurile in cadrul unei linii sunt separate prin cate un spatiu.
Semnalele sunt identificate prin numere, de la 0 la N-1 pentru intrările circuitului, si de la N la N+M-1 pentru cele intermediare. Funcțiile logice pentru semnalele intermediare nu sunt date într-o ordine anume, dar sunt în așa fel încât circuitul nu e ciclic. Semnalul cu numarul N+M-1 este ieșirea circuitului, a cărei valoare trebuie calculată.
Fișierul se dă ca unic argument pe linia de comandă; dacă acesta lipsește, se citește de la stdin.
Datele de intrare se considera corecte. Tratarea erorilor poate fi minimala: iesire din program (eventual cu mesaj).
Exemplu:
4 4
0 1 1 0
7 AND 5 6
6 NOT 4
4 AND 0 1
5 AND 2 4 3

Indicatii de rezolvare
Liniile de text se pot citi cu functia getline (modificata incat sa accepte un fisier ca si parametru) si memora intr-un tablou.
Valoarea iesirii se poate obtine calculand (recursiv, la nevoie) valorile tuturor argumentelor. Pentru a evita recalcularea semnalelor intermediare puteti folosi un tablou pentru a stoca valorile deja calculate. Initializati tabloul cu o valoare ce reprezinta "necalculat inca".
Prelucrarea succesiva a numerelor din liniile de text se poate face usor cu functia strtol care indica si urmatorul caracter de dupa numar.
Lipsa ciclurilor garanteaza terminarea calculelor. Se pot eventual folosi doua valori speciale: "neprelucrat" si "in curs de calculare". Intalnirea unei valori "in curs de calculare" inseamna detectarea unui ciclu.


Marius Minea
Last modified: Wed Dec 17 08:36:17 EET 2003