Documente Academic
Documente Profesional
Documente Cultură
REALIZAT DE:
COORDONATOR:
2020
1
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
I. ARGUMENT .......................................................................................................... 5
2
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
3
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
A 3 – 5. Test de evaluare baze de date Microsoft Access - clasa a X-a ............ 202
4
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
5
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Programa pentru disciplina Informatică şi TIC pentru clasele V-VIII identifică un set
relevant de competențe generale şi specifice pentru societatea actuală, oferind activităţi de învățare,
conținuturi şi sugestii metodologice utile pentru realizarea profilului de formare al absolventului de
gimnaziu, conform descriptivului competenței digitale.
7
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
8
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
9
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
10
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
11
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Pentru a veni în sprijinul profesorului, acest ghid îi pune la dispoziție modele de fișe de
documentare, fișe de lucru, fișe/teste de evaluare/autoevaluare etc. pentru disciplina Tehnologia
informației și a comunicațiilor (TIC), structurate astfel (ANEXA 3):
BAZE DE DATE MICROSOFT ACCESS (arhivă .rar) - clasa a X-a, filiera teoretică, toate
profilurile și specializările, material realizat de profesor Cojocaru Nicoleta, de la Colegiul
Național de Informatică „Matei Basarab”, Rm. Vâlcea;
12
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
13
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
14
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Operatori aritmetici:
SCRIEREA
OPERATOR ACŢIUNEA EXEMPLU
RELAŢIEI
Adunarea a doi
+ a+b 3+5=8
operanzi
Scăderea a doi a-b
- 10 – 2 =8
operanzi
Înmulțirea a doi a*b
* 5 * 2 = 10
operanzi
Câtul împărțirii a doi a/b
/ 5/2=2
operanzi
Restul împărțirii a a%b
% 5%2=1
doi operanzi
Operatorul de atribuire:
SCRIEREA
OPERATOR ACŢIUNEA EXEMPLU
RELAŢIEI
Variabilei din stânga a = 2 şi b = 3
îi este atribuită
= a=b a=b
valoarea variabilei
din dreapta a = 3 şi b = 3
15
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Operatorii logici:
SCRIEREA
OPERATOR ACŢIUNEA
RELAŢIEI
AND ( && ) ŞI logic a && b
OR ( | | ) SAU logic a || b
NOT ( ! ) negare !a
a b a && b
0 0 0
0 1 0
1 0 0
1 1 1
a b a||b
0 0 0
0 1 1
1 0 1
1 1 1
16
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
APLICAȚII REZOLVATE:
1) 10 – 7 % 3 * 2 = 10 – 1 * 2 = 10 – 2 = 8
2) 15 / 7 – 8 % ( 3 – 1 ) + 10 = 2 – 8 % 2 + 10 = 2 – 0 + 10 = 12
3) ( 24 % 3 / 5 + 1) * 7 / 3 = ( 8 / 5 + 1 ) * 7 / 3 = ( 1 + 1 ) * 7 / 3 = 2 * 7 / 3 = 14 / 3 = 4
4) 100 – ( 25 / 5 + 7 ) % 10 * 2 = 100 – ( 5 + 7 ) % 10 * 2 = 100 – 12 % 10 * 2 =
= 100 – 2 * 2 = 100 – 4 = 96
5) 14 * ( 5 % 3 – 1 ) + 27 / 9 = 14 * (2 – 1 ) + 3 = 14 + 3 = 17
REVENIRE
17
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Clasa a VI-a
18
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
19
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
1. Pentru fiecare dintre exemplele de mai sus, identificați operația care se repetă și numărul
de repetiții.
Rezolvare exemplul 1.
┌ PENTRU numarexercitiu<- 1,7 EXECUTĂ
│ Identifică exercițiul cu numarul numarexercitiu
│ Rezolvă exercițiu cu numarul numarexercitiu
└■
Numărul de repetiții este egal cu 7.
2. Identificați alte 3 situații din viața de zi cu zi în care apare o structură repetitivă cu număr
cunoscut de pași.
20
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
3. Fotbal
Cinci copii aruncă la poartă cu mingea, pe rând. Câștigă cel care a înscris cele mai multe
goluri.
4. Arcul
Doi copii au la dispoziție un arc, trei săgeți și o țintă. Fiecare
aruncă la țintă cu arcul de 3 ori, însumând punctajul obținut. Câștigă cel
cu punctajul mai mare.
5. Distracție
Șase prieteni îşi scriu prenumele pe câte o foaie de hârtie. Hârtiile sunt amestecate și
întoarse cu fața în jos. Fiecare alege una dintre hârtiile cu prenumele și rostește prenumele ales,
citind de la dreapta spre stânga literele. Pentru fiecare prenume rostit corect, câștigă 1 punct. Fiecare
are la dispoziție 3 încercări.
21
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
APLICAȚII DE 5 stele:
22
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
REVENIRE
23
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Clasa a VI-a
DESPRE INTERNET
ISTORIC
În 1969 s-a finalizat în SUA, proiectul ARPANET, considerat precursor al Internetului.
Rețeaua conecta calculatoarele din patru universități americane: Institutul de Cercetări Stanford,
Universitatea Utah, Universitatea California din Los Angeles și Universitatea California din Santa
Barbara.
În România, începând cu 1970, demarează proiectul RENAC (Rețeaua Națională de
Calculatoare) / RENOD (Rețeaua Nodală de Comunicații) pentru constituirea unei rețele la nivel
național. Proiectul a fost finalizat la sfârșitul anului 1983.
În anul 1989, cercetătorul britanic Tim Berners-Lee, în timp ce lucra ca inginer de software
la CERN (Organizația Europeană pentru Cercetări Nucleare) din Geneva, a creat World Wide Web
prin unirea hipertextului cu Internetul. Din anul 1994, Tim Berners-Lee este directorul World Wide
Web Consortium (W3C), care creează tehnologii pentru a dezvolta Web-ul.
REȚELE DE CALCULATOARE
O rețea de calculatoare este formată dintr-un grup de două sau mai multe calculatoare,
interconectate, care comunică între ele în scopul partajării informației.
Calculatoarele și dispozitivele din rețea comunică între ele pe baza unui set de reguli,
numit protocol. Toate sistemele de operare utilizează un Protocol de Control al
Transmisiei/Protocol Internet (TCP/IP).
Protocolul de Transfer al Fișierelor – File Transport Protocol (FTP) este cea mai folosită
metodă de transfer a fișierelor, indiferent de tipul și dimensiunea acestora, de la un calculator la
altul, prin intermediul Internetului.
24
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
REȚEAUA INTERNET
Este o rețea globală compusă din alte rețele de calculatoare interconectate printr-un
standard de comunicare numit TCP/IP (Transmission Control Protocol și Internet Protocol)
destinată să faciliteze schimbul de date și informații.
Cele mai importante servicii oferite de Internet sunt:
- E-mail (poșta electronică) – permite schimbul de mesaje electronice între persoane
care pot accesa acest serviciu, indiferent unde se află acesta.
- WWW (Word Wide Web) – pune la dispoziție un sistem în care documentele și
informațiile sunt legate între ele și pot fi ușor accesate prin rețeaua Internet.
- FTP-ul (File Transfer Protocol) – permite transferul fișierelor între calculatoare
conectate la INTERNET.
- Telnet – permite conectarea prin Internet de la distanță, de pe un calculator local pe un
alt calculator aflat în altă locație.
25
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
26
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
POȘTA ELECTRONICĂ
Este o variantă de a trimite o scrisoare unui destinatar, nu în formă fizică (scrisă pe hârtie,
pusă în plic cu timbru și dusă la poștă), ci în formă electronică, cu ajutorul unui dispozitiv
electronic, respectiv calculator (laptop sau desktop), tabletă sau telefon inteligent.
Scopul poștei electronice este de a trimite mesaje text (de tipul scrisorilor), dar în format
electronic, unui destinatar, într-o căsuță poștală virtuală, de unde destinatarul le ia și le citește dacă
și când dorește, exact cum ar proceda cu scrisorile tradiționale, primite prin poștă.
Avantajele poștei electronice:
- Prețul mult mai mic;
- Viteza mult mai mare;
- Comoditate.
Pentru a putea trimite și primi e-mailuri trebuie să avem un cont de e-mail. La creare
cantului ne sunt solicitate serie de informații personale.
O adresă de e-mail este formată din:
- Numele contului de poștă electronică (poate fi numele tău sau alt nume sugestiv);
- Caracterul special: @;
- Adresa calculatorului gazdă, a serverului pe care este creată căsuța de e-mail.
Exemplu: nume@yahoo.com, nume@gmail.com, nume@google.ro
REVENIRE
27
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Clasa a VI-a
Data: ___________
TEST – Internet
28
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
5. Într-o rețea de calculatoare de tip client/server, calculatoarele pot avea statut de: (1p)
a) Client și server
b) Server
c) Client sau server
d) Client
29
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
REVENIRE
30
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
31
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
1. Scrieți secvența de program care afișează numerele naturale nenule, mai mici decât un
număr dat n, care au ultima cifră 2. Exemplu: dacă n=26, se vor afișa: 2, 12, 22
2. Scrieți secvența de program care determină media aritmetică a numerelor care se divid la
3 din n numere citite de la tastatură. Exemplu: dacă se citesc numerele 5, 6, 11,3, 9, 20 se va afișa
(6+3+9)/3= 6
3. Scrieți secvența de program care determină suma cifrelor impare dintr-un număr natural
n citit de la tastatură. Exemplu: pentru n= 21746 se va afișa 8.
4. Fie secvența:
citeşte x,y;
z←1;
t←0;
cât timp x> = z execută
dacă x mod z = y
atunci
t←z;
sfarsit_daca;
z←z + 1;
sfarsit_cat_timp;
scrie t;
REVENIRE
32
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
REVENIRE
33
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Știm că vectorii sunt o colecție de valori de același tip (întreg, caracter, sau alte tipuri),
valori ce pot fi accesate după un indice, sau poziție, care se mai cheamă și indicele în vector al
acelei valori.
EXEMPLU:
Acest vector are numele v și are n elemente, numere întregi. Indicii elementelor sunt 0, 1,
2, ... , n-1.
DEFINIȚIE:
Vectorul de frecvență reține numărul de apariţii al fiecărei valori citite într-un vector.
Folosirea vectorului de frecvențe permite scrierea unor algoritmi eficienți în cazul în care datele de
intrare au valori dintr-un domeniu cunoscut care poate fi prelucrat rapid. Folosirea unui vector de
frecvență sau marcare este eficientă numai în cazul în care valorile care interesează sunt întregi și
numărul valorilor distincte posibile este cel mult 1.000.000.
În orice mulţime elementele sunt unice, iar vectorul frecvențelor are doar valori 0 sau 1.
Acest vector este numit vectorul caracteristic al unei mulțimi.
Vectorul de frecvențe poate fi folosit pentru a obține rapid mulţimea asociată ca un vector
caracteristic astfel:
- 0 înseamnă că elementul nu aparține mulţimii;
- o valoare diferită de 0 înseamnă că elementul aparține mulţimii.
34
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Vectorul de frecvență pentru cifrele unui număr se declară sub forma unui vector cu 10
componente, de la v[0], … , v[9]. Acestea vor fi inițializate cu 0, iar după citirea numărului n se va
incrementa cu 1 numărul aparițiilor pentru fiecare cifră a lui n.
Atenție! Vectorul de frecvențe nu permite refacerea numărului citit inițial, dacă este
necesară valoarea acestuia trebuie memorată separat.
#include<fstream> using namespace std;
ifstream f("cifdist.in");
ofstream g("cifdist.out");
int v[10],n,c;
int main()
{ f>>n;
while(n>0) //construim vectorul frecvențelor
{ c=n%10;
v[c]++;
n=n/10;
}
//afișăm cifrele distincte și numărul de apariții
for(c=0;c<10;c++)
if (v[c]>0) g<<c<<' '<<v[c]<<endl;
return 0;
}
35
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
ÎNCERCAȚI SINGURI:
Pentru problema rezolvată anterior, să se afișeze acele numere care apar o singură dată,
precum și frecvența lor.
3. Să se scrie un program care citeşte cel mult 1000000 de numere naturale din intervalul
închis [0,9] şi determină cel mai mare număr prim citit şi numărul său de apariţii.
#include <iostream>
using namespace std;
int v[10];
int main()
{ int n;
while( cin>>n)
v[n]++;
if (v[7]!=0)
{ cout<<7<<" "<<v[7]; }
else if (v[5] != 0) { cout<<5<<" "<<v[5]; }
36
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
TEMĂ:
a. Să se scrie un program care citeşte din fișierul „date.in” cel mult 1000000 de numere
naturale din intervalul închis [0,1000] şi determină cel mai mare număr par de trei cifre citit şi
numărul său de apariţii.
b. Să se scrie un program care citeşte din fișierul „date.in” cel mult 1000000 de numere
naturale din intervalul închis [0,100] şi determină cel mai mic număr impar de două cifre citit şi
numărul său de apariţii.
c. Se dă un șir cu cel puțin 3 și cel mult 1.000.000 de numere naturale din intervalul (0,
1.000.000.000). Se cere să se afișeze pe ecran, separate printr-un spațiu, două numere distincte,
anume cel mai mare număr impar cu două cifre și cel mai mic număr par cu două cifre care NU fac
parte din șir. Dacă nu există două astfel de valori se va afișa pe ecran mesajul nu există.
http://www.pbinfo.ro/ problemele:mincifre,numere8,numere1
REVENIRE
37
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
38
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
39
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
40
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Lc=0 lic=lfc=0 i=1 Lc=1 lic=lfc=1 //2 este par şi crește lc iar lic şi lfc iau valoarea lui i i=2
lc=2 lfc=2 //4 este par şi crește lc iar lfc=2
i=3 maxim=2, limax=1, lfmax=2 //3 nu este par ceea ce înseamnă că s-a terminat secvența
curentă, se modifică maxim precum şi limitele limax şi lfmax
Lc=lic=lfc=0 //lc, lic si lfc devin 0 pentru că începe o nouă secvență i=4 //5 nu este par i=5
lc=1 lic=lfc=5 //6 este par şi crește lc iar lic şi lfc iau valoarea lui i adică 5 i=6 lc=2 lif=6 //8 este
par şi crește lc iar lfc devine 6
i=7 lc=3 lif=7 //10 este par şi crește lc iar lfc devine 7
i=8 maxim=3, limax=5, lfmax=7 // 1 nu este par ceea ce înseamnă că s-a terminat secvența
curentă, se modifică maxim precum şi limitele limax şi lfmax
Lc=lic=lfc=0 //lc, lic si lfc devin 0 pentru ca începe o nouă secvență i=9 // 3 nu este par
i=10 lc=1 lic=lfc=10 //2 este par şi crește lc iar lic şi lfc iau valoarea lui i adică 10 i=11 lc=2 lfc=11
//4 este par şi crește lc iar lfc devine 11 i=12 lc=3 lfc=12 //6 este par şi crește lc iar lfc devine 12
i=13 lc=4 lfc=13 //8 este par şi crește lc iar lfc devine 13
S-a terminat secvența curentă. Comparăm lc cu maxim şi se modifică maxim şi limitele
limax şi lfmax.
Maxim=4 limax=10 lfmax=13
Lungimea maximă este 4 iar secvența începe la poziția 4 şi se termină la poziția 10.
REVENIRE
41
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
I. Soluția banală este aceea în care sunt parcurse toate elementele din secvență şi sunt
adăugate la sumă.
CITESTE n
PENTRU i=1, n EXECUTA
CITESTE a[i]
SFARSIT PENTRU
CITESTE li, lf //indicii de început şi sfârşit pentru secvență a cărei sumă se //calculează
S←0
PENTRU i=li, lf EXECUTA
S←S+a[i]
SFARSIT PENTRU
SCRIE S
Pentru o singură secvență timpul de execuție este acceptabil dar dacă se doreşte
calcularea sumelor pentru un număr mare de secvențe timpul de execuție poate deveni
inacceptabil de mare.
În astfel de situații putem folosi o a doua soluție care utilizează sumele parțiale.
II.
Fie un vector a cu n elemente. Pozițiile elementelor sunt numerotate de la 1 la n.
42
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Pentru a determina rapid această sumă, vom construi un alt vector S pe care îl vom
numi vectorul sumelor parțiale. Fiecare element S[i] din acest vector va fi egal cu suma
elementelor vectorului cuprinse între pozițiile 1 şi i (inclusiv aceste poziții).
S[i]=a[1]+a[2]+...+a[i].
Acest vector se poate construi la citirea vectorul a folosind următoarea relație:
S[1]=a[1]
S[2]=a[1]+a[2]=S[1]+a[2]
S[3]=a[1]+a[2]+a[3]=(a[1]+a[2])+a[3]=S[2]+a[3]
………………………………………………………….
Practic, fiecare element S[i] (suma elementelor cuprinse între pozițiile 1 şi i) din
vectorul sumelor parțiale se obține adunând la anteriorul element din acest vector (S[i-1]=suma
elementelor cuprinse între pozițiile 1 şi i-1) elementul a[i].
43
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
CITESTE n
S[0]←0
PENTRU i=1, n EXECUTA
CITESTE a[i]
S[i]←S[i-1]+a[i]
SFARSIT PENTRU
CITESTE li, lf
Suma←S[lf]-S[li-1]
SCRIE Suma
Observație:
Este posibil ca sumele parțiale ale elementelor din vectorul a să depășească limita maximă
a tipului de date folosit pentru elementele din vector (de exemplu int). În acest caz, vectorul
sumelor parțiale S trebuie declarat cu elemente de un tip care permite valori mai mari (de exemplu
long long int).
REVENIRE
44
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Problema 1: Se dau două numere naturale cu cel mult 9 cifre fiecare. Se cere să se
afişeze cifrele comune celor două numere, ordonate crescător.
Exemplu: x=12432576
y=876523096
Cifrele comune sunt: 2 3 5 6 7
45
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Vectorii vor fi construiţi după citirea celor două numere. În final, parcurgem cifrele de la 0
la 9 şi dacă pe poziţia corespunzătoare cifrei respective şi în vectorul a şi în vectorul b se află
valoarea 1 atunci afişăm cifra.
Observații:
vectorul caracteristic (de apariţii) are dimensiune constantă – egală cu numărul de valori pe
care le caracterizează
46
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
48
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
49
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
CITESTE n
PENTRU i=1, n EXECUTA
ciur[i] 0 //0 înseamnă element netăiat
SFARSIT PENTRU
ciur[0]1
ciur[1]1 //tai 0 si 1
PENTRU i=2, n EXECUTA
DACA ciur[i]=0 ATUNCI //dacă i este netăiat
//tai multiplii lui i (multiplii au forma i*j)
j2 //multiplii lui i pleaca de la 2*i (j pleaca de la 2)
CAT TIMP i*j<=n EXECUTA
ciur[i*j]1 //tai multiplul i*j
jj+1
SFARSIT CAT TIMP
SFARSIT DACA
SFARSIT PENTRU
PENTRU i=1, n EXECUTA
DACA a[i]=0 ATUNCI //a[i]=0 inseamnă că i este prim
SCRIE i
SFARSIT DACA
SFRASIT PENTRU
REVENIRE
50
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Spunem că o noțiune este recursivă, dacă în definirea ei apare însăși noțiunea care se
definește.
În informatică, un subprogram se numește recursiv dacă se autoapelează, fie direct (în
definiția lui, se face apel la el însuși), fie indirect (subprogramul X apelează subprogramul Y, care
apelează subprogramul X). Din afara subprogramului se face un prim apel al acestuia, după care
acesta se autoapelează de un anumit număr de ori, creându-se un lanț de autoapeluri recursive.
Deoarece un subprogram recursiv se autoapelează, în interiorul acestuia trebuie să existe o
condiție de oprire a lanțului de autoapeluri, fără această condiție, subprogramul s-ar autoapela la
infinit.
Pentru a implementa un subprogram recursiv, trebuie să:
• Identificăm relația de recurență
• Identificăm condițiile de oprire ale autoapelului
Unul dintre cele mai simple exemple de subprograme recursive este factorialul.
n!=n*(n-1)*(n-2)*...*3*2*1=n*(n-1)!
51
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Exemplu 1. Scrieți o funcție recursivă care calculează suma cifrelor unui număr natural,
transmis ca parametru.
Identificarea relației de recurență. Notăm cu s(n) – suma cifrelor numărului natural n.
( )=
52
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
TEMĂ
1. Scrieți o funcție recursivă care verifică dacă un număr natural este prim sau nu.
2. Se citește un vector a cu n elemente numere naturale. Să se calculeze elementul maxim
din vector. Se va folosi o funcție recursivă pentru citire și una recursivă pentru determinarea
elementului maxim.
3. Să se determine cifra maximă a unui număr natural folosind o funcție recursivă.
4. Descompuneți un număr natural n ca sumă de termeni din șirul lui Fibonacci. Scrieți
funcții recursive pentru toate prelucrările necesare.
5. Se citește un număr natural n. Să se descompună numărul n in toate modurile ca sumă
de două numere a și b care au proprietatea că b este răsturnatul lui a. Se vor scrie și folosi două
funcții recursive pentru:
- Calculul răsturnatului
- Descompunerea cerută
6. Se citește un număr natural n. Să se descompună ca sumă de puteri crescătoare ale lui 2.
Se vor folosi doar prelucrări / calcule realizate cu ajutorul funcțiilor implementate recursiv.
7. Scrieți un subprogram recursiv care descompune un număr în factori primi.
8. Se dă un număr natural n. Să se determine dacă n este palindrom (egal cu răsturnatul
său), utilizând recursivitatea.
9. Scrieți un program care transformă un număr natural n din baza 10 în baza b (1<b<10).
Se va folosi un subprogram recursiv care calculează și returnează numărul în baza b.
10. Se citește de la tastatură, caracter cu caracter, un șir de caractere. Citirea se încheie la
întâlnirea caracterului $. Folosind un algoritm recursiv, să se afișeze în ordine inversă citirii, cifrele
care apar în șir.
REVENIRE
54
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
OBSERVAȚIE:
Toate subiectele sunt obligatorii. Primele 6 subiecte au câte un punct fiecare, iar problema
7 are 3 puncte. Se acordă un punct din oficiu. Timp de rezolvare: 50 de minute.
REVENIRE
56
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Metoda DIVIDE ET IMPERA aplicată pentru probleme care prelucrează vectori (cu n
elemente), presupune împărțirea succesivă a vectorului în 2 subvectori de lungime egală (inițial se
obțin subvectori de lungime n/2), până se obține un vector cu un singur element.
Vectorul inițial: x=(x1, x2, ..., xk, xk+1, ..., xn), unde k=(n+1)/2
La prima împărțire a vectorului se obțin subvectorii: (x1, x2, ..., xk) și (xk+1, ..., xn)
Rezolvarea unei probleme cu metoda DIVIDE ET IMPERA presupune:
rezolvarea celor 2 subprobleme (în cazul nostru: prelucrarea celor 2 subvectori)
combinarea celor 2 soluții pentru a obține soluția problemei inițiale (soluția finală
a problemei).
Putem considera că, la un moment dat (un anumit pas), se lucrează cu vectorul:
(xli, xli+1, ..., xls), unde:
li= limita inferioară a indicilor subvectorului curent;
ls= limita superioară a indicilor subvectorului curent;
k=(li+ls)/2.
Se continuă împărțirea în subprobleme (subvectori) până când se ajunge la cea mai
simplă problemă (vector cu un singur element, adică li=ls).
Pentru rezolvarea celor 2 subprobleme (în cazul nostru, prelucrarea celor 2 subvectori) și
combinarea celor 2 soluții, se folosește RECURSIVITATEA.
Cazul particular care se rezolvă în mod direct (fără autoapel) este: li=ls (s-a ajuns la un
subvector cu un singur element).
Cazul general, adică în cazul în care li!=ls, se parcurg pașii:
se rezolvă subproblema S1 - pentru prima jumătate a vectorului (autoapel cu
parametrii li și k);
57
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
PROBLEME REZOLVATE
Considerăm că datele de intrare sunt vectorul x și n (numărul de elemente), declarate ca
variabile globale (la începutul programului), la care se adaugă datele specifice problemei.
Pentru citirea datelor de intrare se folosește funcția citire de tip void, fără parametri:
void citire()
{
int i;
cout<<”n=”; cin>>n;
cout<<”elemente vector:”;
for(i=1;i<=n;i++)
cin>>x[i];
... //citire alte variabile necesare;
}
PROBLEMA 1
Se consideră un vector cu n (n ≤ 25) elemente numere reale citite de la tastatură. Să se
verifice dacă toate elementele vectorului sunt în ordine strict descrescătoare.
Rezolvare:
Se consideră vectorul x cu n (n ≤ 25) elemente numere reale citit de la tastatură.
Spunem că elementele vectorului x sunt în ordine strict descrescătoare dacă toți subvectorii
au elementele în ordine strict descrescătoare, adică: x1>x2>x3> ... >xn
Conform Divide et Impera: spunem că elementele vectorului sunt în ordine strict
descrescătoare dacă cei 2 subvectori au elementele în ordine strict descrescătoare, adică:
xli>xli+1>xli+2>...>xk și xk+1>xk+2>...>xls. Vom folosi funcția descresc cu 2 parametri: li (limita
inferioară a indicilor) și ls (limita superioară a indicilor).
Cazul particular care se rezolvă în mod direct: pentru li=ls spunem că elementele
vectorului sunt în ordine strict descrescătoare (un singur element este ordonat cum vrem noi).
58
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
PROBLEMA 2
Se consideră un vector n (n ≤ 20) elemente numere reale și o valoare y (număr real) citite
de la tastatură. Să se verifice dacă y aparține vectorului.
Rezolvare:
Se consideră vectorul x cu n (n ≤ 20) elemente numere reale și o valoare y (număr real)
citite de la tastatură.
59
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
PROBLEMA 3
Se consideră un vector cu n (n ≤ 25) elemente numere naturale citit de la tastatură. Să se
calculeze suma elementelor impare de 3 cifre.
Rezolvare:
Se consideră vectorul x cu n (n ≤ 25) elemente numere naturale citite de la tastatură.
Suma elementelor impare de 3 cifre din vector se referă la acele elemente care
îndeplinesc condițiile: au 3 cifre (între 100 și 999) și sunt impare (restul împărțirii la 2 este 1).
Conform Divide et Impera: suma elementelor impare de 3 cifre din vectorul curent este
S1+S2, unde:
Vectorul curent este: (xli, xli+1, ..., xls)
Primul subvector este: (xli,xli+1,xli+2,...,xk)
Al doilea subvector este: (xk+1,xk+2,...,xls)
S1= suma elementelor impare de 3 cifre din primul subvector
S2= suma elementelor impare de 3 cifre din al doilea subvector
Pentru rezolvarea cerinței se folosește funcția suma cu 2 parametri: li (limita inferioară a
indicilor) și ls (limita superioară a indicilor).
Cazul particular care se rezolvă în mod direct: pentru li=ls suma este x[li] dacă
x[li]>=100 && x[li]<=999 && x[li]%2==1.În caz contrar, suma este 0.
În funcția Main se face apelul funcției astfel: suma(1,n)
Programul C++ corespunzător:
int S, n, x[25];
void citire()
{
int i; cout<<”n=”; cin>>n;
cout<<”elemente vector:”;
for(i=1;i<=n;i++)
cin>>x[i];
}
61
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
PROBLEMA 4
Se consideră un vector cu n (n ≤ 20) elemente numere naturale și 2 numere naturale a și b
citite de la tastatură. Să se determine câte numere din șir aparțin intervalului [a, b].
Rezolvare:
Se consideră vectorul x cu n (n ≤ 20) elemente numere naturale și valorile naturale a și b
citite de la tastatură.
Numărul elementelor din vector care aparțin intervalului [a, b] se referă la acele elemente
care îndeplinesc condiția: sunt numere între a și b.
Conform Divide et Impera: numărul elementelor care aparțin intervalului [a, b] din
vectorul curent este Nr1+Nr2, unde:
Vectorul curent este: (xli, xli+1, ..., xls)
Primul subvector este: (xli,xli+1,xli+2,...,xk)
Al doilea subvector este: (xk+1,xk+2,...,xls)
nr1= numărul elementelor care aparțin intervalului [a, b] din primul subvector
nr2= numărul elementelor care aparțin intervalului [a, b] din al doilea subvector
Pentru rezolvarea cerinței se folosește funcția nr_ab cu 2 parametri: li (limita inferioară a
indicilor) și ls (limita superioară a indicilor).
62
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
63
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
PROBLEMA 6
Se consideră un vector cu n (n ≤ 20) elemente numere naturale și 2 numere naturale a și b
citite de la tastatură. Să se numere câte elemente ale vectorului au proprietatea că împărțite la a, dau
restul b.
Rezolvare:
Se consideră vectorul x cu n (n ≤ 20) elemente numere naturale și valorile naturale a și b
citite de la tastatură.
Numărul elementelor din vector cu proprietatea că împărțite la a, dau restul b.
Conform Divide et Impera: numărul elementelor cu proprietatea că împărțite la a, dau
restul b din vectorul curent este Nr1+Nr2, unde:
Vectorul curent este: (xli, xli+1, ..., xls)
Primul subvector este: (xli,xli+1,xli+2,...,xk)
Al doilea subvector este: (xk+1,xk+2,...,xls)
Nr1= numărul elementelor care împărțite la a, dau restul b din primul subvector
Nr2= numărul elementelor care împărțite la a, dau restul b din al doilea subvector
Pentru rezolvarea cerinței se folosește funcția nr_ab cu 2 parametri: li (limita inferioară a
indicilor) și ls (limita superioară a indicilor).
Cazul particular care se rezolvă în mod direct: pentru li=ls numărul elementelor este 1 dacă
x[li]%a==b. În caz contrar, numărul este 0.
65
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
REVENIRE
66
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Metoda Greedy (greedy = lacom), denumită și metoda optimului local, reprezintă o metodă
de programare utilizată în probleme de optimizare şi care furnizează o singură soluție (optimul
global) care este obținută prin alegeri succesive ale optimului local.
Algoritmii de tip greedy, asemenea algoritmilor backtracking și de programare dinamică se
utilizează pentru rezolvarea unor probleme a căror soluție se poate exprima sub forma unui vector
de numere întregi. În comparație cu metoda backtracking, metoda Greedy nu va determina toate
soluțiile problemei. Metoda va găsi doar o singură soluție și, în general soluția găsită este soluția
optimă.
Metoda se aplică problemelor în care se dă o mulţime A cu n elemente şi trebuie
determinată o submulțime a sa, S cu m elemente, care îndeplinesc anumite condiții. Algoritmul va
determina la fiecare pas k o componentă x[k] a vectorului soluție și spre deosebire de algoritmul
backtracking, nu mai revine ulterior la această alegere. Pentru ca elementele care se selectează să
aparțină soluției optime, la pasul k se va alege candidatul care este optim pentru elementul x[k] al
soluției deci un optim local.
Pașii metodei greedy sunt:
2. la fiecare pas se alege un anumit element x∈A, candidatul optim la momentul respectiv,
care poate conduce la o soluție optimă;
3. se verifică dacă elementul ales poate fi adăugat la mulţimea soluțiilor:
- dacă se poate adăuga, atunci va fi adăugat şi mulţimea soluțiilor devine S=S ∪ {x}- un
element introdus în mulţimea S nu va mai putea fi eliminat;
- dacă nu se poate adăuga, el nu se mai testează ulterior.
67
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Sol = Ø;
Repetă
Alege x ϵ A;
Dacă este posibil atunci Sol Sol + x;
Până când am obținut soluția
Afișează Sol;
1. SUMĂ MAXIMĂ
Se dă o mulţime A={a1, a2, . . ., an} cu elemente reale. Să se determine o submulțime a lui
S astfel încât suma elementelor submulțimii să fie maximă.
Rezolvare: Se vor căuta între elementele vectorului A doar elementele mai mari sau egale
cu 0. Se va utiliza un subprogram greedy ( ) pentru implementarea algoritmului.
#include <iostream>
using namespace std;
int n,i,m;
float A[100], S[100];
void greedy( )
{ for(i = 1; i <= n; i ++ )
if ( A[ i ] >= 0 )
{ m ++ ;
S[ m ] = A[ i ]; } }
int main()
{ cout << " Numarul de elemente n = " ; cin >> n ;
cout << endl <<" Elementele vectorului " << endl ;
for ( i = 1 ; i <= n ; i++ )
{ cout <<"A[" <<i<<"] = "; cin >> A[ i ] ;}
greedy();
cout << " Submultimea este formata din: " ;
68
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
2. Se dă o mulţime A={a1, a2, . . ., an} cu elemente întregi. Să se determine cele mai mari
două elemente ale mulţimii.
#include <iostream>
#include<fstream>
using namespace std;
ifstream f("date.in");
int n,i,a,maxi1,maxi2,aux;
int main()
{ f>>n;
for(i=1;i<=n;i++)
{
f>>a;
if(a>maxi1)maxi
1=a;
if(maxi2<maxi1){aux=maxi1; maxi1=maxi2; maxi2=aux;}
}
cout<<maxi1<<" "<<maxi2;
}
int main()
{
int n;
spectacol a[100];
citire(n,a);
ordonare(n,a);
greedy(n,a);
fin.close();
fout.close();
}
• se determină pentru fiecare obiect eficiența de transport (raportul dintre câștig și greutate)
71
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Exemplu:
g=3 n=3 adică greutatea ce poate fi transportată este 3 și avem la dispoziție 3 obiecte.
obiectele (greutate, câștig):
22
14
36
Soluția obținută (greutate, câștig, raport tăiere):
1,4,1
3,6,0.6667 (al doilea obiect se încarcă în raport de 2/3)
Câștig maxim obținut = 8
#include<fstream>
#include<iomanip> using
namespace std; ifstream
fin("date.in"); ofstream
fout("date.out"); struct obiect
{float g,c,r;//greutate, castig, raportul cat se ia din obiect};
void citire(float &g, int &n, obiect a[])
{
fin>>g>>n;
for(int i=1;i<=n;i++)
{
fin>>a[i].g>>a[i].c;
a[i].r=0;//initial nu se foloseste obiectul
}
}
72
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
73
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
5. PROBLEMA COMIS-VOIAJORULUI
Un comis - voiajor pleacă dintr-un oraș, trebuie să viziteze un număr de orașe și să se
întoarcă în orașul inițial cu un efort minim. Orice oraș i este legat de un alt oraș j printr-un drum de
A[ i ][ j ] kilometri. Să se determine traseul pe care trebuie să-l parcurgă comis-voiajorul care să
aibă un număr minim de kilometri.
Rezolvare:
Se va alege un oraș de pornire. La fiecare pas se va selecta un alt oraș din cele neselectate
până acum și aflat la distanță minimă față de orașul de pornire.
Algoritmul se încheie atunci când s-au selectat toate orașele.
74
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
75
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
6. Fiind dată o hartă cu n țări, se cere o soluție de colorare a hărții, utilizând cel mult patru
culori, astfel încât două țări ce au frontiera comună să fie colorate diferit.
Exemplu:
Rezolvare:
#include <fstream>
using namespace std;
ifstream fin("date.in");
ofstream fout("date.out");
76
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
77
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
78
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
79
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
REVENIRE
80
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
De obicei, metoda Backtracking se aplică problemelor în care soluția se poate prezenta sub
forma unui vector x = (x1, x2, … ,xn), unde x1 ϵ S1, x2 ϵ S2, ..., xn ϵ Sn. Mulțimile S1, S2, ... , Sn sunt
finite, elementele lor fiind într-o relație de ordine bine stabilită (de obicei reprezentând termenii unei
progresii aritmetice) și se numesc mulțimi de valori posibile. La modul general, spunem că xi ϵSi,
pentru i ϵ{1, … , n}, sau că x=(x1, x2, … ,xn) ϵ S1 x S2 x ... x Sn (spațiul soluțiilor posibile).
Această metodă evită generarea tuturor soluțiilor posibile și apoi alegerea acelor soluții
care convin (soluții rezultat), căutând obținerea soluției prin alegerea succesivă de valori din
mulțimile S1, S2, S3,…,Sn pentru componentele vectorului x = (x1, x2, … ,xn) care să satisfacă
anumite condiții specifice problemei, numite condiții interne.
81
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
PRINCIPIU
Backtracking s-ar putea traduce prin: „drum înapoi”, „cale întoarsă” sau „revenire”, ceea
ce sugerează faptul că orice vector soluție x = (x1, x2, … ,xn) este construit progresiv, începând cu
prima componentă (x1) și mergând spre ultima (xn), cu eventuale reveniri asupra valorilor atribuite
anterior pentru componenta curentă (xk), revenire care presupune unul sau mai mulți pași înapoi.
La pasul k - Pentru elementul xk se alege o valoare din mulțimea Sk (de obicei, se consideră
prima valoare din mulțime dacă nu se cere altă valoare la inițializarea elementului xk).
Înainte de a trece la pasul k+1:
▷ se verifică dacă sunt satisfăcute condițiile de continuare. În cazul în care condițiile de
continuare nu sunt satisfăcute, se va alege o altă valoare din mulțimea Sk, până când fie se va
găsi o valoare care să satisfacă condițiile de continuare, fie se epuizează toate valorile
mulțimii Sk.
▷ În cazul în care se găsește o valoare convenabilă pentru xk avem două cazuri:
s-a ajuns la soluție, caz în care se afișează soluția și se reia căutarea unei noi valori
convenabile pentru xk , adică se reia pasul k;
nu s-a ajuns la soluție, caz în care se trece la găsirea unei valori pentru elementul x k+1
din vectorul soluție. Altfel spus, se reia algoritmul pentru k+1
▷ În cazul în care nu s-a găsit o valoare convenabilă pentru xk (o valoare din Sk care să
îndeplinească condițiile de continuare), se va reveni la pasul anterior (k-1), se va renunța la
valoarea aleasă pentru xk-1 și se va căuta o altă valoare convenabilă în mulțimea Sk-1. Altfel
spus, se reia algoritmul pentru k-1.
REZOLVAREA PROBLEMELOR
Ca orice algoritm în care sunt prezente instrucțiuni repetitive, algoritmul Backtracking
poate fi implementat într-o manieră recursivă sau nerecursivă (iterativă).
Pentru descrierea algoritmului se vor folosi instrucțiuni ale limbajului C/ C++, acesta fiind
cel mai popular limbaj de programare la ora actuală, atât la nivelul claselor de liceu, specializarea
matematică-informatică, cât și la nivel universitar.
82
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
83
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
84
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Să se găsească toate modurile în care pot fi așezate pe o tablă de șah 8 regine astfel încât
să nu se „atace” (să se afle pe rânduri și coloane diferite și să nu fie pe aceeași diagonală).
OBSERVAȚIE:
Este evident faptul că problema poate fi generalizată pentru n regine care vor fi așezate pe
o tablă de șah de dimensiuni nxn (n rânduri și n coloane).
REZOLVARE:
În abordarea backtracking, candidatele parțiale sunt aranjamente de câte 8 regine pe cele 8
rânduri ale tablei de șah, câte o regină pe fiecare rând, valorile primite de soluție reprezentând
coloanele pe care se găsesc reginele.
Orice soluție parțială ce conține două regine care se atacă poate fi abandonată, deoarece în
mod clar restul de regine nu pot fi așezate într-o soluție validă.
Vectorul soluție:
x = (x1, x2, … ,x8) (xi reprezintă numărul coloanei pe care se află regina de pe rândul i)
Condițiile interne:
Reginele să nu se „atace” (să se afle pe rânduri și coloane diferite și să nu fie pe aceeași
diagonală), ceea ce poate fi exprimat astfel:
Funcțiile necesare pentru rezolvarea acestei probleme, care corespund algoritmului descris
mai sus sunt:
Funcția citire – nu avem date de intrare (n=8), deci nu folosim această funcție;
Pentru cazul general: n regine (n este variabilă globală) se poate folosi funcția:
void citire()
{
cout<<"nr. regine="; cin>>n;
}
Funcția init
void init(int k)
{
x[k]=0;
}
Funcția succesor
int succesor(int k)
{
if(x[k]<8)
{
x[k]=x[k]+1;
return 1;
}
else
return 0;
}
Funcția cont – folosește variabila globală ok și variabila locală i
86
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Funcția afisare - folosește variabila globală x (vector cu 8 elemente sau, pentru cazul
general, un număr corespunzător de elemente) și variabila locală i
void afisare()
{
int i;
for(i=1;i<k+1;i++)
cout<<x[i]<<" ";
cout<<endl;
}
Pentru implementarea algoritmului Backtracking am folosit Code::Blocks 13.12
Pentru calculul modulului (valoarea absolută), am folosit funcția abs din fișierul header
(biblioteca) cmath.
Punând cap la cap funcțiile de mai sus, se obține programul C++ (varianta iterativă), ce
poate fi rulat cu Code::Blocks 13.12:
#include <iostream>
#include <cmath>
using namespace std;
87
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
void init(int k)
{
x[k]=0;
}
int succesor(int k)
{
if(x[k]<8)
{
x[k]=x[k]+1;
return 1;
}
else
return 0;
}
int sol(int k)
{
if(k==8)
return 1;
else
return 0;
}
void afisare()
{
int i;
for(i=1;i<k+1;i++)
cout<<x[i]<<" ";
88
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
În urma execuției programului, primele soluții afișate (din totalul de 92) sunt:
Prima soluție poate fi descrisă astfel:
...
89
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
REZOLVARE:
În abordarea backtracking, candidatele parțiale sunt aranjamente de câte 3 culori (valori
numerice), din cele 6 posibile (codificate cu 1, 2, ..., 6).
Orice soluție parțială ce conține două culori identice poate fi abandonată, deoarece în mod
clar a treia culoare nu poate fi așezată într-o soluție validă.
Vectorul soluție:
x = (x1, x2, x3) (xi reprezintă numărul asociat unei culori)
Mulțimea de valori posibile pentru componentele vectorului soluție:
Codificarea culorilor: alb - 1, galben - 2, roșu - 3, verde - 4, albastru - 5 și negru – 6.
S1=S2=S3=S={1, … , 6}, adică xi ϵ{1, … , 6}, pentru i ϵ{1, 2 ,3}
Condițiile interne:
- Condiția orice drapel are culoarea din mijloc galben sau verde, ceea ce poate fi
exprimat astfel:
X2=2 sau X2=4 și
- Condiția cele trei culori de pe drapel sunt distincte:
xi≠xj, i≠j, iϵ{1, 2, 3} și jϵ{1, 2, 3}
90
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
În cazul generalizării, se citesc cele n culori, precum și indicii din mulțimea de culori
corespunzători culorilor care apar în mijloc: g - pentru galben și v - pentru verde.
void citire()
{
int i;
cout<<"nr. culori="; cin>>n;
cout<<"culorile sunt:";
for(i=1; i<n+1; i++)
{
cin.get(a[i],10,' ');
cin.get();
}
cout<<"indicele pentru galben"; cin>>g;
cout<<"indicele pentru verde"; cin>>v;
}
Funcția init
void init(int k)
{
x[k]=0;
}
91
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
int succesor(int k)
{
if(x[k]<6)
{
x[k]=x[k]+1;
return 1;
}
else
return 0;
}
În cazul generalizării, se vor verifica culorile din mijlocul drapelelor, ținând cont că a[g]
este galben, iar a[v] este verde. Se obține funcția:
92
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
int sol(int k)
{
if(k==3)
return 1;
else
return 0;
}
void afisare()
{
int i;
for(i=1;i<4;i++)
cout<<x[i]<<” „;
cout<<endl;
}
În cazul generalizării (mulțime de n culori), se vor afișa culorile corespunzătoare
vectorului soluție, obținându-se funcția:
void afisare()
{
int i;
for(i=1;i<4;i++)
cout<<a[x[i]]<<” „;
cout<<endl;
}
#include <iostream>
using namespace std;
int ok, k, x[10];
void init(int k)
{
x[k]=0;
}
93
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
int sol(int k)
{
if(k==3)
return 1;
else
return 0;
}
void afisare()
{
int i;
for(i=1;i<4;i++)
cout<<x[i]<<" ";
cout<<endl;
}
94
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
95
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
void afisare()
{
int i;
for(i=1;i<4;i++)
cout<<a[x[i]]<<" ";
cout<<endl;
}
Se generează soluțiile:
96
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
3. GENERAREA SUBMULȚIMILOR
ENUNȚ:
Să se genereze toate submulțimile mulțimii A={1, 2, ... , n} (n – număr natural nenul mai
mic decât 20).
OBSERVAȚIE:
Condițiile interne:
Nu există condiții interne!
De aici, rezultă:
97
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Funcția citire
void citire()
{
cout<<"n="; cin>>n;
}
Pentru cazul general: mulțimea A={a1, a2, ..., an}, ceea ce necesită utilizarea unei variabile
globale a (vector) cu elemente de tip int pentru care se citesc valori în cadrul funcției:
void citire()
{
Int i;
cout<<"n="; cin>>n;
cout<<"Elementele multimii sunt:"
for(i=1;i<n;i++)
cin<<a[i];
}
Funcția init
void init(int k)
{
x[k]=-1;
}
Funcția succesor
int succesor(int k)
{
if(x[k]<1)
{
x[k]=x[k]+1;
return 1;
}
else
return 0;
}
98
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Funcția sol – returnează valoarea 1 sau 0, în funcție de valoarea lui k: se consideră că s-a
ajuns la soluție atunci când k=n.
int sol(int k)
{
if(k==n)
return 1;
else
return 0;
}
void afisare()
{
int i,nr=0;
for(i=1;i<n+1;i++)
if(x[i]==1)
{
cout<<i<<" ";
nr++;
}
if(nr==0)
cout<<"multime vida";
cout<<endl;
}
99
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
void afisare()
{
int i,nr=0;
for(i=1;i<n+1;i++)
if(x[i]==1)
{
cout<<a[i]<<" ";
nr++;
}
if(nr==0) cout<<"multime vida";
cout<<endl;
}
Punând cap la cap funcțiile de mai sus, se obține programul C++ (varianta iterativă):
#include <iostream>
using namespace std;
int ok, k, x[10], n, a[10];
void citire()
{
int i;
cout<<"n=";
cin>>n;
}
void init(int k)
{
x[k]=-1;
}
int succesor(int k)
{
if(x[k]<1)
{
x[k]=x[k]+1;
return 1;
}
else
return 0;
}
100
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
void back(int k)
{
while(k>0)
{
ok=0;
while(ok==0 && succesor(k)==1)
cont(k,ok);
if(ok==0)
k--;
else
if(sol(k)==1)
afisare();
else
{
101
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
int main()
{
citire();
init(1);
back(1);
cout<<endl;
return 0;
}
Acestea corespund submulțimilor mulțimii: A={1, 2, 3}, care pot fi enunțate astfel:
Ø
{3}
{2}
{2, 3}
{1}
{1, 3}
{1, 2}
{1, 2, 3}
REVENIRE
102
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Arborele este un graf neorientat conex, fără cicluri, în care unul din noduri este desemnat
ca rădăcină. Nodurile sunt așezate pe niveluri, astfel încât, pe nivelul 1 să fie plasată rădăcina.
Rădăcina unui arbore este un nod special care ajută la delimitarea arborelui pe nivele.
Nodul rădăcină se află pe cel mai înalt nivel din arbore.
Exemplu de arbore:
E1 E7
E2 E3 E8
E9
E4 E5 E6
104
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Exemplu:
Pentru arborele atașat mai sus, parcurgerea în adâncime este:
D, E1, E2, E4, E5, E3, E6, E7, E8, E9
Înălţimea arborelui este înălţimea rădăcinii, adică numărul de arce de pe cea mai lungă
cale de la rădăcină la o frunză
REVENIRE
106
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
#include <iostream>
#include<fstream>
using namespace std;
int n, i,j, t[50], a[50][50];
ifstream f("arbore.in");
int main()
{f>>n;
for(i=1;i<=n;i++)
{
f>>t[i]; // dacă t[i] e tata lui i, atunci există muchie de la t[i] la i
a[i][t[i]]=1;
a[t[i]][i]=1;
}
for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
cout<<a[i][j]<<" ";
cout<<endl;}
return 0;
}
108
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
109
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
REVENIRE
110
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
2 3
4 5
2 3
4 5
3+3+2+2=10
Dacă alegem muchia [1,4] și renunțăm la muchia [1,2] din arbore, obținem un alt arbore,
dar cu același cost minim 10, și anume:
2 3
4 5
3+2+3+2=10
ATENȚIE!
Un graf conex poate să conțină unul sau mai mulți arbori parțiali diferiți, dar de același
cost minim.
Pentru determinarea arborelui parțial de cost minim există doi algoritmi:
algoritmul lui Kruskal
algoritmul lui Prim.
ALGORITMUL LUI KRUSKAL
Fie G=(X,U) - graful neorientat și conex cu n noduri dat prin vectorul muchiilor.
Se pleacă de la faptul că, la început, există n arbori disjuncți H1 , H2 ,..., Hn , formați fiecare
din câte un nod al grafului.
La fiecare pas alegem muchia de cost minim neselectată anterior, care are extremitățile în
doi arbori distincți, unificându-se, astfel, doi din arborii existenţi. Extremitățile muchiei alese
trebuie să fie în arbori diferiți pentru a nu determina apariția unui ciclu în graful parțial de cost
minim care se construiește.
La pasul K vom avea n-k arbori disjuncți. Prin unificarea a doi arbori cu muchia de cost
minim, se vor obține n-k-1 arbori disjuncți. Prin urmare, după n-1 pași (după alegerea a n-1 muchii)
vom obține un singur arbore.
112
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
2 3
4 5
Plecăm de la un arbore format doar din nodul 1. Adăugăm, apoi, în arbore, pe rând, n-1
muchii. La fiecare pas se adaugă în arbore muchia de cost minim, care are o extremitate în arbore,
iar cealaltă în afara acestuia (pentru a nu obține ciclu)
Exemplu :
Fie următorul graf, având costurile muchiilor aferente:
2 3
4 5
113
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
REVENIRE
114
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
2 3
4 7 8
5 6 9
10
a) Scrieți ordinea corectă a nodurilor pentru cele 3 tipuri de parcurgere:
preordine (RSD)
inordine (SRD)
postordine (SDR)
b) Scrieți reprezentarea stâng - drept pentru arborele de mai sus:
st=(...)
dr=(...)
c) Scrieți reprezentarea tată-descendenți, pentru arborele de mai sus:
T=(...)
D=(...)
2) Fiind dat următorul vector de tați T=(3, 3, 0, 3, 2, 2, 5, 5, 4, 6)
a) Realizați arborele corespunzător acestui vector
b) Precizați rădăcina arborelui
c) Precizați nodurile frunză ale arborelui
d) Alegeți un nod pentru care precizați:
nodul tată (ascendent direct)
115
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
8
6
7 1
REVENIRE
116
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Pentru fiecare din cei 10 vectori de TAȚI, realizați arborele corespunzător, parcurgerea în
lățime și, respectiv, în adâncime:
Ex.1
t[i] 0 1 1 2 2 2 3 3 5 5 6 7
Ex.2
t[i] 0 1 1 1 2 3 3 7 7 4 10 10
Ex.3
t[i] 0 1 2 2 4 1 6 6 8 8
Ex.4
t[i] 3 1 0 3 4 4 4 6 6
Ex.5
t[i] 4 4 2 0 4 4 2 6 6 6 7 8 9
Ex.6
t[i] 2 7 7 3 8 2 0 3 2 8 8
Ex.7
t[i] 3 3 10 7 10 3 10 7 2 0 7 8 2 8
Ex.8
t[i] 2 3 0 5 3 2 5 3 3 5 9
Ex.9
t[i] 2 8 8 2 3 10 11 0 3 3 10 10
Ex.10
t[i] 6 8 6 6 0 5 1 5 4 2 1 4 2 1
REVENIRE
117
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Testul a fost elaborat pentru capitolul Arbori binari, cu următorul conținut teoretic:
- definiția arborelui binar;
- reprezentarea pe nivele a arborelui binar: pe nivelul 1 se găsește nodul rădăcină, pe
nivelul 2 se găsesc descendenții direcți ai rădăcinii etc.;
- nodul (vârful) rădăcină (R), subarborele stâng al rădăcinii (sau al unui nod oarecare),
subarborele drept al rădăcinii (sau al unui nod oarecare), descendenți direcți (fii) stângi sau drepți,
nodurile de pe același nivel (frați) etc.;
- noduri (vârfuri) terminale (frunze);
- înălțimea arborelui binar;
- metode de reprezentare a arborelui binar cu ajutorul vectorilor (cu alocare statică a
memoriei): numărul de noduri (n), vectorul de tați (vectorul T), tipul descendenților (vectorul Desc
cu valorile -1, 1 sau 0); numărul de noduri (n), vectorii descendenților direcți (fii) stângi (vectorul
S) și drepți (vectorul D);
- metode de parcurgere a arborelui binar reprezentat prin vectori (cu alocare statică a
memoriei): RSD (preordine: se parcurge mai întâi nodul rădăcină, apoi subarborele stâng și apoi
subarborele drept, după același principiu), SRD (inordine: se parcurge mai întâi subarborele stâng,
apoi nodul rădăcină și apoi subarborele drept, după același principiu), SDR (postordine: se parcurge
mai întâi subarborele stâng, apoi subarborele drept și apoi nodul rădăcină, după același principiu).
Pentru implementarea algoritmilor de rezolvare, se folosește limbajul de programare C++,
iar la scrierea programelor se pot utiliza funcții pentru:
- citirea unui arbore binar dat prin vectori;
- parcurgerea arborelui binar pentru fiecare din metodele RSD, SRD și SDR;
- afișarea nodurilor (vârfurilor) arborelui binar, în ordinea dată de parcurgerea prin
metodele RSD, SRD și SDR sau în ordinea cerută de problemă.
118
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
119
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
120
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
NR. 1
a) 2, 3 și 4; b) 2 și 3; c) 3 și 4 ; d) 2 și 4.
a) 1, 6, 7 și 8; b) 2 ; c) 2, 4 și 5; d) Nu există.
121
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
SUBIECTUL I:
Cele 2,5p se acordă astfel: 0,5p pentru scrierea corectă a programului (fără erori de
compilare); 0,5p – pentru citirea arborelui; 1p – pentru algoritm corect pentru găsirea nodurilor
terminale și 0,5p – pentru afișarea soluției (tații nodurilor terminale).
SOLUȚIE:
Trebuie găsite nodurile i (de la 1 la n) cu proprietatea că sunt frunze (s[i] și d[i] sunt 0)
pentru care se vor afișa nodurile tată, adică t[i]. Pentru arborele de mai sus, se va afișa: 2 3 4
Construim vectorul de tați T astfel: pentru nodurile i (de la 1 la n), dacă s[i] este diferit de
0, atunci t[s[i]]=i (tatăl nodului s[i] este i), respectiv dacă d[i] este diferit de 0, atunci t[d[i]]=i (tatăl
nodului d[i] este i). Pentru a nu afișa de mai multe ori un nod (dacă ambii fii sunt frunze), se
folosește vectorul P cu elementele p[i]=1 dacă i este tată de nod terminal, 0 în rest.
#include <iostream> using
namespace std;
int i, n, s[101], d[101], t[101], p[101];
int main()
{
cout<<"Numar noduri=";
cin>>n;
for(i=1; i<=n; i++)
{
cout<<"Fiul stang al nodului "<<i<<" este (0 daca nu are): ";
cin>>s[i];
if(s[i]!=0)
t[s[i]]=i;
cout<<"Fiul drept al nodului "<<i<<" este (0 daca nu are): ";
cin>>d[i];
if(d[i]!=0)
t[d[i]]=i;
p[i]=0;
}
for(i=1; i<=n; i++)
if(s[i]==0 && d[i]==0)
122
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
SUBIECTUL II.
Cele 2,5p se acordă astfel: 0,5p pentru scrierea corectă a programului (fără erori de
compilare); 0,5p – pentru citirea arborelui; 1p – pentru algoritm corect pentru parcurgerea arborelui
binar și 0,5p – pentru afișarea soluției (numărul de noduri din subarborele stâng).
SOLUȚIE:
Trebuie parcurs subarborele stâng al rădăcinii, adică arborele binar cu rădăcina fiul stâng
al nodului r (rădăcina arborelui inițial).
Pentru aceasta, trebuie găsit nodul rădăcină, vectorii descendenților direcți (s și d) și apoi
folosită una din metodele de parcurgere (RSD, SRD sau SDR) pentru subarborele stâng al rădăcinii
(cu nodul de pornire s[r]), să zicem RSD, în care se va înlocui operația de afișare a nodului r cu
operația de atribuire (incrementare) nr++ (se numără nodurile parcurse).
#include <iostream>
using namespace std;
int i, n, desc[101], t[101], s[101], d[101], r, nr=0;
void RSD(int r)
{
if(r!=0)
{
nr++;
RSD(s[r]);
RSD(d[r]);
}
}
int main()
{
cout<<"Numar varfuri=";
123
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
NR. 2
124
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
b) Vizitarea tuturor nodurilor, o singură dată, ultimele d) Vizitarea tuturor nodurilor, o singură dată,
fiind frunzele; începând cu un nod la alegere.
SUBIECTUL I:
Cele 2,5p se acordă astfel: 0,5p pentru scrierea corectă a programului (fără erori de
compilare); 0,5p – pentru citirea arborelui; 1p – pentru algoritm corect pentru găsirea nodurilor
terminale și 0,5p – pentru afișarea soluției (numărul de noduri distincte care sunt tați ai nodurilor
terminale).
SOLUȚIE:
Trebuie găsite nodurile i (de la 1 la n) cu proprietatea că sunt frunze (adică s[i] și d[i] sunt
0) pentru care se vor afișa nodurile tată, adică t[i]. Pentru arborele de mai sus, se va afișa: 2 3 4
Pentru aceasta, trebuie mai întâi să construim vectorul de tați T astfel: pentru nodurile i
(de la 1 la n), dacă s[i] este diferit de 0, atunci t[s[i]]=i (tatăl nodului s[i] este i), respectiv dacă d[i]
este diferit de 0, atunci t[d[i]]=i (tatăl nodului d[i] este i).
Pentru a nu număra de mai multe ori un nod (dacă ambii fii sunt frunze), se folosește
vectorul P cu elementele p[i]=1 dacă i este tată de nod terminal, 0 în rest.
#include <iostream> using
namespace std;
int i, n, s[101], d[101], t[101], p[101], nr=0;
int main()
{
cout<<"Numar noduri=";
125
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
SUBIECTUL II.
Cele 2,5p se acordă astfel: 0,5p pentru scrierea corectă a programului (fără erori de
compilare); 0,5p – pentru citirea arborelui; 1p – pentru algoritm corect pentru parcurgerea arborelui
binar și 0,5p – pentru afișarea soluției (nodurile din subarborele drept).
SOLUȚIE:
Trebuie parcurs subarborele drept al rădăcinii, adică arborele binar cu rădăcina fiul drept
al nodului r (rădăcina arborelui inițial).
Pentru aceasta, trebuie găsit nodul rădăcină, vectorii descendenților direcți (s și d) și apoi
folosită una din metodele de parcurgere (RSD, SRD sau SDR) pentru subarborele stâng al rădăcinii
(cu nodul de pornire d[r]), să zicem RSD.
Pentru arborele de mai sus, se va afișa: 6 3 1
126
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
REVENIRE
127
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
1 VARIANTA 2
Subiectul II
Rezolvare:
Toate grafurile au 4 noduri (vârfuri), diferă doar muchiile și numărul lor:
- 0 muchii;
- 1 muchie;
- 2 muchii;
...
- 6 muchii: graful complet are n*(n-1)/2 muchii, unde n este numărul de noduri (în
cazul nostru, n=4).
128
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
2 VARIANTA 5
Subiectul II
Rezolvare:
Graful neorientat cu 10 muchii trebuie să aibă cel puțin 5 noduri (vârfuri). Justificare:
graful complet cu 5 noduri are 10 muchii.
Graful neorientat cu 10 muchii în care toate nodurile au gradul un număr nenul poate să
aibă maxim 20 de noduri. Justificare: toate nodurile au gradul 1, adică fiecare muchie unește 2
noduri care nu sunt extremități pentru alte muchii.
Numărul de noduri cu grade numere impare este par. Justificare: Suma gradelor tuturor
nodurilor este 2*m (m=numărul de muchii), deci este un număr par. Dacă adunăm numere impare,
pentru a obține un rezultat număr par, atunci trebuie să adunăm un număr par de numere impare.
Deci numărul total de noduri: 3 noduri (cu gradul număr par) + număr par de noduri (cu
gradul număr impar) = număr impar de noduri.
Răspuns: b) 17
129
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Rezolvare:
Suma gradelor tuturor nodurilor este număr par. Justificare: Suma gradelor tuturor
nodurilor este 2*m (m=numărul de muchii), deci este un număr par.
Gradul maxim al unui nod pentru un graf cu 6 noduri este 5 (un nod poate fi extremitate
pentru maxim (n-1) muchii), dar în acest caz nu există noduri izolate (cu gradul 0), deoarece pe
toate le-am „unit” cu nodul de grad 5.
Deci, dacă avem noduri cu gradul 5, atunci nu avem noduri cu gradul 0.
Răspuns: d) 5 2 2 2 1 2
4 VARIANTA 8
Subiectul II
Rezolvare:
Un graf neorientat cu 7 muchii trebuie să aibă cel puțin 5 noduri (vârfuri). Justificare:
graful complet cu 4 noduri are 6 muchii, iar pentru 7 muchii ne mai trebuie cel puțin încă un nod (în
total 5).
Deci 5 noduri sunt necesare pentru „construirea” celor 7 muchii. Cum numărul total de
noduri este 10, înseamnă că maxim 5 noduri (10 – 5) pot avea gradul 0.
Răspuns: a) 5
130
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Rezolvare:
Suma gradelor tuturor nodurilor este 2*m (m=numărul de muchii), deci 2*m=12, de unde
m=6 (graful are 6 muchii).
Graful are 3 noduri cu gradul 1 (noduri terminale), care pot construi 3 muchii (împreună cu
alte noduri, nu contează care), deci mai rămân 8 – 3 = 5 noduri, pentru care suma gradelor este 12 –
3 = 9.
Din cele 5 noduri rămase, trebuie folosite cel puțin 3 (pentru restul de 3 muchii din totalul
de 6), adică mai rămân 2 noduri care pot avea gradul 0.
Răspuns: c) 2
6 VARIANTA 10
Subiectul II
Rezolvare:
1
5
6
3
4
2
131
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
7 VARIANTA 12
Subiectul II
Rezolvare:
Calculul gradului unui nod x al unui graf neorientat cu n noduri se poate face calculând suma
elementelor matricei de adiacență de pe linia x sau coloana x, adică:
Graful dat prin matricea de adiacență de mai sus are 2 noduri cu gradul 4 (gradul maxim) din
totalul de 6 noduri, adică nodurile 1 și 3.
Răspuns: c) 1, 3
132
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Rezolvare:
Dacă nodul 1 are gradul 1, înseamnă că din numărul maxim de muchii ce se pot întâlni în
nodul 1 (4 muchii), se ia numai o singură muchie.
În acest caz, numărul maxim de muchii pentru aceste grafuri este mai mic cu 3 față de
numărul de muchii al grafului neorientat complet cu 5 noduri, adică:
4
2
5 5
1 1
3 3
4 4
2 2
133
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
5 5
1 1
3 3
4 4
2 2
9 VARIANTA 14
Subiectul II
Rezolvare:
b d
c
Răspuns: b) 6
134
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Subiectul II
Rezolvare:
Graful este dat prin „vectorul” de muchii, deci pentru a calcula gradul unui nod x, se
numără de câte ori apare x în scrierea tuturor muchiilor.
d(1)=3; d(2)=3; d(3)=3; d(4)=3; d(5)=2; d(6)=4; d(7)=2; d(8)=2.
Rezultă că gradul minim este 2, iar nodurile care au grad minim (gradul 2) sunt 5, 7 și 8.
Răspuns: grad minim = 2; noduri cu grad minim: 5, 7 și 8.
11 VARIANTA 16
Subiectul II
Rezolvare:
Graful cu n noduri cu proprietatea că „fiecare nod este adiacent cu toate celelalte (n-1)
noduri” se numește graf complet.
Răspuns: b) 66.
135
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
5 4
Rezolvare:
Lanțul elementar este o succesiune de noduri distincte cu proprietatea că între oricare 2
noduri consecutive există muchie, adică:
, astfel încât: , muchia , ∈ ,
Pentru graful de mai sus, lanțul de lungime maximă dintre nodurile 1 și 3 are 4 muchii:
,
Răspuns: d) 4
13
VARIANTA 29
Subiectul II
Rezolvare:
Încercăm cu 5 noduri (toate nodurile grafului) – suma gradelor tuturor nodurilor:
(imposibil, deoarece trebuie să fie număr par).
Încercăm cu 4 noduri - suma gradelor tuturor nodurilor: (d(5)
trebuie să fie 0), adică putem considera graful complet cu 4 noduri la care se „adaugă” nodul 5.
1 2
3 4
Răspuns: a) 4
REVENIRE
136
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
STRUCTURA SUBIECTULUI
Făcând o analiză a noțiunilor necesare rezolvării cerințelor enunțate, pentru fiecare dintre
cele 3 subiecte (I, II și III), se pot trage următoarele concluzii:
SUBIECTUL I
Conține 5 itemi de tip grilă care se referă la următoarele conținuturi din curriculum:
2. Elementele de bază ale unui limbaj de programare (Pascal sau C)
▷ Noțiunea de tip de dată. Operatori aritmetici, logici, relaționali
▷ Definirea tipurilor de date
▷ Variabile. Declararea variabilelor
▷ Expresii.
3. Subprograme predefinite
▷ Subprograme. Mecanisme de transfer prin intermediul parametrilor
▷ Proceduri și funcții predefinite
7. Subprograme definite de utilizator
▷ Funcții: declarare și apel; parametri formali și parametri efectivi; parametri transmiși
prin valoare, parametri transmiși prin referință; variabile globale și variabile locale,
domeniu de vizibilitate
▷ Proiectarea modulară a rezolvării unei probleme
8. Recursivitate
▷ Funcții recursive
9. Metoda backtracking (iterativă sau recursivă)
▷ Probleme de generare
137
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
SUBIECTUL II
Conține 3 itemi (nu necesită elaborarea de programe, doar scrierea programului C/C++
corespunzător algoritmului dat) care se referă la următoarele conținuturi din curriculum:
1. Algoritmi
▷ Noțiunea de algoritm, caracteristici
▷ Date, variabile, expresii, operații
▷ Structuri de bază (liniară, alternativă și repetitivă)
▷ Descrierea algoritmilor (programe pseudocod)
2. Elementele de bază ale unui limbaj de programare (Pascal sau C)
▷ Vocabularul limbajului
▷ Constante. Identificatori
▷ Noțiunea de tip de dată. Operatori aritmetici, logici, relaționali
▷ Definirea tipurilor de date
▷ Variabile. Declararea variabilelor
▷ Definirea constantelor
▷ Structura programelor. Comentarii
138
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
SUBIECTUL III
Conține 3 itemi (necesită elaborarea și scrierea completă a programelor C/C++) care se
referă la următoarele conținuturi din curriculum:
1. Algoritmi
▷ Noțiunea de algoritm, caracteristici
▷ Date, variabile, expresii, operații
▷ Structuri de bază (liniară, alternativă și repetitivă)
▷ Descrierea algoritmilor (programe pseudocod)
2. Elementele de bază ale unui limbaj de programare (Pascal sau C)
▷ Vocabularul limbajului
▷ Constante. Identificatori
▷ Noțiunea de tip de dată. Operatori aritmetici, logici, relaționali
▷ Definirea tipurilor de date
▷ Variabile. Declararea variabilelor
▷ Definirea constantelor
▷ Structura programelor. Comentarii
▷ Expresii. Instrucțiunea de atribuire
▷ Citirea/scrierea datelor
▷ Structuri de control (instrucțiunea compusă, structuri alternative și repetitive)
139
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
numerică)
▷ Tipul înregistrare
5. Fișiere text
▷ Fișiere text. Tipuri de acces
▷ Proceduri și funcții predefinite pentru fișiere text
6. Algoritmi elementari
▷ Probleme care operează asupra cifrelor unui număr
▷ Divizibilitate. Numere prime. Algoritmul lui Euclid
▷ Șirul lui Fibonacci. Calculul unor sume cu termenul general dat
▷ Determinare minim/maxim
▷ Metode de ordonare (metoda bulelor, inserției, selecției, numărării)
▷ Interclasare
▷ Metode de căutare (secvențială, binară)
▷ Analiza complexității unui algoritm (considerând criteriile de eficiență durata de
executare și spațiu de memorie utilizat)
7. Subprograme definite de utilizator
▷ Funcții: declarare și apel; parametri formali și parametri efectivi; parametri transmiși
prin valoare, parametri transmiși prin referință; variabile globale și variabile locale,
domeniu de vizibilitate
▷ Proiectarea modulară a rezolvării unei probleme
140
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Subiectul I
1. Enunț: Variabila întreagă n memorează un număr natural. Indicați expresia C/C++ care
are valoarea 1 dacă și numai dacă numărul memorat în n este divizibil cu 20, dar NU și cu 19.
a. n%380==0 && n/20==0 b. n%380!=0 ||!( n/19==0)
c. n%20==0 && n%19==0 d. !(n%20!=0 || n%19==0)
Rezolvare:
Deoarece avem o expresie compusă, analizăm toate operațiile din care este alcătuită:
2. Enunț: Subprogramul f este definit mai jos. Indicați apelul care determină afișarea, în
ordine strict descrescătoare, a tuturor divizorilor proprii pozitivi ai numărului 1000 (divizori diferiți
de 1 și de 1000).
void f (int n, int d)
{
if(d<n/2)
f(n, d+1);
if(n%d= =0)
cout<<d<<’ ’;
}
a. f(1000, 2); b. f(999, 2); c. f(500, 2); d. f(32, 2).
141
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
142
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Numărăm frunzele (noduri terminale) din arborele nostru, iar răspunsul corect este:
c. 6 – nodurile 2, 4, 10, 1, 3, 8
5. Enunț: Un graf neorientat are 10 muchii și este conex. Numărul maxim de noduri ale
sale este:
a. 8; b. 9; c. 10; d. 11.
143
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Subiectul al II-lea
144
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Răspunsul corect: 1, 2, 2, 3, 3, 3, 4
b) Scrieți cel mai mic și cel mai mare număr care pot fi citite astfel încât, în urma
executării algoritmului, pentru fiecare dintre acestea, ultima valoare afișată să fie 10.
Rezolvare:
Observăm următorul lucru: pentru a afișa prima valoare 10, trebuie scrise mai întâi valorile
1 (1 dată), 2 (de 2 ori), 3 (de 3 ori), 4 (de 4 ori), 5 (de 5 ori), 6 ( de 6 ori), 7 (de 7 ori), 8 (de 8 ori) și
9 (de 9 ori), adică un număr de 1+2+3+4+5+6+7+8+9 valori, adică 45 de valori. Asta înseamnă că
pentru n=45, cea mai mare valoare afișată este 9 (de 9 ori), iar pentru n=46, la valorile afișate pentru
n=45, se adaugă o valoare egală cu 10.
Așadar, 46 este numărul minim.
Pentru că numărul maxim de valori k afișate este egal cu k, înseamnă că pentru a găsi cel
mai mare număr care poate fi citit pentru variabila n, adunăm 9 la 46 (se va afișa 10 de încă 9 ori
față de numărul 46 care, citit pentru variabila n, generează afișarea lui 10 o singură dată).
Așadar, 55 este numărul maxim.
145
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
#include <iostream>
using namespace std;
int main()
{
unsigned int n;
int k, i;
cin>>n;
k=1;
while(n>=1)
{
if(n>k)
i=k;
else
i=n;
n=n-i;
while(i>=1)
{
cout<<k<<" "; i=i-1;
}
k=k+1;
}
return 0;
}
d) Scrieți în pseudocod un algoritm, echivalent cu cel dat, înlocuind una dintre structurile
cât timp...execută cu o structură repetitivă de alt tip.
Rezolvare:
Mai întâi să vedem care sunt tipurile de structuri repetitive:
CÂT TIMP condiție EXECUTĂ ... (structură repetitivă cu test inițial sau condiționată
anterior);
REPETĂ ... PÂNĂ CÂND condiție (structură repetitivă cu test final sau condiționată
posterior);
PENTRU contor←valoare_inițială,valoare_finală,pas EXECUTĂ ... (structură
repetitivă cu număr cunoscut de repetiții).
146
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
147
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
1. condiție este criteriu de ieșire (dacă nu este îndeplinită, se reia execuția secvenței S, iar
atunci când este îndeplinită, se iese din structură).
2. Dacă, de la prima evaluare, condiție nu este îndeplinită, atunci S se execută o singură
dată, adică numărul minim de execuții pentru S este 1.
Ținând cont de cele 2 observații pentru cele 2 tipuri de structuri, pentru a „trece” de la
structura CÂT TIMP condiție EXECUTĂ ... la structura REPETĂ ... PÂNĂ CÂND condiție:
1. Trebuie să ținem cont de „rolul” pe care îl are condiție în cele 2 structuri:
criteriu de repetiție pentru (1)
criteriu de ieșire pentru (2)
adică trebuie să „transformăm” condiție în NOT (condiție) - operația de negare.
2. Trebuie să ținem cont de „numărul minim de execuții” pentru secvența S în cele 2
structuri: 0 pentru (1), respectiv 1 pentru (2), adică trebuie să ne asigurăm că secvența S nu se
execută niciodată nici în cazul (2), dacă nu se execută pentru (1). Pentru aceasta, folosim o
structură DACĂ condiție în cadrul căreia scriem structura REPETĂ ... PÂNĂ CÂND
NOT(condiție)
La modul general, spunem că:
┌CÂT TIMP condiție EXECUTĂ
│ S (secvență de operații)
└■
se va „transforma” în:
┌DACĂ condiție ATUNCI
│ REPETĂ
│ S (secvență de operații)
│ PÂNĂ CÂND NOT(condiție)
└■
Varianta II:
Vom folosi structura:
PENTRU contor←valoare_inițială,valoare_finală,pas EXECUTĂ ...
Observăm că în cadrul structurii următoare secvența de operații se repetă de i ori (pentru i,
i-1, ...., 1), adică avem număr cunoscut de repetiții:
┌cât timp i≥1 execută
│ scrie k,' '; i←i-1
└■
149
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
2. Enunț: Pentru un număr complex se memorează următoarele date: partea reală și partea
imaginară (numere reale). Variabila z memorează simultan date pentru fiecare dintre cele 20 de
numere complexe. Știind că expresia C/C++ de mai jos are valoarea sumei dintre partea reală și
partea imaginară ale primului număr complex dintre cele precizate, scrieți definiția unei structuri cu
eticheta complex care să permită memorarea datelor unui număr complex, și declarați corespunzător
variabila z.
z[0].pre+z[0].pim
Rezolvare:
Trebuie declarară și definită o structură neomogenă (de tip înregistrare) cu numele
(eticheta) complex care să conțină 2 elemente (câmpuri): pre și prim.
Avem nevoie de utilizarea cuvântului cheie STRUCT astfel:
struct complex { float pre; float pim;} z[20];
Rezolvare:
Se observă că valorile elementelor matricei sunt consecutive, începând cu numărul 1
pentru a11, numărul 2 pentru a12, ...., 25 pentru a55. La modul general, pentru o matrice pătratică de
dimensiuni nxn, elementele ei primesc valori de la 1 până la n2. În mod direct, se poate rezolva
problema astfel:
se consideră o variabilă (de exemplu aux) care se inițializează cu 1;
se parcurge matricea (cu ajutorul celor 2 structuri FOR), iar fiecărui element al matricei
aij i se atribuie valoarea lui aux, adică aij = aux;
după operația aij = aux, variabila aux se incrementează cu 1, adică aux++
int aux=1;
for(i=1;i<=5;i++)
for(j=1;j<=5;j++)
{a[i][j]=aux; aux++;}
Pentru că în enunț se precizează că nu putem utiliza alte variabile decât cele menționate,
trebuie să găsim o altă metodă, care să genereze valorile de la 1 la 25 folosind variabilele deja
menționate (i și j).
Observăm că primul element al fiecărei linii a matricei este de forma 5k+1, unde 1 este
numărul coloanei (indicele j al elementelor matricei):
a11=1=5*0+1
a21=6=5*1+1
a31=11=5*2+1
a41=16=5*3+1
a51=21=5*4+1
În mod similar, al doilea element al fiecărei linii a matricei este de forma 5k+2, al treilea
element al fiecărei linii a matricei este de forma 5k+3, ....
La modul general, fiecare element al matricei este de forma 5k+j, unde j=1 , … , 5 iar k
trebuie scris în funcție de variabila i (linia matricei pe care se găsește aij).
Observăm că formulele de calcul pentru elementele a11, a12, ... , a15 ne sugerează că 5
trebuie înmulțit cu ”numărul de linie -1”, adică i-1.
151
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
152
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
153
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
2. Enunț: Într-un text cu cel mult 100 de caractere, cuvintele sunt formate numai din litere
mici ale alfabetului englez și sunt separate prin unul sau mai multe spații. Scrieți un program C/C++
care citește de la tastatură un astfel de text, cu cel puțin trei cuvinte, și construiește în memorie un
șir de caractere format din prima consoană a primului cuvânt, urmată de prima vocală a celui de al
doilea cuvânt, respectiv de ultima literă a ultimului cuvânt, în ordinea în care acestea apar in text.
Șirul obţinut se afișează pe ecran, iar dacă nu se poate obține un astfel de sir, se afișează pe ecran
mesajul nu exista. Se consideră vocale literele a, e, i, o, u.
Exemplu:
Pentru textul: el prefera sa mearga la schi
se afișează pe ecran șirul lei
iar pentru textul: ei prefera sa mearga la schi
se afișează pe ecran mesajul nu exista
Rezolvare:
Pentru a prelucra șiruri de caractere, trebuie folosite funcții specifice din biblioteca
<string.h>
Pentru rezolvarea problemei avem nevoie de următoarele funcții:
cin.get(sir, nr) - memorează primele nr caractere introduse de la tastatură;
strlen(nume_sir) - returnează lungimea șirului de caractere;
strtok(sir1,sir2) - separă sir1 în mai multe șiruri (cuvinte) separate între ele prin unul
sau mai multe caractere cu rol de separator (sir2).
154
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
#include <iostream>
#include <string.h>
using namespace std;
int cuv_c=1, i, con=0, voc=0;
char s[101], rez[4], *cuv;
155
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
156
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
3. Enunț: Un interval este numit prieten de grad n al unui șir dacă sunt exact n termeni ai
șirului cu valori din interval și dacă toate numerele întregi care aparțin intervalului sunt valori ale
unor termeni ai știrului. Fișierul bac.txt conține un șir de cel mult 106 numere naturale din
intervalul [0,102], separate prin câte un spațiu. Se cere să se afişeze pe ecran numărul maxim n cu
proprietatea că există un interval prieten de grad n al știrului aflat în fișier. Proiectați un algoritm
eficient din punctul de vedere al timpului de executare.
Exemplu: dacă fișierul conține numerele
10 10 11 3 4 2 49 4 2 3 21 2 27 12 13 14 15 5
atunci se afișează pe ecran 8 (intervalului [2,5] îi aparțin 8 termeni ai șirului)
a) Descrieți în limbaj natural algoritmul proiectat, justificând eficiența acestuia.
b) Scrieți programul C/C++ corespunzător algoritmului proiectat.
Rezolvare:
a) Declarăm vectorul de apariții v ce conține 100 de elemente. Pe măsură ce citim un
număr în variabila nr, incrementăm poziția din vectorul de apariții v[nr]++. De exemplu, dacă
numărul 2 apare de 7 ori, atunci v[2] va fi 7.
După ce am construit vectorul de apariții, parcurgem fiecare element din el (v[i] pentru i
ia valori de la 1 la 100) și calculăm lungimea fiecărui interval în care nu se găsesc zerouri, care va
fi memorată în variabila lung.
La final, afișăm cea mai mare valoare (valoarea maximă) pe care am obținut-o și am
memorat-o în variabila n.
Algoritmul este eficient din punct de vedere al timpului de executare, având o complexitate
O(m), unde m este numărul maxim de elemente din vectorul de apariții (în cazul nostru 100, pentru
că intervalul [0,102] conține 100 de numere naturale).
157
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("bac.txt");
int v[101],i ,nr, lung=0, n=0;
int main()
{
while(fin>>nr)
v[nr]++;
for(i=0; i<=100; i++)
{
if(v[i]==0)
lung=0;
else
lung=lung+v[i];
if(lung>n)
n=lung;
}
cout<<n;
return 0;
}
REVENIRE
158
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
159
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Istoria Internetului
• 1959: John McCarthy conectează mai multe terminale la un singur calculator central;
• 1969: apare rețeaua ARPANET (Advanced Research Projects Agency Net- Agenția
pentru proiecte de cercetare avansată) între 4 noduri
(University of California at Los Angeles, University of
California at Santa Barbara, University of Utha şi
Stanford Research Institute);
• 1971: este trimis primul mesaj de e-mail;
• 1979: agenția ARPA separă rețeaua în
două, una pentru lumea universitară şi comercială şi
una militară; cele două rețele constituiau o inter-rețea
(internet) denumită inițial DAARPA Internet
(Interconected Network) şi consacrată ulterior sub
denumirea Internet;
• 1980: apar o serie de programe de
comunicație, denumite protocoale de comunicație;
• 1983: TCP/IP devine unicul protocol oficial, astfel încât tot mai multe rețele de
calculatoare din întreaga lume, au fost conectate la ARPANET;
• 1989: apare la Geneva, Elveția serviciul de documentare şi informare www (world wide
web), fiind dezvoltat de Centrul European de Cercetări Nucleare (CERN) şi care apare public în
anul 1991;
160
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Modelul client-server
Pentru accesul la serviciile oferite de rețeaua
Internet se folosește modelul client-server.
• calculatoarele client denumite şi calculatoare
gazdă (host) sunt calculatoare care au acces la informație şi
o folosesc
• calculatoarele server sunt calculatoare pe care se
depozitează informația, care o sortează şi o distribuie.
Comunicarea în Internet se realizează întotdeauna între o pereche de programe: unul
inițiază o conversație, iar celălalt trebuie să aștepte să primească mesajul. Programele care asigură
comunicarea funcționează şi ele pe baza modelului client-server.
Funcțiile rețelei Internet
Rețeaua Internet asigură următoarele funcții:
• de documentare şi informare (obținerea de informaţii);
• de comunicare (schimb de mesaje şi transfer de fișiere);
• de conectivitate (accesul de la distanta la resursele unui alt calculator şi partajarea
datelor şi a aplicațiilor);
• comercială (studiul pieței, rezervare bilete, comerțul electronic).
161
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
162
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
163
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
164
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Motoare de căutare
Un motor de căutare este un program de căutare, care accesează
Internet-ul în mod automat frecvent și care stochează titlul, cuvinte cheie și,
parțial, chiar conținutul paginilor web într-o bază de date.
165
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Securitatea în Internet
Criptarea transmisiei
- criptarea datelor presupune codificarea datelor, pentru a nu fi disponibile și persoanelor
neautorizate;
Semnătura digitală
- este o modalitate de a asigura integritatea datelor transmise prin reţea şi de a garanta
autenticitatea provenienţei acestora;
- semnătura digitală dă garanţia că datele nu au fost alterate în timpul circulaţiei
(transmisiei) lor în reţea şi confirmă identitatea persoanei sau autorităţii care le-a semnat.
166
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
REVENIRE
167
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
168
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
3. Ce este Internetul?
a) O rețea locală de calculatoare
b) O rețea globală de calculatoare
c) O colecție de browsere WEB
d) Aplicațiile de partajare ale unui fișier mare
169
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
3. Ce este Internetul?
a) O rețea locală de calculatoare
b) O rețea globală de calculatoare
c) O colecție de browsere WEB
d) Aplicațiile de partajare ale unui fișier mare
170
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
REVENIRE
171
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Proiectarea logică începe cu crearea modelului conceptual al bazei de date, care este
independent de sistemul folosit în etapa de implementare. Modelul conceptual este apoi proiectat pe
un model logic, care va influența mai târziu modelul de date obținut la implementare.
Informațiile necesare realizării modelului conceptual, al ERD-ului, se obțin folosind
metode convenționale, cum ar fi intervievarea oamenilor din cadrul organizației și studierea
documentelor folosite.
Regulile afacerii unei organizații se referă în esență la procesele şi fluxurile tuturor datelor
şi activităţilor zilnice din cadrul organizației.
Entitatea este reprezentată printr-un dreptunghi cu colțurile rotunjite. Numele entității este
un substantiv la singular, scris cu majuscule, în partea de sus a dreptunghiului.
Exemple:
PROFESOR PACIENT ELEV
O instanță a unei entități este un obiect, persoană, eveniment particular din clasa de
obiecte care formează entitatea. De exemplu, elevul Popescu Daniel din clasa a IX-a A de la
Colegiul Economic din localitatea Rm. Vâlcea este o instanță a entității ELEV.
172
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
173
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
ELEV
# cnp
nume
prenume
data_nasterii
o adresa
o telefon
o email
Orice relație este bidirecțională, legând două entități (pe care le putem considera notate cu
A și B) sau o entitate cu ea însăși (relație recursivă).
Exemplu:
Considerăm relația dintre entitățile ELEV și MATERIE. Spunem că „un elev studiază mai
multe materii (atunci când citirea relației se face de la entitatea ELEV către entitatea MATERIE),
iar o materie este studiată de către mai mulți elevi” (atunci când citirea relației se face de la
entitatea MATERIE către entitatea ELEV).
Orice relație se caracterizează prin:
- numele relației;
- opționalitatea relației;
- gradul (cardinalitatea) relației.
Numele relației este dat de verbul care poate fi folosit pentru descrierea relației (dacă
nu se potrivește un verb anume, se poate folosi exprimarea: îi corespunde/corespund).
Exemplu:
Relația existentă între entitățile JUCĂTOR și ECHIPĂ poate fi citită astfel: „un jucător
joacă într-o anumită echipă (aparține unei anumite echipe), iar la o echipă trebuie să joace unul
sau mai mulți jucători”. Numele relației este joacă.
Opționalitatea relației - pentru a o stabili, trebuie să răspundem la întrebări de genul:
Un jucător trebuie să joace într-o echipă? Se poate ca un jucător să nu joace în nicio echipă?
174
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Tipuri de relații
Presupunem existența a două entități (care vor fi transpuse în două tabele) notate cu A și B
care aparțin bazei de date și care sunt corelate (relaționate), adică există o relație între ele.
Ținând cont de presupunerile de mai sus, putem descrie tipurile de relații care pot să apară
între entitățile (tabelele) A și B astfel:
1. Relații de tipul „1-1” (one-to-one) – destul de rar întâlnite.
A B
sau
A B
sau
A B
sau
A B
sau
A B
sau
A B
A B
sau
176
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
sau
sau
A B
177
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
A B
2. Unui element din A pot să îi corespundă unul sau mai multe elemente din B, iar unui
element din B, trebuie să îi corespundă unul sau mai multe elemente din A.
3. Unui element din A trebuie să îi corespundă unul sau mai multe elemente din B, iar unui
element din B, pot să îi corespundă unul sau mai multe elemente din A.
A B
178
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
4. Unui element din A pot să îi corespundă unul sau mai multe elemente din B, iar unui
element din B, pot să îi corespundă unul sau mai multe elemente din A.
179
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Cu alte cuvinte, toate atributele entității trebuie să conțină o singură informație (valoare),
adică nu sunt permise atribute compuse. Dacă un atribut are valori multiple, sau un grup de atribute
se repetă, atunci trebuie creată o entitate suplimentară legată de entitatea inițială printr-o relație de
tipul „1-n” (one-to-many). Noua entitate va conține atributele corespunzătoare valorilor multiple sau
grupurile de atribute care se repetă din entitatea inițială.
A DOUA FORMĂ NORMALĂ (2NF – SECOND NORMAL FORM)
O entitate se găsește în a doua formă normală dacă și numai dacă:
- se găsește în prima formă normală;
- orice atribut care nu face parte din UID (unique identifier) va depinde de întregul UID,
nu doar de o parte a acestuia.
Cu alte cuvinte, nu se acceptă dependențe tranzitive, adică un atribut care nu este UID
trebuie să depindă de UID în mod direct.
Diagrama entităţi-relații este un model de reprezentare a obiectelor şi evenimentelor lumii
reale şi a asocierilor (legături, relaţii) dintre ele. De fapt, ea reprezintă o abstractizare a aspectelor
semnificative ale unei „întreprinderi”, sistem real, ignorând proprietățile „accidentale” ale acestuia.
REVENIRE
180
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
NOȚIUNI INTRODUCTIVE
În momentul actual este nevoie de a stoca, analiza și prelucra o mare cantitate de date cu
ajutorul calculatorului.
Datele stocate și prelucrate sunt foarte complexe, cu foarte multe interdependențe, lucru ce
a condus la apariția bazelor de date.
Componentele primare ale sistemului informațional sunt reprezentate de date și
informații. Astfel:
• Datele reprezintă o înșiruire de caractere numerice sau alfa numerice, care au o anumită
semnificație. De exemplu, datele economice descriu acțiuni, procese, fapte, fenomene referitoare la
firmă sau la procese din afara acesteia.
• Informațiile se obțin în general din prelucrarea datelor și sunt utilizate în general în
cadrul activității de luare a deciziilor.
• Orice informație este o dată, dar nu orice dată este o informație.
• Bazele de date sunt folosite în diverse domenii:
• aviație și transporturi - sistemul de rezervare a biletelor;
• administrativ - evidența populației și a taxelor încasate;
• bancar - realizarea evidențelor clienților și conturilor bancare aferente;
• medical - înregistrarea pacienților în spital.
O bază de date este o colecție de informații referitoare la un anumit subiect, care au fost
strânse, organizate și memorate în scopul folosirii lor ulterioare.
În cadrul unei baze de date pot fi utilizate:
• tabele - pentru memorarea datelor;
• interogări - pentru extragerea și analizarea datelor din mai multe tabele;
• formulare - pentru afișarea și modificarea înregistrărilor din tabele;
• rapoarte - pentru imprimarea informațiilor din tabele sau interogări.
181
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Deschiderea aplicației
Pentru deschiderea aplicației Microsoft Office Access se apasă butonul START apoi se
alege ALL PROGRAMS – MICROSOFT OFFICE – MICROSOFT ACCESS
În sistemul de operare Windows 7, un fişier sau o aplicaţie se poate deschide folosind
câmpul de căutare (Search), disponibil în meniul Start. Astfel, se apasă butonul START şi se
tastează numele aplicaţiei în câmpul de căutare. Rezultatele căutării sunt afişate în timp real, în
funcţie de caracterele introduse.
Se folosește scurtătura aplicației de pe desktop.
În acest moment pe ecranul monitorului apare vizualizarea Microsoft Office Backstage, de
unde aveți posibilitatea să obțineți informații despre baza de date curentă, să creați o bază de date
nouă, să deschideți o bază de date existentă și să vizualizați conținutul recomandat de Office.com.
Revenirea în fereastra aplicației se realizează apăsând butonul FILE.
Închiderea aplicației
Pentru a închide aplicația, se apasă butonul File (Fișier) și se selectează opțiunea Close
(Exit) (Ieșire) din partea de jos a meniului derulant, sau prin apăsarea butonului din colțul din
dreapta sus, sau folosind combinația ALT+F4 pentru a închide fereastra activă.
Deschiderea și închiderea unei baze de date existente
O bază de date existentă pe discul calculatorului sau pe un alt dispozitiv de stocare a
datelor, se poate deschide apăsând butonul OPEN (Deschidere) existent în meniul FILE (Fișier). Pe
183
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Șabloane
O bază de date se poate crea și pe baza unui șablon existent pe calculator
(SampleTemplates). Un șablon este o bază de date deja creată ce conține toate tabelele, interogările,
formularele, rapoartele necesare pentru efectuarea unei activități.
Dacă sunteți conectați la internet, se pot vizualiza și alege șabloane din Microsoft Office
Online. Ele sunt împărțite în categorii.
O bază de date nouă se mai poate crea lu apăsând simultan tastele CTRL+N.
Salvarea unei baze de date
• Salvarea modificărilor efectuate în baza de date se realizează apelând meniul FILE
opțiunea SAVE sau pictograma sau combinația CTRL+S.
• După salvare, numele bazei de date va fi afișat în bara de titlu.
• Extensia implicită a fișierelor Access este .accdb.
184
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Pe lângă filele standard, aplicația Access oferă și file contextuale de comenzi. În funcție
de context (adică de obiectul cu care lucrați și operațiunea pe care o efectuați), este posibil să
apară una sau mai multe file contextuale de comenzi.
185
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Ea este localizată în partea din stânga sus a ecranului și conține butoane pentru cele mai
uzuale comenzi ale programului Access. Această bară de instrumente poate fi particularizată prin
adăugarea sau ștergerea diverselor butoane.
Pentru particularizarea acestei bare de instrumente, se apasă butonul din dreapta și se alege
din lista derulantă comanda dorită. În dreptul butoanelor deja existente în bara de instrumente, apare
un semn de bif.
În cazul în care comanda dorită nu se află în lista derulantă, se selectează opțiunea More
Commands (Mai multe comenzi).
Pe ecran va fi afișată fereastra Access Options (Opțiuni Access). În partea stângă este
afișată o listă a comenzilor disponibile, iar în partea dreaptă o listă a comenzilor existente în bara de
acces rapid.
Astfel, pentru a adăuga un buton în bara de acces rapid, se selectează butonul din lista din
partea stângă și se apasă butonul Add (Adăugare).
Ștergerea unui buton din bara de acces rapid se realizează prin selectarea lui din lista din
dreapta și apăsarea butonului Remove (Ștergere).
186
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
187
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
1. Operațiile principale.
Crearea unei tabele cu diferite atribute
După ce s-a stabilit locația și numele bazei de date nou create, pe ecran va apărea fereastra
bazei de date.
Elementele principale ale interfeței Access sunt:
Un alt avantaj major oferit de interfața Access 2010 constă în filele document.
În cadrul bazei de date, obiectele sunt afișate sub forma unor file document, ceea ce
permite deschiderea în simultan a mai multor obiecte, precum și navigarea facilă de la un obiect la
altul.
189
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
190
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
191
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
192
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
193
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
194
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
195
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
196
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
198
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
199
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
200
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
REVENIRE
201
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Clasa …………
TEST TIC
NR. 1
Microsoft Access
I. Răspundeți, pe scurt: 2p
202
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
IV. Selectați noțiunile de mai jos care reprezintă tipuri de date în Access: 1p
Memo, Autonumerotare, Mască intrare, Format, Text, Legendă, Dată/Oră, Dimensiune câmp.
V. Puneţi în corespondenţă coloanele A şi B: 2p
A B
1. Legendă (Caption) a) Permite selectarea sursei pentru interogare
2. Regulă de validare (Validation Rule) b) Format de afişare
3. Dată scurtă (Short Date) c) Eticheta câmpului care apare la afişarea tabelului
4. Afişare tabel (Show Table) d) Condiţia îndeplinită de valorile introduse în coloană
Se acordă 1p din oficiu.
Timp de lucru – 40 minute.
Clasa …………
TEST TIC
NR. 2
Microsoft Access
I. Răspundeți, pe scurt: 2p
1. Descrieți proprietatea Regulă de validare.
2. Enumeraţi 3 tipuri de date folosite în Access. Descrieți unul dintre ele.
II. Pentru tabelele cu structura de mai jos, răspundeți următoarelor cerinţe:
2p
PRODUSE: CATEGORII:
- id_produs (cheie primară) - id_categorie (cheie primară)
- nume - denumire
- categorie - proprietati
- pret_unitar - nr_produse
- TVA - produs_reprezentativ
- tip_ambajaj
1. Ce tip de relație se poate stabili între cele 2 tabele?
2. Care sunt câmpurile de tip numeric din tabelul PRODUSE? Dar din tabelul CATEGORII?
3. Dacă prețul este strict mai mic decât 500 lei, ce regulă de validare poate avea acest câmp?
203
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
c) unor tabele și/sau interogări din baza de date; d) unor formulare din baza de date.
IV. Selectați noțiunile de mai jos care reprezintă proprietăţi ale câmpului: 1p
Legendă, Memo, Hyperlink, Obiect OLE, Valoare implicită, Format, Monedă, Dimensiune câmp.
V. Puneți în corespondență coloanele A şi B: 2p
A B
1. Hyperlink a) Condiţia îndeplinită de valorile introduse în coloană
2. Regulă de validare (Validation Rule) b) Crează o legătură către o pagină Web sau un fişier
3. Oră lungă (Long Time) c) Numere naturale din intervalul: [0 , 255]
4. Octet (Byte) d) Format de afişare
Se acordă 1p din oficiu.
Timp de lucru – 40 minute.
REVENIRE
204
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
205
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Se observă că rolul de tată îl are entitatea EDITURA, iar rolul de fiu entitatea CARTE.
206
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Tabelul EDITURI
Nume Tip Tip
Opționalitate
câmp câmp cheie
Nume Text Pk Obligatoriu
Adresă Text Opțional
Maparea relațiilor de tipul „m-n” (many-to-many). O relație de acest tip nu poate fi
mapată în mod direct. De obicei nu se ajunge la etapa de mapare a ERD-ului, deoarece, dacă acesta
conține relații de tipul many-to-many, mai întâi se modifică ERD-ul prin rezolvarea relațiilor de
acest tip.
Opționalitatea relației. Dacă relația este obligatorie (mandatory), înseamnă că pentru
cheia străină a tabelului copil (preluată de la cheia primară a tabelului tată), este obligatorie
completarea cu valori a acestui câmp. Dacă relația este opțională, înseamnă că NU este obligatorie
completarea cu valori a acestui câmp.
Integritatea referențială este proprietatea bazei de date care garantează că orice valoare a
unei chei străine are valoarea Null (dacă atributele acesteia nu sunt supuse constrângerii Not Null)
207
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
REVENIRE
208
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Clasa a XII-a
Sistemul de operare
Definiție: Sistemul de operare reprezintă ansamblul de programe care asigură utilizarea
optimă a resurselor fizice şi logice ale unui sistem de calcul.
Rol: Are rolul de a gestiona funcționarea componentelor hardware ale sistemului de calcul,
de a coordona şi controla execuția programelor şi de a permite comunicarea utilizatorului cu
sistemul de calcul.
Funcţiile prin intermediul cărora sistemul de operare realizează aceste obiective sunt:
• gestionează resursele fizice ale calculatorului și dispozitivele periferice;
• gestionează operațiile de intrare/ieșire;
209
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Interfața grafică (în engleză: Graphical User Interface sau GUI) este o interfață cu
utilizatorul bazată pe un sistem de afișaj ce utilizează elemente grafice, de exemplu ferestre,
meniuri, butoane rotunde ca la radiourile vechi, cutii de bifat, liste și alte pictograme.
Organizarea datelor
Datele desemnează elementele primare, provenind din diverse surse, fără o formă
organizată care să permită luarea unor decizii.
Informațiile sunt date ce au un caracter de noutate, care îmbogățesc nivelul de cunoștințe
ale celui care primește aceste informaţii. O dată care nu aduce nimic nou nu se poate considera
informație.
Prelucrarea datelor (numită şi procesare) presupune totalitatea transformărilor, ca formă şi
conținut a datelor.
Deoarece calculatorul recunoaște numai două stări, datele supuse prelucrării sunt
transformate în șiruri de cifre binare 0 şi 1.
Definiție: O cifră binară se mai numeşte bit (prescurtat Binary Digit) şi reprezintă cea mai
mică unitate de măsură a cantității de informație.
Concret, bitul nu este decât starea de „închis”- „deschis” sau „sus”-„jos” dintr-un circuit.
Definiție: O succesiune de 8 biți se numeşte byte (prescurtat, B) sau octet, („o”), fiind cea
mai mică unitate de date ce poate fi reprezentată şi adresată de către memoria unui sistem de calcul.
Deoarece datele reprezentate în memorie ocupă o succesiune de Bytes, acestea sunt
exprimate în multipli ai acestuia:
1 kiloByte 1 kB = 1024 B = 210 B
1 MegaByte 1 MB = 1024 kB = 210 kB
210
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Memoria unui PC
În configurația unui sistem electronic de calcul în funcţie de modul în care se realizează
accesul la memorie, pot fi întâlnite simultan două mari tipuri de memorii: memorii ROM şi memorii
RAM.
Memoria ROM (Read Only Memory – memorie care poate fi doar citită) – este un tip de
memorie nevolatilă (informația conținută de acest tip de memorie nu se pierde la oprirea
calculatorului). Este o memorie de tip special, care prin construcţie nu permite programatorilor
decât citirea unor informaţii înscrise aici de constructorul calculatorului prin tehnici speciale.
Memoria RAM reprezintă un spațiu temporar de lucru
unde se păstrează datele şi programele pe toată durata execuției
lor. Programele şi datele se vor pierde din memoria RAM, după ce
calculatorul va fi închis, deoarece aceasta este volatilă, păstrând
informația doar atâta timp cât calculatorul este sub tensiune.
Fișiere și directoare
Scurtătura (shortcut) este un fișier de dimensiune mică
ce asigură legătura la un program, document, dosar sau o adresă de
Internet. Fișierul este reprezentat printr-o pictogramă care conține
o săgeată neagră în colțul din stânga-jos. Adesea, numele lor
include cuvintele Shortcut to… (Scurtătură pentru…).
Formatarea reprezintă operația prin care o dischetă este
pregătită în vederea scrierii de informaţii pe ea. Tot prin această operație discheta devine
compatibilă cu sistemul de operare folosit.
Fișierul (file) - reprezintă o colecție ordonată de informaţii, grupate sub acelaşi nume. Mai
multe fișiere pot fi grupate într-un dosar (director - folder). Pe hard-disk-ul sistemului de calcul,
dosarele sunt organizate sub forma unei structuri ierarhice sau arborescente. Pe primul nivel se află
directorul rădăcină, apoi intervin directoarele aflate pe nivelul 1, 2 etc. Utilitarul Windows Explorer
permite vizualizarea structurii arborescente. Accesarea acestei aplicații se face astfel: Start - All
Programs – Accessories - Windows Explorer
211
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
212
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Alte editoare:
213
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
REVENIRE
215
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
Clasa a XII-a
Competențe digitale
Clasa a XII-a
FIȘĂ DE LUCRU
216
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192
completând, pentru fiecare în parte, răspunsurile în spațiile corespunzătoare în textul de mai sus.
Competențe digitale
Clasa a XII-a
FIȘĂ DE LUCRU
MOD DE REZOLVARE
REVENIRE
218
Vâlcea, Rm. Vâlcea, B-dul Nicolae Bălcescu, nr. 30, 240192