Library TUM
Reason: I attest to the
accuracy and integrity
of this document
UNIVERSITATEA TEHNIC A MOLDOVEI
PROGRAMARE
Indicaii de laborator
Partea I
Chiinu
Editura Tehnica-UTM
2014
Indicaiile de laborator sunt destinate studenilor cu
specializrile Teleradio comunicaii, Electronic, Sisteme
optoelectronice, Inginerie i management n telecomunicaii de la
Facultatea Inginerie i Management n Electronic i
Telecomunicaii pentru a fi utilizate la efectuarea lucrrilor de
laborator la disciplina Programare.
Fiecare lucrare de laborator conine materialul teoretic
necesar pentru executarea lucrrii respective, precum i problemele
propuse spre elaborare.
Prin problematica pe care o trateaz, ndrumarul poate fi
utilizat i de studenii altor specializri care studiaz i practic
limbajul de programare C.
U.T.M., 2014
2
CUPRINS
Introducere.4
Bibliografie ..86
3
INTRODUCERE
1. Scopul
Scopul de baz al programrii liniare este studierea i
utilizarea instruciunilor de baz ale limbajului pentru elaborarea
unui program liniar; familiarizarea studenilor cu reprezentarea
tipurilor de date ale limbajului C/C++ n memoria calculatorului,
operatorilor, precum i construciile elementare ale limbajului.
2. Descrierea temei
2.1. Structura programului C
#include <nume_fisier.h>
sau:
#include"nume_fisier.c"
Exemple:
#include <stdio.h>
#include <math.h>
Exemplu:
#define max(a,b) (a>b?a:b)
#define suma(a,b) (a+b)
#define schimb(a,b) (r=a; a=b; b=r)
Exemplu:
#if SYSTEM==MSDOS //daca sist. de operare este MS-DOS
#include <dos.h> // se foloseste headerul <dos.h>
#else
#include<windows.h> //se foloseste headerul <windows.h>
#endif
7
Includerile condiionate mai pot fi folosite i pentru
construirea grupurilor condiionate sub forma:
#ifdef MACRO
text controlat
#endif /*MACRO*/
#include <stdio.h>
#include <conio.h>
void main()
{
clrscr();
printf(Primul meu exemplu in C );
getch();
}
Rezultatul execuiei:
10
Tabelul 1. Tipuri fundamentale de date n limbajul C
Nr. Cuvnt - Semnificaie
cheie
1 char Dat caracter
2 int Numr ntreg cu semn
3 float Numr cu zecimale
4 double Numr cu zecimale reprezentat n dubl precizie
5 void Fr valoare
11
Tabelul 2. Caracteristicile tipurilor fundamentale i modificate n
limbajul C++
Nr. Tipul de date Dimensiunea Domeniul de valori
n bii
1 char 8 ntregi -127 127
2 unsigned char 8 ntregi 0 255
3 signed char 8 ntregi -127 127
4 int 16 -32767 32767
5 unsigned int 16 0 65535
6 short int 16 similar cu int
7 unsigned short int 16 0 65535
8 long int 16 -2147483648 2147483647
9 signed long int 16 similar cu long int
10 unsigned long int 32 0 4294967295
11 float 32 3,4*10-383,4*10+38
12 double 64 10 zecimale exacte
13 long double 80 10 zecimale exacte
#include <conio.h>
#include <stdio.h>
#define PI 3.14159
#define name "Catalina"
void main()
{
int int1,int2;
long long1,long2;
float float1, float2;
char char1, char2, char3;
int1=99;
int2=0xFF01;
long1=-68741L;
long2=0xFFF1;
12
float1=3.14159;
float2=1.5E04;
char1='C';
char2=15;
char3=0xF1;
Rezultatul execuiei:
13
2.3. Funciile de intrare/ieire n C
14
Pentru a aranja sau a acorda un aspect textului afiat cu
funcia printf, sunt folosite nite combinaii de simboluri speciale
(backslash) alctuite dintre-un slash inversat (\), ce se afl
neaprat pe primul loc, dup care urmeaz o combinaie din litere
latine, simboluri sau cifre. Codurile backslash ale limbajului C
sunt date n tabelul 4.
#include <conio.h>
#include <stdio.h>
void main()
{
int v; float m; char n[15];
printf(" Introdu numele:");
scanf("%s",n);
printf("\n Introdu virsta:");
scanf("%d",&v);
printf("\n Introdu media:");
scanf("%f",&m);
clrscr();
printf("Nume:%s,virsta:%d,media:%f",n,v,m);
getch();
}
Rezultatul execuiei:
16
3. Variantele propuse spre elaborare
1 sin(a 5 + b 5 ) 2 + y3
B= ; D= x y + ;
14 + a b (a 2 )
c
17
( m + x )3 sin 3 (a 3 ) a * y y2 x2
7 k =e ; T= ;
cos(b 3 ) x2
2
a+b x 2 cos( y )* a + y
8 W = x+ y ; y= ;
a 2
+ 13 sin( x 2 ) cos( y ) 2
2
13 + b
a b2
sin( x a +c ) + a
j = b +2a * 2 ;
2 2x
9 G= ;
x+x x cos( y c + a 1 ) b
b + x2+ xa
cos( x + y 2+ y ) cos( x + y 2 ) + 101 y 2 + x
X = ; M= ;
10 a + b x+ y (a 3 3 y + 1) * 8
cos(a + y a +b )
sin( x ) 2 + y* x
x + a b 2+sin( a ) e 2
q= ; L= ;
11 a 2 + b2 2 y y + sin(a + x y )
15 a * b 45
(sin a 2 + cos b 2 ) + a (x * b ) y + a2
2
J= ; b= ;
12 1 * a 2 + a b 2 b 2
sin(a ) + cos(b )
2
x + a b2
a+b
x y y x2
2+ a
; b c2
13 D = +
2
H= ;
sin(a ) a + y
sin(a + b 2 )
x2 cos(b c)
a cos( x )
x*a + ( )
e b sin( a ) y a + 10 + sin(a 2 )
14 g= *2 ; F = ;
tga + 12 * x cos( x 2 ) + sin( y 2 )
x y2
18
2+ c
( x + y + c e y+ x ) 2 + x cos( y )
a= ; p= ;
15 x2 + y2 y + x 2 23
100
x2 + y2 c
2*
a + b2 x + y 2 x
A= ; U= ;
16 a b 3 + cos(a ) cos( x 2 2)
a+2
b + a 2 + sin(b 2 )
a 2 b
2+b 2)
2+ a
+ y3 +c2
e + x + x2+a + y c 2+ cos( a
2 2+b
x 2*a + cos( x ) + b 2 x
17 x2 + 2 y2
ZZ =
(
x y + c2 ) +
a+b
x + y a + cos( x y ) + 2 + tgx x + b
2 2 y
2
2 x 2 + cos x y 3
#include<conio.h>
#include<stdio.h>
#include<math.h>
void main()
{
int a,b,c;
float Y;
printf("Introdu necunoscuta a:");
19
scanf("%d",&a);
printf("\nIntrodu necunoscuta b:");
scanf("%d",&b);
printf("\nIntrodu necunoscuta c:");
scanf("%d",&c);
Y=abs(a+b)+pow(c,2)+log(a)+tan(c);
printf("Rezultatul expresiei Y=%f",Y);
getch();
}
Rezultatul execuiei:
20
Lucrarea de laborator nr.2
Programe ramificate
1. Scopul
Studierea, utilizarea i obinerea deprinderilor practice de
elaborare i depanare a programelor ramificate (if-else, switch-
break).
2. Descrierea temei
2.1. Instruciunea if i if-else
if (condiie)
{
Instruciune-1;
}
else
{
Instruciune-2;
}
#include<conio.h>
#include<stdio.h>
void main()
{ int n;
printf(Introdu rezultatul testului: );
scanf(%d,&n);
if(n>=100)
{
printf(Ati trecut testul);
}
else
{
printf(Nu ati trecut testul);
22
}getch();}
Rezultatul execuiei:
#include<conio.h>
#include<stdio.h>
void main()
{
int n;
printf(Introdu rezultatul testului: );
scanf(%d,&n);
if(n>=100)
23
{
printf(Rezultat maxim);
}
else
{
if(n>=90)
{
printf(Rezultat satisfacator);
}
else
{
printf(Ati picat testul);
}
}
getch();
}
Rezultatul execuiei:
24
Sintaxa instruciunii Schema bloc
switch
switch (expresie)
{
case const-1:
{
instructiune-1; break;
}
case const-n:
{
instructiune-n; break;
}
default:
{
instructiune-def;
}
}
25
Pentru nelegerea complet trebuie menionate urmtoarele:
a) switch difer de if prin aceea c testeaz doar egalitatea,
n timp ce if poate s evalueze orice tip de expresie
relaional sau logic;
b) n acelai switch nu pot exista dou constante case cu
valori identice. Desigur, dou instruciuni switch, una
inclus n cealalt, pot s aib aceeai constant case.
c) Dac n instruciunea switch sunt utilizate constante de
tip caracter, ele sunt automat convertite n ntregi.
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
main()
{
int op1,op2,rez;
char op;
printf("\nScrieti expresia fara spatii intre
operanzi si operator\n");
scanf("%d%c%d",&op1,&op,&op2);
switch(op)
{
case '+':
{
rez=op1+op2; break;
}
case '-':
{
rez=op1-op2; break;
}
case '*':
26
{
rez=op1*op2; break;
}
case '/':
{
if (op2!=0)
{
rez=op1/op2;
}
else
{
printf("Nu se imparte la zero!!!!");
getch(); exit(0);
}
break;
}
default:
{
printf("Nu a avut loc o operatie!");
getch();
exit(1);
}
}
printf("\n%d %c %d=%d", op1, op,op2, rez);
getch();
}
Rezultatul execuiei:
27
3. Variantele propuse spre elaborare
1 . 8 cos 2 h + a h>a
6 C = 1 . 8 ah h=a
cosh + a sin 2 h h<a
28
d 3 | d g |
1d*29
7 V = dg e d d*2<1
sin dg + 1 d*2>9
e w cos(bx / w)
w<0.2
8 B = wx sin 2w + e 2 x ( w + b) w=0.2
2 w>0.2
tg ( w + x + b)
2 cos( x / 6 ) x<1.2
9 L = x 2 / a + cos( x + b ) 3 1.2 x3.9
| x / 2 a | + sin 2 ( x + 1) x>3.9
1 . 5 cos 2 v + u
-1v*u5
10 K = u 2 / 3 + v 2 + v*u<-1
| 3tgv + u 3 | v*u>5
( a + b ) /( e x + cos x ) x<2.8
11 J = ( a + b ) /( x + 1) 2.8 x6
e x + sin x + x>6
ca / i + bi 2 i<4
12 G = i + 2i + 2 4i6
ai + bi 3 i>6
a ln x + 3 | a x | x>1
13 F =
2 a cos x + 3 x 2
x1
at 2 + b sin t + a
t<0.1
14 T = at + b + t=0.1
| 3ta 2 + cos 3 t + 1 | t>0.1
29
a sin( i 2 + 1 )
i<1.5
15 K = cos( i + 1 / n ) i=1.5
| tgn + n 3 | + i>1.5
sin( 2 / k ) k<1
16. WD = 1 / k k=1
| k 2 | + k>1
#include<stdio.h>
#include<conio.h>
#include<math.h>
# define Pi 3.14
main()
{ int k,key; float WD;
printf(" MENIU ");
printf("\n 1 - Metoda if ");
printf("\n 2 - Metoda if-else ");
printf("\n 3 - Metoda if-else-if ");
printf("\nIntrodu necunoscuta k:");
scanf("%d",&k);
printf("\nIntrodu cazul:");
scanf("%d",&key);
switch(key)
{
case 1:
{
if(k<1)
{ WD=sin(2/k);}
if(k==1)
{ WD=1/k;}
30
if(k>1)
{ WD=abs(pow(k,2))+Pi;}
printf("Rezultatul WD=%f",WD);
break;
}
case 2:
{
if(k<1)
{ WD=sin(2/k);}
else
{printf("\nPentru k<1,nu sunt sol.");}
if(k==1)
{ WD=1/k;}
else
{printf("\nPentru k=1,nu sunt sol.");}
if(k>1)
{ WD=abs(pow(k,2))+Pi;}
else
{printf("\nPentru k>1,nu sunt sol.");}
printf("\nRezultatul WD=%f",WD);
break;
}
case 3:
{
if(k<1)
{ WD=sin(2/k);}
else
{
if(k==1)
{WD=1/k;}
else
{WD=abs(pow(k,2))+Pi;}
31
}
printf("\nRezultatul WD=%f",WD);
break;
}
default:{printf("\nNu este asa caz!");}
}//end switch
getch();}
Rezultatul execuiei:
32
Lucrarea de laborator nr.3
Programe ciclice
1. Scopul
nsuirea, folosirea i obinerea deprinderii practice de
elaborare i depanare a programelor ciclice (for, while, do-while).
2. Descrierea temei
2.1. Instruciunea for
#include<conio.h>
#include<stdio.h>
void main()
{
int i,n,c,s=0;
printf("Introdu cantitatea de cifre:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
printf("Introdu cifra:");
scanf("%d",&c);
s=s+c;
}
printf("\nSuma cifrelor=%d",s);
getch();
}
Rezultatul execuiei:
34
2.2. Instruciunea while
while(expresie)
instruciuni;
35
#include<conio.h>
#include<stdio.h>
void main()
{
int i=1,n,s=0,p=1;
printf("Introdu numarul de cifre:");
scanf("%d",&n);
while(i<n)
{
s=s+i;
p=p*i;
i++;
}
printf("\nSuma cifrelor=%d",s);
printf("\nProdusul cifrelor=%d",p);
getch();
}
Rezultatul execuiei:
instruciuni;
while(expresie)
#include<conio.h>
#include<stdio.h>
void main()
{
int i=0,n,s=0,c,p=1;
printf("Introdu numarul de cifre:");
scanf("%d",&n);
do
{
printf("Introdu cifra:");
scanf("%d",&c);
37
s=s+c;
p=p*c;
i++;
}
while(i<n);
printf("\nSuma cifrelor=%d",s);
printf("\nProdusul cifrelor=%d",p);
getch();
}
Rezultatul execuiei:
38
a b2 + t X+1=t<Y;
3 S= + t 1
a2 interval min=12
D = a 2 + l + e a +l X2=l<Y;
4
interval min=10
F = (cos a + b 2 + sin a 2 + b) j X=j<Y+a;
5
interval min=11
b2 + a f X-w=f<Y;
6 G=
a+b interval min=14
a X/2=p<Y;
7 H= p + a 2 + b3 +
p +1 interval min=13
b 2a + a 2 i X=i<|Y|;
8 J=
i+2 interval min=10
cos a + sin b X=r<Y+4;
9 Q= +3
a +r
2 interval min=11
W=a 2+ p
+ b 3 + b + (a * p + 1) X-3=p<Y;
10
interval min=10
E = cos 2 a 3 + sin 3 b 2+ ( n +1) + a X=n<Y+Y;
11
interval min=15
b2 X=m<|Y*(a+b)| ;
12 R = a b+m 3 +
5 interval min=11
a a 4 b6 X2=k<Y+1;
13 T = b2 ++( )+k
2 4 6 interval min=10
a *b cos a X-5=i<Y+4;
14 Y= + +i
a b + i sin b interval min=12
a 2 + b3 + v 11-X=v<Y2;
15 B=l + 2*a
2 interval min=10
REZ = a + i
2 2 X=i<Y;
16
interval min=12
39
Exemplu: S se scrie programul ce va calcula valoarea expresiei
REZ = a2 + i2 pe intervalul X= i <Y. n program s se utilizeze
instruciunile: switch, for, while, do while,if i else:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
void main()
{
int Key; float y,x;
clrscr();
printf("\tIntrodu cazul: ");
scanf("%d",&Key);
switch(Key)
{
case 1 : //for
{
int a,b,X,Y,interval=0; float sum=0;
printf("Introdu a si b :\n");
scanf("%d%d",&a,&b);
printf("Interval min 12:\n");
scanf("%d%d",&X,&Y);
printf("\n -------RESULT------");
printf("\n Interval---REZ-----\n");
for(int i=X; i<Y; i++)
{
int REZ=pow(a,2)+pow(i,2);
printf(" | %d ",i);
printf(" - ");
printf(" %d \n",REZ);interval++;
sum+=REZ;
}
printf("\n--------------\n");
printf("Interval: %d", interval);
printf("\nTotal REZ: %f",sum);
40
getch();break;}//end case 1
case 2 : // while
{/*corpul functiei while*/ break;}
case 3 : //do while
{/*corpul functiei do while*/ break;}
case 0: exit(0);
}}
Rezultatul execuiei:
1. Scopul
Studierea i utilizarea instruciunilor de baz ale limbajului
pentru prelucrarea i modificarea masivelor unidimensionale.
2. Descrierea temei
2.1. Declarea tablourilor
tip nume_tablou[dim_1][dim_2][dim_n];
unde:
tip reprezint tipul elementelor tabloului (int, float sau char);
nume_tablou reprezint numele tabloului;
dim_1,dim_2,...,dim_n sunt numere ntregi sau expresii
constante intregi care reprezinta limitele superioare ale indicilor
tabloului.
42
2.2. Tablouri unidimensionale
43
Pentru a introduce, prelucra i afia un vector unidimensional
vor trebui parcurse toate elementele acestuia de la poziia iniial
pn la cea final.
#include<conio.h>
#include<stdio.h>
#include<math.h>
void main()
{
int i,n,V[20],s=0;
printf("Introdu lungimea vectorului:");
scanf("%d",&n);
printf("Incarcam valorile:\n");
for(i=0;i<n;i++)
{
printf("Introdu V[%d]=",i);
scanf("%d",&V[i]);
}
printf("Afisam vectorul");
printf(" V=");
for(i=0;i<n;i++)
{
printf("%3d",V[i]);
}
printf("\nCalculam suma conform cond.");
for(i=0;i<n;i++)
{
if((fmod(V[i],2)==0)&&(fmod(i,2)!=0))
{
s+=V[i];
}
}
44
printf("\nSuma=%d",s);
getch();
}
Rezultatul execuiei:
45
Pentru a introduce un ir de caractere n memoria
calculatorului, este folosit funcia gets(). Aceast funcie are
urmtoarea sintax:
gets(nume);
puts(nume);
#include<conio.h>
#include<stdio.h>
void main()
{
char fraza[50];
puts("Introdu fraza:");
gets(fraza);
puts("Extrag din memorie");
puts(fraza);
getch();
}
46
Rezultatul execuiei:
47
Tabelul 5 (continuare)
11 strcmp(s1,s2); Compar succesiv codurile ASCII ale
celor dou iruri i returneaz un
numr <0, dac s1<s2, sau 0, dac
s1=s2, sau >0, dac s1>s2.
12 strcimp(s1,s2); Compar irul s1 cu irul s2 fr a face
sau deosebire ntre literele mari i cele
strcmpi(s1,s2); mici.
13 strncmp(s1,s2,n); Campar primele n caractere ale celor
dou iruri.
strnicmp(s1,s2,n); Compar numai primele n caractere ale
14 sau celor dou iruri fr a face deosebire
strncmpi(s1,s2,n); ntre literele mari i cele mici.
strchr(s,c); Returneaz un pointer la prima apariie
a caracterului c n irul s. Cnd
15
caracterul nu este gsit, se returneaz
NULL.
strrchr(s,c); Returneaz un pointer la ultima
apariie a caracterului c n irul s. Cnd
16
caracterul nu este gsit, se returneaz
NULL.
strstr(s1,s2); Returneaz un pointer la prima apariie
17 a irului s2 n irul s1. Cnd irul s2 nu
este gsit, se returneaz NULL.
#include<conio.h>
#include<stdio.h>
#include<string.h>
void main()
{
char s1[30],s2[30];
int i;
48
printf("Introdu sirul s1: ");
gets(s1);
printf("Introdu sirul s2: ");
gets(s2);
printf("\n\nUtilizez strlen()");
i=strlen(s1);
printf("\nLungimea sirului s1=%d",i);
printf("\n\nUtilizez strupr()");
printf("\nLtere mici in mari s1= ");
strupr(s1);
puts(s1);
printf("\n\nUtilizez strlwr()");
printf("\nLitere mari in mici s2= ");
strlwr(s2);
puts(s2);
printf("\n\nUtilizez strcmp()");
if(strcmp(s1,s2)==0)
{
printf("Sirurile s1=S2");
}
else
{
printf("Sirurile s1 nu sunt egale S2\n");
}
printf("\n\nUtilizez strnset()");
strnset(s2,'*',3);
printf("s2=");
puts(s2);
getch();}
49
Rezultatul execuiei:
50
3 Este dat masivul unidimensional K[n]. S se afle Utiliznd:
elementele divizibile la 6 mai mari dect 16 de pe -strlwr
poziii impare, valoarea ridicat la ptrat a crora
este mai mic dect 200.
4 Este dat masivul unidimensional F[n]. S se Utiliznd:
determine poziiile i valorile primelor 3 elemente -strrev
negative
5 Este dat masivul unidimensional K[n]. S se Utiliznd:
creeze masivele unidimensionale L i M. Masivul -strcat
L va conine elemente de pe poziiile pare ale
masivului K, iar masivul M elemente de pe
poziiile impare ale masivului K.
6 Sunt date dou masive unidimensionale Q[n] i R[n]. Utiliznd:
S se calculeze K=es1+s2 / K1 * K 2 , unde S1 i K1 -strlen
sunt suma i cantitatea elementelor pare negative
din masivul Q, iar S2 i K2 - suma i cantitatea
elementelor impare pozitive din masivul R.
7 Este dat masivul unidimensional Y[n]. S se Utiliznd:
calculeze suma rdcinilor ptrate ale elementelor -strcmp
impare.
8 Este dat masivul unidimensional D[n]. S se Utiliznd:
determine valorile i poziiile ultimelor dou -strncmp
elemente pare i a ultimelor 3 impare.
9 Este dat masivul unidimensional F[n]. S se Utiliznd:
determine poziiile i valorile primelor 3 i -strncpy
ultimelor 4 elemente negative.
10 Sunt date dou masive unidimensionale F[n] i Utiliznd:
G[n]. S se calculeze valoarea expresiei T= eS/K -strncat
+(S*K), unde: S este suma elementelor pare de pe
poziii impare din masivul F, iar K cantitatea
elementelor de pe poziii impare din masivul G.
11 Este dat masivul unidimensional P[n]. S se Utiliznd:
determine valoarea i poziia primului element -strnset
pozitiv i a ultimului element negativ din masiv.
51
12 Este dat masivul unidimensional Q[n]. S se afle Utiliznd:
valoarea i poziia elementului cu valoarea -strset
maximal printre elementele impare.
13 Este dat masivul unidimensional R[n]. S se Utiliznd:
creeze masivele unidimensionale T i U. Masivul -strcimp
T va conine elementele cu poziii pare mai mare
dect 4 din masivul R, iar masivul U - elementele
cu poziii impare mai mici dect 4.
14 Sunt date dou masive unidimensionale X[n] i Utiliznd:
Y[n]. S se calculeze S=cos(P+M) - P * M , -strnicmp
unde: P este produsul elementelor impare din
masivul X, iar M - media aritmetic a elementelor
impare din masivul Y.
15 Este dat masivul unidimensional M[n]. S se Utiliznd:
determine poziia i valoarea ultimului element -strnset
impar divizibil la 3 din masiv i s se compare cu
elementul M[3].
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
#include <string.h>
void main()
{int Key,n,vi=0,v[100];
printf("Introdu lungimea vectorului:");
scanf("%d",&n);
for(int i=0; i<n; i++)
{
printf("Introdu elementul v[%d]=",i);
scanf("%d",&v[i]);
}
52
for(;;) //for infinit
{clrscr();
printf("1|Utilizind vector de tip int\n");
printf("2|Utilizind vector de tin char\n");
printf("0|Iesire\n");
printf(" Enter Key: ");
scanf("%d",&Key);
switch(Key)
{
case 1:
{// utilizm vector de tip int
int min=v[0],z=0;
printf("\nVectorul initial: ");
for(int i=0; i<n; i++)
{
printf("%d ",v[i]);
if((fmod(v[i],2)==0)&&(v[i]<min))
{
min=v[i]; z=i;
}
}
printf("\n El. Min. par v[%d]=%d",z,min);
getch(); break;
}
case 2:
{ // utilizm vector de tip caracter
char s1[100],s2[100];
printf("Introduceti fraza:"); gets(s1);
printf("Introduceti fraza:"); gets(s2);
if(strcmp(s1,s2)==0)
{printf("\nSirurile sunt egale\n");}
else
{printf("\nSirurile nu sunt egale\n");}
getch();break;
}
case 0: {exit(0);break;}}}}
53
Rezultatul execuiei:
54
Lucrarea de laborator nr.5
Tablouri bidimensionale (matrici)
1. Scopul
Studierea i utilizarea instruciunilor de baz ale limbajului
pentru prelucrarea i modificarea masivelor bidimensionale.
2. Descrierea temei
2.1. Declarea tablourilor
Exemple:
int Q[20][20]; //declararea matricei Q de maximum 20 linii
i 20 coloane de elemente ntregi.
float a,r,vec[30][20]; //declararea variabilelor simple a, r i
a matricei vec de maximum 30 linii i 20 coloane de elemente
reale.
55
char tab[5][5]; //declararea matricei tab de 5 linii i 5
coloane de elemente caracteriale.
Pentru a identifica un element al unei astfel de matrice
trebuie s specificm doi indici: primul reprezint linia, iar al
doilea reprezint coloana.
De exemplu, un tablou bidimensional b[2][2] poate fi
declarat i iniializat prin instruciunea:
int b[2][2] = { {1,2}, {3,4} };
Dac nu sunt suficiente valori pentru o linie, elementele care
rmn sunt iniializate cu valoarea 0. Aadar, declaraia va arta n
felul urmtor:
int b[2][2] = { {1}, {3,4} };
n limbajul de programare C/C++ indicii de linie i de
coloan pornesc de la 0, de aceea o matrice cu i rnduri i j
coloane va fi reprezentat n felul urmtor:
q 00 q 01 q 02 ... q 0, j 1
q 10 q 11 q 12 ... q 1, j 1 Q i j
Q=
............................
q i 1, 0 q i 1,1 q i 1, 2 . . . q i 1, j 1
56
Exemplu: S se scrie un program ce va introduce i afia o
matrice de m linii i n coloane:
#include <conio.h>
#include <stdio.h>
void main()
{ int A[10][10];
int nr_lin, nr_col;
printf("Nr.linii:"); scanf("%d",&nr_lin);
printf("Nr.coloane:"); scanf("%d",&nr_col);
//citirea elementelor unei matrice
for(int i=0; i<nr_lin; i++)
{for(int j=0; j<nr_col; j++)
{ printf("A[%d][%d]=",i,j);
scanf("%d",&A[i][j]);}
} clrscr();
//afisarea elementelor matricei
printf("\nAfisam matricea:\n");
for(int i=0; i<nr_lin; i++)
{for(int j=0; j<nr_col; j++)
{ printf("%3d",A[i][j]);}
printf("\n");
}
getch();}
Rezultatul execuiei:
57
n urma execuiei acestui program vom obine o matrice de
elemente ntregi, fiecare avnd o poziie pe rnd i alta pe coloan.
#include <conio.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
void main()
{
int A[10][10],lin,col,s=0,i_1,i_2,j_1,j_2,
aux,min,max;
randomize();
printf("Nr. linii:"); scanf("%d",&lin);
printf("Nr. coloane:"); scanf("%d",&col);
58
//citirea aleator a elementelor matrice
for (int i=0; i<lin; i++)
{for (int j=0; j<col; j++)
{
A[i][j]=random(20)-9;
}}
//afisarea elementelor matricei
printf("\nAfisam matricea:\n");
for (int i=0; i<lin; i++)
{for (int j=0; j<col; j++)
{printf("%3d",A[i][j]);}
printf("\n");
}
// Suma elementelor de pe diag. princip
for (int i=0; i<lin; i++)
{for (int j=0; j<col; j++)
{
if(i=j){s+=A[i][j];}
}
}
printf("\nSuma=%d",s);
//elementul min si max impar
max=min=A[0][0];
for (int j=0; j<col; j++)
{
if(min>A[2-1][j])
{min=A[2-1][j];}
if(max<A[2-1][j])
{max=A[2-1][j];}
}
printf("\nElem min=%d si max=%d",min,max);
getch();}
59
Rezultatul execuiei:
60
a) Schimbai cu locul elementele penultimului rnd cu
elementele rndului indicat de utilizator;
5 b) S se calculeze cantitatea elementelor pozitive din H[n,m]
ultimele trei rnduri ale masivului.
a) Aranjai cresctor elementele fiecrei coloane;
6 b) S se calculeze media aritmetic a elementelor din T[n,m]
primul i ultimul rnd.
a) Schimbi cu locul elementele ariei II cu
7 elementele ariei III; E[n,m]
b) S se compare cantitatea elementelor impare din
ultimul rnd cu valoarea elementului E[1][1].
a) Schimbai cu locul elementul maximal al rndului
8 1 cu elementul minimal al coloanei n; W[n,m]
b) S se calculeze suma i cantitatea elementelor
negative mai sus de rndul patru.
a) Schimbai cu locul elementele coloanei 2 cu
9 elementele coloanei indicate de utilizator; G[n,m]
b) S se compare produsul elementelor coloanei doi
cu valoarea elementului G[3][3].
a) Aranjai descresctor elementele fiecrui rnd;
10 b) S se calculeze cantitatea i suma elementelor cu K[n,m]
poziii pare din ultimele trei rnduri.
a) Schimbai cu locul elementele ariei III cu
11 elementele ariei IV; C[n,m]
b) S se calculeze diferena dintre suma elementelor
primului rnd i suma elementelor rndului doi.
a) Schimbai cu locul elementul minimal al ultimei
coloane cu elementul maximal din rndul indicat
12 de utilizator; Y[n,m]
b) S se calculeze media aritmetic a elementelor
negative impare de pe diagonala secundar.
a) Schimbai cu locul elementele coloanei cu
elementele rndului indicate de utilizator;
13 L[n,m]
b) S se afle poziia i valoarea elementul maximal
din coloana indicat de utilizator.
61
a) Aranjai n ordine descresctoare elementele
coloanelor matricei
14 R[n,m]
b) S se calculeze media aritmetic a elementelor
negative din coloana indicat de utilizator.
a) S se schimbe elementele pozitive ale ariei II cu
elementele pozitive ale ariei IV;
15 b) S se calculeze diferena dintre produsul P[n,m]
elementelor pozitive ale masivului i media
aritmetic a elementelor din rndul patru.
62
Lucrarea de laborator nr.6
Funcii n C/C++
1. Scopul
nsuirea utilizrii subprogramelor (funciilor).
2. Descrierea temei
unde:
tip_returnat - reprezint tipul rezultatului calculat i
returnat de funcie i poate fi: int, char, char*, long, float, void
etc. n cazul n care tipul rezultatului este diferit de void, corpul
funciei trebuie s conin cel puin o instruciune return.
Instruciunea return va specifica valoarea calculat i returnat de
funcie, care trebuie s fie de acelai tip ca i tip_returnat.
nume_funcie - reprezint numele dat funciei de ctre cel ce
o definete, pentru a o putea apela.
Lista_parametrilor_formali - reprezint o list de declaraii
de variabile separate prin virgul. Aceast list poate s fie i vid.
Instruciune - este o instruciune simpl sau compus.
63
2.1. Apelul funciei
#include<conio.h>
#include<stdio.h>
void f1()
{
printf("Am executat corpul functiei f1()");
}
void main()
{
clrscr();
printf("Execut functia main()\n");
f1();// apelm funcia prin numele ei
getch();
}
Rezultatul execuiei:
#include<conio.h>
#include<stdio.h>
int f_suma(int a,int b)
{
int c=a+b; return(c);//return(a+b);
}
65
void main()
{
int x,y,z;
clrscr();
printf("Execut functia main()");
printf("\nx=");
scanf("%d",&x);
printf("y=");
scanf("%d",&y);
z=f_suma(7,-45);//apelm funcia f_suma
printf("\nSuma 7+(-45)=%d",z);
z=f_suma(x,7); //apelm funcia f_suma
printf("\nSuma x+7=%d",z);
z=f_suma(x,y); //apelm funcia f_suma
printf("\nSuma x+y=%d",z);
getch();}
#include<conio.h>
#include<stdio.h>
int f_control(int,int);//prototipul funciei
void main()
{int x,y,z;
clrscr();
printf("Execut functia main()");
printf("\nx="); scanf("%d",&x);
printf("y="); scanf("%d",&y);
z=f_control(9,-7);
printf("\n max=%d",z);
z=f_control(4,x);
printf("\n max=%d",z);
printf("\n max=%d",f_control(x,y));
getch();}
int f_control(int a,int b)
{
if(a>b) {return(a);}
if(a<b) {return(b);}
}
67
2.3. Transmiterea tablourilor unei funcii
#include<conio.h>
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
void Add(int V[50],int n)
{
for(int i=0;i<n;i++)
{V[i]=random(20)-7;}
}
void Afis(int V[50],int n)
{
for(int i=0;i<n;i++)
{printf("%3d",V[i]);}
}
int Suma1(int V[50],int n)
{ int suma=0;
for(int i=0;i<n/2;i++)
{
if((fmod(V[i],2)==0)&&(V[i]<0))
{suma+=V[i];}
}
return(suma);
}
68
int Suma2(int V[50],int n)
{
int suma=0;
for(int i=0;i<n;i++)
{
if((fmod(V[i],3)==0)&&(fmod(i,2)!=0))
{suma+=V[i];}
}
return(suma);
}
void main()
{
int S1,S2,n1,n2,T[50],D[50],M;
randomize();
printf("Introdu lungimea vectorului T:");
scanf("%d",&n1);
Add(T,n1);
printf("Introdu lungimea vectorului D:");
scanf("%d",&n2);
Add(D,n2); clrscr();
printf("T="); Afis(T,n1);
printf("\nD="); Afis(D,n2);
S1=Suma1(T,n1); S2=Suma2(T,n2);
M=S1+S2+6;
printf("\nM=%d",M); getch();}
Rezultatul execuiei:
69
Exemplu: S se scrie un program ce va afia elementele de
pe diagonala principal a matricei A[n][n]:
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>
void addmatrix(int z[50][50], int k)
{
for(int i=0;i<k;i++)
{
for(int j=0;j<k;j++)
{
z[i][j]=random(20)-9;
}
}
}
void showmatrix(int z[50][50], int k)
{
for(int i=0;i<k;i++)
{
for(int j=0;j<k;j++)
{
printf("%3d ",z[i][j]);
}
printf("\n");
}}
void showdiag(int z[50][50], int k)
{
for(int i=0;i<k;i++)
{
for(int j=0;j<k;j++)
{
if(i==j)
{printf("\nElem[%d][%d]=%d",i,j,z[i][j]);}
}
}}
70
void main (void)
{
int x[50][50],n;
clrscr();
printf("\nCulege marimea masivului: ");
scanf("%d",&n);
addmatrix(x,n); showmatrix(x,n);
printf("\nElem. diag. principale:\n");
showdiag(x,n);
getch();
}
Rezultatul execuiei:
71
a) Aranjai n ordine cresctoare elementele fiecrui
A[n,m]
rnd;
2
b) S se afle cantitatea elementelor divizibile la 9 din
T[n,m]
rndul indicat de utilizator.
a) Schimbai cu locul elementele pozitive ale ariei I B[n,m]
3 cu elementele pozitive ale ariei IV;
b) S se calculeze suma i produsul elementelor L[n,m]
pozitive impare din coloana indicat de utilizator.
a) Schimbai cu locul elementul maximal cu cel F[n,m]
4 minimal al masivului;
b) S se calculeze suma i cantitatea elementelor U[n,m]
pare din prima i ultima coloan.
a) Schimbai cu locul elementele penultimului rnd cu H[n,m]
5 elementele rndului indicat de utilizator;
b) S se calculeze cantitatea elementelor pozitive din W[n,m]
ultimele trei rnduri ale masivului.
a) Aranjai n ordine cresctoare elementele fiecrei
coloane; T[n,m]
6 b) S se calculeze media aritmetic a elementelor din Q[n,m]
prima i ultima coloan.
a) Schimbi cu locul elementele ariei IV cu E[n,m]
7 elementele ariei III;
b) S se compare cantitatea elementelor pare din A[n,m]
ultimul rnd cu valoarea elementului E[3][1].
a) Schimbai cu locul elementul maximal al rndului
W[n,m]
n - 1 cu elementul minimal al coloanei n;
8
b) S se calculeze suma i cantitatea elementelor
Z[n,m]
negative mai sus de rndul patru.
a) Schimbai cu locul elementele coloanei 3 cu
G[n,m]
elementele coloanei indicate de utilizator;
9
b) S se compare produsul elementelor coloanei doi
O[n,m]
cu valoarea elementului G[3][3].
a) Aranjai n ordine descresctoare elementele
fiecrui rnd; K[n,m]
10
b) S se calculeze cantitatea i suma elementelor cu P[n,m]
poziii pare din ultimele trei rnduri.
72
a) Schimbai cu locul elementele ariei III cu C[n,m]
11 elementele ariei IV;
b) S se calculeze diferena dintre suma elementelor I[n,m]
primului rnd i suma elementelor rndului doi.
a) Schimbai cu locul elementul minimal al ultimei
coloane cu elementul maximal din rndul indicat Y[n,m]
12 de utilizator;
b) S se calculeze media aritmetic a elementelor
negative impare de pe diagonala secundar i s D[n,m]
se compare cu elementul Y[3][4].
a) Schimbai cu locul elementele coloanei cu
elementele rndului indicate de utilizator; L[n,m]
13 b) S se afle poziia i valoarea elementul maximal
J[n,m]
din coloana indicat de utilizator.
a) Aranjai n ordine descresctoare elementele
R[n,m]
coloanelor matricei
14
b) S se calculaeze media aritmetic a elementelor
A[n,m]
negative din coloana indicat de utilizator.
a) S se schimbe elementele pozitive ale ariei II cu
elementele pozitive ale ariei IV; P[n,m]
15 b) S se calculeze diferena dintre produsul
elementelor pozitive ale masivului i media H[n,m]
aritmetic a elementelor din rndul patru.
73
Lucrarea de laborator nr.7
Pointeri n C/C++
1. Scopul
Studierea i utilizarea tipului de date pointer.
2. Descrierea temei
2.1. Declarea pointerilor
tip *nume_pointer;
#include <stdio.h>
#include <conio.h>
void main (void)
{
int a=3,*q;
float b=1.7,*w;
q=&a; w=&b;
printf ("%f se afla pe adresa %d \n",b,w);
printf ("%d se afla pe adresa %d \n",a,q);
getch();
}
Rezultatul execuiei:
75
n exemplul reprezentat mai sus sunt declarate dou variabile
simple a=3 de tip ntreg i b=1.7 de tip real, precum i doi
indicatori (pointeri) q i w. Aceti doi pointeri pot lua ca valori
numai adrese ctre variabile de aceleai tipuri ca i tipul lor. La
declararea q=&a i w=&b, indicatorul q va lua ca valoare adresa
variabilei a, iar w va lua ca valoare adresa variabilei b.
#include <stdio.h>
#include <conio.h>
void main (void)
{
int a=3,*q; float b=1.7,*w; q=&a; w=&b;
printf ("%f se afla pe adresa %d \n",b,w);
printf ("%d se afla pe adresa %d \n",a,q);
*q=-9;
*w=3.2;
printf ("%f se afla pe adresa %d\n",*w,w);
printf ("%d se afla pe adresa %d\n",*q,q);
getch();
}
Rezultatul execuiei:
76
Prioritatea folosirii indicatorului const n faptul c el poate
fi accesat n dou moduri: q i *q. Asteriscul * n acest caz denot
c se apeleaz la coninutul celulei de memorie, adresa creia este
valoarea indicatorului.
Variabila q poate lua numai valori n form de adres q=&a
i atribuirea de forma q=1234 este incorect, deoarece aici se
ncearc atribuirea unei valori ntregi unui indicator i nu a adresei.
Variabila *q poate lua valori de tip ntreg. De exemplu:
*q=-9 se descifreaz n felul urmtor: de amplasat valoarea
ntreag -9 n celula de memorie ce are adres indicat n
variabila q. Deoarece variabila q indic celula cu adresa 101,
valoarea variabilei ce-i pstreaz valoarea n celula de memorie
cu aceast adres va fi egal cu -9.
#include <stdio.h>
#include <math.h>
#include <conio.h>
void add(int *p, int n)
{int k;
for(int i=0;i<n;i++)
{
printf("Element %d=",i);
scanf("%d",&k);*(p+i)=k;
}
}
void afis(int *p, int n)
{
for(int i=0;i<n;i++)
{
printf("%3d",*(p+i));
}
}
int suma(int *p, int n)
{ int s=0;
for(int i=0;i<n;i++)
{
if((fmod(*(p+i),2)==0)&&(fmod(i,2)!=0))
{
s=s+(*(p+i));
}
}
return(s);
}
void main()
{ int v[100],k,sum;
printf("Introdu lungimea vectorului:");
scanf("%d",&k);
78
add(v,k);
afis(v,k);
sum=suma(v,k);
printf("\nSuma=%d",sum);
getch();}
Rezultatul execuiei:
79
Fig. 4. Apelarea tabloului cu ajutorul indicatorului
Exemplu: S se scrie un program ce va calcula numrul de
vocale dintr-un ir de caractere introdus de la tastatur:
#include <stdio.h>
#include <conio.h>
#include <string.h>
int conditie(char *p, int n)
{
int s=0;
for(int i=0;i<n;i++)
{
if((*(p+i)=='a')||(*(p+i)=='e')||(*(p+i)==
'i')||(*(p+i)=='o')||(*(p+i)=='u'))
{
s++;
}
}
return(s);
}
void main()
{ char v[100];int k;
printf("Introdu fraza:");
gets(v);
puts(v);
strlwr(v);
puts(v);
k=strlen(v);
80
printf("\nVocale=%d",conditie(v,k));
getch();}
Rezultatul execuiei:
81
Sunt permise operaii adunare sau scdere ntre un pointer
de obiecte i un ntreg. Astfel, dac p este un pointer ctre tipul tip
(tip p;), iar n este un ntreg, expresiile p + n i p n au ca
valoare, valoarea lui p la care se adaug, respectiv, se scade n
sizeof(tip).
Un caz particular al adunrii sau scderii dintre un pointer de
date i un ntreg (n=1) l reprezint incrementarea i decrementarea
unui pointer de date. n expresiile p++, respectiv p- -, valoarea
variabilei p devine p+sizeof(tip), respectiv, p-sizeof(tip).
Este permis scderea a doi pointeri de obiecte de acelai
tip, rezultatul fiind o valoare ntreag care reprezint diferena de
adrese divizat prin dimensiunea tipului de baz.
82
6 Este dat masivul unidimensional V[n]. S se gseasc
elementele divizibile la 4 i nedivizibile la 3 i s se
nlocuiasc cu produsul tuturor elementelor impare pozitive
din masiv.
7 Sunt date dou masive unidimensionale X[n] i Y[n]. S se
creeze un nou masiv Z(n) astfel, nct
Zi = x 2i -(xi +5) +yi -(yi +3);
8 Este dat masivul unidimensional E[n]. Aflai media
aritmetic dintre suma elementelor cu poziii pare din prima
jumtate a masivului i suma elementelor cu poziii pare din
a doua jumtate a masivului.
9 Este dat masivul unidimensional A[n]. Aranjai pe primele
locuri ale masivului elementele negative, apoi cele
pozitive.
10 Este dat masivul unidimensional U[n]. Aranjai pe primele
locuri ale masivului elementele nedivizibile, apoi cele
divizibile.
11 Este dat masivul unidimensional P[n]. Schimbai cu locul
elementele primei jumti a masivului cu elementele
jumtii a doua.
12 Este dat masivul unidimensional Q[n]. S se afle valoarea i
poziia elementului cu valoarea maximal printre elementele
impare i s se compare cu elementul Q[7].
13 Sunt date dou masive unidimensionale F[n] i K[n]. Creai
un masiv nou Z(n) astfel, nct Z1=F1+Kn ;
Z2 =F2 +Kn-1 ; Zn =Fn +K1 ;
14 Este dat masivul unidimensional L[n]. Aranjai n ordine
cresctoare elementele primei jumti i descresctoare
elementele jumtii a doua.
15 Este dat masivul unidimensional O[n]. S se determine
adresa i valoarea ultimilor 4 elemente impare divizibile la 3
i nedivizibile la 7 din masiv i s se compare cu elementul
indicat de ctre utilizator.
83
Exemplu: S se scrie un program ce va utiliza funcii
pointeri i vectori, ce va avea ca efect calculul valorii i poziiei
elementului minimal printer elementele pare:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <conio.h>
void add(int *p, int n)
{int k;
for(int i=0;i<n;i++)
{
printf("Element %d=",i);
scanf("%d",&k);*(p+i)=k;
}
}
void afis(int *p, int n)
{
for(int i=0;i<n;i++)
{
printf("%3d",*(p+i));
}
}
void min(int *p, int n)
{
int min=*p,z=0;
for(int i=0;i<n;i++)
{
if((fmod(*(p+i),2)==0)&&(*(p+i)<min))
{
min=*(p+i);
z=i;
}
}
Printf("\n Elementul minimal par v[%d]= %d",
z,min);}
84
void main()
{
int v[100],k;
printf("Introdu lungimea vectorului:");
scanf(%d,&k);
add(v,k);
afis(v,k);
min(v,k);
getch();
}
Rezultatul execuiei:
85
Bibliografie
86
PROGRAMARE
Indicaii de laborator
Partea I
Autori: V. Derevlenco
I. Ichim
L. Bodean
87
88