Sunteți pe pagina 1din 16

PROIECT

ALGORITMI SI STRUCTURI DE DATE


1. TEORIE

Sistemul informaţional-informatic

Activitatea desfasurata intr-un sistem organizat, in vederea realizarii unui obiectiv poate fi definita ca
fiind rezultatul actiunii conjugate, a trei subsisteme ce actioneaza intr-o stransa interdependent si care
la randul lor pot fi considerate sisteme:

- sistemul de conducere sau decisional; cu rolul de a dispune, indruma si coordona activitatea in


vederea realizarii obicetivelor fixate;
- sistemul condus, de executie sau operational; cu rolul de a executa practiv deciziile luate si de
a furniza date privind actiunile realizate sau in curs de executie
- sistemul informational; un ansamblu de fluxuri şi circuite informaţionale organizate într-o
concepţie unitară;

Sistemul informational utilizează modele, proceduri, resurse umane şi materiale pentru


transmiterea datelor şi a informaţiilor prin intermediul cărora asigură interconexiun informaţionale dintre
sistemul de conducere şi sistemul condus, dintre elementele componente ale acestor sisteme, dintre
organismul social economic pe care îl serveşte şi mediul social economic extern.

Definim sistemul informatic ca fiind un ansamblu de metode, metodologii şi tehnici şi


proceduri automate de culegere, verificare, transmitere, stocare şi prelucrare a datelor în scopul
satisfacerii cerinţelor informaţionale ale conducerii în procesul de fundamentare şi elaborare a
deciziilor.

Realizarea unui sistem informatic constă din elaborarea proiectului, a programelor asociate, a
documentaţiei de utilizare, exploatare şi întreţinere, punurea în funcţiune la cel puţin o unitate benefică
până la recepţionarea sau omologarea sa.

Elementele componente sistemului informatic:

a) Baza tehnico-materială a sistemului


b) Sistemul de programe (software-ul sistemului)
c) Baza informaţională
d) Aparatul ştiinţific şi matematic
e) Factorul uman şi cadrul organizatoric

Algoritmi

Un algoritm este o metodă de rezolvare a unei probleme printr-un număr finit de paşi. Printr-un
pas se inţelege o operaţie executabilă de către un operator. Putem spune că un algoritm seamănă cu
un proces de calcul (un complex de operaţii), cu o reţetă. !nu orice proces de calcul este un algoritm.

Un program de calculator este un complex de instrucţiuni scrise într-un anumit limbaj numit
limbaj de programare ce transcriu operaţiile dintr-un algoritm pt. un operator. Instrucţiunile unei limbaje
de programare trebui să fie de înţeles atât pt. programator cât şi pt. operator.
Proprietăţile (Caracteristicile) algoritmelor

1. Generalitatea (pt. rezolvarea mai multor probleme din aceaşi sferă)


2. Finitudinea
3. Determinismul (să cuprindă toate cazurile posibile)
4. Unicitatea (la eceleaşi intrări să obţină aceleaşi ieşiri dar prelucrarea să fie unică)
5. Claritatea/Precizia (la orice operaţie executată să se ştie ce operaţie urmează)

D.p.d.v. structural un algoritm cuprinde urm. etape:

1. Iniţializarea
2. Prelucrarea
3. Furnizarea rezultatelor

Un algoritm are 0 sau mai multe date de intrare. Aceste date se mai numesc şi date iniţiale.

Structuri de date

Organizarea datelor este un proces care cuprinde următoarele activităţi:


• Identificarea datelor
• Clasificarea şi decrierea proprietăţilor, a caracteristicilor datelor
• Gruparea datelor în colecţii de date destinate prelucrării automate
• Reprezentarea externă pe suporturi tehnice
• Identificarea, definirea şi descrierea procedurilor de prelucrare automată.

Entitatea reprezinta un obiect concret sau abstract reprezentat prin proprietatile lui.
O proprietate a unui obiect poate fi descrisa printr-o pereche(Atribut, Valoare).
Notiunea de atribut este cunoscută sub numele de camp sau caracteristica.
Fiecare atribut e caracterizat de natura valorilor pe care le poate lua.

În funcţie de obiectele pe care le prezintă, datele se pot clasifica în:

-date elementare sau scalare, care se prezintă sub forma unor entităţi indivizibile
-colecţii de date, care se prezintă sub forma unei mulţimi de date elementare, între care se
definesc şi se descriu (sau nu) anumite relaţii.

Date elementare

Pot fi tratate sub 2 aspecte:


-Nivelul fizic
-Nivelul logic
Identificarea datelor

-identificatorul de data sau numele asociat datei


-mulţimea valorilor pe care le poate lua o dată în procesul prelucrării; Precizăm faptul că în
decursul prelucrărilor există date care nu-şi poate modifica valoarea, numite constante şi date a căror
valoare se modifcă, numite variabile.
-atributele datelor precizează caracteristicile, proprietăţile acestora în procesul de prelucrare.

Prorietăţi ale datelor

-Tipul datei care specifică domeniul de valori pe care le poate lua respectiva dată în timpul
prelucrării(ex la nr:mulţimea nr reale, întregi)
-Precizia de reprezentare internă a datei, cum ar fi, pentru numere reale reprezentate în virgulă
mobilă simplă sau dublă precizie
-Alte caracteristici, cum ar fi: alinierea valorilor datei respective, valoarea iniţială, alocarea
statică sau dinamică a memoriei, etc.

Structuri de date

Se numeşte structură de date o colecţie de date pt care s-a definit un mecanism de selectare şi
identificare a elementelor. Aceasta înseamnă că pt o colecţie de date se pot introduce relaţii care să
asigure ordonarea datelor după criteriile dorite şi să faciliteze prelucrarea lor.
O structură de date poate fi secvenţială sau cu acces direct.
Structură secvenţială înseamnă identificarea unei componente se face prin parcurgerea tuturor
componentelor care se află înaintea sa, în ordinea existentă.
Structura cu acces direct înseamnă o str de date la care o componentă poate fi identificată
direct fără alte parcurgeri.

Componentele unei structuri de date pot fi


-Date elementare
-Structuri de date

Tipuri de structuri

Se numeşte tip de str de date o mulţime ordonată de date, între care s-au stabilit anuminte
relaţii şi care folosesc, pentru realizarea operaţiilor, un grup de operatori cu o anumită semantică.

După tipul componentelor str pot fi


-Omogene-contin elemente de acelasi tip
-Eterogene-contin elemente de tipuri diferite

După tipul de memorie pot fi:


-de date interne, cu caracter temporar, deoarece sunt realizate în memoria internă de tip
RAM(volatilă)
-de date externe, care au un caracter relativ permanent, deoarece sunt memorate pe suporţi
externi. Aceste structuri pot cuprinde:
-fişiere de date
-baze de date
-bănci de date

Principalele tipuri de structuri de date (logice) sunt:


-structura punctuală
-structura liniară
-structura arborescentă
-structura reţea
-structura relaţională
-masive (tablouri)
-articole (înregistrări logice)

Fişierul

Fişierul se defineşte ca o mulţime de date omogene din punct de vedere al semnificaţiei lor şi al
cerinţelor de prelucrare. Această mulţime este organizată ca o listă liniară, cu elemente structurate
arborescent. Aceste elemente ale fişierului, consiferat ca listă liniară se numesc înregistrări sau
articole.
Înregistrările au, o structură arborescentă, elementele structurii fiind numite câmpuri.

Baza de date se defineşte ca o colecţie de date (tabele şi fişiere) aflate în interdependenţă,


memorată pe suport extern împreună cu descrierea datelor şi a relaţiilor dintre ele.
Ea are sens ca element al unei bănci de date.

Banca de date reprezintă un sistem de organizare şi prelucrare, respectiv teleprelucrare a


datelor, constituit din:
• Una sau mai multe baze de date
• Un Sistem de Gestiune a Bazei de Date (SGBD) care asigură independeţa programelor
aplicative faţă de modul de structurare a datelor, o redundanţă minimă, controlată, în
memorarea acestora, precum şi timp minim de răspuns la solicitările utilizatorilor în
ansamblul lor.

Stucturi de date interne

Masivul sau tabloul

Reprezintă o structură de date omogene cu una, două sau mai multe dimensiuni. Masivul cu o
dimensiune se numeşte în mod uzual ,vector, iar cu două dimensiuni, matrice.
Fie vectorul x, cu elemente x1, x2, x3,...,xn, un tablou unidimensional cu n elemente
componente de acelaşi tip.
Fiecare element al unui tablou se identifică prin poziţia pe care o ocupă în cadrul tabloului
(rangul elementului în tablou), cu ajutorul unui indice. Prin urmare, pentru a referi un element, vom
preciza numele tabloului, urmat de un indice care precizează poziţia elementului respectiv în cadrul
tabloului. Asfel, în cadrul vectorului X, indicele=3 va referi elementul de pe poziţia trei din cadrul
vectorului, adica pe x3.
Grafuri

Neorientate

Se numeşte graf neorientat: o percece ordonată G = (X, U) unde X este o mulţime finită şi nevidă de
elemente numite noduri sau vârfuri iar U este o mulţime de pereci neordonate U = {x, y} de elemente
din X. Aceste perechi neordonate numindu-se şi muchii.
[i, j] muchie i,j elemente din X, i,j sunt extremităţile muchiei.

Având un graf G format din perechea neordonată X şi U un subgraf al lui G/ un alt graf H = (Y, V), unde
Y este inclus în X iar V este format de toate muchiile din U care unesc vârfuri din Y.

Un graf parţial al lui G este un subgraf, un alt graf P=(X, V).

Se numeşte lanţ într-un graf o succesiune de muchii de forma [i1, i2], [i2,i3] [i3,i4],...,[in-1,in]. Lungimea
lanţului este un număr dat de numărul muchiilor ce-l compun. (altă formă:[i1,i2,...,in]). Un lanţ de forma
[i1,...,in] în care il<>ik oricare ar fi l,k se numeşte lanţ elementar.

Se numeşte ciclu elementar un lanţ de forma [i1,i2,...,in,i1]. Ciclul elementar porneşte de la un lanţ
elementar.

Un vârf care este extremitatea unei singure muchii se numeşte vârf terminal.
Două vârfuri care sunt extremităţile aceleaşi muchii(sunt unite printr-o muchie) se numesc vârfuri
adiacente.
Un graf neorientat se numeşte conex dacă oricare 2 vârfuri diferite ale sale sunt unite prin cel puţin un
lanţ.

Orientate

Un graf orientat este tot o pereche (X,U) în care X este tot o mulţime de elemente numite vârfuri/noduri
iar U este o mulţime de perechi (x,y) ordonate din X.

Elementele lui U se numesc arce şi au sens de parcurgere.


Elementele lui X se numesc vârfuri/noduri.
În cazul grafurilor orientate noţiunile de lanţ şi ciclu îşi iau corespondentul noţiunile de drum şi circuit.
Mulţimea de perechi {(i1,i2),(i2,i3),…,(in-1,in)}
(i1,i2,i3,…,in) este un drum
Circuitul (i1,i2,i…,in,i1)
Drum elementar dacă elementele sunt diferite.
Circuitul elementar porneşte de la drum elementar.

Se numeşte arbore un graf neorientat conex.


2. PROBLEME REZOLVATE

PL.1. Anul trecut la vizitarea Huckleberry City am fost sfatuit sa nu ratez pentru nimic in lume cursa de
ogari. Cu toate ca era ceva nou pentur mine, am vrut totusi sa pariez, doar asa pentru a nu zice ca am
fost aici si nu am gustat din distractie. Am cules o serie de sfaturi. Primul sfatuitor mi-a spus:

- Arctiv va castiga, Bozo va fi al doilea, Candle va fi al treilea, Damon va fi al patrulea, Erasmus


va fi al cincelea iar Pinky al saselea.

Al doilea sfatuitor mi-a spus:

- Locul 1 Erasmus; 2 Damon; 3 Bozo; 4 Candle; 5 Pinky; 6 Arctic

Fiecare sfatuitor a ghicit cate trei pozitii si eu am pierdut toate pariurile. Care a fost rezultatul cursei?

Pentru simplificare notam ogarii cu prima litera a numelui si-I scriem in ordinea locului:
Primul sfatuitor: a, b, c, d, e, p
Al doilea: e, d, b, c, p, a
Singura solutie(prin eliminare) care cuprinde toate numele ogarilor fara repetitii este: a, d, b, c, e, p

PL.2. Pentru impodobirea pomului de craciun cu pachete cadou, o gradinita de copii are 320 banane,
240 bomboane si 200 mandarine. Care este nr. de pachete identice ce se pot face din aceste daruri si
cate banane, bomboane si mandarine va avea fiecare pachet? Evident, trebuie impachetat totul.

320 2*5 240 2*5 200 2*5


32 2 24 2 20 2
16 2 12 2 10 2 Raspuns: Numarul maxim este de 40
8 2 6 2 5 5
pachete cu cate 8 banane, 6 bomboane si 5
4 2 3 3 1
2 2 1 mandarine. Reducand nr. maxim se pot obtine
1 mai multe posibilitati.
PP.0 Se da o matrice de M linii si N coloane. Sa se pastreze si afiseze urmatoarele rezultate:
a) Max si min pe linii, coloane si din intreaga matrice si pozitia lor
b) Media aritmetica a elementelor nenule pe linii, coloane si matrice

#include <iostream.h> a[i][n+2] += a[i][j];


a[m+2][j] += a[i][j];
int main(int argc, char *argv[]) };
{ };
int i, j, m, n, maxa, mina, meda;
int a[100][100]; cout << "Max a: " << maxa;
meda = 0; cout << "Min a: " << mina;
cin >> m >> n; cout << "Med a: " << (meda/(m*n));
for (i = 0; i < m; i++)
{ for (i = 0; i < m; i++)
for (j = 0; j < n; j++) {
{ for (j = 0; j < n; j++)
cin >> a[i][j]; {
if (j == 0 && i == 0) if (i == 0)
{ {
maxa = a[i][j]; cout << "MaxC a[][" << j << "]: " << a[m][j];
mina = a[i][j]; cout << "MinC a[][" << j << "]: " << a[m+1][j];
} cout << "MedC a[][" << j << "]: " << a[m+2][j];
else };
{ if (j == 0)
if (maxa < a[i][j]) maxa = a[i][j]; {
if (mina > a[i][j]) mina = a[i][j]; cout << "MaxL a[" << i << "][]: " << a[i][n];
}; cout << "MinL a[" << i << "][]: " << a[i][n+1];
cout << "MedL a[" << i << "][]: " << a[i][n+2];
meda += a[i][j]; };
if (j == 0) if (a[m][j] == a[i][j]) cout << i << j;
{ if (a[m+1][j] == a[i][j]) cout << i << j;
a[i][n] = a[i][j]; //maxl if (a[i][n] == a[i][j]) cout << i << j;
a[i][n+1] = a[i][j]; //minl if (a[i][n+1] == a[i][j]) cout << i << j;
a[i][n+2] = 0; //medl if (maxa = a[i][j]) cout << i << j;
} if (mina = a[i][j]) cout << i << j;
else }
{ }
if (a[i][n] < a[i][j]) a[i][n] = a[i][j]; cin >> i;
if (a[i][n+1] > a[i][j]) a[i][n+1] = a[i][j]; return 0;
}; }

if (i == 0)
{
a[m][j] = a[i][j]; //maxc
a[m+1][j] = a[i][j]; //minc
a[m+2][j] = 0; //medc
}
else
{
if (a[m][j] < a[i][j]) a[m][j] = a[i][j];
if (a[m+1][j] > a[i][j]) a[m+1][j] = a[i][j];
};
T
STAR

Citeste
m,n
meda
=0
i=0

N i<

2
m
j=0

1
j< N
n

Citeste a[i][j] i=i+


1

i=0
N
si
j=0
maxa =
ma a[i][j]
xa< mina =
a[i]
[j]

maxa =

min
a>a
[i][j]

maxa =

meda=meda+a
N a[i]
N j=
[n] <
0
a[i][j]

a[i][n]=a[i][j]
a[i] a[i][n+1]=a[i]
[j]

a[i]
[n+1]
> a[i]
[j]
a[i][n+1]=
N

N i=
0

a[m] a[m][j]=a[i][j]
[j]< a[m+1][j]=a[i]
N
[j]
a[i]
[j]

a[m]

a[m+
1]
[j]>a[i
][j]
a[m+1][j]=a[i]
N

a[i][n+2] = a[i][n+2] +
a[i][j]
1

a[m+2][j] = a[m+2][j]
+ a[i][j]
2

meda=meda/

afiseaza
maxa,mina,meda

i=0

N
STOP i<
m
j=0

j< N
n

afiseaza "MaxC",j ,a[m]


i= i=i+
[j]
1
"MinC", j, a[m+1][j] 0
"MedC”, j, a[m+2][j]
N

afiseaza "MaxC",j ,a[m] j=


[j] 0
"MinC", j, a[m+1][j]
"MedC”, j, a[m+2][j]
N

a[m][j] = a[i][j] sau


a[m+1][j] = a[i][j]
sau
afiseaza i,j a[i][n]=a[i][j] sau a[i]
[n+1]=a[i][j] sau
maxa=[i][j] sau
j=j+
mina=a[i][j]
1
N
PP.1 Sa se realizeze schema logica a expresiei E=A+ .

#include <iostream.h>
T
STAR
int main(int argc, char *argv[])
{
Int a,b,; Citeste a,b

cin >> a >> b;


if (B != 0)
cout << “E=” << (a+sqrt(b)) B <> 0 E=A+
else
cout << “E nu are sens” N
Afiseaza e
return 0; Afiseaza “E nu
}
are sens”
STOP

PP.2 Sa se realizeze schema logica structurata pentru eval expresiei:

E = A+B dc C>=0 sau A-B dc C<0

#include <iostream.h>
T
STAR
int main(int argc, char *argv[])
{
Int a,b,c; Citeste x,n

cin >> a >> b >> c;


if (c>=0)
cout << “A+B=” << (a+b) c>=0 E=
else
cout << “A-B” << (a-b); N
return 0; E = (a-
}

Afiseaza e

STOP
PP.3. Se se realizeze schema logica a expresiei f(x)=x^n (x,n introduduse de utiliz.).

#include <iostream.h>
#include <math.h>
T
STAR
int main(int argc, char *argv[])
{
double x, n; Citeste x,n

cin >> x >> n;


if (x!=0 || (x==0 && n>0)) X<>0 ||
cout << “X la puterea n este: ” << pow ( x, n ) (x=0 && f=
else n>0)
cout << “daca X=0 at. Y>0 !”
return 0; Afiseaza f
}
N
STOP

PP.4. Se se realizeze schema logica a expresiei E = (A*A+B)/(A–B*B);

#include <iostream.h> T
STAR
int main(int argc, char *argv[])
{
double a, b; Citeste a,b

cin >> a >> b;


if ( a-b*b != 0 )
a-b*b <>
cout << “E = ” << ((a*a+b)/(a-b*b))
else 0
cout << “val a,b incorecte”;
E = (a*a+b)/(a-b*b)
return 0;
} Afiseaza e
N
STOP
PP.5 A,B,C reale si V var. booleana. Determinati V:

V = A+B+C dc X=0 sau (A+B)/C dc X=1

#include <iostream.h>
T
STAR
int main(int argc, char *argv[])
{
float a,b,c; Citeste a,b,c,x
bool x;

cin >> a >> b >> c >> x;


if ( x )
cout << “A+B/C = ” << ((a+b)/c) X=1 E = (a+b)/c
else
cout << “A+B+C” << (a+b+c); N
return 0; E=
}

Afiseaza e
STOP

PP.6. Sa se realizeze schema logica pentru determinarea mediei de varsta a unei colectivitati,
cunoscand varsta fiecarui individ. Luati in considerare urmatoarele cazuri:
a) Se stie n – nr. membrilor

b) Nu se stie n dar putem intreba “mai sunt?”

#include <iostream.h>

int main(int argc, char *argv[])


{
int n, v, a;
float med = 0;
cout << "Introduceti numarul membrilor sau 0 daca nu este cunoscut ";
cin >> n;
if ( n > 0 )
{
for (a = 0; a < n; a++ )
{
cout << "Introduceti varsta membrului #" << a+1 << " ";
cin >> v;
med = med + v;
}
}
else {
a = 1;
while (a != 0)
{
cout << "Mai sunt membri? (0 = nu)";
cin >> a;
if (a != 0) {
n++;
cout << "Introduceti varsta membrului #" << n << " ";
cin >> v;
med = med + v;
};
}
};
med = med / n;
cout << "Media este: " << med;

return 0;
}
T
STAR

Afiseaza “Introduceti nr.


membrilor sau 0 daca nu este
cunoscut”

Citeste n

Med = 0

N N
>0
A=0

Afiseaza “mai
sunt?” N=
a
Citeste a
N

A= N Citeste v
0
Med = med + v
Citeste v

a = a+1
Med = med + v

n = n+1

Med = med / n

Afiseaza med

STOP