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