0% au considerat acest document util (0 voturi)
26 vizualizări127 pagini

Info

Încărcat de

alexiaforga
Drepturi de autor
© © All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca DOCX, PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
26 vizualizări127 pagini

Info

Încărcat de

alexiaforga
Drepturi de autor
© © All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca DOCX, PDF, TXT sau citiți online pe Scribd
Sunteți pe pagina 1/ 127

Probleme cu operatori

1. interschimbare
Fie a, b două variabile reale. Să se interschimbe valorile celor două variabile
Varianta 1. folosind o variabilă auxiliară.
Varianta 2. folosind o functie standard
Varianta 3. prin scaderi repetate
#include<iostream>
using namespace std;

int main()
{
///declararea variabilelor
float a,b,aux;
///citirea datelor de intrare
cout<<"a= "; cin>>a;
cout<<"b= "; cin>>b;
///Varianta 1 algoritm de rezolvare interschimbare folosind o variabila auxiliara
aux=a;
a=b;
b=aux;
///Varianta 2 interschimbare folosind functia swap
swap(a,b);
///afisarea datelor de iesire
cout<<"a= "<<a<<endl;
cout<<"b= "<<b;
return 0;
}

///Varianta 3
#include<iostream>
using namespace std;

int main()
{
///declararea variabilelor
float a,b,aux;
///citirea datelor de intrare
cout<<"a= "; cin>>a;
cout<<"b= "; cin>>b;
///Varianta 3 cu sacderi repetate
a=a+b;
b=a-b;
a=a-b;
///afisarea datelor de iesire
cout<<"a= "<<a<<endl;
cout<<"b= "<<b;
return 0;
}
2. suma_cifre
Scrieți programul care citește de la tastatură un numar natural de patru cifre și calculează suma
cifrelor lui.
nr=4751
se va afisa suma= 4+7+5+1=17

#include <iostream>
using namespace std;

int main()
{
///declararea variabilelor
unsigned int nr;
///citirea datelor de intrare
cin>>nr;
///rezolvarea cerintei si afisarea datelor de iesire
cout<<"Suma cifrelor este: "<<nr%10+nr/10%10+nr/100%10+nr/1000;
return 0;
}

3. cifra_mijloc
Se citeste de la tastatura un numar natural de cinci cifre. Sa se afiseze cifra din mijloc.

#include<iostream>
using namespace std;

int main()
{
unsigned int x;
cout<<"x= "; cin>>x;
cout<<"cifra din mijloc este: "<<x/100%10;
return 0;
}
4. media_aritmetica
Se citeste de la tastatura un numar natural de trei cifre. Sa se afiseze media aritmetica a
cifrelor.

5. numar_faraciframijloc
Se citeste de la tastatura un numar natural format din cinci cifre. Sa se afiseze numarul dupa
eliminarea cifrei din mijloc.
nr=12345 nr=1245

6. succesor_predecesor
Se citeste de la tastatura un numar intreg. Sa se afiseze predecesorul numarului citit, numarul
citit si succesorul numarului citit.

7. inversul
Se citeste un numar natural format din trei cifre. Sa se afiseze inversul numarului.
Pbinfo 1273, 2764, 2199, 3328, 2263, 2201

1. ALGORITMI

Noțiuni introductive

Pentru a înțelege noțiunea de algoritm pornim de la un exemplu din viața de toate zilele.

Exemplu: Algoritmul de a răspunde la un apel telefonic:

Pasul 1- Alerta sonoră - START

Pasul 2- Identificarea apelului

Pasul 3- Pregătirea pentru a răspunde

Pasul 4-Salutul

Pasul 5- Ascultarea interlocutorului

Pasul 6- Răspunsul adecvat

Pasul 7- Finalizarea apelului

Pasul 8- STOP

Exemplu: Se citește un număr întreg. Să se verifice dacă un numărul dat este nul sau nu.

Pasul 0- START

Pasul 1- Citim numărul

Pasul 2- Comparăm numărul este egal cu zero sau nu, stabilind valoarea de adevăr

Pasul 3- Se tipărește mesajul corespunzător

Pasul 4- STOP

Prin algoritm vom înţelege o metodă de rezolvare a unei probleme de un anumit tip .

Algoritmul este o succesiune finită de operaţii cunoscute, care se execută într-o ordine

stabilită astfel încât plecând de la datele de intrare, ce îndeplinesc anumite condiţii, să

obţinem într-un interval de timp finit, datele de ieșire (soluția problemei).

Caracteristicile algoritmului:

1. Claritate - Algoritmul trebuie să fie descrie exact, fără ambiguități

2. Finitudine- Orice algoritm trebuie să ofere rezultatul într-un timp finit. El trebuie să

fie și efficient, adică să conțină varianta cea mai simplă de rezolvare a unei probleme,

înțelegând prin aceasta, cea care necesită un efort minim de calcul.


3. Generalitate- Orice algoritm trebuie să resolve o întreagă clasă de probleme

4. Unicitatea – Pentru aceleași date de intrare se obțin întotdeauna aceleași date de

ieșire

Etapele rezolvării unei probleme cu ajutorul algoritmilor:

1. Enunțarea problemei

2. Identificarea datelor de intrare și a datelor de ieșire

3. Elaborarea algoritmului de rezolvare a problemei

4. Transpunerea algoritmului într-un limbaj de programare (C/C++, Python, Java,..)

5. Verificarea corectitudinii algoritmului (testarea programului și corectarea

erorilor)

6. Analiza complexității algoritmului

Exemplu:

1. Enunțarea problemei x

-2 , x<0

Se consideră funcția f:R→R f(x)= 3 , x=0

x+2, x>0

2. Identificarea datelor de intrare și de ieșire

Date de intrare: x (4 valori) -3.1 7 0 2.23

Date de ieșire: f(x) (4 valori) f(-3.1) f(7) f(0) f(2.23)

3. Elaborarea algoritmului de rezolvare

Se execute de 4 ori etapele:

- Se citește valoarea lui x

- Daca x<0 calculam f(x)= x

-2
Daca x=0 afisam f(x)=3

Daca x>0 calculam f(x)=x+2

- Afisarea rezultatului (datelor de iesire)

4. Transpunerea algoritmului într-un limbaj de programare (C/C++, Python, Java,..)

5. Verificarea corectitudinii algoritmului (testarea programului și corectarea erorilor)

6. Analiza complexității

Q&A

1. Ce este un algoritm?

Răspuns: Un algoritm este o secvență finită de operații bine definite executate într-un

anumită ordine pentru a rezolva o problemă specifică.

2. Care sunt caracteristicile unui algoritm?

Răspuns: Caracteristicile unui algoritm sunt: claritate, finitudine, generalitate și unicitate.

3. Care sunt pașii implicați în rezolvarea unei probleme folosind algoritmi?

Răspuns: Pașii în rezolvarea unei probleme folosind algoritmi include: enunțarea problemei,

identificarea datelor de intrare și de ieșire, proiectarea algoritmului, transpunerea

algoritmului într-un limbaj de programare, testarea/verificarea corectitudinii și analiza

complexității.

2. Limbajul C++

Un limbaj de programare este un set de reguli, simboluri şi cuvinte speciale folosite

pentru a scrie un program.

Orice limbaj de programare este caracterizat de:

• Sintaxa – totalitatea regulilor care descriu modul de alcătuire corectă a progamului

• Semantica- se referă la înțelesul structurilor obținute prin combinarea cuvintelor

acceptate de limbaj.

Programul este un ansamblu de instrucțiuni, scrise într-un limbaj de programare, pe

care calculatorul le execută pentru a indeplini o anumită sarcină. Atunci cand se concepe un
program, este necesar să se acorde atenție atât sintacticii, cât și semanticii.

Fisierul care conține programul C++ se numește program sursa și are extensia “.cpp”.

Folosind un program special numit compilator (CodeBloks 13.12) cu ajutorul căruia vom

,,traduce” programul C++ în limbajul înteles de calculator (limbajul cod-masina format din

cifre de 0 și 1). Această operație se numește compilarea programului.

In urma compilării, calculatorul ne va semnala eventualele erori care impiedică

executarea programului.

Dacă un program nu mai conține erori de sintaxa, deci este corect din punct de vedere

sintactic, nu înseamnă că este corect si d.p.d.v. semantic (al realizării sarcinii pentru care a

fost conceput).

Instalare CodeBlocks

https://www.pbinfo.ro/ajutor/26/instalare-code-blocks

3. Elaborarea algoritmului de rezolvare

Se execute de 4 ori etapele:

- Se citește valoarea lui x

- Daca x<0 calculam f(x)= x

-2

Daca x=0 afisam f(x)=3

Daca x>0 calculam f(x)=x+2

- Afisarea rezultatului (datelor de iesire)

4. Transpunerea algoritmului într-un limbaj de programare (C/C++, Python, Java,..)

5. Verificarea corectitudinii algoritmului (testarea programului și corectarea erorilor)

6. Analiza complexității

Q&A

1. Ce este un algoritm?

Răspuns: Un algoritm este o secvență finită de operații bine definite executate într-un

anumită ordine pentru a rezolva o problemă specifică.

2. Care sunt caracteristicile unui algoritm?


Răspuns: Caracteristicile unui algoritm sunt: claritate, finitudine, generalitate și unicitate.

3. Care sunt pașii implicați în rezolvarea unei probleme folosind algoritmi?

Răspuns: Pașii în rezolvarea unei probleme folosind algoritmi include: enunțarea problemei,

identificarea datelor de intrare și de ieșire, proiectarea algoritmului, transpunerea

algoritmului într-un limbaj de programare, testarea/verificarea corectitudinii și analiza

complexității.

2. Elemente de bază ale limbajului C++. Tipuri de date.

Un limbaj de programare este un set de reguli, simboluri şi cuvinte speciale folosite pentru

a scrie un program.

Orice limbaj de programare este caracterizat de:

• Sintaxa – totalitatea regulilor care descriu modul de alcătuire corectă a progamului

• Semantica- se referă la înțelesul structurilor obținute prin combinarea cuvintelor

acceptate de limbaj.

2.1. Structura programelor C/C++

Programul este un ansamblu de instrucțiuni, scrise într-un limbaj de programare, pe

care calculatorul le execută pentru a îndeplini o anumită sarcină. Atunci când se concepe un

program, este necesar să se acorde atenție atât sintacticii, cât și semanticii.

Fișierul care conține programul C++ se numește program sursa (este un fișier text) și

are extensia .cpp

Folosind un program special numit compilator cu ajutorul căruia vom ,,transpune”

programul C++ în limbajul înteles de calculator (limbajul cod-masina format din cifre de 0

și 1). Această operație se numește compilarea programului.

In urma compilării, calculatorul ne va semnala eventualele erori care impiedică

executarea programului.

Dacă un program nu mai conține erori de sintaxa, deci este corect din punct de vedere

sintactic, nu înseamnă că este corect si d.p.d.v. semantic (al realizării sarcinii pentru care a

fost conceput).

Instalare CodeBlocks este un IDE, nu un compilator(integrated development


environment- software application, adică, pentru compilare, folosește un compilator din

altă sursă, care trebuie să fie instalat.

https://www.pbinfo.ro/ajutor/26/instalare-code-blocks

Obs: Dacă nu funcționează, urmărește https://drive.google.com/drive/u/0/folders/1TWwk0-

61S5vJGsQsEr6zqapXAMqPjgHm

2.1.1. Vocabularul limbajului

Este format din: setul de caractere

identificatori

separatori

comentarii

Setul de caractere folosește setul de caractere al codului ASCII și este format din

litere a-z, A-Z

cifre 0-9

caractere speciale + -* / = ^( )[ ] # { % ! blank (spațiu)

caractere negrafice (cu diferite funcții speciale: \n – rând nou, \t - TAB,

\b – backspace, \v – TAB vertical, \f – salt de pagină

Identificatorii sunt de două tipuri:

Identificatori utilizator cu ajutorul cărora asociem nume constantelor, variabilelor,

funcțiilor, programelor, etc. Sunt succesiuni de litere, cifre sau underscore (maxim 32

caractere).

!!! pe prima poziție NU trebuie să fie cifră

Identificatorii standard sunt cuvinte cheie ale limbajului,

ex: if, for,while, break, case, return, etc.


ATENȚIE:Limbajul C/C++ este case sensitive (face distincție între literele mari și mici)

Separatorii se folosesc pentru a delimita unitățile sintactice:

space(blank), TAB,

; pentru a separa instrucțiunile,marcând sfârșitul de linie,

, separă elementele unei liste,

caracterele de control CR+LF generate de tasta Enter.

Comentariile sunt explicații pe care programatorii le scriu pentru claritatea programului.

Un comentariu pe mai multe rânduri este cuprins între /*comentariu pe mai multe rânduri*/,

iar pt o nuantare se poate folosi /** comentariu nuantat */.

Comentariu pe un singur rând începe cu // nefiind necesara marcarea finalului

//comentariu pe un rând

2.1.2. Descrierea structurii unui program C/C++

Prelucrările dintr-un program C++ sunt grupate în funcţii. Rezolvarea unei probleme se face

prin utilizarea unor funcţii definite în limbaj şi/sau a unor funcţii scrise de programator,

atunci când funcţiile deja existente nu sunt suficiente.

Funcţiile pe care limbajul le pune la dispoziţia utilizatorului sunt grupate, după tipul de

prelucrare oferit, în mai multe fişiere numite "biblioteci" (fişiere header). Pentru a putea

utiliza în program o funcţie trebuie să se specifice la începutul programului numele

bibliotecii care conţine funcţia respectivă.

Cel mai simplu program C++

#include<iostream> //fișier antet ce trebuie declarat, introduce conținutul bibliotecii

//standard iostream pentru citire/scriere

using namespace std; //instrucțiunea elimină nevoia de introducere a semnificației std


//înaintea fiecărei referiri la cout (std::cout)

int main() //antetul funcției principale, orice program trebuie să conțină o funcție main,

{|

//instrucțiuni | corpul funcției delimitat de acolade

return 0; |

Obs:

1. Un program are obligatoriu o funcție pricipală și numai una (main)

2. () se atașează oricărei funcții și conțin lista parametrilor

3. Instrucțiunile se încheie cu ;

Crearea unui program folosind CodeBlocks (fisier.cpp)

https://drive.google.com/drive/u/0/folders/1TWwk0-61S5vJGsQsEr6zqapXAMqPjgHm

2.2. Citire / scriere in C++

Formatarea citirii și afișării se face prin intermediul unor funcții speciale, numite

manipulatori. O parte dintre ele se află în fișierele header fstream și iostream (probabil deja

incluse), altele se află în fișierul header iomanip – care trebuie și el inclus.

În limbajul C++ sunt predefinite următoarele dispozitive logice de intrare/ieșire:

▪ cin - console input - dispozitivul de intrare (tastatura)

▪ cout - console output - dispozitivul de iesire (monitorul)

Pentru a efectua citiri/scrieri trebuie utilizata directiva #include<iostream>

Pentru a realiza scrieri pe ecran folosim cout<< (<< operatorul de inserare în stream -

introducere în flux)

Forma generală pentru operația de scriere:

cout<<a1<<a2<<....<<an;

unde a1,a2,...an sunt variabile sau constante.

Principiul de execuție:
▪ se scrie a1

▪ se scrie a2

...........

▪ se scrie an

Constantele de tip șir de caractere se scriu între două caractere ghilimele.

Ex: “ acesta este un sir”

In mod normal datele se scriu una după alta, fără a lăsa spațiu între ele, daca se dorește

spațiu acesta se tipărește separat.

Ex: cout<<a<<” “<<b;

programe- cout.pdf

Afișarea poate fi formatată precizându-se:

- lungimea – folosim #include<iomanip> pentru utilizarea manipulatorului

setw(valoare)

- precizia- folosim #include<iomanip> pentru utilizarea manipulatorului

setprecision(valoare)

- alinierea left, right, internal

- caracterul de umplere setfill(‘caracter’)

- baza de numerație dec, oct, hex

Aplicații:

cout << "|" << 2019 << "|" << endl;

cout << "|" << setw(10) << 2019 << "|" << endl;

cout << "|" << setw(10) << 2019 << "|" << endl;

cout << "|" << setw(10) << left << 2019 << "|" << endl;

cout << "|" << setw(10) << right << 2019 << "|" << endl;

cout << setw(10) << internal << 2019 << endl;


cout << setw(10) << setfill('#') << 2019 << endl;

int n = 97;

cout << "implicit: " << n << endl;

cout << "decimal: " << dec << n << endl;

cout << "octal: " << oct << n << endl;

cout << "hexadecimal: " << hex << n << endl;

cout << setprecision(7) << 100 * pi << endl;

Pentru a realiza citirile folosim cin>> (>> operatorul de extragere din stream - extracție din

flux).

Forma generală pentru operația de citire:

cin>> a1>>a2>>....>an;

unde a1,a2,...an sunt variabile de un tip oarecare.

Principiul de executie:

▪ se citeste a1

▪ se citeste a2

...........

▪ se citeste an

Dacă se citesc mai multe variabile, se apasă enter între valorile introduce

char x,y,z;

cin >> x >> y >> z; // A B C

cout << x << y << z; //ABC

2.3. Tipuri de date

Tipul de date reprezintă un concept foarte important în C/C++.

Orice dată (constantă sau variabilă) este de un numit tip. Tipul datei precizează ce valori

poate avea acea dată și ce operații se pot face cu ea.

Tipul de dată precizează:


- mulţimea valorilor pe care le poate lua;

- modul în care se reprezintă în memorie;

- operaţiile care se pot efectua asupra ei.

În limbajul C/C++ putem folosi următoarele tipuri de date:

● Tipuri simple/standard (predefinite)- sunt cunoscute de limbaj fără a fi definite în

cadrul programului

o Tipul int

o Tipurile float și double

o Tipul char

o Tipul pointer

o Tipul bool

o Tipul void

Gama de valori poate fi extinsa prin modificatorii de tip desemnati prin cuvintele cheie:

signed, unsigned, short si long.

• Tipuri definite de utilizator (derivate)

o Tipul tablou

o Tipul structură/clasa

o Tipul enumerare

Aceste limite ale intervalelor sunt definite în fişierul header climits:

http://msdn.microsoft.com/en-us/library/296az74e.aspx

pot fi găsite constante precum INT_MAX (valoarea maximă a unui tip int) și INT_MIN

(valoarea minimă a unui tip int). Aceste constante sunt utile atunci când doriți să lucrați cu

valori extreme sau să verificați depășirea limitelor pentru variabile întregi.

Aplicatie pentru obtinerea limitelor domeniului int, unsigned int

///https://learn.microsoft.com/ro-ro/cpp/c-language/cpp-integer-limits?view=msvc-170

#include<climits>

#include<iostream>

using namespace std;


int main()

cout<<INT_MAX<<" "<<INT_MIN<<endl;///2147483647 -2147483648

cout<<USHRT_MAX <<endl;///unsigned short.65535

cout<<UINT_MAX<<endl;///Maximum value for a variable of unsigned int.4294967295

cout<<ULONG_MAX;///4294967295

return 0;

Tip de date Reprezentare

in memorie Valori memorate

int de regulă pe 4

octeți

poate memora valori întregi pozitive sau negative din

[−231

,2

31−1], adică

[−2.147.483.648, 2.147.483.647]

În probleme, dacă datele întregi nu depășesc (aproximativ) 2.000.000.000 folosim tipul int.

Pentru datele care depășesc această valoare vom folosi tipul long long.

signed int 4 octeți cu semn La fel ca int. Valori întregi din [−231

,2

31−1],
adică [−2147483648, 2147483647]

unsigned int 4 octeți fără

semn

Valori naturale din [0, 2

32−1], adică

[0, 4294967295].

long 4 octeți cu semn La fel ca int. Echivalent cu long int.

unsigned long 4 octeți fără

semn

La fel ca unsigned int.

Echivalent cu unsigned long int

short 2 octeți cu semn Valori întregi mici din [−215,215−1], adică [−32768,

32767]. Echivalent cu short int

unsigned short 2 octeți fără

semn

Valori naturale mici din [0,216−1], adică

[0, 65535]. Echivalent cu unsigned short int

long long 8 octeți cu semn Valori întregi foarte mari din [−263,263−1]. Echivalent
cu long long int

unsigned long

long

8 octeți fără

semn

Valori naturale foarte mari din [0, 2

64−1]. Echivalent

cu unsigned long long int

float double

float pe 4 octeți

double pe 8

octeți

• memorează numere reale;

• float poate memora numere reale din : [3.4  10-38,

3.4  1038]

• double poate memora numere reale din :

[1.7  10-308, 1.7  10308]

• separatorul zecimal este punctul .

• se mai numesc tipuri în virgulă mobilă;

• datele reale pot fi date în forma fixă sau în forma


științifică (exponențială);

Ex: float p = 3.14

double x = 1.24E+07; // înseamnă 1.24 * 107

char 1 octet

• stochează un singur caracter

• caracterele sunt delimitate prin apostrof ‘

Ex: char c='A';

În C++, o dată de tip char nu memorează caracterul,

ci un număr corespunzător caracterului.( vezi tabelul

ASCII)

bool de regulă pe 1

octet

Anumite operații care se fac cu datele au ca rezultat

valori de adevăr: adevărat sau false.

• tipul bool conține două valori: true și false ;

• valorile numerice ale lor sunt 1 și 0;

• se folosesc în instrucțiuni condiționale și repetitive

ex: bool ok = false;

signed char 1 octet cu semn Caractere. Valorile numerice sunt din [−27

,27−1],

adică [−128, 127].

unsigned char 1 octet fără


semn

Caractere. Valorile numerice sunt din [0,28−1], adică

[0, 255].

long double

Memorează numere reale mari. Reprezentarea

depinde de compilator, dar trebuie să ocupe cel puțin

la fel ca double

Variabile

Cunoaşterea domeniului de valori a unei variabile este foarte importantă, deoarece

depăşirea domeniului nu este semnalizată în nici un fel şi conduce sigur la rezultate eronate.

Orice program prelucrează date. Acestea se află în memoria RAM a calculatorului și pot fi

variabile (valoarea datei se poate modifica) sau constante (valoarea nu se poate modifica).

Orice variabilă este caracterizată de:

• adresa variabilei

• identificatorul variabilei

• tipul

• domeniul de vizibilitate ( variabile globale, variabile locale)

Declararea unei variabile

În C++ variabilele trebuie declarate, precizând tipul și identificatorul.

[tip] nume;

Exemple:

int x, y, z; // se declară trei variabile de tip întreg < 2.147.483.647

char c; //declararea variabilei c de tip caracter


float imp, par; // declarare variabilă de tip real

long a,b; // se declară trei variabile de tip întreg < 2

63−1

Declararea prin inițializare

[tip] nume = valoare;

int x=12; //declararea unei variabile x de tip întreg, care are valoarea inițială 12

int = signed int,

short = short int = signed short int,

long = long int,

unsigned = unsigned int,

unsigned short = unsigned short int,

unsigned long = unsigned long int

Constante

Valoarea unei constante nu poate fi schimbată în timpul execuţiei programului în care a fost

utilizată. O constantă are un tip şi o valoare. Atât tipul, cât şi valoarea, sunt determinate de

caracterele care intră în compunerea constantei.

Tipuri de constante:

▪ Constante întregi

▪ Constante caracter

▪ Constante reale

▪ Constante şir de caractere

Constante întregi. Se clasifică în:

▪ Constante zecimale (în baza 10). Ex: 23, 1239, 56.

▪ Constante octale (în baza 8). O constantă în baza 8 se declară precedată de un 0

nesemnificativ. Ex: 0123. Se reţine numărul întreg 123(8).

▪ Constante hexazecimale (în baza 16). Acestea sunt precedate de 0X sau 0x.

Ex: 0X1A2 adică 1A2(16) sau 0x1a2 adică 1A2(16).

Observaţie: O constantă întreagă poate lua valori între 0 şi 4294967295.


O constantă întreagă este pozitivă!!!

Sistemul numeric standard se numește zecimal (baza 10) și folosește zece simboluri:

0,1,2,3,4,5,6,7,8,9.

Un număr în baza 10 are cifrele cuprinse între 0 și 9.

Un număr în baza 2 are cifrele cuprinse între 0 și 1.

Un număr în baza 8 are cifrele cuprinse între 0 și 7.

Un număr în baza 16 are cifrele cuprinse între 0 și 15.

Sistemul numeric hexazecimal, adesea scurtat la „hex”, este un sistem numeric format din

16 simboluri (baza 16). Hexazecimal folosește numerele zecimale și șase simboluri

suplimentare. Nu există simboluri numerice care să reprezinte valori mai mari de nouă, așa

că sunt folosite litere luate din alfabetul englez, în special A, B, C, D, E și F.

Hexazecimal A = zecimal 10 și hexazecimal F = zecimal 15.

97(10)= 141(8)=61(16)

Legătura între bazele 2 și 8 (trecerea numărului din baza 2 în baza 8)

Scriem numărul în baza 8 fără să-l mai trecem prin baza 10 astfel: separăm cifrele de la

dreapta la stânga în grupe de 3. În cazul în care numărul de cifre nu este multiplu de 3, putem

adăuga în față numărul de cifre necesar (cifre de 0 care nu schimbă valoarea).

Inlocuim fiecare grup de 3 cifre binare cu cifra corespunzătoare care reprezinta numărul în

baza 10.

Obs:

- O constantă în baza 8 se declară precedată de un 0 nesemnificativ.

Ex: 123(8) devine 0123(8)

10
- O constantă în baza 16 este precedată de 0x sau 0X. Cifrele hexazecimale se obțin

extinzând cifrele zecimale cu literele mici sau mari de la a la f

Litera care reprezintă

o cifră hexazecimală Valoare

A sau a 10

B sau b 11

C sau c 12

D sau d 13

E sau e 14

F sau f 15

Ex: 0X1A2 = 1A2(16) 0x1a2 = 1a2(16)

Constante caracter- se reprezintă caracterul între apostrof.

Ex. ‘A’, ‘1’, ‘a’.

Memorarea lor se face utilizând:

- codul ASCII al caracterului respectiv (ex. ‘a’ se mem. 97, ‘A’ se mem. 65)

- secvenţele escape – constanta se introduce prin codul său în baza 8 sau 16;

- Caracterele albe (whitespaces):

o blank (‘ ‘)

o tab orizontal (‘\ t’) // tab-ul orizontal determină saltul cursorului cu 8 poziţii

o tab vertical (‘\ v’)

o newline (‘\n’)

o cr (‘\r’)

Ex: ‘a’ are codul 97

97(10)= 141(8)=61(16)

Constante reale se compun din:

- o parte întreagă care poate fi şi vidă

- o parte fracţionară care poate fi şi vidă

- un exponent care poate fi şi vid

ex. - 45.66 0.3 1. .25 -2.5E-12


Constante şir de caractere – se reprezintă între “ghilimele”

Ex. “acesta este un şir de caractere”

Declararea unei constante - forma generală:

const [tip] nume = valoare;

unde: tip = tipul constantei

nume = numele constantei

valoare = valoarea constantei

Ex. constanta de tip int numită numar are valoarea 10

● const int numar = 10

● const numar = 10

● const float pi = 3.14

!!! Dacă scriem: float pi=3.14

(înseamnă că am declarat o variabilă de tip float iniţializată cu 3.14)

Operatorii

Operatorii pot fi:

- unari - se aplică unui singur operand

- binari – se aplică la doi operanzi

Limbajul C++ este dotat cu un set puternic de operatori: aritmetici, relaţionali, de egalitate, de

incrementare/decrementare, logici, logici pe biţi, de atribuire, virgulă, condiţional, sizeof, de conversie

explicită.

Operatorii aritmetici

- pot fi unari: +, -

binari: +, -, *, /, %

*inmultire

/ impartire

% (modulo) restul împărţirii întregi


Obs: - la împărţire dacă ambii operanzi sunt întregi atunci rezultatul este întreg. Rezultatul este corect din

punct de vedere matamatic dacă operanzii au valori pozitive. Dacă cel putin unul din operanzi este real

rezultatul va fi real.

- “ %” acţionează numai asupra operanzilor de tip întreg. Rezultatul este corect din punct de vedere

matematic dacă operanzii sunt numere naturale.

În cazul în care se împart douǎ numere întregi se procedeazǎ astfel:

 Se face împǎrţirea celor 2 valori care sunt considerate în modul

 Semnul câtului sau restului se stabileşte dupǎ regula semnelor

Operatorii relaţionali

<, <=, >, >=

Rezultatul unei operaţii logice este 1, în cazul în care inegalitatea este respectată şi 0 în caz contrar.

Operanzii pot fi : constante, variabile, funcţii care returnează tipuri numerice.

Ex: 2<3 => 1 (adevarat)

3<1 => 0 (fals)

Operatorii de egalitate

== (egalitate)

!= (inegalitate, diferit)

Rezultatul este 0 sau 1, iar operanzii pot fi: constante, variabile, funcţii.

Ex: 3==3 => 1

2!=2 => 0

Operatorii de incrementare/decrementare

++ (incrementare)

-- (decrementare)

Aceşti operatori sunt unari şi au rolul de a incrementa (adună 1) sau decrementa (scad 1) conţinutul

unei variabile. Operatorii pot fi prefixaţi (aplicaţi în faţa/după operandului) sau postfixaţi (aplicaţi după

operand).

Ex: Fie a o variabilă de tip int.

++a; //operatorul de incrementare prefixat

--a; //operatorul de decrementare prefixat


a++; //operatorul de incrementare postfixat

a--; //operatorul de decrementare postfixat

Obs: - dacă operatorul este prefixat variabila este incrementată/decrementată înainte ca valoarea
reţinută de

ea să intre în calcul

- dacă operatorul este postfixat variabila este incrementată/decrementată după ce valoarea reţinută

de ea intra în calcul

Ex 1) int a=6;

...............

5+a++; //se calculează 5+6, apoi se incrementează valoarea lui a deci a=7

5-++a; // se incrementează valoarea lui a deci a=8, apoi se calc 5-8=-3

Ex 2) int a=1,b=3;

................

a++*b++; //se calculează 1*3, apoi a=2,b=4

++a*++b; //a=3,b=5, apoi se calculează 3*5=15

Operatorii logici:

! (negare logică – operator unar)

&& (şi logic – operator binar)

|| (sau logic – operator binar)

O valoare diferita de 0 este considerate cu valoarea 1.

a !a a b a&&b a||b

010000

100101

1001

1111
Ex: int a=1,b=3,c=0;

a&&b; // are val 1

b&&c; // are val 0

Obs:

 la operatorul &&: dacǎ operandul din stânga este 0 nu se mai evalueazǎ şi operandul din dreapta,

oricum rezultatul este 0

 la operatorul ||: dacǎ operandul din stânga este 1 nu se mai evalueazǎ şi operandul din dreapta,

oricum rezultatul este 1

Operatorii de atribuire

*=, /=, %=, +=, -=

Operatorul de atribuire, în forma cea mai simplă, se notează prin caracterul “=”. El se utilizează în

expresii de forma:

v=expresie

Principiul de execuţie:

- se evaluează expresie

- variabilei v i se atribuie valoarea obţinută(dacă este cazul se efectuează conversia respectivă)

În general o expresie de atribuire are forma:

vn= vn-1 =.........=v1=v=expresie;

Principiul de execuţie:

- se evaluează expresie

- variabilei v i se atribuie valoarea obţinută (dacă este cazul se efectuează conversia respectivă)

- conţinutul variabilei v i se atribuie variabilei v1 (dacă este cazul se efectuează conversia respectivă)

................................................

- conţinutul variabilei vn-1 i se atribuie variabilei vn (dacă este cazul se efectuează conversia respectivă)

Pentru atribuire, în afara semnului = se mai poate folosi şi succesiunea de caractere:

op=
unde op poate fi unul din operatorii: *, /, %, +, -

O atribuire de forma:

v op=expresie este echivalentă cu v=v op(expresie)

Ex: s=s+i; se mai poate scrie s+=i;

p=p*i; se mai poate scrie p*=i;

Operatorul virgulă

se utilizează în situaţii în care într-un anumit punct

al unui program este necesar să se realizeze un calcul complex exprimat prin mai multe expresii. In
general,

o construcţie de forma:

exp1, exp2,....., expn

(unde exp1, exp2,....., expn sunt expresii) este o expresie a carei valoare şi tip coincide cu valoarea şi tipul

lui expn.

Principiul de execuţie: expresiile se evaluează pe rând, de la stânga la dreapta.

Ex: int a=1, b=5;

float c;

Expresia c=a=b+1, a=c+2, b=b+1 se evaluează astfel:

- se efectuează atribuirea multiplă: b+1=6,a=6,c=6;

- c+2=8, a=8

- b+1=6, b=6

- expresia produce valoarea 6 (valoarea ultimei expresii, adică a lui b)

Operatorul condiţional

– se foloseşte în expresii de genul:


exp1?exp2:exp3

Principiul de execuţie:

- Se evaluează exp1

- Dacă aceasta produce o valoare diferită de zero, se evaluează exp2 şi expresia condiţională va avea

tipul şi valoarea lui exp2

- altfel se evaluează exp3, şi expresia condiţională va avea tipul şi valoarea lui exp3.

Operatorii condiţionali sunt ? şi : , ei se folosesc totdeauna împreună şi în ordinea indicată de formatul

expresiei condiţionale.

Ex: maximul dintre a şi b

(a>b) ? a : b

Operatorul dimensiune

sizeof – returnează numărul de octeţi utilizaţi pentru memorarea unei valori (este un operator unar).

Poate fi folosit sub forma:

sizeof(expresie) sau sizeof(tip)

obs: expresia nu este evaluată.

Ex: int a;

sizeof(a)=4

Ex: char c;

sizeof(c)=1

Ex: int x; double y;// int pe 4 octeti, double pe 8 octeti, va returna nr maxim de octeti

sizeof(x+y)=8

Ex: int x=5;

sizeof(++x)=4;//!!! valoarea lui x nu este modificata pt. ca nu se eval. expresia


Operatorul de conversie explicită

- intre paranteze inaintea operandului se trece tipul spre care dorim sa facem conversia

Ex:

a) float x=-1.9;

(int) x=-1

b) int a=3,b=6;

(float)a/b=0.5

Expresii

Se numeste expresie o succesiune de operatori si operanzi legati intre ei, dupa reguli

specifice limbajului. Operanzii pot fi: constant, variabile si functii.

Pentru evaluarea unei expesii trebuie sa cunoastem:

 Prioritatea (precedenta) operatorilor – indica ordinea in care se efectueaza operatiile

 Asociativitatea operatorilor – este de doua feluri de la stanga la dreapta (→) si de la dreapta

la stanga (←)

Operator Utilizare Semnificatie Asociativitate


INSTRUCȚIUNI

1.1. Instrucţiunea compusă

Instrucţiunea compusă este o succesiune de instrucţiuni incluse între acolade.

Instrucţiunea compusă se utilizează unde este necesară prezenţa unei instrucţiuni, dar in

procesul de calcul sunt necesare mai multe instrucţiuni. În acest caz instrucţiunile respective se

includ între acolade pentru a forma o instrucţiune compusă.

Instrucțiuni de ramificare/condiționale/de selecție

1.2. Instrucţiunea if

Forma generală 1: Forma generală 2:

if(expresie) instrucţiune1;

else instrucţiune2; if(expresie) instrucţiune1;

Principiul de execuţie: Principiul de execuţie:

P1. Se evaluează expresie

P2. Dacă are valoarea 1 (true), se execute instrucţiune1

Dacă are valoarea 0 (false), se execută instrucţiune2

P1. Se evaluează expresia expresie

P2. Dacă are valoarea 1 (true), se

execută instrucţiune1

P3. Dacă are valoarea 0 (false), se

trece la următoarea instrucţiune,

existentă în program, după

instrucţiunea if.

Instrucțiuni repetitive

1.3. Instrucțiunea for - instrucţiune repetitivă condiţionată anterior cu număr cunoscut de


paşi

Forma generală:

for(expr_1 ; expr_2 ; expr_3) instrucţiune;

expr_1: expresie iniţializare contor

expr_2: expresie test contor (compara valoarea contorului cu valoarea finală pe care o poate

avea)

expr_3: expresie modificare contor

Principiul de execuţie:

P1. Se evaluează expr_1;

P2. Se evaluează expr_2. Daca rezultatul este 1(adev.) se execută instrucţiune, altfel se

trece la execuţia instrucţiunii ce urmează după for;

P3. Se evaluează expr_3 şi se revine la pasul P2

1.4. Instrucțiunea while - instrucţiune repetitivă condiţionată anterior cu număr necunoscut

de paşi

Forma generală:

while (expresie) instructiune;

Principiul de execuție:

P1. Evaluam “expresie”

P2. Daca are valoarea 1 (adev) se executa “instructiune” si trecem la P1

P3. Daca are valoarea 0 (fals) se trece la urmatoarea instructiune dupa while (se termina

executia instr. while)

Obs. Instructiune poate să nu se execute niciodată dacă expresie nu are valoarea 1.

Echivalenţa instrucţiunilor repetitive while şi for:

expr_1;

while(expr_2)

instrucţiune;
expr_3;

 for(expr_1 ; expr_2 ; expr_3) instrucţiune;

1.5. Instrucțiunea repetitivă do...while- instrucţiune repetitiva condiţionată posterior cu număr

necunoscut de pasi.

Forma generală:

do instructiune while (expresie);

Principiul de execuție:

P1. Se executa “instructiune”

P2. Evaluăm “expresie”

P2. Dacă are valoarea 1 (adev) se trece la P1

P3. Dacă are valoarea 0 (fals) se trece la următoarea instrucțiune (se termină execuția

instrucțiunii do... while)

Obs: Spre deosebire de instrucțiunea while, instrucțiunea do... while se execută cel puțin o dată

Echivalenţa instrucţiunilor repetitive while şi do while:

while(expresie) instrucţiune 

if(expresie)

do

instrucţiune

while (expresie);

1.6. Instrucțiunea de selecție multiplă switch...case

Dacă o selecţie multiplă este controlată de valoarea unei singure expresii, programarea se poate

face mai eficient cu ajutorul instrucţiunii de selecţie multiplă.

Forma generală:
switch(expresie)

{ unde:

case exp1: secventa instructiuni1; break; - expresie - expresie de tip întreg

case exp2: secventa instructiuni2; break; - expi, i=1̅̅̅

,n̅, constantă de tip întreg

................................................ - secventa instructiunii, i=1̅̅̅

,n̅,

case expn: secventa instructiunin; break; este o secventa oarecare de instructiuni

[default: secventa instructiunin+1; break;] - default este facultativ, de aceea este pusa

} intre [ ] si reprezinta valoarea implicita

Principiul de execuție:

P1. Se evalueaza “expresie”

P2. daca are valoarea egala cu valoarea expi , se executa in ordine secventa de instructiunii altfel

daca nu exista

- și exista default: se executa numai secventa de instructiunin+1

- și nu exista default: se trece trece la urmatoarea instructiune existent dupa switch

Obs: Prezenta lui break la sfarsitul fiecarei secvente de instructiuni, este necesara atunci când se

doreşte numai execuţia instrucţiunilor aferente acelui case. Daca break lipseşte si „expresie” a

egalat o constanta, se vor executa nu numai instrucţiunile aferente acelui case, ci toate

instrucţiunile celorlalte case-uri care îl succed (inclusiv default).

1.7. Instrucțiunea break

Forma generală

break;

Principiul de execuție:

Instrucțiunea break face programul să iasă imediat din structura repetitivă curentă,

fără să mai testeze vreo condiție logică.


TEST 1 OPERATORI Numele si prenumele__________________________

18.10.2023 Clasa a IX-a C

MODEL OFICIU 1p

1. Care dintre expresiile C/C++ de mai jos este echivalentă cu

!((a<=b && a>=c) || a<=d)? R: ____

a. a<=b || a>=c && a<=d

b. a>b || a<c && a>d

c. a>b || a<c || a>d

d. (a>b || a<c) && a>d

2. Se consideră variabila a care memorează un număr cu exact 6 cifre. Care dintre expresiile C/C++

de mai jos are ca valoare numărul format din cele două cifre din mijloc ale valorii memorate în a?

R: ____

a. (a%100)/100

b. a/100%100

c. a/1000+a%1000

d. a/100%10+a/1000%10

3. Care este instrucţiunea prin care variabilei x i se atribuie valoarea sumei cifrelor numărului

natural format din exact trei cifre, memorat de variabila întreagă y? R:_____

a. x=y/100+y/10%10+y%10;

b. x=y+y/10+y/100;

c. x=y%10+y%10/10+y/100;

d. x=y%10+y%100+y%1000;

4. Cărui interval îi aparţine valoarea memorată de variabila reală x astfel încât expresia următoare,

scrisă în limbajul C/C++, să aibă valoarea 1? R:____

(x<=-2) || (x>-1) && !(x>=1) || (x>50)

a. (-∞,-2] ∪ (-1,1) ∪ (50, ∞)

b. (-∞,-2) ∪ (-1,50)

c. (-∞,-2) ∪ (-1,1] ∪ (50, ∞)


d. (-∞,-2) ∪ (-1,1) ∪ (50, ∞)

5. Care este rezultatul expresiei 5*9/2*3 R:_____

6. Care este valoarea expresiei următoare dacă int a=20,b=3,c=5

e=(a/b%c<=b) || !(b==a) R:____

7. Ce valori vor avea la final variabilele x si y in urma rularii urmatoarei secvente de instructiuni?

int x=4, y=5;

x+=y;

y=sqrt(x);

x+=y;

y=y*2+8;

x=y/2; R: x= ____ y=____

8. Care este valoarea variabilei x rezultata in urma evaluarii expresiei, stiind ca y are valoarea 5:

x=(c=y, c=c+5,c++); R:____

9. Descrie operatorul conditional (forma generala, principiul de executie, exemple).

Aplicatii instructiunea if

1. Se citeşte de la tastatură un număr natural. Să se afişeze dacă numărul este par sau
impar.

#include <iostream>
using namespace std;

int main()
{
//declararea variabilelor
unsigned int a;
//citirea datelor de intrare
cout<<"a= "; cin>>a;
//testarea conditiei de paritate si afisarea rezultatului
if(a%2==0) cout<<a<<" este numar par";
else cout<<a<<" este numa impar";
return 0;
}

2. Se citeşte de la tastatură un număr întreg. Să se afişeze dacă numărul citit este


pozitiv sau negativ

#include<iostream>
using namespace std;

int main()
{
int a;
cout<<"a= "; cin>>a;
if(a>=0) cout<<a<<" este un numar pozitiv";
else cout<<a<<" este un numar negativ";
return 0;
}

3. Se citeşte de la tastatură un număr întreg. Să se afişeze dacă numărul citit este


pozitiv, negativ sau nul.

#include<iostream>
using namespace std;

int main()
{
int a;
cout<<"a= "; cin>>a;
if(a>0) cout<<a<<" este un numar pozitiv";
else if(a<0) cout<<a<<" este un numar negativ";
else cout<<a<<" este un numar nul";
return 0;
}

4. Se citeste de la tastatura a numar intreg. Sa se afiseze |a|

#include<iostream>
using namespace std;

int main()
{
int a;
cout<<"a="; cin>>a;
if(a>=0) cout<<"modul lui a este "<<a;
else cout<<"modul lui a este "<<-a;
return 0;
}

5. Se citesc de la tastatură trei numere întregi. Să se afişeze dacă una din valori este
egală cu suma celorlalte două.

Pbinfo- if_echilibru Intr-un parc se joaca 3 copii care au greutatile a,b,c (numere intregi). Sa se
stabileasca daca se pot aseza pe un balansoar astfel incat acesta sa stea in echilibru.)

#include <iostream>
using namespace std;

int main()
{
int a,b,c;
cout<<"a= "; cin>>a;
cout<<"b= "; cin>>b;
cout<<"c= "; cin>>c;
if (a==b+c || b==a+c || c==a+b)
cout<<"Un numar este egal cu suma celorlalte.";
return 0;
}

6. Se citeste de la tastatura un numar intreg. Sa se afiseze daca este patrat perfect.

Ex: 2 = 1,41 nu este pătrat perefct

9=3 este pătrat perfect

Nr este patrat perfect dacă este pătratul unui alt număr. Rădăcina pătrată a unui pătrat perfect este un
număr întreg, sau daca partea fractionara a lui nr este zero.

Deci putem sc nr - (int)nr =0


#include <iostreamrie: nr=(int)nr
sau
>
#include<cmath>
using namespace std;

int main()
{
int nr;
cout<<"nr= "; cin>>nr;Se citesc de la tastatură trei numere naturale a,b,c . Se se verifice
daca sunt pitagoreice, adică îndeplinesc una din condiţiile: a2=b2+c2, b2=a2+c2 sau
c2=a2+b2.

if(sqrt(nr)==(int)sqrt(nr)) cout<<nr<<" este patrat perfect";


else cout<<nr<<" nu este patrat perfect";
return 0;
}

7. Se citesc de la tastatură trei numere naturale a,b,c . Se se verifice daca sunt


pitagoreice, adică îndeplinesc una din condiţiile: a2=b2+c2, b2=a2+c2 sau c2=a2+b2.

Ex: a=3, b=4, c=5 numere pitagorice sau 5,12,13

#include <iostream>
#include<cmath>
using namespace std;

int main()
{
unsigned int a, b, c;
cout<<"a= ";cin>>a;
cout<<"b= "; cin>>b;
cout<<"c= "; cin>>c;
if(pow(a,2)==pow(b,2)+pow(c,2)||pow(b,2)==pow(a,2)+ pow(c,2)||pow(c,2)==pow(b,2)+
pow(a,2)) cout<<"numerele sunt pitagorice";
else cout<<"numerele nu sunt pitagorice";
return 0;
}

8. if_bisect
Se citește un număr natural a, care reprezinta un an calendaristic. Să se verifice și să se
afișeze dacă anul este bisect sau nu.
Ex: 2020, 2024, 2028,... - ani bisecti-an de 366 de zile (feb. 29 de zile), aproape o data la
fiecare patru ani, mai exact 97 ani bisecti la fiecare ciclu de 400 de ani.
2200, 2019 – ani nebisecti
Algoritmul anului bisect:
1) un an bisect se divide cu 4
2) insa daca se divide cu 100, atunci nu e an bisect
3) insa daca se divide cu 400, atunci e an bisect

#include<iostream>
using namespace std;
int main()
{
unsigned int a;
cout<<"a= "; cin>>a;

if(a%4==0 && a%100!=0 || a%400==0) cout<<a<<" este an bissect";


else cout<<a<<" nu este an bisect";

return 0;
}

Tema: pbinfo: Concurs1 #3185,n minim3 #106, Varste copii #833, Nota #832 , Interval2 #469

Aplicatii if si instrucțiunea compusă

9. Rezolvarea ecuatiei de gradul I: ax+b=0, a,b numere date.

Indicatii : Putem intalni urmatoarele situatii:


a=0
b=0 => x poate fi orice numar real
b≠0 => ecuatie imposibila (0*x+5=0)

a≠0, situatie in care calculam x=-b/a si afisez x (vom folosi instructiunea compusa)

#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
float a,b,x;
cout<<"a= "; cin>>a;
cout<<"b= "; cin>>b;
if(a==0)
if(b==0) cout<<"x orice nr";
else cout<<"ecuatie imposibila";
else
{
x=-b/a;
cout<<setprecision(3)<<x;
}
return 0;
}

10. Se citesc de la tastatura 3 numere reale. Sa se verifice daca cele 3 valori pot reprezenta
masurile a 3 unghiuri dintr-un triunghi. In caz afirmativ se va preciza tipul triunghiului:
dreptunghic, optuzunghic, ascutitunghic, altfel se va afisa mesajul: valorile nu pot
reprezenta masurile unghiurilor dintr-un triunghi".

Indicatii:
3 valori pot reprezenta masurile a 3 unghiuri dintr-un triunghi daca: a+b+c=180 și
a,b,c>0
• triunghi dreptunghic: un unghi are valoarea = 90
• triunghi optuzunghic: un unghi are valoarea > 90
• triunghi ascutitunghic: toate unghiurile au valoarea < 90
#include <iostream>
using namespace std;

int main()
{
float a,b,c;
cout<<"a= "; cin>>a;
cout<<"b= "; cin>>b;
cout<<"c= "; cin>>c;
if(a+b+c==180)
if(a>90 || b>90 || c>90)
cout<<"triunghiul este obtuzunghic";
else if(a==90 || b==90 || c==90)
cout<<"Triunghiul este dreptunghic";
else
cout<<"triunghiul este ascutitunghic";
else cout<<"Unghiurile nu pot forma un triunghi";
return 0;
}
11. Se citesc de la tastatura 3 numere reale. Sa se verifice daca cele 3 valori pot
reprezenta masurile laturilor unui triunghi. In caz afirmativ se va preciza tipul
triunghiului: echilateral, isoscel, dreptunghic, oarecare, altfel se va afisa mesajul:
valorile nu por reprezenta masurile a 3 laturi dintr-un dreptunghi.

Indicatii: 3 valori pot reprezenta masurile a 3 laturi dintr-un triunghi daca:


§ a,b,c>0
§ suma oricaror doua laturi > a treia latura
#include<iostream>
using namespace std;
int main()
{
float a,b,c;
cout<<"a=";cin>>a;
cout<<"b=";cin>>b;
cout<<"c=";cin>>c;
if(a+b+c==180 && a>0 && b>0 && c>0)
{
if(a==90 || b==90 || c==90) cout<<"e triunghi dreptunghic";
else if(a>90 || b>90 || c>90) cout<<"e triunghi optuzunghic";
else if(a<90 && b<90 && c<90)cout<<"e triunghi ascutit-unghic";
}
else cout<<"valorile nu pot reprezenta masurile unghiurilor dintr-un triunghi";
return 0;
}

12. pbinfo #446 cifmax3 Se citește de la tastatură un număr natural de 3 cifre. Să se


afișeze pe ecran cea mai mare cifră a sa.
#include <iostream>
using namespace std;
///varianta 1 prin care atribuim maximului ultima cifra a numarului
/*
int main()
{
unsigned int nr,max;
cout<<"nr= "; cin>>nr;
max=nr%10;
if(nr/10%10>max) max=nr/10%10;
if(nr/100>max) max=nr/100;
cout<<"Cifra maxima din numarul meu de 3 cifre este "<<max;
return 0;
}
*/
///varianta 2 prin care atribui maximului cea mai mica valoare posibila
///din multimea cifrelor 0,...,9
int main()
{
unsigned int nr,max=0;
cout<<"nr= "; cin>>nr;
if(nr%10>max) max=nr%10;
if(nr/10%10>max) max=nr/10%10;
if(nr/100>max) max=nr/100;
cout<<"Cifra maxima din numarul meu de 3 cifre este "<<max;
return 0;
}

13. consecutive Se citesc de la tastatura doua numere intregi. Sa se afiseze daca cele
doua numere citite sunt numere consecutive
a=4 b=5 numere consecutive
a=5 b=4 numere consecutive
a=7 b=9 numerele nu sunt consecutive

#include <iostream>
using namespace std;

int main()
{
//declararea variabilelor
int a,b;
//citirea datelor de intrare
cout<<"a=";cin>>a;
cout<<"b=";cin>>b;
//rezolvarea cerintei si afisarea datelor de iesire
if(a==b+1 || b==a+1)cout<<" nr consecutive";
else cout<<"nr nu sunt consecutive";
return 0;
}

14. vocala Se citeste un caracter de la tastatura. Sa se afiseze daca este vocala sau nu.

#include<iostream>
using namespace std;

int main()
{
char c;
cin>>c;
if(c=='a'|| c=='e' || c=='i'|| c=='o'|| c=='u')
cout<<"este vocala";
else cout<<"nu este vocala";
return 0;
}
APLICATII INSTRUCTIUNEA FOR

for1. Se citește de la tastatură n număr natural nenul. Să se afișeze numerele naturale cuprinse între
1 și n, iar pe linia doi valorile de la n la 1.
ex: n=5 => linia 1: 1 2 3 4 5
linia 2: 5 4 3 2 1
i=variabila contor
 valoarea initiala a contorului: i=1 (expr_1)
 valoarea finala a contorului: i=n => expresia instr. while: i<=n (expr_2)
 modificare contor: i++ (expr_3)

 valoarea initiala a contorului i=n (expr_1)


 valoarea finala a contorului: i=1=>expresia instr. while i>=1 (expr_2)
 modificare contor i - - (expr_3)
#include<iostream>
using namespace std;

int main()
{
int n,i;
cout<<"n= "; cin>>n;
///afisare elem de la 1 la n
for(i=1;i<=n;i++)
cout<<i<<" ";
cout<<endl;
///afisare elem de la n la 1
for(i=n; i>=1;i--)
cout<<i<<" ";
return 0;
}

for2. Se citește n număr natural. Să se afișeze divizorii numărului.

n=12 => 1 2 3 4 5 6 7 8 9 10 11 12
n=1 => 1
n=7 => 1 234567
n=6 => 123456

 divizori improprii: 1, n
 divizorii proprii, daca exista, sunt 2 si n/2 (o sa parcurgem intervalul [2,n/2] folosind variabila
contor i )
 valoarea initiala a contorului: i =2
 valoarea finala a contorului: i=n/2
 modificare contor: i++;
#include<iostream>
using namespace std;

int main()
{
unsigned int n,i;
cout<<"n= "; cin>>n;
///afisez 1
cout<<"Divizorii numarului sunt:1 ";
///caut divizorii proprii din intervalul [2,n/2]
for(i=2;i<=n/2;i++)
if(n%i==0) cout<<i<<" ";
///daca n>1 atunci afiseaza n (daca n=1 s-ar afisa de 2 ori 1)
if(n>1) cout<<n;
return 0;
}

for3 Se citeste de la tastatura un numar natural n. Sa se calculeze si sa se afiseze suma primelor n


numere naturale nenule.
Ex: n=5 S=15
#include <iostream>
using namespace std;

int main()
{
unsigned int n,i,S;
cout<<"n= "; cin>>n;
S=0;///initializam suma cu elementul neutru la adunare
cout<<"Suma numerelor este: ";
for(i=1;i<=n;i++)
S=S+i;
cout<<S;
return 0;
}
Varianta 2 de rezolvare
#include <iostream>
using namespace std;

int main ()
{
unsigned int n;
cout<<"n= "; cin>>n;
cout<<"Suma este "<<n*(n+1)/2;
return 0;
}
for4. Se citesc de la tastatura n numere intregi, n numar natural dat. Sa se calculeze produsul celor n
numere citite.

Ex: n=4
-4 2 7 3 => p=(-4)*2*7*3= -168
Produsul va fi initializat cu elementul neutru la inmultire, adica cu valoarea 1
#include<iostream>
using namespace std;

int main()
{
unsigned int n,i;
int nr, P=1;
///n reprezinta numarul de numere
cout<<"n= ";cin>>n;
for(i=1;i<=n;i++)
{
cout<<"nr= ";cin>>nr;///citesc pe rand numerele
P=P*nr;
}
cout<<"Produsul numerelor este: "<<P;
return 0;
}

for5. Se citesc de la tastatura n numere intregi, n numar natural dat. Sa se calculeze suma numerelor
pare si produsul numerelor impare.

Ex: n=5
4 6 3 2 5 => s=4+6+2=12
p=3*5=15

#include <iostream>
using namespace std;

int main()
{
unsigned int n, i;
int nr, P, S;
cout<<"numarul de numere= ";
cin>>n;
S=0;
P=1;
for(i=1;i<=n;i++)
{
cout<<"numerele sunt= ";
cin>>nr;
if(nr%2==0)
S=S+nr;
else
P=P*nr;
}
cout<<"Suma este= "<<S<<endl;
cout<<"Produsul este= "<<P;

return 0;
}

for6. Se citesc de la tastatura n numere intregi, n numar natural dat. Sa se calculeze media aritmetica
a valorilor pozitive.

ex: n=5
3 -4 5 0 2 => s=3+5+2 => ma=(float)s/np
np=3
#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
unsigned int n,np=0,s=0,i;///np=nr de numere pozitive
int nr;
cout<<"n=";cin>>n;
for(i=1;i<=n;i++)
{
cout<<"nr=";cin>>nr;
if(nr>0)
{
s=s+nr;
np++;
}
}
if(np!=0)
cout<<"media aritmetica a nr pozitive="<<setprecision(3)<<(float)s/np;
else
cout<<"nu putem calcula ma deoarece nu avem nr poz";
return 0;
}

for7. Se citesc de la tastatura n numere intregi, n numar natural dat. Sa se numere cate
sunt pozitive, negative si zero.

ex: n=5
3 -4 5 0 2 => numere pozitive=3
numere negative=1
numere zero=1
#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
unsigned int n,np=0,nn=0, nz=0,i;
///np=nr de numere pozitive,nn= nr nr negative, nz=nr de 0
int nr;
cout<<"n=";cin>>n;
for(i=1;i<=n;i++)
{
cout<<"nr=";cin>>nr;
if(nr>0)np++;
else if (nr<0)nn++;
else nz++;
}
cout<<"numere pozitive="<<np<<endl;
cout<<"numere negative="<<nn<<endl;
cout<<"numere zero="<<nz<<endl;
return 0;
}

Algoritmi elementari.
for8. Se citește de la tastatură un număr natural. Sa se afișeze dacă este număr prim sau
nu.
nr=121 , nu este nr prim
nr=11, este prim

#include <iostream>
#include <cmath>

using namespace std;

int main()
{
int n, prim;
cin >> n;
prim = 1; // presupunem ca n este prim
if(n==0 || n==1) prim = 0; // 0 si 1 nu sunt prime
for(int i =2 ; i * i <= n ; i ++)// for(int i =2 ; i <= sqrt(n) ; i ++)//for(int i=2;i<=n/2;i++)
if(n % i == 0) prim = 0;
if(prim==1) cout << n << " este prim";
else cout << n << " nu este prim";
return 0;
}
for9. Se citesc de la tastatura n numere intregi, n numar natural dat. Sa se afiseze
valoarea minima.

ex: n=5
3 -4 5 0 2 => min=-4

#include<iostream>
#include<climits>
using namespace std;

int main()
{
unsigned int n;
int nr, i, min;
///cout<<INT_MIN<<" "<<INT_MAX<<endl;//determinarea limitelor domeniului int
cout<<"n = "; cin>>n; ///numarul de numere
///se citeste prima valoare din sir
cout<<"nr = "; cin>>nr;
min=nr;///se atribuie aceasta valoare minimului
for(i=2; i<=n; i++)
{
cin>>nr;
if(nr<min) min=nr;
}
cout<<" Valoarea minima din sir"<<min;
return 0;
}

for99. Se citesc din fisierul date.in, n numere intregi, n numar natural dat.
Sa se afiseze in fisierul rezultat.out, valoarea minima din sir.
ex: n=5
3 -4 5 0 2 => min=-4

#include<fstream>
using namespace std;

int main()
{
///declararea fisierelor text
ifstream f("date.in");
ofstream g("rezultat.out");
///declararea variabilelor
unsigned int n;
int nr, i, min;
///citirea datelor din fisier
f>>n; ///numarul de numere
///se citeste prima valoare din sir
f>>nr;
min=nr;
for(i=2; i<=n; i++)
{
f>>nr;
if(nr<min) min=nr;
}
///afisarea datelor de iesire in fisier
g<<" Valoarea minima din sir este "<<min;
///inchiderea fiserelor
f.close();
g.close();
return 0;
}

for10. Se citeste din fisierul for10.txt, n numar natural. Sa se calculeze si sa se afiseze pe


ecran, expresia

E=11+12+...+1n
#include <iostream>
#include <fstream>
#include<iomanip>
using namespace std;

int main()
{
ifstream f("for10.txt");
unsigned int n, i;
float E=0;
f>>n;
for(i=1;i<=n;i++)
E=E+(float)1/i;///E=E+1.0/i;
cout<<"Suma este egala cu: "<<setprecision(3)<<E;
return 0;
}

for11. Se citeste din fisierul for11.txt, n, numar natural. Sa se calculeze si sa se afiseze in


fisirul for11.out, expresia E=1*3+2*5+.....n*(2*n+1)

#include <iostream>
#include <fstream>

using namespace std;

int main()
{
ifstream f("for11.txt");
ofstream g("for11.out");
unsigned int n, i, E=0;
f>>n;
/*for(i=1; i<=n; i++)
{
E=E+i*(2*i+1);
}
*/
i=1;
while(i<=n)
{
E=E+i*(2*i+1);
i++;
}
g<<E;
f.close();
g.close();

return 0;
}

for12. Se citeste de la tastatura n numar natural. Sa se calculeze expresia


E=1+1*2+1*2*3+...+1*2*...*n

#include <iostream>
using namespace std;

int main()
{
int i, p=1, e=0, n;
cout<<"n= ";
cin>>n;
for(i=1; i<=n; i++)
{
p=p*i;
e=e+p;
}
cout<<"e= "<<e;
return 0;
}

for13. Să se afișeze tabla înmulțirii cu un număr întreg k, citit de la tastatură.

#include <iostream>
using namespace std;
int main()
{
int k,i;
cout<<"k= "; cin>>k;
for(i=1;i<=10;i++)
{
cout<<k<<" x "<<i<<" = "<<k*i;
cout<<endl;
}
return 0;
}

for14. Să se afișeze tabla înmulțirii de la 1 la 10.

#include <iostream>
using namespace std;

int main()
{
int i,j;
for(i=1;i<=10;i++)
{
for(j=1;j<=10;j++)
cout<<i<<" x "<<j<<" = "<<i*j<<endl;
cout<<endl;
}
return 0;

http://www.ududec.com/wp-content/uploads/2013/09/Fisa-7-Instructiunea-for.pdf

for15 (pb30 ududec) Sa se afiseze pe ecran toate perechile de litere distincte ale alfabetului
englez.

(a.b) (a,c) (a,d)....(a,z)


(b,c) (b,d)....(b,z)
…….
(y,z)
#include <iostream>
using namespace std;

int main()
{
char i,j;
for(i='a';i<='y';i++)
{
for(j=i+1;j<='z';j++)
cout<<"("<<i<<","<<j<<") ";
cout<<endl;
}
return 0;
}

APLICATII INSTRUCTIUNEA WHILE


while1. (rezolvarea pb for1. folosind while) Se citește de la tastatură n număr natural nenul. Să se
afișeze numerele naturale cuprinse între 1 și n, iar pe linia doi valorile de la n la 1.
ex: n=5 => linia 1: 1 2 3 4 5
#include<iostream>
using namespace std;

int main()
{
unsigned int n,i;
cout<<"n= "; cin>>n;
i=1;
while(i<=n)
{
cout<<i<<" ";
i++;
}
return 0;
}

while2.(rezolvarea pb for3. folosind while)Se citeste de la tastatura un numar natural n. Sa se


calculeze si sa se afiseze suma primelor n numere naturale nenule.
Ex: n=5 S=15
#include<iostream>
using namespace std;

int main()
{
unsigned int n,i,S=0;
cout<<"n= "; cin>>n;
i=1;
while(i<=n)
{
S=S+i;
i++;
}
cout<<"Suma primelor "<<n<<" numere este: "<<S;
return 0;
}

Algoritmi elementari.
Prelucrarea cifrelor unui număr natural
while3. Se citește un număr natural de maxim 9 cifre. Să se calculeze și să se afișeze suma cifrelor
numărului citit.

Ex: nr=3452 => s=3+4+5+2=14


Stim ca adunarea este comutativa, noi o sa calculam 2+5+4+3 deoarece cifrele numarului le putem
obtine incepand cu cifra unitatilor

notam c=cifra unitatilor.


s=suma cifrelor.
Initial s=0
n≠0 ? da
c=nr%10=3452%10=2 //obtinem cifra unitatilor
s=s+c=0+2=2 // adaugam cifra unitatilor la suma
nr=nr/10=3452/10=345 //elimin din nr. cifra unitatilor
n≠0 ?
c=nr%10=345%10=5
s=s+c=2+5=7
nr=nr/10=345/10=34
………………
n≠0 ? da
c=nr%10=3%10=3
s=s+c=11+3
nr=nr/10=3/10=0

n≠0 ? nu , deci am terminat de adaugat toate cifrele la suma


 expresia instr. while: nr!=0
 cele 3 operatii de atribuire se repeta cat timp nr!=0

#include <iostream>
using namespace std;

int main()
{
unsigned int nr, S=0,c;
cout<<"nr= ";cin>>nr;
while(nr!=0)
{
c=nr%10;
S=S+c;
nr=nr/10;
}
cout<<"Suma este : "<<S;
return 0;
}
//sau
#include <iostream>
using namespace std;

int main()
{
unsigned int nr, S=0;
cout<<"nr= ";cin>>nr;
while(nr!=0)
{
S=S+nr%10;///adaug la suma ultima cifra a numarului
nr=nr/10;///elimin ultima cifra
}
cout<<"Suma este : "<<S;
return 0;
}

while4. Aflarea primei cifre a unui numărului natural n.

///met 1 - folosim variabila c=cifra unitatilor nr


#include <iostream>
using namespace std;

int main()
{
unsigned int nr,c;
cout<<"nr= ";cin>>nr;
while(nr!=0)
{
c=nr%10;
nr=nr/10;
}
cout<<"prima cifra a nr="<<c;
return 0;
}

///met 2 - fara a folosi variabila c=cifra unitatilor nr


#include <iostream>
using namespace std;

int main()
{
unsigned int nr,c;
cout<<"nr= ";cin>>nr;
while(nr>9)///cat timp nr are cel putin 2 cifre, elimin cifra unitatilor din nr
nr=nr/10;
cout<<"prima cifra a nr="<<nr;
return 0;
}

while5. Determinarea inversului (oglinditului) lui n


ex: n=1234, inv=4321
#include <iostream>
using namespace std;

int main()
{
unsigned int nr,c,inv=0;
cout<<"nr= ";cin>>nr;
while(nr!=0)
{
c=nr%10;
inv=inv*10+c;
nr=nr/10;
}
cout<<"inv="<<inv;
return 0;
}

while6. Se citeste din fisier un numar natural. Sa se afiseze in fisier daca numarul este de tip
palindrom
ex: 22, 32123, 454

#include <iostream>
using namespace std;

int main()
{
unsigned int nr,c,inv=0,x;
cout<<"nr= ";cin>>nr;
x=nr;///retin valoarea initiala a lui nr
///determin inv lui nr
while(nr!=0)
{
c=nr%10;
inv=inv*10+c;
nr=nr/10;
}
///cout<<"inv="<<inv<<endl;
///verific daca nr initial =inv
if(x==inv)cout<<"palindrom";
else cout<<"nu este palindrom";
return 0;
}

Acest algoritm poate depasi valoarea maxima reprezentabila pe tipul long long ( pentru numere
mari). O solutie ar fi sa rasturnam numarul pana la jumatate

#include <iostream>
using namespace std;

int main()
{
long long n,r;
cin>>n;
r=0;
while(n>r)
{
r=r*10+n%10;
n=n/10;
}
// cand numarul este par testam daca n==r
// cand numarul este impar testam daca n== r/10
if (n==r || n==(r/10))
cout<<"Numarul este palindrom";
else cout<<"Numarul nu este palindrom";
return 0;
}

while7. Se citeste de la tastatura un numar natural n , apoi se citesc n valori naturale. Sa se verifice
daca printre valorile citite exista un palindrom prim, afisand pe ecran un mesaj corespunzator.

pt n=5 si nr 11, 23, 121, 9, 14

#include <iostream>
using namespace std;
int main()
{
int n,ok=0;
cin>>n;
for(int i=1;i<=n;i++)
{
int nr;
cout<<"nr="; cin>>nr;
int nr1=nr;
int inv=0, prim=1;
while(nr1!=0)
{
inv=inv*10+nr1%10; // determinam inversul numarului
nr1=nr1/10;
}
// verificam daca numarul este palindrom
if (inv==nr)
{
prim=1;
// determinam daca numarul care este palindrom este si numar prim
if(nr<2) prim=0;
else if (nr==2) prim=1;
else for(int d=3;d*d<=nr;d=d+2) // mergem numai pe numere impare
if (nr%d==0) prim=0;
if (prim==1) ok=1;
}
}
if (ok==1) cout<<"Exista numere palindrom prime"<<endl;
else cout<<"Nu exista numere palindrom prime";
return 0;
}

while8. Se dă un număr natural. Să se modifice acest număr, mărind cu o unitate fiecare cifră pară.
pt n= 275 se afiseaza nn= 375.
Vom determina cifrele numărului dat și vom construi rezultatul, inserând cifrele la început.
Cifrele pare se inserează ca atare, cifrele impare se inserează micșorate.
· Fie n numărul dat și nn rezultatul. Vom utiliza o variabilă suplimentară, p, pentru a calcula
puterile lui 10.
· Inițial nn = 0, p = 1
· Vom determina prin trunchieri succesive cifrele lui n în variabila c, c = n % 10.
o Dacă c este par, nn = nn + p * (c+1), apoi p = p * 10.
o Dacă c este impar, nn = nn + p * c , apoi p = p * 10.
#include<iostream>
using namespace std;

int main()
{
int n, nn=0,c,p=1;
cout<<"n= "; cin>>n;
while(n>0)
{
c=n%10;
if(c%2==0) nn=nn+p*(c+1);
else nn=nn+p*c;
p=p*10;
n=n/10;
}
cout<<endl<<"Noul numar format este "<<nn;
return 0;
}
TEMA while9. Aflarea cifrei maxime dintr-un număr n
///Algoritmul prin care atribuim maximului, cea mai mica valoare posibila din multimea cifrelor
#include<iostream>
using namespace std;
int main()
{
unsigned int i, cmax=0, c;
int n;
cout<<"n= "; cin>>n;
while(n!=0)
{
c=n%10;
if(c>cmax) cmax=c;
n=n/10;
}
cout<<"cifra maxima este "<<cmax;
return 0;
}

///Algoritmul prin care atribuim maximului, prima valoare la care avem acces
#include<iostream>
using namespace std;
int main()
{
unsigned int i, cmax, c;
int n;
cout<<"n= "; cin>>n;
cmax = n%10;
n=n/10;
while(n!=0)
{
c=n%10;
if(c>cmax) cmax=c;
n=n/10;

}
cout<<"cifra maxima este "<<cmax;
return 0;
}

while10.(ududec pb 37)

http://www.ududec.com/wp-content/uploads/2013/09/Fisa-5-Instructiunea-while.pdf
ex: 1810 obtinem 95

#include<iostream>
using namespace std;
int main()
{
unsigned int x,y,x1,y1;
cout<<"x="; cin>>x;
cout<<"y="; cin>>y;
x1=x;///retinem in x1 valoarea lui x pt ca ea se pierde
y1=y;///retinem in y1 valoarea lui y
while(x!=y)
{
if(x>y) x=x-y;
else y=y-x;
}
cout<<"cmmdc= "<<x<<endl;
cout<<x1/x<<" "<<y1/x;
return 0;
}

while11. Eliminarea cifrelor pare dintr-un numar

#include<iostream>
using namespace std;
int main()
{
int n, nn=0, c, p=1;
cout<<"n="; cin>>n;
while(n!=0)
{
c=n%10;
if(c%2!=0)
{
nn=nn+c*p;
p=p*10;
}
n=n/10;
}
cout<<"numarul nou="<<nn;
return 0;
}

while12. Dublarea cifrelor impare dintr-un numar


#include<iostream>
using namespace std;

int main()
{
int n,c,nn=0,p=1;
cout<<"n= "; cin>>n;
while(n!=0)
{
c=n%10;
if(c%2!=0)
{
nn=nn+p*(c*11);
p=p*10;
}
else nn=nn+p*c;
p=p*10;
n=n/10;
}
cout<<endl<<"noul numar este "<<nn;
return 0;
}

while13.Descompunerea in factori primi a unui numar


#include<iostream>
using namespace std;

int main()
{
unsigned int d=2,p;
int n;
cin>>n;
while(n>1)
{
p=0;
while(n%d==0)
{
n=n/d;
p++;
}
if(p!=0) cout<<d<<"^"<<p<<" ";
d++;
}
return 0;
}
Șirul lui Fibonacci
Să se afișeze primii n termeni ai șirului lui Fibonacci. Șirul are primii doi termeni egali cu 1 și fiecare din
următorii termeni este egal cu suma dintre termenul precedent și termenul anteprecedent.
#include <iostream>
using namespace std;

int main ()
{
int prec=1,anteprec=1,fib,n;
cout<<"n= ";cin>>n;
cout<<anteprec<<" "<<prec<<" ";
for(int i=3;i<=n;i++)
{
fib=anteprec+prec;
cout<<fib<<" ";
anteprec=prec;
prec=fib;
}
return 0;
}
switch1. Se citeste de la tastatura un numar natural cuprins intre 1 si 4 reprezentand varianta
extrasa la un concurs. Sa se afiseze varianta extrasa.

switch2. Se citeste de la tastatura un numar natural cuprins intre 1 si 7. Sa se afiseze ziua din
saptamana corespunzatoare numarului citit. (luni=1, marti=2,...)

#include <iostream>
using namespace std;

int main()
{
unsigned int op;
cout<<"sa se introduca o variabilla intre 1 si 7: ";
cout<<"op= ";
cin>>op;
switch(op)
{
case 1:cout<<"Luni"; break;
case 2:cout<<"Marti"; break;
case 3:cout<<"Miercuri"; break;
case 4:cout<<"Joi"; break;
case 5:cout<<"Vineri"; break;
case 6:cout<<"Sambata"; break;
case 7:cout<<"Duminica"; break;
default: cout<<"Variabila nu este intre 1 si 7";
}
return 0;
}

switch 3. Se citeste de la tastatura un numar natural cuprins intre 1 si 12. Sa se afiseze luna
din an corespunzatoare numarului citit(1- ianuarie, 2- februarie,.....)

#include <iostream>
using namespace std;

int main()
{
unsigned int v;
cout<<"Introduceti un nr de la 1 la 12"<<endl;
cin>>v;
switch(v)
{
case 1: cout<<"Ianuarie"; break;
case 2: cout<<"Februarie"; break;
case 3: cout<<"Martie"; break;
case 4: cout<<"Aprilie"; break;
case 5: cout<<"Mai"; break;
case 6: cout<<"Iunie"; break;
case 7: cout<<"Iulie"; break;
case 8: cout<<"August"; break;
case 9: cout<<"Septembrie"; break;
case 10: cout<<"Octombrie"; break;
case 11: cout<<"Noiembrie"; break;
case 12: cout<<"Decembrie"; break;
default: cout<<"Nu ati introdus o valoare intre 1 si 12.";
}
return 0;
}
switch 4. Se citesc de la tastatura doua valori intregi a si b reprezentand operanzii unui expresii
si un caracter op reprezentand un operator aritmetic (+, -, *, /).
Sa se evalueze expresia a op b.
Ex: a=5,b=2, op=’*’ 5*2=10
(valorile variabilelor de tip caracter se trec intre doua caractere apostrof.)

#include <iostream>
using namespace std;

int main()
{
char v;
int a,b;
cout<<"a= ";cin>>a;
cout<<"b= ";cin>>b;
cout<<"Introduceti un operand ariitmetic ";cin>>v;
switch(v)
{
case '+': cout<<a+b; break;
case '-': cout<<a-b; break;
case '*': cout<<a*b; break;
case '/': cout<<a/b; break;
default: "Nu ati introdus un operand aritmetic.";
}
return 0;
}

1. Se citesc numere întregi până la intalnirea lui 0. Sa se numere cate sunt pozitive si cate sunt
negative.

Ex: 5 -7 -3 3 7 0 am terminat de citit numerele

poz=3 neg=2

#include <iostream>

using namespace std;

int main()

//declararea variabilelor

int nr, poz=0, neg=0;//poz=numarul valorilor pozitive, neg=numarul valorilor negative

//rezolvarea cerintei
do

cout<<"nr=";cin>>nr;//citim valoarea numarului

if (nr>0)poz++;// daca nr>0 incrementam nr de valori pozitive

if (nr<0)neg++;// daca nr<0 incrementam nr de valori negative

}while (nr!=0);// citirea numerelor se termina la citirea valorii 0 pentru nr

//afisarea datelor de iesire

cout<<"nr poz "<<poz<<endl;

cout<<"nr neg "<<neg;

return 0;

2. Se citesc nr intregi pana la intalnirea lui 0. Sa se calculeze media aritmetica a nr pozitive.

#include<iostream>
using namespace std;
int main()
{
int n;
float S=0, poz=0;
do{
cout<<"n="; cin>>n;
if(n>0)
{
S=S+n;
poz++;
}
} while(n!=0);
cout<<"Media aritmetica="<<S/poz;
return 0;

3. Se citesc caractere pana la intalnirea caracterului punct. Sa se numere cate litere si cate cifre au
fost citite.

#include<iostream>
using namespace std;
int main()
{
char c;
int cif=0, lit=0;
do
{
cout<<"caracterul= ";
cin>>c;
if((c>='a'&& a<='z') || (c>='A'&& a<='Z'))
lit++;
// verific daca c este litera mica sau litera mare
if(c>='0'&& c<='9')
// verific daca c este cifra
cif++;
}
while(c!='.');
// cat timp caracterul este diferit de punct
cout<<"Numarul de cifre este= "<<cif<<endl;
cout<<"Numarul de litere este= "<<lit;

return 0;
}

4. Se citesc nr pana la intalnirea a 2 valori consecutive egale. Sa se numere cate valori citite sunt
patrate perfecte. (daca ultimele 2 nr citite sunt pp se numara o singura data)

#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int nr,nr1,pp=0;
cout<<"nr=";cin>>nr; //citim primul numar
do{
nr1=nr;
if (sqrt(nr)-int(sqrt(nr))==0) pp++;
cout<<"nr=";cin>>nr;
}
while(nr!=nr1);
cout<<"Numarul de patrate perfecte este : ";cout<<pp;
return 0;
}

5. Se citesc numerele intregi a,b,x. Sa se afiseze daca x apartine [a,b]. Se va face test la citirea lui b,
b>=a pentru a se asigura existenta intervalului [a,b].

#include <iostream>
using namespace std;

int main()
{
int a,b,x;
cout<<"a= ";cin>>a;
do
{
cout<<"b= ";cin>>b;
}while(b<a);
cout<<"x= ";cin>>x;
if(x>=a && x<=b) cout<<x<<" apartine intervalului ["<<a<<","<<b<<"]";
else cout<<x<<" nu apartine intervalului ["<<a<<","<<b<<"]";
return 0;
}

Exercitiul #1053
În secvența de mai jos toate variabilele sunt de tip întreg și memorează numere naturale.

y=1;
x=2;
while(n>0)
if(..........) { y=y*x;
n=n-1;
}
else { x=x*x;
n=n/2;
}
Indicați expresia care poate înlocui punctele de suspensie astfel încât, în urma executării
secvenței obținute, variabila y să memoreze valoarea 2n.

Varianta 1 n%2==0
Varianta 2 n/2==0
Varianta 3 n%2==1
Varianta 4 n/2!=0
Exercitiul #920
Se consideră secvenţa de cod de mai jos. În n se citește întotdeauna un număr natural care
conține cel puțin o cifră pară și cel puțin o cifră impară.

int n,cmi=100,cma=-100;
cin>>n;
while(n!=0)
{
if(......)
{
if(n%10>cma)
cma=n%10;
}
else
{
if(n%10<cmi)
cmi=n%10;
}
n/=10;
}
cout<<cma*cmi;
Ce expresie poate înlocui punctele de suspensie pentru ca secvența de cod de mai sus să
afișeze produsul dintre cifra pară maximă din n și cifra impară minimă din n.

Varianta 1 n%2==1
Varianta 2 n%10%2==0
Varianta 3 n%10==0
Varianta 4 n/2==0

Exercitiul #1053
În secvența de mai jos toate variabilele sunt de tip întreg și memorează numere naturale.

y=1;
x=2;
while(n>0)
if(..........) {
y=y*x;
n=n-1;
}
else {
x=x*x;
n=n/2;
}
Indicați expresia care poate înlocui punctele de suspensie astfel încât, în urma executării
secvenței obținute, variabila y să memoreze valoarea 2n.

Varianta 1 n%2==0
Varianta 2 n/2==0
Varianta 3 n%2==1
Varianta 4 n/2!=0
Clasa a IX-a-> Categoria-Elemente de baza ale limbajului-> Subcategoria-Structuri
repetitive

Exercitiul #40
În următoarea secvenţă de program, instrucţiunea de afişare se va executa de un număr de ori
egal cu:

for (i=1;i<=3;i++)
for (j=10;j>=i+1;j--)
cout<<j; | printf(”%d”,j);

Varianta 1 24
Varianta 2 21
Varianta 3 3
Varianta 4 30

Exercitiul #42
În secvenţa de instrucţiuni de mai jos, variabilele x şi y sunt de tip int. Care este valoarea pe
care trebuie să o aibă iniţial variabila x dacă la finalul executării secvenţei s-a afişat un singur
caracter asterisc (*)?
y=x;
while(x<=3)
{
cout<<"*";
y=y+1; x=x+y;}
}

Varianta 1 0
Varianta 2 2
Varianta 3 1
Varianta 4 4

Exercitiul #27
Care dintre următoarele expresii C/C++ are valoarea 1 după executarea secvenţei de
instrucţiuni de mai jos, în care toate variabilele sunt întregi?

v1=0; v2=0;
for(i=1;i<=3;i++)
{
for (j=1;j<=i;j++)
v1=v1+1;
for (k=i;k<=3;k++)
v2=v2+1;
}

Varianta 1 v1>v2
Varianta 2 v1<v2
Varianta 3 v1==v2
Varianta 4 v1+v2==9
Exercitiul #25

Câte atribuiri se execută, în total, în secvenţa de mai jos, dacă n şi p sunt variabile de tip întreg?

p=1; n=279;
while (n>=100)
{ p=p*10;
n=n-100;
}

Varianta 1 4
Varianta 2 6
Varianta 3 2
Varianta 4 8

Exercitiul #22

Care este valoarea pe care poate să o aibă iniţial variabila întreagă x dacă, la sfârşitul executării
secvenţei de mai jos, variabila întreagă y are valoarea 2?

y=0;
do{
x=x/10;
y=y+1;
} while(x%100==0);

Varianta 1 300
Varianta 2 5000
Varianta 3 120
Varianta 4 0

Exercitiul #43

Care este valoarea pe care trebuie să o aibă iniţial variabila întreagă x pentru ca, în urma
executării secvenţei de mai jos, să se afişeze HHHHHH?

while (x!=3)
{
x=x-1;
cout<<"HH"; | printf(”HH”);
}
Varianta 1 0
Varianta 2 4
Varianta 3 6
Varianta 4 5

Exercițiul #45

Care este numărul total de atribuiri efectuate la executarea secvenţei de instrucţiuni de mai jos?
x=4; y=6;
while (y==6)
y=y+1;
if (x==y) x=x+1;

Varianta 1 4
Varianta 2 3
Varianta 3 2
Varianta 4 5

Variante bac 2008

V062I1

Toate variabilele din secvenţa de instrucţiuni C/C++ alăturată sunt întregi. Care dintre
următoarele afirmaţii este adevarată?
if (a>b)
{
aux=a;
a=b;
b=aux;
}
for(i=a;i<=b;i++)
cout<<i;

a. Secvenţa conţine o instrucţiune repetitive inclusă într-o instrucţiune alternativă.


b. Secvenţa conţine o instrucţiune alternativă urmată de o instrucţiune repetitivă.
c. Secvenţa conţine o instrucţiune alternativă, urmată de o instrucţiune repetitivă, urmată de o
instrucţiune de afişare.
d. Secvenţa conţine o instrucţiune alternativă inclusă într-o instrucţiune repetitivă.

V063I1

Considerăm variabilele întregi i şi j. Care dintre următoarele secvenţe de instrucţiuni C/C++


determină afişarea pe ecran , în urma executării, a succesiunii de cifre 55?

a. i=5; j=6; b. i=5; j=6;


while(j>4){ while(j>4)
cout<<i; cout<<j;
j--; j--;
}

c. j=5; d. j=5;
for(i=5;i<=5;i++) for(i=1;i<2;i++)
cout<<i; cout<<j;
V075I1

Care dintre următoarele instrucţiuni C/C++ sunt corecte sintactic dacă x şi y sunt două variabile
de tip întreg?
a. if (x < 2) && (x > - 5) b. if -5 < x < 2
{ {
x=x+1; x=x+1;
y=y-1; y=y-1;
} }
c. if x < 2 && x >-5 d. if (x < 2 && x > -5)
{ {
x=x+1; x=x+1;
y=y-1; y=y-1;
} }

V081I1
Care dintre expresiile de mai jos are valoarea 1 după executarea secvenţei de instrucţiuni C/C+
+, scrise
alăturat, în care toate variabilele sunt întregi?

a=11;b=1;
for(i=1;i<=5;i++)
{ b=b+1;
a=a-1;
}

a. a<b
b. a==b
c. a>b
d. a+b==6

V094I1

În secvenţa alăturată de instrucţiuni, variabilele i,j,k şi y sunt de tip întreg. Pentru care dintre
următoarele seturi de valori ale variabilelor i,j şi k variabila y va avea valoarea 1 în urma
executării secvenţei?
y=1;
if (k>0)
if (i!=j)
y=0;
else y=2;

a. k=0; i=5; j=5


b. k=10; i=5; j=6
c. k=10; i=5; j=5
d. y nu va avea valoarea 1 indiferent de valorile variabilelor i,j şi k

V095I1
În secvenţa alăturată de instrucţiuni, variabilele i, j, k, x şi y sunt de tip întreg. Pentru care dintre
următoarele seturi de valori ale variabilelor i, j şi k variabilele x şi y vor primi valori diferite între
ele în urma executării acestei secvenţe?

if (k>0)
if (i!=j) x=0;
else x=1;
else x=2;
if (i!=j)
if (k>0) y=0;
else y=2;
else y=1;

a. x şi y primesc aceeaşi valoare indiferent de valorile variabilelor i,j şi k


b. k=0; i=5; j=6
c. k=10; i=5; j=5
d. k=0; i=5; j=5

V096I1

În secvenţa alăturată de instrucţiuni, variabilele i, j, k şi y sunt de tip întreg. Pentru care dintre
următoarele seturi de valori ale variabilelor i, j şi k variabila y va avea valoarea 1 în urma
executării secvenţei?

if (k>0)
if (i!=j) y=0;
else y=1;
else y=2;

a. k=0; i=5; j=5


b. k=10; i=5; j=6
c. k=10; i=5; j=5
d. k=0; i=5; j=6

Fisiere
in limbajul C++
1. NOTIUNI INTRODUCTIVE

Un fisier este o colectie de date de acelasi tip, memorate pe suport extern.


Clasificarea fisierelor dupa continutul sau: •Fisiere text – contin o secventa de caractere ASCII
structurate pe linii
•Fisiere binare – contin o secventa de octeti, fara o structura predefinita
2. DECLARAREA FISIERELOR TEXT

Operatiile de intrare/iesire in limbajul C++ au folosit pana acum stream-urile cin si


cout, care sunt asociate automat tastaturii, respectiv ecranului.
Pentru ca un program sa poata citi/scrie informatii din/in fisier, trebuie sa asociem fisierul
respectiv unui stream de intrare/iesire.
In fisierul fstream.h sunt declarate clasele:
•ifstream (input file stream)
•ofstream (output file stream)
•fstream (file stream)
Ex:
ifstream f1;//am declarat un stream de intrare numit f1 ofstream f2;//am
declarat un stream de iesire numit f2 fstream f3;//am declarat un stream de
intrare-iesire numit f3 Obs: f1,f2,f3 sunt variabile de tip fisier (obiecte de tip
clasa)
3. Deschiderea fisierelor

Orice fisier are 2 nume:


nume logic - variabila de tip fisier

nume fizic - numele sub care este memorat pe suportul extern


Pentru a folosi stream-urile declarate va trebui sa le deschidem. La deschidere, se asociaza
strem-ului un fisier fizic si eventual se precizeaza modul de deschidere, care determina
operatiile permise cu fisierul respectiv.
Deschiderea se poate realiza in 2 moduri:
1) folosind functia membu open()
ex: ifstream f1;
f1.open(“date.txt”);
2)folosind numai parametrii corespunzatori functiei open() ex: ifstream
f1(“date.txt”);
!!!! Obs : daca fisierul fizic nu se afla in acelasi director atunci trebuie specificata calea
ex: 1) ofstream f2;
”); /* fisierul date.out se afla pe discul c: in directorul clasa9 */
2) ofstream f2(“c:\\clasa9\\date.out”);
//se creeaza un fisier vid cu numele date.out in care se vor face numai operatii de scriere
Deoarece clasa fstream nu are asociat un mod de deschidere implicit, se va asocia
unul.
Ex: fstream f;
f.open(“info.in”,ios::in); /* f a fost deschis ca fisier de intrare in modul ios::in
pentru operatii de citire*/
Ex: fstream g(“info.out”,ios::out); /* g a fost deschis ca fisier de iesire in modul ios::out pentru
operatii de scriere*/
Ex: fstream h(“info.ad”,ios::app); /* h a fost deschis ca fisier de iesire in modul ios::app pentru
operatii de adaugare (scriere) la sfarsitul fisierului */
4. Citirea datelor din fisier

Dupa deschiderea fisierului ca fisier de intrare se pot realiza operatii de citire. In


acest scop se poate utiliza operatorul de citire >>, sau pot fi utilizate functii membru
specifice.
Ex: ifstream f(“fis.txt”);
char c;
f>>c;//am citit primul caracter din fisier
Obs: operatorul >> ignora caracterele albe(spatiu, tab, enter) Ex: ifstream f(“fis.txt”);
char c;
f.get(c);/*am citit primul caracter din fisier, indiferent daca este caracter alb sau
nu */
5. Scrierea datelor intr-un fisier

Dupa deschiderea fisierului ca fisier de iesire se pot realiza operatii de


scriere folosind operatorul de scriere <<.

Ex: ofstream g(“out.txt”);


g<<“scriu mesaj in fisier”;
6. Operatii de test

Pointer de fisier- indica pozitia curenta in fisier.

Functia membru eof() - testeaza daca pointerul de fisier a ajuns la sfarsitul fisierului.
Returneaza o valoare diferita de 0 daca am ajuns la sfarsit, respectiv 0 daca nu am ajuns la sf. de
fisier.
7. Inchiderea unui fisier

Dupa realizarea tuturor operatiilor cu un fisier acesta trebuie inchis.


Inchiderea se realizeaza prin apelarea functiei membru close(). Ex: ofstream
g(“out.txt”);
……………………………
g.close();
!!! Obs: Operatia de inchidere este obligatorie, mai ales pentru fisiere de iesire. Daca nu se inchide
fisierul de iesire exista riscul de a pierde informatii (partial sau total).
Aplicatie: Se citesc din fisierul text date.in 3 numere intregi, sa se afiseze in fisierul date.out suma celor
3 numere citite
Tipuri structurate de date

Tipurile structurate sunt tipuri definite de utilizator prin combinarea altor tipuri.

Vom studia urmatoarele tipuri structurate de date:

1. Tipul tablou

2. Tipul şir de caractere


3. Tipul înregistrare

Tipul tablou

Tipul tablou este o structura care cuprinde un numar fixat de componente de acelaş tip.

Tipul componentelor se numeşte tipul de bază al tabloului.

Declararea tablourilor:

tip nume[dim1][dim2]....[dimn];

unde:

 tip=tipul de baza (tipul elemenetelor tabloului)

 nume =numele tabloului

 n=numarul de dimensiuni al tabloului.

Valoarea

lui n Numele tabloului

n=1 Tablou unidimensional (vector)

n=2 Tablou bidimensional(matrice)

n=3 Tablou tridimensional

 dimi =numar natural ce reprezinta numarul de elemente pe dimensiunea i

Numarul de elemente al tabloului= dim1 dim2 .... dimn

Tablouri unidimensionale (Vectori)

Declarare vectori:

tip nume[dim];
ex: int a[30]; // vectorul a contine maxim 30 elemente de tipul intreg

float b[10]; //vectorul b contine maxim 10 elemente de tipul real

La declararea unui tablou se pot atribui valori initiale elementelor:

tip nume[dim]={lista valori despartite prin virgule};

ex: int a[5]={3,-6,10,30,-7};

int b[5]={4,5}; // restul elementelor sunt initializate in mod automat cu 0

int x[ ]={1,5,8,9,2}; // compilatorul va considera ca vectorul are nr elemente=nr valorilor

din lista de valori, adica 5.

Pentru memorarea tablourilor se aloca o zona continua de memorie, de dimensiune fixa,

care este impartita in locatii de aceeasi dimensiune. Fiecare locatie memoreaza un element al

tabloului.

!!!!! Numerotarea elementelor vectorului se face de la 0 la nr elemente din vector-1

Ex: int a[20];

a vector cu n elemente de tip intreg, n<=20

-8 9 5 7 ..... -2

a0 a1 a2 a3 an-1

Numarul de ordine al unui element se numeste indice.

Referirea unui element al vectorului se face prin constructia: nume[indice]

Ex: a[1]=9; a[3]=7

Operatii cu elementele unui tablou

Cu elementele unui tablou se pot efectua operatiile premise de tipul de baza al tabloului.

1. Parcurgerea elementelor unui vector – se poate face:

a) de la primul element la ultimul


for(i=0; i<n; i++) //se parcurg elem vect

..................

b) de la ultimul element la primul

for(i=n-1; i>=0; i--) //se parcurg elem vect

............................

2. Citirea elementelor unui vector

for(i=0; i<n; i++) // sau for(i=0; i<=n-1; i++)

cout<<”a[“<<i<<”]=”;

cin>>a[i];

3. Afisarea elementelor unui vector

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

cout<<a[i]<<” “;

cout<<endl;

4. Operatia de atribuire – tipul celor doua tablouri trebuie sa fie acelasi

Ex: int a[10],b[10], n; // a,b vectori cu n elemente de tipul intreg

Nu este correct: b=a

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

b[i]=a[i];

METODE DE SORTARE A ELEMENTELOR UNUI VECTOR

1. Sortarea prin selectie (Selection Sort) a elementelor unui vector – metoda cu cele 2
for https://www.pbinfo.ro/articole/5605/sortarea-prin-selectie
http://www.youtube.com/watch?v=Ns4TPTC8whw
Sortarea prin selecție se bazează pe următoarea idee:
Fie un vector a[] cu n elemente;
- plasăm în a[0] cea mai mică valoare din vector;
- plasăm în a[1] cea mai mică valoare rămasă;
- etc.
O descriere a algoritmului este:
- parcurgem vectorul cu indicele i
- parcurgem cu indicele j elementele din dreapta lui a[i]
- dacă elementele a[i] și a[j] nu sunt în ordinea dorită, le interschimbăm
Observații
În algoritmul de mai sus, pentru fiecare valoare a lui i, în a[i] se obține cea mai mică/mare
valoare dintre elementele cu indici i, i+1, ..., n;
altfel spus, pentru fiecare i, în a[i] se selectează minimul/maximul dintre elementele i, i+1, ..., n.
Metoda se mai numește sortare prin selecție directă, sortare prin selecție implicită sau sortare
prin interschimbare.

#include <iostream>
using namespace std;

int main()
{
//declararea variabilelor
int a[20],i,n,j,aux; //aux- variabila folosita pentru interschimbare
//citirea datelor de intrare
cout<<"n=";cin>>n;
//citim elem vectorului
for (i=0;i<n;i++)
{
cout<<"a["<<i<<"]=";
cin>>a[i];
}

//afisez elem vector


for (i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
//sortam crescator elem vec folosind sortarea prin selectie
for (i=0;i<n-1;i++)//fiecare element a[i]
for (j=i+1;j<n;j++)//este comparat cu elementele situate dupa el
if (a[i]>a[j])//daca nu este respectat criteriul de sortare
{//interschimb a[i] cu a[j]
aux=a[i];
a[i]=a[j];
a[j]=aux;
}
//afisarea vect dupa sortare
for (i=0;i<n;i++)
cout<<a[i]<<" ";
return 0;
}

Calculul complexitatii:
Indiferent de aranjarea initiala a elementelor, numarul de comparatii efectuate este:

��−2
��−1
��−2

��(�� − 1)

∑ ∑ 1 = ∑(�� − ��) = ��(�� − 1) −


2= ��(�� − 1)

��=0
��=��+1

��=0
2

In cazul cel mai favorabil ( sir ordonat crescator) numarul de interschimbari este 0. In cazul
cel mai defavorabil (sir ordonat decrescator) pentru fiecare i se efectueaza o interschimbare
(trei atribuiri), deci costul corespunzator modificarii elementelor tabloului este 3, rezulta ca
numarul atribuirilor este:
��−2

3∑1 ��=0
= 3(�� − 1)

Luand in considerare atat comparatiile cat si atribuirile se obtine ca algoritmul sortarii prin
selectie apartine clasei O(��2). Deci pentru acest algoritm de sortare nu putem spune ca exista
caz favorabil, nefavorabil sau mediu, deoarece numarul de pasi efectuati este n(n-1)/2 indiferent
de structura datelor de intrare.
Avantajul acestei metode consta in faptul ca numarul de interschimbari de elemente din vector
este O(n) chiar daca timpul de executie este O(��2). Aceasta caracteristica devine foarte
importanta cand elementele din vector contin valori foarte mari. In acest caz, la fiecare
interschimbare trebuie mutata o cantitate mare de date, iar sortarea prin selectie minimizeaza
tocmai acest numar de interschimbari.
2. Metoda bulelor (Bubble Sort)- interschimbarea elementelor vecine(do-
while) https://www.pbinfo.ro/articole/5589/metoda-bulelor
http://www.youtube.com/watch?v=lyZQPjUT5B4
Cunoscută și sub numele BubbleSort, metoda bulelor se bazează pe următoare idee: •
fie un vector a[ ] cu n elemente
• parcurgem vectorul și pentru oricare două elemente învecinate care nu sunt în ordinea
dorită, le interschimbăm valorile
• după o singură parcurgere, vectorul nu se va sorta, dar putem repeta parcurgerea •
dacă la o parcurgere nu se face nicio interschimbare, vectorul este sortat

O reprezentare a algoritmului este:


• cat timp vectorul nu este sortat
o presupunem că vectorul este sortat
o parcurgem vectorul
▪ dacă două elemente învecinate nu sunt în ordinea dorită
▪ le interschimbăm
▪ schimbăm presupunerea inițială

Să ordonăm următorul vector în care n=5


#include <iostream>
using namespace std;

int main()
{
//declararea variabilelor
int a[20],i,n,j,aux; //aux- variabila folosita pentru interschimbare
//citirea datelor de intrare
cout<<"n=";cin>>n;

//citim elem vectorului


for (i=0;i<n;i++)
{
cout<<"a["<<i<<"]=";
cin>>a[i];
}

//afisez elem vector


for (i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
//sortam crescator elem vec folosind Bubble Sort (Metoda bulelor)
int ok;
do
{
ok = 1; //presupunem că vectorul este sortat
for(int i = 0 ; i < n - 1 ; i ++)// Se compara fiecare pereche de elemente adiacente (vecine) de
la //inceputul tabloului unidimensional
if(a[i] > a[i+1]) // si daca elementele nu sunt în ordinea dorita, le interschimbam și ok=0
{
aux = a[i];
a[i] = a[i+1];
a[i+1] = aux;
ok = 0;
}
}while(ok==0);//se repetă până când în vector, la o parcurgere, nu s-a făcut nicio interschimbare
//afisarea vect dupa sortare
for (i=0;i<n;i++)
cout<<a[i]<<" ";
return 0;
}
INTERCLASAREA A 2 VECTORI

https://www.pbinfo.ro/articole/5588/interclasarea-tablourilor

Considerăm două tablouri unidimensionale cu elemente numere întregi ordonate crescător.

Se dorește construirea unui alt tablou, care să conțină valorile din cele două tablouri, în

ordine.

O soluție foarte eficientă este interclasarea.

Algoritmul pe scurt:

- Considerăm două tablouri, cu na, respectiv nb elemente, ordonate crescător

- cele două tablouri se parcurg concomitent;

- se alege valoarea mai mică dintre cele două elemente curente

o se adaugă în al treilea tablou

o se avansează numai în tabloul din care am ales valoarea de adăugat

- parcurgerea unuia dintre cele două tablouri se încheie

- toate elementele din celălalt tablou, neparcurse încă, sunt adăugate în tabloul

destinație
- tabloul destinație are nc = na + nb elemente

Algoritmul de interclasare este foarte eficient. El are complexitate O(na+nb), adica O(n).

#include <iostream>

using namespace std;

int main()

int a[20],b[20],na,nb,c[40],nc=0,i,j;//vect a cu na elem, vect b cu nb elem

//citim na si elem vect a

cout<<"na: ";cin>>na;

//vom face test la citirea elem vect (sa fie in ordine crescatoare)

cout<<"a[0]=";cin>>a[0];//citim a[0]

for(int i=1;i<na;i++)

do

cout<<"a["<<i<<"]=";

cin>>a[i];

while(a[i]<a[i-1]);

//citim nb si elem vect b

cout<<"nb: ";cin>>nb;

//vom face test la citirea elem vect ( sa fie in ordine crescatoare)

cout<<"b[0]=";cin>>b[0];//citim b[0]

for(int i=1;i<nb;i++)

do

cout<<"b["<<i<<"]=";

cin>>b[i];

}
while(b[i]<b[i-1]);

//afisam cei 2 vect fiecare pe un rand

cout<<"vect a: ";

for(int i=0;i<na;i++) cout<<a[i]<<" ";

cout<<endl;

cout<<"vect b: ";

for(int i=0;i<nb;i++) cout<<b[i]<<" ";

cout<<endl;

//interclasam cei 2 vect

i=0;

j=0;

//Cat timp nu am pus in c toate elementele din ambii vectori a si b (i < na si j < nb):

while(i<na && j<nb)

if(a[i]<b[j]) c[nc++]=a[i++];// se poate scrie si { c[nc]=a[i]; nc++;i++;}

else c[nc++]=b[j++];

//se iese din while cand vectorul a sau b are toate elem adaugate in c

if(i<na)//daca au mai ramas elemente in vectorul a neadaugate in c, se adauga in corpore

for(int k=i;k<na;k++) c[nc++]=a[k];

else //sau adaugam elementele ramase in vectorul b

for(int k=j;k<nb;k++) c[nc++]=b[k];

cout<<"Vect c:";

for(int i=0;i<nc;i++) cout<<c[i]<<" ";

return 0;

Descriere algoritm pe larg

Indicii: cu i parcurgem vectorul a, cu j parcurgem vectorul b

1. Declaram un vector c – gol ( adica nc = 0)

2. Cat timp nu am pus in c toate elementele din ambii vectori a si b (i < na si j < nb):

a. Comparam elementul a[i]cu b[j]


b. Adaugam in c, pe pozitia nc, elementul cel mai mic dintre a[i]si b[j]

c. Incrementam nc

d. Incrementam indicele corespunzator vectorului din care am facut adaugarea

(incrementam i daca elementul a[i] a fost mai mic, si in caz contrar,

incrementam j)

3. Verificam in care dintre cei doi vectori au mai ramas elemente.

a. Daca i < na atunci inseamna ca mai avem elemente in vectorul a, pe care le luam

in ordine si le adaugam la finalul vectorului c.

b. Daca j < nb atunci inseamna ca mai avem elemente in vectorul b, pe care le

luam in ordine si le adaugam la finalul vectorului c.

4. Algoritmul se incheie, iar vectorul c contine elementele din a si din b ordonate

crescator.

1. Se citesc n numere intregi reținute într-un vector de maxim 255 de


elemente. Să se afișeze elementele vectorului în ordinea citirii și în ordine
inversă citirii.
#include <iostream>
using namespace std;

int main ()
{
///declararea vectorului a
int a[255],n,i;
///citirea datelor de intrare
cout<<"n= "; cin>>n;
///citirea elementelor din vector
for(i=0;i<n;i++)
{
cout<<"a["<<i<<"]= ";
cin>>a[i];
}
///afisarea elementelor vectorului
for(i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl;
///afisarea in ordineinversa a elementelor vectorului
for(i=n-1;i>=0;i--)
cout<<a[i]<<" ";
return 0;
}

2. In fisierul date2.txt se gaseste pe prima linie numarul de elemente n si apoi


pe urmatoarea linie, cele n valori ale unui vector. Sa se afiseze pozitia pe care
se afla minimul valorilor din fisier.
#include <iostream>
#include<fstream>
using namespace std;

int main()
{
int a[30], n, i,min,imin;
ifstream f("date2.txt");
f>>n;
///citesc elementele vectorului
for(i=1; i<=n;i++)
f>>a[i];
///algoritmul de determinare a valorii minime
min=a[1];
imin=1;///indicele valorii minime
for(i=2;i<=n;i++)
if(a[i]<min) {
min=a[i];
imin=i;
}
cout<<"Valoarea minima este: "<<min<<" si se afla pe pozitia"<<imin;
return 0;
}

3. Considerăm un vector cu n elemente numere întregi. Să se afișeze dacă o


valoare dată există în vector.

#include<iostream>
using namespace std;
int main()
{
int a[20], n, x, i, gasit=0;
cout<<"n="; cin>>n;
for(i=1; i<=n; i++) ///citirea vectorului
{
cout<<"a["<<i<<"]=";
cin>>a[i];
}
for(i=1; i<=n; i++)///afisarea vectorului
cout<<a[i]<<" "<<endl;
cout<<"dati valoarea cautata: "; cin>>x;
for(i=1; i<=n; i++)
if(a[i]==x) gasit=1;
if(gasit==1) cout<<"valoarea cautata este in vector ";
else cout<<"numarul nu are valoare in vector ";
return 0;
}

4. Afiseaza codurile ASCII corespunzatoare caracterelor dintr-un vector de


caractere.
#include<iostream>
using namespace std;
int main()
{
char a[20];
int n, i;
cout<<"n="; cin>>n;
for(i=1; i<=n; i++) ///citirea vectorului
{
cout<<"a["<<i<<"]=";
cin>>a[i];
}
for(i=1; i<=n; i++)///afisarea vectorului
cout<<a[i]<<" ";
cout<<endl;
cout<<"Codurile ASCII sunt:"<<endl;
for(i=1;i<=n;i++)
cout<<a[i]<<"-->"<<(int)a[i] <<endl; //am transformat vectorul de tip caracter //in
valoare int
return 0;
}

5. Se citeste un vector cu n (n<=1000) elemente, numere intregi. Sa se numere


cate dintre elementele vectorului sunt palindrom, si sa se afiseze aceste
elemente.
#iinclude<iostream>
using namespace std;
int main()
{
unsigned int a[20],n,np=0,i,inv,nr,z;
cout<<"n=";cin>>n;
//citim elem vect
for(i=0;i<n;i++)
{
cout<<"a["<<i<<"]=";
cin>>a[i];
}
//afisez elem vect
for(i=0;i<n;i++)
cout<<a[i]<<" ";
cout<<endl<<"valorile palindrom din vector sunt:"<<endl;
//rezolv cerinta probl
for(i=0;i<n;i++)//parcurg vect
{
//verific daca fiecare elem a[i] este palindrom
nr=a[i];//retin in nr valoarea initiala a lui a[i] deoarece dupa determ inversului lui a[i],
//a[i] devine 0 si isi pierde valoarea
inv=0;//initializez inv fiecarui elem a[i] cu 0
//determin inv lui a[i]
while(a[i]!=0)
{
z=a[i]%10;
inv=inv*10+z;
a[i]=a[i]/10;
}
//verific daca elem a[i] este palindrom
if(nr==inv)//in caz afirmativ
{
cout<<nr<<" ";//afisez valoarea initiala a lui a[i]
np++;//incrementez variabila ce retine nr de palindrome
}
}
cout<<endl;
if(np==0) cout<<"nu exista palindrom";
else cout<<"sunt "<<np<<" nr palindrom";
return 0;
}

6. TEMA Sa se scrie un program care citește și afișează doi vectori care au un


număr de n elemente întregi, fiecare. Sa se calculeze si sa se afiseze suma
rapoartelor elementelor a[i]/b[i] celor doi vectori
n=5
vectorul a: 4 8 9 6 7
vectorul b: 2 4 3 2 3
Suma= 12
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
int n,i;
float S=0, a[20], b[20];
ifstream f ("vectori6.txt");
//ofstream g("rezultat6.out");
f>>n;
for(i=1; i<=n; i++)
f>>a[i];
for(i=1; i<=n; i++)
f>>b[i];
for(i=1; i<=n; i++)
S = S +(a[i]/b[i]);
cout<<S;
//g<<S;
return 0;
}

7. Fiind dat un vector a cu n elemente numere întregi, să se construiască alți


doi vectori: primul va conține numai elementele pare din vectorul inițial, iar
al doilea numai elementele impare din vectorul inițial

n=8 și elementele vectorului inițial 1, 64, 2, 5, 23, 9, 6, 11

obținem vectorii b= (64,2,6) și c=( 1,5,23,9,11)


#include <iostream>
#include <fstream>
using namespace std;

int main()
{
ifstream f ("vectori6.txt");
ofstream g("rezultat6.out");

int n, p[20],v[20], a[40], i, par=1, imp=1;


f>>n;
for(i=1; i<=n; i++)
f>>a[i];
for(i=1; i<=n; i++)
if(a[i]%2==0)
{
p[par]=a[i];
par++;
}
else
{
v[imp]=a[i];
imp++;
}
for(i=1; i<par; i++)
g<<p[i]<<" ";
g<<endl;
for(i=1; i<imp; i++)
g<<v[i]<<" ";
return 0;
}

8. Se citesc n numere întregi care se rețin într-un vector. Să se afișeze


numerele prime din vector și numărul lor.
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
ifstream f("vectori8.txt");
int n, d, i, a[20], prim, np=0;
f>>n;
for(i=1; i<=n; i++)
f>>a[i];
for(i=1; i<=n; i++)
{
prim=1;
if(a[i]==0 || a[i]==1)prim=0;
else
for(d=2; d<=a[i]/2; d++)
if(a[i]%d==0) prim=0;
if(prim==1)
{
cout<<a[i]<<" nr. prim"<<endl;
np++;
}
}
cout<<np<<" numere prime";
return 0;
}
9. Scrieți un program care realizeaza inversarea elementelor în același vector
fără a utiliza un vector suplimentar.

pt n=4 și vectorul a=(5,2,3,9) obținem la afișare a=(9,3,2,5)


#include <iostream>
using namespace std;

int main()
{
int aux, n, i, a[20];
cout<<"n= "; cin>>n;
for(i=0; i<n; i++)
cin>>a[i];
for(i=0; i<n/2; i++)
{
aux=a[i];
a[i]=a[n-i-1];
a[n-i-1]=aux;
}
for(i=0; i<n; i++)
cout<<a[i]<<" ";
return 0;
}

10. Se considera un vector cu n componente întregi. Sa se afișeze valoarea cea


mai mica din prima jumătate și valoarea cea mai mare din a doua jumătate a
vectorului.

pt n=6 și vectorul 12 2 9 7 8 3

se va afișa 2 și 8
#include<iostream>
using namespace std;
int main()
{
int i,n,a[20],min,max;
cout<<"n= ";cin>>n;
for(i=0;i<=n-1;i++)
{
cout<<"a["<<i<<"]=";
cin>>a[i];
}
min=a[0];
max=a[n/2];
for(i=0;i<n;i++)
{
if(i<n/2){
if(a[i]<min) min=a[i];
}
else if(a[i]>max) max=a[i];
}
cout<<"Minimul din prima jumatate este:"<<min<<endl;
cout<<"Maximul din a doua jumatate este:"<<max;
return 0;
}

11. Se citeste un vector A cu n (n<=1000) elemente numere naturale. Ordonati


crescator primele k elemente din vector, iar celelalte elemente rămase,
descrescător.

#include<iostream>
using namespace std;
int main()
{
int a[20], aux, i,j, n,k;
cout<<"n= "; cin>>n;
cout<<"k= "; cin>>k;
for(i=1; i<=n; i++)
{
cout<<"a["<<i<<"]= ";
cin>>a[i];
}
for(i=1; i<=n; i++)
cout<<a[i]<<" ";
for(i=1; i<k-2; i++)
for(j=i+1; j<k-1; j++)
if(a[i]>a[j])
{
aux=a[i];
a[i]=a[j];
a[j]=aux;
}
for(i=k+1; i<=n-1; i++)
for(j=i+1; j<=n; j++)
if(a[i]<a[j])
{
aux=a[i];
a[i]=a[j];
a[j]=aux;
}
cout<<endl;
for(i=1; i<=n; i++)
cout<<a[i]<<" ";
return 0;
}

//12.Scrieti un program care determină si afisează, cel mai mare număr care
se poate forma, având exact aceleasi cifre ca număr natural citit inițial.
nr=24913 se afișează numărul maxim obținut nrmax=94321
 citim numarul
 extrag cifrele si le adaug in vector pe rand, incepand de la ultima
 ordonez descrescator aceste cifre fol met. Bubble Sort
 afisez cifrele dupa ordonare
 formez numarul cu cifrele ordonate descrescator

#include<iostream>
using namespace std;
int main()
{
int i,j,n,a[20],aux,nr,nrmax=0;
cout<<"nr= ";cin>>nr;//citim numarul
i=0;
while(nr!=0)
{
a[i]=nr%10;//extrag cifrele si le adaug in vector pe rand, incepand de la ultima
nr=nr/10;
i++;//numar cifrele

}
n=i;//numarul de cifre din numar
for(i=0;i<n;i++)//afisez cifrele extrase
cout<<a[i]<<" ";
cout<<endl;
//ordonez descrescator aceste cifre fol met. Bubble Sort
for(i=0;i<=n-2;i++)//compar fiecare elem cu toate elem care-l urmeaza
for(j=i+1;j<=n-1;j++)
if(a[i]<a[j])
{
aux=a[i];
a[i]=a[j];
a[j]=aux;
}
//afisez cifrele dupa ordonare
for(i=0;i<n;i++)//afisez cifrele extrase
cout<<a[i]<<" ";
cout<<endl;
//formez numarul cu cifrele ordonate descrescator
for(i=0;i<=n-1;i++)
nrmax=nrmax*10+a[i];
cout<<"Cel mai mare numar este: "<<nrmax;
return 0;
}

//13. . Se citeste un vector A cu n (n<=1000) elemente numere naturale. Sa se


verifice și să se afișeze dacă elementele vectorului sunt distincte.

/*
using namespace std;
int main()
{
int n,i,j,a[20],ok=0;
cout<<"n= "; cin>>n;
for(i=1;i<=n;i++)
{
cout<<"a["<<i<<"]=";
cin>>a[i];
}
//for(i=1;i<=n-1;i++)
// for(j=i+1;j<=n;j++)
//metoda imbunatatita se opreste cand ok devine 1
for(i=1;i<=n-1&&ok==0;i++)
for(j=i+1;j<=n&&ok==0;j++)
if(a[i]==a[j]) ok=1;
if(ok==1) cout<<"elementele nu sunt distincte";
else cout<<"elementele sunt distincte";
return 0;
}

//14. Se consideră un vector cu n componente întregi. Să se ordoneze crescător


valorile pare din vector, celelalte elemente rămânând pe aceleași poziții.

#include<iostream>
using namespace std;
int main()
{
int n,i,j,a[20],aux;
cout<<"n= "; cin>>n;
for(i=1;i<=n;i++)
{
cout<<"a["<<i<<"]=";
cin>>a[i];
}
cout<<"Sirul initial este:";
cout<<endl;
for(i=1;i<=n;i++)
cout<<a[i]<<" ";
cout<<endl;
for(i=1;i<=n-1;i++)
for(j=i+1;j<=n-1;j++)
if(a[i]>a[j]&&a[i]%2==0&&a[j]%2==0);
{
aux=a[i];
a[i]=a[j];
a[j]=aux;
}
cout<<"Sirul ordonat este:";
cout<<endl;
for(i=1;i<=n;i++)
cout<<a[i]<<" ";
cout<<endl;
return 0;
}

16. Se citeste un vector A cu n (n<=1000) elemente numere naturale. Ordonati


crescator elementele prime si plasati-le la începutul vectorului si apoi
descrescator pe cele neprime, în a doua parte a vectorului. Afisati vectorul
ordonat ca în cerinta.

Exemplu: n=7, A={33, 13, 77, 19, 5, 34, 100} => 5 13 19 100 77 34 33
#include<iostream>
using namespace std;

int main()
{
int n,i,j,a[20],b[20],aux,ok;
cout<<"n= "; cin>>n;
for(i=1;i<=n;i++)
{
cout<<"a["<<i<<"]=";
cin>>a[i];
ok=1;
if(a[i]==0 || a[i]==1) ok=0;
else
for(j=2;j<=a[i]/2;j++)
if(a[i]%j==0) ok=0;
b[i]=ok;
}
for(i=1;i<n;i++)
for(j=i+1;j<=n;j++)
if(b[i]==1 && b[j]==1 && a[i]>a[j] ||
b[i]==0 && b[j]==0 && a[i]<a[j] ||
b[i]==0 && b[j]==1)
{
aux=a[i];
a[i]=a[j];
a[j]=aux;
aux=b[i];
b[i]=b[j];
b[j]=aux;
}
for(i=1;i<=n;i++)
cout<<a[i]<<" ";
return 0;
}
17. Se considera un vector cu n elemente numere naturale. Sa se afiseze
elementele din vector care au k divizori, unde k este un numar natural dat. In
situatia in care nu exista elemente care sa corespunda cerintei se afiseaza
mesajul nu exista.
Pt n=6, k=3 si
elementele 25 6 9 12 11 22
se va afisa 25 9
#include <iostream>
using namespace std;
int main()
{
int n,a[20],k,i,d,nrd=2,ok=0;
cout<<"n= ";cin>>n;
for(i=1;i<=n;++i)
{
cout<<"a["<<i<<"]=";
cin>>a[i];
}
cout<<"k= ";cin>>k;
for(i=1;i<=n;++i)
{
for(d=2;d<=a[i]/2;++d)
{
if(a[i]%d==0) nrd++;
}
if(nrd==k) {cout<<a[i]<<" ";
ok=1;}
nrd=2;
}
if(ok==0) cout<<"NU EXISTA";
}

18. Se da un vector cu n elemente numere naturale. Sa se numere cate


elemente din vector au suma cifrelor egala cu numarul de ordine al
elementelor.
n=8, pornind de la indicele i=1
4 5 3 22 11111 2 52 8
i=1 i=2 i=3 i=4 i=5 i=6 i=7 i=8
se va afisa 5
#include<iostream>
using namespace std;
int main()
{
int n, i, a[20], s, k=0;///k este nr de elemente
cout<<"n= "; cin>>n;
for(i=1; i<=n; i++)
{
cout<<"a["<<i<<"]="; cin>>a[i];
s=0;
while(a[i]!=0)
{
s=s+a[i]%10;
a[i]=a[i]/10;
}
if(s==i) k++;
}
cout<<"Nr de elemente este: "<<k;
return 0;
}

https://www.pbinfo.ro/articole/5617/vectori-caracteristici-si-de-frecventa

19. Se dau două șiruri de cifre zecimale. Să se determine cifrele comune, în


ordine crescătoare.
pt n=8 si cifrele 7 9 0 4 7 5 3 7 si
m=6 2 3 9 5 4 7
cifrele comune sunt 3 4 5 7 9
Construim vectorii caracteristici pentru sirul de cifre a si b, respectiv c si ch
#include <iostream>
using namespace std;

int main()
{
unsigned int n,m,ca,cb, c[10]={0},ch[10]={0},i;//initializam cu 0 valorile vectorilor
//caracteristici
cout<<"n=";cin>>n;///n cifre in primul sir
for(i=1;i<=n;i++)
{
cin>>ca;
c[ca]=1;
}
cout<<"m=";cin>>m;///m cifre in al doilea sir
for(i=1;i<=m;i++)
{
cin>>cb;
ch[cb]=1;
}
for(i=0;i<9;i++) ///daca in ambii vectori caracteristici corespunzatori cifrei i avem
//valoarea 1, atunci inseamna ca acea cifra apare in ambii vectori
if(c[i]==1 && ch[i]==1) cout<<i<<" ";
return 0;
}
20. În fişierul text numere.in sunt cel mult 998 de numere naturale nenule,
distincte. Scrieţi un program C/C++ eficient din punct de vedere al timpului
de execuţie, care să scrie în fişierul numere.out, pe o linie, în ordine
descrescătoare, separate prin câte un spaţiu, numerele naturale nenule, de ,
care nu apar în fişierul numere.in.

numere.in numere.out

107 4 5 8 1 6 999 999 ... 108 106 105 ... 10 7 3 2


9

#include <iostream>
#include<fstream>
using namespace std;

int main()
{
ifstream f("numere.in");///fisier care contine datele de intrare
ofstream g("numere.out");///fisier care contine datele de iesire
unsigned int nr,i,fr[999]={0};///declararea cu initializare a vectorului
caracteristic
///citirea datelor din fisier si crearea vectorului caracteristic
while(f>>nr)///cat timp avem numere de citit din fisier (folosim atunci cand nu
stim cate numere avem de citit)
fr[nr]=1;
///parcurgerea vectorului caracteristic si afisarea valorilor care nu apar in fisierul
numere.in
for(i=999;i>=1;i--)
if(fr[i]==0) g<<i<<" ";
///inchiderea fiserelor
f.close();
g.close();
return 0;
}

21. In fisierul text date.in se gasesc maxim 2000 de numere naturale de maxim 2 cifre. Sa
se afiseze numărul care apare de număr minim de ori si numărul care apare de număr
maxim de ori in fișier. Daca exista mai multe astfel de numere, se va afisa primul număr in
ordine crescatoare care indeplineste conditia.

date.in : 2 4 6 5 2 5 5 12 87 99 1
fr[100]={0}; //initializarea vectorului cu 0

i 0 1 2 3 4 5 6 7 … 12 … 87 … 99

fr[i 0 1 2 0 1 3 1 0 1 1 1
]

primul nr care apare de nr minim de ori este 1

primul nr care apare de nr maxim de ori este 5

#include <iostream>
#include <fstream>
using namespace std;

int main()
{
ifstream f("date.in");
unsigned int nr, min=100, max=0, fr[100]={0}, i;
while(f>>nr)
fr[nr]++;///vector de aparitie
for(i=0; i<=99; i++)
{
if(fr[i]<min&&fr[i]!=0) min=fr[i];
if(fr[i]>max) max=fr[i];
}
for(i=0; i<=99; i++)
if(fr[i]==min)
{
cout<<i<<" ";
break;
}
for(i=0; i<=99; i++)
if(fr[i]==max)
{
cout<<i<<" ";
break;
}
return 0;
}

22. În fişierul numere.in se află pe prima linie maxim un milion de numere naturale de cel
mult 2 cifre fiecare. Scrieţi programul C/C++ care citeşte numerele din fişierul numere.in şi
determină şi afişează pe ecran care dintre numerele citite apare de cele mai multe ori în
fişier.
Exemplu :

numere.in se afişează

5316313613 3
23. Se da un număr natural n între 1 şi 100000. Să se afişeze numărul de elemente al
mulţimii cifrelor sale și cel mai mare număr care se poate forma cu cifrele sale.

Numărul 23424 conţine 3 cifre distincte, 2, 3 şi 4 si obtinem numarul 44322

Indicaţie de rezolvare: Construim vectorul de frecvenţe asociat numărului n, notat cu fr. Numărul
maxim care poate fi format cu cifrele sale se obţine prin parcurgerea în ordine descrescătoare, de
la 9 la 0, a vectorului de frecvenţe şi scriind fiecare cifră c de fr[c] ori.
Vectorul de apariții pentru cifrele unui număr se declară sub forma unui vector cu 10
componente, de la a[0],…,a[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.

i 0 1 2 3 4 5 6 7 8 9

fr[i 0 0 3 3 3 0 0 0 0 0
]

#include <iostream>
using namespace std;

int main()
{
int i,nr,fr[10]={0};
cout<<"nr="; cin>>nr;
while(nr>0) //construim vectorul de aparitii
{
fr[nr%10]++;
nr=nr/10;
}

for(i=9;i>=0;i--)
if(fr[i]>0)
{
for(int j=1;j<=fr[i];j++)//merg pe cate aparitii are
cout<<i ; //si de atatea ori afisez cifra i
}
return 0;
}

Algoritmi elementari
Stergerea unui element de pe o pozitie data
for(i=poz;i<n;i++)
a[i]=a[i+1];
n- -;

Inserarea unui element intr-un vector pe o pozitie data


Pt ca valorile sa nu fie inlocuite se incepe prelucrarea elementelor de la
dreapta la stanga
for(i=n-1;i>=poz;i--)
a[i+1]=a[i];
cout<<”a[poz]= ”; cin>>a[poz];
n++;

23. Se da un vector cu n componente nr reale. Sa se stearga valoarea maxima


din vector.
pp ca avem o singura valoare maxima in vector
#include <iostream>
using namespace std;

int main()
{
int n, poz, a[20], max, i;
cout<<"n= "; cin>>n;
///citirea elementelor din vector
for(i=0; i<=n-1; i++)
cin>>a[i];
///alg de detrminare a maximului
max=a[0];
for(i=1; i<=n-1; i++)
if(a[i]>max)
{
max=a[i];
poz=i;
}
///stergem maximul prin mutarea spre stanga a elementelor
for(i=poz; i<=n-1; i++)
a[i]=a[i+1];
n--;
///afisarea elementelor vectorului
for(i=0; i<=n-1; i++)
cout<<a[i]<< " ";
return 0;
}

24. Se da un vector cu n componente nr reale. Sa se insereze pe fiecare pozitie


para elementul 0.
pt n=5 si elementele din vector 0 1 2 3 4
se va afisa
0001020304

#include<iostream>
using namespace std;

int main()
{
int a[100],n,i,j;
cout<<"n=";cin>>n;
//citirea elem vect
for(i=0;i<n;i++)
cin>>a[i];
for(i=0; i<n; i=i+2)
{
for(j=n-1;j>=i;j--)///pt ca val sa nu fie inlocuite incepem prelucr de la dr la stg
a[j+1]=a[j];
a[i]=0;//plasez valoarea 0 pe pozitie para
n++;//incrementez nr de elemente din vector
}
//afisez elementele din vector
for(i=0;i<n;i++)
cout<<a[i]<<” “;
return 0;
}
Aplicatii cu matrici nepătratice (numarul de linii ≠ numarul de coloane)
1. Să se citească și să se afișeze o matrice cu n linii și m coloane cu elemente întregi date.
pt n= 2 , m=3 si elementele
a[0][0]=1
a[0][1]=2
a[0][2]=3
a[1][0]=4
a[1][1]=5
a[1][2]=6
se va afisa
123
456
iar pentru elementele
a[0][0]=12
a[0][1]=2365
a[0][2]=2
a[1][0]=1523
a[1][1]=137
a[1][2]=1526
se va afisa
12 2365 2
1523 137 1526
#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
///declararea matricei si a datelor de intrare
int a[30][30],n,m,i,j;
///citirea datelor de intrare
cout<<"n= ";cin>>n;///nr linii
cout<<"m= ";cin>>m;///nr coloane
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
cout<<"a["<<i<<"]["<<j<<"]= ";
cin>>a[i][j];
}
///afisarea matricei
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
cout<<setw(5)<<a[i][j];
cout<<endl;
}
return 0;
}

2. Fiind dată o matrice cu n linii și m coloane, cu elemente întregi de maxim două cifre, să
se calculeze suma tuturor elementelor din matrice.
pt datele de la pb 1 se va afisa s=21
#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
///declararea matricei si a datelor de intrare
int a[30][30],n,m,i,j,s=0;
///citirea datelor de intrare
cout<<"n= ";cin>>n;///nr linii
cout<<"m= ";cin>>m;///nr coloane
for(i=0;i<n;i++)
for(j=0;j<m;j++)
cin>>a[i][j];
///afisarea matricei
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
cout<<setw(5)<<a[i][j];
cout<<endl;
}
///suma tuturor elementelor
for(i=0;i<n;i++)
for(j=0;j<m;j++)
s=s+a[i][j];
cout<<endl<<"suma elementelor este: "<<s;
return 0;
}

3. Fiind data o matrice cu n linii si m coloane, cu elemente întregi, să se calculeze suma


elementelor pe fiecare linie.

#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
///declararea matricei si a datelor de intrare
int a[30][30],n,m,i,j,s;
///citirea datelor de intrare
cout<<"n= ";cin>>n;///nr linii
cout<<"m= ";cin>>m;///nr coloane
for(i=0;i<n;i++)
for(j=0;j<m;j++)
cin>>a[i][j];
///afisarea matricei
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
cout<<setw(5)<<a[i][j];
cout<<endl;
}
///suma elementelor pe fiecare linie
for(i=0;i<n;i++)
{
s=0;
for(j=0;j<m;j++)
s=s+a[i][j];
cout<<endl<<"suma elementelor de pe linia "<<i<<" este "<<s;
}
return 0;
}

4. Fiind data o matrice cu n linii si m coloane, cu elemente întregi, să se calculeze suma


elementelor pe fiecare coloană.

#include<iostream>
#include<iomanip>
using namespace std;

int main()
{
///declararea matricei si a datelor de intrare
int a[30][30],n,m,i,j,s;
///citirea datelor de intrare
cout<<"n= ";cin>>n;///nr linii
cout<<"m= ";cin>>m;///nr coloane
for(i=0;i<n;i++)
for(j=0;j<m;j++)
cin>>a[i][j];
///afisarea matricei
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
cout<<setw(5)<<a[i][j];
cout<<endl;
}
///suma elementelor pe fiecare coloana
for(j=0;j<m;j++)
{
s=0;
for(i=0;i<n;i++)
s=s+a[i][j];
cout<<endl<<"suma elementelor de pe coloana "<<j<<" este "<<s;
}
return 0;
}

5. Se consideră o matrice cu n linii si m coloane, (1≤n≤30, 1≤m≤30) ce memorează


numere întregi. Scrieți un program C/C++ care citește de la tastatură n,m și elementele
matricei și care afișează pe ecran, separate prin câte un spațiu, valorile minime de pe
fiecare coloană, în ordine de la ultima la prima coloană.
pt n=5, m=5 si matricea alăturată se vor afișa pe ecran valorile 1 1 3 2 1

6. Fiind data o matrice cu n linii si m coloane, să se calculeze și să se afișeze suma


elementelor de pe conturul matricei.

s=64
#include<iostream>
using namespace std;
int main()
{
int n,m,a[20][20],s=0,i,j;
cout<<"n= "; cin>>n;
cout<<"m= "; cin>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
cin>>a[i][j];
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
if(i==1 || j==m || i==n || j==1)
s=s+a[i][j];
}
cout<<"s= "<<s;
return 0;
}

7. Scrieti un program C/C++ care citeste de la tastatura trei numere naturale n, m, k si apoi
m*n numere intregi reprezentand elementele unui tablou bidimensional cu linii
numerotate de la 1 la m si coloane numerotate de la 1 la n. Programul elimina linia k si
reafiseaza matricea.

#include<iostream>
using namespace std;

int main()
{
unsigned int m,n,k;
int i,j,a[30][30];
cout<<"m= ";cin>>m;///linie
cout<<"n= ";cin>>n;///coloana
cout<<"k= ";cin>>k;
///citirea elementelor din matrice
for(i=1;i<=m; i++)
for(j=1;j<=n;j++)
cin>>a[i][j];
///eliminarea liniei k
for(i=k;i<=m;i++)
for(j=1;j<=n; j++)
a[i][j]=a[i+1][j];
m--;
cout<<endl;
///afisarea matricii
for(i=1; i<=m; i++)
{
for(j=1; j<=n; j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}

8.
pt n=4 si m=5 obtinem matricea
11111
12222
12333
12344
#include<iostream>
using namespace std;
int main()
{
int a[100][100],m,n,i,j;
///testarea pentru m si n pt a indeplini conditiile din cerinta
do{
cout<<"n= ";cin>>n;
}while(n<2 || n>10);
do{
cout<<"m= ";cin>>m;
}while(m<2 || m>10);
///construim matricea prin atribuire de valori conform cerintei
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
if(i<j)a[i][j]=i;
else a[i][j]=j;
///afisarea matricei
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}

Aplicatii cu matrici pătratice date

9. Se consideră o matrice pătratică cu n x n elemente întregi. Sa se calculeze și să


se afișeze suma elementelor de pe diagonala principala și produsul elementelor
de pe diagonala secundara.

#include<iostream>
using namespace std;

int main()
{
int a[25][25], i,j,n, S=0,P=1;
cout<<"n= ";cin>>n;
///citirea elementelor din matrice
for(i=0;i<n;i++)
for(j=0;j<n;j++)
cin>>a[i][j];
/**Varianta1
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(i==j) S=S+a[i][j];
if(i+j==n-1) P=P*a[i][j];
}
*/
///Varianta 2
for(i=0;i<n;i++)
{
S=S+a[i][i];
P=P*a[i][n-i-1];///pt ca elem de pe DS indeplinesc conditia i+j=n-1, obtinem j=n-1-i
}
cout<<"Suma elementelor de pe DP este "<<S<<endl;
cout<<"Produsul elementelor de pe DS este "<<P;
return 0;
}

10. Se consideră o matrice cu n linii si n coloane cu elemente intregi. Sa se verifice


daca matricea este simetrica fata de diagonala principala.

pt n=3 si matricea

123
254
347
se afișează mesajul Matricea este simetrica fata de DP

#include<iostream>
using namespace std;

int main()
{
int a[25][25], i,j,n, sim=1;///presupunem ca matricea este simetrica
cout<<"n= ";cin>>n;
///citirea elementelor din matrice
for(i=0;i<n;i++)
for(j=0;j<n;j++)
cin>>a[i][j];

for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(a[i][j]!=a[j][i]) sim=0;
if(sim==1) cout<<"Matricea este simetrica";
else cout<<"Matricea nu este simetrica";
return 0;
}

11. Sa se construiasca o matrice a cu n linii si n coloane in care elementele de pe


diagonala principala au valoarea 2, elementele de deasupra diagonalei principale
au valoarea 1 si elementele de sub diagonala principala au valoarea 3

pt n=5 obtinem matricea


21111
32111
33211
33321
33332
#include<iostream>
using namespace std;

int main()
{
int a[25][25], i,j,n;
cout<<"n= ";cin>>n;
///am atribuit valori elementelor din matrice, nu exista citirea elementelor
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(i==j) a[i][j]=2;
else if(i<j) a[i][j]=1;
else a[i][j]=3;
///afisarea matricei
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
cout<<a[i][j]<<" ";
cout<<endl;
}

return 0;
}

12. Scrieţi un program C/C++ care citeşte de la tastatură un număr natural n (1≤ n≤ 10) apoi
construieşte în memorie o matrice cu 2*n linii şi 2*n coloane, numerotate de la 1 la 2*n, astfel
încât parcurgând doar liniile impare ale matricei de sus în jos şi fiecare linie impară de la stânga
la dreapta se obţin în ordine strict crescătoare toate numerele impare cuprinse în intervalul [1,
4*n ], iar parcurgând doar liniile pare ale matricei de sus în jos şi fiecare linie pară de la dreapta
2

la stânga se obţin în ordine strict crescătoare toate numerele pare cuprinse în intervalul [1,

4*n ], ca în exemplu.
2

Programul afişează pe ecran matricea obţinută, câte o linie a matricei pe câte o linie a
ecranului, elementele fiecărei linii fiind separate prin câte un spaţiu.
Exemplu: pentru n=2 se obţine matricea alăturată

#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
int a[10][10],n,i,j,val=1;
do{
cout<<"n= ";
cin>>n;

}while(n<1 || n>10);
/// Introducem valori pe liniile impare , pornind de la o valoare initiala , val=1
for(i=1;i<=2*n;i++)
for(j=1;j<=2*n;j++)
if(i%2!=0)
{
a[i][j]=val;
val+=2;
}
/// Introducem valori pe liniile pare de la dreapta la stanga, pornind de la o valoare initiala ,
val=2

val=2;
for(i=1;i<=2*n;i++)
for(j=2*n;j>=1;j--)
if(i%2==0)
{
a[i][j]=val;
val+=2;
}
/// Afisarea matricei
for(i=1;i<=2*n;i++)
{
for(j=1;j<=2*n;j++)
cout<<setw(4)<<a[i][j];
cout<<endl;
}
return 0;
}

Aplicatii mixte

14.

15.

#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
int i, j, n, p, a[20][20], val=1;
do
{
cout<<"n = "; cin>>n;
} while(n<2 || n>20);
do
{
cout<<"p = "; cin>>p;
} while(p<1 || p>20);

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


for(j=1; j<=p; j++)
{
a[i][j] = val*val;
val=val+2;
}
for(i=1; i<=n; i++)
{
for(j=1; j<=p; j++)
cout<<setw(5)<<a[i][j]<<" ";
cout<<endl;
}
return 0;
}

16.

#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
int i, j, n, a[20][20];
do
{
cout<<"n = "; cin>>n;
} while(n<2 || n>23);
for(i=1;i<=n;++i)
for(j=1;j<=n;++j)
do
{
cin>>a[i][j];
}while(a[i][j]<0 || a[i][j]>9999);
for(j=1;j<=n;++j)
cout<<a[1][j]<<" ";
for(i=2;i<=n;++i)
cout<<a[i][n]<<" ";
for(j=n-1;j>=1;--j)
cout<<a[n][j]<<" ";
for(i=n-1;i>=2;--i)
cout<<a[i][1]<<" ";
return 0;
}

17. Scrieţi un program C/C++ care citeşte de la tastatură un număr natural n (2≤n≤24) şi
construieşte în memorie o matrice cu n linii şi n coloane ale cărei elemente vor primi valori după
cum urmează:
- elementele aflate pe diagonala principală a matricei vor primi valoarea 0
- elementele de pe prima coloană, cu excepţia celui aflat pe diagonala principală vor primi
valoarea n
- elementele de pe a doua coloană, cu excepţia celui aflat pe diagonala principală vor primi
valoarea n-1
...
- elementele de pe ultima coloană, cu excepţia celui aflat pe diagonala principală vor primi
valoarea 1
Programul va afişa matricea astfel construită pe ecran, câte o linie a matricei pe câte o linie a
ecranului, cu câte un spaţiu între elementele fiecărei linii (ca în exemplu).
Exemplu: pentru n=4 se va afişa matricea alăturată.
0321
4021
4301
4320

18. Scrieţi un program C/C++ care citeşte de la tastatură un număr natural n (2≤n≤24) şi
construieşte în memorie o matrice cu n linii şi n coloane ale cărei elemente vor primi valori după
cum urmează:
- elementele aflate pe diagonala secundară a matricei vor primi valoarea 0
- elementele de pe prima linie, cu excepţia celui aflat pe diagonala secundară vor primi valoarea
n
- elementele de pe a doua linie, cu excepţia celui aflat pe diagonala secundară vor primi
valoarea n-1
...
- elementele de pe ultima linie, cu excepţia celui aflat pe diagonala secundară vor primi
valoarea 1
Programul va afişa matricea astfel construită pe ecran, câte o linie a matricei pe câte o linie a
ecranului, cu câte un spaţiu între elementele fiecărei linii (ca în exemplu).
Exemplu: pentru n=4 se va afişa matricea alăturată.

4440
3303
2022
0111
19. Scrieţi un program C/C++ care citeşte de la tastatură un număr natural n (1≤n≤6) apoi
construieşte în memorie o matrice cu n linii şi n coloane, astfel încât parcurgând liniile matricei
de sus în jos şi de la stânga la dreapta se obţin, în prima linie primele n numere ale şirului
Fibonacci în ordine crescătoare, în linia a doua următoarele n numere ale şirului Fibonacci în
ordine descrescătoare, în linia a treia următoarele n numere ale acestui şir în ordine
crescătoare, şi aşa mai departe, ca în exemplu. Elementele şirului Fibonacci se obţin astfel:
primul element este 0, al doilea este 1, iar elementele următoare se obţin însumând cele două
elemente care preced elementul curent. Astfel, primele 16 elemente ale acestui şir sunt: 0, 1, 1,
2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610.
Programul afişează pe ecran matricea obţinută, câte o linie a matricei pe câte o linie a
ecranului, elementele fiecărei linii fiind separate prin câte un spaţiu.
Exemplu: pentru n=4 se obţine matricea alăturată.

0 1 1 2
13 8 5 3
21 34 55 89
610 377 233 144

20. Scrieţi un program C/C++ care citeşte de la tastatură un număr natural n (1≤n≤100)şi apoi
elementele unui tablou bidimensional cu n linii şi n coloane, care memorează numere naturale
cu cel mult 9 cifre fiecare; programul afişează pe ecran acele valori din tablou care sunt strict
mai mici decât toate elementele cu care se învecinează direct (aflate pe aceeaşi linie dar pe o
coloană alăturată sau pe aceeaşi coloană dar pe o linie alăturată), ca în exemplu. Numerele
afişate vor fi separate prin câte un spaţiu.

Exemplu: pentru n=4 şi tabloul alăturat se afişează numerele: 2 0 (2 se învecinează direct cu 4,


3, 6 şi 9, şi este mai mic decât acestea, iar 0 se învecinează direct cu 6, 9 şi 1 şi este mai mic
decât acestea).
5479
6234
0985
1386

21. Scrieţi un program C/C++ care citeşte de la tastatură un număr natural n


(1≤n≤20),elementele unei matrice cu n linii şi n coloane, numere întregi din intervalul [-100, 100]
şi afişează pe ecran diferenţa S1-S2, unde S1 este media aritmetică a elementelor strict
pozitive ale matricei, situate deasupra diagonalei principale, iar S2 este media aritmetică a
elementelor strict pozitive ale matricei, situate sub diagonala principală, ca în exemplu. Cele
două medii se consideră egale cu 0 dacă nu există valori strict pozitive în zonele
corespunzătoare.

Exemplu: pentru n=4 şi matricea alăturată se afişează valoarea 0.25 (S1=2.75, calculată din
elementele aflate deasupra diagonalei principale, marcate cu chenar, şi S2=2.5, calculată din
elementele subliniate).
-1 2 -4 5
0 6 3 1
2 4 2 0
3 -5 1 -3

22. Scrieţi un program C/C++ care citeşte de la tastatură numerele naturale m şi n din intervalul
[1,24], apoi construieşte în memorie şi afişează pe ecran un tablou bidimensional cu m linii şi n
coloane astfel încât prin parcurgerea acestuia linie cu linie de sus în jos şi fiecare linie de la
stânga la dreapta, se obţin în ordine descrescătoare toate numerele naturale de la 1 la m*n, ca
în exemplu. Fiecare linie a tabloului este afişată pe câte o linie a ecranului, elementele aceleiaşi
linii fiind separate prin câte un spaţiu. Exemplu: pentru m=4 şi n=3 se va construi şi afişa tabloul
alăturat.
12 11 10
9 8 7
6 5 4
3 2 1

23. Scrieţi un program C/C++ care citeşte de la tastatură un număr natural n (2<n<20) şi
construieşte în memorie o matrice cu n linii şi n coloane, numerotate de la 1 la n, în care fiecare
element aflat pe chenarul exterior al matricei este egal cu suma dintre indicele liniei şi indicele
coloanei pe care se află, iar fiecare dintre celelalte elemente este egal cu suma celor trei
“vecini” situaţi în matrice pe linia anterioară. Două elemente din matrice se numesc vecine dacă
se găsesc alături pe linie, coloană sau diagonală. Chenarul exterior al unei matrice este format
din prima linie, ultima linie, prima coloană şi ultima coloană.

Elementele matricei vor fi afişate pe ecran, câte o linie a matricei pe câte o linie a ecranului cu
câte un spaţiu între elementele fiecărei linii.

Pentru n=5 se va obtine matricea alăturată


2 3 4 5 6
3 9 12 15 7
4 24 36 34 8
5 64 94 78 9
6 7 8 9 10

24. Scrieţi un program C/C++ care citeşte de la tastatură un număr natural nenul, cu maximum
8 cifre, construieşte în memorie şi afişează apoi in fisierul text date.out o matrice pătratică,
având numărul de linii şi de coloane egal cu numărul de cifre ale numărului dat, completată cu
cifrele numărului citit.
Astfel, elementele de pe prima coloană a matricei vor fi toate egale cu cifra unităţilor numărului
dat, elementele de pe a doua coloană a matricei vor fi toate egale cu cifra zecilor numărului dat,
şi aşa mai
departe, ca în exemplu.
Exemplu: dacă se citeşte numărul 1359, matricea construită va fi cea alăturată.
9531
9531
9531
9531

25. Se consideră un tablou bidimensional cu n linii şi m coloane (1≤n≤24, 1≤m≤24) ce


memorează numere întregi cu cel mult două cifre fiecare. Scrieţi un program în limbajul C/C++
care citeşte de la tastatură valorile n, m şi elementele tabloului, şi care inversează ordinea
elementelor în cadrul fiecărei coloane, ca în exemplu. Programul va afişa pe ecran, pe n linii,
matricea obţinută după inversare, elementele fiecărei linii fiind separate prin câte un spaţiu.
Exemplu: pentru n=4, m=3 şi matricea:
1 7 3
4 5 6
7 8 9
3 4 5
Pe ecran se va afişa:
3 4 5
7 8 9
4 5 6
1 7 3
2.Tablouri bidimensionale ( Matrice)

Consideram: n=numar linii

m=numar coloane

I. Matrice nepatratica (numarul de linii ≠numarul de coloane)

a00 a01 ... a0m−1

a10 a11 ... a1m−1

...

an−10

...

an−11

...

...

...

an−1m−1
)

Forma generala:

 element din matrice

a[i][j], i=0, 1, ...., n-1, j=0, 1, ...., m-1

 linia x: axo ax1.....axm-1

=> forma generala a elementelor din linia x: a[x][j], j=0, 1, ...., m-1

 coloana x: a0x

a1x

.....

an-1 x

=> forma generala a elementelor din coloana x: a[i][x], i=0, 1, ...., n-1

Parcurgere elemente matrice

pe linii ( de sus in jos) pe coloane( de sus in jos)

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

for(j=0;j<m;j++)

for(j=0;j<m;j++)

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

Citire elemente matrice

de la tastatura din fiser text

cout<<"n=";cin>>n;//nr linii

cout<<”m=”cin>>m;//nr coloane
for(i=0;i<n;i++)

for(j=0;j<m;j++)

cout<<"a["<<i<<"]["<<j<<"]=";

cin>>a[i][j];

ifstream f("date.in”);

f>>n>>m;

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

for(j=0;j<m;j++)

f>>a[i][j];

f.close();

linie

coloana

linie coloane

Ex: Sala cinema

Declarare:

tip nume[dim1][dim2];

unde: tip=tipul elementelor

nume=identificatorul(numele) matricei

dim1,dim2=numere naturale(dim1=nr max de linii, dim2=nr max de coloane)


Afisare elemente matrice

pe ecran in fiser text

metoda I for(i=0;i<n;i++)

for(j=0;j<m;j++)cout<<a[i][j]<<” ”;

cout<<endl;

/* ex: n=2, m=3

12 12365 2

1523 137 1526

*/

ofstream g("date.out”);

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

for(j=0;j<m;j++)g<<a[i][j]<<” ”;

g<<endl;

g.close();

metoda II for(i=0;i<n;i++)

for(j=0;j<m;j++)cout<<setw(5)<<a[i][j];

cout<<endl;

}
/* setw(x)= afiseaza elem pe x sau x-1

pozitii, elementele de pe coloane vor fi

aliniate la dreapta la cifra unitatilor

Se utilizeaza #include<iomaninp>

ex: n=2, m=3

12 2365 2

1523 137 1526 */

ofstream g("date.out”);

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

for(j=0;j<m;j++)g<<setw(5)<<a[i][j];

g<<endl;

g.close();

1.Fiind data o matrice cu n linii si m coloane cu elemente intregi de maxim 2 cifre sa se calculeze suma

elementelor din matrice.

#include<iostream>

#include<iomanip>

using namespace std;

int main()

//declararea variabilelor

int a[20][20],i,j,n,m,s=0;

//citirea datelor de intrare

cout<<"n=";cin>>n;

cout<<"m=";cin>>m;

for(i=0;i<n;i++)
for(j=0;j<m;j++)

cout<<"a["<<i<<"]["<<j<<"]=";

cin>>a[i][j];

//afisarea elementelor matricei

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

for(j=0;j<m;j++)cout<<setw(4)<<a[i][j];

cout<<endl;

//rezolvarea cerintei

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

for(j=0;j<m;j++)

s=s+a[i][j];

//afisarea datelor de iesire

cout<<"s="<<s;

return 0;

II. Matrice patratica (numarul de linii=numarul de coloane)

a00 a01 ... a0n−1

a10 a11 ... a1n−1

...

an−10

...
an−11

...

...

...

an−1n−1

Obs: In matricea patratica exista 2 diagonale: principala si secundara.

Forma generala:

 element din matrice

a[i][j], i=0, 1, ...., n-1, j=0, 1, ...., n-1

 linia x: axo ax1.....axn-1

=> forma generala a elementelor din linia x: a[x][j], j=0, 1, ...., n-1

 coloana x

a0x

a1x

.....

an-1 x

=> forma generala a elementelor din coloana x: a[i][x], i=0, 1, ...., n-1

 Diagonala principala(DP)

a00 a01 a02 ........... a0n−3 a0n−2 a0n−1

a10 a11 a12 ........... a1n−3 a1n−2 a1n−1

a20 a21 a22 ........... a2n−3 a2n−2 a2n−1

.....................................................................................................

an−30 an−31 an−32 ........... an−3n−3 an−3n−2 an−3n−1

an−20 an−21 an−22 ........... an−2n−3 an−2n−2 an−2n−1

an−10 an−11 an−12 ........... an−1n−3 an−1n−2 an−1n−1


Elementele diagonalei principale: a00 a11.....an-1n-1

=> forma generala a[i][i], i=0, 1, ...., n-1

 Elementele de deasupra diagonalei principale

a) parcurgem toata matricea si alegem elementele care au i<j:

a[i][j], i=0, 1, ...., n-1, j=0, 1, ...., n-1 si i<j

b) parcurgem numai elementele situate deasupra diagonalei principale

a[i][j], i=0, 1, ...., n-2, j=i+1, ...., n-1

 Elementele de sub diagonalei principale

a) parcurgem toata matricea si alegem elementele care au i>j:

a[i][j], i=0, 1, ...., n-1, j=0, 1, ...., n-1 si i>j

b) parcurgem numai elementele situate sub diagonalei principale

a[i][j], i=1, ...., n-1, j=0, ...., i-1

linie coloane

Diagonala secundara (DS)

a00 a01 a02 ........... a0n−3 a0n−2 a0n−1

a10 a11 a12 ........... a1n−3 a1n−2 a1n−1

a20 a21 a22 ........... a2n−3 a2n−2 a2n−1

......................................................................................................

an−30 an−31 an−32 ........... an−3n−3 an−3n−2 an−3n−1

an−20 an−21 an−22 ........... an−2n−3 an−2n−2 an−2n−1

an−10 an−11 an−12 ........... an−1n−3 an−1n−2 an−1n−1

Elementele diagonalei secundare: a0n-1 a1n-2.....an-10

se observa ca i+j=n-1 =>j=n-i-1

=> forma generala a[i][n-i-1], i=0̅̅,̅n̅̅̅−̅̅̅1̅

linia i: aio ai1........ ain-i-2 ain-i-1 ain-i..........................ain-1

deasupra DS sub DS
i=0,1...,n-2, j=0,..., n-i-2 i=1,..., n-1, j=n-i,...,n-1

 Elementele de deasupra diagonalei secundare

a) parcurgem toata matricea si alegem elementele care au i+j<n-1:

a[i][j], i=0, 1, ...., n-1, j=0, 1, ...., n-1 si i+j<n-1

b) parcurgem numai elementele situate deasupra diagonalei secundare

a[i][j], i=0, 1, ...., n-2, j=0, ...., n-i-2

 Elementele de sub diagonalei principale

a) parcurgem toata matricea si alegem elementele care au i+j>n-1:

a[i][j], i=0, 1, ...., n-1, j=0, 1, ...., n-1 si i+j>n-1

b) parcurgem numai elementele situate sub diagonalei secundare

a[i][j], i=1, ...., n-1, j=n-i, ...., n-1

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