Documente Academic
Documente Profesional
Documente Cultură
Curs 2
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
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ă)
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:
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.
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! ).
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.
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.
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
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
http://www.disciplinele.ml
Operatorul conditional ?:
• operator ternar
expr0 ? expr1 : expr2
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
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
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
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.
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.
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.
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.
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
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.
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).
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