Sunteți pe pagina 1din 103

Fundamentele programării

Curs 2

Instrucțiuni. Operatori. Tablouri.

Elena BAUTU & Dorin-Mircea POPOVICI


{ebautu,dmpopovici}@univ-ovidius.ro
http://www.disciplinele.ml
Cuprins
• Instructiuni decizionale
– if, switch
• Instructiuni de ciclare
– for, while, do
• Alte instructiuni
– break; continue; goto
• Operanzi & Operatori
– Tipuri
– Prioritate
• Tablouri de date

http://www.disciplinele.ml
Instructiuni decizionale

http://www.disciplinele.ml
Instrucţiunea decizionala if
• permite execuţia unei instrucţiuni în funcţie de
valoarea bivalenta a unei expresii

• Ramura else şi instrucţiune2 sunt opţionale.


if (delta < 0)
printf(“Delta este negativ\n”);
else
printf(“Delta este 0 sau pozitiv\n”);

http://www.disciplinele.ml
Instrucţiunea decizionala switch
• permite execuţia unei instrucţiuni în funcţie de valoarea
multivalenta a unei expresii

http://www.disciplinele.ml
Instrucţiunea decizionala switch (cont)
• exemple:
int grupa;
grupa <-
switch(grupa) {
case 1: printf(“Prima grupa\n”); break;
case 2: printf(“A doua grupa\n”); break;
case 3: printf(“A treia grupa\n”); break;
default: printf(“Grupa necunoscuta\n”);
}

http://www.disciplinele.ml
Instrucţiunea decizionala switch (cont)
• efect: se compară rezultatul expresiei cu ct1,
ct2, ....
– Dacă una este egală, atunci se execută instrucţiuni
începând de la acel caz.
• instrucţiunea break opreşte execuţia lui switch
• Controlul execuției este pasat următoarei instrucțiuni
de după switch, din program
– Dacă nu există o valoare egală se execută
instrucţiunile începând de la default (dacă există)

http://www.disciplinele.ml
Instrucţiunea decizionala switch (cont)
• cazurile pot să nu conţină instrucţiuni
• cazul implicit (default) este opţional
• exemplu:
switch(grupa) {
case 1:
case 2: printf(“Seria 1\n”); break;
case 3:
case 4: printf(“Seria 2\n”); break;
default: printf(“Serie necunoscuta\n”);
}

http://www.disciplinele.ml
Instrucţiunea decizionala switch (cont)
int main() {
printf("Ce grupa esti?\n");
int grupa; // declaram variabila grupa
scanf("%d", &grupa); // citim valoarea ei de la tastatura
switch(grupa) {
case 1:
case 2: printf("Seria 1\n"); break;
case 3:
case 4: printf("Seria 2\n"); break;
default: printf("Serie necunoscuta\n");
}
system("PAUSE"); return 0;
}
http://www.disciplinele.ml
Instructiuni de ciclare

http://www.disciplinele.ml
Instrucţiunea de ciclare do-while
• execuţă o instrucţiune cât timp o expresie are
valoare nenulă (adevărată)

– Instructiunea instr poate fi o instrucțiune


complexă (e.g. un bloc de instrucțiuni)

http://www.disciplinele.ml
Instrucţiunea de ciclare do-while (cont)
• sintaxa:
do
instructiune;
while(conditie);
• efect:
– se execută instructiune;
– dacă valoarea expresiei conditie este 0, atunci se
opreşte execuţia lui do-while,
– altfel se repetă încă o dată corpul lui while.

http://www.disciplinele.ml
Instrucţiunea de ciclare do-while (cont)
• Se dorește citirea unui număr între 1 și 10.
Dacă utilizatorul introduce un număr care nu
satisface această condiție, atunci i se cere din
nou.
int n;
do {
printf("Introduceti un numar intre 1 si 10");
scanf("%i", &n);
} while ((n<1)||(n >10));

http://www.disciplinele.ml
Instrucţiunea de ciclare do-while (cont)
• Se dorește calculul sumei primelor n numere
naturale:

// i – numarul curent, s – suma pana la nr curent


int i=0, s=0;
do {
// la suma s adaugam numarul curent i
s=s+i;
i=i+1; // crestem numarul curent
} while (i<n);

http://www.disciplinele.ml
Instrucţiunea de ciclare do-while (cont)
• Se dorește calcularea celui mai mare divizor
comun al numerelor a și b.

int a,b,r, temp;


if(b>a){
temp = a;
a = b;
b = temp;
}

do {
r = a%b; a = b; b = r;
http://www.disciplinele.ml
Instrucţiunea de ciclare while
• execuţă o instrucţiune cât timp o expresie are
valoare nenulă (adevărată)

• efect:
– dacă valoarea expr (conditie) este 0, atunci se opreşte
execuţia lui while,
– altfel se execută instr şi se repetă while încă o dată.
• Instructiunea instr poate fi o instrucțiune
complexă (e.g. un bloc de instrucțiuni)
http://www.disciplinele.ml
Instrucţiunea de ciclare while (cont)
• Se dorește calcularea sumei numerelor de la 0
la n.

int i=0,s=0;
while(i<n) {
s=s+i;
i=i+1;
}

http://www.disciplinele.ml
Instrucţiunea de ciclare while (cont)
• Se dorește calcularea sumei cifrelor unui
număr intreg.
int s = 0; //initial suma este 0
while(n != 0) {
//se aduna la s ultima cifra
s += n%10;
//se scoate ultima cifra din numar
n=n/10;
}
printf("suma cifrelor este %i\n", s);

http://www.disciplinele.ml
Exercitiul 2.1
• Scrieti un program care calculeaza si afiseaza
cmmdc-ul a 2 nr naturale, citite de la tastatura
utilizandu-se instructiunea while.

http://www.disciplinele.ml
Instrucțiunea for

http://www.disciplinele.ml
Instrucţiunea de ciclare for
• execuţă o instrucţiune cât timp o expresie are
valoare nenulă
• sintaxa:

• efect:
– se evaluează exp1 (initializare) o singură dată.
– dacă exp2 (continuare) este 0, se opreşte for-ul.
– Altfel, se execută instr, apoi exp3 (actualizare) şi se
repetă for-ul (fără iniţializare).

http://www.disciplinele.ml
Instrucţiunea de ciclare for (cont)
• Se dorește afișarea numerelor impare mai mici
decat n.

int i;
for(i = 1; i <= n; i += 2)
printf("%i ", i);

http://www.disciplinele.ml
Instrucţiunea de ciclare for (cont)
• Se dorește calcularea produsului primelor n
numere naturale ( n! ).

/* declaram p–produsul numerelor pana la


iteratia curenta, i–iteratia (numarul) curent*/
int p = 1, i;
for(i = 1; i <= n; ++i)
// la fiecare pas, produsul curent se
// inmulteste cu numarul curent
p *= i;
printf("%i ! este %i \n", n, p);

http://www.disciplinele.ml
Exercitiul 2.2
• Scrieti un program care afiseaza numerele
divizibile cu 3 mai mici decat un numar n, citit
de la tastatura.

• Afisati numerele de forma 5k+3 mai mici decat


un numar n, citit de la tastatura.

http://www.disciplinele.ml
Alte instructiuni

http://www.disciplinele.ml
Instrucţiunea de salt break
• opreşte execuţia unei unei instrucţiuni switch, for,
while sau do-while şi determina continuarea
execuţiei programului cu prima instrucţiune după
aceasta.

• exemplu:
Scrieti un program care afla cel mai mic numar
natural n (<100), pentru care suma numerelor
de la 1 la n este cel putin 100. (for,while si do-
while)
http://www.disciplinele.ml
Instrucţiunea de salt break (cont)
#include<stdio.h>
#include<stdlib.h>
void main(){
int s=0, i=0;
for (;i<100; i++){
s+=i;
if(s>=100) break;
}
printf("Suma numerelor de la 1 la %d este %d",
i, s);
}
http://www.disciplinele.ml
Instrucţiunea de salt break (cont)
• Se dorește afișarea numerelor de la 1 la 10,
până la prima valoare care este divizibilă cu 7.
for(i = 1; i <= 10; ++i) {
if (i % 7 == 0) break;
printf(“valoare lui i este %i\n”, i);
} //iterațiile 8,9,10 nu se mai execută
printf(“De aici se continua executia daca i se
divide cu 7\n”);

http://www.disciplinele.ml
Instrucţiunea de salt continue
• continue opreşte execuţia unei unei iteraţii for,
while sau do-while şi reia execuţia instrucţiunii
respective de la iterația următoare

afișarea
for(i = 1; i < 10; ++i) { numerelor de la
if (i % 7 == 0) continue; 1 la 10, mai
printf(“valoarea lui i este puțin a celor
%i\n”, i); care sunt
} divizibile cu 7
http://www.disciplinele.ml
Instrucţiunea goto
• determină transferul execuţiei programului la prima
instrucţiune după eticheta eticheta.

• O etichetă = un identificator unic (în interiorul funcţiei


în care este declarat) asociat unei instrucţiuni şi care
are semnificaţie doar pentru instrucţiunea goto
http://www.disciplinele.ml
Instrucţiunea goto (cont)
int i = 1;
int suma = 0;
eticheta1:
if(i<=n){
suma = suma +i;
i++;
goto eticheta1;
}

http://www.disciplinele.ml
Instrucțiunea return
• Pentru moment, return este instructiunea care
permite iesirea din functia main, eventual cu
trimiterea valorii unei expresii catre sistemul
de operare

• Sintaxa
return;
return expresie;

http://www.disciplinele.ml
Operatori

http://www.disciplinele.ml
Expresii în C
• O expresie este o secvenţă
– operanzi
• constante, variabile sau alte expresii.
– operatori
• +, -, *, etc
• Exemplu: a = (2*b-c)/(a-b);
• Orice expresie are o valoare şi un tip.
– Valoarea şi tipul depind de operatorii şi operanzii
care formează expresia

http://www.disciplinele.ml
Exemple de expresii
• printf(“Aceasta este o expresie”);
– expresie care foloseşte o funcţie ca să afişeze un
mesaj
• a = 2 * b;
– expresie care foloseşte operatori ca să calculeze
un rezultat
• a++;
– expresie care creşte valoarea variabilei a cu 1

http://www.disciplinele.ml
Operanzi
• operand = informaţie care trebuie prelucrată
– constante: 10, 5, 'a', "Test“
– constante simbolice: M_PI, M_E
– identificator de variabile: x, v[5]
– numele unei funcţii: sin
– rezultatul unei funcţii: sin(M_PI)
– sau o expresie.

http://www.disciplinele.ml
Reguli
• Regulile de asociativitate şi precedenţă a
operatorilor
– aceleaşi ca cele din matematică cu unele excepţii
– paranteze rotunde – pentru schimbarea priorităţii
de evaluare a subexpresiilor
• Exemplu:
– a = (a*b-c/d)*(a-b);
– Pt. a=2, b=3, c=6, d=3, expresia are valoarea -4

http://www.disciplinele.ml
Valori logice de adevăr
• În limbajul C, o expresie are valoarea logică de
adevăr adevărat dacă are valoare nenulă şi are
valoarea logică de adevăr fals dacă are valoare
nulă.
• Exemple
– Expresia 2+3 are valoarea logică de adevăr adevărat.
– Expresia 2-2 are valoarea logică de adevăr fals.
– Expresia x<2 este evaluată de C la 0 sau 1, în funcție
de valoarea lui x.

http://www.disciplinele.ml
Conversii de tip implicite
• tipul unei expresii se poate schimba automat în
alt tip pentru a evita pierderi de informaţii
• expresiile care au tip mai "mic" sunt transformate
în expresii cu tip mai "mare", dar cu aceeaşi
valoare (upcast implicit)
• Exemple
int a=2;
double b = 2.5;
double s=a+b;
// s va avea valoarea 4.5; a este convertit la double

http://www.disciplinele.ml
Conversii de tip implicite
int a = 0;
char b = ‘0’;
int dif = a – b;
b este convertit la int, codul ASCII al lui ‘0’ este 48
deci dif este -48

http://www.disciplinele.ml
Conversii de tip implicite (cont)
• Exemple
– int i;
i = 2.9 ; // i va fi convertit implicit la int, deci va fi 2
// (cu warning, dar nu cu eroare!)
– i = ‘a’ ; // i este intreg, deci va lua valoarea codului ASCII al
lui ‘a’, deci 97
– 2 + 3.5  5.5 (tipul double)
• 3.5 are tipul double, deci 2, desi este de tip intreg, este
transformat in dpuble
– 2 + 3.5f  5.5 (tipul float)
• 2 are tipul întreg, dar este transformat în float
– 2.1f + 2.2  4.3 (tipul double)
• 2.1f are tipul float, dar este transformat în double

http://www.disciplinele.ml
Conversii de tip explicite
• Operatorul de conversie (cast) poate fi folosit pentru a
schimba forţat tipul unei expresii.
• Are prioritate mare
• Sintaxa:
(tip) expresie
– în faţa expresiei se scrie tipul dorit între paranteze
rotunde: (int), (float), etc.
• Exemplu:
• int a = 5, b = 2;
• float c, d;
• c = a/b; // c este 2.0 (împărţire de întregi)
• d = (float)a/b; // c este 2.5

http://www.disciplinele.ml
Operatori
• operator = simbol care determină efectuarea unei operaţii
• După aritate = numărul de operanzi cu care lucrează operatorul
– Unari
– Binari
– Ternari: operatorul condiţional ?:
• După ordinea de succedare a operatorilor si operanzilor
– Prefixaţi: ex. -a; !b, --a; ++a
– Infixaţi: ex. a+b, a%b, a<b
– Postfixaţi: ex. a++; a--;
• După tipul operanzilor şi al prelucrării
– Aritmetici
– Relaţionali
– Logici
– Pe biţi

http://www.disciplinele.ml
Operatori (cont)
• Precedenţă (prioritate) = importanţa operatorului
într-o expresie
– operatorii se execută de la prioritate mare la mică
– operatorii care au aceeaşi prioritate se execută în
ordinea în care apar în expresie
• Reguli de asociativitate
– ordinea aplicarii operatorilor consecutivi de aceeasi
precedenta (prioritate).
• Tabela completa cu informatii despre operatori

http://www.disciplinele.ml
Operatorul sizeof
• Determina dimensiunea in octeti a unui tip de
date sau a unei variabile/expresii
• Sintaxa: sizeof(tip) sau sizeof(expresie)
• Exemple:
printf(“%d”, sizeof(‘a’));  1
sizeof(int)  4
sizeof(2.5+2)  8 //expresia este
de tip double

http://www.disciplinele.ml
Operatori aritmetici
• In ordinea descrescatoare a prioritatii:
– Operatori unari de păstrare/schimbare a
semnului: + şi –
– Operatori binari multiplicativi *, / şi %
– Operatori binari aditivi + şi –
• Exemplu:
– int i = –2 + 3 * 4 – 5
– Este diferit de –(2 + 3 * 4 – 5)
– Si este diferit de – 2 + 3*(4 – 5)

http://www.disciplinele.ml
Operatorul de atribuire
• Sintaxa: variabila = expresie
• Operator binar, de prioritate scazuta
• Asociativitate de la dreapta la stanga
– Exemplu: a = 2 + 3; b = a;
– Echivalent cu b = (a = 2+3);
– Echivalent cu b = a = 2+3;

http://www.disciplinele.ml
Operatorul de atribuire (cont)
• Asociativitate de la dreapta la stanga
– Expresia este evaluata, rezultatul ei este memorat
in variabila si este furnizat ca efect secundar, asa
ca poate fi utilizat mai departe:
int a, b, c;
a = b = c = 0;
//echiv cu (a = (b = (c = 0)));

http://www.disciplinele.ml
Operatorul de atribuire (cont)
• Exemplu
int a, b, c;
b = c = a = 2+3;
– Este echivalent cu (b = (c = (a = 2+3)))
– Ordinea este: 2+3 e evaluat la 5, rezultatul este
memorat in a;
– a=2+3 se evalueaza la valoarea expresiei, deci 5,
deci b ia valoarea 5
– b = 5 este evaluat la 5 (partea dreapta), deci c ia
valoarea 5
http://www.disciplinele.ml
Operatori de atribuire compusi
• Expresiile de tip
variabila = variabila operator expresie

• Se pot scrie prescurtat in forma


variabila operator= expresie

• Se definesc astfel operatorii:


– += -= *= /= %=
– &= |= ^= <<= >>=
• Acestia sunt operatori pe biti si vor fi discutati in cursul
de azi

http://www.disciplinele.ml
Exemplu
• int i=3, j=9, k=11;
• i += j;
– echivalent cu i=i+j;
• k %= j -= 4;
– asocierea fiind de la dreapta la stanga, deci
echivalent cu (k %= (j -= 4));
– prima data se calculeaza j -= 4,
– deci j va fi 5, valoare care este folosita prin efect
secundar pentru k%=5, deci k va fi 1

http://www.disciplinele.ml
Operatori de incrementare (++) si
decrementare (--)
• Operanzi: variabile intregi
• prefixati
– ++variabila
• Echivalent cu variabila = variabila+1
– --variabila
• Echivalent cu variabila = variabila – 1
– Efect lateral: furnizeaza valoarea variabilei dupa incrementare
• postfixati
– variabila++
– variabila--
– Efect lateral: furnizeaza valoarea variabilei inainte de
incrementare

http://www.disciplinele.ml
Operatori de incrementare (++) si
decrementare (--) (cont)
int a = 5;
a++;
printf(“a este %d \n”, a); // a este 6
int b = a++;
/* il seteaza pe b la valoarea lui a, apoi incrementeaza pe a*/
printf(“a este %d si b este %d \n”, a, b); // a este 7 si b este 6

b = ++a;
/*il incrementeaza pe a si apoi seteaza pe b la noua valoare a
lui a*/
printf(“a este %d si b este %d \n”, a, b);
// a este 8 si b este 8
http://www.disciplinele.ml
Operatori de incrementare (++) si
decrementare (--) (cont)
int i=3, j=9, K;
K = ++i + j--;
printf(“i este %d, j este %d, k este %d.\n”, i,
j, k);
• ++ si –- au prioritatea mai mare ca + (binar)
• Expresia este echivalenta cu K = (++i) + (j--);
• ++i are doua efecte:
– creste pe i, deci i devine 4;
– expresia ++i se evalueaza, ca efect lateral la valoarea noua a lui i, 4;
• j-- are doua efecte:
– Scade pe j, deci j devine 8;
– se evalueaza, ca efect lateral la valoarea veche 9
• k va fi 13 (4+9)

http://www.disciplinele.ml
Operatori relationali
• Operatori binari, folositi in expresii ce sunt
evaluate la fals (0) sau adevarat (1)
• < <= > >=
• == !=
• Orice valoare diferita de 0 este interpretata ca
adevarat in C.

http://www.disciplinele.ml
Operatori relationali (cont)
• int a;
• Observatie: faceti diferenta intre conditia
a==0
• si
a=0
• Prima testeaza pe a si rezultatul evaluarii este 1
(true) sau 0 (false), in functie de valoarea lui a
• A doua seteaza pe a la 0 si rezultatul evaluarii ei
este valoarea din dreapta, adica 0, deci fals.

http://www.disciplinele.ml
Operatori logici
• Lucreaza cu operanzi intregi, interpretati ca valori
logice
–! negatie logica
– && si logic
– || sau logic
• ! Este operator unar  are prioritatea cea mai
ridicata
X !X
≠0 0
0 1

http://www.disciplinele.ml
Operatori logici (cont)
• && si || sunt operatori binari, au prioritatea
mai mica decat operatorii relationali

X Y X && Y X Y X || Y
0 0 0 0 0 0
0 ≠0 0 0 ≠0 1
≠0 0 0 ≠0 0 1
≠0 ≠0 1 ≠0 ≠0 1

http://www.disciplinele.ml
Operatori logici - observații
• Expresiile logice in C se calculeaza prin scurtcircuitare

– daca primul operand al expresiei in care apare operatorul


&& este 0, sigur rezultatul final este 0, indiferent de
valoarea celui de-al doilea.

– daca primul operand al expresiei in care apare operatorul


|| este !=0, sigur rezultatul final este 1, indiferent de
valoarea celui de-al doilea

– Deci: dacă primul operand are valorile de mai sus,


corespunzator operandului && sau ||, cel de-al doilea
operand nu se mai evalueaza.

http://www.disciplinele.ml
Operatorul conditional ?:
• operator ternar
expr0 ? expr1 : expr2

• Daca valoarea e1 este adevarata ( !=0 ), se evalueaza e2,


altfel e3
• Tipul si rezultatul expresiei evaluate fiind tipul si rezultatul
final al expresiei conditionale.
• Exemplu:
max=(a>b)?a:b;
• Echivalent cu
if(a>b)max=a;
else max=b;

http://www.disciplinele.ml
Exercitiul 2.3
• Ce valoare va fi afişată pe ecran?
• int a=3, b=5;
printf (a==b ? "egale" : "diferite");
• int a=3, b=7%4;
printf(a==b ? "egale" : "diferite");
• int a=3, b=6;
printf("a si b sunt %s", a==b ? "egale" : "diferite");
• int a; a = 3,5,6;
printf("a = %d", a);

http://www.disciplinele.ml
Operatori pe biţi
• se aplică fiecărui bit din reprezentarea operanzilor
intregi
• spre deosebire de restul operatorilor care se aplică
valorilor operanzilor.
• ~ complementariere
– transforma fiecare bit din reprezentarea operandului in
complementarul sau -- bitii 1 in 0 si cei 0 in 1.
• & si
• ^ sau exclusiv
• | sau
– realizeaza operatiile si, sau exclusiv, respectiv sau intre
toate perechile de biti corespunzatori ai operanzilor.

http://www.disciplinele.ml
Operatori pe biti (cont)
a b a&b a^b a|b
0 0 0 0 0
0 1 0 1 1
1 0 0 1 1
1 1 1 0 1

Din tabela de mai sus se observa ca aplicand


unui bit:
operatorul & cu 0, bitul este resetat (sters)
operatorul & cu 1, bitul este neschimbat
operatorul | cu 1, bitul este setat
operatorul | cu 0, bitul este neschimbat
operatorul ^ cu 1, bitul este complementat.
operatorul ^ cu 0, bitul este neschimbat.
http://www.disciplinele.ml
Operatori pe biti (cont)
• >> deplasare la dreapta
• << deplasare la stanga
• primul operand e cel ai carui biti sunt deplasati,
• al doilea indica numarul de biti cu care se face
deplasarea
– a>>n este echivalent cu a/2n
– a<<n este echivalent cu a*2n
• Este indicat a se realiza inmultirile si impartirile cu
puteri ale lui 2 prin deplasari; deplasarile se
realizeaza intr-un timp mult mai scurt.

http://www.disciplinele.ml
Operatori pe biti (cont)
• Exemple
• int i = 256;
• i *= 8; // echivalent cu i<<3;
• i /= 4; // echivalent cu i>>2;

http://www.disciplinele.ml
Exercitiul 2.4
• Care sunt tipurile şi valorile expresiilor?

int a = 5, b = 2;
float c = 1;
9-a
9/a
9.0/a
!a
b<<2
a>>1
!(a-(1<<b)-1)
a-1<<b-1 > 5

http://www.disciplinele.ml
Exercitiul 2.5
• Ce va afisa programul de mai jos?

#include <stdio.h>
int main (void) {
double x, y;
int a = 7, b = 2;
x = (int)1.5 * (double)(a/b);
x = (int)1.5 * ((double)a/b);
printf(“x=%lf, y=%lf\n", x, y);
}

http://www.disciplinele.ml
Observatii
• Tabela completa cu informatii despre
operatori
• http://en.wikipedia.org/wiki/Operators_in_C_
and_C%2B%2B#Operator_precedence

http://www.disciplinele.ml
Tablouri de date (Masive)

http://www.disciplinele.ml
Tablouri (masive) de date
• Tablou (masiv de date, eng. Data array) = colecţie
de date de acelaşi tip, dispuse contiguu în
memorie
– informaţiile au acelaşi tip, dar locaţii (de memorie)
diferite
• Declaraţie:
– tip nume[lim1][lim2]…[limn]
– Dimensiunile lim1, lim2,…limn sunt expresii constante
– La intalnirea unei declaratii de tablou, compilatorul
aloca o zona de memorie suficienta pentru a pastra
valorile elementelor sale.

http://www.disciplinele.ml
Tablouri (masive) de date
• Un tablou poate avea mai multe dimensiuni
– o singură dimensiune  vector sau şir
• int A[5]; // un vector cu cinci numere întregi
– 2 dimensiuni  matrice
• float B[2][3]; // o matrice cu 2x3 elemente
– k dimensiuni (tablou de date de tipul tip)
• tip nume[d1][d2]...[dk];

http://www.disciplinele.ml
Tablouri - Stocarea informaţiei
• numărul de elemente ale unui tablou cu k dimensiuni
este egal cu d1*d2*...*dk
• memorarea unui tablou cu tipul tip şi k dimensiuni
necesită
sizeof(tip)*d1*d2*...*dk bytes
– Obs. Operatorul sizeof(tip) returnează nr de octeţi necesari
pentru memorarea unei variabile de tipul respectiv.
• accesarea unui element al tabloului se face cu
construcţia
nume[i1][i2]…[in],
unde i1, i2, …, in sunt coordonatele elementului
(0 ≤ ij < dimj, 1≤j≤k).

http://www.disciplinele.ml
Tablou de date - elemente
7 5 3
7 5 3 2 1 1 1
10 5 6 8 9 4 6
4 6 1 3 5 5
A (vector) B (matrice) C (masiv cu 3 dim.)
-1 dimensiune -2 dimensiuni -3 dimensiuni
-5 elemente -6 elemente -12 elemente

A[3] = ? B[1][2] = ? C[0][1][1] = ?

http://www.disciplinele.ml
Tablouri de date - elemente
• Numerotarea elementelor unui tablou incepe de la 0,
pe orice dimensiune. Astfel, in tabloul :
int Tab[10]={2,4,6,8,10};
• elementele sunt:
Tab[0] -> 2;
Tab[1] -> 4;
Tab[2] -> 6;
Tab[3] -> 8;
Tab[4] ->10;
Tab[5] , Tab[6], Tab[7], tab[8], Tab[9] -> 0.
http://www.disciplinele.ml
Iniţializarea tablourilor
• Masivele pot fi iniţializate:
– liniar
tip nume[d1][d2]...[dk]={v1, v2, ..., vn};
valorile v1, v2, ..., vn sunt stocate în masiv în ordine de la
coordonatele mici (0,0,..., 0) la coordonatele mari
– pe axe
tip nume[d1][d2]...[dk]={{v1,...,vp}, {vp+1,...}, {...,vn}};
fiecare grup de valori în acolade va fi stocată într-o
dimensiune din masiv
Numele unui tablou reprezinta adresa de inceput a zonei de
memorie care i-a fost alocata.

http://www.disciplinele.ml
Iniţializarea tablourilor
int A[10] = {1, 5, 2, 4};
1 5 2 4 0 0 0 0 0 0

- initializare liniara :
1 5 2 4 0
int A[2][5] = {1, 5, 2, 4};
0 0 0 0 0

- initializare pe axe:
1 0 0 0 0 int A[2][5] = {{1}, {3}};
3 0 0 0 0

http://www.disciplinele.ml
Iniţializarea tablourilor
• În cazul iniţializării, numărul de elemente din
prima dimensiune a masivului poate să
lipsească, iar el va fi stabilit de compilator.
– int A[] = {1, 10, 5, 2};
este echivalent cu
int A[4] = {1, 10, 5, 2};
– int B[][3] = {{1,5}, {3}, {2}};
este echivalent cu
int B[3][3] = {{1,5}, {3}, {2}};
http://www.disciplinele.ml
Exercitiul 2.6
• Scrieţi un program care citeşte un şir de 10
numere de la tastatură
• numara cate dintre acestea sunt pare,
• calculează suma si produsul lor. Programul sa
afiseze mesaje corespunzatoare.

http://www.disciplinele.ml
Exercitiu – solutie propusa
#include<stdio.h>
#include<stdlib.h>
int main(){
int v[10], i;
for(i = 0; i<10; i++){
printf("Introduceti elementul %d:\n", i);
scanf("%d", &v[i]);
}
int pare = 0, suma = 0, produs = 1;
for(i = 0; i<10; i++){
if (v[i]%2 == 0) pare ++;
suma = suma+v[i];
produs *= v[i];
}
printf(“Numarul elementelor pare este: %d.\n", pare);
printf("Suma elementelor este: %d.\n", suma);
printf(“Produsul elementelor este: %d.\n", produs);
system("pause");
return 0;
}

http://www.disciplinele.ml
Exercitii propuse - instructiuni
1. Folosind instrucţiunea if-else, scrieţi un program care citeşte un
număr intre 1 si 7 şi afişează ziua din săptămână corespunzătoare.
2. Rescrieţi programul anterior, folosind instrucţiunea switch.
3. Folosind o buclă while, afişaţi la nesfarşit mesajul “Hello”.
4. Folosind o buclă while, afişaţi numerele de la 1 la 10.
5. Folosind o buclă while, afişaţi numerele de la 1 la n, cu n citit de la
tastatură.
6. Folosind o buclă while, afişaţi numerele pare de la 1 la n, cu n citit
de la tastatură.
7. Folosind o buclă for, afişaţi numerele de la 1 la n, cu n citit de la
tastatură.
8. Folosind o bucla for, calculati suma numerelor de la 1 la n, cu n
citit de la tastatura.

http://www.disciplinele.ml
Exercitii propuse (cont)
9. Scrieti un program C care calculeaza valoarea
sumei S = 1 - 2 + 3 - ... ±n, pentru un n citit de
la tastatura.
10.Să se realizeze un program C care afişează
valoarea sumei S = 1 + 3 + 5 + ... + n, pentru
un n citit de la tastatură.
11.Să se realizeze un program C care afişează
valoarea sumei S = 1 - 2 + 3 - ... ±n, pentru un
n dat.

http://www.disciplinele.ml
Exercitii propuse (cont)
12.Să se realizeze un program C care afişează
valoare expresiei (n!)2 pentru un număr dat.
13.Sa se scrie un program care citeste n numere
(n citit de la tastatura) si afla care este
maximul, respectiv minimul din acest sir.
14.Să se scrie un program care să calculeze şi să
afişeze valoarea expresiei x2+3x-5, pentru toţi
x întregi din intervalul 1..20.

http://www.disciplinele.ml
Exercitii propuse (cont)
15.Sa se scrie un program care citeste un nr intreg
si numara din cate cifre este format acest numar.
De exemplu, daca utilizatorul introduce numarul
1223, programul afisează 4.
16.Să se realizeze un program C care afişează suma
cifrelor unui număr întreg.
– Indicaţie: folositi operatorul % pentru a afla restul
impartirii a doua numere.
17.Scrieți un program care calculează numărul de
cifre divizibile cu 3 din care este format numărul
natural n, citit de la tastatură.

http://www.disciplinele.ml
Exercitii propuse (cont)
18. Scrieți un program care citește numere naturale până
la întalnirea lui zero și numără câte dintre numerele
citite sunt pare.
19. Scrieți un program care află cel mai mare număr
natural k cu proprietatea că 2k<=n, pentru n – un
număr natural citit de la tastatură.
20. Scrieti un program C care citeste un numar intreg de
la tastatura si verifica daca acesta este prim sau nu.
21. Sa se realizeze un program C care citeste un numar
intreg de la tastatura si afiseaza reprezentarea acestui
numar in binar (baza 2).

http://www.disciplinele.ml
Exercitii propuse (cont)
22.Folosind operații pe biți, să se verifice dacă
un număr natural n este par sau impar.
23.Folosind operații pe biți, să se afișeze valorile
2k, pentru 1<=k<=n, n citit de la tastatură
(<32).
24.Folosind operații pe biți, să se afișeze
reprezentarea în baza 2 a unui număr natural
n (n va fi considerat pe 32 de biți).

http://www.disciplinele.ml
Exercitii propuse – tablouri

25. Sa se scrie un program C care citeste de la tastatura


valori reale, pana la introducerea lui CTRL+Z (caracterul ce
simbolizeaza sfarsitul de fisier). Programul va calcula si va
afisa:
– minimul dintre numerele introduse;
– maximuldintre numerele introduse;
– media aritmetica a numerelor introduse;
– media geometrica a numerelor introduse ( radicalul de
ordin n dintr-un numar x se calculeaza prin apelul functiei
pow(x,1.0/n) cu prototipul in math.h )
a) Implementati o varianta in care memorati valorile
introduse intr-un vector.

http://www.disciplinele.ml
Exercitii propuse (cont)
b) Implementati o varianta in care nu memorati valorile
introduse.
Indicatie. Functia scanf returneaza numarul de itemi cititi cu
succes; daca se intalneste ‘sfarsitul’ fluxului de date
(caracterul EOF – End of File), functia scanf returneaza -1.
De exemplu, pentru a testa daca este citit un numar intreg
correct, putem scrie:
int rezultat, numar;
rezultat = scanf(“%d”, &numar);
if(rezultat == 1)
printf(“A fost citit un numar corect\n”);
else
printf(“Nu s-a citit un intreg\n”);

http://www.disciplinele.ml
Exercitii propuse (cont)
26. Sa se scrie un program C care citeste numere de la tastatura, pana la
citirea primului 0. Sa se calculeze suma numerelor pozitive introduse.
a) Scrieti programul memorand valorile citite de la tastatura intr-un vector.
Indicatie. Declarati un vector de o dimensiune cuprinzatoare prestabilita.
Numarati cate valori introduceti.
b) Implementati si o varianta in care nu memorati valorile intr-un vector.
Indicatie. Folositi o singura variabila in care sa se realizeze citirea de fiecare
data.

27. Sa se realizeze un program C care citeste de la tastatura numere intregi


pana la introducerea Ctrl+Z. Programul va citi separat o valoare si apoi va
cauta valoarea respectiva in sirul de numere introduse initial. Programul va
afisa pozitia pe care se regaseste valoarea cautata, in caz ca aceasta se
gaseste in sirul initial, sau un mesaj de eroare, in cazul in care valoarea
cautata nu se regaseste in sirul initial.

http://www.disciplinele.ml
Exercitii propuse (cont)
28. Să se realizeze un program C care calculeaza si afiseaza
cmmdc, respectiv cmmc a două numere întregi.
a) Folositi algoritmul lui Euclid cu scaderi (cat timp numerele
sunt diferite, se inlocuieste numarul mai mare cu diferenta lor).
b) Folositi varianta modificata a algoritmului lui Euclid – care
foloseste operatorul %. Atentie. Daca a<b, interschimbati valorile
lui a si b. Implementati operatia de interschimbare folosind
operatorul ?: si o variabila auxiliara.

29. Sa se realizeze un program C care citeste un sir de numere


intregi de la tastatura si calculeaza cmmdc al acestora.
Programul va memora numerele introduse intr-un vector.
Programul va afisa la output:
• Au fost introduse <n> numere.
Cmmdc al acestora este <d>.

http://www.disciplinele.ml
Exercitii propuse (cont)
30. Sa scrie un program care citeste de la tastatura notele la disciplina
Programare ale unei grupe de 25 de studenti. Programul va afisa cati
studenti au promovat, respectiv picat, si media generala a grupei la
care se iau in considerare doar cei ce au promovat. De asemenea, sa sa
calculeze, in procente, cati studenti au luat note intre 5-6, 7-8, 9-10.
a) Scrieti programul folosind un vector pentru stocarea notelor.
b) Scrieti programul fara a folosi vector pentru stocarea notelor.

31. Scrieti un program care citeste de la tastatura doi vectori de


numere (de aceeasi dimensiune) si calculeaza suma lor, termen cu
termen, intr-un al treilea vector. Programul afiseaza rezultatul obtinut.

http://www.disciplinele.ml
Exercitii propuse (cont)
32. Scrieti un program care citeste de la tastatura doi vectori de
numere de aceeasi dimensiune si calculeaza produsul scalar al
acestora. Programul afiseaza rezultatul obtinut. Să se realizeze
un program C care afişează cifrele unui număr întreg, introdus
de la tastatura, pe cate un rand. De exemplu, daca numarul
introdus este 918, programul va afisa
9
1
8
33. Sa se realizeze un program C care verifica cate cifre mai
mari decat 5 intra in componenta unui numai intreg introdus de
la tastatura. (Tema) Să se realizeze un program C care
calculeaza si afişează suma cifrelor unui număr întreg, introdus
de la tastatura. (Tema) Să se realizeze un program C care
verifica daca un număr întreg, introdus de la tastatura, este
compus dintr-un numar par de cifre.

http://www.disciplinele.ml
Exercitii propuse (cont)
34. Scrieti un program C care determina cifra care apare cel mai des in cadrul
unui numar natural n, citit de la tastatura.

35. Scrieti un program care verifica daca un an introdus de la tastatura este


bisect.
Indicatie. Un an este bisect daca este divizibil cu 400 sau daca este divizibil cu
4 dar nu este divizibil cu 100.
if year is divisible by 400 then
is_leap_year
else if year is divisible by 100 then
not_leap_year
else if year is divisible by 4 then
is_leap_year
else
not_leap_year

http://www.disciplinele.ml
Exercitii propuse (cont)
36. Să se realizeze un program C care calculeaza
numarul maxim de ore, minute si secunde care sunt
egale cu un numar întreg n de secunde. Să se afişeze
intervalul de timp în formatul
<ore>H:<minute>M:<secunde>S. De exemplu, pentru un
interval de 7384 secunde programul va afisa 2H:3M:4S

37. Sa se realizeze un program C care verifica daca un


numar introdus de la tastatura este palindrom (are
aceeasi reprezentare citit de la dreapta la stanga ca si
de la stanga la dreapta).
a) Rezolvati cerinta fara a folosi vectori.
b) Folositi un vector pentru a memora cifrele numarului.

http://www.disciplinele.ml
Exercitii propuse (cont)
38. Să se realizeze un program C care citeşte 3 numere
de la tastatură şi verifică dacă acestea pot fi laturile unui
triunghi şi daca acesta este dreptunghic.
39. Sa se scrie un program care citeste o valoare nenula
n de la intrarea standard. Apoi, programul citeste o lista
de valori (terminata la primul 0 ori cu Ctrl+Z). Programul
va afisa valoarea cea mai apropiata de nr n introdus
initial, si va preciza de asemenea pozitia pe care a fost
introdusa aceasta valoare.
• a) Rezolvati problema fara a folosi masive de date.
• b) Rezolvati problema folosind masive de date.

http://www.disciplinele.ml
Exercitii propuse (cont)
40. Să se realizeze un program C care citeste
un nr de la tastatura si verifică dacă este
prim,sau nu.
Indicatie. Verificati daca numarul are vreun
divizor in afara de 1 si de el insusi, adica daca
se divide cu vreun numar <radical(n). Pentru a
calcula radicalul folositi functia sqrt din math.h.
41. Scrieti un program C care afiseaza
numerele prime mai mici sau egale cu n, unde
n este introdus de la tastatura.

http://www.disciplinele.ml
Exercitii propuse (cont)
42. Scrieti un program care calculeaza suma divizorilor unui numar
natural n, citit de la tastatura. Un numar este perfect daca este egal cu
suma divizorilor proprii pozitivi (ex: 28 = 1 + 2 + 4 + 7 + 14). Afisati
numerele perfecte mai mici sau egale cu o valoare m, citita de la
tastatura.

43. Sa se scrie un program C care citeste un numar de la tastatura si


stabileste toti factorii primi ai acestuia si ordinele lor de multiplicitate.
Programul afiseaza pe ecran informatiile obtinute. Indicatie. Folositi doi
vectori - unul pentru a memora factorii primi si al doilea pentru a
memora puterile acestora.
44. Scrieti un program C care citeste de la tastatura data
curenta prin trei numere intregi reprezentând anul, luna, ziua
precum şi data naşterii unei persoane ca anul, luna, ziua, apoi
calculeaza varsta persoanei exprimata in ani, luni şi zile. Vom
considera ca toate lunile au 30 zile.

http://www.disciplinele.ml
Exercitii propuse (cont)
45. Scrieti un program care citeste de la intrarea standard un
numar ce reprezinta suma (intreagă) datorată de un client, apoi
citeste suma pe care o da clientul si şi calculează "restul" pe
care clientul îl primeşte în număr minim de bancnote de 10, 5, 1
lei.
46. Scrieti un program C care calculeaza data la care ajunge un
calator la destinatie, stiind data si ora la care pleaca acesta, si
durata calatoriei, exprimata in secunde.
47. Sa se scrie un program care citeste un sir de numere nenule de la
tastatura (citirea se termina la introducerea primului 0) si verifica daca:
sirul este crescator;
sirul este descrescator;
sirul contine valori identice.

http://www.disciplinele.ml
Exercitii propuse (cont)
48. Scrieti un program care citeste de la tastatura valori
pozitive pana la prima valoare negativa ori nula. Pentru
fiecare valoare citita, sa se calculeze cate patrate perfecte
sunt mai mici sau egale cu respectiva valoare.
49. Scrieti un program care citeste de la tastatura un
intreg scris in baza 10 si afiseaza la consola reprezentarea
acestuia in baza 2. Indicatie. Folositi un vector pentru a
stoca valorile din reprezentarea in baza 2 a numarului.
50. Scrieti un program care citeste de la tastatura un
intreg n in baza 10 si un numar intreg b (2<=b<=10), si
apoi afiseaza reprezentarea intregului n in baza b.

http://www.disciplinele.ml
Exercitii propuse (cont)
51. Scrieti un program care afiseaza toate numerele
prime mai mici strict decat un numar pozitiv n,
introdus de la tastatura.
52. Scrieti un program care pentru un an introdus
de la tastatura, calculeaza data calendaristica
pentru a n-a zi din an (n introdus de catre
utilizator). De exemplu, pentru an=2013, n=50
programul afiseaza 19 februarie 2013. Programul va
tine cont daca anul este bisect.

http://www.disciplinele.ml
Exercitii propuse (cont)
53. Scrieti un program care, pentru un n dat, calculeaza termenul de
rangul n din şirul lui Fibonacci, cunoscând relaţia de recurenţă:
fn = fn-1 +fn-2 pentru n > 2
f0 = 1, f1 = 1
Calculati limita sirului fn+1/fn, prin estimarea termenului n pentru care
precizia este <= Epsilon (introdus de la tastatura).

54. Scrieti un program care calculeaza suma


S=1/2 +1*3/2*4+...+1*3*...*(2n-1)/2*4*...2n

55. Calculati valoarea constantei PI cu precizia Epsilon, stiind ca


PI = 1 -1/3 + 1/5 - 1/7 + 1/9 - ...
Precizia Epsilon se va introduce de la tastatura. Vom considera ca numarul PI
este calculate cu precizia Epsilon daca |PI(n+1)-PI(n)|<=Epsilon, unde PI(n+1)
si PI(n) sunt doua aproximatii successive ale lui PI folosind seria de mai sus.

http://www.disciplinele.ml
Exercitii propuse (cont)
56. Scrieti un program care calculeaza cos(x)
pentru un x dat (citit de la utilizator), cu o
precizie Eps (data de utilizator), folosind seria
cos(x) = 1 - x2/2! + x4/4! - x6/6! +...
Vom considera ca valoarea cos(x) este calculata
cu precizia Epsilon daca
|cos(x)_n+1- cos(x)_n|<=Epsilon, unde cos(x)_n+1
si cos(x)_n+1 sunt doua aproximatii successive ale
lui cos(x) folosind seria de mai sus.

http://www.disciplinele.ml
Exercitii propuse (cont)
57. Scrieti un program care calculeaza sin(x)
pentru un x dat, cu o precizie Eps, folosind seria
sin(x)=x/1! - x3/3! + x5/5! -...
Vom considera ca valoarea sin(x) este calculata
cu precizia Epsilon daca
|sin(x)_n+1- sin(x)_n|<=Epsilon,
unde sin(x)_n+1 si sin(x)_n+1 sunt doua
aproximatii successive ale lui sin(x) folosind seria
de mai sus.
http://www.disciplinele.ml
Exercitii propuse (cont)
58. Se considera un sir cu n − 1 valori distincte
din multimea {1, 2, . . . , n}. Sa se determine,
folosind un numar cat mai mic de comparatii,
valoarea care lipseste din sir.

http://www.disciplinele.ml