Documente Academic
Documente Profesional
Documente Cultură
1. Instruciunea expresie.
O instruciune expresie se obine punnd terminatorul de instruciune (punct-virgula) dup o
expresie:
expresie;
Exemple:
a++;
scanf();
max=a>b ? a : b;
Exemplul 1:
Un numr real, introdus de la tastatur reprezint msura unui unghi exprimat n
radiani. S se scrie un program pentru conversia unghiului n grade, minute i secunde sexagesimale.
#include <stdio.h>
#define PI 3.14159265
void main(void){
float rad, gfr, mfr;
int g, m, s;
printf(Introduceti numarul de radiani: );
scanf("%f", &rad);
g=gfr=rad*180/PI;
m=mfr=(gfr-g)*60;
s=(mfr-m)*60;
printf("%5.2f radiani=%4d grade %02d min %02d sec\n",
rad, g, m, s);
}
2. Instruciunea compus (blocul).
Forma general:
{
declaratii_si_definitii;
instructiuni;
}
Se folosete n situaiile n care sintaxa impune o singur instruciune, dar codificarea impune
prezena unei secvene de instruciuni. Blocul de instruciuni conteaza ca o singur instruciune.
3. Instruciunea vid.
Forma general: ;
Sintaxa impune prezena unei instruciuni, dar logica problemei nu necesit nici o prelucrare.
In acest mod se introduc unele relaxri n sintax.
4. Instruciunea if.
Forma general:
if (expresie)
instructiune1;
else
instructiune2;
Se evalueaz expresia; dac este diferit de 0 se execut instruciune1 altfel
instruciune2
O form simplificat are instruciune2 vid:
if (expresie)
instructiune;
21
else
instrn;
De exemplu dorim s contorizm caracterele citite pe categorii: litere mari, litere mici, cifre,
linii i altele:
if (c == \n)
linii++;
else if (c>=a && c<=z)
lmici++;
else if (c>=A && c<=Z)
lmari++;
else if (c>=0 && c<=9)
cifre++;
else
altele++;
Exemplul 2 S se scrie un program pentru rezolvarea cu discuie a ecuaiei de grad 2 : ax2+bx+c=0
folosind operatorul condiional.
#include <stdio.h>
#include <math.h>
void main(void){
float a, b, c, d;
printf(Introduceti coeficientii ecuatiei: a,b,c\n);
scanf("%f %f %f", &a,&b,&c);
a? d=b*b-4*a*c, d>=0? printf("x1=%f\tx2=%f\n",(-b- sqrt(d))/2/a,
(-b+sqrt(d))/2/a):
printf("x1=%f+i*%f\tx2=%f-i*%f\n",-b/2/a,
sqrt(-d)/2/a,-b/2/a, sqrt(-d)/2/a)):
b? printf("x=%f\n",-b/2/a): c? printf("0 solutii\n"):
printf("identitate\n");
}
Exemplul 3: Data curent se exprim prin an, luna i zi. S se scrie un program care determin
data zilei de mine.
#include <stdio.h>
int bisect(int a){
return a%4==0 && a%100!=0 || a%400==0;
}
int ultima(int a, int l){
if (l==2)
return (28+bisect(a));
else if (l==4||l==6||l==9||l==11)
return 30;
else
return 31;
}
void main()
{int a, l, z;
22
Forma general:
switch (expresie){
case val1: secventa1;
case val2: secventa2;
. . .
default:
secventa s;
}
Se evalueaz expresia selectoare; dac valoarea ei este egal cu una din constantele cazurilor,
se alege secvena de prelucrare corespunztoare, dup care se continu cu secvenele de prelucrare ale
cazurilor urmtoare.
Dac valoarea expresiei selectoare nu este egal cu nici una din constantele cazurilor, se alege
secvena corespunztoare etichetei default.
Pentru ca prelucrrile corespunztoare cazurilor s fie disjuncte se termin fiecare secvent de
prelucrare prin break. De exemplu:
y=x;
switch (n)
{ case 5: y*=x;
case 4: y*=x;
case 3: y*=x;
case 2: y*=x;
}
calculeaz xn, unde n ia valori de la 1 la 5.
Exemplul 4
23
6. Instruciunea while.
Este ciclul cu test iniial; se repet instruciunea component ct timp expresia are valoarea
adevrat (diferit de 0).
while (expresie)
instructiune;
Exemplu 5:Copiai fiierul standard de intrare stdin la ieirea standard stdout
/*copierea intrarii la iesire*/
{ int c;
c = getchar();
while (c != EOF)
{ putchar(c);
c = getchar();
}
/* varianta simplificata */
{ int c;
while ((c=getchar()) != EOF)
putchar(c);
}
Exemplul 6: S se calculeze cel mai mare divizor comun i cel mai mic multiplu comun a 2 numere
folosind algoritmul lui Euclid cu scderi. (ct timp numerele difer se nlocuiete cel mai mare dintre
ele prin diferena lor).
#include <stdio.h>
void main(void){
unsigned long a, b, ca, cb;
printf(Introduceti cele doua numere\n);
scanf("%lu %lu", &a, &b);
ca=a; cb=b;
while (a!=b)
if(a > b)
a-=b;
else
b-=a;
printf("cmmdc(%lu,%lu)=%lu\ncmmmc(%lu,%lu)=%lu\n",
ca,cb,a,ca,cb,ca*cb/a);
}
7. Instruciunea dowhile.
Reprezint ciclul cu test final;repetarea instruciunii are loc ct timp expresia este diferit de 0.
do
instructiune;
while (expresie);
Corpul buclei este format dintr-o singur instruciune. Repetarea se face cel puin o dat.
/* citirea unui raspuns */
{ char opt;
printf(Continuam ? D / N);
do
scanf(%c, &opt);
while (opt == D || opt == d);
24
Exemplul 7: S se stabileasc dac un numr este sau nu palindrom (are aceeai reprezentare citit de
la stnga sau de la dreapta).
#include <stdio.h>
void main(void){
unsigned long n, c, r=0;
scanf("%lu", &n);
c=n;
do{ r=10*r+n%10;
n/=10;
}while (n);
printf("%lu %s este palindrom\n",c, (c==r)? :nu);
}
8. Instruciunea for.
Reprezint o alt form a ciclului cu test iniial.
for (exp_init; exp_test; exp_modif)
instructiune;
este echivalent cu:
exp_init;
while (exp_test){
instructiune;
exp_modif;
}
Exemplul 8: S se stabileasc dac un numr ntreg n este sau nu prim.
Vom ncerca toi divizorii posibili (de la 2 la n). Dac nu gsim nici un divizor, numrul este
prim. Continuarea ciclului pentru testarea posibililor divizori este determinat de dou condiii:
- s mai existe divizori netestai
- candidaii deja testai s nu fi fost divizori.
La ieirea din ciclu se determin motivul pentru care s- a prsit ciclul:
- s-au testat toi candidaii i nu s-a gsit nici un divizor, deci numrul este prim
- un candidat a fost gsit divizor, deci numrul este neprim.
Ciclul de testare a candidailor are forma:
for (d=2; d*d <= n && n % d != 0; d++)
;
Programul poate fi mbuntit prin evitarea testrii candidailor pari (cu excepia lui 2).
#include <stdio.h>
void main(void) {
unsigned long n, d;
scanf(%lu,&n);
for(d=2; d*d <= n && n%d; (d=2)? d=3: d+=2)
;
printf(numarul %lu este %sprim\n,n,!(n%d)? ne:);
}
9. Instruciunea continue.
Plasarea acestei instruciuni n corpul unui ciclu are ca efect terminarea iteraiei curente i
trecerea la iteraia urmtoare.
continue;
Exemplul 9: O secven de numere ntregi este terminat prin 0. S se calculeze suma termenilor
pozitivi din secven.
25
#include <stdio.h>
void main(void) {
int n, suma;
for(suma=0,scanf(%d,&n); n; scanf(%d,&n){
if(n < 0) continue;
suma += n;
}
printf(suma pozitivi = %d\n, suma);
}
10. Instruciunea break.
Are ca efect ieirea dintr-o instruciune de ciclare sau dintr-o instruciune switch, pentru a
face alternativele disjuncte (n caz contrar dintr-o alternativ se trece n urmtoarea). Permite
implementarea unor cicluri cu mai multe ieiri plasate oriunde n interiorul ciclului.
O structur repetitiv foarte general cu mai multe ieiri plasate oriunde este:
while (1) {
. . .
if(expresie1) break;
. . .
if(expresien) break;
. . .
}
11. Instruciunea goto.
Realizeaz saltul la o etichet. Este o instruciune nestructurat i se evit.
goto eticheta;
12. Instruciunea return.
Orice funcie nedeclarat void va trebui s ntoarc un rezultat. Tipul acestui rezultat este
specificat n antetul funciei. Transmiterea acestui rezultat este realizat de o instruciune return
inclus n corpul funciei.
return expresie;
Exemplul 10: Calculul factorialului.
long factorial( int p)
{ int i;
long f;
for ( f = 1,i=2; i <= n; i++)
f *= i;
return f;
}
Dac expresia ntoars este de alt tip dect cel al funciei, atunci se face conversia la tipul
funciei.
13. Exerciii.
1. De pe mediul de intrare se citete un numr real rad reprezentnd un unghi exprimat n radiani.
S se converteasc n grade, minute i secunde centesimale.
2. Un maratonist pornete n curs la un moment de timp exprimat prin ora, minutul i
secunda startului. Se cunoate de asemeni timpul necesar sportivului pentru parcurgerea
traseului. S se determine momentul terminrii cursei de ctre sportiv.
26
a, b, c R, a 0.
4. Cunoscnd data curent exprimat prin trei numere ntregi reprezentnd anul, luna, ziua
precum i data naterii unei persoane exprimat n acelai mod, s se calculeze vrsta persoanei
exprimat n ani, luni i zile. Se consider n mod simplificator c toate lunile au 30 de zile.
5. Un punct n plan este dat prin coordonatele lui (x, y). S se stabileasc poziia lui prin
indicarea cadranului (1, 2, 3 sau 4) n care este plasat. Pentru un punct situat pe una din semiaxe se
vor preciza cadranele separate de semiaxa respectiv (de exemplu 2-3).
6. Se citesc trei numere reale pozitive ordonate cresctor. S se verifice dac acestea pot s reprezinte
laturile unui triunghi i n caz afirmativ s se stabileasc natura triunghiului: isoscel, echilateral,
dreptunghic sau oarecare i s se calculeze aria sa.
7. Cunoscnd data curent i data naterii unei persoane exprimat fiecare sub forma unui triplet
(an,luna,zi) s se afle vrsta persoanei n ani implinii.
8. De pe mediul de intrare se citete un unghi
converteasc n radiani.
exprimat n grade,minute,secunde. S se
27
17. Dndu-se trei numere ntregi reprezentnd data unei zile (an,lun,zi), s se stabileasc a
cta zi din an este aceasta.
18. Se dau pe mediul de intrare un numr necunoscut de numere nenule terminate cu o valoare nul.
S se stabileasc dac acestea:
19. Dndu-se un numr ntreg n, s se afieze toi factorii primi ai acestuia precum i ordinele lor de
multiplicitate.
20. Abaterea medie ptratic a rezultatelor obinute prin determinri experimentale se poate calcula cu
formula:
N
sigma
N x
i1
2
i
i1
N(N 1)
k! cnd se cunoate n
k1
28
= cn-1 bn-1
+ ...+ c0
35. De pe mediul de intrare se citesc n cifre constituind reprezentarea unui numr ntr-o baz
b1 < 10, ncepnd cu cea mai puin semnificativ. S se obin i s se afieze cifrele reprezentrii
aceluiai numr ntr-o alt baz b2 < 10.
36. S se verifice dac un numar ntreg citit de pe mediul de intrare este palindrom, adic se citete
la fel de la stnga la dreapta i de la dreapta la stnga (numrul este identic cu rsturnatul su). Un
astfel de numr este 4517154. Nu se vor folosi tablouri de variabile pentru pstrarea cifrelor
numrului.
37. S se determine toate numerele prime mai mici sau egale cu un numr k dat pe mediul de
intrare.Pentru a verifica dac un numr x este prim se va incerca divizibilitatea lui cu 2,3,4,...
{x }. Numrul este prim dac nu se divide cu niciunul dintre aceste numere i este neprim dac are
cel puin un divizor printre ele.
38. Printre numerele mai mici sau egale cu un numr n dat pe mediul de intrare s se gseasc cel
care are cei mai muli divizori.
39. Se consider funcia f(x) = ln (2.x2 +
intervalul [-10, 10] cu urmtorii pai:
0.1 pentru
| x | 1.0
0.5 pentru 1.0 < | x | 5.0
29
+ 15 * 160
41. De pe mediul de intrare se citesc cifrele reprezentrii unui numr ntreg n baza 16 terminate cu
caracterul H (cifrele hexazecimale sunt 0,...,9, A, B, C, D, E, F). S se calculeze i s se
afieze reprezentarea numrului n baza 10.
42. Dndu-se un numr ntreg n s se afieze reprezentarea sa cu cifre romane impunnd regula
ca o cifr s nu poat fi urmat de o alta cu valoare strict mai mare dect ea. Numrul 99 se va
reprezenta n aceste condiii ca LXXXXVIIII i nu ca XCIX.
43. Se dau dou numere ntregi, primul reprezentnd un an i al doilea, numrul de zile scurse din acel
an. S se determine data (luna i ziua).
44. S se calculeze coeficienii binomiali Cn1 ,Cn2 ,... Cnp n care n i p sunt intregi pozitivi dai
(p <= n), tiind c exist urmtoarea relaie de recuren:
Cnk=(n-k+1)/k*Cnk-1 pornind cu Cn0=1
45. Se consider polinomul: pn (x)=a0 xn +a1 xn-1
+ ... +an
S se calculeze valoarea polinomului ntr-un punct x dat, dac valorile coeficienilor lui x se citesc pe
rnd, n aceeai variabil a :
a) n ordinea descresctoare a puterilor lui x (adic n ordinea a0,a1,...an)
b) n ordinea cresctoare a puterilor lui x, (adic n ordinea an,an-1,...a0)
46. Pentru a, b i n dai (a,b R, n Z) s se calculeze x i y astfel ca: x+i*y=(a+i*b)n fr
a folosi formula lui Moivre
47. S se calculeze i s se afieze valorile integralei:
Ik(x)
u e du
k
unde :
48. S se calculeze pentru n dat, fn termenul de rangul n din irul lui Fibonacci, cunoscnd relaia de
recuren:
fp = fp-1
+fp-2 pentru p > 2 i f0 = 1, f1 = 1
49. irul {xn} generat cu relaia de recuren xn = (xn-1 + a/xn-1)/2 pornind cu x0= a/2 este
convergent pentru a > 0 i are ca limit a . Pentru a oarecare, dat, s se construiasca un algoritm
care calculeaz a ca limit a acestui ir,cu o precizie eps dat.
30
2
I
/2
dx
a cos x b2 sin2 x
2
S se calculeze aceast integral pentru a i b dai, ca limit comun a celor dou iruri, determinat
a2n 1
an a2n 1
2
daca
a2n 1 2
daca
a2n 1 2
pornind cu
a0 x
aproximativ cu precizia eps, n momentul n care distana ntre termenii celor dou iruri devine
inferioar lui eps, adic |un vn | < eps.
51. Pentru calculul lui lg2 x se genereaz irurile {an}, {bn} i {cn}
cu relaiile de recuren:
a2n 1
an a 2n -1
2
dac
a2n 1 2
dac
a2n 1 2
bn = bn-1 / 2
pornind cu a0 x
pornind cu b0=1
cn 1
daca
a2n 1 2
cn 1 bn
daca
a2n 1 2
cn
pornind cu c0 0
ex
k0
xk
k!
31
ei e e e
pentru
i 0
ei
1 1
1
e e e
pentru
i0
k1
2
4n2 k
lim
k
55. S se calculeze funcia Bessel de spea I-a Jn (x) tiind c exist relaia de recuren:
Jp (x) =
(2p-2)/x*Jp-1(x) Jp-2(x)
2k
2
J 0(x) (1)k 2
(
k
!)
k 0
2k 1
2
J 1(x) (1)k
k
!
(
k 1)!
k0
Calculele se fac cu precizia eps (x, n i eps se dau pe mediul de intrare).
56. Pentru n dat s se calculeze suma:
1 13
1 3 (2n 1)
2 24
2 4 2n
1 1 1
1
4
3 5 7
58. S se calculeze sin(x) i cos(x) cu precizia dat eps utiliznd dezvoltrile n serie de puteri:
32
sin(x)
x x3
x5 x7
1! 3!
5! 7!
cos(x) 1
x 2 x4 x6
2!
4! 6!
sin(x) x
x 3 x 5 x7
3! 5! 7!
33
/2