Sunteți pe pagina 1din 42

1

Logic i structuri discrete


1. Presupunem c exist 200 de studeni din anul I care particip la cursurile de calculatoare,
matematic i fizic. Rezultatele au artat c 90 de studeni particip la calculatoare, 110 la
matematic i 60 la fizic. Mai departe 20 de studeni particip la calculatoare i matematic. 20
de studeni particip la calculatoare i fizic i 30 la matematic i fizic. Ne intereseaz s aflm
cati studeni particip la toate cele trei cursuri.
Soluie: S numim cele trei grupe C, M, P. Prin urmare vrem s aflm P M C .
90 = C
110 = M
60 = P
20 = M C
20 = P C
30 = P M
= + + + > P M C P M P C M C P M C 200 90 + 110 + 60 20 20 30
+ P M C = 190 + P M C .
10 s P M C
2. Folosind regulile de inferen din logica propoziional, s se stabileasc valoarea de adevr a
urmtoarei afirmaii: Dac fie soia mea fie eu am fi adus banii cu noi, atunci am fi putut plti i
cina la restaurant i taxiul. Dac am fi pltit taxiul n-ar fi trebuit s mergem pe jos acas. Dar a
trebuit s mergem pe jos acas. Deci, soia mea nu a adus banii.
Soluie: Notm cu S = soia a adus banii, E = eu am adus banii, C = cina pltit, T = taxiul pltit,
MA = mers pe jos acas.
Facem urmtoarele inferene:
1. (S v E)=> (C.T)
2. T=>MA
3. MA > S
4. (MA) din 3, prin dubl negaie
5. T din 2,4, prin modus tollens
6. (C.T) => T tautologie
7. (C.T) din 6,5, prin modus tollens
8. (S v E) din 1,7, prin modus tollens
9. S . E din 8, prin De Morgan
10. S din 9, prin simplificare

2

3. S se aplice rezoluia pentru a rezolva urmtoarea problem de inferen:
S presupunem c:
(a) Exist un dragon.
(b) Dragonul doarme n petera sa sau vneaz n pdure.
(c) Dac dragonul este flmnd, atunci nu poate dormi.
(d) Dac dragonul este obosit, atunci nu poate vna.

(i) Ce face dragonul cnd este flmnd?

Soluie: Introducem predicatele:
Dragon(x) : x este un dragon
Poate(x,y,z): y poate s fac x n z
Face(x,y,z) : y face x n z
Flmnd(x) : x este flmnd
Obosit(x) : x este obosit
Presupunem, de asemenea, Poate(x,y,z) Face(x,y,z). (*)
Transformm presupunerile (a), (b), (c) i (d) n clauze:
(a) Dragon(A)
(b) Face(doarme,A,peter), Face(vneaz, A, pdure)
(c) Poate(doarme,A peter) Flmnd(A)
(d) Poate(vneaz,A ,pdure) Obosit(A)

Transformm presupunerile (a)-(d) i (*) n form de mulime-teoretic:
(1) {Dragon(x)}
(2) {Face(doarme, A, peter), Face(vneaz,A ,pdure)}
(3) {Flmnd(A), Poate(doarme,A ,peter)}
(4) {Obosit(A), Poate(vneaz,A, pdure)}
(5) {Poate(x,y,z), Face(x,y,z)}
(i) Adugm urmtoarele clauze clauzelor de la (1) la (5):
(6) {Flmnd(A)}
(7) {Face(x,y,z)}
Clauza (7) reprezint scopul rezoluiei. Vom ncerca s concluzionm , prin instanierea
adecvat a variabilelor x,y i z.
(8) {Face(doarme, A, peter)}, x = vneaz, y = A, z = pdure din (2) i (7)
(9) {Poate(doarme, A, peter)} din (5) i (8)
(10) {Poate(doarme, A, peter)} din (3) i (6)
(11) din (9) i (10)
(ii) Adugm urmtoarele clauze clauzelor (1)-(5).
3

(6) (Obosit(A)}
(7) {Face(x,y,z)} apoi
(8) {Face(vneaz, A, pdure)}, x = doarme, y = A, z = peter din (2) i (7)
(9) {Poate(vneaz, A, pdure)} din (5) i (8)
(10) {Poate(vneaz, A, pdure)} din (4) i (6)
(11) din (9) i (10)
Tehnici de programare

1. Dai o soluie recursiv, n limbajul de programare C, pentru Algoritmul lui Euclid de aflare a
celui mai mare divizor comun a dou numere ntregi.
Formularea n cuvinte a algoritmului este urmtoarea:
Dac unul dintre numere este zero, c.m.m.d.c. al lor este cellalt numr.
Dac nici unul dintre numere nu este zero, atunci c.m.m.d.c. nu se modific dac se nlocuiete
unul dintre numere cu restul mpririi sale cu cellalt.

Soluie:
int cmmdc(int m, int n) {
int r;
r=m % n;
while (r != 0) {
m=n;
n=r;
r=m % n;
}
return n;
}

2. S se scrie o funcie care inverseaz in situ coninutul unui ir de caractere. Se vor folosi
operaii cu pointeri.
Soluie:

char *strrev (char *sir)
{
char *initial = sir;
char *urmator = sir;
char temp;
while (*sir) sir++;
while (urmator < sir)
{
temp = *(--sir);
*sir = *urmator;
*urmator++ = temp;
}
return (initial);
4

}
3. Folosind operaiile pe bii din limbajul de programare C, s se scrie o funcie,
contorbiti,care s numere biii cu valoarea 1 din argumentul su x, de tipul ntreg fr
semn.
Soluie:
/* contorbiti: numara bitii cu valoarea 1 din x */
int contorbiti (unsigned x) {
int b;
for(b=0; x!=0; x>>=1)
if (x & 01)
b++;
return b;
}
Programarea orientat pe obiecte

1. S se creeze o clas MyException derivat din clasa Exception ce conine:
- un constructor ce are ca parametru un ir de caractere ce va fi furnizat de serviciul
getMessage() al excepiei. Serviciul getMessage() nu va fi suprascris.
- o metod ce returneaz de cte ori a fost instaniat, att ea (clasa MyException) ct i orice
subclas a sa. Dup ce ai implementat metoda precum i mecanismul de numrare, explicai
datorit crui fapt metoda returneaz i cte instane ale subclaselor au fost create.
Creai ntr-o metod main trei obiecte de tip MyException care vor fi ataate pe rnd aceleiai
referine. Apelai pentru fiecare obiect creat dou servicii furnizate de acesta.

Rezolvare:
class MyException extends Exception {
private static int instanceNo = 0;
//acest constructor trebuie sa se apeleze la
//fiecare instantiere a clasei, precum si a eventualelor subclase
public MyException(String message){
super(message);
instanceNo++;
}
public static int getInstanceNo(){
return instanceNo;
}
public static void main(String[] argv){
MyException e;
//serviciile ce se doresc a fi apelate sunt
//mostenite de la clasa Exception
//getMessage(), toString(), printStackTrace()...
//se poate apela si getInstanceNo(), dar aceasta fiind statica, nu se recomanda
//apelul prin intermediul referintei unui obiect
e = new MyException("primul caz");
5

System.out.println(e.getMessage());
System.out.println(e.getInstanceNo());
e = new MyException("al doilea caz");
System.out.println(e.getMessage());
System.out.println(e.toString());
e = new MyException("al treilea caz");
e.printStackTrace();
System.out.println(e.toString());
}
}
2. Folosind clasa ArrayList creai o clas Biblioteca ce poate stoca un numr nelimitat de obiecte
de tip Carte. O carte are dou atribute ce stocheaz titlul precum i autorul crii iar afiarea
acesteia pe ecran va furniza utilizatorului valorile atributelor menionate.
Clasa Biblioteca ofer doar dou servicii, unul pentru adugarea de elemente de tip Carte i altul
pentru afiarea elementelor coninute. Se cere implementarea claselor menionate precum i
crearea ntr-o metod main a unei biblioteci ce are trei cri. Crile ce exist n bibliotec vor fi
tiprite.

Rezolvare:
import java.util.*;
class Carte {
private String autor, titlu;
public Carte(String autor, String titlu)
{
this.autor = autor;
this.titlu = titlu;
}
public String toString(){
return autor + " " + titlu;
}
}
class Biblioteca {
private ArrayList<Carte> carti = new ArrayList<Carte>();
public void add(Carte c){
carti.add(c);
}
public String toString(){
//se poate si parcurge colectia cu iteratori, dar ar fi inutil din moment ce exista
//metoda toString() din ArrayList care face acest lucru
return carti.toString();
}
public static void main(String[] argv){
Carte c1 = new Carte("colectiv", "abecedar");
Carte c2 = new Carte("UPT", "Java");
Carte c3 = new Carte("INFO", "Java");
Biblioteca b = new Biblioteca();
6

b.add(c1);
b.add(c2);
b.add(c3);
System.out.println(b);
}
}
3. Respectnd cerinele enunate i principiile POO, s se implementeze n Java interfaa
i clasele descrise mai jos.
Interfaa Intrare conine:
- o metod denumit continut, fr argumente i care returneaz o referin String
Clasa Fisier implementeaz interfaa Intrare i conine:
- un atribut de tip String denumit informatie, specific fiecrui obiect Fisier n parte
- un constructor ce permite setarea atributului anterior cu o valoare String dat ca parametru
constructorului
- implementarea metodei continut ntoarce valoarea atributului informatie descris mai sus
Clasa Director implementeaz interfaa Intrare i conine:
- un atribut denumit intrari de tip ArrayList<Intrare>; cmpul este specific fiecrei instane a
acestei clase si se va iniializa cu un obiect list gol
- o metoda adauga cu un singur parametru; acesta trebuie s fie declarat n aa fel nct s poat
referi att obiecte a clasei Director, ct i obiecte a clasei Fisier dar s NU poat referi orice fel
de obiect Java (ex. NU va putea referi un obiect String); metoda introduce n lista anterioar
referina primit ca parametru
- obligatoriu n implementarea metodei continut se parcurge lista intrari i se apeleaz metoda
continut pe fiecare referin din lista concatenndu-se String-urile ntoarse de aceste apeluri;
metoda va returna o referin spre String-ul rezultat n urma concatenrii
n toat aceast ultim clas, obiectele Fisier si obiectele Director din list trebuie s fie tratate
uniform.
Rezolvare:
interface Intrare {
String continut();
}
class Fisier implements Intrare {
private String informatie;
public Fisier(String informatie) {
this.informatie = informatie;
}
public String continut() {
return informatie;
}
}
class Director implements Intrare {
private ArrayList<Intrare> intrari = new ArrayList<Intrare>();
public void adauga(Intrare intr) {
intrari.add(intr);
}
public String continut() {
7

String tmp = "";
for(Intrare i : intrari) {
tmp = tmp + i.continut();
}
return tmp;
}
}
Arhitectura calculatoarelor

1. Se consider urmtorul format ipotetic inspirat de formatul de virgul flotant IEEE 754,
prezentat prin lungimea cmpurilor specifice n urmtorul tabel:

Semn Exponent Mantis
<1 bit> <5 bii> <10 bii>

Considernd ca normalizarea se face similar formatului IEEE 754, se cere s se calculeze cel mai
mic si cel mai mare numr pozitiv normalizat care se pot reprezenta utiliznd formatul propus.

Rezolvare:
Valoarea bias-ului corespunztoare codului binar de reprezentare a exponentului pentru formatul
ipotetic este:
1 5 1
2 1 2 1 15
n
bias

= = =
n consecin, numerelor normalizate le corespund exponeni din intervalul [-13, 15]
Cel mai mic numr pozitiv normalizat:
x
3
=2
-13
*1.0000000000=2
-13

Cel mai mare numr pozitiv normalizat:
x
4
=2
15
*1.1111111111=2
15
*(2 - 2
-10
)= 2
16
- 2
5



2. Se considera urmtorul algoritm de implementare a operaiei de nmulire binar dup
procedura lui Booth cu creterea bazei sistemului de numeraie la baza 4, redat prin ordinograma
din figura urmtoare.

8

Begin
BEGIN
?
No
A[8:0] :=0, COUNT:=0,
M:=INBUS
Yes
S
0
S
1
c
0
Q[7:0]:=INBUS,
Q[-1]:=0
S
2
c
1
Q[1]Q[0]Q[-1]="001"
or
Q[1]Q[0]Q[-1]="010"
Q[1]Q[0]Q[-1]="101"
or
Q[1]Q[0]Q[-1]="110"
No
A:=A+M
Yes
S
3
c
2
Q[1]Q[0]Q[-1]
=
"011"
No
Q[1]Q[0]Q[-1]
=
"100"
No
A:=A-M
Yes
S
4
c
2
,c
3
A:=A+2*M
Yes
S
5
c
2
,c
4
A:=A-2*M
Yes
S
6
c
2
,c
3
,c
4
COUNT3=1
?
No
A[8]:=A[8], A[7]:=A[8],
A[6:0].Q:=A.Q[7:1],
COUNT:=COUNT+1
No
S
7
c
5
OUTBUS:=A[8:1],
Q[1]:=0
S
8
c
6
Yes
OUTBUS:=A[0].Q[7:1]
S
9
c
7
End
S
0
END


Se cere sinteza unitii de control asociat dispozitivului de nmulire care implementeaz
algoritmul Booth radix 4, prin metoda Sequence Counter. Se urmrete proiectarea optim prin
prisma latenei de execuie a procedurii.

Rezolvare:
n figura urmtoare este sintetizat unitatea de control prin metoda Sequence Counter pentru
algoritmul de nmulire a numerelor binare Booth radix 4.

9

Modulo-2
Sequence Counter
S
R
Q
c
0
c
1
Cycle
0
|
0
|
1
Begin
Clock
Reset
END
S
R
Q
Cycle
1
Q[-1]
Q[0]
Q[1]
c
2
c
3
c
4
COUNT3
c
5
S
R
Q
Cycle
2
c
6
c
7


3. S se nmulteasca dup procedura lui Booth numerele -101 si -11, organiznd rezolvarea sub
form tabelar, prin indicarea pas cu pas a coninutului regitrilor i a semnalelor de control
activate.

Rezolvare:
Cei 2 operanzi, reprezentai n complement de 2 au urmtoarea configuraie:
-101
(10)
=10011011
(2)

-11
(10)
=11110101
(2)

Operaia de nmulire dup procedura lui Booth este prezentat n urmtorul tabel:

10


A Q M Count
Control
signals
0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 1 0 0 0 c
0
(input)
1 0 0 1 1 0 1 1 0 c
1
(input)
- 1 1 1 1 0 1 0 1
0 0 0 0 1 0 1 1 c
2
,c
3
(-)
0 0 0 0 0 1 0 1 1 1 0 0 1 1 0 1 1 0 0 1 c
4
(shift)
0 0 0 0 0 0 1 0 1 1 1 0 0 1 1 0 1 0 1 0 c
4
(shift)
+ 1 1 1 1 0 1 0 1
1 1 1 1 0 1 1 1 c
2
(+)
1 1 1 1 1 0 1 1 1 1 1 1 0 0 1 1 0 0 1 1 c
4
(shift)
- 1 1 1 1 0 1 0 1
0 0 0 0 0 1 1 0 c
2
,c
3
(-)
0 0 0 0 0 0 1 1 0 1 1 1 1 0 0 1 1 1 0 0 c
4
(shift)
0 0 0 0 0 0 0 1 1 0 1 1 1 1 0 0 1 1 0 1 c
4
(shift)
+ 1 1 1 1 0 1 0 1
1 1 1 1 0 1 1 0 c
2
(+)
1 1 1 1 1 0 1 1 0 1 0 1 1 1 1 0 0 1 1 0 c
4
(shift)
1 1 1 1 1 1 0 1 1 0 1 0 1 1 1 1 0 1 1 1 c
4
(shift)
- 1 1 1 1 0 1 0 1
0 0 0 0 1 0 0 0 1 0 1 0 1 1 1 1 0 c
2
,c
3
(-)
0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 1 1 c
4
(shift)
0 0 0 0 0 1 0 0 0 1 0 1 0 1 1 1

Rezultatul operaiei de nmulire, evideniat si in tabelul anterior, este:
0000010001010111
(2)
=1111
(10)
.

Circuite i semnale numerice

1. Se da schema din fig. 1
a. Se cere sa se ridice diagramele de timp din punctele V
i
, V
A
, V
B
, V
C
, V
D
.
b. Sa se determine duratele de timp de la iesirea V
D
pentru urmatoarele: P
1
, P
2
, P
3
sunt porti
TTL, V
H
= 3,5 V, V
L
= 0,2 V, V
T
= 1,5 V, T
1
=T
2
=10s. Timpul de propagare pe porti se
poate neglija in raport cu ceilalti timpi din figura.

P
1
R
0.3 k
C
1 nF
P
2
P
3
A
B
C
D

11


Fig. 1


Raspuns:
12



13





2. Se da urmatoarea schema:

VCC
P1
P2
P3
P4
Q1
Q2
Q3
X
RE

Se cere sa se dimensioneze rezistenta R
E
, unde portile P
1
, P
2
, P
3
, P
4
sunt porti TTL cu
collector in gol, iar Q1, Q
2
, Q
3
sunt porti TTL standard.
Se da: V
CC
= 5 V, V
OH
= 3,5 V, V
OL
= 0,2 V, I
OL
= 16 mA, I
00
= +250 A, I
iL
= -1,6 mA,
I
iH
= 40 A, I
C0
= 0.

Raspuns:
a) Pentru V
X
= V
OH
= 3,5 V
V
CC
P
1
P
2
P
3
P
4
Q
1
Q
2
Q
3
X
I
iH
I
iH
I
iH
I
00
I
00
I
00
I
00
I
RE
R
E

14






b) Pentru V
X
= V
L
= 0,2 V. Cazul cel mai defavorabil este cand o singura poarta P are la
iesire V
OL
. Fie P
1


V
CC
P
1
P
2
P
3
P
4
Q
1
Q
2
Q
3
X
I
iL
I
iL
I
iL
I
C0
I
C0
I
C0
I
C0
I
RE
R
E






c)

15

3. Se da urmatoarea schema de interconectare la o magistrala

P
1
P
2
P
3
P
4
Q
1
Q
N
C
1
A
1
C
2
A
2
C
3
A
3
C
4
A
4

Portile P
1
, P
2
, P
3
, P
4
sunt porti cu impedanta ridicata din cadrul familiei de circuite TTL. Pentru a
nu exista coliziuni pe magistrala o singura poarta P trebuie sa furnizeze valoarea logica 0 sau
1, celelalte porti P trebuie sa fie pe impedanta ridicata. Fie parta P
1
activa si P
2
, P
3
, P
4
sunt
comandata cu semnalele C
2
, C
3
, C
4
sa functioneze cu iesirile pe impedanta ridicata.
Se cere sa se specific cate porti TTL standard (Q) mai pot fi conectate pe magistrala de mai sus.
Se da pentru portile TTL: I
OH
= -5,2 mA, I
OL
= 16 mA, I
OLZ(impedanta ridicata)
= -40 A.

Raspuns:
a) Pentru cazul cand pe magistrala se doreste transmiterea 1 logic V
MAG
=V
H
=3,5 V (V
Z

iesire cu impedanta ridicata)
16

P
1
P
2
P
3
P
4
Q
1
Q
N
V
C1
=V
H
A
2
A
3
A
4
V
A1
=V
L
V
C2
=V
L
V
C3
=V
L
V
C4
=V
L
V
H
V
HZ
V
HZ
V
HZ
I
OH
I
OHZ
I
OHZ
I
OHZ
I
iH
I
iH


Schema curentilor pe magistrala este:



Se mai pot conecta pentru acest caz 127 de porti (utilizatori)

b) Pentru cazul cand pe magistrala se doreste transmiterea 0 logic
V
MAG
=V
L
=0,2 V

17

P
1
P
2
P
3
P
4
Q
1
Q
N
V
C1
=V
H
A
2
A
3
A
4
V
A1
=V
H
V
C2
=V
L
V
C3
=V
L
V
C4
=V
L
V
H
V
HZ
V
HZ
V
HZ
I
OL
I
OLZ
I
OLZ
I
OLZ
I
iL
I
iL


Suma curentilor pe magistrala trebuie sa satisfaca conditia


Se ia numar intreg N
b
= 9
Numarul de porti Q ce pot fi conectate la magistrala este

N=9 este numarul de utilizatori e pot fi conectati simultan pe magistrala.
Proiectarea i analiza algoritmilor
1. S se scrie funcia de suprimare a unui nod dintr-un arbore binar ordonat implementat cu
pointeri. Se vor trata cele trei cazuri specifice: i) nodul de ters nu are fii, este terminal; ii) nodul
de ters are un singur fiu; iii) nodul de ters are ambii fii. Pentru cazul iii) se va alege nodul
nlocuitor ca fiind maximul din subarborele stng sau minimul din subarborele drept al nodului
de ters.

Rezolvare
typedef struct nod
{
int cheie;
struct nod *st;
struct nod *dr;
18

}NOD;


NOD *rad=NULL;

NOD* sterge(NOD *p,int cheie)
{
NOD *q=NULL;
NOD *r=NULL;
if(p)
{
if(cheie<p->cheie)
{
// cautare in subarborele stang
p->st=sterge(p->st,cheie);
}
else
if(cheie>p->cheie)
{
// cautare in subarborele drept
p->dr=sterge(p->dr,cheie);
}
else
if(cheie==p->cheie)
{
// nodul de sters nu are fii
if(p->st==NULL && p->dr==NULL)
{
free(p);
return NULL;
}

// nodul de sters are fiu stang
if(p->st!=NULL && p->dr==NULL)
{
q=p->st;
free(p);
return q;
}

// nodul de sters are fiu drept
if(p->st==NULL && p->dr!=NULL)
{
q=p->dr;
free(p);
return q;
19

}

// nodul de sters are ambii fii
if(p->st!=NULL && p->dr!=NULL)
{

// se merge pe subarborele drept
// ce contine cheile mai mari
q=p->dr;
r=q;
// subarborele drept se parcurge pe stanga
// pentru a gasi minimul
while(q->st!=NULL)
{
// nodul q este minimul din subarbore
// nodul r este parintele nodului q
r=q;
q=q->st;
}
// se salveaza un eventual nod din dreapta lui q in stanga lui r
r->st=q->dr;

// se leaga nodul q de fiii lui p
q->st=p->st;
q->dr=p->dr;

// se leaga nodul q de parintele lui p
return q;
}
}
}

return p;
}

2. S se scrie structura de date i funcia ce afieaz factorul de umplere pentru fiecare pagin a
unui arbore B de ordin N. Factorul de umplere este dat de raportul dintre numrul de chei dintr-o
pagin i capacitatea maxim a paginii. Pentru o pagin a unui arbore de ordinul 2, ce conine 3
chei procentul de umplere este 0.75.

Rezolvare
#define N 2
#define NN (2*N)

typedef struct nod
{
20

int chei[NN];
int nn;
struct nod* fii[NN+1];
} NOD;
void factor_umplere(NOD *p)
{
if(p)
{
printf("%lf",p->nn/(double)NN);
for(int i=0;i<p->nn+1;i++)
{
factor_umplere(p->fii[i]);
}
}
}

3. S se scrie rutinele pentru: i) inseria unui nod de tip PARCARE ntr-o list nlnuit de
parcri modelat prin nume; ii) inseria unui nod de tip AUTOMOBIL modelat prin numr de
nmatriculare de forma AA-00-AAA (de exemplu TM-01-UPT) la un nod PARCARE creat
anterior i identificat prin nume.
Rezolvare
typedef struct automobil
{
char numar[16];
struct automobil *urm;
} AUTOMOBIL;
typedef struct parcare
{
char nume[16];
struct automobil *prim_a,*ultim_a;
struct parcare *urm;
} PARCARE;
PARCARE *prim=0, *ultim=0;
void adaugare_parcare(char *nume)
{
PARCARE *p=0;

p=(PARCARE*)malloc(sizeof(PARCARE));
strcpy(p->nume,nume);
p->prim_a=0;
p->ultim_a=0;
p->urm=0;

if(prim==NULL)
{
21

prim=ultim=p;
}
else
{
ultim->urm=p;
ultim=p;
}
}

void adaugare_automobil(char *numar,char *nume)
{
PARCARE *p=0;
AUTOMOBIL *a=0;

for(p=prim;p;p=p->urm)
{
if(strcmp(p->nume,nume)==0)
{
break;
}
}

if(p)
{
a=(AUTOMOBIL*)malloc(sizeof(AUTOMOBIL));
strcpy(a->numar,numar);
a->urm=0;

if(p->prim_a==NULL)
{
p->prim_a=p->ultim_a=a;
}
else
{
p->ultim_a->urm=a;
p->ultim_a=a;
}
}
}
Fundamente de inginerie software

1. Pentru codul de mai jos desenati diagrama de secventa incepand cu apelul din linia marcata cu
*** si pana la revenirea din acel apel. Nota: Apelurile catre System.out se ignora. In plus, NU
trebuie trasate bare de activare si valori returnate

interface DispozitivAlarma {
public int start();
22

}
class Senzor {
private DispozitivAlarma alarma;
public Senzor(DispozitivAlarma alarma) { this.alarma = alarma; }
private void declanseaza() {
int i = alarma.start();
System.out.println("Informari:" + i);
}
public void alarmare() { declanseaza(); }
}
class Simplu implements DispozitivAlarma {
public int start() {
System.out.println("Alarma!");
return 1;
}
}
class Lant implements DispozitivAlarma {
private DispozitivAlarma next;
public Lant(DispozitivAlarma disp) { this.next = disp; }
public int start() {
proceseaza();
return (1 + next.start());
}
public void proceseaza() {
System.out.println("Alarma intermediara!");
}
}
class Test {
public static void main(String argv[]) {
Simplu s = new Simplu();
Lant l1 = new Lant(s);
Lant l2 = new Lant(l1);
Lant l3 = new Lant(l2);
Senzor sen= new Senzor(l3);
/***/sen.alarmare();
}
}
RASPUNS: Solutia este data de diagrama de secventa de mai jos:
23


2. Sa se scrie o suita de teste white-box (glass-box) prin care sa se faca testarea cailor pentru
pseudo-codul de mai jos. Justificati alegerea facuta.
Nota: se puncteaza doar testcase-urile concrete justificate. Discutia abstracta, fara date de test
concrete nu se puncteaza.
Nota: nu se cere deloc implementare in jUnit / cppUnit!
int error;
int max(int tab[], int entries) {
if(entries <= 0) {
error = 1;
return -1;
}
error = 0;
int max = tab[0];
for(int i = 1; i < entries; i++) {
if(max < tab[i]) {
max = tab[i];
}
}
return max;
}

RASPUNS: Fiind vorba de testare whitebox, va trebui sa alegem datele de test astfel incat sa fie
exersate toate caile din functie. In plus, avand in vedere ca avem un ciclu (for) va trebui sa
alegem date de test astfel incat sa sa parcurga instructiunea for de zero, unu si respectiv mai
mult de o data (ex. de 2 ori).

Alegem astfel urmatoarele cazuri de test:

24

1. entries = 0 ; tab[] = {} - multimea vida - aceste test exerseaza cazul in care se intra in primul
if.
2. entries = 1 ; tab[] = {7} - acest test exerseaza cazul in care nu se intra in primul if, si
deasemenea nu se intra in for
3. entries = 2 ; tab[] = {3, 7} - testul exerseaza cazul in care ciclul for se executa o singura
data, si in care se intra in al doilea if (cel imbricat in for)
4. entries = 2 ; tab[] = {-2, -5} - testul exerseaza cazul in care ciclul for se executa o singura
data, si in care NU se intra in al doilea if (cel imbricat in for).
5. entries = 3 ; tab[] = {0; -2; 5} - acest test vizeaza cazul in care ciclul for se executa de doua
ori.
3. Se da urmatorul document de specificare a cerintelor pentru un sistem de gestionare a unui
magazin:
Cumparatorii vor avea acces on-line la sistem, pentru a consulta oferta de produse a
magazinului. La cerere, un cumparator poate alege online un numar de produse si poate cere
tiparirea descrierii acelor produse, incluzand si pretul fiecarui produs. Vanzatorii vor accesa
sistemul pentru a realiza, daca este posibil, marcarea ca rezervata a unui anumit produs, pe o
anumita cantitate specificata. In cazul efectuarii rezervarii, sistemul va calcula costul, pe baza
unor tabele de tarife. Vanzatorul va confirma plata in avans, iar sistemul va tipari un bon.
Cumparatorii, prin intermediul vanzatorilor, vor avea posibilitatea sa renunte total sau partial la o
rezervare de produse, caz in care sistemul va trebui sa calculeze suma de rambursat.
Gestionarea bazei de date cu informatii legate de produse si preturi va fi efectuata de catre un
sef de raion. Informatiile despre produse vor putea fi modificate si de catre vanzatori. Toate
operaiile cu excepia consultrii ofertei de produse de ctre cumparator presupun o loginare
prealabil in sistem.
Se cere:
a. Identificai toi actorii i use-case-urile (user stories) pentru sistemul descris mai sus.
Justificai alegerea fcut!
b. Reprezentai actorii i use-case-urile identificate n UML sub forma unei Use-Case
Diagram
c. Daca dorim sa dam factor comun descrierea functionalitatii de loginare intre diferitele
use-case-uri care o contin, cum se reprezenta acest lucru intr-o Use-Case Diagram?
RASPUNS:
a. Actorii si use-case-urile identificate sunt redate in diagrama de mai jos. Cei trei actori au
fost indentificati pe baza faptului ca (1) sunt exteriori sistemului si (2) introduc informatii
in sistem si/sau beneficiaza de use-case-urile sistemului. Cele 6 use-case-uri principale
(toate mai putin cel de loginare) au fost identificate pe baza faptului ca reprezinta acele
functionalitati majore ale sistemului care produc un beneficiu direct pentru (cel putin) un
actor.
b. A se vedea diagrama UML de Use Case desenata mai jos
25

c. Pentru a da factor comun functionalitatea de loginare se foloseste relatia uses,
reprezentata in UML printr-o sageata indreptata spre use-case-ul secundar (de tip fish
level) denumit Loginare in Sistem. Utlizarea relatiei este reprezentata in diagrama de
mai jos:
Solutie Alternativa






26



Fundamente de ingineria calculatoarelor
1. Se da urmatorul cod MIPS care opereaz pe ntregi:

L: ADD R1, R2, R3
SUB R3, R1, R2
AND R2, R2, R5
SW 0(R2), R3
SW 16(R2), R1
XOR R9, R7, R2
BZ R1, L

Aratati, marcand fiecare artificiu utilizat, precum si fiecare stall, cum se executa codul in
pipeline-ul MIPS daca:
- Beneficiem doar de artificiul cu tactul
- Stagiul de MEM pentru instructiunile de tip Load/store se executa intr-o unitate distincta
(e diferit de MEM-ul corespunzator celorlate instructiuni) si dureaza 2 cc in loc de 1,
neparalelizabil (ca si la DIV). Notati aceste doua impulsuri cu MEM1, respectiv MEM2
- Branch-ul este tratat in maniera freeze & flush si se decide in ciclul de EX

27

Soluie:


Notaii:
(s) stall in acel stagiu
(t) artificiul cu tactul utilizat

Punctaj
Ce se puncteaza Punctaj Unde se afla Cum e marcat Total
Artificiul cu tactul marcat
corect
2 puncte
/marcaj
cc5 si cc9 (t) 2x2=4 p
Stall 0.5
puncte/marcaj
corect
cc3, cc4, cc7,
cc8, cc12(toate
3), cc15 (toate
3)
(s) 6x0.5=3p
Tratare branch 2 puncte Ultimele 2 linii 1x2p=2p
Oficiu 1 punct 1p
Total= 10 p

2. Se d urmtorul cod. Se consider pipeline-ul MIPS standard, beneficiind de artificiul cu
tactul, forwarding i bypassing. Unitile de multiply au nevoie de 4 cc pt execuia efectiv a
nmulirii, n loc de 7(standard), iar cele de adunare de fp au nevoie doar de 2cc, n loc de 4
(standard). Branch-urile se trateaz n maniera predict as taken.

XOR R3,R3,R3
foo L.D F6, 0(R1)
L.D F8, 0(R2)
MUL.D F10, F6, F8
ADD.D F4, F4, F10
ADDI R1, R1, #-8
ADDI R2, R2, #-8
ADDI R3, R3, #16
BZ R3, foo
Artai cum se execut urmtorul cod n pipeline. Marcati toate artificiile folosite si stall-urile,
iar la branch precizai care este ramura folosit.

Soluie:
28


Initial R3 =0 (din R3=R3 XOR R3), apoi R3=R3+16=0+16=16 => bucla se executa cat timp
R3=0, dar cum R3=16 => nu se sare niciodata=> se alege ramura de jos a branch-ului

Punctaj

Ce se puncteaza Punctaj Unde se afla Cum e marcat Total
artificiul cu tactul marcat
corect
2 puncte/marcaj cc6 (t) 1x2=2 p
Stall 0.5
puncte/marcaj
corect
cc5,
cc8(ambele),
cc9(ambele),
cc10(ambele),
cc13 (toate 3)
(s)/stall 5x0.5=2.5p
Tratare branch 2 puncte Ultimele 2 linii 1x2p=2p
Forwarding 0.5 puncte 6 ->7; 10->11,
15->16
sageata 3x0.5=1.5p
Selectare ramur corect
branch
1 punct 1p
Oficiu 1 punct 1p
Total= 10 p

3. Se d urmtorul cod. Se consider pipeline-ul MIPS standard, beneficiind de artificiul cu
tactul, forwarding i bypassing. Unitile de multiply au nevoie de 4 cc pt execuia efectiv a
nmulirii, n loc de 7 (standard), iar cele de adunare de fp au nevoie doar de 3cc, n loc de 4
(standard). Branch-urile se trateaz n maniera predict as taken.

SUB R3, R3, R3
foo ADDI R1, R1, #-8
L.D F8, 0(R2)
L.D F6, 0(R1)
ADD.D F10, F6, F8
ADDI R2, R2, #-8
MUL.D F4, F4, F10
ADDI R3, R3, #-1
BGEZ R3, foo

Artai cum se execut urmtorul cod n pipeline. Marcati toate artificiile folosite si stall-
urile, iar la branch precizai care este ramura folosit.

29

Soluie:


Initial R3 =0 (din R3=R3 - R3), apoi R3=R3+(-1)=0+(-1)=-1 => bucla se executa cat timp
R3>=0, dar cum R3=-1 => nu se sare niciodata => se alege ramura de jos a branch-ului

Punctaj
Ce se puncteaza Punctaj Unde se afla Cum e marcat Total
artificiul cu tactul marcat
corect
2 puncte/marcaj cc7 (t) 1x2=2 p
Stall 1 punct/marcaj
corect
cc5,
cc10(ambele)
(s)/stall 2x1=2p
Tratare branch 2 puncte Ultimele 2
linii
Stalll/stagiu, if 1x2p=2p
Forwarding 0.5 puncte 5 ->6; 7 ->8,
10->11, 12-
>13
sageata 4x0.5=2p
Selectare ramur corect
branch
1 punct 1p
Oficiu 1 punct 1p
Total= 10 p


Sisteme de operare

1. Scrieti un program care ruleaz, una cte una, comenzile date ca i argumente n linia de
comand pn cnd una din ele ntoarce o valoare de ieire diferit de zero.
Programul va fi scris n limbajul C, folosind apelurile sistem i funciile din biblioteca standard
POSIX. Nu este necesar s includei fiiere antet.
Indicaii:
pot fi utile:
int execl(char *file, const char *arg0, ... );
//idem execlp
pid_t fork(void);
pid_t wait (int *status);
30

Rspuns:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/wait.h>

#define err_sys(expr,cmp) do\
if ((expr) cmp) {\
perror("eroare");\
exit(EXIT_FAILURE);\
} while(0);
#define err_neg(expr) err_sys(expr, < 0)
#define err_null(expr) err_sys(expr, == NULL)

int executa(char *cmd)
{
pid_t pid;
int status;

err_neg( pid = fork() );
if (pid == 0) {
execlp(cmd,cmd,NULL);
exit(0);
}
err_neg( wait(&status) );
return WIFEXITED(status) && (WEXITSTATUS(status) == 0);
}

int main(int argc, char *argv[])
{
int i;

for (i=1; i<argc; i++)
if (!executa(argv[i]))
break;

exit(EXIT_SUCCESS);
}

2. Scriei un program care execut dou comenzi primite ca i argumente n linia de comand
astfel nct ieirea standard a primei comenzi s ajung s fie citit la intrarea standard a celei de-
a doua.
De exemplu:
./program ls sort
va rula comenzile ls si sort similar cu linia de comanda shell:
ls | sort
Programul va fi scris n limbajul C, folosind apelurile sistem i funciile din biblioteca standard
POSIX. Nu este necesar s includei fiiere antet.
Indicaii:
pot fi utile:
int execl(char *file, const char *arg0, ... );
31

//idem execlp
int dup2(int old, int new);
int pipe(int fildes[2]);
pid_t fork(void);
pid_t wait (int *status);

Rspuns:
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>

#define err_sys(expr,cmp) do\
if ((expr) cmp) {\
perror("eroare");\
exit(EXIT_FAILURE);\
} while(0);
#define err_neg(expr) err_sys(expr, < 0)
#define err_null(expr) err_sys(expr, == NULL)

int main(int argc, char *argv[])
{
int pipe1[2];
int pid1, pid2;

if (argc != 4)
exit(EXIT_FAILURE);
err_neg( pipe(pipe1) );
pid1 = fork();
err_neg(pid1);
if (pid1 == 0) {
close(pipe1[0]);
dup2(pipe1[1], STDOUT_FILENO);
execlp(argv[1], argv[1], NULL);
exit(EXIT_FAILURE);
}
close(pipe1[1]);
pid2 = fork();
err_neg(pid2);
if (pid2 == 0) {
dup2(pipe1[0], STDIN_FILENO);
execlp(argv[2], argv[2], NULL);
exit(EXIT_FAILURE);
}
close(pipe1[0]);
wait(NULL);
wait(NULL);
exit(EXIT_SUCCESS);
}
3. S se scrie un program format din dou procese, cu comportamentul descris n continuare.
Aproximativ o dat la secund, primul proces l informeaz pe al doilea de scurgerea acestui
interval de timp. Al doilea proces numr continuu ncepnd de la 1, iar cnd se adun un numr
de 7 notificri de la primul proces, afieaz numrul curent i se termin.
32

Programul va fi scris n limbajul C, folosind apelurile sistem i funciile din biblioteca standard
POSIX. Nu este necesar s includei fiiere antet.
Indicatie:
semnalele utilizator sunt SIGUSR1 si SIGUSR2;
pot fi utile:
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
pid_t fork(void);
pid_t wait(int *status);
int kill(pid_t pid, int sig);
unsigned int sleep(unsigned int seconds);
Rspuns
#include <stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
int count=0;
long num;
void cntev(int sig)
{
count++;
printf(" %d",count); fflush(stdout);
if(count==7)
{
printf(".\nThe number: %ld.\n", num);
exit(0);
}
}

int main()
{
long i;
int pid, status;

if((pid=fork())<0)
{
perror("fork_err");
exit(67);
}

if(pid==0)
{
signal(SIGUSR1,cntev);
printf("Notification:");
fflush(stdout);
for(num=0;;num++);
}
33


for(i=0;i<=15;i++)
{
sleep(1);
kill(pid, SIGUSR1);
}

wait(&status);

printf("Parent ends.\n");

return 0;
}
Bazele inteligenei artificiale
1. Se cere
- Descriei succint tehnica cutrii n adncime ntr-un graf definit printr-un obiect compus
de forma:
Arce is [m(a,b), m(b,d), m(a,c), m(b,e),... ]
- Reprezentai graphic procedura de cutare n adncime ntr-un graf.
- Scrieti utiliznd limbajul Prolog procedura de cutare n adncime ntr-un graf.
Rspuns
Desenul sugereaz urmtoarea procedur recursiv de cutare a unui drum : gsesc drumul de la
Y la Z i gsesc un drum de la A la X, care continu cu drumul parial astfel nct nodul X
(extremitatea muchiei ce conine pe y) s nu fie prezent n drumul parial.

drum( A, z, G, Drum ) if
drum_partial( A, [z ], G, Drum ).
drum_partial( A, [ A | Rest_drum ], _, [ A | Rest_drum ] ).
drum_partial( A, [ Y | Rest_drum ], G, Drum) if
adiacent( X, Y, G ),
not( aparine( X, Rest_drum ) ),
drum_partial( A, [ X, Y | Rest_drum ], G, Drum ).
34

adiacent( X, Y, g( _, Arce ) ) if
aparine( m( X, Y ), Arce );
aparine( m( Y, X ), Arce).
Comentarii :
1. not( aparine( ... ) ) implementeaz un mecanism de detecie a unui ciclu n cadrul unui drum
parial.
2. Predicatul adiacent furnizeaz ca rezultat un nod ce definete extremitatea muchiei cutate.
Deoarece n definirea grafului nu se impune o restricie privind ordinea de scriere a nodurilor,
devine necesar prezena dublei verificri de apartenen ( determininat de prezena unei
simetrii n scrierea unuei muchii, o muchie poate apare de forma m(a,b) sau m(b,a)).

2. Se cere
- Descriei succint tehnica cutrii n adncime ntr-un graf definit printr-un set de axiome
de forma:
s(a,b). s(b,d). s(a,c). s(b,e)....
atunci cnd adncimea de cutare este limitat
- Reprezentai graphic procedura de cutare n adncime ntr-un graf cnd adncimea de
cutare este limitat
- Scrieti utiliznd limbajul Prolog procedura de cutare n adncime ntr-un graf cnd
adncimea de cutare este limitat
Rspuns
Desenul sugereaz urmtoarea procedur recursiv de cutare a unui drum : gsesc drumul de la
Y la Z i gsesc un drum de la A la X, care continu cu drumul parial astfel nct nodul X
(extremitatea muchiei ce conine pe y) s nu fie prezent n drumul parial.
Spre deosebire de cazul n care nu se pune problema gsirii unui cost, simultan cu construcia
drumului parial se va calcula i costul acestuia, definit de suma costurilor muchiilor din drum. In
descrierea muchiei este inclus costul acesteia sub forma : s( nod1, nod2, cost ).
Pentru exemplul dat, tehnica cautarii in adancime cu limitarea adancimii de cautare apare de
forma:
rezolva(Start, Solutie) if
caut_a([ ], Start, Solutie, Adancime_max).
caut_a(Drum, Nod, [Nod|Drum] ) if
apartine(Nod,Tinte).
caut_a(Drum,Nod,Sol,Max)if
Max>0,
s(Nod, Nod1),
not(apartine(Nod1,Drum)),
Max1=Max-1,
caut_a([Nod|Drum], Nod1, Sol, Max1).

3. Se cere
- Descriei succint tehnica cutrii n ltime ntr-un graf definit printr-un set de axiome de
forma:
s(a,b). s(b,d). s(a,c). s(b,e)....
- Reprezentai graphic procedura de cutare n lime ntr-un graf.
- Scrieti utiliznd limbajul Prolog procedura de cutare n lime ntr-un graf.
35

Rspuns
Cutarea n lime
Tehnica de cutare asigur parcurgerea acelor noduri care sunt mai apropiate de nodul de start.
Ca urmare rezult un proces ce tinde s se dezvolte n laimea spaiului alternativelor posibile, (v.
figura de mai jos). Apelul in acest caz este de forma:
?-rezolv(a,Sol).
Sol=[a, c, f]
















Strategia ridic problema meninerii n atenie a unui set de noduri ( si nu a unuia singur ca in
cazul cautarii in adancime) care reprezint vrfurile arborelui la care s-a ajuns cu operaia de
cutare la un moment dat. Acest set de noduri nu este suficient, motiv pentru care se menine n
atenie un set de drumuri posibile. Acestea drumuri posibile, sunt reprezentate fiecare printr-o
list de noduri, al cror prim element va fi intotdeauna nodul cel mai recent generat, iar ultimul
element va fi intotdeauna nodul de strat. La un moment dat, cutarea este iniiat de un singur
drum i respectiv de un singur element de forma [ [Nod_Start ] ], care este dezvoltat in unul sau
mai multe drumuri din care la un moment dat se selecteaza drumul solutie.
Pentru a exemplifica procedeul, pentru exemplul dat n figur avem:
1) primul drum conine nodul de start de la care se iniiaz procesul de cutare:
[ [ a ] ]
2) se genereaz o extensie a nodului de start rezultand
[ [b, a], [c, a] ]
3) se scoate primul drum din set i se genereaz o extensie a acestuia rezultand
[ [d, b, a] , [e , h, a] ].
Drumurile noi rezultate se amplaseaz la sfarsitul drumului iniial sub forma:
[ [c, a], [d, b, a], [e ,h, a] ]
4) Se scoate [c, a] si extensiile care apar se adauga la drum
[ [d, b, a], [e, b, a], [f, c, a], [g, c, a ] ]
5) operaia continu pn n momentul n care drumul ce urmeaz a fi extins prezint ca nod de
cretere nodul int. Pentru exemplul dat, situaia apare sub forma:
[ [f, c, a], [g, c, a], [h, d, b, a], [i, e, b, a], [j, e, b, a] ]
Cu observatia ca Soluie reprezint un drum ce pleac din start i ajunge n int i Drum este o

36

lista a drumurilor ce se dezvolta pe parcurs strategia de cautare prezinta aspectul.
rezolv (Start, Solutie) if
caut_l([ [Start] ], Solutie).
caut_l ([ [Nod|Drum]| _ ], [Nod|Drum]) if
apartine(Nod,Tinte).
caut_l ([ [Nod|Drum]| Drumuri], Solutie) if
findall (Nod1,s(Nod,Nod1), Noi_noduri),
adaug ([Nod|Drum], Noi_noduri, Noi_drumuri),!,
conc (Drumuri, Noi_drumuri, Drumuri1),
caut_l (Drumuri1,Sol) ;
caut_l (Drumuri,Sol).
adaug ( _, [ ], [ ]).
adaug (Drum, [Nod1|Rest], [ [Nod1|Drum] | Drumuri_noi]) if
not(apartine(Nod1,Drum)),
adaug(Drum,Rest,Drumuri_noi).
%conc implementeaza procedura de concatenare
Comentarii
1) Prin findall se genereaz toi succesorii(alternative) posibili ai unui nod dat. Acestea sunt
incluse intr-o list de noi alternative.
2) adaug utilizeaz noile alternative pentru a crea noi drumuri posibile plecnd de la drumul care
a iniiat construirea alternativelor not(apartine) verific dac nu exist alternative identice, caz n
care se renun la direcia de dezvoltare n cauz (drum este o variant moart, care se
abandoneaz).
3) conc pune noile drumuri gsite la sfritul listei iniiale.
4) deoarece este posibil ca prin findall s nu se determine nici o alternativ posibil (nu mai
exist succesori), operaia de cutare va continua pe lista iniial, minus drumul abandonat.
Dezavantaj : cantitatea mare de memorie.
Avantaj : soluie optim
5) aceeai problem se poate pune i pentru cutarea n lime, referitoare la limitarea adncimii
de cutare.

Sisteme ncorporate
1. Prezentai soluia pentru conectarea unui circuit de memorie extern de 64 KO la un
microcontroler care nu are magistrale externe.
Rspuns:
Circuitul de memorie se va lega la microcontroler prin intermediul liniilor de port. Toate
transferurile ntre microcontroler i circuitul de memorie, precum i tranziiile semnalelor de
comand se vor realiza prin program. Dezavantajele soluiei:
a. nu se poate aplica la memorie de program, ntruct microcontrolerul nu dispune de resursele
interne necesare pentru a prelua i interpreta cod de instruciune;
b. soluia este lent, ntruct toate tranziiile semnalelor de comand se fac prin program.
37


2. Desenai schema pentru comanda a 8 LED-uri i citirea a 8 semnale externe de ctre un
microcontroler 8051.
Rspuns:
Exist 2 soluii:
a. conectarea n spaiul de I/E, utiliznd liniile de port;
b. conectarea n spaiul de memorie, utiliznd magistralele de adrese/date.
Schema n cazul a. este:
38




3. Prezentai soluia pentru conectarea unui circuit de memorie de 64 KO ca memorie extern de
program i a unui alt circuit de 64 KO ca memorie extern de date.
Rspuns:
Soluia se bazeaz pe caracteristica microcontrolerului 8051, valabil la multe alte
microcontrolere, de a activa semnale de comanda diferite pentru accesul la memoria de program
i la cea de date. Ca atare, utiliznd 16 linii de adrese se vor putea gestiona 64 KO memorie de
program i 64 KO memorie de date. Semnalul de comand /PSEN va fi folosit pentru comanda
memoriei externe de cod i semnalele de comand /RD i /WR se vor folosi pentru comanda
memoriei externe de date. ntruct circuitele de memorie, att pentru memoria de program ct i
pentru cea de date, acoper n ntregime spaiul de memorie extern a microcontrolerului, nu este
necesar decodificator de memorii.


39



P0.0-7

/EA




ALE


P2.0-7

/PSEN



/RD
/WR

8
0
C
5
1

D0-7


A0-7






A8-15

/OE
/CE
Memoria
de
program
extern
(64 ko)

R
E
G

STB

D0-7



A0-7



A8-15



/CS
/WE
/OE
Memoria
de
date
extern
(64 ko)


Baze de date

Nota: Pentru rezolvarea problemelor propuse se poate folosi i limbajul SQL sau PL/SQL, dar cu
definirea cheilor primare i externe.

1. Se consider dou fiiere dintr-o baz de date existent pentru rezervare locuri la avion.
Fiierul Curse conine datele pentru fiecare curs din orarul de zbor.
Fiierul Pasageri conine datele pentru toi pasagerii din toate cursele. Toi pasagerii unei curse
vor avea acelai cod curs CodC.

Curse
CodC Pilot Copilot Avion Oras1 Ora1 Oras2 Ora2 PretR NrLoc

Pasageri
CodC CNP NumeP Adresa DataN Tel Pret

40

S se afieze informaiile despre o curs de avion i lista pasagerilor din acea curs folosind
comenzi simpe din limbajul XBase. Se recomand forma de afiare:

CodC Oras1 Ora1 Oras2 Ora2 Pilot Copilot TipAv
Ro234-
0609
Timisoara
TSR
8:30 Bucuresti 9:30 Popescu Adam B747

Lista Pasageri


CNP Nume Pas Adresa Telefon DataN Pret





SET TALK OFF
CLEAR
USE Curse INDEX Icodc IN 1 ALIAS CS
USE Pasageri INDEX Icodc, Inume IN 2 ALIAS PS
SET RELATION TO Codc INTO PS
ACCEPT Cod cursa: TO Vcodc
SEEK VCodc
? CodC Pilot Copilot Avion Oras1 Ora1 Oras2 Ora2
? REPL(=,120)
? Codc, Pilot, Copilot, Avion, Oras1, Ora1, Oras2, Ora2
?
? LISTA PASAGERI
?
SELECT PS
? CNP Nume Pasager Adresa Tel DataN Pret
? REPL(-,120)
DO WHILE Codc=Vcodc
? CNP, NumeP, Adresa, Tel, DataN, Pret
SKIP
ENDDO

2. Considerm o baz de date normalizat pentru eviden studeni care cuprinde tabelele:
STUD
CodS Nume Adresa DataN Bursa Telefon CNP ......

NOTE
CodS CodC NOTA Data

CURS
CodC Titlu NumeProf

41

Folosind comenzi simple Xbase se cere afiarea notelor unui student dat prin nume sub forma:

CODS: AC321 Nume: Popescu Bogdan Adresa: Bogdanesi 3 Bursa:150

Situatia notelor
Curs Nota Data Nume prof
Sisteme de operare 9 23-01-2011 Popovici
.....................................

USE Stud INDEX Inume, Icods IN 1 ALIAS ST
USE Note INDEX Icodsn IN 2 ALIAS NT
USE CURS INDEX Icodc IN 3 ALIAS CS
SET RELATION Cods INTO Note
Select 2
SET RELATION Codc INTO Curs
Select 1
ACCEPT Nume Student: TO Vnume
SEEK Vnume
IF EOF()
? Studentul + Vnume + Nu exista
ELSE
? Cods: + Cods, Nume: + Nume, Adresa: + Adresa, Bursa: ,Bursa
?
? Situatia notelor
?
? Curs Nota Data Nume Prof
? ------------------------------------------------------------------------------------
Select 2
DO WHILE Cods=Vcods
? CS-->Titlu, Nota, Data, CS-->NumeProf
SKIP
ENDDO
ENDIF
3. Considerm o baz de date normalizat pentru eviden studeni care cuprinde tabelele:

STUD
CodS Nume Adresa DataN Bursa Telefon CNP ......

NOTE
CodS CodC NOTA Data

CURS
CodC Titlu NumeProf

Folosind comenzile XBase elementare pentru dialog i SQL pentru cutarea informaiilor, s se
scrie secvene de program care realizeaz funciile:
42

- Afiare Cods, Nume student, Bursa, pentru toi studenii care au medii mai mari dect o
valoare N
- Afiare pentru un student dat prin Cods toate notele, Titlul cursului pentru fiecare not i
Nume profesor.
Se va ine cont c rezultatul unei comenzi SQL se obine ntr-o zona de lucru din care se poate
afia direct folosind comanda BROWSE, iar variabilele citite sunt externe precedate de :.


ACCEPT Media minima: TO N
SELECT ST.Cods,ST.Nume, AVG(NT.Nota) Media FROM Stud ST, Note NT
WHERE ST.Cods=NT.Cods GROUP BY ST.Cods,ST.Nume,ST.Bursa,
HAVING AVG(NT.Nota)>:N
Browse && - afisare rezultat
Wait

ACCEPT Dati Cod student TO Vcods
SELECT ST.Cods, ST.Nume,NT.Nota,CS.Titlu,CS.NumeP Profesor
FROM Stud ST, Note NT, Curs CS
WHERE ST.Cods=:Vcods AND ST.Cods=NT.Cods AND NT.Codc=CS.CODC
BROWSE
Wait