INFORMATIC
Refereni tiinifici:
I. Tudor, Sorin
004(075.35)
Cuprins
Capitolul 1. Tablouri 7
1.1. Noiunea de tablou .. 7
1.2. Cum citim i cum afim un tablou bidimensional?... 8
1.3. Aplicaii cu tablouri bidimensionale..10
Probleme propuse.. 16
Rspunsurile la testele gril..19
Capitolul 2. Subprograme 20
2.1. Noiunea de subprogram . 20
2.2. Subprograme n Pascal................................................................................... 22
2.2.1. Un exemplu de utilizare a funciilor..................................................... 22
2.2.2. Un exemplu de utilizare a procedurilor............................................... 24
2.2.3. Structura unui subprogram................................................................. 25
2.2.3.1. Structura subprogramelor de tip funcie.............................. 25
2.2.3.2. Structura subprogramelor de tip procedur........................ 26
2.2.4. Definirea i declararea unui subprogram............................................ 27
2.2.5. Apelul subprogramelor........................................................................ 30
2.2.5.1. Apelul funciilor.................................................................... 30
2.2.5.2. Apelul procedurilor.............................................................. 31
2.2.5.3. Transmiterea parametrilor la apel....................................... 31
2.2.5.4. Cum memoreaz subprogramele parametrii trimii?.......... 33
2.2.5.5. Transmiterea parametrilor prin valoare............................... 33
2.2.5.6. Transmiterea parametrilor prin referin.............................. 35
2.2.6. Variabile locale i globale................................................................... 36
2.2.7. Greeli frecvente................................................................................. 38
2.2.8. Uniti de program............................................................................... 39
2.3. Subprograme n C++....................................................................................... 42
2.3.1. Exemple de utilizare a funciilor.......................................................... 42
2.3.2. Structura unei funcii........................................................................... 44
2.3.3. Declararea variabilelor........................................................................ 46
2.3.4. Transmiterea parametrilor.................................................................. 49
2.3.5. Definirea i declararea unui subprogram............................................ 53
2.4. Aplicaii care folosesc subprograme................................................................ 55
Probleme propuse.. 62
Rspunsuri...... 72
Capitolul 1
Tablouri
Intrebri posibile
2. Tot aa, se poate memora, sub form de tablou, situaia la nvtur a celor m
elevi ai unei clase. Dac numerotm elevii cu 1, 2, ..., m i materiile pe care acetia
le studiaz cu 1, 2, ..., n, atunci ai,j reprezint media pe care o are elevul i la
materia j.
ntrebri posibile
a) Dac n clas sunt 30 de elevi i acetia studiaz 8 materii, cte elemente
are matricea?
b) Care este materia la care elevii au cele mai bune rezultate?
c) Care este media general a elevului i?
d) Care este media general a elevilor unei clase?
irul exemplelor ar putea continua pentru c sunt foarte multe situaii n care
se utilizeaz tablouri bidimensionale (matrice).
Programul care-l utilizeaz va funciona corect dac avem cel mult 8 linii i
cel mult 8 coloane.
1 2 3
4 5 6
7 8 9
Elementele vor fi afiate n ordinea:
1 2 3 6 9 8 7 4 5.
* * * * *
* * * * *
* * * * *
* * * * *
* * * * *
punctajul literelor care apar ntr-un cuvnt pe orizontal i unul pe vertical i care ar
trebui luate de dou ori n calcul. De aceea, vom analiza n plus, pentru fiecare liter,
dac ea face parte dintr-un singur cuvnt (are litere vecine doar pe orizontal sau
doar pe vertical) i se puncteaz obinuit, sau face parte din dou cuvinte (are litere
vecine i pe orizontal i pe vertical) i atunci se puncteaz dublu.
Se mai poate analiza i cazul n care o liter nu are nici un vecin pe niciuna
dintre direciile orizontal sau vertical (caz n care litera nu s-ar puncta deloc), ns
problema precizeaz c literele sunt aezate corect conform jocului de scrabble,
deci nu pot fi amplasate litere izolate.
Pentru memorarea numerelor care aparin fiecrei clase vom utiliza o matrice,
denumit Mat, cu 10 coloane, n care prima linie are indicele 0. Elementele din linia 0
rein numrul de elemente din ir care se gsesc pe coloana respectiv:
0 1 2 3 4 5 6 7 8 9
2 1 0 0 0 1 2 0 0 0
40 41 25 6
30 36
1 0 1 2 2 0 0 0 0 0
6 25 30 40
36 41
Manual de informatic pentru clasa a XI-a 15
Observaii
Probleme propuse
1. Se citete un tablou cu n linii i n coloane, numere ntregi. Un astfel de tablou, n
care numrul liniilor coincide cu numrul coloanelor, se numete tablou ptratic.
a) Pentru un tablou ptratic A, numim diagonal principal, elementele aflate pe
"linia" care unete A[1,1] cu A[n,n].
1 2 3
,
4 5 6
7 8 9
elementele sunt: 1, 5 i 9.
Se cere:
1 2 3
4 5 6 ,
7 8 9
elementele sunt: 7, 5 i 3.
Se cere:
b1) suma elementelor aflate pe diagonala secundar;
b2) suma elementelor aflate deasupra diagonalei secundare;
b3) suma elementelor aflate sub diagonala secundar.
Cerine suplimentare:
3. Un teren este dat sub forma unui tablou A cu n linii i m coloane. Elementul
A[i,j] reine altitudinea ptrelului de coordonate i i j. S se afieze
coordonatele "ptrelelor vrf" (un ptrel este vrf dac toi vecinii si au o
altitudine strict mai mic).
Indicaie. Atenie! Maximele sau minimele pe linii sau coloane pot s nu fie
unice. Dac vom considera numai o valoare dintre acestea, s-ar putea s pierdem
soluii.
Exemplu: m=4, n=4. Matricea iniial i submatricele sunt prezentate mai jos:
12. Fiind dat o matrice cu n linii i n coloane (ptratic) cu numere naturale i fiind
date dou elemente ale matricei de coordonate (x1,y1) i (x2,y2), care dintre
relaiile de mai jos testeaz dac elementele se gsesc pe o dreapt paralel cu
una dintre diagonalele matricei (principal sau secundar)?
Capitolul 2
Subprograme
1. Se consider funcia:
x +1
1 + x 2 , pentru x [-1,1];
f ( x ) = x + 1, pentru x (-,-1); .
6
1+ x , pentru x (1, ).
Se citesc dou valori reale a i b. S se scrie un program care afieaz care dintre
valorile f(a) i f(b) este cea mai mare.
n plus, dac ntr-un alt program este necesar sortarea altui vector de
numere reale, metoda clasic ne permite s alegem din secvena de instruciuni ce
formeaz programul pe cele ce realizeaz sortarea, s le copiem n noul program
i s facem eventualele adaptri (numrul de componente i numele vectorului pot
fi altele). Aceste operaii sunt destul de greoaie i necesit mult atenie. Prin
implementarea modular, cu ajutorul subprogramelor, preluarea se realizeaz
mult mai uor.
n
1 1 1 1 1 1
E1 = 1 + + + + ; E 2 = 1 + + + + .
2 3 n 2 3 n
Funcia are variabile proprii - adic variabile care sunt definite n cadrul ei. n
exemplu, ele sunt s i i. Aceste variabile se numesc variabile locale.
var n:integer;
function subp(n:integer):real;
var s:real;
i:integer;
begin
s:=0;
for i:=1 to n do s:=s+1/i;
subp:=s;
end;
begin
write ('n='); readln(n);
write(subp(n):5:2);
end.
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
var n,i:integer;
rez,prod:real;
function subp(n:integer):real;
var s:real;
i:integer;
begin
s:=0;
for i:=1 to n do s:=s+1/i;
subp:=s;
end;
begin
write ('n='); readln(n);
rez:=subp(n);
prod:=1;
for i:=1 to n do prod:=prod*rez;
write(prod:5:2);
end.
Apelul unei proceduri se face prin utilizarea numelui ei, sub forma nume;.
Mai precis, apelul unei proceduri este instruciune, numit instruciunea
de apel.
La apel, controlul programului este transferat la prima instruciune a
procedurii - dup cum se ntmpl i la funcii. Dup executarea procedurii,
se revine n programul principal la prima instruciune care urmeaz celei de
apel - n cazul de fa se ntlnete o alt instruciune de apel.
Ca i funciile, procedurile se pot plasa n cadrul programului ntre
declaraiile de variabile i instruciunea compus.
Orice variabil a programului principal este i variabil a procedurii (invers nu
este adevrat).
Exemplu:
function suma(x,y:integer):real;
begin
suma:=x+y;
end
begin
suma:=x+y;
end
Exemplu:
procedure suma(var s:real; x,y:real);
begin
s:=x+y;
end;
- blocul este:
begin
s:=x+y;
end;
Manual de informatic pentru clasa a XI-a 27
Dei aparent asemntoare, cele dou noiuni difer. Buna nelegere a lor
ne ajut s evitm anumite erori. Mai mult, aceste noiuni sunt utilizate de orice
limbaj de programare, nu numai de Pascal.
program exemplu2;
var x:integer;
procedure t;
procedure z;
begin
writeln('eu sunt z');
end;
begin
writeln(x); z;
end;
begin
x:=3;
t
end.
28 Capitolul 2. Subprograme
Exemple
Exemple
procedure s1;
begin
writeln('s1')
end;
procedure s2;
begin
s1;
writeln ('s2');
end;
begin
s1;
s2;
end.
Procedura test conine definiia a dou proceduri s1 i s2. Nici una din
aceste proceduri nu se consider declarat pentru programul principal.
Amndou sunt declarate pentru procedura test. Pentru procedura s2, s1
este declarat, dar pentru s1 procedura s2 nu este declarat.
Manual de informatic pentru clasa a XI-a 29
procedure test;
procedure s1;
begin
writeln('s1')
end;
procedure s2;
begin
s1;
writeln('s2');
end;
begin
s1;
s2;
end;
begin
test;
end.
procedure b; forward;
procedure a;
begin
writeln('Eu sunt a');
b;
end;
procedure b;
begin
writeln('Eu sunt b')
end;
begin
a;
end.
var p,x,y:integer;
function prod(x,y:integer):integer;
begin
prod:=x*y;
end;
begin
x:=2;
y:=3;
p:=1+prod(x,y);
writeln(p)
end.
Observaii
Cele cteva exemple date pn acum fac inutil prezentarea unui alt
exemplu. Trebuie s tim c:
var x,y,sum:integer;
procedure suma(a,b:integer; var s:integer);
begin
s:=a+b;
end;
begin
x:=3; y:=4;
suma(x,y,sum); writeln(sum);
suma(2,3,sum); writeln(sum);
end.
32 Capitolul 2. Subprograme
Exemple
type vector=array [1..9] of integer;
...
procedure test(n:integrer, v:vector); {corect}
procedure test(n:integrer, v:array[1..9] of integrer); {incorect}
Figura 2.5.
Sintaxa parametrilor trimii
Manual de informatic pentru clasa a XI-a 33
n acest paragraf vom analiza modul prin care sunt memorai parametrii
transmii n momentul lansrii n executare a subprogramului.
a b s
La al doilea apel, parametrii sunt: 2, 3, sum.
a b s
Observaii
Exemplu:
var n:integer;
procedure test(n:integer);
begin
n:=n+1;
writeln(n)
end;
begin
n:=1;
test(n);
writeln(n);
end.
La ieirea din procedur, variabila n (din stiv) se pierde - adic nu mai are
spaiu alocat. Prin urmare, valoarea 2 este pierdut.
parametrii efectivi sunt valori sau expresii, care mai nti se evalueaz.
Exemplu:
procedure test(n:integer);
begin
writeln(n)
end;
begin
test(3);
test(3+4*5);
end.
Manual de informatic pentru clasa a XI-a 35
Exemplu:
program test_param;
var x,y:integer;
function suma (a,b:integer):integer;
begin
suma:=a+b;
end;
function dif (a,b:integer):integer;
begin
dif:=a-b;
end;
function prod(a,b:integer):integer;
begin
prod:=a*b;
end;
begin
write('x='); readln(x);
write('y='); readln(y);
writeln(prod(dif(x,y),suma(x,y)));
end.
n acest caz, ne putem ntreba care este mecanismul prin care, dei pentru o
variabil transmis se reine adresa sa, n subprogram putem adresa
variabila normal (nu indirect)? La compilare, orice referin la variabila
respectiv, este "tradus" ca adresare indirect.
36 Capitolul 2. Subprograme
Alt termen des utilizat n practica programrii este durata de via a unei
variabile. El se refer la perioada de timp n care variabila este alocat n memorie.
Astfel, avem:
durat static - variabila are alocat spaiu pe tot timpul executrii programului.
durata local - variabila are alocat spaiu doar n timpul ct se execut un
anumit bloc.
durat dinamic - alocarea spaiului de memorie se face n timpul executrii prin
subprograme speciale sau operatori (n Pascal avem subprograme speciale).
Variabilele cu aceast durat de via se numesc dinamice i nu se trateaz n
acest manual.
38 Capitolul 2. Subprograme
Reamintim faptul c un tip este standard dac este cunoscut de limbaj (de
exemplu, integer). n caz contrar tipul este nestandard (de exemplu, tipul care
descrie un vector cu componente de tip real). Iat o procedur scris greit:
procedure er (var v:array[1..99] of real);
...
begin
...
end;
IMPLEMENTATION
[tipuri de date i variabile locale (valabile numai pentru unitatea de
program)]
procedurile i funciile utilizate de unitatea de program
[BEGIN
....... o eventual secven de program care se execut
....... n momentul declarrii unitii de program n
....... programul care o utilizeaz.
END.]
interface
var a,b:real;
procedure adun(a,b:real);
procedure scad(a,b:real);
procedure produs(a,b:real);
procedure impart(a,b:real);
implementation
var c:real;
procedure adun(a,b:real);
begin
c:=a+b;
writeln(c:3:2);
end;
procedure scad(a,b:real);
begin
c:=a-b;
writeln(c:3:2);
end;
procedure produs(a,b:real);
begin
c:=a*b;
writeln(c:3:2);
end
procedure impart(a,b:REAL);
begin
if b=0 then writeln('Impartirea nu se poate face ')
else
begin
c:=a/b;
writeln(c:3:2);
end;
end;
begin
write('a=');
readln(a);
writeln('b=');
readln(b);
end.
Manual de informatic pentru clasa a XI-a 41
uses operatii;
var c,d:real;
begin
adun(a,b);
scad(a,b);
produs(a,b);
impart(a,b);
write('c=');
readln(c);
write('d=');
readln(d);
adun(c,d);
scad(c,d);
produs(c,d);
impart(c,d);
readln;
end.
#include <iostream.h>
double subp(int n)
{ double s=0;
int i;
for (i=1;i<=n;i++) s+=1./i; // sau s=s+1./i
return s;
}
main()
{ int n,i;
double rez, prod=1;
cout<<"n="; cin>>n;
rez=subp(n);
for (i=1;i<=n;i++) prod*=rez;
cout<<prod;
}
La apel, lucrurile stau altfel: valorile acestora sunt cunoscute. Prin urmare,
acetia se numesc parametri efectivi.
#include <iostream.h>
void citesc(int vt[10],int n)
{ int i;
for(i=0;i<n;i++)
{ cout<<"v["<<i+1<<"]=";
cin>>vt[i];
}
}
void sortez(int vt[10],int n)
{ int gasit,i,man;
do
{ gasit=0;
for (i=0;i<n-1;i++)
if (vt[i]>vt[i+1])
{ man=vt[i];
vt[i]=vt[i+1];
vt[i+1]=man;
gasit=1; }
} while (gasit);
}
44 Capitolul 2. Subprograme
Cele trei funcii au tipul void, adic nu au valoare de retur. Ele returneaz
rezultatul prin intermediul parametrilor.
tip nume.
Exemple de antete:
- int suma(int a, int b) - funcia se numete suma, returneaz un
rezultat de tip int i are doi parametri formali de tip int, numii a i b.
- void t(int n, float v[20]) - funcia se numete t, este de tip void
(nu returneaz rezultat prin nume), are doi parametri formali, primul numit n, de
tip int, al doilea numit v, de tip float* (un tip care reine adrese de vectori
cu elemente de tipul float).
Observaii
test(2-3,2+3),
Segment de date
Segment de stiv
Heap
clasa de memorare;
vizibilitate;
durata de via;
tipul variabilei, singurul pe care l-am studiat pn n prezent.
Astfel avem:
A) Variabile globale
3. Durata de via a variabilelor globale este static. Ele au spaiu rezervat n tot
timpul execuiei programului.
B) Variabile locale
Acestea sunt declarate n corpul funciilor. Mai precis, pot fi declarate n orice
bloc (instruciune compus) al acestora.
Variabila a este declarat n corpul funciei t(), iar variabila b este declarat
n corpul funciei main().
Exemplu:
void t()
{ int a=3;
}
main()
{ int b=4;
}
Exemplu:
register int b=4;
Exemplu:
void t()
{ int b=4;
{ int c=3;
cout<<b<<" "<<c;
}
}
Manual de informatic pentru clasa a XI-a 49
Observaii
n cazul n care, ntr-un anumit bloc sunt vizibile (se pot accesa) mai multe
variabile, toate cu acelai nume, dar au domenii de vizibilitate diferite, se
acceseaz variabila cu vizibilitatea cea mai mic. De exemplu, dac n
programul anterior se tiprete variabila a din cadrul subblocului funciei, se
tiprete 3, pentru c acesta este coninutul variabilei cu cea mai mic
vizibilitate (cea declarat n subblocul respectiv).
Exist posibilitatea ca, un ciclu for s conin declaraia unei variabile locale.
n secvena urmtoare se calculeaz suma primelor 4 numere naturale.
Variabila i este declarat (i n consecin vizibil) doar n blocul for:
3. Durata de via a variabilelor locale este att timp ct dureaz execuia blocului
respectiv.
Iat, de exemplu, cum sunt memorai n stiv parametrii n cazul primului apel:
stiva 2 3
a b
Observaii
Exemplu:
#include <iostream.h>
void test (int n)
{ n+=1;
cout<<n<<endl;
}
main()
{ int n=1;
test(n);
cout<<n<<endl;
}
Apelm funcia. La apel, se rezerv spaiu n stiv, spaiu care are numele
parametrului (deci tot n) i este iniializat cu valoarea memorat de variabila
n a programului principal. n acest moment avem dou variabile n i ambele
rein valoarea 1.
La ieirea din funcie, variabila n (din stiv) se pierde - adic nu mai are
spaiu alocat. Prin urmare, valoarea 2 este pierdut.
Exemplu:
#include <iostream.h>
void test (int n)
{ cout<<n<<endl;
}
main()
{ test(3);
test(3+4*5);
}
#include <iostream.h>
void vector (int x[10])
{ for (int i=0;i<10;i++) x[i]=i;
}
main()
{ int a[10];
vector(a);
for (int i=0;i<10;i++) cout<<a[i]<<" ";
}
Manual de informatic pentru clasa a XI-a 53
#include <iostream.h>
void intersc(int &a,int &b)
{ int man=a;
a=b;
b=man;
}
main()
{ int x=2,y=3;
intersc(x,y);
cout<<x<<" "<<y;
}
Dei aparent asemntoare, cele dou noiuni difer. Buna nelegere a lor
ne ajut s evitm anumite erori. Mai mult, aceste noiuni sunt utilizate de orice
limbaj de programare, nu numai n C++.
#include <iostream.h>
void s1()
{ cout<<"Eu sunt s1"<<endl;
}
void s2()
{ s1(); cout<<"Eu sunt s2"<<endl;
}
main()
{ s1();
s2();
}
#include <iostream.h>
void s2();
void s1()
{ s2(); cout<<"Eu sunt s1"<<endl;
}
void s2()
{ cout<<"Eu sunt s2"<<endl;
}
main()
{ s1();
}
x +1
1 + x 2 , pentru x [-1,1];
f ( x ) = x + 1, pentru x (-,-1); .
6
1+ x , pentru x (1, ).
Rezolvare. Cunoatei deja modul n care se calculeaz cel mai mare divizor
comun pentru dou numere naturale date. Cel mai mic multiplu comun a dou
numere se poate determina mprind produsul lor la cel mai mare divizor comun al
lor. Prin urmare, scriem o funcie cmmdc cu doi parametri formali m i n, care
ntoarce o valoare ntreag - cel mai mare divizor comun al lor.
56 Capitolul 2. Subprograme
Exerciii
1. Gsii dou motive pentru care parametrii funciei cmmdc trebuie s fie transmii
prin valoare i nu prin referin.
2. Scriei un subprogram cmmmc care s returneze cel mai mic multiplu comun a
dou numere naturale. Stabilii locul unde trebuie integrat acesta n programul dat
i modificai programul principal astfel nct s se utilizeze subprogramul cerut.
3. Cte expresii diferite care au ca rezultat cel mai mare divizor comun al
numerelor naturale nenule a, b i c exist? n orice expresie se utilizeaz numai
apeluri ale funciei cmmdc i variabilele a, b i c. De exemplu, trei expresii sunt:
cmmdc(cmmdc(a,b),c),
cmmdc(cmmdc(b,a),c) i
cmmdc(c,cmmdc(a,b)).
Rezolvare. Dispunem deja de o funcie care calculeaz cel mai mare divizor
comun a dou numere i am testat-o n programul anterior. Pentru varietate, de
data aceasta implementm o funcie cu algoritmul lui Euclid pentru calculul celui
mai mare divizor comun, algoritm prin mpriri, nu prin scderi repetate. Cu
ajutorul ei calculm cel mai mare divizor comun pentru valorile reinute de primele
dou componente i memorm aceast valoare n variabila c. Apoi, pentru fiecare
dintre componentele urmtoare, se calculeaz cel mai mare divizor comun ntre
valoarea curent memorat n c i cea reinut de componenta curent a
vectorului. Cel mai mare divizor comun va fi reinut din nou de c.
Manual de informatic pentru clasa a XI-a 57
Exerciiu
n locul secvenei
c cmmdc(v[1],v[2])
pentru i=3,n execut
c cmmdc(c,v[i])
sfrit pentru
Care este valoarea pe care trebuie s o aib variabila c naintea acestei secvene?
Exerciii
1. Dup apelul tipar(m,n) din programul principal, dac se adaug o instruc-
iune care afieaz valoarea lui n, ce valoare estimai c se va tipri?
2. Cum trebuie s arate definiia subprogramului suc, dac n subprogramul
tipar, n loc de nsuc(n), se utilizeaz instruciunea suc(n)?
3. Cum putem defini subprogramul suc astfel nct secvena de afiare din
subprogramul tipar s fie:
pentru i=1,m execut
pentru j=1,i execut
scrie suc(n)
sfrit pentru
scrie EOLN
sfrit pentru
Manual de informatic pentru clasa a XI-a 59
Care este avantajul scrierii fiecrei funcii? Acesta este dat de faptul c,
atunci cnd scriem funcia, ne concentrm exclusiv asupra ei, deci posibilitatea de
a grei este mai mic. Dac dispunem de funcie, algoritmul n continuare devine
mult mai simplu. n plus, este posibil ca oricare dintre funcii s poat fi folosit i n
alte cazuri, la rezolvarea altor probleme.
Observaii
Exerciii
1. Modificai antetul funciei invers, transformnd parametrul n n parametru
transmis prin referin i urmrii efectele modificrii efectuate.
Junior Division
Rezolvare. Suma cuburilor cifrelor unui numr natural este calculat de funcia
suma. Numrul n (citit) va fi memorat de prima component a vectorului seria.
Apoi, suma cuburilor sale, de componenta a doua, suma cuburilor numrului reinut
de a doua component va fi reinut de a treia component, .a.m.d. Dup ce este
memorat o valoare, ea este comparat, pe rnd, cu cele obinute anterior. Dac
este regsit, se tiprete numrul de termeni ai seriei i seria propriu-zis.
Funcia suma calculeaz suma cuburilor cifrelor unui numr. Funcia este verific
dac valoarea n exist deja n irul s format din ls componente.
Manual de informatic pentru clasa a XI-a 61
3 4
3 1 7 9
1 2 3 4
9 1 3 8
62 Capitolul 2. Subprograme
Probleme propuse
a) G(x) = sin(x)+cos(x)cos(2x);
b) H(x) = 10{x} (am notat prin {x} partea fracionar a lui x).
Manual de informatic pentru clasa a XI-a 63
7. Scriei o funcie care returneaz prima cifr a unui numr natural. De exemplu,
dac parametrul efectiv este 127, funcia va returna 1.
11. S se tipreasc toate numerele prime aflate ntre doi ntregi citii. Programul va
folosi o funcie care testeaz dac un numr este prim sau nu.
12. Scriei un program care tiprete numerele ntregi gsite ntre dou valori citite,
numere care se divid cu suma cifrelor lor. Programul va utiliza o funcie care
returneaz suma cifrelor unui numr ntreg primit ca parametru.
13. S se scrie o procedur care permut dou linii date ale unei matrice ptratice.
14. Scriei o procedur care interclaseaz doi vectori sortai tiind c acetia sunt
ordonai descresctor.
17. Un numr raional este reinut prin utilizarea unui vector cu dou componente.
Scriei subprogramele care adun, scad, nmulesc i mpart dou numere
raionale. Subprogramele trebuie s returneze numrul simplificat.
Junior Division
Manual de informatic pentru clasa a XI-a 65
a) 6 6; b) 5 6; c) 6 6; d) 6 5.
a) 3; b) 4; c) 5; d) eroare de sintax.
22. tiind c valorile citite ale variabilelor a i b sunt numere naturale nenule, care
dintre secvene utilizeaz subprogramul increment pentru a obine produsul celor
dou numere?
23. Pentru varianta de limbaj preferat, stabilii care dintre urmtoarele antete de
subprogram sunt corecte:
a) procedure p(n:integer; var void p(int n, int& v[10])
v:array[1..10] of integer);
b) function p(n:integer;var p(int n, float& v)
v:real);
c) procedure p(n:integer;v:real); void p(int n, float v)
d) function p(n):integer; int p(int& n; float v)
24. Pentru funciile definite mai jos, care dintre afirmaii este fals?
25. Fiind dat funcia urmtoare, care dintre afirmaii sunt adevrate?
26. Fiind dat funcia urmtoare, care dintre afirmaii este fals?
n care:
a) Concat(X,Y,a,b,Z,p);
Elimin(Z,p);
b) Elimin(X,a); Elimin(Y,b);
Concat(X,Y,a,b,Z,p);
c) Elimin(Concat(X,Y,a,b,Z,p),p);
d) Elimin(X,a); Elimin(Y,b);
Reun(X,Y,a,b,Z,p);
C. Dac n=20, cte spaii se scriu naintea primului caracter *, pe penultimul rnd?
A. Care este coninutul lui V dup apel, dac nainte este V=(1,2,3,4)?
a) V=(1,2,3,4); b) V=(4,3,2,1);
c) V=(0,1,6,10); d) V=(0,4,5,9).
B. Care trebuie s fie iniial coninutul lui V, dac dup apel este V=(1,6,10,0)?
a) V=(2,4,6,8); b) V=(1,6,10,0);
c) V=(0,10,6,1); d) V=(1,9,3,2).
a) 3; b) 5;
c) nu exist o astfel de valoare; d) 2.
C. Pentru X=(1, ,5,7), Y=(1,2, ,7), stabilii ce valori pot fi scrise n casete
astfel nct apelul cmp(4,4,X,Y) s returneze aceeai valoare ca i apelul
cmp(4,4,Y,X).
a) 2 i respectiv 3; b) 2 i respectiv 5;
c) nu exist astfel de valori; d) 3 i respectiv 6.
D. Pentru care ir de vectori, funcia Cmp, apelat pentru oricare doi vectori
consecutivi n ir, returneaz aceeai valoare?
Rspunsuri
19. d); 20. c); 21. a); 22. b); 23. c); 24. d); 25. b), c); 26. a);
29. Indicaie: fiecare numr este scris n binar pe o linie a matricei. Se afieaz
numerele zecimale obinute din numerele n binar de pe fiecare coloan a matricei.
A. c), B. a), C. a).
30. Indicaie: funcia realizeaz compararea lexicografic a doi vectori care rein
numere naturale. A. a) 0; b) -1; c) 1; d) 0; B. c); C. b); D. d).
73
Capitolul 3
iruri de caractere
3.1. Generaliti
7 I e p u r a s
t[0] t[1] t[2] t[3] t[4] t[5] t[6] t[7] t[8] t[255]
Mai mult, putem modifica coninutul unui singur octet, aa cum rezult din
programul urmtor.
var t: string;
begin
t := 'Iepuras';
t[6] := 'i';
write(t);
end.
n loc de 'a', t[6] reine 'i'. Prin urmare, programul afieaz 'Iepuris'.
Definiia 3.2. Concatenarea este operaia prin care din dou iruri de
caractere se obine un al treilea, format astfel: primul ir (cel aflat n
stnga operatorului), urmat de al doilea ir (cel aflat n dreapta
operatorului).
Exemplu:
program st6;
var t, z: string;
begin
t := 'acest';
z := ' exemplu';
t := t+z;
writeln(t);
end.
Observaii
dac codul primului caracter al irului a este mai mare dect codul
primului caracter al irului b, atunci a>b.
dac codul primului caracter al irului b este mai mare dect codul
primului caracter al irului a, atunci a<b (b>a).
Exemple:
a='abc', b='bactr'. Atunci a<b, pentru c a[1] este a i are codul mai
mic dect b[1] care este b.
a='abc', b='aba'. Atunci a>b, codul lui a[1] este egal cu codul lui b[1],
codul lui a[2] este egal cu codul lui b[2], iar codul lui a[3] este mai mare
dect codul lui b[3].
a='abc', b='abca'. Aici m=3, n=4. Atunci a<b, codul lui a[1] este egal cu
codul lui b[1], codul lui a[2] este egal cu codul lui b[2], codul lui a[3]
este egal cu codul lui b[3] i n>m (irul b are mai multe caractere).
Algoritmul de sortare este unul studiat (care?), motiv pentru care nu revenim
asupra lui. Programul este prezentat n continuare:
Exemple:
irul 'mama' are lungimea 4;
irul 'mama ' are lungimea 5 (i blank-ul este caracter).
Exemple de utilizare
a) var a: string;
c: integer;
...
a := 'un test';
c := length(a);
2. Dup cum am nvat, octetul de indice 0 reine lungimea irului. Pentru a-l
obine folosim funcia ord astfel: ord(a[0]). De ce aa? Atunci cnd scriem
a[0] ne referim la un caracter. Folosind aceast expresie obinem caracterul care
are codul dat de numr (n binar). Deci, pentru a obine codul su, utilizm
funcia ord.
var a: string;
begin
write('a= '); readln(a);
writeln('lungimea sirului a este ', length(a));
writeln('lungimea sirului a este ', ord(a[0]));
end.
3.2.5. Subiruri
Exemple:
irul 'harnic' are ca subir irul 'rni'. Acesta ncepe n poziia a treia din
irul iniial (3 caractere);
irul 'mama' are ca subir irul 'ma'. Observm faptul c subirul apare de
dou ori - ncepnd cu poziiile 1 i 3. Prin urmare, n cadrul unui ir, un subir
poate aprea de mai multe ori.
irul 'harnic' nu are ca subir irul 'rnit', chiar dac primele trei
caractere (rni) se regsesc n irul iniial.
Manual de informatic pentru clasa a XI-a 81
Funcia copy are rolul de a extrage un subir din cadrul unui ir dat:
function copy(s:string;inceput,lungime:integer):string;
unde:
variabila s (de tip string) - conine irul din care se face extragerea;
inceput - reine poziia de nceput a subirului care se extrage;
lungime - reine numrul de caractere care se extrag.
Funcia pos are rolul de a verifica dac un ir este subir pentru altul:
function pos(subsir,sir:string):byte;
Funcia returneaz:
Exemple: 1. Fie irul 'abcde'. Se caut subirul 'bcd'. Acesta este gsit, iar
funcia returneaz 2 (poziia de nceput a subirului). Dac se caut subirul 'cz',
funcia returneaz 0 ('cz' nu este subir al irului 'abcde').
82 Capitolul 3 iruri de caractere
2. Programul urmtor citete dou iruri a i b i verific dac b este subir al lui
a. n ambele cazuri se dau mesaje. Dac b nu a fost identificat ca subir al lui a,
sau, n caz contrar, se afieaz poziia de nceput a sa.
var a, b: string;
n: integer;
begin
write('a= '); readln(a);
write('b= '); readln(b);
n := pos(b,a);
if n = 0 then writeln('b nu este subsir al lui a')
else writeln('b este subsir al lui a si incepe in
pozitia ',n);
end.
Exemplu:
var a, b: string;
begin
write('a= '); readln(a);
write('b= '); readln(b);
insert(b, a, 3);
writeln(a);
end.
Exemplu: dac a reine irul 'abcd' i b reine irul '123', programul afieaz
'ab123cd'.
Procedura delete are rolul de a terge un subir din cadrul unui ir dat.
Pentru aceasta, ea are ca parametri, n ordine:
procedure delete(var sir: string; indice, nr_car: integer);
unde:
Exemplu:
Aplicaia 3.2. tergerea tuturor apariiilor unui subir din cadrul unui ir:
Aplicaia 3.3. nlocuirea tuturor apariiilor unui subir cu alt subir. Analizai
programul urmtor pentru a descoperi modul n care se realizeaz aceasta:
var sir, sir_sters, sir_adaugat: string;
poz, lung: byte;
begin
writeln('introduceti sirul '); readln(sir);
writeln('introduceti sirul care se sterge);
readln(sir_sters);
writeln('introduceti sirul care se adauga);
readln(sir_adaugat);
lung := length(sir_sters);
poz := pos(sir_sters, sir);
while poz <> 0 do
begin
delete(sir,poz,lung);
insert(sir_adaugat, sir, poz);
poz := pos(sir_sters, sir);
end;
writeln(sir);
end.
Exemplu:
var a: string;
n: integer;
begin
write ('n= '); readln(n);
str(n, a);
writeln(a)
end.
Dac variabila n reine numrul 123, atunci a va reine irul ' 123'.
Rezult c irul, fr octetul de lungime, ocup 4 octei. n astfel de
cazuri, irul este completat n stnga cu numrul de blank-uri necesar.
var a: string;
x, er: integer;
begin
write('Sirul este '); readln(a);
val(a, x, er);
if er = 0 then writeln(' conversia a reusit ', x)
else
begin
writeln ('conversia nu a reusit');
writeln(x)
end
end.
Observaii
Dac variabila care reine rezultatul este de tip ntreg, iar irul conine punctul
zecimal, conversia nu reuete.
Programul de mai jos demonstreaz acest fapt (dac linia 1 a fiierului are 3
caractere, se vor afia dou pe un rnd i unul pe al doilea rnd). Dup citirea unei
astfel de variabile, pointerul se afl sau pe caracterul ce urmeaz dup ultimul
caracter citit sau pe CR. n situaia n care pointerul se afl pe CR i se foreaz o
nou citire de tip String, se returneaz irul vid.
var f: text;
a: string[2];
b: string;
begin
assign(f,'f1.dat');
reset(f);
read(f,a);
writeln(a);
read(f,b);
writeln(b);
close(f);
end.
3.3.1. Generaliti
c a l c u 0
Exemple:
char vect[11]="calculator".
char vect[]="calculator". n acest caz, compilatorul face calculul
numrului de octei necesari.
char vect[100]="calculator". Am rezervat mai muli octei dect era
necesar.
#include <iostream.h>
main()
{
char a[20];
cin>>a;
cout<<a;
}
Observaii
Din pcate, prin metoda de mai sus nu poate fi citit un ir care conine mai
multe cuvinte separate prin spaii. De exemplu, dac la rularea programului anterior
tastm irul " Un om", se va afia "Un". Aceasta nseamn c citirea se face astfel:
Se sar toate caracterele albe. n exemplu, s-au srit blank-urile.
Funcia:
cin.get(vector_de_caractere, int nr, char='\n')
citete un ir de caractere pn cnd este ndeplinit una dintre condiiile de mai jos:
au fost citite nr-1 caractere;
Observaii
De exemplu, dac tastm 'mama' i Enter se citete irul "ma", care va fi afiat.
2. La fel ca mai sus, dar citirea se ntrerupe la ntlnirea caracterului 'g' sau cnd
au fost citite 9 caractere ale irului.
char a[10];
cin.get(a,10,'g');
cout<<a;
n C++ pot exista mai multe funcii cu acelai nume, dar care difer prin
parametrii primii. Astfel, exist i funcia:
cin.get()
fr parametri. Ea are rolul de a citi un caracter (fie c este alb, fie c nu).
Observaie. n cazul utilizrii repetate a funciei cin.get() cu trei
parametri, apare o problem. Analizai programul urmtor:
#include <iostream.h>
#include <string.h>
main()
{ char sir1[1000], sir2[25];
cout<<"sir 1 ";
cin.get(sir1,1000);
cin.get();
cout<<"sir 2 ";
cin.get(sir2 ,25);
}
Din acest motiv, programul tiprete pentru a+1 irul "asa", pentru a+2
irul "sa", .a.m.d. Mai mult, vectorii astfel adresai pot fi accesai aa cum suntem
deja obinuii. Astfel, pentru exemplul anterior, (a+1)[0] reine caracterul 'a',
(a+1)[1] reine caracterul 's', etc.
Dup cum observai, a+1, a+2, ... sunt expresii. Orice expresie are un
anumit tip. Care este tipul lor? Tipul acestor expresii este char*. Ce semnificaie
are? Semnificaia este cea de adres.
#include <iostream.h>
main()
{ char a[]="Exemplu", *p;
p=a; cout<<p<<endl;
p++; cout<<p<<endl;
p++; cout<<p<<endl;
cout<<p[1]<<endl;
cout<<p-a;
}
#include <iostream.h>
#include <string.h>
main()
{ char a[100];
cin.get(a,100);
cout<<"Sirul citit are "<<strlen (a)<<" caractere";
}
Aa cum tim din lucrul cu tablouri, atribuirile de forma a=b, unde a i b sunt
vectori de caractere, nu sunt permise. Tot aa, o atribuire de forma a="un sir"
nu este permis. Astfel de operaii ca i multe altele se fac cu anumite funcii, puse
la dispoziie de limbaj. Pentru ca acestea s poat fi folosite, trebuie s fie inclus
fiierul antet "string.h", tot aa cum includem fiierul "iostream.h". Ordinea
de includere nu are importan. n continuare, vom prezenta cele mai uzuale funcii
i modul n care acestea se folosesc.
i are rolul de a copia irul de adres sursa la adresa dest. Copierea se termin
dup ce a fost copiat caracterul nul. Se returneaz adresa dest. Analizai
codul urmtor:
#include <iostream.h>
#include <string.h>
main()
{ char a[100]="un sir", b[100]="alt sir";
strcpy (a,b);
cout<<a;
}
i rolul de a aduga irului de adres dest irul de adres sursa. irul de adres
sursa rmne nemodificat. Aceast operaie se numete concatenare i nu este
comutativ. Rezultatul este adresa irului sursa, iar irul va avea ca lungime,
suma lungimilor celor dou iruri care au fost concatenate.
Manual de informatic pentru clasa a XI-a 95
n programul urmtor se caut n irul a caracterul 't'. Acesta este gsit, iar
programul tiprete irul "ta este". Evident, acesta este subirul care ncepe cu
caracterul 't'.
#include <iostream.h>
#include <string.h>
main()
{
char a[20]="Acesta este";
cout<<strchr (a,'t');
}
Programul de mai jos tiprete indicele primei apariii a caracterului 't', i anume 4:
#include <iostream.h>
#include <string.h>
main()
{
char a[20]="Acesta este";
cout<<strchr (a,'t')-a;;
}
Observaii
Fiecare adres de subir, care are ca prim caracter cel reinut de c, intr n
calculul indicelui acelui caracter - din ea se scade adresa de nceput.
Manual de informatic pentru clasa a XI-a 97
Dar care este mecanismul prin care se compar dou iruri de caractere?
Fie m numrul de caractere al irului s1 i n numrul de caractere al irului s2.
S presupunem c primele i caractere ale lui s1 coincid cu primele i ale lui s2.
n cazul n care codul caracterului i+1 al irului s1 este mai mare dect codul
caracterului corespunztor irului s2, avem s1>s2.
n cazul n care codul caracterului i+1 al irului s1 este mai mic dect codul
caracterului corespunztor irului s2, avem s1<s2. n cazul n care i la
aceast comparaie avem egalitate, avem patru posibiliti:
ambele iruri au un numr strict mai mare de caractere dect i+1, caz n
care se compar ca nainte caracterele de pe poziia i+2;
s1 are i+1 caractere, iar s2 are un numr de caractere mai mare dect
i+1, n acest caz s1<s2;
s2 are i+1 caractere, iar s1 are un numr de caractere mai mare dect
i+1, n acest caz s1>s2;
Exemple: "soare">s;
"tata">mama;
98 Capitolul 3 iruri de caractere
Funcia strcmp face distincie ntre literele mari i mici ale alfabetului.
i acelai rol ca strcmp. Diferena este c nu face distincie ntre literele mari i
mici.
Vectori de cuvinte. Exist aplicaii n care este necesar s se lucreze cu n
cuvinte - nelegnd prin cuvnt o succesiune de caractere care nu sunt albe. n
acest caz avem posibilitatea s declarm vectori de cuvinte. Acestea sunt, de fapt,
matrice cu elemente de baz de tip char.
Fiecare linie din cele 10 ale matricei poate reine un ir de caractere. Acesta poate
avea cel mult 25 de caractere (inclusiv caracterul nul). Cuvintele pot fi adresate prin
a[0] (primul cuvnt), a[1] cuvntul al doilea, .a.m.d.
do
{ gasit=0;
for (i=0;i<n-1;i++)
if (strcmp(cuvinte[i],cuvinte[i+1])>0)
{ strcpy(man,cuvinte[i]);
strcpy(cuvinte[i],cuvinte[i+1]);
strcpy(cuvinte[i+1],man);
gasit=1;
}
}
while (gasit);
for (i=0;i<n;i++) cout<<cuvinte[i]<<endl;
}
Dac pot compara dou cuvinte, atunci pot s le sortez. Am folosit sortarea
prin interschimbare. Iat c, algoritmii, cu precdere cei fundamentali, pot fi folosii
i ntr-un context diferit de cel n care au fost prezentai.
3.3.8. Subiruri
i are rolul de a identifica dac irul s2 este subir (caractere succesive) al irului
s1. Dac acesta este identificat, funcia returneaz adresa de nceput n cadrul
irului s1, altfel returneaz adresa nul (0). Cutarea se face de la stnga la
dreapta. n cazul n care s2 apare de mai multe ori n cadrul lui s1, se returneaz
adresa de nceput a primei apariii.
Exemplu: fie char s1[]="xyzt", s2[]="yz", atunci strstr(s1,s2);
returneaz s1+1 (adresa caracterului y n s1).
Aplicaia 3.10. tergerea tuturor apariiilor unui subir din cadrul unui ir.
Imediat ce am identificat adresa de nceput a subirului, restul irului (fr subir)
este copiat pe poziia de nceput a subirului.
#include <iostream.h>
#include <string.h>
main()
{ char sir[1000],subsir[25],*p;
int lung_subsir;
cout<<"introduceti textul ";
cin.get(sir,1000);
cin.get();
cout<<"introduceti subsirul ";
cin.get(subsir,25);
lung_subsir=strlen(subsir);
p=strstr(sir,subsir);
while (p)
{ strcpy(p,p+lung_subsir);
p=strstr(p,subsir);
}
cout<<sir;
}
Aplicaia 3.11. nlocuirea tuturor apariiilor unui subir cu alt subir. V las pe
dvs. s descoperii modul n care programul urmtor realizeaz aceasta:
#include <iostream.h>
#include <string.h>
main()
{ char sir[100], man[100], sterg[25], adaug[25], *p;
int lung_sterg, lung_adaug;
cout<<"introduceti textul ";
cin.get(sir,100);
cin.get();
cout<<"inlocuim subsirul ";
cin.get(sterg,25);
cin.get();
cout<<"cu subsirul ";
cin.get(adaug,25);
lung_sterg=strlen(sterg);
lung_adaug=strlen(adaug);
p=strstr(sir,sterg);
while (p)
{
man[0]=0;//subsir vid;
strncat(man,sir,p-sir);
strcat(man,adaug);
strcat(man,p+lung_sterg);
strcpy(sir,man);
p=strstr(p+lung_adaug,sterg);
}
cout<<sir;
}
Manual de informatic pentru clasa a XI-a 101
irul s1 este considerat ca fiind alctuit din 0, 1, ..., n entiti separate prin
unul sau mai multe caractere cu rol de separator, iar irul s2 ca fiind alctuit
din unul sau mai multe caractere cu rol de separator;
Exemplu: irul s1 este " mama, tata si bunicul". irul s2 este:
" ,". ntruct caracterele separatoare sunt blank-ul i virgula, rezult c
entitile sunt: "mama", "tata" "si" "bunicul".
Aplicaia 3.17. Se citete un text alctuit din mai multe cuvinte. Se cere s se
calculeze suma valorilor numerice ntlnite n text. Se presupune c valorile
numerice sunt introduse corect.
irul se separ n entiti. Dac o entitate este alctuit exclusiv din '+',
'-', '.' i cifre, atunci ea este convertit n double i adunat la o variabil s,
iniializat cu 0.
#include <iostream.h>
#include <string.h>
#include <stdlib.h>
main()
{ char sir[1000],separator[]=" ",cifre[]="0123456789.+-", *p;
double s=0;
cin.get(sir,1000);
p=strtok(sir,separator);
while (p)
{ if (strspn(p,cifre)==strlen(p)) s+=atof(p);
p=strtok(NULL, separator);
}
cout<<"suma numerelor intalnite in sir este "<<s;
}
Funcia ecvt are rolul de a converti o valoare de tip double ctre un ir.
Caracterul nul este adugat automat irului obinut. Forma general este:
char* ecvt(double valoare, int poz, int* zec, int* semn);
unde:
valoare - valoarea de convertit;
poz - numrul de poziii pe care trebuie s le ocupe irul obinut n urma
conversiei;
zec - adresa unei variabile, de tip int, care reine, dup apel, numrul
zecimalelor pe care le are numrul;
semn - adresa unei variabile, de tip int, care are rolul de a memora,
dup apel, 1, dac numrul este negativ, sau 0, n caz contrar.
dac val reine 1234, atunci se returneaz irul "123", zec reine 4 i
semn reine 0.
dac val reine 1239, atunci se returneaz irul "124", zec reine 4 i
semn reine 0.
dac val reine 1, atunci se returneaz irul "100", zec reine 1 i semn
reine 0.
dac val reine -0.001, atunci se returneaz irul "100", zec reine -3
i semn reine 1.
Funcia itoa are rolul de a converti o valoare de tip int ntr-un ir, a crui
adres este memorat n variabila sir. Valoarea baza reine baza de numeraie
ctre care s se fac conversia (de obicei baza este 10). n cazul bazei 10, irul
obinut reine i, eventual, semnul -. Funcia ntoarce adresa irului obinut.
Funcia ltoa are acelai efect ca itoa, deosebirea fiind dat de faptul c se
convertete ctre ir o valoare de tip long int.
Funcia ultoa are acelai efect ca itoa, deosebirea fiind dat de faptul c
se convertete ctre ir o valoare de tip unsigned long.
Funcia
long strtol(const char *s, char **endptr, int baza);
are rolul de a converti un ir ctre long. n afara irului care trebuie convertit,
funcia primete ca parametru de intrare adresa unei variabile de tip char*. Dup
apel, aceast variabil va reine poziia primului caracter din ir care nu poate fi
convertit. De exemplu, dac irul este "12m21", dup apel, variabila a crei adres
a fost transmis ca parametru reine adresa caracterului 'm'. Dar care este rostul
existenei acestei informaii? Cu ajutorul ei se pot depista eventualele erori aprute
atunci cnd se introduc datele. Privii irul dat anterior ca exemplu: e clar c
utilizatorul a dorit s introduc un numr, dar n locul unei cifre a tastat 'm'.
Funcia
double strtod(const char *s, char **endptr);
convertete un ir ctre double.
Funcia
long double _strtold(const char *(s), char **endptr);
convertete un ir ctre long double.
Funcia
unsigned long strtoul(const char *s,char **endptr,int baza);
convertete un ir ctre unsigned long.
Pentru a citi o linie a unui fiier text, se poate folosi funcia urmtoare:
Evident, n acest fel, la o citire pot fi aduse n memorie cel mult 32766
caractere (vezi limitele tipului int).
Observaii
Programul urmtor citete linie cu linie un fiier text ale crui linii nu au
mai mult de 500 de caractere i afieaz liniile pe monitor. Nu se
cunoate lungimea fiecrei linii.
#include <fstream.h>
main()
{ fstream f("f.dat",ios::in);
char Linie_citita[501];
while (f.getline(Linie_citita,501))
cout<<Linie_citita<<endl;
}
ir de caractere Variabil
Tot aa, se pot "citi" mai multe cuvinte dintr-un ir. Programul urmtor citete
cuvintele i le afieaz. De aceast dat se consider c este ir valid i cel de
lungime 0, fapt care conduce la o nou citire i deci la ciclare. Pentru aceasta,
de fiecare dat, se testeaz ca lungimea irului citit s fie nevid.
110 Capitolul 3 iruri de caractere
Probleme propuse
1. Se citete de la tastatur un text. Cuvintele se consider separate prin virgul,
spaiu sau punct. Cte cuvinte are textul citit?
2. Se citete de la tastatur un text i o succesiune de caractere. De cte ori
ntlnim aceast succesiune n cadrul textului?
3. Se citete un text. Dou cuvinte pot fi separate printr-unul sau mai multe spaii.
Se cere s se elimine spaiile inutile.
4. Se citete un fiier text care conine o singur propoziie, pe o linie. Programul
rearanjeaz literele n fiecare propoziie, n ordine alfabetic, pstrnd locul
cuvintelor. Numai literele de la 'A' la 'Z' sunt afectate. Celelalte caractere rmn
neschimbate. Ieirea va fi tot un fiier text. Numele fiierelor este ales de dvs.
Exemple:
Junior Division
Manual de informatic pentru clasa a XI-a 111
Capitolul 4
Structuri de date neomogene
Observaii
Cmpurile unei variabile de acest tip pot fi citite sau afiate individual. De
asemenea, li se pot atribui valori, pot intra n calcule, tot individual.
Dac a i b sunt dou variabile de acelai tip RECORD se pot face fr
probleme atribuiri de genul a:=b;.
n general, cmpurile care alctuiesc un tip RECORD pot avea orice tip. O
ntrebare: dar RECORD? Rspunsul este afirmativ. Analizai programul urmtor:
program r3;
type elev = record
nume: string[20];
data_n: record
zi, luna: byte;
an: integer;
end;
n_mat, n_fiz: real;
varsta: byte;
sex: char;
end;
var e: elev;
begin
with e do
begin
write('nume elev '); readln(nume);
with data_n do
begin
write('ziua nasterii '); readln(zi);
write('luna nasterii '); readln(luna);
write('anul nasterii '); readln(an);
end;
end
end.
Pentru un elev, se citesc numele i data naterii. Aceasta din urm este de
tipul RECORD (include ziua, luna i anul naterii). Pentru adresarea simplificat a
cmpurilor care o alctuiesc s-a folosit, din nou, instruciunea WITH. Adresarea s-ar
fi putut face i aa: e.data_n.zi, e.data_n.luna, e.data_n.an. Evident, o
astfel de adresare este greoaie i nerecomandat
Putem avea oricte niveluri de imbricare (un tip RECORD include un alt tip
RECORD, care include un altul, .a.m.d.).
Observaii
i se numete elev.
Manual de informatic pentru clasa a XI-a 119
Definiia structurii poate figura att n cadrul funciei main() ct i n faa ei,
dup includerile de fiiere antet. n ce ne privete, vom prefera a doua variant.
Se pune urmtoarea ntrebare: fiind dat o variabil de un tip struct, care
este modalitatea de acces la cmpurile ei? Pentru aceasta, se folosete operatorul
de selecie direct, notat cu '.', operator cu prioritate maxim.
ntre dou variabile de acelai tip struct se poate folosi atribuirea. Astfel,
dac inr1, inr2 sunt dou variabile de tip elev, prin atribuirea inr1=inr2,
variabila inr1 ia aceeai valoare ca variabila inr2. n C++, o astfel de atribuire se
mai numete copiere bit cu bit.
Pentru nceput, vom studia un tip aparte de dat structurat, numit union.
Analizai programul urmtor:
#include <iostream.h>
union test
{
int a;
char b[10];
double c;
};
main()
{
test var;int i;
cin>>var.c; cout<<var.c<<endl;
cin>>var.b; cout<<var.b;
}
main()
{ persoana pers;
cout<<"Nume persoana ";cin.get(pers.nume,30);
cout<<"Studii f-fara g-generala,l-liceu;s-superioare) ";
cin>>pers.studii;
switch (pers.studii)
{
case 'g': cout<<" numar clase ";
cin>>pers.std.nr_clase;
break;
case 'l': cout<<"anul terminarii liceului ";
cin>>pers.std.liceu.an_t;
cout<<"orasul ";
cin>>pers.std.liceu.oras;
break;
case 's': cout<<"numele facultatii ";cin.get();
cin.get(pers.std.facultate.nume_f,30);
cout<<"nr ani de studiu ";
cin>>pers.std.facultate.nr_ani;
}
Manual de informatic pentru clasa a XI-a 123
//afisez inregistrarea
cout<<pers.nume<<endl;
switch (pers.studii)
{
case 'f': cout<<"n-are saracu' studii "; break;
case 'g': cout<<" numar clase "<<pers.std.nr_clase; break;
case 'l': cout<<"a terminat liceul in "
<<pers.std.liceu.an_t
<<" in orasul "<<pers.std.liceu.oras; break;
case 's': cout<<"numele facultatii "
<<pers.std.facultate.nume_f
<<" nr ani de studiu "
<< pers.std.facultate.nr_ani;
}
}
Probleme propuse
1. Citii o variabil cu urmtoarea structur:
nume_elev: 30 caractere;
data_nasterii:
zi : intreg;
luna : intreg;
an : intreg;
nota matematica real;
nota informatica real;
nota engleza real;
media real;
Testai dac datele au fost introduse corect. Citirea se va verifica prin afiarea
rezultatului.
2. Citii n nregistrri de tipul celei de mai sus i afiai-le n ordinea alfabetic a
numelui.
Capitolul 5
Structuri de date
o mulime de valori;
o regul de codificare a acestora;
1
o mulime de operaii definite pe mulimea datelor.
Prin tipul de mai sus se descrie structura unei variabile capabil s rein
numere raionale. Fie A1 mulimea valorilor care pot fi memorate prin utilizarea
tipului ntreg. Fie A2=A1-{0}. Atunci, o variabil de tip rational poate memora
valori care aparin mulimii A1A2. Evident, este sarcina programatorului ca valoarea
reinut de variabila corespunztoare lui q s fie diferit de 0.
n unele lucrri vei ntlni definiii ale tipului de date care exclud regula de codificare. Aici
1
Fie B mulimea valorilor care pot fi reinute de tipul real. Atunci, variabila a
poate reine la un moment dat un element al mulimii:
B
B ...
B .
de n ori
Practica impune utilizarea unor structuri ale datelor de o mare varietate, care
nu se suprapun ntotdeauna peste tipurile care pot fi descrise prin limbaj.
Vom numi nod, o variabil de un tip oarecare. De obicei, acest tip este
structurat. Dup caz, termenul nod poate fi nlocuit cu articol, nregistrare sau
entitate.
n cele mai multe cazuri, "ansamblul de date" care formeaz structura este
alctuit dintr-o mulime cu un numr variabil de noduri.
Relaiile existente ntre noduri i operaiile care pot fi efectuate cu ele vor fi
prezentate prin exemple.
De reinut!
n practic s-au impus anumite structuri. Acest lucru este datorat faptului c
exist muli algoritmi care le utilizeaz. Ele vor fi tratate, pe scurt, n
paragrafele urmtoare.
126 Capitolul 5. Structuri de date
Definiia 5.2. O list liniar este o colecie de n0 noduri, X1, X2, ..., Xn
aflate ntr-o relaie de ordine. Astfel, X1 este primul nod al listei, X2
este al doilea nod al listei, ..., Xn este ultimul nod.
a) Evidena situaiei colare a elevilor unei clase. Fie n numrul elevilor. Aici, un
nod reine numele unui elev i notele la diversele materii. Vom avea deci, n noduri.
Nodurile vor fi memorate n ordinea alfabetic a numelor elevilor. n clasa
respectiv pot fi transferai elevi din alte clase, caz n care se adaug noduri. Din
clas, unii elevi pot pleca n alte clase, caz n care se terg noduri.
a) Accesul la oricare nod al listei se poate face cu mare uurin. Dac dorim s
adresm nodul k, atunci scriem V[k] (presupunnd c vectorul care reine nodul
se numete V).
7 3 1 2 8 9 5 8 3 2 6
7 1 2 8 9 5 8 3 2 6
7 1 2 8 9 5 8 3 2 6
7 3 1 2 8 9 5 8 3 2 6
128 Capitolul 5. Structuri de date
7 3 1 2 8 9 5 8 3 2 6
7 5 3 1 2 8 9 5 8 3 2 6
Observaii
in1, in2, ..., inn reprezint informaiile coninute de noduri, de alt natur
dect cele de adres.
Aa cum am nvat, lista liniar este alctuit din mai multe noduri ntre care
exist o relaie de ordine. n cazul alocrii nlnuite, informaia memorat de
fiecare nod va cuprinde i un cmp de adres -n cazul alocrii simplu nlnuit-
sau dou cmpuri de adres -n cazul alocrii dublu nlnuit. n acest paragraf
vom studia implementarea alocrii simplu nlnuit.
Iat cum se descrie informaia dintr-un nod, n cazul listelor alocate simplu
nlnuit, atunci cnd acesta reine un numr ntreg.
Pentru memorarea listei folosim un vector care are componentele de tip Nod,
descris mai jos:
Din descriere rezult c lista poate avea cel mult 1000 de noduri. Acesta
este spaiul disponibil.
L 7 3 5 4 1 5 4 0
1 2 3 4 5 6
130 Capitolul 5. Structuri de date
7 3 5 4 1 5 4 0
1 3 4 5
Ce observm?
a) Fiecare nod trebuie s rein i adresa nodului urmtor. Adresa este, de fapt,
indicele componentei din vector care reine informaia asociat nodului urmtor.
Prin urmare, necesarul de memorie este mai mare.
L 3 5 4 1 5 4
1 2 3 4 5 6
ocupat 1 0 1 1 1 0
1 2 3 4 5 6
L 7 3 5 4 1 5 4 0
1 2 3 4 5 6
ocupat 1 0 1 1 1 0
1 2 3 4 5 6
b) Memorm informaia: 9.
L 7 3 9 5 4 1 5 4 0
1 2 3 4 5 6
ocupat 1 1 1 1 1 0
1 2 3 4 5 6
L 7 3 9 5 5 4 1 5 4 0
1 2 3 4 5 6
ocupat 1 1 1 1 1 0
1 2 3 4 5 6
L 7 3 9 5 5 4 1 2 4 0
1 2 3 4 5 6
ocupat 1 1 1 1 1 0
1 2 3 4 5 6
7 3 5 4 1 5 9 5 4 0
1 3 4 5 5
132 Capitolul 5. Structuri de date
L 7 3 5 4 1 5 4 0
1 2 3 4 5 6
ocupat 1 0 1 1 1 0
1 2 3 4 5 6
L 7 4 5 4 1 5 4 0
1 2 3 4 5 6
ocupat 1 0 0 1 1 0
1 2 3 4 5 6
Lista va deveni:
7 4 1 5 4 0
1 4 5
Exemplele sunt date pentru lista liniar simplu nlnuit, dar bine nelese,
ne permit s deducem singuri modul de efectuare a operaiilor respective pentru
liste dublu nlnuite.
Manual de informatic pentru clasa a XI-a 133
Definiia 5.3. Stiva este o list pentru care singurele operaii permise
sunt:
Stivele se pot aloca secvenial (ca vectorii). Fie ST[i] un vector. ST[1],
ST[2], ..., ST[n] pot reine numai litere sau numai cifre. O variabil k indic
n permanen vrful stivei, adic ultimul element introdus.
B
Introducem n stiv litera B, deci k va lua valoarea 2.
A
Observaii
Exemple
x 1, x 12
F(x) =
F(F(x + 2)),x < 12
Vom ncepe prin a studia modul de calcul al funciei pentru x=15 i x=8:
f(15)=14;
f(8)=f(f(10))=f(f(f(12)))=f(f(11))=f(f(f(13)))=f(f(12))=f(11)
=f(f(13))=f(12)=11.
12 13
10 10 11 11
8 8 8 8 8
12 13
8 11 11 12
f=11
Se poate demonstra uor c pentru valori mai mici dect 12, funcia ia
valoarea 11. Observaia simplific mult programul, dar exemplul a fost dat n
alt scop.
n + 1, m=0
Ack(m, n) = Ack(m 1,1), n=0
Ack(m 1, Ack(m, n 1)), altfel
136 Capitolul 5. Structuri de date
Pentru calculul acestei funcii, folosim o stiv dubl, ST. Iniial, valorile m i n
se rein la nivelul 1. Pe nivelul k al stivei se rein valorile curente m i n. n funcie de
valorile acestora se procedeaz astfel:
pentru cazul n=0, se rmne pe acelai nivel n stiv, punnd n locul lui m
valoarea m-1, iar n locul lui n, valoarea 1;
1 0 0 1
2 0 1 1 1 1 1 1
2 1 2 1 2 1 2 1 2 1
1 0
1 1 1 1
0 2 1 3 1 2 1 2
2 1 1 3 1 2 1 3 1 3
0 1
1 1 0 2
1 2 1 2 0 3
1 3 1 3 1 3 0 4 ack(2,1)=5.
Manual de informatic pentru clasa a XI-a 137
Funcia lui Ackermann ia valori extrem de mari pentru valori mici ale lui m i
n. De exemplu, nu vei reui s calculai Ack(4,4). ncercai...
138 Capitolul 5. Structuri de date
Definiia 5.4. O coad este o list pentru care toate inserrile sunt fcute
la unul din capete, toate tergerile (consultrile, modificrile) la cellalt
capt.
1 2 3 4
2 3 4 5
3 4 5 6
Probleme propuse
1. Care dintre structurile de mai jos nu este liniar?
a) b) c) d)
Exemplu: k=3; V=(1,2,3); p=2. Numrul citit este 5. Dup rulare trebuie s
avem:
k=4; V=(1,5,2,3).
Exemplu: k=3; V=(1,2,3); p=2. Dup rulare trebuie s avem: k=2; V=(1,3).
4. Pentru problema anterioar, care dintre afirmaiile de mai jos este fals?
a) Pentru a terge un nod aflat pe poziia p sunt necesare k-p deplasri spre
stnga ale coninuturilor celorlalte noduri.
b) Subprogramul va avea parametrul k transmis prin valoare.
c) Subprogramul va avea parametrul k transmis prin referin.
d) Dac k=p, nu se efectueaz deplasri ctre stnga.
10. n jurul arbitrului sunt aezai N juctori numerotai n sens orar. Arbitrul,
ncepnd de la un juctor K numr pn la M. Persoana la care s-a oprit
numrtoarea este eliminat din cerc. Arbitrul repet procedeul ncepnd cu
persoana urmtoare celei eliminate. Procedeul se repet pn cnd rmne un
juctor L. S se scrie un program care:
citete M, N, K i-l determin pe L;
citete M, N, L i-l determin pe K.
11. Urmrii secvena urmtoare, care se refer la o stiv, unde Push a este
operaia prin care se pune n stiv valoarea a, iar Pop este operaia prin care se
extrage din stiv.
Push 1; Push 2; Pop; Push 3; Push 4; Pop; Pop
Care din afirmaiile de mai jos nu este adevrat dup executarea secvenei
de mai sus?
a) Din stiv au fost extrase, n aceast ordine, valorile: 2, 4, 3;
b) stiva este vid; c) stiva conine valoarea 1; d) stiva are un singur nivel.
15. S se scrie un program care, pentru problema de mai sus, citete ca date de
intrare irul vagoanelor aflate pe linia A i irul vagoanelor care trebuie obinut pe
linia B. Se cere s se afieze irul mutrilor de tip Push nr_vagon i Pop
nr_vagon (ai recunoscut, desigur, o structur de tip stiv) prin care se poate
obine irul vagoanelor de pe lina B. Dac acest ir nu se poate obine, n momentul
n care se ajunge n situaia unei mutri imposibile, s se afieze mesajul
Imposibil.
Rspunsuri
1. d) 4. b) 11. b) 14. d)
141
Capitolul 6
Introducere n recursivitate
procedure exemplu(n:integer);
begin
if n<>0 then
begin
writeln(n);
exemplu(n-1);
end
end;
begin
exemplu(7);
end.
function suma(n:integer):integer;
begin
suma:=0;
if n<>0 then
suma:=n+suma(n-1);
end;
begin
writeln(suma(7));
end.
Dup cum tim, n C++ funciile pot fi de tipul void sau de un alt tip. n acest
din urm caz, funciile returneaz o anumit valoare. Oricare ar fi tipul funciei,
aceasta se poate autoapela, ns modul n care se realizeaz autotransferul, difer.
#include <iostream.h>
int suma (int n)
{ if (n!=0) return n+suma(n-1);
}
main()
{ cout<<suma(7);
}
1, n=0
n! = fact(n) = cu n N
n fact(n 1), altfel
3!=fact(3)=3fact(2)=32fact(1)=321fact(0)=3211=6.
n 3
n 3
1 1 3 Referin ctre p
p val n prod
2 3 Referin ctre p
1 1 3 Referin ctre p
p val n prod
3 3 Referin ctre p
2 3 Referin ctre p
2 1 3 Referin ctre p
p val n prod
Pentru c val este 3 - mai mic sau egal cu 3 - se efectueaz prod=prod*val, deci p
ia valoarea 6, dup care se revine pe nivelul 2, apoi 1, apoi n programul principal.
Observaii
Dup cum rezult din aceste exemple, subprogramul lucreaz cu datele aflate
pe un anumit nivel al stivei pentru variabilele transmise prin valoare, variabilele
locale i variabilele transmise prin referin.
Exist posibilitatea ca subprogramul s lucreze direct cu variabilele globale fr
ca acestea s fie transmise prin referin. Dup cum tim variabilele globale pot fi
accesate din orice subprogram. n exemplu, am preferat varianta de a trece ca
parametru variabila transmis prin referin, att din motive didactice ct i pentru
a asigura independena subprogramului. Dezavantajul este dat de faptul c stiva
va fi ncrcat suplimentar cu adresa acestei variabile.
Manual de informatic pentru clasa a XI-a 147
Observaii
Rezolvare. Aceast aplicaie a fost tratat iterativ, prin utilizarea stivei. n cazul
tratrii recursive, nu facem altceva dect s transcriem definiia recursiv a funciei.
n + 1, m=0
Ack(m, n) = Ack(m 1,1), n=0
Ack(m 1, Ack(m, n 1)), altfel
Rezolvare. Utilizm o definiie recursiv a celui mai mare divizor comun pentru
dou numere naturale a i b:
a, a=b
cmmdc(a, b) = cmmdc(a b, b),a > b
cmmdc(a, b a), a < b
Manual de informatic pentru clasa a XI-a 151
Aplicaia 6.5. S se scrie o funcie recursiv pentru a calcula suma cifrelor unui
numr natural.
Reinem ideea: se izoleaz ultima cifr, iar lui n i se atribuie ctul ntreg
dintre vechea valoare i 10. Aceast idee folosete pentru a gsi o relaie de
recuren, necesar elaborrii variantei recursive. Relaiile sunt scrise prin
utilizarea operatorilor din Pascal (stnga) i C++ (dreapta):
0, n=0 0, n=0
S(n) = S(n) =
n mod 10+ S(n div 10), altfel n % 10+ S(n / 10), altfel
Aplicaia 6.6. Se consider irurile definite recurent astfel: a0=a; b0=b; a,b>0:
a n1 + b n1
an = , b n = a n1b n1 .
2
begin main()
write(a=); readln(a); { cout<<"a="; cin>>a;
write(b=); readln(b); cout<<"b="; cin>>b;
write(n=); readln(n); cout<<"n="; cin>>n;
writeln(an(n):5:10, , cout<<an(n)<<' '<<bn(n);
bn(n):5:10) }
end.
se citete un caracter;
dac este diferit de 0, se reapeleaz funcia;
se tiprete caracterul.
213
1
312
12 132
Figura 6.1.
Cazul n care n=3
123
0 1 1 0
0 0 0 1
A=
0 1 1 1
1 0
0 0
1 1 1 0
1 1 1 1
A=
1 1 1 1
1 0 0 0
1 1 0 0
0 0 0 1
A= ,
1 1 1 1
1 1
1 1
0 1 1 0
0 0 0 1
A= .
0 1 1 1
1 0 0 0
Ca i n problemele anterioare, pentru a evita testul ieirii din matrice,
aceasta este bordat cu linii i coloane avnd valoarea 0. Algoritmul este tot cel
din problema anterioar (Fill), dar aici cutarea se face pe 8 direcii.
n programul principal se citete matricea i se caut primul element 1
printre elementele acesteia. Se apeleaz apoi funcia compact() care are rolul de
a marca cu 0 toate elementele matricei care aparin acestui prim obiect identificat.
La revenire, se testeaz dac mai exist elemente cu valoarea 1 n matrice. n
caz afirmativ, se poate trage concluzia c n fotografie aveam iniial mai multe
obiecte (altfel, fotografia coninea un singur obiect).
begin main()
write('M='); readln(m); { cout<<"M=";cin>>m;
write('N='); readln(n); cout<<"N=";cin>>n;
for i:=1 to m do for (i=1;i<=m;i++)
for j:=1 to n do for (j=1;j<=n;j++)
begin { cout<<"a["<<i<<','
write('a[',i,',',j,']='); <<j<<"]=";
readln(a[i,j]) cin>>a[i][j];
end; }
for i:=1 to n do for (i=1;i<=n;i++)
begin { a[0][i]=0;
a[0,i]:=0; a[m+1][i]=0;
a[m+1,i]:=0; }
end; for (i=1;i<=m;i++)
for i:=1 to m do { a[i][0]=0;
begin a[i][n+1]=0;
a[i,0]:=0; }
a[i,n+1]:=0 x=0;
end; do
x:=0; { x++;
repeat y=0;
x:=x+1; do
y:=0; { y++; }
repeat while (y!=n && a[x][y]!=1);
y:=y+1 }
until (y=n) or (a[x,y]=1) while ((x!=m) && a[x][y]!=1);
until (x=m) or (a[x,y]=1); compact(x,y,a);
compact(x,y,a); gasit=0;
gasit:=false; for (i=1;i<=m;i++)
for i:=1 to m do for (j=1;j<=n;j++)
for j:=1 to n do if (a[i][j]==1) gasit=1;
if a[i,j]=1 then if (gasit)
gasit:=true; cout<<"mai multe obiecte";
if gasit else cout<<"un obiect";
then writeln('mai multe }
obiecte')
else writeln('un obiect')
end.
Probleme propuse
1. Calculai recursiv suma a n numere naturale citite.
a) 12+23+...+n(n+1);
b) 1+1/2+...+1/n;
c) 1/(23)+2/(3*4)+...+n/((n+1)(n+2)).
160 Capitolul 6. Introducere n recursivitate
1, k = 0;
C = n k + 1 k 1
k
n
Cn altfel.
k
V[1], n = 1;
max(V[1], V[2],...V[n]) =
max(max(V[1], V[2],...V[n 1]), V[n]) altfel.
9. Se citete un numr natural n. Se cere s se scrie o funcie recursiv care
returneaz cea mai mic baz n care se poate considera n.
10. Scriei o funcie recursiv care testeaz dac un numr natural n>1 este prim.
11. Scriei o funcie recursiv care returneaz suma elementelor pare ale unui
vector citit.
Exemplu: Pentru n=4 i V=(2,2,5,6), se returneaz 10.
12. Scriei o funcie recursiv prin care se testeaz dac un numr natural x se
regsete ntre componentele unui vector V cu n numere naturale.
13. Scriei o funcie recursiv care primete ca parametri dou numere naturale
i<j i un numr real x[i,j] i returneaz [x] (parte ntreag din x). Nu se
vor folosi funciile specializate ale limbajului.
Manual de informatic pentru clasa a XI-a 161
14. Scriei o funcie recursiv care verific dac un vector cu componente numere
naturale este palindrom (afiarea componentelor de la 1 la n coincide cu afiarea
lor de la n la 1).
15. Scriei o funcie recursiv care returneaz numrul cifrelor pe care le are un
numr natural primit ca parametru.
16. Scriei un subprogram recursiv care afieaz, cifr cu cifr, oglinditul unui
numr natural.
Exemplu: pentru n=123, se afieaz 321.
17. Scriei un subprogram recursiv care returneaz, oglinditul unui numr natural.
Exemplu: pentru n=123, se returneaz 321.
18. Scriei o funcie recursiv care testeaz dac un vector cu n numere naturale
reine numai valori distincte, caz n care funcia returneaz true, iar n caz contrar,
returneaz false.
21. Scriei o funcie recursiv care afieaz valoarea unui polinom n punctul a.
Coeficienii polinomului sunt dai ntr-un vector. Astfel, pentru V=(1,2,3) avem
polinomul P=x2+2x+3.
0, k>n
S(n, k) = 1, k {1, n}
S(n 1, k 1) + kS(n 1, k) 1 < k < n
23. Calculai S(n,k) nerecursiv.
0, k = 0 sau k > n;
F(n, k) = 1 k = n;
F(n 1, k 1) nF(n 1, k) 1 < k < n.
Comparai eficiena celor dou moduri de calcul.
162 Capitolul 6. Introducere n recursivitate
26. Calculai iterativ i recursiv cel mai mare divizor comun pentru dou numere
naturale m i n, utiliznd algoritmul lui Euclid:
a) 12;
b) 21;
c) eroare de executare;
d) 0.
29. Pentru care dintre numerele de mai jos, care sunt parametri de intrare pentru
funcia urmtoare, ultimele 2 numere afiate vor fi 0?
a) 295;
b) 1024;
c) 1000;
d) 10000.
a) 1 2 3;
b) 1 4 2 5 3 1;
c) cerina nu este corect;
d) 4 5 1.
164 Capitolul 6. Introducere n recursivitate
31. Care dintre afirmaiile de mai jos sunt corecte dac n este 3 i apelul este
t(n,1,1)?
32. Dac n este 3, pentru care din datele de mai jos se afieaz un numr maxim
de valori distincte, dac apelul este t(n,1,1)?
a) V1=(1,2,8) i V2=(4,5,6);
b) V1=(1,2,5) i V2=(4,5,6);
c) V1=(4,5,6) i V2=(1,2,3);
d) V1=(1,2,3) i V2=(4,5,6).
a) 1 2 3; b) 1 2 3 4 5 6;
c) 4 5 6; d) nici o valoare.
a) 4; b) 3; c) 2; d) 1.
Manual de informatic pentru clasa a XI-a 165
35. Dac n=4, pentru care dintre valorile de mai jos ale lui m se afieaz dou
valori?
a) 4; b) 3; c) 2; d) 1.
36. Dac n=4, pentru care valoare a lui m se afieaz toate cele 4 valori ale
vectorului?
37. n funcia de mai jos nlocuii linia ... cu una dintre instruciunile urmtoare,
astfel nct funcia s-i ncheie execuia fr eroare pentru orice valoare admisibil
a argumentului:
38. Dac funcia este apelat prin an(4), de cte ori se autoapeleaz?
39. Pentru care dintre valorile de mai jos, care sunt parametri de intrare pentru
funcia an, executarea funciei se termin cu eroare?
40. Pentru programul de mai jos, de cte ori se autoapeleaz funcia an?
Indicaii / Rezolvri
1. Sn=1+2+....n-1+n; SnSn-1+n;
0, daca n = 0
Sn =
S n1 + n, altfel
(2n )! = C n
n!n!
2n
8.
Varianta Pascal Varianta C++
function int Maxim(int n)
Maxim(n:integer):integer; { int max;
var max:integer; if (n==1) return V[1];
begin else
if n=1 then Maxim:=V[1] { max=Maxim(n-1);
else begin if (max<V[n]) return V[n];
max:=Maxim(n-1); else return max;
if max<V[n] then }
Maxim:=V[n] }
else Maxim:=max;
end;
end;
Manual de informatic pentru clasa a XI-a 167
11.
12.
15.
16.
27. a); 28. d); 29. b); 30. a); 31. a), b); 32. a); 33. d);
3 2
2 1 1 0
1 0
Acum, vedei pe viu motivul pentru care, n cazul unor astfel de formule de
recuren, n care, n expresie, intervin mai muli operanzi ce se calculeaz
recursiv, este de preferat metoda iterativ.
172
Capitolul 7
7.2. Aplicaii
0, n = 1;
T(n) = n
2T + n, altfel.
2
Avem:
Rezolvare. Este necesar o funcie POZ care trateaz o poriune din vector,
cuprins ntre indicii dai de li (limita inferioar) i ls (limita superioar). Rolul
acestei funcii este de a poziiona prima component a[li] pe o poziie k cuprins
ntre li i ls, astfel nct toate componentele vectorului cuprinse ntre li i k-1
s fie mai mici sau egale dect a[k] i toate componentele vectorului cuprinse
ntre k+1 i ls s fie mai mari sau egale dect a[k].
i=1, j=5;
a[1]>a[5], deci se inverseaz elementele aflate pe poziiile 1 i 5,
deci a=(2,9,3,1,6) i programul trece la modul de lucru b);
i=2, j=5;
a[2]>a[5], deci a=(2,6,3,1,9) i se revine la modul de lucru a);
i=2, j=4;
a[2]>a[4], deci a=(2,1,3,6,9); se trece la modul de lucru b);
i=3, j=4;
funcia se ncheie, elementul aflat iniial pe poziia 1 se gsete
acum pe poziia 4, toate elementele din stnga lui fiind mai mici
dect el, totodat toate elementele din dreapta lui fiind mai mari
dect el (k=4).
Dup aplicarea funciei POZ, este evident c elementul care se afl iniial n
poziia li va ajunge pe o poziie k i va rmne pe acea poziie n cadrul
vectorului deja sortat, fapt care reprezint esena algoritmului.
se apeleaz POZ;
se apeleaz QUICK pentru li i k-1;
se apeleaz QUICK pentru k+1 i ls.
Rezolvare.
Dac n=1, se face mutarea ab, adic se mut discul de pe tija a pe tija b.
ab, n =1
H(n, a, b, c) =
H(n 1, a, c, b), ab, H(n 1, c, b, a), n >1
h
xv(i),yv(i)
x,y l
Pentru a se afla n interiorul dreptunghiului, gaura trebuie s ndeplineasc
simultan condiiile:
1) xv(i)>x;
2) xv(i)<x+l;
3) yv(i)>y;
4) yv(i)<y+h.
Dac facem o tietur vertical prin aceast gaur, obinem dou dreptunghiuri:
1) x, y, xv(i)-x, h;
2) xv(i), y, l+x-xv(i), h.
if gasit else
then if (l*h>lf*hf)
begin { xf=x;
dimp(x,y,xv[i]-x, yf=y;
h,xf,yf,lf,hf,xv,yv); lf=l;
dimp(xv[i],y,l+x-xv[i], hf=h;
h,xf,yf,lf,hf,xv,yv); }
dimp(x,y,l,yv[i]-y, }
xf,yf,lf,hf,xv,yv);
dimp(x,yv[i],l,h+y-yv[i], main()
xf,yf,lf,hf,xv,yv) { cout<<"n="; cin>>n;
end for (int i=1;i<=n;i++)
else { cout<<"x["<<i<<"]=";
if (l*h)>(lf*hf) cin>>xv[i];
then cout<<"y["<<i<<"]=";
begin cin>>yv[i];
xf:=x; }
yf:=y; cout<<"l="; cin>>l;
lf:=l; cout<<"h="; cin>>h;
hf:=h dimp(0,0,l,h,xf,yf,lf,
end hf,xv,yv);
end; cout<<"x="<<xf<<" y="<<yf
<<" l="<<lf<<" h="<<hf;
begin }
write('n=');
readln(n);
for i:=1 to n do
begin
write('x[',i,']=');
readln(xv[i]);
write('y[',i,']=');
readln(yv[i])
end;
write('l=');
readln(l);
write('h=');
readln(h);
lf:=0;
hf:=0;
dimp(0,0,l,h,xf,yf,
lf,hf,xv,yv);
writeln('x=',xf,' y=',yf,'
l=',lf,' h=',hf)
end.
Manual de informatic pentru clasa a XI-a 183
7.3. Fractali
initgraph(gdriver,gmode,cale);.
2) prin indicarea cu ajutorul primilor doi parametri a unui driver i a unui mod
de lucru solicitate de programator (n acest caz, nu se poate executa programul pe
un calculator ce nu este dotat cu placa grafic specificat):
gdriver := VGA;
gmode := VGAHI;
initgraph(gdriver,gmode,c:\tp\bgi);
if graphresult<>0 then
begin
writeln(Tentativa esuata!);
halt
end;
Tentativa de iniializare grafic poate eua din diverse motive, cum ar fi: lipsa
unitii GRAPH, calea indicat greit, etc. Testarea se realizeaz cu funcia ntreag
graphresult care returneaz 0 n caz afirmativ i o valoare diferit de 0, n
caz contrar.
initgraph(&gdriver,&gmode,"cale");.
2) prin indicarea cu ajutorul primilor doi parametri a unui driver i a unui mod
de lucru solicitate de programator (n acest caz, nu se poate executa programul pe
un calculator ce nu este dotat cu placa grafic specificat):
Tentativa de iniializare grafic poate eua din diverse motive, cum ar fi: lipsa
unitii GRAPHICS, calea indicat greit, etc. Testarea se realizeaz cu funcia
ntreag graphresult() care returneaz 0 n caz afirmativ i o valoare diferit
de 0, n caz contrar.
Atenie! Pentru a putea scrie i rula programe C++ ce utilizeaz modul grafic al
limbajului, trebuie bifat urmtoarea opiune, din meniu:
Aceste culori sunt cele implicite. Pentru a utiliza mai multe culori (dar nu n
acelai timp), se poate schimba setul (paleta) de culori. ntruct n acest
moment nu sunt necesare o multitudine de culori, nu vom prezenta n detaliu
acest aspect.
Manual de informatic pentru clasa a XI-a 187
Observaii
Operaia de desenare
Fiecare latur a acestui poligon se transform din nou, dup aceeai regul.
S se vizualizeze figura obinut dup ls pai (numr citit de la tastatur).
begin if (n<ls)
rotplan((2*x1+x2) div 3, {generator(x1,y1,div((2*x1+x2),
(2*y1+y2) div 3,(x1+2*x2) div 3).quot,div((2*y1+y2),
3,(y1+2*y2) div 3,x,y,pi/3); 3).quot,n+1,ls);
if n<ls then generator(div((2*x1+x2),
begin 3).quot,div((2*y1+y2),
generator(x1,y1,(2*x1+x2) 3).quot,x,y,n+1,ls);
div 3,(2*y1+y2) div 3, generator(x,y,div((x1+2*x2),
n+1,ls); 3).quot,div((y1+2*y2),
generator((2*x1+x2) div 3, 3).quot,n+1,ls);
(2*y1+y2) div 3, generator(div((x1+2*x2),
x,y,n+1,ls); 3).quot,div((y1+2*y2),
generator(x,y,(x1+2*x2) div 3).quot,x2,y2,n+1,ls);
3,(y1+2*y2) div 3,n+1,ls); }
generator((x1+2*x2) div 3, else desenez(x1,y1,x2,y2,x,y);
(y1+2*y2) div 3, }
x2,y2,n+1,ls);
end main()
else desenez(x1,y1,x2,y2,x,y); { cout<<"ls= "; cin>>ls;
end; init();
setcolor(6);
begin L = getmaxx()-320;
write('ls= '); readln(ls); generator(160,getmaxy()-150,
initg; 160+L,getmaxy()-150,1,ls);
setcolor(red); generator(160+L,getmaxy()-
L:=getmaxx-320; 150,160+div(L,2).quot,
generator(160,getmaxy-150, getmaxy()-150-
160+L,getmaxy-150,1,ls); ceil(L*(sqrt(3)/2)),1,ls);
generator(160+L,getmaxy-150, generator(160+div(L,2).quot,
160+L div 2,getmaxy-150 getmaxy()-150-
L*round(sqrt(3)/2),1,ls); ceil(L*(sqrt(3)/2)),160,
generator(160+L div 2,getmaxy- getmaxy()-150,1,ls);
150-L*round(sqrt(3)/2),160, setfillstyle(1,4);
getmaxy-150,1,ls); floodfill(div(getmaxx(),2)
setfillstyle(1,blue); .quot,div(getmaxx(),
floodfill(getmaxx div 2, 2).quot,6);
getmaxy div 2, red); getch();
readln closegraph();
end. }
Privii mai jos rezultatele obinute pentru diferite valori ale lui ls:
ls = 2 ls = 3 ls = 4
Figura 7.2. Exemple de fractali formai cu ajutorul curbei lui Koch (triunghi echilateral)
Manual de informatic pentru clasa a XI-a 191
Fiecare segment al liniei frnte astfel formate se transform din nou dup
aceeai regul. Se cere s se vizualizeze curba dup ls transformri (valoare
citit de la tastatur).
Sunt prezentate mai jos imaginile obinute n urma rulrii programului, pentru
diferite valori ale lui ls:
Figura 7.4. Exemple de fractali formai cu ajutorul curbei lui Koch (ptrat)
7.3.4. Arborele
Pentru diverse valori ale parametrului de intrare ls, vom obine arborii:
ls = 3 ls = 5 ls = 7
Observaii
Exemplele grafice prezentate au fost generate pentru valori mici ale lui ls
deoarece la tiprire, detaliile sunt greu de observat peste o anumit limit.
Generarea fractalilor reprezint o aplicaie a recursivitii, tehnica aplicat
fiind DIVIDE ET IMPERA. Pentru valori mari ale lui ls, timpul de efectuare al
calculelor poate fi i de ordinul zecilor de secunde, ceea ce poate fi
considerat un inconvenient major.
Probleme propuse
1. Se citete a1, numr real. Se cere s se scrie o funcie care calculeaz ln(a)
cu 3 zecimale exacte. Nu este permis utilizarea funciei logaritmice a limbajului.
2. Scriei o funcie care calculeaz prin metoda DIVIDE ET IMPERA suma numerelor
reinute dintr-un vector.
Rspunsuri
1. ln(a)=x a=ex ex-a=0. Dac notm cu f(x)=ex-a, atunci trebuie
rezolvat ecuaia f(x)=0. Avem f(0)=e0-a=1-a<0 i f(a)=ea-a>0. De aici,
rezult c f(x) are o rdcin n intervalul (0,a). Cum f(x) este strict
cresctoare (ca diferen ntre funcia strict cresctoare ex i o constant),
rdcina este unic. Algoritmul pe care l folosim se numete n matematic
metoda njumtirii intervalului, dar, din punct de vedere informatic, corespunde
metodei DIVIDE ET IMPERA.
Fie li=0 i ls=a, m=(a+b)/2. Dac f(li)f(m)<0, rdcina se gsete n
(li,m), altfel rdcina este n [m,ls). Condiia de terminare este ca
li ls < 0.0001 , pentru c trebuie s avem 3 zecimale exacte.
begin main()
write ('a='); readln(a); { cout<<"a="; cin>>a;
writeln(' rezultat cout<<"rezultat calculat "
calculat:',LogN(a,0,a):3:3); <<LogN(a,0,a)<<endl;
writeln(' rezultat preluat ', cout<<"rezultat preluat "
ln(a):3:3); <<log(a)<<endl;
end. }
0 n = 1;
T(n) = n
2T + 1 altfel.
2
5. Vedei problema 1.
6. Funcia Poz returneaz poziia k pe care se va gsi, dup rularea ei, primul
element al vectorului. n plus, toate elementele de indice mai mic dect k sunt mai
mici sau egale dect A[k] i toate elementele de indice mai mare dect k sunt mai
mari sau egale dect A[k]. Altfel spus: elementul A[1], care se afl dup rularea
funciei pe poziia k, este al k-lea cel mai mic element din vectorul A. Atunci, n
cazul n care k=t, problema este rezolvat. Dac t<k, elementul cutat are
indicele cuprins ntre li i k-1 i relum rularea funciei Poz ntre aceste limite, iar
dac t>k, elementul cutat are indicele ntre k+1 i ls i relum rularea funciei
Poz ntre aceste limite. Datorit faptului c, la fiecare pas, se restrnge numrul
valorilor de cutare, se ajunge n situaia n care t=k.
Secvena este:
Capitolul 8
Metoda BACKTRACKING
Principiul metodei
Pentru permutri, vom avea o soluie cnd s-a generat o secven alctuit din n
numere distincte. Cum subprogramul este recursiv, acest fapt se ntmpl atunci
cnd s-a ajuns pe nivelul n+1.
De exemplu, dac n=4, o soluie este reprezentat n figura 8.1., a). Modul de
obinere al soluiei este prezentat n figurile urmtoare, de la b) la i):
a) b) c)
d) e) f)
g) h) i)
Exemple:
a)
sol(1) = 1 i = 1
sol(3) = 3 j = 3
|sol(1) - sol(3)| = |1 - 3| = 2
|i - j| = |1 - 3| = 2
Figura 8.2.
206 Capitolul 8. Metoda backtracking
b)
sol(1) = 3 i = 1
sol(3) = 1 j = 3
|sol(i) - sol(j)| = |3 - 1| = 2
|i - j| = |1 - 3| = 2
Figura 8.3.
Exerciii
1. Desenai configuraia tablei corespunztoare vectorului sol=(3,1,4,2,5) i
verificai dac aceasta reprezint o soluie a problemei damelor.
Manual de informatic pentru clasa a XI-a 207
Este ntotdeauna necesar s-l folosim pe acesta sau putem reine numai
ideea i, dup caz, s scriem mai puin?
Exerciii
1. Testai subprogramul anterior pentru problema generrii permutrilor.
2. Adaptai rezolvarea problemei permutrilor astfel nct s se afieze numai
permutrile n care oricare dou numere consecutive nu sunt alturate.
3. Observai c ordinea de afiare a soluiilor depinde de ordinea n care se
consider elementele mulimilor A1, A2, Ce modificri trebuie aduse
procedurii recursive back astfel nct permutarile de 4 elemente s fie afiate n
ordinea: 4321, 4312, 4231, 4213, 4132, 4123, 3421, 3412 1243, 1234?
4. Renunai la utilizarea subprogramului valid, utiliznd un vector folosit, n
care folosit[i] are valoarea 0 dac numrul i nu este deja folosit n soluie
i are valoarea 1 n caz contrar. Astfel, plasarea valorii i n vectorul soluie
(sol[k]i) trebuie nsoit de memorarea faptului c i este utilizat
(folosit[i]1), la revenirea din recursie (cand se nltur valoarea de pe
poziia curent) fiind necesar memorarea faptului c i nu mai este utilizat n
soluie (folosit[i]0). Condiia de validare se reduce n acest caz la:
Dac folosit[i]=0 atunci ...
5. Urmrii toate modalitile diferite de a aeza patru obiecte identificate prin
numerele 1, 2, 3, 4 pe un cerc, la distane egale. Vom observa c nu toate
permutrile de patru obiecte sunt configuraii distincte, datorit distribuiei pe
cerc. Astfel permutrile 1234, 2341, 3412 i 4123 reprezint una i aceeai
configuraie. Scriei un program care afieaz numai permutrile distincte
conform aezrii pe un cerc. Indicaie: se va considera sol[1]=1 i se vor
permuta doar celelalte elemente.
210 Capitolul 8. Metoda backtracking
Este demonstrat faptul c sunt suficiente numai 4 culori pentru ca orice hart
s poat fi colorat.
Pentru exemplificare, vom considera harta din figura 8.4., unde rile sunt
numerotate cu cifre cuprinse ntre 1 i 5.
Exerciii
1. Soluia afiat este i soluia care utilizeaz un numr
minim de culori?
2. Dac rile din centrul figurii alturate sunt numerotate
cu 1, 2, 3, 4, iar cele de la exterior cu 5 i 6, care este
soluia afiat de programul dat? Este acesta numrul
minim de culori necesare?
3. Cte culori sunt suficiente pentru colorarea unei hri
particulare n care orice ar se nvecineaz cu cel Figura 8.5.
mult dou ri?
4. Dai exemplu de particularitate pe care poate s o aib o hart pentru a fi
suficiente dou culori pentru colorarea tuturor rilor?
Exemple
Observaii
2. O alt interpretare pentru metoda backtracking: fiind date n mulimi: A1, A2, ...,
An, produsul cartezian al lor A1A2...An se mai numete spaiul soluiilor. n
acest context, metoda backtracking caut una sau toate soluiile, care sunt
elemente ale produsului cartezian i care ndeplinesc anumite condiii. Astfel, se
poate justifica faptul c, n generarea produsului cartezian, nu este necesar
subprogramul valid pentru c se genereaz toate elementele produsului
cartezian, fr a verifica anumite condiii.
Manual de informatic pentru clasa a XI-a 215
Dei algoritmul este exponenial, exist aplicaii utile, evident, atunci cnd
fiecare mulime Ai poate lua numai cteva valori i unde n este suficient de mic.
Exerciii
1. Tabelarea anumitor funcii. Se d funcia
f:A1A2...AnR,
unde fiecare mulime Ai este dat de numerele ntregi din intervalul [ai,bi] i
f=c1x1+c2x2+...+cnxn, ciR.
2. Scriei programul care genereaz toate cuvintele cu patru litere care au prima
i ultima liter vocale, litera a doua consoan din mulimea {P, R, S, T}, iar a treia
liter consoan din mulimea {B, M, R, T, V}.
3. Scriei programul care genereaz i numr cte cuvinte de cinci litere ale
alfabetului englez se pot forma, cu condiia s nu existe dou consoane alturate
i nici dou vocale alturate.
1, pentru i A
V[i] =
0, pentru i A
De exemplu, dac A={1,2,3}, pentru submulimea {1,3} vom avea
V=(1,0,1). De aici, rezult c problema se reduce la generarea tuturor valorilor
posibile pe care le poate reine vectorul caracteristic.
Aceasta nseamn c o soluie este de forma x1,x2,...,xn, unde
xi{0,1}. i n acest caz, orice valoare ar reine componenta i, ea nu trebuie s
ndeplineasc nici o condiie de continuare, motiv pentru care subprogramul valid
nu este necesar.
begin
write('n=');
readln(n);
back(1)
end.
Exerciii
1. Problema nu este rezolvat n totalitate. Programul afieaz numai toate valorile
pe care le poate lua vectorul caracteristic. Completai-l astfel nct programul s
afieze toate submulimile mulimii {1,2...n}!
Observaii
2
2 2...2
=2 .
n
de n ori
n!
C pn = .
(n p)! p!
Rezolvare. O soluie este de forma x1,x2,...,xp, unde x1, x2, ..., xpA.
n plus, x1, x2, ..., xp trebuie s fie distincte. Cum la o mulime ordinea elementelor
nu prezint importan, putem genera elementele ei n ordine strict cresctoare.
Aceast observaie ne ajut foarte mult n elaborarea algoritmului.
a) Pentru k>1, sol[k]>sol[k-1].
218 Capitolul 8. Metoda backtracking
sol[k+1]>n-p+k+1,
...
sol[p]>n-p+p=n.
1sol[1]n-p+1,
sol[1]<sol[2]n-p+2,
...
sol[n-1]<sol[n]n-p+p=n.
Relaiile de mai sus simplific mult algoritmul, pentru c innd cont de ele, nu mai
este necesar s se testeze nici o condiie de continuare.
Exerciii
1. Se dau coordonatele din plan a n puncte. Afiai coordonatele vrfurilor tuturor
ptratelor care au ca vrfuri puncte din mulimea considerat.
Exemplu: p=2, n=3. Avem: 12, 21, 13, 31, 23, 32. De exemplu, 21 este funcia
f:AB dat astfel: f(1)=2; f(2)=1. Avem relaiile:
n!
A pn = = n(n 1)...(n p + 1) .
(n p)!
Pe de alt parte, se poate lucra mult mai eficient. O soluie este de forma:
x1x2...xp, unde x1, x2, ..., xpB. n plus, x1, x2, ..., xp trebuie s fie distincte.
Spre deosebire de algoritmul de generare a combinrilor, aici ne intereseaz toate
permutrile unei soluii (acestea sunt, la rndul lor, alte soluii). Aceasta nseamn
c nu mai putem pune n soluie elementele n ordine cresctoare. S recapitulm:
Exerciii
1. Se citesc n, p i apoi n litere distincte. Afiai toate cuvintele care se pot forma
cu p dintre ele.
Rezolvare. Chiar dac tim s generm toate submulimile unei mulimi, tot nu ne
ajut s generm toate partiiile.
1. Pentru a putea genera toate partiiile, trebuie s gsim o metod prin care s
putem reine o partiie. O prim idee ne conduce la folosirea unui vector, sol, astfel:
dac sol[i]=k, atunci elementul i se gsete n mulimea k a partiiei. Totui, nu
tim cte mulimi sunt n partiia respectiv. Exist o partiie care conine n mulimi
atunci cnd fiecare element este ntr-o mulime i una care conine toate mulimile,
adic tocmai mulimea A. Cu alte cuvinte, numrul mulimilor dintr-o partiie este
ntre 1 i n.
Prin aceast condiie se evit situaia n care, de exemplu, vectorul sol reine
(1,3,1). Aceasta ar avea semnificaia c elementele 1 i 3 se gsesc n
submulimea 1 a partiiei, iar elementul 2 se gsete n submulimea 3 a partiiei. n
acest caz, lipsete submulimea 2 a partiiei.
- sol=(1,1,1) - A1={1,2,3);
- sol=(1,1,2) - A1={1,2} A2={3};
- sol=(1,2,1) - A1={1,3} A2={2};
- sol=(1,2,2) - A1={1} A2={2,3};
- sol=(1,2,3) - A1={1} A2={2} A3={3}.
begin
write('n='); readln(n);
back(1);
end.
8.5.1. Generaliti
c) Toate soluiile sub form de vector ale problemei generrii tuturor partiiilor
mulimii A au lungimea n.
Ordinea numerelor din sum este important. Astfel, se tiprete 112 dar
i 211, 121.
sol[1]+sol[2]+...sol[k]n.
sol[1]+sol[2]+...sol[k]=n.
soluie
1 0 0 0 1 1 0 0 1 1 1 0 1 1 1 1
s=0, k=1 s=1, k=2 s=2, k=3 s=3, k=4
1 1 2 1 2 0 0 1 2 1 1 3
s=2, k=3 s=1, k=2 s=3, k=3 s=1, k=2
Observai modul n care calculm suma la fiecare pas. De cte ori se trece
la componenta urmtoare (k+1), la s se adun sol[k], de cte ori se face
pasul napoi (se trece la componenta k-1), din s se scade sol[k].
Exerciii
1. Cum trebuie procedat n cazul n care se cere ca soluiile s fie afiate o singur
dat? Spre exemplu, dac s-a afiat descompunerea 1,1,2 s nu se mai afieze
2,1,1 sau 1,2,1?
Indicaie: procedeul a mai fost ntlnit, de exemplu la generarea combinrilor.
Soluiile se vor genera n ordine cresctoare. Modificai programul n acest sens.
2. Adaptai metoda de rezolvare astfel nct s se genereze numai partiiile formate
din numere naturale distincte.
3. Adaptai metoda de rezolvare astfel nct s se genereze numai partiiile formate
din cel puin p numere naturale distincte (n i p citite de la tastatur).
4. Adaptai metoda de rezolvare astfel nct s se genereze numai partiiile formate
din numere naturale aflate n intervalul [a,b] (n, a i b citite de la tastatur).
5. Rezolvai problema scrierii numrului natural n ca sum de numere naturale
alese dintr-o mulime format din k valori date {v1, v2, , vk}. Astfel, 10 se
poate scrie ca sum de numere alese din mulimea {2,3,6} n felul urmtor:
10=2+2+2+2+2, 10=2+2+3+3, 10=2+2+6.
1) 1 de 2, 1 de 3; 2) 1 de 1, 2 de 2; 3) 2 de 1, 1 de 3;
4) 3 de 1, 1 de 2; 5) 5 de 1;
Ce observm?
Manual de informatic pentru clasa a XI-a 227
1. Exist componente ale vectorului sol care rein 0. Aceast situaie corespunde
cazului n care moneda respectiv nu este luat n calcul. Din acest motiv, fiecare
component a vectorului sol va fi iniializat cu o valoare aflat naintea tuturor celor
posibile, adic cu -1.
Fie l(i,j) un element al matricei. Acesta poate lua valori ntre 0 i 15. Se
consider ieirile spre nord, est, sud i vest, luate n aceast ordine. Pentru fiecare
direcie cu ieire se reine 1, iar n caz contrar, se reine 0. Un ir de patru cifre 1
sau 0 formeaz un numr n baza 2. Acest numr este convertit n baza 10 i
reinut n l(i,j). De exemplu, pentru o camer care are ieire n nord i vest,
avem 1001(2)=9(10).
Rezolvare
1. O camer vizitat se reine prin coordonatele ei: lin (linia) i col(colana). Din
acest motiv, pentru a reine un traseu vom utiliza o matrice cu dou coloane i mai
multe linii: sol. De exemplu, dac camera iniial este cea de coordonate (2,2)
o soluie este (2,2), (2,3), (1,3).
Manual de informatic pentru clasa a XI-a 229
Exerciii
1. Adaptai rezolvarea pentru un labirint n care fiecare csu reine valoarea 1
sau 0 (1 semnificnd csu plin, prin care nu se poate trece, iar 0 csu liber,
pe unde se poate trece). Ca i n problema prezentat, deplasarea se poate face
dintr-o csu n orice alt csu alturat, orizontal sau vertical, cu condiia ca ea
s existe i s fie liber. Validai poziia iniial a omului (lin, col), astfel nct
aceasta s corespund unei csue libere. Estimai spaiul de memorie utilizat
n aceast variant.
begin if (k==n*n)
if k=n*n { for (i=1;i<=k-1;i++)
then cout<<sol[i][0]<<" "
begin <<sol[i][1]<<endl;
for i:=1 to k-1 do cout<<lin<<" "<<col;
writeln(st[i,1],' ', exit(EXIT_SUCCESS);
st[i,2]); }
writeln(lin,' ',col); else
halt; { sol[k][0]=lin;
end sol[k][1]=col;
else for (i=0;i<=7;i++)
begin { linie=lin+x[i];
st[k,1]:=lin; coloana=col+y[i];
st[k,2]:=col; if (linie<=n && linie>=1
for i:=1 to 8 do && coloana<=n &&
begin coloana>=1 &&
linie:=lin+x[i]; t[linie][coloana]==0)
coloana:=col+y[i]; {
if (linie<=n) and t[linie][coloana]=1;
(linie>=1) and back(k+1,linie,coloana);
(coloana<=n) and t[linie][coloana]=0;
(coloana>=1) and
}
(t[linie,coloana]=0)
}
then
}
begin
}
t[linie,coloana]:=1;
back(k+1,linie, main()
coloana);
{ cout<<"n=";
t[linie,coloana]:=0;
cin>>n;
end;
back(1,1,1);
end
}
end
end;
begin
write ('n=');
readln(n);
back(1,1,1);
end.
Manual de informatic pentru clasa a XI-a 235
Probleme propuse
10. Fiind dat un numr natural pozitiv n, se cere s se produc la ieire toate
descompunerile sale ca sum de numere prime.
11. Attila i regele. Un cal i un rege se afl pe o tabl de ah. Unele cmpuri
sunt arse, poziiile lor fiind cunoscute. Calul nu poate clca pe cmpuri arse,
iar orice micare a calului face ca respectivul cmp s devin ars. S se afle
dac exist o succesiune de mutri permise (cu restriciile de mai sus), prin
care calul s poat ajunge la rege i s revin la poziia iniial. Poziia iniial
a calului, precum i poziia regelui sunt considerate nearse.
12. Se dau n puncte n plan prin coordonatele lor. Se cer toate soluiile de unire a
acestor puncte prin exact p drepte, astfel nct mulimea punctelor de
intersecie ale acestor drepte s fie inclus n mulimea celor n puncte.
17. Se dau N puncte albe i N puncte negre n plan, de coordonate ntregi. Fiecare
punct alb se unete cu cte un punct negru, astfel nct din fiecare punct, fie el
alb sau negru, pleac exact un segment. S se determine o astfel de
configuraie de segmente astfel nct oricare dou segmente s nu se
intersecteze. Se citesc N perechi de coordonate corespunznd punctelor albe
i N perechi de coordonate corespunznd punctelor negre.
24. Fiind date numele a n soldai, ce algoritm vom utiliza pentru a lista toate
grupele de cte k soldai? Se tie c ntr-o grup, ordinea prezint importan.
25. Fiind date n numere naturale, ce algoritm vom utiliza pentru a determina
eficient o submulime maximal de numere naturale distincte?
Indicaii
23. b)
24. a)
25. d)
Explicaie: primele dou variante prezint soluii exponeniale, a treia este n
O(n2). Dar dac sortm numerele, atunci le putem afia pe cele distincte dintr-o
singur parcurgere. Sortarea se poate efectua n O(nlog(n)), iar parcurgerea
n O(n). Prin urmare, complexitatea este O(nlog(n)).
26. d)
Explicaie: pe fiecare nivel al stivei se caut succesorii n ordinea n, n-1, ..., 1.
239
Capitolul 9
9.1.1. Introducere
1. Se dau n orae. Unele dintre ele sunt unite prin osele directe (care nu mai
trec prin alt ora).
2. Se cunosc relaiile de prietenie dintre n persoane.
3. Se dau n ri i se cunoate relaia de vecintate ntre ele.
4. Se dau n triunghiuri, iar unele dintre ele sunt asemenea.
Observaii
Dou noduri distincte pot fi unite prin cel mult o muchie. n exemplul de
mai sus, (1,2) este muchia care unete nodul 1 cu nodul 2. Dac scriem
(2,1), ne referim la aceeai muchie (perechea este neordonat).
Definiia este restrictiv, n unele lucrri vei ntlni definiii mai puin restrictive, de
1
Definiia 9.3. ntr-un graf neorientat, prin gradul unui nod v se nelege
numrul muchiilor incidente cu nodul v i se noteaz cu d(v). Un nod
cu gradul 0 se numete nod izolat, iar unul cu gradul 1 se numete nod
terminal.
O relaie util: fie un graf neorientat cu n noduri i m muchii. Dac notm cu d1,
d2, ..., dn gradele celor n noduri, atunci avem relaia:
d 1 + d 2 + d 3 + ...d n = 2m.
- fie afirmaia: nodul i este izolat. Pentru exemplul 1., nseamn c nu exist nici
o osea care leag oraul i cu alt ora, pentru exemplul 2., nseamn c
persoana i nu are nici un prieten, pentru exemplul 3., nseamn c ara i nu se
nvecineaz cu nici o ar (este situat pe o insul), pentru exemplul 4., nseamn
c nu exist nici un triunghi dintre celelalte n-1 triunghiuri care s fie asemenea cu
triunghiul i.
Exerciiu
Dai un exemplu inspirat din viaa real, pentru care s gsii graful asociat.
Astfel, vei rspunde la ntrebrile: ce semnificaie au nodurile sau muchiile i ce
nseamn gradul unui nod.
242 Capitolul 9. Introducere n teoria grafurilor
n acest paragraf, prezentm principalele structuri de date prin care grafurile pot
fi memorate n vederea prelucrrii lor. De la nceput, precizm faptul c vom alege o
2
structur sau alta n funcie de :
a) algoritmul care prelucreaz datele referitoare la graf;
Pentru fiecare structur de date pe care o vom folosi, vom avea cte o
procedur (funcie) care citete datele respective. Toate aceste subprograme se
gsesc grupate n unitatea de program grafuri.pas (pentru Pascal) i n
grafuri.cpp (pentru C++). Vom fi astfel scutii ca, pentru fiecare program pe care l
realizm, s fim nevoii s adugm liniile de cod necesare citirii i ne permite s ne
concentrm exclusiv asupra algoritmului.
6
Fiierul text:
1 6 1 2
1 3
1 5
2 2 3
3 4
5
4 5
3 Figura 9.3.
4 Exemplu de graf neorientat
1, pentru (i, j) E
a i, j =
0, pentru (i, j) E
2
Modul de alegere a structurii l vei nelege pe parcursul studiului acestui capitol.
Manual de informatic pentru clasa a XI-a 243
0 1 1 0 1 0
1
0 1 0 0 0
1 1 0 1 0 0
A6, 6 =
0 0 1 0 1 0
1 0 0 1 0 0
0 0 0 0 0 0
Observaii
1. ntruct, din modul n care a fost definit graful, rezult c nu exist muchii de la un
nod la el nsui, rezult c elementele de pe diagonala principal rein 0:
ai ,i = 0, i {1,2,..., n} .
ai , j = a j ,i , i, j {1,2,..., n} .
6. Dac graful citit are un numr mic de muchii, atunci matricea de adiacen este o
form ineficient de memorare a lui, pentru c ea va reine o mulime de 0.
1 1 -> 2,3,5
6
2 -> 1,3
3 -> 1,2,4
2 4 -> 3,5
5 5 -> 1,4
3 6 ->
4
Figura 9.4.
Manual de informatic pentru clasa a XI-a 245
Start 5 7 9 11 12 0
1 2 3 4 5 6 7 8 9 10 11 12
T[0] 2 1 3 1 5 1 3 2 4 3 5 4
T[1] 0 0 1 0 3 0 2 4 8 0 10 6
Exemplu de utilizare
Mai jos, putei observa cum se descrie un vector (V) care reine muchiile
unui graf:
S considerm mulimea elevilor unei clase. Teoretic, oricare doi elevi din
clas se cunosc. Pentru a transpune n limbaj specific teoriei grafurilor aceast
situaie, vom considera c fiecare elev este un nod al grafului. Pentru c oricare doi
elevi se cunosc, nseamn c oricare dou noduri sunt unite printr-o muchie.
Astfel, am obinut un graf aparte, pe care-l vom numi graf complet.
Definiia 9.4. Prin graf complet vom nelege un graf neorientat n care
oricare dou noduri sunt adiacente. Vom nota un graf complet prin Kn, unde
n este numrul de noduri ale grafului.
248 Capitolul 9. Introducere n teoria grafurilor
2 3
Figura 9.5. 4
Exemplu de graf complet
Relaii utile:
1. ntr-un graf complet, gradul oricrui nod este n-1. Evident, din fiecare nod,
pleac (sosesc) n-1 muchii.
n(n 1)
2. ntr-un graf complet, avem relaia: m= , unde m este numrul de
2
muchii, iar n, numrul de noduri.
n(n 1)
2
i corespunde unui graf complet. Se tie c, fiind dat o mulime A cu n elemente,
avem 2n submulimi disjuncte ale acesteia (aici este inclus i submulimea vid
i A). Prin urmare, avem:
n(n1)
2 2
Definiia 9.5. Un graf parial al unui graf neorientat dat G=(V,E) este un
graf G1=(V,E1), unde E1E.
Manual de informatic pentru clasa a XI-a 249
Un graf parial al unui graf dat, este el nsui sau se obine din G prin
suprimarea anumitor muchii. Privii exemplul de mai jos:
Figura 9.6.
Obinerea unui 1 1
graf parial
2 3 3
rezult 2
4 4
G=(V,E) G1=(V,E1)
1. Fiind date n persoane, ntre unele dintre ele exist o relaie de prietenie. Asociem
acestei situaii un graf G. Dup un timp, unele persoane se ceart. n teoria grafurilor,
aceasta nseamn c n G se suprim anumite muchii i astfel, se obine un graf
parial G1.
2. Fiind date n orae, unele dintre ele sunt unite printr-o osea direct (care nu mai
trece prin alte orae). Asociem situaiei date un graf G. Datorit precipitaiilor, anumite
osele se inund i nu mai pot fi utilizate. Aceasta nseamn c n G se suprim
anumite muchii i se obine un graf parial G'.
Un subgraf al unui graf G este el nsui sau se obine din G prin suprimarea
anumitor noduri i a tuturor muchiilor incidente cu acestea. Privii exemplul de
mai jos:
Figura 9.7. 1
Obinerea unui 1
subgraf
2 3 3
rezult
4 4
G=(V,E) G1=(V1,E1)
250 Capitolul 9. Introducere n teoria grafurilor
1. Se dau n firme. ntre unele din acestea se stabilesc relaii de colaborare. Asociem
situaiei date un graf G. ntre timp, anumite firme se desfiineaz. Aceasta nseamn
c n G vom elimina anumite noduri i muchiile incidente lor, obinnd un subgraf al
lui G, G1.
2. Mai multe calculatoare (n) sunt legate n reea cu ajutorul unor cabluri. Asociem
situaiei date un graf G. ntre timp, anumite calculatoare se defecteaz. Astfel, se
obine un subgraf al lui G, G1.
...
Parcurgerea continu n acest mod pn cnd au fost vizitate toate nodurile
accesibile.
3
n acest paragraf vom exemplifica parcurgerile doar n cazul grafurilor conexe. Cum
noiunea nu a fost prezentat pn n acest moment, precizm doar c vom exemplifica
parcurgerea grafurilor n care oricare dou noduri sunt "legate" printr-o succesiune
de muchii.
Manual de informatic pentru clasa a XI-a 251
1
Pentru graful alturat avem:
2 6 3 Nod pornire 1: 1 3 6 2 7 5 4
Nod pornire 3: 3 7 6 1 2 5 4
Nod pornire 6: 6 3 1 7 2 5 4
4 5 7
Figura 9.8.
1
Pentru graful alturat, avem:
Nod pornire 1: 1 3 7 6 2 5 4
2 6 3
Nod pornire 3: 3 7 6 1 2 5 4
Nod pornire 6: 6 3 7 1 2 5 4
4 5 7
Figura 9.9.
254 Capitolul 9. Introducere n teoria grafurilor
9.1.7. Lanuri
Definiia 9.8. Se numete lan elementar un lan care conine numai noduri
distincte.
1
Exemple: pentru graful din figura alturat:
1. [1,2,5] este un lan elementar cu lungime 2,
ntre nodurile 1 i 5. 2 4 3
Problema 9.1. Fiind dat un graf i dou noduri ale sale a i b, s se scrie un
program care decide dac ntre ele exist un lan sau nu, iar n caz c acest lan
exist, se cere s se afieze lanul.
a) pentru exemplul 1, ntrebarea este: cum putem afla, pentru fiecare ora n parte,
oraele n care putem ajunge cu maina?
b) pentru exemplul 4, ntrebarea este: cum putem afla, pentru fiecare triunghi n
parte, care sunt triunghiurile asemenea cu el?
Problema 9.2. Fiind dat un graf G, cum putem obine matricea lanurilor?
Rspunsul este uor de dat. Parcurgem graful ncepnd cu nodul 1. Pentru toate
nodurile j vizitate, vom avea L(1,j)=1, completnd astfel prima linie a matricei.
Apoi, vom parcurge din nou, graful, pornind de la nodul 2. Pentru toate nodurile j,
vizitate, vom avea L(2,j)=1, apoi parcurgem graful ncepnd cu nodul 3.... .a.m.d.
O anumit mbuntire a algoritmului se obine dac inem cont de faptul c matricea
lanurilor este simetric (de ce?). Lsm ca exerciiu scrierea acestui program.
ntrebare: care este complexitatea acestui algoritm?
Definiia 9.9. Un graf neorientat G=(V,E) este conex, dac pentru orice
pereche de noduri x,yV, exist un lan n care extremitatea iniial este x
i extremitatea final este y.
2 3 5
Un graf cu un singur nod este, prin definiie, conex. Aceasta pentru c nu exist
dou noduri diferite pentru care s se pun problema existenei unui lan.
260 Capitolul 9. Introducere n teoria grafurilor
Problema 9.3. Fiind dat un graf G=(V,E), s se scrie un program care s decid
dac graful dat este sau nu conex.
Rezolvare. innd cont de cele nvate, problema nu este grea. Putem utiliza
una din metodele de parcurgere nvate, DF sau BF. Ideea este urmtoarea: dac,
pornind de la un nod, printr-una din metodele de parcurgere, ajungem s vizitm toate
celelalte noduri, atunci graful dat este conex. Cum putem ti dac am vizitat toate
nodurile? Simplu, dup parcurgere, toate componentele vectorului s rein 1. Putei
scrie acest program?
Observaii
Rezolvare. Dup cum uor v putei da seama, o parcurgere a grafului (DF sau
BF) pornind de la un anumit nod, viziteaz toate nodurile componentei conexe care
l conine. Pentru fiecare nod vizitat, s[i] reine 1. Dac, dup o parcurgere, mai
rmn noduri nevizitate, parcurgerea se reia ncepnd de la primul nod nevizitat.
Evident, numrul componentelor conexe este egal cu numrul de parcurgeri
necesare pentru a fi vizitate toate nodurile.
9.1.10. Cicluri
Problema 9.5. Fiind dat un graf conex, G=(V,E), s se scrie un program care
decide dac graful conine cel puin un ciclu.
Rezolvare. ncepem prin a observa c dac graful nu este conex, putem rezolva
problema verificnd dac exist un ciclu ntr-o component conex a sa. Pentru
simplitate, am preferat s considerm c graful este conex. i aici, problema se poate
rezolva pornind de la o parcurgere DF. Graful conine cel puin un ciclu dac, n
timpul parcurgerii, algoritmul va ajunge n situaia de a vizita un nod de dou ori
(tentativ oricum respins, pentru c algoritmul testeaz acest lucru, vedei rolul
vectorului s). Vom da un exemplu, cu graful de mai jos, pe care l parcurgem DF.
Observaie
unde m este numrul de muchii, iar n este numrul de noduri. Dac relaia este
verificat, nseamn c graful nu conine cicluri, altfel, dac m>n-1 nseamn c
graful conine cel puin un ciclu, iar dac m<n-1 nseamn c nu este conex, i ar
contrazice cerina.
9.1.11. Arbori
begin main()
CitireN('Graf.txt',A,n); { CitireN("Graf.txt",A,n);
df(1); df(1);
suma:=0; suma=0;
for i:=1 to n do for (i=1;i<=n;i++)
suma:=suma+s[i]; suma+=s[i];
if suma<>n if (suma!=n)
then writeln('Nu este conex') cout<<"Nu este conex";
else else
if gasit if (gasit)
then writeln('Are ciclu') cout<<"Are ciclu";
else writeln('Arbore'); else cout<<"Arbore";
end. }
Demonstraie
Fie G un arbore (graf neorientat, conex i fr cicluri). Trebuie s demonstrm
c are n-1 muchii. Vom demonstra prin inducie. Dac n=1, numrul muchiilor
este 0 (se verific, are n-1 muchii). Vom presupune proprietatea adevrat
pentru arbori cu n noduri (adic au n-1 muchii). Fie un arbore cu n+1 noduri.
Exist cel puin un nod terminal (nod care are o singur muchie incident).
Dac nu ar exista un astfel de nod, s considerm un lan care pornete
dintr-un nod oarecare. La fiecare pas, vom selecta o muchie. Pn la urm,
pentru c mulimea nodurilor este finit i pentru c nu exist nod terminal,
lanul va trece de dou ori printr-un acelai nod. Asta nseamn c arborele ar
conine cicluri (absurd, se contrazice definiia). Eliminm nodul terminal i
muchia care i este incident. Obinem un arbore cu n noduri. Conform ipotezei
fcute, acesta va avea n-1 muchii. nseamn c arborele cu n+1 noduri va
avea n muchii (n-1+1).
Observaii
Definiia 9.15. ntr-un graf orientat, prin gradul exterior al unui vrf v vom
nelege numrul arcelor incidente spre exterior cu v. Gradul exterior al
unui nod va fi notat cu d+(v).
Definiia 9.16. ntr-un graf orientat, prin gradul interior al unui nod v vom
nelege numrul arcelor incidente spre interior cu v.
Gradul interior al unui nod va fi notat cu d-(v).
d+(i)=3 i
d-(i)=2. Figura 9.21.
Manual de informatic pentru clasa a XI-a 269
Demonstraie. Relaia este adevrat, pentru c fiecare arc este incident spre
exterior cu un vrf i fiecare arc este incident spre interior cu un vrf.
Demonstraia se face prin inducie. Dac n=1, avem 1 graf orientat. Dac
n=2, cele dou noduri pot s nu fie sau s fie adiacente. n acest din urm caz,
putem avea arcul (v1,v2) sau arcul (v2,v1) sau putem avea ambele arce
(v1,v2) i (v2,v1). n total, avem 4 grafuri orientate, valoare care rezult i din
formul, dac nlocuim n cu 1.
Presupunem formula adevrat, adic dac sunt n vrfuri, avem
n ( n 1)
2
4
grafuri orientate. Trebuie s demonstrm c dac sunt n+1 vrfuri, avem
n ( n +1)
2
4
grafuri orientate. Adugm vrful n+1. Acest vrf poate fi adiacent cu fiecare
dintre celelalte n vrfuri n exact 3 moduri (vedei adiacena) sau poate s nu fie
adiacent. Atunci, numrul de grafuri orientate cu n+1 noduri este
n ( n 1) n ( n 1) n ( n +1)
+n
4 2 4 =
n
4 2 = 4 2 .
Definiia 9.17. Un graf orientat este complet dac oricare dou vrfuri i
i j (ij) sunt adiacente.
270 Capitolul 9. Introducere n teoria grafurilor
n ( n 1)
2
O relaie util: avem 3 grafuri complete. Demonstraia se face prin inducie!
Exerciiu!
Pentru fiecare structur de date pe care o vom folosi, vom avea cte o
procedur (funcie) care citete datele respective. Toate aceste subprograme se
gsesc grupate n unitatea de program grafuri.pas (pentru Pascal) i n
grafuri.cpp (pentru C++).
Toate subprogramele pe care le utilizm citesc datele dintr-un fiier text, n care
pe prima linie vom scrie numrul de noduri (n), iar pe urmtoarele linii cte o muchie
(i, j) ca n exemplul urmtor, n care este prezentat un graf i liniile fiierului text
care este citit pentru el:
Fiierul 6
1 text: 1 2
6
1 3
1 5
2 2 3
5 3 4
3 4 5
4
Figura 9.22.
1, pentru (i, j) A
a i, j =
0, pentru (i, j) A
0 1 1 0 1 0
0 0 1 0 0 0
Pentru graful din figura 9.22., matricea de adiacen
este prezentat alturat.
0 0 0 1 0 0
Observaii
0 0 0 0 1 0
0 0 0 0 0 0
1. ntruct, din modul n care a fost definit graful, rezult c nu
exist arce de la un nod la el nsui, rezult c elementele de 0 0 0 0 0 0
Manual de informatic pentru clasa a XI-a 271
Definiia 9.18. Un graf parial al unui graf orientat dat G=(V,A) este un
graf G1=(V,A1), unde A1A.
Un graf parial al unui graf dat, este el nsui, sau se obine din G prin
suprimarea anumitor arce.
1 1
2 3 3
2
rezult
4 4
Figura 9.23.
Obinerea unui
graf parial G=(V,A) G1=(V,A1)
Un subgraf al unui graf G este graful G sau se obine din G prin suprimarea
anumitor vrfuri i a tuturor arcelor incidente cu acestea.
1 1
2 3 3
rezult
4 4
Figura 9.24.
Obinerea unui G1=(V1,A1)
subgraf G=(V,A)
Definiia 9.20. Graful orientat G=(V,A) este tare conex dac x,yV,
drum de la x la y i drum de la y la x.
Figura 9.26.
Problema 9.8. Fie un graf orientat G=(V,A), memorat prin intermediul matricei de
adiacen. Se cere s se determine vrfurile fiecrei componente tare conex.
Rezolvare
a) Vom numi succesori ai vrfului i, toate nodurile j, pentru care exist drum de la
i la j, la care se adaug i. De exemplu, pentru graful dat., succesorii vrfului 1 sunt
vrfurile 1, 2, 3 i 4. Pentru a determina toi succesorii vrfului i, vom efectua o
parcurgere DF a grafului pornind de la acest vrf. Succesorii nodului i vor fi reinui n
vectorul suc.
276 Capitolul 9. Introducere n teoria grafurilor
c) Dac un vrf este simultan succesor i predecesor al lui i, atunci el va face parte
din componenta tare conex a vrfului i. Mulimea nodurilor cu aceast proprietate va
fi o component tare conex a grafului. De ce? Pentru c ntre dou vrfuri k i l,
exist att drum de la k la l (de la k la i i de la i la l) ct i drum de la l la k (de la
l la i i de la i la k). Mulimea nodurilor cu aceast proprietate este maximal n
raport cu relaia de incluziune. Dac, prin absurd, ar mai exista un vrf cu aceast
proprietate, care nu aparine acestei mulimi, atunci ar trebui s existe drum de la i la
el, i de la el la i, caz n care acesta ar fi fost gsit prin procedeul dat.
1 2 3 4 5 6 7 1 2 3 4 5 6 7
suc 1 1 1 1 0 0 0 suc 1 1 1 0 0 0 0
pred 1 1 1 0 0 0 0 pred 1 1 1 0 0 0 0
1 2 3 4 5 6 7 1 2 3 4 5 6 7
suc 1 1 1 2 0 0 0 suc 1 1 1 2 0 0 0
pred 1 1 1 2 2 2 0 pred 1 1 1 2 0 0 0
1 2 3 4 5 6 7 1 2 3 4 5 6 7
suc 1 1 1 2 3 0 3 suc 1 1 1 2 3 4 3
pred 1 1 1 2 3 0 3 pred 1 1 1 2 3 4 3
Manual de informatic pentru clasa a XI-a 277
Probleme propuse
1. O cunotin mi-a zis: la mine n birou suntem 5 persoane. Fiecare dintre noi
colaboreaz cu exact 3 persoane. A zis adevrul?
2. Demonstrai c ntr-un graf neorientat numrul nodurilor de grad impar este par.
3. Fiind date n persoane i m relaii de prietenie ntre ele de forma: persoana i este
prieten cu persoana j, se cere s se stabileasc corespondenele ntre afirmaiile
din stnga i cele din dreapta.
6. La un trand exist 6 bazine. Unele dintre ele sunt unite printr-o eav prin care
poate circula apa. Astfel, bazinul 1 este unit cu bazinul 2, bazinul 4 cu bazinul 5 i
bazinul 2 cu bazinul 3.
6.1. tiind c fiecare bazin poate fi dotat cu un robinet, se cere numrul minim de
robinete care asigur umplerea tuturor bazinelor.
6.2. Care este numrul minim de evi prin care se pot uni dou bazine, astfel nct s
se poat umple toate bazinele cu un singur robinet. Dai exemple de bazine unite care
asigur cerina problemei.
7. Fiind dat un grup de n persoane, n care dintre situaiile de mai jos se poate
folosi pentru modelare un graf neorientat?
a) Unele persoane din grup cunosc alte persoane din grup;
b) Unele persoane din grup simpatizeaz alte persoane din grup;
c) n cazul n care toate persoanele lucreaz ntr-o firm, unele persoane din grup
sunt efi pentru alte persoane din grup;
d) Unele persoane din grup sunt prietene cu 1
2
alte persoane din grup.
1 1 1 1 0 1 0 0 1 1 1 0 1 0 0 1 1 1 0 1 0 0 1 1 1 0 1 0
1 1 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0
1 0 1 1 0 0 0 1 0 0 1 0 0 0 1 0 0 1 0 0 0 1 0 0 1 0 0 0
1 0 1 1 0 0 1 1 0 1 0 0 0 1 1 0 1 0 0 0 1 1 0 1 0 0 0 1
0
0 0 0 1 0 0 0
0 0 0 0 0 0
0
0 0 0 0 1 0 1
1 1 1 1 1 1
1 0 0 0 0 1 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1 1 0 0 0 0 0 1
0 0 0 1 0 1 1 0 0 0 1 0 1 0 0 0 0 1 0 1 0 0 0 0 1 0 1 0
a) b) c) d)
280 Capitolul 9. Introducere n teoria grafurilor
9. Care este valoarea de adevr a afirmaiilor de mai jos (A, adevrat, iar F, fals):
0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 0 0
1 0 1 0 0 1 0 1 0 0 1 0 1 0 0 1 0 1 0 1
0 1 0 1 1 0 1 0 1 1 0 1 0 1 0 0 1 0 1 1
1 0 1 0 1 1 0 1 0 0 1 0 1 1 1 0 0 1 0 1
0 0 1 1 0 0 0 1 0 0 0 0 0 1 0 0 1 1 1 0
Figura 9.30.
a) b) c) d)
11. Care dintre matricele de mai jos poate fi matricea de adiacen a unui graf
neorientat?
0 1 0 1 0 0 1 0 0 0 1 1 1 1 1 0 1 0 1 0
1 0 1 0 0 1 0 1 0 0 1 1 1 1 1 1 0 1 0 0
0 1 0 1 1 0 1 0 1 1 1 1 1 1 1 0 1 0 1 1
1 0 1 1 1 1 0 1 0 1 1 1 1 1 1 1 0 1 0 1
0
0 1 1 0 0
0 1 1 0 1
1 1 1 1 0
0 1 1 0
a) b) c) d)
Manual de informatic pentru clasa a XI-a 281
0 0 0 0 0 1 0 0 0 1 1 0 0 1 1 1
0 0 0 0 1 0 0 0 1 0 0 0 1 0 1 1
0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 1
0
0 0 0 0
0 0 1 0
0 0 0 1
1 1 0
Figura 9.31.
a) b) c) d)
15. Care este numrul minim i care este numrul maxim de componente conexe
pe care le poate avea un graf neorientat cu 8 noduri i 6 muchii?
16. Care este numrul de cifre 0 pe care l reine matricea de adiacen a unui graf
neorientat cu n noduri i m muchii?
17. Care este numrul minim i numrul maxim de noduri izolate pe care l poate
avea un graf neorientat cu 10 noduri i 10 muchii?
18. Care este numrul de grafuri neorientate cu 5 noduri?
19. Precizai care dintre afirmaiile urm-
toare sunt adevrate i care sunt false. 1 3
Toate afirmaiile se refer la graful din 2
figura 9.32.
19.1. "6 1 2 3 5 4 7" reprezint o 5
parcurgere n adncime a grafului. 4
6
19.2. "3 2 5 1 4 6 7" reprezint o 7
parcurgere n lime a grafului. Figura 9.32.
19.3. Exist dou noduri din graf pentru care nu exist un lan care le unete.
19.4. "6 1 2 3 5 4 7" este un lan n graful dat.
19.5. "3 2 5 1 4 6 7" este un lan n graful dat.
19.6. Numrul minim de muchii care trebuie eliminate pentru a obine un arbore
parial este 2.
19.7. Numrul maxim de muchii care pot fi eliminate astfel nct graful s rmn
conex este 3.
19.8. Numrul minim de muchii care pot fi eliminate pentru ca graful s nu conin
cicluri este 3.
19.9. Un arbore parial al grafului dat are 7 muchii.
282 Capitolul 9. Introducere n teoria grafurilor
20. Precizai dac afirmaiile de mai jos sunt adevrate sau false.
20.1. Cu ajutorul parcurgerii n adncime se poate determina dac un graf neorientat
are cel puin un ciclu.
20.2. Orice graf neorientat are un graf parial care este arbore.
20.3. Cu ajutorul parcurgerii n lime se poate determina dac un graf este conex.
20.4. Orice graf neorientat cu 10 noduri i 9 muchii este un arbore.
20.12. Orice graf complet este alctuit dintr-o singur component conex.
20.13. Din orice graf complet, prin eliminarea anumitor muchii se poate obine un
arbore.
20.14. Orice graf complet are un subgraf care este arbore.
21. Se d un graf neorientat memorat sub forma matricei de adiacen. S se afieze
toate nodurile care au gradul maxim.
22. S se scrie un subprogram care transform matricea de adiacen a unui graf n
liste de adiacene.
23. S se scrie scrie un subprogram care transform listele de adiacen n matrice
de adiacen.
24. Se d un graf neorientat i o succesiune de noduri ale lui. Se cere s se scrie un
subprogram care decide dac succesiunea dat este sau nu un lan.
25. Se d un graf neorientat memorat prin liste de adiacen. S se scrie un
subprogram care decide dac graful dat conine sau nu cicluri.
26. Se d un graf memorat prin matricea de adiacen i un nod al su, v. Se cere
s se parcurg graful n lime, pornind de la nodul v. Algoritmul va utiliza coada
creat ca list liniar simplu nlnuit implementat static.
Manual de informatic pentru clasa a XI-a 283
34. Se dau n mulimi de numere naturale: A1, A2...An. Acestor mulimi li se asociaz
un graf orientat astfel: dac mulimea Ai este inclus n mulimea Aj, n graful asociat
vom avea arcul (Ai,Aj). Nu vom considera cazul de incluziune a unei mulimi n ea
nsi. Stabilii corespondena dintre operaiile din stnga i cele din dreapta.
Figura 9.33.
37. n graful din figura 9.34, care este lungimea celui mai
lung lan elementar i care este lungimea celui mai lung 1
drum elementar?
a) 3 2; b) 2 2; c) 2 3; d) 1 2. 4
3
2
Figura 9.34.
41. Care este numrul minim de arce care trebuie adugate pentru ca graful s
devin tare conex?
a) 1; b) 2; c) 3; d) 4.
42. Se d un graf orientat. Se cere s se afieze, pentru fiecare vrf n parte, gradul
interior i gradul exterior. Problema se va rezolva n cazul n care graful este dat prin
matricea de adiacen i n cazul n care el este dat prin liste de adiacen.
43. Fiind date un graf orientat i o succesiune de vrfuri s se decid dac
succesiunea este drum, iar n caz afirmativ se va preciza dac este sau nu un drum
elementar. Problema se va rezolva n cazul n care graful este dat prin matricea de
adiacen i n cazul n care el este dat prin liste de adiacen.
44. La fel ca mai sus, dar se cere s se determine dac succesiunea respectiv este
sau nu lan (lan elementar).
45. Se d un graf prin lista muchiilor. Programul va decide dac graful este
neorientat.
46. Se dau listele de adiacene ale unui graf orientat. Programul va afia matricea de
adiacen.
47. Se d matricea de adiacen a unui graf orientat. Programul va afia listele de
adiacene ale acestuia.
48. Se d matricea de adiacen a unui graf orientat. Se cere s se listeze toate
circuitele de lungime 3.
49. Se d matricea de adiacen a unui graf orientat. Se cere s se listeze toate
ciclurile de lungime 3.
*
50 . Algoritmul lui Lee. Se d un labirint sub forma unei matrice ptratice, L.
L(i,j) =-1 dac prin camera respectiv nu se poate trece i 0 n caz contrar. S
se afieze distanele minime de la camera de coordonate (l,c) la toate camerele
accesibile din camera iniial.
*
51 . La fel ca la problema anterioar. Se cere drumul care trece printr-un numr
minim de camere ntre o camer iniial i una final.
52 . Pe o tabl de ah de dimensiuni nxn se poate deplasa un nebun conform
*
regulilor obinuite ale ahului. n plus, pe tabl se pot afla obstacole la diferite
coordonate; nebunul nu poate trece peste aceste obstacole. S se indice dac
exist vreun drum ntre dou puncte A(X1,Y1) i B(X2,Y2) de pe tabl i, n caz
afirmativ, s se tipreasc numrul minim de mutri necesare. Se citesc: N, X1,
Y1, X2, Y2, apoi perechile de coordonate ale obstacolelor.
*
53 . Sortare n limita posibilitilor. Se consider c ntr-un vector V cu n
componente se pot inversa numai coninuturile anumitor componente dintre cele n. O
pereche de componente de indice i i j ale cror coninuturi se pot inversa este dat
de perechea i i j. Fiind date m astfel de perechi i tiind c vectorul conine
numerele 1, 2, , n ntr-o ordine oarecare, se cere ca vectorul s conin numerele
1, 2, , n sortate. Pentru sortare se inverseaz numai coninuturile componentelor
care se pot inversa (care sunt perechi dintre cele m). Dac sortarea este posibil, se
286 Capitolul 9. Introducere n teoria grafurilor
vor afia indicii componentelor care se inverseaz, iar dac sortarea nu este posibil,
se afieaz Nu. Datele de intrare se gsesc n fiierul text date.in astfel:
Linia 1 n
Linia 2 1, ..., n ntr-o ordine oarecare;
Linia 3 m
urmtoarele m linii conin fiecare cte o pereche de indici i, j.
Exemplu:
3 Programul va afia:
3 1 2 1 2
2 2 3
2 3
1 2
*
54 . Lucrare n echip. Se dorete scrierea unei aplicaii de informare a cltorilor
privind transportul n comun ntr-un ora. Se cunosc cele n staii de autobuz din oraul
respectiv. De asemenea, se tie traseul a k linii de autobuz (staiile prin care acestea
trec). Se cere ca aplicaia s furnizeze modul n care o persoan se poate deplasa cu
autobuzul ntre dou staii date, n ipotezele:
a) n numr minim de staii.
b) Prin utilizarea unui numr minim de linii de autobuz.
Rspunsuri
7. Pentru a putea modela anumite relaii cu ajutorul unui graf neorientat trebuie ca
relaia existent ntre i i j s fie reciproc, pentru c muchia (i,j) presupune c i
este n relaie cu j i j este n relaie cu i. Dac i cunoate pe j, nu este obligatoriu
ca j s cunoasc pe i, dac i simpatizeaz pe j, nu este obligatoriu ca j s
simpatizeze pe i, dac i este eful lui j, j nu poate fi eful lui i. n concluzie,
rspunsul este d) pentru c relaia de prietenie este reciproc.
8. b).
9. 9.1. A; 9.2. F; 9.3. F; 9.4. F; 9.5. F; 9.6. A; 9.7. F; 9.8. A; 9.9. A;
9.10. A.
10. b) Dac matricea este de adiacen, atunci v putei orienta dup gradele
vrfurilor. Evident, graful reprezentat de matricea de adiacen trebuie s aib
vrfurile cu aceleai grade cu vrfurile grafului reprezentat n desen.
11. d) Desigur, putei desena graful, dar, mai uor, eliminai variantele n care
avei 1 pe doagonala principal, sau acelea n care matricea nu este simetric.
12. 8. Dac matricea este dat corect, nu este nevoie s desenai graful pentru
ca, apoi, s-i numrai muchiile. Se tie c suma gradelor tuturor nodurilor este
egal cu dublul numrului de muchii. Prin urmare, este suficient s nsumai
elementele reinute de matrice si s mprii rezultatul la 2.
13. 2.
14. a) Dac matricea are 4 linii i 4 coloane, este clar c subgraful ar rezulta prin
eliminarea unui singur nod i a muchiilor incidente lui. Dac eliminm nodul din
centru, se obin 4 noduri izolate. Oricare alt nod am elimina, rmn 1 nod cu
gradul 3 i 3 noduri cu gradul 1.
15. 2 componente conexe i 5 componente conexe.
16. n2-2m. Matricea de adiacen are n2 elemente. Am vzut faptul c suma
tuturor cifrelor de 1 (adic a gradelor vrfurilor) este 2m (unde m este numrul de
muchii).
17. 0 i 5.
18. 210.
19. 19.1. A, 19.2. A, 19.3. F, 19.4. A, 19.5. F, 19.6. F, 19.7. A,
19.8. A, 19.9. F.
20. 20.1. A, 20.2. F, 20.3. A, 20.4. F, 20.5. A, 20.6. F, 20.7. F,
20.8. A, 20.9. A, 20.10. A, 20.11. F, 20.12. A, 20.13. A, 20.14. A
(lsm un singur nod).
29., 30. Descompunerea unui graf n componente conexe.
31. Backtracking. O soluie are lungimea k.
32. Fie i<j<k<l, 4 noduri care formeaz un ciclu. Avem:
A(i,j)=1 A(i,l)=1
A(k,j)=1 A (k,l)=1
288 Capitolul 9. Introducere n teoria grafurilor
50. Se poate lucra direct pe matricea L. Idee: pentru camera iniial vom avea
L(i,j)=1. Apoi, pentru toate camerele accesibile vecine cu ea vom avea
L(i,j)=2, apoi pentru toate camerele accesibile cu ele vom avea L(i,j)=3...
.a.m.d. Pentru a obine aceast marcare vom parcurge n lime graful asociat.
Putem evita memorarea acestuia. Vom introduce n coad coordonatele camerei
iniiale. Vom ncrca n coad coordonatele tuturor camerelor vecine pentru care
L(i,j)=1. Pentru fiecare astfel de camer, pentru care, iniial, L(i,j)=0, vom avea
L(i,j)=2. Se trece apoi la urmtorul element din coad cu care se procedeaz
asemntor. Se tie c, prin parcurgerea n lime, se viziteaz nodurile n
ordinea lungimii drumului, de la ele la nodul iniial. Deducem, astfel, c marcarea
este corect. Algoritmul se termin cnd coada este vid. n final, se afieaz
matricea L.
53. Asociem problemei un graf neorientat. Nodurile sunt indicii elementelor vectorului,
de la 1 la n. Cnd coninuturile a dou elemente se pot inversa, nodurile
corespunztoare sunt unite printr-o muchie. Dac nodurile i1, i2, ..., ik sunt unite
printr-un drum: atunci interschimbrile (i1, i2), (i2, i3), ..., (ik-1, ik),
(ik-1, ik-2), ..., (i2, i1) inverseaz coninuturile elementelor de indice i1 i ik,
lsnd coninuturile celorlalte elemente de indici i2, ..., ik-1 nemodificate. O
parcurgere n lime determin distana minim ntre dou noduri.
289
Anexa 1
Memento
A) Tipuri ntregi
Ocup
Nume tip Semnificaie Valori admise
(bii)
shortint ntreg scurt 8 de la -128 la 127
integer ntreg 16 de la -32768 la 32767
longint 32 de la -2147483648 la
ntreg lung
2147483647
byte numr natural scurt 8 de la 0 la 255
word cuvnt 16 de la 0 la 65535
C) Tipuri reale
Ocup
Nume tip Semnificaie Valori admise (n modul)
(bii)
virgul mobil, [-1,71038, -2,910-29]
real 48
simpl precizie [2,910-29, 1,71038]
D) Tipul logic boolean poate reine doar dou valori true i false.
290 Anexa 1. Memento
A.1.2. Constante
folosete punctul.
Exemple: 2.34, 45.26, 512E+23, 45.1E3.
A.1.3. Operatori
A.1.3.1. Prioritatea operatorilor
Operatorul DIV furnizeaz rezultat corect numai dac ambele valori sunt
numere ntregi pozitive.
Operatorul < (mai mic). Fiind dai doi operanzi a i b, operatorul < arat
dac este adevrat sau nu relaia a<b. Dac relaia este adevrat
rezultatul va fi TRUE, altfel rezultatul va fi FALSE.
Operatorul <= (mai mic sau egal). Fiind dai doi operanzi a i b, operatorul
<= arat dac este adevrat sau nu relaia a<=b. Dac relaia este
adevrat rezultatul va fi TRUE, altfel rezultatul va fi FALSE.
Operatorul > (mai mare). Fiind dai doi operanzi a i b, operatorul > arat
dac este adevrat sau nu relaia a>b. Dac relaia este adevrat
rezultatul va fi TRUE, altfel rezultatul va fi FALSE.
Operatorul >= (mai mare sau egal). Fiind dai doi operanzi a i b, operatorul
>= arat dac este adevrat sau nu relaia a>=b. Dac relaia este
adevrat rezultatul va fi TRUE, altfel rezultatul va fi FALSE.
Operatorul OR (sau). Regula este simpl: dac unul dintre operanzi este
TRUE, rezultatul este TRUE, altfel rezultatul este FALSE.
Operatorul XOR (sau exclusiv). i aici, regula este foarte simpl: dac
argumentele sunt diferite rezultatul este TRUE, contrar el este FALSE.
Manual de informatic pentru clasa a XI-a 293
Operatorul AND (I) este binar. Se face I logic pentru toate perechile de
bii aflai pe aceeai poziie a celor doi operatori. Dac ambii bii sunt 1,
rezultatul este 1, iar n orice alt caz, rezultatul este 0.
Operatorul OR (SAU) este binar. Se face SAU logic pentru toate perechile de
bii aflai pe aceeai poziie a celor doi operatori. Dac cel puin un bit este 1
rezultatul este 1, altfel, rezultatul este 0.
Operatorul XOR (SAU EXCLUSIV) este binar. Se face XOR pentru toate
perechile de bii aflai pe aceeai poziie a celor doi operatori. Dac biii sunt
diferii rezultatul este 1, altfel, rezultatul este 0.
A.1.4. Instruciuni
Forma 1.
Forma 2.
Forma 1.
FOR variabil := expresie1 TO expresie2 DO instruciune
unde:
variabila poate fi de orice tip ordinal (de exemplu, de tip integer, char
sau boolean, dar n nici un caz de tipul real);
expresie1, expresie2 sunt expresii de acelai tip cu variabila.
Forma 2.
x y = eln(x ) = e yln(x) .
y
Funcia de trunchiere
returneaz X-Int(X).
Funcia de rotunjire
function Round(X: Real): Longint;
returneaz x .
298 Anexa 1. Memento
A) Tipuri ntregi
Ocup
Nume tip Semnificaie Valori admise
(bii)
unsigned
char caracter fr semn 8 de la 0 la 255
32 de la -2.147.483.648 la
long ntreg lung cu semn 2.147.483.647
B) Tipuri reale
Ocup
Nume tip Semnificaie Valori admise (n modul)
(bii)
virgul mobil,
float 32 [3.4 10-38,3.41038]
simpl precizie
virgul mobil,
double 64 [1.710-308 ,1.710+308]
dubl precizie
long virgul mobil,
dubl precizie [3.410-493 , 1.1 10+4932]
2
double 80
format lung
A.2.2. Constante
1. Constante ntregi. Acestea se clasific astfel:
zecimale (n baza 10). Exemple: 23, 1239, 56.
octale (n baza 8). O constant n baza 8 se declar precedat de un 0
nesemnificativ. Exemplu: 0123. Se reine numrul ntreg 123(8).
hexazecimale (n baza 16). Acestea sunt precedate de 0X sau 0x.
Exemplu: pentru 0X1A2 adic 1A2(16) sau 0x1a2, adic 1A2(16).
Manual de informatic pentru clasa a XI-a 299
5. Constante reale
6. Constante ir de caractere
Exemplu: "'acesta este un text".
tip - reprezint tipul constantei (dac este absent, tipul este int);
nume - reprezint numele constantei;
valoare - reprezint valoarea constantei.
300 Anexa 1. Memento
A.2.3. Operatori
1 ()[] >::. s d
2 !~ ++ + *(typecast )sizeof newdelete d s
3 . * > * s d
4 */ % s d
5 + s d
6 <<>> s d
7 <<=>>= s d
8 ==! = s d
9 & s d
10 ^ s d
11 | s d
12 && s d
13 || s d
14 ?: d s
15 =* =/ =+ = =& =^ =|=<<=>>= d s
16 , s d
Observaii
a) dac ambii sunt de tip ntreg, rezultatul este ntreg i are semnificaia de
mprire ntreag. Cu toate acestea, rezultatul este corect (din punct de
vedere matematic) numai dac valorile care se mpart sunt pozitive.
b) dac cel puin un operand este de unul din tipurile reale, rezultatul este
real (se efectueaz mprirea obinuit).
2. Operatorul % acioneaz numai asupra operanzilor de tip ntreg. Rezultatul
obinut este corect din punct de vedere matematic numai dac ambii
operanzi sunt numere naturale.
3. n cazul n care se mpart dou valori ntregi, se procedeaz astfel:
a) se face mprirea ntreag a celor dou valori care sunt considerate n
modul;
b) semnul ctului se stabilete dup regula semnelor (+ cu + rezultat +,
+ cu -, rezultat -), etc.
Acetia sunt:
== pentru egalitate;
!= pentru inegalitate.
Operatorii pot fi prefixai (aplicai n faa operandului) sau postfixai (aplicai dup
operand).
Operatorul i logic (binar) acioneaz astfel: dac ambii operanzi sunt diferii
de 0, rezultatul este 1, altfel el este 0.
Operatorul sau logic (binar) acioneaz astfel: dac cel puin unul din
operanzi este o valoare diferit de 0, rezultatul este 1, altfel rezultatul este 0.
Limbajul C++ este dotat cu un set de operatori care permit accesul la bit.
Acetia sunt:
<<, >> operatori de deplasare;
& i pe bii;
| sau pe bii;
^ sau exclusiv pe bii;
~ negare pe bii (operator unar).
Operatorul << este binar. El are rolul de a deplasa ctre stnga coninutul
tuturor biilor operandului din stnga sa, cu un numr de poziii egal cu valoarea
reinut de al doilea operand. Poziiile rmase libere (n dreapta) vor reine valoarea 0.
Operatorul >> este binar. El are rolul de a deplasa ctre dreapta coninutul
tuturor biilor operandului din stnga cu un numr de poziii egal cu valoarea reinut
de al doilea operand. Dac operandul din stnga este de un tip ntreg fr semn,
poziiile rmase libere (n stnga) vor reine valoarea 0. Dac al doilea operand
reine valoarea m, o astfel de deplasare este echivalent cu mprirea ntreag cu
2m. n cazul n care primul operand este un ntreg cu semn, fiecare poziie din
stnga rmas liber se completeaz cu valoarea reinut de bitul de semn.
n cazul operatorilor binari & , | , ^, rezultatul se obine aplicnd pentru
fiecare pereche de bii aflai pe aceeai poziie regulile din tabelul urmtor. Atunci
cnd cei doi operanzi nu au aceeai lungime (dar numai atunci - de exemplu, dac
ambii operanzi sunt de tip char i rezultatul este de tip char), se aplic regulile de
conversie pentru expresii aritmetice.
n C++ atribuirea este operator. n plus, n C++ avem mai muli operatori de
atribuire. Operatorul = se folosete ntr-o expresie de forma:
v=expresie
Aici, v este o variabil.
se evalueaz expresia;
n ansamblu, expresia este de tipul lui exp2 sau exp3 i produce valoarea
exp2 sau exp3 (n funcie de cea care se evalueaz).
Manual de informatic pentru clasa a XI-a 305
De multe ori, dorim ca unul sau mai muli operanzi s intre n calcul convertii
aa cum dorim (nu implicit). Pentru aceasta, naintea operandului se trece ntre
paranteze tipul su.
Exemplu: fie declaraia: float x= -1.9;. Atunci: (int)x=-1 (se face
conversia din float n int prin trunchiere).
A.2.4. Instruciuni
1. Instruciunea expresie este de forma:
expresie;.
La ntlnirea unei astfel de instruciuni, se evalueaz expresia. n limbajul
C++ i o atribuire este o expresie.
Forma 1.
if (expresie) instruciune1 else instruciune2
Forma 2.
if (expresie) instruciune
Principiul de executare este urmtorul:
se evalueaz expresia;
dac valoarea produs de aceasta este diferit de 0, se execut
instruciunea subordonat.
306 Anexa 1. Memento
switch (expresie)
{ case exp1: secven instruciuni1; break;
case exp2: secven instruciuni2; break;
.................................
case expn: secven instruciunin; break;
[default: secven instruciunin+1];
}
unde:
expresie are semnificaia: expresie de tip ntreg;
expi sunt expresii constante de tip ntreg;
instruciunii reprezint o secven oarecare de instruciuni.
Principiul de executare:
se evalueaz expresia;
dac aceasta produce o valoare egal cu cea produs de expi, se
execut, n ordine, instruciunii i se trece la instruciunea urmtoare,
altfel se execut numai secvena instruciunin+1.
5. Instruciunea while
Principiul de executare:
Funcia abs are forma general: int abs(int x); Rolul ei este de a
ntoarce x (modulul lui x).
Funcia fabs are forma general double fabs(double x); are acelai
rol cu abs, numai c ntoarce valoarea unui numr real (chiar double).
308 Anexa 1. Memento
Funcia labs are forma general long int labs(long int x); i
acelai rol cu abs, numai c ntoarce valoarea unui ntreg lung.
Funcia acos are forma general: double acos(double x); i
calculeaz valoarea funciei arccos( x) : [1,1] [0, ].
Anexa 2
Aplicaii practice ale grafurilor
Internet
Router
Switch 1 Switch 2
Subreeaua 1 Subreeaua 2
Observaii
Protocoale de routare
L1 L2
Avnd cunoscut drumul critic pentru un graf asociat unui proiect, se pot
analiza n detaliu anumite aspecte particulare ale fiecrui eveniment sau activitate.
Dorim s cunoatem cum se pot derula celelalte activiti, care nu sunt critice, n
funcie de durata drumului critic. Astfel, au fost introduse cteva noiuni teoretice,
ce vor fi prezentate n continuare.
S revenim la exemplul din figura A.3. Pentru evenimentul 4, vom avea data
ateptat egal cu 10 (5+2+3) uniti, iar data limit, egal cu 16 (21-5) uniti.
Putem astfel considera c evenimentul 4 trebuie s fie atins dup 10 uniti
temporale, iar n cazul unei ntrzieri, atingerea sa nu poate s dureze cu mai mult
de 6 (16-10) uniti fa de data sa ateptat de terminare.
Arcele ce formeaz drumul critic au aceste dou valori nule (nu le este
permis nici o ntrziere).
314 Anexa 2 - Aplicaii practice ale grafurilor
se numesc
n chimie, grafurile ce descriu topologia molecular grafuri
moleculare. Dup cum era de ateptat, nodurile rep rezint atomii, iar arcele
semnific legturile dintre atomi.
5 7
2 1
3 4
Pentru graful neorientat prezentat anterior, se pot asocia urmtoarele trei matrice:
Manual de informatic pentru clasa a XI-a 315
0 1 0 1 1 0 0 0 1 2 1 1 2 2 0 3 2 3 1 2 2
1 0 1 0 0 0 0 1 0 1 2 2 3 3 3 0 3 2 4 5 5
0 1 0 1 0 0 0 2 1 0 1 3 4 4 2 3 0 3 3 4 4
1 0 1 0 0 0 0 1 2 1 0 2 3 3 3 2 3 0 4 5 5
1
0 0 0 0 1 1 1
2 3 2 0 1 1
1
4 3 4 0 1 1
0 0 0 0 1 0 0 2 3 4 3 1 0 2 2 5 4 5 1 0 2
0 0 0 0 1 0 0 2 3 4 3 1 2 0 2 5 4 5 1 2 0
()
1
= ij ,
2 i =1 j =1
(d )
1
W (G ) = ij ,
2 i =1 j =1
Anexa 3
Tabela codurilor ASCII
Cod Caracter Cod Caracter Cod Caracter Cod Caracter Cod Caracter Cod Caracter
000 (nul) 022 (syn) 044 , 066 B 088 X 110 n
001 (soh) 023 (etb) 045 - 067 C 089 Y 111 o
002 (stx) 024 (can) 046 . 068 D 090 Z 112 p
003 (etx) 025 (em) 047 / 069 E 091 [ 113 q
004 (eot) 026 (eof) 048 0 070 F 092 \ 114 r
005 (enq) 027 (esc) 049 1 071 G 093 ] 115 s
006 (ack) 028 (fs) 050 2 072 H 094 ^ 116 t
007 (bel) 029 (gs) 051 3 073 I 095 _ 117 u
008 _ (bs) 030 (rs) 052 4 074 J 096 ` 118 v
009 (tab) 031 (us) 053 5 075 K 097 a 119 w
010 (lf) 032 (spaiu) 054 6 076 L 098 b 120 x
011 (vt) 033 ! 055 7 077 M 099 c 121 y
012 (np) 034 " 056 8 078 N 100 d 122 z
013 (cr) 035 # 057 9 079 O 101 e 123 {
014 (so) 036 $ 058 : 080 P 102 f 124 |
015 (si) 037 % 059 ; 081 Q 103 g 125 }
016 (dle) 038 & 060 < 082 R 104 h 126 ~
017 (dc1) 039 ' 061 = 083 S 105 i 127
018 (dc2) 040 ( 062 > 084 T 106 j
019 (dc3) 041 ) 063 ? 085 U 107 k
020 (dc4) 042 * 064 @ 086 V 108 l
021 (nak) 043 + 065 A 087 W 109 m