Sunteți pe pagina 1din 26

Teorie informatica liceu!

STRUCTURA UNUI PROGRAM C++


A. Blocul de biblioteci
#include<iostream.h> -> cout,cin,…
#include<conio.h> -> getch,…
#include<math.h> -> functii matematice (pow, sqrt, etc)
#include<string.h> -> caractere, siruri de caractere
#include<fstream.h> -> fisiere
#include<stdio.h> -> anumite functii de citire

B. Blocul de declarari
int -> numere intregi [-32000, 32000]
long -> numere intregi mai mari ca 32000 (int) sau peste 5 cifre
float -> numere reale
double -> numere reale mai mari si cu o precizie mai mare decat
cele float
unsigned -> numere natural [0, 65000]
char -> character, sisruri de caractere
 La declarare se atribuie spatiu de memorie pentru variabilele
declarate.
1000 <- adresa la care va fi memorata var a
Ex: int a; => a

spatiul de memorie

C. Functii definite de utilizator


Acest pas este optional. Discutam la functii mai detaliat!

D. Programul principal
void main(){
… Instructiunile programului principal…
getch();
}
MinGW CodeBlocks Devc++
Avem biblioteci la care se pune .h si biblioteci la care nu se pune .h.

Ex: #include<iostream>
#include<fstream>
#include<math.h>
#include<string.h>

Dupa ce includem bibliotecile punem: using namespace std;

Programul principal:
int main(){
… Instructiunile programului principal…
return 0;
}

OPERATORI MATEMATICI
+ adunare
- scadere
* inmultire
/ impartire, catul
% restul impartirii
Ex: 123/10=12 123/10=12.3(float)
123%10=3

INSTRUCTIUNI
A. Instructiunea alternativa
if (conditie) …Instructiuni1…
else …Instructiuni2…
In cazul in care conditia este adevarata se va executa setul de
Instructiuni1. In cazul in care conditia este falsa se va executa setul de
Instructiuni2.
Ex: if (nr>0) s=5+nr;
else{
nr=0-nr;
s=5+nr;
}
Ramura else este optionala => poate lipsi!
B. Instructiuni repetitive
1. Cu test initial
while (conditie_adevarata){
…Instructiuni…
}
Cat timp conditia este adevarata se vor executa Instructiunile. In
momentul in care conditia devine falsa, instructiunea repetitive cu test
initial, while, se opreste!
!!! Daca, conditia este falsa de la inceput, instructiunile nu se
executa deloc!!!

Ex. Structura repetitiva cu test initial


Citirea de numere pana la introducerea lui 0.
3 5 2 9 7 11 0
cout<<”Dati numarul”;
cin>>nr;
while(nr!=0){
…lucrez cu nr…
cout<<”Dati numarul”;
cin>>nr;
}

2. Cu test final
do{
…Instructiuni…
}while (conditie_adevarata);
Cat timp conditia este adevarata, se vor executa Instructiunile.
In momentul in care conditia devine falsa, instructiunea repetitive cu test
final, do…while, se opreste!
!!! Daca, conditia este falsa de la inceput, instructiunile se vor
executa o sigura data!!!

Ex. Structura repetitiva cu test final


Citirea de numere pana la introducerea aceleiasi valori de doua ori.
3 5 2 9 7 11 11
cout<<”Dati numarul”;
cin>>nr1;
do{
nr2=nr1;
…lucrez cu nr2…
cout<<”Dati numarul”;
cin>>nr1;
}while(nr1!=nr2);

3. FOR (cu numar cunoscut de pasi/iteratii)


for(i=val_initiala; i<=val_finala; i++){
…Instructiuni…
}
Parcurge [val_initiala, val_finala]
Ex:
1. Parcurgerea tuturor numerelor mai mici sau egale cu n => [1,n]
for(i=1; i<=n; i++)
…lucrez cu i…
2. Parcurgerea tuturor numerelor mai mici ca n => [1,n)
for(i=1; i<n; i++)
…lucrez cu i…
3. Parcurgerea tuturor numerelor [a,b]
for(i=a; i<=b; i++)
…lucrez cu i…

4. Parcurgerea tuturor numerelor (a,b)


for(i=a+1; i<b; i++)
…lucrez cu i…
5. Parcurgerea numerelor pare mai mici sau egale cu n
for(i=2; i<=n; i=i+2)
…lucrez cu i…
6. Parcurgerea [n,1], n>1
for(i=n; i>=1; i--)
…lucrez cu i…

C. Transformare din structura repetitiva cu test initial in structura


repetitiva cu test final
ex: while(cond){ if(cond)
…... do{ ….
} }while(cond);
D. Transformare din structura repetitiva cu test final in structura
repetitiva cu test initial

ex: do{ while(cond){


….. …..
}while(cond); }

E. Transformare din structura repetitiva cu numar cunoscut de pasi in


structura repetitiva cu test initial

ex: for(i=0; i<=n; i++) i=0;


….. while(i<=n) …..

F. Alte instructiuni
cout<<”Mesaj”; => afiseaza un mesaj pe ecran
cin>>variabila; => preia valoarea introdusa de utilizator de la
tastatura si o atribuie variabilei
Ex: n=5;
cout<<”Numarul “<<n<<” este natural”;
 Numarul 5este natural

VECTORI
Def.Vectorul este un tablou unidimensional. Are o singura dimensiune,
adica are doar coloane.Un vector are n elemente!

A. Declarare: int i,n;


int v[50]; -> maxim 50 de elemente de tip int
float v[100]; -> maxim 100 de elemente de tip float
long v[300]; -> maxim 30 de elemente de tip long
unsigned v[25]; -> maxim 25 de elemente de tip unsigned
Atribuie memorie pentru vectorul declarant. Vectorul nu are nici o
valoare memorata!

B. Citire
cout<<”Dati n “;
cin>>n;
for(i=1; i<=n; i++){
cout<<”Dati v[“<<i<<”]= “;
cin>>v[i];
}
n -> reprezinta dimensiunea partial, adica numarul efectiv de
casute/elemente din vector care vor fi completate cu valori.
n<=dimensiune_maxima!

C. Parcurgere
for(i=1; i<=n; i++)
… lucrez cu v[i]…

D. Afisare
for(i=1; i<=n; i++)
cout<<v[i]<<” “;
Daca trebuie sa afisez elemental de pe pozitia a treia
 cout<<v[3]
ATENTIE!!!
ELEMENTUL => v[i]
POZITIA => i
E. Algoritmi
1. Cautare pe vector
a) Cautare directa
cout<<”Dati numarul cautat “;
cin>>x;
ok=0;(presupunem ca numarul cautat nu se afla in vector)
for(i=1; i<=n; i++)
if(v[i]==x) ok=1;
if(ok==1) cout<<”Da”;
else cout<<”Nu”;
Ex: V 3 5 2 9 7 11 10 4 21 12

x=2; ok=0;
I. i=1 (3==2) Nu
II. i=2 (5==2) Nu
III. i=3 (2==2) Da => ok=1
b) Cautare binara (vector sortat!!!)
V 2 5 7 8 10 13 21 25 33 36 40 41

p=1 u=12
x=31
p=1;
u=n;
m=(p+u)/2=(1+12)/2=6
v[m]=v[6]=13
13>31 Nu
13<31 Da => p=m+1=6+1=7
m=(p+u)/2=(7+12)/2=9
33>31 Da => u=m-1=9-1=8
m=(p+u)/2=(7+8)/2=7
21>31 Nu
21<31 Da => p=m+1=7+1=8
m=(p+u)/2=(8+8)/2=8
25>31 Nu
25<31 Da => p=m+1=8+1=9
p>u => STOP 31 nu se afla in vector!

cout<<”Dati x “;
cin>>x;
p=1;
u=n;
ok=0;
while(ok==0 && p<=u){
m=(p+u)/2;
if(x>v[m]) p=m+1;
else if(x<v[m]) u=m-1;
else ok=1;
}
if(ok==1) cout<<”Da”;
else cout<<”Nu”;
2. Sotare vector
for(i=1; i<=n-1; i++)
for(j=i+1; j<=n; j++)
if(v[i]>v[j]){ -> Ordonez crescator!
aux=v[i];
v[i]=v[j];
v[j]=aux;
}
Regula paharelor

H2O
SUC

1
3

aux

a. Torn apa in paharul gol (aux).


b. Torn sucul in paharul in care a fost apa.
c. Torn apa in paharul in care a fost sucul.

V 3 5 2 9 7 1 13 10 11 6
3
Ii. i=1
Ij. j=2 (v[1]>v[2]) adica (3>7) Nu
IIj. j=3 (v[1]>v[3]) adica (3>2) Da
aux=3;
v[1]=2;
v[3]=3;

2 5 3 9 7 1 13 10 11 6
3.
IIIj. j=4 (v[1]>v[4]) adica (2>9) Nu
IVj. j=5 (v[1]>v[5]) adica (2>7) Nu
Vj. j=6 (v[1]>v[6]) adica (2>1) Da
aux=2;
v[1]=1;
v[6]=2;

1 5 3 9 7 2 13 10 11 6
4. I
VIj. j=7 (v[1]>v[7]) adica (1>13) Nu
VIIj.j=8 (v[1]>v[8]) adica (1>10) Nu
VIIIj. j=9 (v[1]>v[9]) adica (1>11) Nu
IXj. j=10 (v[1]>v[710]) adica (1>6) Nu
Pe prima pozitie a fost adusa cea mai mica valoare.

IIi. i=2
Ij. j=3… completam casuta 2 cu urmatoarea cea mai mica valoare…
s.a.m.d

Algoritmul de sortare a vectorului ne ajuta sa aducem toate valorile


negative/positive la inceputul vectorului respective sfarsitul lui!

CREARE VECTOR

int k, v[100];
.....
k=0;
if (cond){ verificam daca elementul indeplineste conditia
k++;
v[k]=element;
}

3. Interclasare vectori (vectorii trebuie sa fie vectori sortati!!!)


ADAUGARE ELEMENTE INTR-UN VECTOR
1. Adaugare la inceput
IDEE: Pentru a putea face adaugarea unui nou element la inceput unui
vector trebuie sa mutam toate elementele cu o pozitie spre sfarsitul
vectorului si apoi sa efectuam adaugarea.
15 21 16 3 54 26 34 7 41
9 8 7 6 5 4 3 2 1

15 15 21 16 3 54 26 34 7 41

x=33
33 15 21 16 3 54 26 34 7 41

cin>>x;-> elementul ce trebuie introdus pe prima pozitie


n++;-> adauga o noua casuta goala la sfarsitul vectorului
for(i=n; i>1; i--)
v[i]=v[i-1];
v[1]=x;
2. Adaugare in interior
IDEE: Trebuie sa mutam toate elementele incepand de la pozitia in care
dorim sa introducem noul element cu o pozitie spre sfarsit vectorului si
apoi sa efectuam adaugarea noului element.
(pozitia)k=5, x=33
5 4 3 2 1
15 21 16 3 54 26 34 7 41
1 2 3 4 5 6 7 8 9

15 21 16 3 54 54 26 34 7 41
1 2 3 4 5 6 7 8 9 10

15 21 16 3 33 54 26 34 7 41
1 2 3 4 5 6 7 8 9 10

cin>>k>>x; -> pozitia si elementul ce trebuie introdus


n++;-> adauga o noua casuta goala la sfarsitul vectorului
for(i=n; i>k; i--)
v[i]=v[i-1];
v[k]=x;
3. Adaugare la sfarsit
IDEE: Marim numarul elementelor cu o unitate si efectuam introducerea
noului element.
cin>>x;
n++;-> adauga o noua casuta goala la sfarsitul vectorului
v[n]=x;

STERGERE ELEMENTE DINTR-UN VECTOR


1. Stergere de la inceput
IDEE: Mutam toate elementele spre inceputul vectorului cu o pozitie si
apoi scadem numarul de elemente cu o unitate.
for(i=1; i<=n; i++)
v[i]=v[i+1];
n--;
2. Stergere din interior
IDEE: Mutam toate elementele spre interior cu o pozitie si apoi scadem
numarul de elemente cu o unitate.
(pozitia) k=5

15 21 16 3 33 54 26 34 7 41
1 2 3 4 5 6 7 8 9 10

15 21 16 3 54 26 34 7 41 41
1 2 3 4 5 6 7 8 9 10

15 21 16 3 54 26 34 7 41
1 2 3 4 5 6 7 8 9

cin>>k;
for(i=k; i<=n; i++)
v[i]=v[i+1];
n--;
3. Stergere de la sfarsit
IDEE: Scadem numarul de elemente cu o unitate si astfel eliminam
ultimul element din vector.
n--;

MATRICE
Def. O matrice este un tablou bidimensional. Are doua dimensiuni: linii
si coloane. O matrice are n*m elemente, iar daca este matrice patratica
are n*n elemente!

A. Declarare: int i,j,n,m;


int a[25][25]; -> matrice cu maxim 25 de linii si 25 de coloane cu
elemente de tip int
float a[100][100]; -> matrice cu maxim 100 de linii si 100 de
coloane cu elemente de tip float
unsigned a[25][50]; ->matrice cu maxim 25 de linii si 50 de
coloane cu elemente de tip unsigned

B. Citire
cout<<”Dati numarul de linii “;
cin>>n;
cout<<”Dati numarul de coloane “;
cin>>m;
for(i=1; i<=n; i++)
for(j=1; j<=m; j++){
cout<<”Dati a[“<<i<<”][“<<j<<”]= “;
cin>>a[i][j];
}
C. Parcurgere (operatii)
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
… lucrez cu a[i][j]…

D. Afisare
for(i=1; i<=n; i++){
for(j=1; j<=m; j++)
cout<<a[i][j]<<” “;
cout<<endl;
}
Daca vreau sa afisez elementul de pe linia 3 coloana 5
 cout<<a[3][5];

ATENTIE!!!
ELEMENTUL = a[i][j]
LINIA = i
COLOANA = j

Diagonala principala Diagonala secundara


a11 a12 a13 a14 a15 a11 a12 a13 a14 a15
a21 a22 a23 a24 a25 a21 a22 a23 a24 a25
a31 a32 a33 a34 a35 a31 a32 a33 a34 a35
a41 a42 a43 a44 a45 a41 a42 a43 a44 a45
a51 a52 a53 a54 a55 a51 a52 a53 a54 a55
diag pp: i==j diag sec: i+j==n+1
Δ sup: i<j Δ sup: i+j<n+1
Δ inf: i>j Δ inf: i+j>n+1

Ex: for(i=1; i<=n; i++)


for(j=1; j<=m; j++)
if(<conditie>) …lucrez cu a[i][j]…

Daca vreau sa parcurg linia k nu mai parcurg for pentru linii,


deoarece stiu deja ce linie vreau sa parcurg, ci voi parcurge doar for
pentru coloane, adica doar j:
 for(j=1; j<=m; j++)
… lucrez cu a[k][j]…

Daca vreau sa parcurg coloana k nu mai parcurg for pentru coloane,


deoarece stiu deja ce coloana vreau sa parcurg, ci voi parcurge doar for
pentru linii, adica doar i:
 for(j=1; j<=m; j++)
… lucrez cu a[i][k]…

LUCRUL PE LINIILE MATRICEI ex. Suma pentru fiecare linie in parte


for(i=1; i<=n; i++){
s=0; -> aici se face initializarea ca vreau suma pe fiecare linie, nu
pe toata matricea!
for(j=1; j<=m; j++)
s=s+a[i][j];
}
PARCURGERE Δ SUP DIAG PP INCLUDERE DIAGONALA
for(i=1; i<=n-1; i++) for(i=1; i<=n; i++)
for(j=i+1; j<=m; j++) for(j=i; j<=m; j++)
… lucrez cu a[i][j]… … lucrez cu a[i][j] …

PARCURGERE Δ INF DIAG PP


for(i=2; i<=n; i++) for(i=1; i<=n; i++)
for(j=1; j<i; j++) for(j=1; j<=i; j++)
… lucrez cu a[i][j]… … lucrez cu a[i][j] …

PARCURGERE Δ SUP DIAG SEC


for(i=1; i<=n-1; i++) for(i=1; i<=n; i++)
for(j=1; j<n-i; j++) for(j=1; j<=n-i; j++)
… lucrez cu a[i][j]… … lucrez cu a[i][j] …

PARCURGERE Δ INF DIAG SEC


for(i=2; i<=n; i++) for(i=1; i<=n; i++)
for(j=n-i+2; j<=m; j++) for(j=n-i+1; j<=m; j++)
... lucrez cu a[i][j]… … lucrez cu a[i][j] …

FISIERE
Fisierele sunt folosite pentru a facilita citirea de informatii, respectiv
scrierea rezultatelor si pastrarea lor.

#include<fstream.h>

A. Declarare
ifstream f(“nume_fisier.extensie”); -> fisier de citire
ofstream g(“nume_fisier.extensie”); -> fisier de scriere
Extensia fisierului poate fi: txt, in, out.

B. Citire din fisier


f>>x;

C. Scriere in fisier
g<<x;

Fisierul are un pointer de citire. Citirea datelor dintr-un fisier se


face in felul urmator: se citeste prima valoare din fisier si pointer-ul de
citire trece la urmatoarea valoare. Pointer-ul de citire stie sa citeasca date
doar inainte nu si inapoi!!!
I. Citirea a mai multor numere din fisier cand se stie numarul
acestora, adica se da n!

f: 5

4 23 15 9 53

f>>n; n=5
for(i=1; i=n; i++){ I. i=1 x=4 lucrez cu 4(x)
f>>x; II. i=2 x=23 lucrez cu 23(x)
… lucrez cu x… III. i=3 x=15 lucrez cu 15(x)
} IV. i=4 x=9 lucrez cu 9(x)
V. i=5 x=53 lucrez cu 53(x)

II. Citirea a mai multor numere din fisier cand nu se stie numarul
acestora, adica nu se da n!

f: 4 23 15 9 53

while(f>>x){
… lucrez cu x…
}
Pentru fisiere avem si doua functii speciale:
eof() -> end of file. Returneaza true cand se ajunge la sfarsitul fisierului.
eoln() -> end of line. Returneaza true cand se ajunge la sfarsitul liniei.
Ex: while(!f.eof())
while(!f.eoln()){
f>>x;
… lucrez cu x…
}

CREARE VECTOR DIN FISIER


I. Se cunoaste n
f>>n;
n
for(i=1; i<=n; i++)
f>>v[i]; x1 x2 x3 … xn

II. Nu se cunoaste n
k=0;
while(f>>x){ x1 x2 x3 … xn
k++;
v[k]=x;
}

CREARE MATRICE DIN FISIER


Pentru crearea unei matrice din fisier trebuie sa cunoastem numarul de
linii si numarul de coloane! Cand aceste valori nu se cunosc crearea
matricei se face mai complicat. In cazul in care gasim variante cu asa ceva
va voi explica atunci cum se face. Indicatie: se face cu eof() si eoln(),
functii pe care nu le-ati invatat :D
f>>n>>m;
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
f>>a[i][j];

Dupa ce terminati programul cu fisiere nu uitati sa inchideti fisierele:


f.close();
g.close();

SIRURI DE CARACTERE
#include <string.h>
A. Declarare
char c; -> declara un singur character (ex: „a‟, „2‟, …)
char s[25]; -> declara un sir de caractere (ex: „informatica‟, „bac la info‟…)

B. Citire
cin>>c;-> asa citesc un singur character. Nu am nevoie de cin.get!
cin>>s;-> asa citesc un sir de caractere daca stiu ca nu am spatii in sir!
cin.get(s,25); -> asa citesc un sir de caractere cu spatii!
Daca am de citit mai multe siruri de caractere cu spatii:
char s1[25], s2[30], s3[15];

cin.get(s1,25);
cin.get();
cin.get(s2,30);
cin.get();
cin.get(s3,15);

C. Afisare
cout<<c;
cout<<s; -> indifferent de cum este sirul de caractere!

D. Functii pentru siruri de caractere


1. Strlen() -> returneaza numarul de caractere dintr-un sir de
caractere.
Ex: s=”informatica”
strlen(s); => 11
2. Strcpy(s1,s2) -> copiaza in s1 pe s2.
Ex: s2=”informatica”;
strcpy(s1,s2); => s1=”informatica”;

s1=”informatica”;
s2=”bac”;
strcpy(s1,s2); => s1=”bac”
strcpy(s1+2,s1+5); =>pastrez primele 2 caractere din s1 si copiezi
din s1 de pe pozitia 5! => s1=”inmatica”
3. Strncpy(s1,s2,nr) -> copiaza in s1 nr caractere din s2.
Ex: s2=”informatica”;
strncpy(s1,s2,4); => s1=”info”;

s1=”informatica”;
s2=”bac”;
strncpy(s1,s2,2); => s1=”ba”

4. Strcat(s1,s2) -> lipeste la s1 sirul s2.


Ex: s1=”informatica “;
s2=”bac”;
strcat(s1,s2); => s1=”informatica bac”

5. Strncat(s1,s2,nr) -> lipeste la s1 nr caractere din s2.


Ex: s1=”bac “;
s2=”informatica”;
strncat(s1,s2,4); => s1=”bac info”
Se foloseste la crearea de noi siruri de caractere!

6. Strchr(s,c) -> returneaza subsirul de caractere obtinut incepand


cuprima aparitie a caracterului c in sirul s.
Ex: s=”bacalaureat”;
nou=strchr(s, „a‟); => nou=”acalaureat”

s=”bacalaureat”;
c=‟a‟;
nou= strchr(s,c); => nou=”acalaureat”
Aceasta functie este utilizata si pentru a stabili daca un caracter din sir
este sau nu vocala:
Ex: if(strchr(“AEIOUaeiou”, s[i]) !=0) => s[i] este vocala
if(strchr(“AEIOUaeiou”, s[i]) ==0) => s[i] nu este vocala

7. Strrchr(s,c) -> returneaza subsirul de caractere obtinut incepand


cu ultima aparitie a caracterului c in sirul s.
Ex: s=”bacalaureat”;
nou=strrchr(s, „a‟); => nou=”at”

s=”bacalaureat”
c=‟a‟;
nou=strrchr(s,c); => nou=”at”

8. Strstr(s1,s2) -> returneaza subsirul de caractere obtinut


incepand cu prima aparitie a sirului s2 in s1.
Ex: s1=”bacalaureat”;
s2=”lau”;
nou=strstr(s1,s2); => nou=”laureat”

9. Strcmp(s1,s2) -> compara cele doua siruri de caractere tinand


cont de litere mari si mici.
10. Strncmp(s1,s2,nr) -> compara primele nr caractere din s1 cu
primele nr caractere din s2 tinand cont de litere mari si mici.
11. Stricmp(s1,s2) ->compara cele doua siruri de caractere fara a
tine cont de litere mari si mici.
12. Strnicmp(s1,s2,nr) -> compara primele nr caractere din s1 cu
primele nr caractere din s2 fara a tine cont de litere mari si mici.
13. Functii de transformare din sir de caractere in numar
nr1=atoi(s1); -> transforma sirul in numar de tip int
nr2=atol(s2); -> transforma sirul in numar de tip long
nr3=atof(s3); -> transforma sirul in numar de tip float
14. Functii de transformare din numar in sir de caractere
itoa(nr1, s1, 10); -> transforma din numar de tip int in sir
ltoa(nr2, s2, 10); -> transforma din numar de tip long in sir
ftoa(nr3, s3, 10); -> transform din numar de tip float in sir

Functiile strcmp, strncmp, stricmp si strnicmp retuneaza:


1, daca s1>s2
0, daca s1=s2
-1, daca s1<s2
Aceste functii se folosesc in conditii, cum ar fi:
if(strcmp(s1,s2)==1) cout<<”Sirurile sunt egale”;
else cout<<”Sirurile nu sunt egale”;

E. Eliminare spatii inutile


1. De la inceputul sirului

while(s[0]==‟ „)
strcpy(s,s+1);

2. De la sfarsitul sirului

while(s[strlen(s)-1]==‟ „)
strcpy(s+strlen(s)-1, s+strlen(s));

3. Din interiorul sirului

for(i=1;i<=strlen(s)-1;i++)
if(s[i]==‟ „ && s[i+1]==‟ „)
strcpy(s+i, s+i+1);

LITERA MICA => s[i] є [„a‟, „z‟]


LTERA MARE => s[i] є [„A‟, „Z‟]
CIFRA => s[i] є [„0‟, „9‟]
TRANSFORMARE LITERA MICA IN LITERA MARE => s[i]=s[i]-32;
TRANSFORMARE LITERA MARE IN LITERA MICA => s[i]=s[i]+32;

LISTE|COZI|GRAFURI NEORIENTATE|GRAFURI ORIENTATE


SI ARBORI!

Listele sunt de tip FIFO (first in fist out). Operatiile de adaugare si


eliminare se fac prin varful stivei! Ganditi-va la stiva (teancul) de carti,
caiete, etc!
Cozile sunt de tip LIFO (last in first out). Operatiile de adaugare se fac la
sfarsitul cozii si cele de eliminare la inceputul cozii! Ganditi-va la coada
de la magazin!
Grafuri neorientate cu n varfuri si m muchii:
- Suma gradelor tuturor varfurilor este egala cu 2*m
- Se pot forma grafuri cu n noduri
Arbori: au n-1 muchii!
Se da vectorul de tati:
T(6,6,5,0,6,4,4,7) => 6 este tatal cu cei mai multi fii
1 2 3 4 5 6 7 8 (cele 8 noduri) => 4 frunze: 1,2,3,8 frunze!
Grafuri orientate:
- = gradul exterior (arcele care ies din nod)
- = gradul interior (arcele care intra in nod)
- = multimea nodurilor care pleaca (ies) din nod
- = multimea nodurilor care intra in nod
- = multimea arcelor care ies din nod
- = multimea arcelor care intra in nod

Algoritmi
1. Algoritmul de divizori.

Idee: Un numar il are ca divizor pe d daca numarul impartit la d da


restul 0. Adica: n%d=0. Noi trebuie sa il gasim pe d.
Un numar are divizori, in afara de 1 si el insusi, de la 2 la n/2.
Pas1. Parcurg posibilii divizori ai numarului n, adica [2,n/2].
Pas2. Daca n se imparte la vre-un numar din intervalul [2,n/2] atunci
numarul respectiv este divizor pentru n.
Pas3. Fac ce imi cere problema cu divizorul gasit.

COD:
for(div=2;div<=n/2;div++)
if(n%div==0) ...

Ex: Se da un numar n de la tastatura. Sa se calculeze suma divizorilor lui


n.
#
#
int n,div,s;
void main(){
cout<<”Dati n= „;
cin>>n;
s=0;
for(div=2;div<=n/2;div++)
if(n%div==0) s=s+div;
cout<<”Suma divizorilor lui n este „<<s;
}
Obs: Algoritmul de divizori e cel boldat. Mai departe am facut ce mi-a
cerut problema sa fac cu divizorii numarului n, respectiv suma lor.

2. Algoritmul de numar prim.

Idee: Ce este numarul prim? Numarul prim este un numar care


are doar divizori proprii, adica pe 1 si el insusi. Asadar, daca are alti
divizori in afara de 1 si el insusi numarul respectiv nu este numar prim.

Pas1. Presupun ca numarul n este numar prim: ok=1.


Pas2. Introduc algoritmul de divizori. (Parcurg posibilii divizori ai
numarului n, adica [2,n/2]. Daca n se imparte la vre-un numar din
intervalul [2,n/2] atunci numarul respectiv este divizor pentru n.)
Pas3. Daca gasesc un divizor => numarul meu n nu este prim: ok=0.
Pas4. Verific vloarea lui ok (daca este 1) si fac ce imi cere problema.
COD:
ok=1;
for(div=2;div<=n/2;div++)
if(n%div==0) ok=0;
if(ok==1) ...

Ex. Sa se verifice daca numarul n este prim sau nu.


#
#
int n,div,ok;
void main(){
cout<<”Dati n= „;
cin>>n;
ok=1;
for(div=2;div<=n/2;div++)
if(n%div==0) ok=0;
if(ok==1) cout<<”Numarul „<<n<<” este numar prim”;
else cout<<”Numarul „<<n<<” nu este numar prim”;
}
Obs: Algoritmul de numar prim e cel boldat. Mai departe am facut ce mi-
a cerut problema sa fac. Recunoasteti ca liniile de cod colorate cu rosu
reprezinta algoritmul de divizori!

3. Cum lucram cu ok si cand


Caz I. Problema ne cere sa verificam daca cel putin un numar
indeplineste conditia.
Idee: In acest caz, presupunem ca nici un numar nu indeplineste
conditia (ok=0). Daca gasim un numar care indeplineste conditia atunci
ok=1;
Pas1. Presupun ca nici un numar nu indeplineste conditia: ok=0
Pas2. Parcurg posibilele numere
Pas3. Daca gasesc un numar care indeplineste conditia: ok=1
Pas4. Verific vloarea lui ok (daca este 1) si fac ce imi cere problema.

Ex. Se da un vector v. Sa se verifice daca printre elementele vectorului se


alfa un numar par.
#
#
int v[50],n,i,ok;
void main(){
cout<<”Dati n= „;
cin>>n;
for(i=1;i<=n;i++){
cout<<”dati v[„<<i<<”]= „;
cin>>v[i];
}
ok=0;
for(i=1;i<=n;i++)
if(v[i]%2==0)ok=1;
if(ok==1) cout<<”Da”;
else cout<<”Nu”;
}

Caz II. Problema ne cere sa verificam daca toate numerele


indeplinesc conditia.
Idee: In acest caz, presupunem ca toate numerele indeplinesc
conditia (ok=1). Daca gasim un numar ca nu indeplineste conditia =>
ok=0.
Pas1. Presupun ca toate numerele indeplinesc conditia: ok=1
Pas2. Parcurg posibilele numere
Pas3. Daca gasesc un numar care nu indeplineste conditia => ok=0
Pas4. Verific vloarea lui ok (daca este 1) si fac ce imi cere problema.

Ex. Se da un vector v. Sa se verifice daca toate elementele vectorului sunt


pare.
#
#
int v[50],n,i,ok;
void main(){
cout<<”Dati n= „;
cin>>n;
for(i=1;i<=n;i++){
cout<<”dati v[„<<i<<”]= „;
cin>>v[i];
}
ok=1;
for(i=1;i<=n;i++)
if(v[i]%2!=0)ok=0;
if(ok==1) cout<<”Da”;
else cout<<”Nu”;
}

4. Min si max pe un vector


Pas1. Initializez min, max cu primul element din vector, adica cu v[1]
Pas2. Parcurg restul de elemente ale vectorului, adica intervalul [2,n]
pentru ca pe v[1] l-am luat deja cand am initializat min si max.
Pas3. Verific cum este v[i] fata de min si fata de max si inlocuiesc min sau
max daca se indeplineste conditia.

COD:
#
#
int v[50],min,max,i;
void main(){
Citesc n;
Citesc vectorul v;
min=v[1];
max=v[1];
for(i=2;i<=n;i++){
if(v[i]>max) max=v[i];
if(v[i]<min) min=v[i];
}
cout<<max<<” „<<min;
}

S-ar putea să vă placă și