Está en la página 1de 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, dowhile, 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 x=2; ok=0; I. i=1 (3==2) Nu II. i=2 (5==2) Nu III. i=3 (2==2) Da => ok=1

12

b) Cautare binara (vector sortat!!!) V 2 p=1 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; 5 7 8 10 13 21 25 33 36 40 u=12 41

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

2 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 3 5 2 9 7 1 13 10 11 6

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 3. 5 3 9 7 1 13 10 11 6

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 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. 13 10 11 6

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 x=33 33 15 21 16 3 54 26 34 7 41

15

21

16

54

26

34

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 1 15 1 2 2 21 3 21 3 16 4 16 4 3 5 3 5 33 54 54 6 54 6 26 7 26 7 8 8 34 9 34 9 7 7 41 10 41 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 1 15 1 15 1 2 2 21 3 2 21 3 16 4 21 3 16 4 3 5 16 4 3 5 54 3 5 54 33 54 6 26 6 26 6 26 7 34 7 34 7 8 8 7 9 8 7 9 41 34 9 41 7 41 10 41 10

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 a11 a12 a13 a14 a15 a21 a22 a23 a24 a25 a31 a32 a33 a34 a35 a41 a42 a43 a44 a45 a51 a52 a53 a54 a55 diag pp: i==j sup: i<j inf: i>j Ex: Diagonala secundara a11 a12 a13 a14 a15 a21 a22 a23 a24 a25 a31 a32 a33 a34 a35 a41 a42 a43 a44 a45 a51 a52 a53 a54 a55 diag sec: i+j==n+1 sup: i+j<n+1 inf: i+j>n+1

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(j=i+1; j<=m; j++) lucrez cu a[i][j] PARCURGERE INF DIAG PP for(i=2; i<=n; i++) for(j=1; j<i; j++) lucrez cu a[i][j] PARCURGERE SUP DIAG SEC for(i=1; i<=n-1; i++) for(j=1; j<n-i; j++) lucrez cu a[i][j] PARCURGERE INF DIAG SEC for(i=2; i<=n; i++) for(j=n-i+2; j<=m; j++) ... lucrez cu a[i][j]

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

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

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

for(i=1; i<=n; i++) for(j=n-i+1; j<=m; 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; for(i=1; i=n; i++){ f>>x; lucrez cu x }

n=5 I. i=1 x=4 lucrez cu 4(x) II. i=2 x=23 lucrez cu 23(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; for(i=1; i<=n; i++) f>>v[i]; II. Nu se cunoaste n k=0; while(f>>x){ k++; v[k]=x; }

n x1 x2 x3 xn

x1 x2 x3 xn

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. s1=informatica ; s2=bac; strcat(s1,s2); => s1=informatica bac

Ex:

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 Arbori: au n-1 muchii! Se da vectorul de tati: grafuri cu n noduri

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 mia 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; }