Sunteți pe pagina 1din 88

Digitally signed by

Library TUM
Reason: I attest to the
accuracy and integrity
of this document
UNIVERSITATEA TEHNIC A MOLDOVEI

Facultatea Inginerie i Management n Electronic i


Telecomunicaii
Catedra Sisteme i Dispozitive Electronice

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.

Elaborare: lect. univ. Vasile DEREVLENCO


lect. univ. Ion ICHIM
asistent univ. Ludmila BODEAN

Recenzent: d..t., conf. univ. Pavel NISTIRIUC

U.T.M., 2014
2
CUPRINS

Introducere.4

Lucrarea de laborator nr.1..5

Lucrarea de laborator nr.221

Lucrarea de laborator nr.333

Lucrarea de laborator nr.442

Lucrarea de laborator nr.555

Lucrarea de laborator nr.663

Lucrarea de laborator nr.774

Bibliografie ..86

3
INTRODUCERE

Un limbaj de programare este un limbaj intermediar, ntre om


i main, care i permite omului s dea instruciuni calculatorului.
Programe specializate traduc instruciunile date de om n cod
main, pe care calculatorul l poate nelege.
Un limbaj de programare este, de cele mai multe ori, un set
de reguli binedefinit care (folosind cuvinte din limba englez,
paranteze, acolade, semne de punctuaie etc.) permite omului s
creeze programe de calculator. n prezent, exist o varietate de
limbaje de programare, C/C++ fiind unul dintre cele mai populare
limbaje folosit n industrie pe scar larg pentru realizarea
programelor de calculator, sistemelor de operare, jocurilor video,
chiar i pentru programarea microcontrolerelor (folosite n
produsele electronice/electrocasnice, utilaje computerizate, roboi
etc.).
ndrumarul insereaz lucrrile de laborator pe care studenii
trebuie s le efectueze la disciplina Programare. Pentru fiecare
lucrare de laborator este indicat tema, scopul lucrrii, descrierea
temei, precum i variantele propuse spre elaborare.
n perioada efecturii lucrrilor de laborator studentul
compileaz i execut programele corespunztoare problemelor
indicate de ctre profesor n conformitate cu ndrumarul de
laborator, efectueaz analiza datelor de intrare i a rezultatelor
obinute, colecteaz datele pentru darea de seam a lucrrii.
Lucrarea de laborator se consider executat dup ce
studentul demonstreaz profesorului funcionarea corect a
programelor la calculator.
Pentru fiecare lucrare studentul pregtete darea de seam pe
care o susine n faa profesorului.
Darea de seam pentru fiecare lucrare de laborator include:
foaia de titlu, tema, scopul lucrrii, descrierea temei (inclusiv
relatarea desfurat a instruciunilor principale folosite n codul
surs al programului), coninutul problemei, listingul programului,
rezultatul i concluziile.
4
Lucrarea de laborator nr.1
Programe liniare

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

Limbajul C este un limbaj structural flexibil, portabil i


prietenos. Instruciunile care compun programele de calcul sunt
traduse n cod main prin intermediul unui program denumit
compilator.
Un program C este alctuit din una sau mai multe funcii,
singura funcie care trebuie neaprat s existe este funcia main.
Cu ajutorul acestei funcii ncepe execuia programului. Atunci
cnd programul este lansat, el execut instruciunile din funcia
main, ncepnd cu prima instruciune care urmeaz dup paranteza
acolad deschis (caracterul { ). Toate instruciunile se termin cu
caracterul ; (punct i virgul). Limbajul C nu recunoate sfritul
de linie ca terminator. Execuia programului se termin cnd este
ntlnit paranteza acolad nchis (caracterul } ).
Programul C este alctuit din patru module, menionate mai
jos:
Directive de preprocesare prin care se nelege
prelucrarea unuia sau a mai multor fiiere surs nainte de a fi
supus compilrii. n urma acestei activiti se creeaz un fiier
temporar care conine un cod surs provenit n urma traducerii
directivelor de preprocesare. Preprocesorul C este (n principiu) un
program separat, invocat de ctre compilator n prima parte a
procesului de compilare. Preprocesorul C manipuleaz directivele
5
pentru includerea fiierelor surs (n construcii de forma
#include), a macrodefiniiilor (n construcii de forma #define) i a
includerilor condiionate (n construcii de forma #if).Directivele
de preprocesare sunt de trei feluri: includeri de fiiere surs,
macrosubstituii i includeri condiionate.
Includeri de fiiere cu text surs - se fac cu directiva
#include printr-o construcie de forma:

#include <nume_fisier.h>
sau:
#include"nume_fisier.c"

unde nume_fisier definete un fiier cu text surs pstrat pe disc. n


faza de preprocesare textul fiierului inclus se substituie
construciei #include, apoi ia parte la compilare mpreun cu textul
fiierului n care a fost inclus. Construcia #include
<nume_fisier.h> se folosete pentru includerea fiierelor standard
care conin prototipuri pentru funciile de bibliotec (librrii).
Librriile sunt coduri gata compilate care se adaug programului
surs C la compilarea acestuia. Parantezele unghiulare instruiesc
compilatorul s caute fiierele care trebuie incluse n directorul cu
fiiere antet (de exemplu, C:\Program Files\Borland\CBuilder6
\Include).

Exemple:
#include <stdio.h>
#include <math.h>

Aceste construcii instruiesc preprocesorul s trateze fiierele


header ca i cum ar face parte din codul surs care se compileaz.
Nu toate librriile sunt incluse automat, deoarece acest lucru ar
conduce la coduri mari i timp de compilare mrit, cu pri de
program inutile. Fiierele header care specific librriile ce se
includ ntr-un program definesc macrouri, tipuri de date i date
externe, ce se folosesc mpreun cu librriile pe care le
desemneaz. Dac un anumit fiier header a fost inclus, atunci
6
numele funciilor, macrourilor sau tipurilor de date definite n acel
fiier nu pot fi redefinite n programul surs. Astfel, de exemplu,
poate fi definit o funcie cos(x) ntr-un program numai dac n
acel program nu a fost inclus librria math.h n care este deja
definit funcia cos.
Construcia #include"nume_fisier.c" se utilizeaz la
includerea fiierelor nestandard care conin prototipuri ale
eventualelor funcii definite de ctre utilizator. Fiierul care trebuie
inclus se caut n directorul curent, dac nu este specificat nici o
cale.
Exemple:
# include "factorial.c"
# include "C:\Program Files\Borland\CBuilder6\Lib\pers.c"

Macrosubstituiri - nseamn substituirea unor nume prin


succesiuni de caractere i se fac cu directiva #define sub forma:
#define succesiune_de_caractere. Macroprocesorul poate efectua
i substituii de argumente n macrodefiniii.

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)

Includeri condiionate - aceste includeri se folosesc pentru


includerea unor fiiere numai atunci cnd este ndeplinit o
anumit condiie.

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*/

Textul controlat va fi inclus numai dac este definit


macrocomanda MACRO i acest text poate include directive de
preprocesare.

Celelalte pri ale unui program C sunt:


Seciunea de declaraii - n aceast seciune se stabilesc
numele i atributele variabilelor, a tipurilor de date utilizator sau
ale funciilor.
Funcia principal
Funciile utilizator

n concluzie, un program C are urmtoarea structur:

Fig.1. Structura general a programului C


8
Exemplu: S se scrie un program ce va afia pe ecran
mesajul Primul meu exemplu in C:

#include <stdio.h>
#include <conio.h>
void main()
{
clrscr();
printf(Primul meu exemplu in C );
getch();
}

Rezultatul execuiei:

Dup programul este compilat i rulat, pe monitor va


aprea o fereastr cu mesajul Primul meu exemplu in C.
Directiva include determin procesorul s includ copie a
fiierului stdio.h i a fiierului conio.h n acest punct al codului.
Fiierul stdio.h este introdus pentru funcia standard printf, iar
fiierul conio.h este introdus pentru funciile standard clrscr i
getch.
Fiecare program C are funcie numit main de unde ncepe
execuia programului. Parantezele rotunde (caracterele (, respectiv
) ) indic faptul c aceasta este o funcie, iar acoladele (caracterele
{, respectiv } ), ce urmeaz dup parantezele rotunde, arat c
aceasta este un corp de funcie.
9
Linia de cod printf(Primul meu exemplu in C ) este o
funcie din biblioteca stdio.h care are ca scop tiprirea la ecran a
unei secvene alctuite din caractere cuprinse ntre dou ghilimele
... , pe care le vom numi ir de caractere sau constant ir.
Funcia standard clrscr este funcie care terge informaia afiat
pe ecran, iar getch s-a introdus pentru a ne menine rezultatul la
monitor pn nu se va tasta o tast.

2.2. Tipuri de date n C

Tipurile de date descriu tipurile valorilor diverselor variabile,


constante, funcii etc. ale unui program. Fiecare variabil folosit
ntr-un program reprezint o locaie de memorie creia i s-a
atribuit un nume i care poate conine diferite valori. Orice
variabil trebuie s fie declarat nainte de a fi folosit. O
declaraie specific un tip i este urmat de o list, de una sau mai
multe variabile de acel tip. Variabilele pot fi iniializate n
momentul declaraiei lor. Dac numele este urmat de semnul egal
i de o constant, acesta servete la iniializare, aa cum este dat n
exemplul de mai jos:

int zi, luna, an;


zi = 29;
luna = 2;
an = 2000; //variabile de tip ntreg cu valori diferite
float medie;
medie = 6.9; //variabil de tip real

Orice tip de variabil i constant posed un tip, care


determin dimensiunea spaiului necesar memorrii lor. Tipurile
datelor se pot divide n dou categorii: tipuri fundamentale i
tipuri derivate sau structurate. Tipurile fundamentale sunt
tipurile predefinite, iar n limbajul C acestea sunt (tabelul 1):

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

n plus, exist civa calificatori care pot fi aplicai acestor


tipuri de baz: unsigned, short i long. Short i long care
furnizeaz diferite lungimi ale locaiilor de memorie pentru datele
de tip int. Calificatorul short nseamn de regul ntregi
reprezentai pe 16 bii, iar long ntregi reprezentai pe minim 32 de
bii. Calificatorii signed sau unsigned pot fi aplicai tipului ntreg.
Numerele unsigned sunt ntotdeauna pozitive sau zero. Dac
datele de tip int sunt reprezentate pe 16 bii, variabilele unsigned
int vor avea valori ntre 0 i 65535. Pentru datele de tip real, long
double specific extinderea preciziei numerelor reprezentate n
virgul flotant pe 10 octei (80 bii). n funcie de valoarea
constantei, compilatorul aloc pentru reprezentarea ei n calculator
unu, doi, patru, opt sau zece octei de memorie. Pentru valorile -
3276832767 se aloc doi octei, unde primul bit se interpreteaz
ca semnul constantei, iar 15 bii rmai definesc valoarea ei.
Pentru valorile 065535 se aloc doi octei de memorie, ns toi
16 bii definesc valoarea constantei.
Fiecarui tip de date de baz i corespunde un specificator de
tip. Specificatorii de tip definesc formatele datelor, care se citesc
sau se scriu i se compun din caracterul % urmat de una sau dou
litere ce depind de tipul datei (tab. 2).

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

Exemplu: S se scrie un program n limbajul de programare


C, ce va utiliza tipurile de date studiate:

#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;

printf("int1== %d \n" ,int1);


printf("int2== %#x \n" ,int2);
printf("long1== %ld \n" ,long1);
printf("long2== %ld \n" ,long2);
printf("float1== %f \n" ,float1);
printf("PI== %f \n" , PI);
printf("float2== %E \n" ,float2);
printf("char1== %c \n" ,char1);
printf("char2== %d \n" ,char2);
printf("char3== %c \n" ,char3);
printf("numele este== %s \n" , name);
getch();
}

Rezultatul execuiei:

13
2.3. Funciile de intrare/ieire n C

Limbajul de programare C conine o funcie (printf) ce


permite afiarea pe ecran a datelor de orice tip i poate prelucra o
list din civa parametri. Sintaxa funciei printf este urmtoarea:

printf(ir cu format,exp1,exp2, ...);

ce are ca efect afiarea valorii expresiilor exp1, exp2,...


conform unui anumit format specificat prin ir cu format. irul cu
format se delimiteaz cu ghilimele i indic compilatorului n ce
poziie din ir trebuie s apar datele. Acest ir poate conine orice
text mpreun cu anume etichete numite indicatori de format, care
determin tipul datelor i amplasarea lor. Orice indicator de format
ncepe cu caracterul procent (%), dup care urmeaz un caracter
ce indic tipul datelor. Lista indicatorilor de format corespunde cu
lista expresiilor. Specificatorii de format ai funciei printf sunt dai
n tabelul 3.

Tabelul 3. Specificatorii de format ai funciei printf ()


Nr. Cod Semnificaie
1 %c Afieaz o dat de tip caracter
2 %d Afieaz o dat de tip ntreg fr semn
3 %i Afieaz o dat de tip ntreg cu semn
4 %e Notaie tiinific; format cu exponent
5 %f Afieaz un numr flotant
6 %g Folosete pe cel mai scurt dintre %e i %f
7 %o Afieaz o dat de tip int n format octal fr semn
8 %s Afieaz un ir de caractere
9 %x Afieaz o dat de tip hexazecimal fr semn
10 %u Afieaz o dat de tip ntreg fr semn
11 %% Afieaz caracterul % (procent)

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.

Tabelul 4. Codurile backslash ale limbajului C


Nr. Cod Semnificaie
1 \b Caracter backspace
2 \f Caracter avans de pagin
3 \n Caracter linie nou
4 \r Carriage return (corespunde accesrii tastei ENTER)
5 \t Caracter tabulator orizontal (salt de 8 caractere)
6 \ Caracterul ghilimele
7 \ Caracterul apostrof
8 \0 Caracterul nul
9 \\ Caracterul backslash
10 \v Caracterul tabulator vertical
11 \a Caracterul de avertizare (sunet)
12 \N Octal constant (unde N este o constant octal)
13 \xN Hexayecimal constant (unde N este o constant hexa)

Cel mai utilizat cod de tip backslash n C este \n. Cnd


compilatorul C ntlnete acest cod, el l translateaz ntr-o
operaie de trecere la linie nou.
O alt funcie standard asemntoare cu funcia printf este
funcia scanf, care face posibil introducerea n calculator a datelor
de orice tip. Aceast funcie scaneaz tastatura, determin tastele
care au fost culese, apoi interpreteaz informaia culeas cu
ajutorul indicatorilor de format, ce se afl n componena funciei.
Forma general a funciei standard scanf este urmtoarea:
scanf(ir cu format, &v1, &v2, ...);

irul cu format conine indicatori de format numii


convertori de simboluri, ce determin modul n care trebuie s fie
15
interpretate datele introduse, iar &v1, &v2, ... reprezint lista
variabilelor n care vor fi pstrate valorile introduse.

Exemplu: S se scrie un program ce va utiliza funciile


printf(), scanf() i indicatorii de format:

#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

S se scrie un program ce va calcula valoarea expresiei


conform variantei:

Nr. Expresia matematic

1 sin(a 5 + b 5 ) 2 + y3
B= ; D= x y + ;
14 + a b (a 2 )
c

e cos(x + y)13 + cos(a 6 ) a b x3 8


X= ; T= ;
2 2 + sin(b 5 ) sin(123 * a)
tga10
x3 + y 2 c
3
b 2+b + c (a * b 2 sin( x))
V= ; I= ;
3 a b 3 + cos 2 (2a) cos(a ) + sin(b)
a + b +1
a 2 + sin 3 (b 2 )
x + y tgx 2 cos( x) + 10 y 2
4 a= ; M =
( y 9 + x 4 ) cos( x y ) (a y + 1) * 3
a * b2 x + y cos(12 y 2 )
5 F = ; s= ;
x cos( a + b ) + sin(1001 + a 2 )



(a b) + (b a )
3 2
(a b) 2 (sin 2 x 2 )
6 p= ; Z= ;
cos(a ) 1 + cos(128 + x)
sin(b )

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

Exemplu: S se scrie un program ce va calcula valoarea


expresiei Y= |a+b|+c2+ln(a)+tg(c):

#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:

4. ntrebri pentru verificarea cunotinelor

1. Explicai noiunea de compilator.


2. Prezentai structura general a programului C.
3. Explicai noiunea de bibliotec.
4. Prezentai i explicai structura unei funcii.
5. Prezentai tipurile fundamentale de date ale limbajului C.
6. Descriei funcia de ieire printf().
7. Descriei funcia de intrare scanf().
8. Descriei funcia getch().
9. Descriei funcia clrscr().
10. Enumerai specificatorii de format.
11. Enumerai codurile backslash ale limbajului C.

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

Instruciunea if permite programarea unei structuri de decizie


n care o condiie (rezultatul evalurii unei expresii) determin
executarea sau neexecutarea secvenei de instruciuni.
Sintaxa instruciunii if Schema bloc
if (expresie)
{
instruciuni;
}

Modul de funcionare: la nceput se calculeaz valoarea


expresiei din parantezele rotunde ale instruciuniei if. Dac
valoarea acesteia este ADEVR, atunci se vor executa toate
instruciunile cuprinse de parantezele ondulate({ }), pe care
ulterior le vom numi corp al funciei. n caz contrar se ignor
instruciunile din corpul lui if i se trece la urmtoarele rnduri de
cod.
Instruciunia if-else permite programarea unei structuri de
decizie n care o condiie determin executarea unei secvene de
21
program din dou alternative.
Sintaxa instruciunii Schema bloc
if-else

if (condiie)
{
Instruciune-1;
}
else
{
Instruciune-2;
}

Modul de funcionare: n primul rnd se calculeaz valoarea


expresiei din parantezele rotunde ale instruciunii if, dac valoarea
acesteia este ADEVR, atunci se vor executa toate instruciunile
din corpul lui if . n caz contrar se ignor instruciunile din corpul
lui if i se execut cele din corpul lui else.

Exemplu: S se scrie un program ce va utiliza instruciunile


if-else:

#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:

n practica programrii, din cnd n cnd apare necesitatea


alegerii unei operaiuni din mai multe posibile, pentru aceasta se
permite utilizarea lanului de instruciuni if-else-if sau
instruciunea switch(), pe care o vom examina ceva mai trziu.

Exemplu: S se scrie un program ce va utiliza lanul de


instruciuni if-else-if:

#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:

2.2. Instruciunea SWITCH

Instruciunea switch permite executarea unei singure secvene


din mai multe alternative, n funcie de valoarea unei expresii.
Sintaxa instruciunii switch este urmtoarea:

24
Sintaxa instruciunii Schema bloc
switch
switch (expresie)
{
case const-1:
{
instructiune-1; break;
}

case const-n:
{
instructiune-n; break;
}
default:
{
instructiune-def;
}
}

Modul de funcionare: nti se calculeaz valoarea expresiei


expresie. Dac aceasta este egal cu una din constantele
corespunztoare fiecrei etichete case, se execut instruciunea din
corpul constantei respective. Fiecare grup case trebuie terminat cu
o instruciune break. n cazul n care aceasta lipsete, se execut
toate instruciunile, ncepnd cu constanta selectat pn la ultimul
case. Cnd este ntlnit o instruciune break n construcia switch,
programul execut un salt la linia de cod ce urmeaz dup corpul
lui switch. Instruciunea corespunztoare cazului implicit (default)
este executat cnd expresia nu ia nici una din valorile
constantelor. Default este opional i, dac nu este prezent, nu are
loc nici o aciune dac nu se gsete o constant potrivit.

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.

Exemplu: S se scrie un program ce va efectua operaii cu


numere ntregi de forma OPERAND1 operator OPERAND2
(2*4):

#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

S se scrie un program care va calcula valoarea funciei n


funcie de condiii. n program s se utilizeze instruciunile if, if-else,
if-else-if i switch:
Nr. Funcia Condiia
b 3 + a + x ,1 x 3
1x3
1 M = e ax + 3 xb , x < 1 x<1
4tga, x > 3 x>3

x 2 + b b 2
x<1.5

2 A = sin 3 ( x + a ) + 3 x 2 + b x=1.5
bx cos( x ) + a x>1.5

| x y / x 3 y / x |
x<1.2
3 L = cos 2 x 3 e x / a x=1.2
ax x>1.2
e a 2 + 1 .5
a + x
x>a
4 D = (bx 2 a ) /( e ax 1) x=a
x 2a / 4 x<a

e 2 y ln( a + x + y 2 )
-1x*y6
5 Z = 3 x + y x*y<-1
x*y>6
cos x + sin y + a
2 4 2

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

Exemplu: S se scrie un program care va calcula valoarea


funciei WD n funcie de condiii (vezi varianta 16). n program s
se utilizeze instruciunile if, if-else, if-else-if i switch:

#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:

4. ntrebri pentru verificarea cunotinelor

1. Prezentai sintaxa instruciunii if.


2. Prezentai sintaxa instruciunii if else.
3. Prezentai sintaxa instruciunii switch.
4. Explicai modul de funcionare a instruciunii if.
5. Explicai modul de funcionare a instruciunii if else.
6. Explicai modul de funcionare a instruciunii switch.
7. Explicai instruciunea break.
8. Prezentai schema bloc a instruciunii if.
9. Prezentai schema bloc a instruciunii if else.
10. Prezentai schema bloc a instruciunii switch.

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

Una dintre cele mai puternice instruciuni iterative ale


limbajului C/C++ (i nu numai) este instruciunea for, care are
urmatoarea sintax:

Sintaxa instruciunii for Schema bloc

for (exp1; exp2; exp3)


{
instruciuni;
}

Modul de funcionare: Procesul de execuie a ciclului


ncepe cu calcularea expresiei de iniializare (exp1), dup care se
trece la expresia de control (exp2) i se verific veridicitatea
acesteia. n cazul cnd aceasta e adevrat, se trece la executarea
instruciunilor din interiorul corpului lui for. Dup ndeplinirea
acestora se trece la expresia de incrimentare/decrementare (exp3) i
din nou se controleaz expresia de control (exp2), justeea creia
33
duce la ndeplinirea repetat a ciclului. Instruciunea for va cicla de
attea ori, pn cnd expresia de control va fi adevrat. n caz
contrar se va trece la urmtoarea instruciune dup corpul lui for.

Exemplu: S se scrie un program ce va calcula suma a n


numere naturale:

#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

Ciclul while este utilizat n cazul n care nu se cunoate


numrul de repetri ale ciclului i nu exist necesitatea ca ciclul s
fie executat cel puin o singur dat. Sintaxa instruciunii while
este urmtoarea:

Sintaxa instruciunii Schema bloc


while

while(expresie)

instruciuni;

Modul de funcionare: Mai nti se evalueaz expresie,


dac aceasta este adevrat, atunci se execut toate instruciunile
din corpul ciclului i controlul trece la nceputul buclei while.
Astfel, corpul se execut ori de cte ori expresie se evalueaz la
"adevr". Terminarea buclei are loc cnd expresie ia valoarea
fals.

Exemplu: S se scrie un program ce va calcula suma i


produsul primelor n numere naturale:

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:

2.3. Instruciunea do while

Ciclul do while este utilizat n cazul cnd nu se cunoate


numrul de repetri ale ciclului i exist necesitatea ca ciclul s fie
executat cel puin o singur dat. Sintaxa instruciunii do while
este urmtoarea:
36
Sintaxa instruciunii Schema bloc
do while
do

instruciuni;

while(expresie)

Modul de funcionare: La nceput se execut instruciunile


din corpul lui do, apoi se evalueaz expresie. Dac valoarea lui
expresie este diferit de 0 ("adevrat"), atunci controlul se paseaz
la nceputul instruciunii do i procesul se repet. Dac expresie se
evalueaz la 0 ("fals"), atunci controlul se paseaz la instruciunile
urmatoare dup while.

Exemplu: S se scrie un program ce va calcula suma i


produsul a n numere naturale:

#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:

3. Variantele propuse spre elaborare

S se scrie un program ce va calcula valoarea expresiei matematice


pe un interval introdus de la tastarur. n program s se utilizeze
instruciunile: switch, for, while, do while,if i else:

Nr. Expresia matematic Interval


Z =| a + b2 - c | + c * a b 2 X=c<Y-2;
1
interval min=10
A = a 2 + b 2+ q b 3 + q 3-X=q<Y*2;
2
interval min=9

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:

4. ntrebri pentru verificarea cunotinelor

1. Prezentai sintaxa instruciunii for.


2. Prezentai sintaxa instruciunii while.
3. Prezentai sintaxa instruciunii do while.
4. Explicai modul de funcionare a instruciunii for.
5. Explicai modul de funcionare a instruciunii while.
6. Explicai modul de funcionare a instruciunii do while.
7. Prezentai schema bloc a instruciunii for.
8. Prezentai schema bloc a instruciunii while.
9. Prezentai schema bloc a instruciunii do while.
10. Explicai diferenele dintre for, while i do while.
41
Lucrarea de laborator nr.4
Tablouri liniare

1. Scopul
Studierea i utilizarea instruciunilor de baz ale limbajului
pentru prelucrarea i modificarea masivelor unidimensionale.

2. Descrierea temei
2.1. Declarea tablourilor

Numim tablou o colecie (grup, mulime ordonat) de date,


de acelai tip, situate ntr-o zon de memorie continu. Tablourile
sunt variabile compuse (structurate), deoarece grupeaz mai multe
elemente. Variabilele tablou au nume, iar tipul tabloului este dat de
tipul elementelor sale. Elementele tabloului pot fi referite prin
numele tabloului i indicii (numere intregi) care reprezint poziia
elementului n cadrul tabloului.
n funcie de numrul indicilor utilizai pentru a referi
elementele tabloului, putem ntlni tablouri unidimensionale
(vectorii) sau multidimensionale (matricele sunt tablouri
bidimensionale).
Ca i variabilele simple, variabilele tablou trebuie declarate
nainte de utilizare.
Modul de declarare:

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

Reprezint un ir de elemente aranjate uniform ntr-un rnd.


Fiecare element al unui masiv unidimensional are o coordonat
(numrul de ordine n masiv).
Sintaxa de declarare a tabloului unidimensional (vector) este
urmtoarea:
tip nume_tablou[dimensiunie];
Exemple:
int vector[20]; //declararea tabloului vector de maximum 20
elemente de tip int.
float t,x,vec[30]; //declararea variabilor simple t, x i a vectorului
vec de maximum 30 elemente de tip float.
char tab[20]; //declararea tabloului tab din 20 caractere.
Considerm declaraia tabloului v cu maxim 7 elemente
int v[7];

Elementele tabloului pot fi iniializate prin atribuire


v[0]=10;
v[1]=13;
v[2]=-29;
v[3]=7;
v[4]=5;
v[5]=-7;
v[6]=-15;

Accesul la un element al masivului unidimensional se face


n felul urmtor: nume_tablou[i];
unde: nume_tablou va reprezenta numele masivului
unidimensional (vector), iar i numrul de ordine al elementului
n masiv. Exemplu:
vector[2]; se acceseaz elementul cu numrul de ordine 2 din
masivul vector.
tab[12]; se acceseaz elementul cu numrul de ordine 12 din
masivul tab.

43
Pentru a introduce, prelucra i afia un vector unidimensional
vor trebui parcurse toate elementele acestuia de la poziia iniial
pn la cea final.

Exemplu: S se scrie un program ce va introduce, afia i


calcula suma elementelor pare de pe poziii impare din masivul
unidimensional V[n]:

#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:

2.3. iruri de caractere

Numim ir o succesiune de caractere ale alfabetului, adic o


propoziie. Pentru a defini o variabil, valoarea creia va fi un ir
de caractere, n limbajul de programare C/C++ trebuie declarat un
masiv de tip char cu o lungime egal cu cantitatea maximal
posibil de caractere din masiv. Forma general de declarare a
unui ir de caractere este urmtoarea:
char nume_ir[dimensiunie];
La declararea masivului de tip char pentru descrierea unui ir
se indic mrimea masivului cu o celul mai mult dect lungimea
maxim presupus a irului, deoarece ultima celul din masiv este
rezervat pentru simbolul nul \0, ce semnific sfritul de ir.
Exemplu:
char tab[21]=Craciun Fericit!;
char sir[21]=Salutare;

45
Pentru a introduce un ir de caractere n memoria
calculatorului, este folosit funcia gets(). Aceast funcie are
urmtoarea sintax:

gets(nume);

Unde nume este parametrul funciei i reprezint numele


variabilei de tip ir, adic a masivului de tip char. Funcia dat
ateapt pn cnd utilizatorul va culege un ir de la tastatur.
Pentru ca textul cules s fie atribuit ca valoare a unei variabile de
tip ir, utilizatorul trebuie s tasteze ENTER. n timpul tastrii
acestei taste, compilatorul adaug la sfritul irului simbolul
nul(\0).
Ca s afim irul introdus cu funcia gets(), vom utiliza
funcia puts(). Aceast funcie are urmtoarea sintax:

puts(nume);

Unde nume este parametrul funciei i poate fi: un literal, o


constant de tip ir sau o variabil de tip ir.

Exemplu: S se utilizeze funciile puts() i gets() pentru


introducerea i afiarea unui ir de caractere:

#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:

Limbajul de programare C/C++ pune la dispoziie o


bibliotec (string.h) ce face posibil lucrul rapid i eficient cu
irurile de caractere.

Tabelul 5. Funciile din biblioteca string.h


Nr. Funcia Efect
1 strcpy(s1,s2); Copiaz irul s2 n irul s1.
strncpy(s1,s2,n); Copiaz primele n caractere din irul s2
2
n irul s1.
3 strcat(s1,s2); Adaug irul s2 la sfritul irului s1.
strncat(s1,s2,n); Adaug cel mult n caractere din irul s2
4
la sfritul irului s1.
strupr(s); n irul s, literele mici sunt nlocuite cu
5
literele mari.
strlwr(s); n irul s, literele mari sunt nlocuite cu
6
literele mici.
strrev(s); Inverseaz toate caracterele irului s,
7
exceptnd terminatorul \0.
strset(s,c); n irul s, toate caracterele sunt
8
nlocuite cu caracterul c
strnset(s,c,n); n irul s, primele n caractere sunt
9
nlocuite cu caracterul c
10 strlen(s); Returneaz lungimea irului s

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.

Exemplu: S se scrie un program ce va utiliza funcii de


prelucrare a irurilor de caractere (tabelul 5):

#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:

3. Variantele propuse spre elaborare

S se scrie un program ce va prelucra vectori de tip ntregi


(vezi condiia a) i vectori de tip caracter (vezi condiia b).
Nr Condiia a Condiia
b
1 Este dat masivul unidimensional X[n]. S se creeze
masivele unidimensionale Y i Z. Masivul Y va Utiliznd:
conine elementele negative ale masivului X, iar Z -strstr
elementele pozitive ale masivului X.
2 Sunt date dou masive unidimensionale A[n] i Utiliznd:
B[n]. S se calculeze valoarea expresiei Z=(S1+S2) -strcpy
/(K1*K2), unde S1 i K1 sunt suma i cantitatea
elementelor pozitive din masivul A, iar S2 i K2 -
suma i cantitatea elementelor pare din masivul B.

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].

Exemplu: Este dat masivul unidimensional W[n]. S se afle


valoarea elementului minimal printre elementele pare:

#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:

4. ntrebri pentru verificarea cunotinelor

1. Explicai noiunea de tablou.


2. Prezentai sintaxa de declarare a unui tablou.
3. Prezentai sintaxa de acces la un element al masivului.
4. Explicai noiunea de ir.
5. Prezentai sintaxa de declarare a unui ir de caractere.
6. Prezentai i explicai sintaxa funciei puts().
7. Prezentai i explicai sintaxa funciei gets().
8. Prezentai i explicai sintaxa funciei fmod().
9. Prezentai i explicai funciile din biblioteca string.h.
10. Explicai cum are loc ncrcarea unui tablou de tip int.

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

Tabourile n C/C++ pot avea mai multe dimensiuni. O


modalitate comun de a le folosi este utilizarea matricelor cu linii
i coloane, fiind vorba n acest caz despre tablouri cu dou
dimensiuni (bidimensional).
Tablou bidimensional - succesiune de locaii de memorie
recunoscute prin acelai identificator i prin poziia fiecreia n
cadrul irului. Poziia este dat printr-o suit de dou numere
pozitive (indexi), care reprezint cele dou dimensiuni (linie i
coloan).
Sintaxa de declarare a unui tablou bidimensional (matrice)
este:
Tip nume[dim1][dim2];
unde:
Tip - poate fi unul din tipurile de baz folosit (int,
float,char,...) sau un tip definit de utilizator (articole, obiecte);
nume numele prin care va fi referit matricea;
dim1 numrul de linii din matrice;
dim2 numrul de coloane din matrice.

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

2.2. Citirea i afiarea unui tablou bidimensional

Citirea elementelor unui tablou nu este posibil dect prin


citirea fiecrui element. De aceea, ca i n cazul vectorilor, operaia
de citire a matricelor impune folosirea a dou secvene ciclice
suprapuse. Acestea corespund indicilor liniei i, respectiv coloanei
j.
De multe ori nu tim cte linii i cte coloane va trebui s
aib tabloul. n acest caz, tabloul se declar cu un numr maxim de
linii i un numr maxim de coloane, astfel, nct acesta s
corespund oricrui set de date de intrare. Evident, ntr-un astfel de
caz exist o risip de memorie intern.

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.

2.3. Prelucrarea unui tablou bidimensional

Prelucrarea elementelor unui tablou, de asemenea ca i


citirea/afiarea, nu este posibil dect prin analiza fiecrui element.
De aceea, pentru a efectua o astfel de condiie este nevoie a folosi
dou secvene ciclice suprapuse, care vor corespunde indicilor
liniei i, respectiv coloanei j.

Exemplu: S se scrie un program ce va prelucra o matrice


A[lin][col] cu condiiile:
1) suma elementelor de pe diagonala principal;
2) s se afle elementul minimal i cel maximal din rndul 2:

#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:

3. Variantele propuse spre elaborare

S se scrie un program ce va prelucra un masiv


bidimensional cu n linii i m coloane, avnd urmtoarele condiii:

Nr Condiia problemei Tabloul


a) Schimbai cu locul elementele primului rnd cu
elementele celei de-a doua coloan de la sfrit;
1 X[n,m]
b) S se calculeze suma i produsul elementelor
pare din rndul 2.
a) Aranjai cresctor elementele fiecrui rnd;
2 b) S se afle cantitatea elementelor divizibile la 2 din A[n,m]
coloana indicat de utilizator.
a) Schimbai cu locul elementele pozitive ale ariei III
cu elementele pozitive ale ariei II;
3 b) S se calculeze suma i produsul elementelor B[n,m]
pozitive impare din coloana indicat de utilizator.
a) Schimbai cu locul elementul maximal al
masivului cu cel minimal al masivului;
4 F[n,m]
b) S se calculeze suma i cantitatea elementelor
pare din prima i ultima coloan.

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.

La execuia programului trebuie s avei un meniu


asemntor cu schema prezentat mai jos (meniu n meniu):

Lucrarea de laborator nr.5 - Masive bidimensionale


Executat de studentul ________ gr. ___
M E N I U L P R O G R A M U L U I:
1. Prima condiie a problemei
2. A doua condiie a problemei
3. Iesire din sistem
Alege condiia: 1
------------------------------------------------------------------------------
Submeniul primei condiii a problemei
1. Introduce matricea manual
2. Introduce matricea aleator (utiliznd funcia random)
Alege condiia: ?

4. ntrebri pentru verificarea cunotinelor

1. Explicai noiunea de tablou bidimensional.


2. Prezentai sintaxa de declarare a unui tablou (matrice).
3. Prezentai sintaxa de acces la un element al tabloului.
4. Explicai cum are loc ncrcarea unui tablou (matrice).
5. Explicai cum are loc citirea unui tablou (matrice).
6. Prezentai i explicai sintaxa funciei fmod().
7. Prezentai i explicai sintaxa funciei random().

62
Lucrarea de laborator nr.6
Funcii n C/C++

1. Scopul
nsuirea utilizrii subprogramelor (funciilor).

2. Descrierea temei

Odat cu creterea volumului programului i complicitatea


acestuia, apare necesitatea de a-l mpri n sarcini concrete numite
n continuare funcii.
Un program C++ este alctuit din una sau mai multe funcii
din care una este radcin sau funcie principal (aceasta se
numete main i nu poate lipsi din construcia programului,
deoarece execuia ncepe automat cu ea), iar restul funciilor se
numesc secundare.
Sintaxa general de reprezentare a unei funcii este
urmtoarea:

tip_returnat nume_funcie (lista parametrilor formali)


{ instruciune; // corpul funciei }

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

Apelul funciei ce nu returneaz nici un rezultat are


urmtoarea form:
nume_funcie (lista parametrilor efectivi);

unde lista parametrilor efectivi poate fi o list vid, o


expresie, sau mai multe desprite prin virgul.
Apelul funciei ce returneaz un rezultat are forma
urmtoare:
intermediar=nume_funcie (lista parametrilor efectivi);

unde lista parametrilor efectivi poate fi o list vid, o


expresie sau mai multe desprite prin virgul.
O funcie care returneaz o valoare este apelat printr-o
instruciune de apel simpl (cazul funciilor care nu returneaz
valori) i n plus poate fi apelat ca operand al unei expresii. n
cazul n care funcia se apeleaz printr-o instruciune de apel
simpl, rezultatul funciei se pierde. Cnd funcia se apeleaz ca
operand, valoarea returnat va fi utilizat n expresie.
La apelul unei funcii, valorile parametrilor efectivi se
atribuie parametrilor formali corespunztori, n cazul n care unul
din tipul unui paramatru efectiv difer de tipul parametrului formal
corespunztor, parametrul efectiv va fi convertit spre parametrul
formal (dac este posibil, altfel compilatorul genereaz eroare).
n momentul n care se ntlnete un apel de funcie,
controlul execuiei programului este transferat primei instruciuni
din funcie, urmnd a se executa secvenial instruciunile funciei.
Revenirea dintr-o funcie se face n unul din urmtoarele
cazuri:
- dup execuia ultimei instruciuni din corpul funciei;
- la ntlnirea unei instruciuni return (se ntoarce valoarea
calculat i se ncheie executarea funciei curente, iar controlul
execuiei programului este transmis funciei din care a fost
chemat funcia curent). Dac dup operatorul return mai exist
operatori, ei vor fi ignorai.
64
Exemplu: S se scrie un program, utiliznd o funcie
nereturnabil:

#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:

Exemplu: S se scrie un program, utiliznd o funcie


returnabil:

#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();}

Rezultatul execuiei: Observaie:

2.2. Prototipul unei funcii

Pentru a apela o funcie, aceasta trebuie nti definit. O a


doua posibilitate de apelare a funciei const n scrierea
prototipului funciei nainte de a fi apelat. Prototipul funciei este
amplasat la nceputul programului i conine informaii
asemntoare cu cele din antetul funciei, la care pot lipsi numele
66
parametrilor formali (conteaz doar tipul i ordinea acestora), n
plus acesta este urmat de ;.

Exemplu: S se scrie un program ce va compara dou


numere ntregi:

#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);}
}

Rezultatul execuiei: Observaie:

67
2.3. Transmiterea tablourilor unei funcii

n C numele unui tablou reprezint adresa primului element


din tablou, celelalte elemente fiind memorate la adresele urmtoare
de memorie. Din acest motiv, n cazul transmiterii unui tablou unei
funcii se transmite de fapt o adres, realizndu-se un apel numit
pointer care determin modificarea parametrului actual.

Exemplu: S se scrie un program ce va calcula valoarea


expresiei M=S1+S2+6, unde S1 - suma elementelor pare negative
din prima jumtate a vectorului T, iar S2 - suma elementelor
divizibile la 3 de pe poziii impare ale vectorului D:

#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:

3. Variantele propuse spre elaborare

S se scrie un program cu ajutorul funciilor ce va prelucra


dou masive bidimensionale cu n linii i m coloane, avnd
urmtoarele condiii:

Nr. Condiia problemei Tabloul


a) Schimbai cu locul elementele rndului indicat de
X[n,m]
utilizator cu elementele primei coloane;
1
b) S se calculeze suma i produsul elementelor pare
R[n,m]
din rndul 2.

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.

4. ntrebri pentru verificarea cunotinelor

1. Explicai noiunea de funcie.


2. Prezentai sintaxa de declarare a unei funcii.
3. Prezentai sintaxa de apelare a funciei nereturnabile.
4. Prezentai sintaxa de apelare a funciei returnabile.
5. Explicai cnd are loc revenirea dintr-o funcie.
6. Explicai cum are loc transmiterea parametrilor funciei.
7. Explicai noiunea de prototip al funciei.

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

Memoria intern poate fi privit ca o succesiune de octei,


fiecare avnd un numr de ordine numit adres. Fiecare variabil
ocup un numr de octei determinat de tipul su. Adresa primului
octet al variabilei se numete adresa variabilei.
Variabilele de tip pointer se caracterizeaz prin faptul c
valorile pe care le pot memora aceste sunt adresa altor variabile
de acelai tip ca i pointerul declarat.
O variabil de tip poiner se declar astfel:

tip *nume_pointer;

unde: tip reprezint tipul de date spre care va pointa


indicatorul (int, char, float etc.);
* - denot c ceea ce urmeaz dup el este un indicator;
nume_pointer reprezint numele variabilei de tip pointer
(indicator) dat de ctre programator.

Exemple de declarare a indicatorilor:


int *w1, *w2; declararea a doi pointeri (indicatori) la date ntregi.
char *adr1; declararea a unui pointer (indicator) la date de tip
caracter;
float a, b, *p1, *p2; are semnificaia c a i b sunt variabile de tip
float, n timp ce p1 i p2 sunt pointeri la variabile de tip float.
Aceasta nseamn c n zonele de memorie pentru variabilele a i
b se gsesc chiar valorile acestor variabile (sub form de date de
tip float, pe cte 4 octei), n timp ce n zonele de memorie alocate
74
pentru variabilele p1 i p2 se gsesc adresele la care sunt situate n
memorie nite date de tip float (adresele fiind numere ntregi, fr
semn, pe doi octei fiecare).
Odat ce indicatorul a fost declarat ca referin la date de tip
ntreg, el nu se va putea referi la o variabil tip float, cauza fiind
volumul diferit rezervat n memorie pentru variabile ntregi i
flotante. Exist indicatori i ctre elemente fr tip - void. Putem
atribui unui pointer void valoarea altui pointer non-void, fr a fi
necesar operaia de conversie de tip. Exemplu:
int *a;
void *b;
b=a; //corect
a=b; //incorect, lipsete conversia de tip.

Exemplu: S se scrie un program ce va utiliza indicatorii:

#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.

Fig.2. Apelarea variabilelor cu ajutorul indicatorilor

Exemplu: S se scrie un program ce va utiliza indicatorii:

#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.

Fig. 3. Memoria iniial i cea final a progamului

2.2. Pointeri i tablouri

n limbajele C/C++ exist o strns legtur ntre pointeri i


tablouri, deoarece numele unui tablou este un pointer (constant)
care are ca valoare adresa primului element din tablou. Diferena
dintre numele unui tablou i o variabil pointer const n faptul c
unei variabile de tip pointer i se pot atribui valori la execuie, lucru
imposibil pentru numele unui tablou. Acesta are tot timpul, ca
valoare, adresa primului su element. De aceea, se spune c
numele unui tablou este un pointer constant (valoarea lui nu poate
fi schimbat).
Un caz aparte n lucrul cu indicatorii este folosirea
indicatorului la un masiv. Cnd programul transmite un masiv n
funcie ctre un pointer, compilatorul transmite adresa primului
element al masivului.
77
Exemplu: S se scrie un program ce va calcula suma
elementelor pare de pe poziii impare din vectorul V:

#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:

n exemplul precedent, la apelul funciilor add(), afis() i


suma(), n calitate de parametru se transmite nu adresa vectorului
v, ci nsi vectorul. Aceasta este condiionat de faptul c la
transmiterea masivelor n calitate de parametru actual se transmite
nu masivul ntreg, ci adresa primului element al masivului. Deci,
indicatorul p va conine adresa elementului masivului, iar *p
valoarea lui. n aa fel, la prima iteraie a ciclului for variabila
*(p+i) va avea valoarea egal cu primul element al masivului v
transmis funciei. Dup ndeplinirea fiecrei iteraii funcia mrete
valoarea indicatorului p cu o unitate. Aceasta nseamn c valoarea
adresei primei valori din masiv va fi incrementat, ca rezultat
obinndu-se adresa elementului al doilea din ir. Ciclul se va
termina cnd condiia din for va deveni fals.

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:

2.3. Operaii cu pointeri

n afara operaiei de atribuire (prezentat mai sus), asupra


variabilelor pointer se pot efectua operaii de comparare, adunare
i scdere (inclusiv incrementare i decrementare).
Valorile a doi pointeri pot fi comparate, folosind operatorii
relaionali, ca n exemplul:

int p1, p2;


if (p1<p2)
printf(p1=%d < p2=%d,p1,p2);
else
printf(p1=%d > p2=%d,p1,p2);

O operaie uzual este compararea unui pointer cu valoarea


nul, pentru a verifica dac acesta adreseaz un obiect.
Compararea se face cu constanta simbolic NULL (definit n
header-ul stdio.h) sau cu valoarea 0.
if (!p1) // sau if (p1 != NULL)
.....; // pointer nul
else . . . . ; // pointer nenul

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.

3. Variantele propuse spre elaborare


Nr. Condiia problemei
1 Este dat masivul unidimensional A[n]. Comparai ntre ele
elementele masivului: 1 cu n; 2 cu n-1; 3 cu n-2 Precizai
cte din perechi sunt ntre ele egale, mai mici sau mai mari.
2 Sunt date dou masive unidimensionale R[n] i T[n]. S se
calculeze valoarea expresiei S= cos(m1+n1)- m1* n1; unde
m1 - produsul ultimelor 5 elemente impare negative ale
masivului R, n1 - media aritmetic a primelor 5 elemente
pare pozitive ale masivul T.
3 Este dat masivul unidimensional Q[n]. Comparai produsele
dintre primele 3 elemente pare pozitive i ultimele 4
elemente nedivizibile la 4 din prima jumtate a masivului.
4 Sunt date dou masive unidimensionale K[n] i M[n]. S se
calculeze valoarea expresiei: Z= K1/Mn +K2 /M n1 +

5 Este dat masivul unidimensional B[n]. Comparai elementele


masivului: 1 cu 2; 3 cu 4; 5 cu 6 Precizai cte din perechi
sunt egale, mai mici sau mai mari.

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:

4. ntrebri pentru verificarea cunotinelor

1. Explicai noiunea de pointer.


2. Prezentai sintaxa de declarare a unui pointer.
3. Care sunt operaiile aritmetice admise asupra pointerilor?
4. Care este legtura dintre tablouri i pointeri?
5. n ce const operaia de incrementare a pointerilor?
6. Ce sunt pointerii generici?
7. Unui pointer generic i se poate atribui valoarea unui
pointer cu tip?

85
Bibliografie

1. L. Negrescu. Iniiere n limbajul de programare C, C++. Cluj,


1996.
2. L. Negrescu. Limbajele C, C++ pentru nceptori. Cluj-
Napoca: ed. Albastr, 2000, v. II.
3. D. Costea. Iniiere n limbajul C. Bucureti, ed. Teora, 1996.
4. A. . C C++. . :
, 1996.
5. S. Istrati. Iniializarea n limbajele C i C++. Chiinu, 2003.
6. G.D. Mateescu. C++ limbaj de programare. Bucureti: ed.
Petrion,1998.
7. O. Catrina, L. Cojocaru. Turbo C++. Bucureti: ed. Teora,
1994.

86
PROGRAMARE
Indicaii de laborator
Partea I

Autori: V. Derevlenco
I. Ichim
L. Bodean

Redactor: Eugenia BALAN



Bun de tipar 30.01.2014 Formatul 60x84/16
Hrtie ofset. Tipar RISO Tirajul 50 ex.
Coli de tipar 5,5 Comanda nr.08

MD 2004, U.T.M., Chiinu, bd. tefan cel Mare, 168


Editura Tehnica-UTM
MD 2068, Chiinu, str. Studenilor, 9/9

87
88

S-ar putea să vă placă și