Sunteți pe pagina 1din 13

Ministеrul Еducаțiеi, Culturii și Cеrcеtării аl Rеpublicii Mоldоvа

Univеrsitаtеа Tеhnică а Mоldоvеi

Fаcultаtеа Cаlculаtоаrе, Infоrmаtică şi Micrоеlеctrоnică

Dеpаrtаmеntul Ingineria Software și Automatică

RAPORT

Lucrarea de laborator Nr.3


la disciplina Programarea Calculatorelor

Varianta 6

A efectuat: st.gr.TI-192

Covrig Victor

A verificat: asist.univ.

Cristina Josan

Chisinau-2019
Tema lucrarii:Solutionarea problemelor prin prelucrarea tablourilor unidimensionale în TP şi C.

Obiectivele temei

1. Familiarizarea cu principiile solutionarii problemelor si prelucrării elementelor tablourilor

unidimensionale.

2. Algoritmizarea şi însuşirea procedeelor stereotipe de declarare, introducere, afişare şi formare prin

parcurgere şi calcule ale valorilor elementelor tablourilor unidimensionale.

3. Însuşirea procedeelor avansate de realizare a structurilor ciclice cu instrucţiunile for, while şi repeat,

aplicând diverse tehnici de programare.

4. Însuşirea procedeelor de operare în interfaţa C la nivelul submeniurilor DEBUG şi

BREAK/WATCH (mijloacele de depanare-urmărire a variabilelor şi punctele de întrerupere).

Partea teoretica

Tablourile sunt niste multimi de data uniforme (au acelasi tip de date), care ocupa in secventa de memorie locuri
succesive..Tablourile unidimesionale sunt numite si vectori ,care sunt formate dintr-un sir de date. Ele se declara
cu in forma data :”tipul de date denumirea tabloului[numarul maxim de elemente ]”.De exemplu in cazul: int
a[40] ,avem un tablou unidimensional a ,format din numere intregi ,avand 40 de elemente.Elementele unui tablou
se acceseaza cu urmatoarea sintaxa :”a[i]” ,a-denumirea tabloului ,i-numarul de ordine a elementului care dorim
sa accesam.In C tablourile incep cu numarul de ordine 0.Pentru a scrie tabloul unidimensional de la tastatura este
nevoie de urmatoarea parcurgere a programului:

for (i=0;i<n;i++)

{printf("x[%d]=",i);

scanf("%d",&x[i]);}

Aceasta instructiune se realizeaza de n ori si va afisa a[0]=valoare instrodusa ,a[1]=valoare introdusa … a[n]-
valoare introdusa.

Pentru a se afisa tabloul este nevoie de a scrie in program urmatoarea secventa:

for(i=0;i<n;i++)

printf(“\n tab[%d]=%d”,I,tab[i]);

Astfel se executa de n ori afisarea pe ecran a n elemente a tabloului.

Partea practica
6. Să se elaboreze algoritmul şi programul pentru următoarele: Sunt date tablourile X={ x i },

i=1,…,n; Y={y i }, i=1,…,n şi valoarea t în baza cărora să se calculeze valorile

lui F:

n
∑ (xi*yi + xi *yi +), dacă k=1;
i=1
(X +X +...+X )(y +y +...+y ),
2
i
2
i
2
i
2
i
2
i
2
i dacă k=2;
F= n
(y + x ),
3
i
3
i dacă k=3;
j=

Schema bloc a programului:


Listing-ul programului:

#include<stdio.h>//Includem biblioteca standard input-output, folosita pentru afisarea sirurilor de caractere din
functiile printf si scanf.

#include<math.h>//Includem biblioteca math, care citeste operatii matematice (pow,abs,fabs,cos,sin)

void main(void)//Afisam header-ul programului principal ,care nu returneaza nici o valoare si nu are argumente.

{//Inceputul programului.

int x[100],y[100],i,k,F=0,n,j,x1=0,y1=0;//Declaram variabilele inclusiv tablourile x si y care sunt formate din maxim
100 elemente.

printf("Dati n "); //Folosim printf pentru a sti ca citim n de la tastatura.

scanf("%d",&n); //Citim variabila n de la tastatura.

printf("Dam valoarea lui k "); //Folosim printf pentru a sti ca urmeaza sa dam variabila k de la tastatura; k poate sa
fie 1,2 sau 3.

scanf("%d",&k); //Citim de la tastatura variabila k.

printf("Dati tabloul unidimensional x\r\n"); //Urmeaza sa dam n valori a tabloului unidimensional x.

for (i=0;i<n;i++) //Ciclul for initializeaza variabila de contor I cu 0,aplicam conditia i<n(se executa de n
ori,incrementam i la sfarsitul blocului care urmeaza.

{printf("x[%d]=",i); //Afisam numarul de ordine a fiecarui element din tabloul x.

scanf("%d",&x[i]);} //Introducem de la tastatura fiecare element al tabloului x.

printf("Dati tabloul unidimensional y\r\n"); //Urmeaza sa dam n valori a tabloului unidimensional y.

for (i=0;i<n;i++) //Ciclul for initializeaza variabila de contor I cu 0,aplicam conditia i<n(se executa de n
ori,incrementam i la sfarsitul blocului care urmeaza.

{printf("y[%d]=",i); ); //Afisam numarul de ordine a fiecarui element din tabloul y.

scanf("%d",&y[i]);} //Introducem de la tastatura fiecare element al tabloului y.

switch (k){ //Instructiunea switch verifica ce character I s-a atribuit variabilei k.

case 1: //In caz cand variabilei k i-am atribuit valoarea 1.

for (i=0;i<n;i++) //Ciclul for initializeaza variabila de contor I cu 0,aplicam conditia i<n(se executa de n
ori,incrementam i la sfarsitul instructiunii care urmeaza.

F=(x[i]+y[i]+(x[i]*y[i]))+F; //Efectuam operatia sumei care se repeata de n ori.

printf("F este %d",F); //Afisam valoarea lui F.

break; //Iesim din blocuri de instructiuni a primului caz.

case 2: //In caz cand variabilei k i-am atribuit valoarea 2.


for (i=0;i<n;i++) //Ciclul for initializeaza variabila de contor I cu 0,aplicam conditia i<n(se executa de n
ori,incrementam i la sfarsitul blocului de instructiuni care urmeaza.

{x1=((pow(x[i],2))+x1); //Varialbilei x1 ii atribuim suma elementelor ridicate la patrat a tabloului x.

y1=((pow(y[i],2))+y1);} //Varialbilei y1 ii atribuim suma elementelor ridicate la patrat a tabloului y.

F=y1*x1; //Variabilei F ii atribuim produsul variabilelor x1 si x2.

printf("F este %d",F); //Afisam raspunsul final (F).

break; //Iesim din blocuri de instructiuni a cazului 2.

case 3: //In caz cand variabilei k i-am atribuit valoarea 3.

F=1; //F initializam cu 1 pentru a nu pierde raspunsul la inmultire.

for (j=0;j<n;j++) ////Ciclul for initializeaza variabila de contor I cu 0,aplicam conditia i<n(se executa de n
ori,incrementam i la sfarsitul instructiunii care urmeaza.

F=((pow(x[j],3))+(pow(y[j],3)))*F; //Calculam produsul cartezian a elementelor de pe pozitia I a tablourilor


ridicate la puterea 3 ,care se repete de n ori.

printf("F este %d",F); //Afisam valoarea lui F.

break; //Iesim din blocuri de instructiuni a cazului 3.

default : //In caz daca variabila k nu primeste niciuna din valorile 1,2,3.

printf ("K nu este nici una din valorile 1,2,3"); //Afisam ca k nu a primit valorile dorite.

break; // Iesim din executia cazului default.

} //Sfarsitul instructiunii conditionale switch.

} //Sfarsitul functiei main.

Afisarea rezultatelor:

K=1:
K=2:

K=3:

Verificarea rezultatelor:

K=1:
K=2:

K=3:

Intrebari de autocontrol:

3.2: Elaboraţi algoritmul şi programul pentru cazul dacă suma a trei numere reale cu valori diferite x,y,z este mai mică decât
unitatea, atunci cel mai mic număr din aceste trei, de schimbat cu semisuma a celorlalte două, în caz contrar (Când suma este
mai mare ) de schimbat valoarea minimală dintre x şi y cu semisuma a celorlalte valori rămase.
#include<stdio.h>

int main()

float x,y,z,M,S;

printf("x este ");

scanf("%f",&x);

printf("y este ");

scanf("%f",&y);

printf("z este ");

scanf("%f",&z);

if (x+y+z<1)

if (x<y)

M=x;

else M=y;

if (M>z)

M=z;

if (M==x)

{M=S;

S=(y+z)/2;

printf("S este %f",S);}

else if (M==y)

M=S;

S=(x+z)/2;

printf("S este %f",S);}

else if (M==z)

{M=S;

S=(x+y)/2;

printf("s este %f",S);}}

else if (x+y+z>1)

{
if (x<y)

M=x;

S=(y+z)/2;

printf("S este %f",S);}

else {M=y;

S=(x+z)/2;

printf("S este %f",S);}

return 0; }

3.4*. Elaboraţi algoritmul şi programul pentru cazul când sunt date 100 numere întregi pentru care trebuie de calculat
diferenţa maximă între ele:
Algoritmul:
1.Initiem tabloul unidimensional a,I,S,max,min.
2.Prin ciclul for introducem elementele tabloului unidimensional.
3.atribuim elementului maxim si minim primul element.
4.cu ciclul for verificam daca elementul cu numaul de ordine I este mai mare decat min si respective max ,in acest caz atribuim
min si max variabilele respective.
5.Calculam diferenta dintre elementul maxim si minim.
6.Printam diferenta elementelor.

#include<stdio.h>
void main (void)
{
int a[100],i,S,max,min;
for (i=0;i<100;i++)
{printf("a[%d]=",i);
scanf("%d",&a[i]);}
max=a[0];min=a[0];
for (i=1; i<100; i++) {if(a[i]>max)
max=a[i];
if(a[i]<min)
min=a[i];}
S=max-min;
printf("Diferenta maxima este %d",S);

3.5*. Elaboraţi algoritmul şi programul pentru determinarea. dacă un număr natural e perfect, adică care este egal cu
suma tuturor divizorilor.(de exemplu 6=1+2+3).
Algoritmul:
1.Dam valorile initiale x,suma=0,i,d.
2.Introducem de la tastaura numarul x.
3.Aplicam ciclul for ,care verifica daca x mod i(un numar de la 1 la x) este diferit de 0, daca e asa numarul se include in variabila
d (special rezervata pentru divizori)
4.Calculam suma acestor divizori.
5.Printam rezultatul final (suma).

Programul:

#include<stdio.h>

#include<math.h>
void main()

int x,suma=0,i,d;

printf("Dati numarul x ");

scanf("%d",&x);

for (i=1;i<=x;i++)

if (x%i==0)

{d=i;

suma=suma+d;}}

printf("suma este %d",suma);

3.6. Ce subînţelegem prin tablou şi cum se notează în program elementele unui tabel?

Un tablou este o totalitate de aceleasi tip de date ,care se afla pe zone de memorie sucesive.In program elementele unui tablou
la initiere se noteaza prin {x1,x2,x3,x4…},unde x1,x2,x3 sunt elementele tabloului.e face referire la elementele tabloului prin
a[i],unde a este denumirea tabloului ,iar i-numarul de ordine a lui care incepe intodeauna de la 0.

3.7. Cum se organizează în program introducerea şi extragerea unui tablou?

Introducerea se realizeaza prin ciclul repetitive for ,care primeste ca argumente valoarea initiala a lui i-0 (prima pozitie),i<n
,unde n este numarul de elemnte ,incrementarea lui i.Ciclul primeste ca bloc de instructiuni {printf("x[%d]=",i);

scanf("%d",&x[i]);} .Extragerea are loc prin for(i=0;i<n;i++)

printf(“\n tab[%d]=%d”,I,tab[i]);

3.8. Ce operaţii se pot efectua efectiv cu elementele unui tablou?

Elementele unui tablou pot fi inmultite intre ele, impartite ,adunate ,scazute,mod(%),comparate,atribuire ,precum si operatii
matematica include in math.h.

3.9. Fie X[1..n] si Y[1..n] vectori de întregi. Care va fi valoarea lui Y[n] după execuţia secvenţei:

Y[1]=x[1];

for (i=2;i<n;i++) y[i]=y[i-1]+x[i];

a) x[n]+x[n-1]

b) x[n]

c) x[1]+x[2]+………..+x[n]

d) nici una din valorile indicate

Raspuns:d.
3.10 Fie X[1..n] si Y[1..n] vectori de numere reale. După execuţia secvenţei de program:

y[1]=-x[1];

for(i=2;i<n;i++) y[i]=y[i-1]*x[i];

elementul Y[n] exprimă :

a) x[1]*x[2]*……*x[n]

b) –x[1]*x[2]*….*x[n]

c) (-1)n x[1]*…..*x[n]

d) nici una din valorile indicate

Raspuns:Nici una din valorile indicate.

3.11 Fie V[1..n] vector de intregi . Secvenţa de program :

i=1;

for(i=1;i<=n/2;i++) { j=n-i; aux=v[i]; v[i]=v[j]; v[j]=aux; } are ca efect :

a) inversarea ordinii elementelor în vector

b) inversarea ordinii tuturor elementelor în vector numai când n este impar

c) inversarea ordinii tuturor elementelor în vector numai când n este par

d) nici una din variantele indicate

Raspuns:b.

3.12 Ce face următoarea secvenţă ?

scanf(“%d”,&n);

for(i=0;i<n;i++) scanf(“%d”,&a[i]); printf(“\n%d”,a[0]);

for(i=1;i<n;i++) { ex=0;

for(j=0;j<i;j++) if(a[i]==a[j]) ex=1; if(!ex) printf(“%d”,a[i]); }

a) afişează numerele dintr-un şir care sunt în mai multe exemplare

b) afişează numerele cu apariţie singulară în şir

c) afişează numerele dintr-un şir

d) afişează numerele impare dintrun şir

Raspuns:a.
Concluzie:

In cadrul acestei lucrari de laborator m-am familiarizat cu tablourile unidimensionale ,creand un program care efectua suma si
produsul cartezian a unor expresii ce utilizau 2 tablouri unidimensionale (x si y) , totodata am efectuat schema bloc a
programului , am afisat rezultatele ,am verificat rezulatatele ,obtinand in fiecare caz rezultatul corect. Programul este impartit in
3 cazuri (k=1,k=2,k=3),pe care le-am efectuat cu ajutorul instructiunii conditionale switch case.Am utilizat in mod repetat
instructiunea repetitiva for ,care este indispensabila cand vine vorba de tablouri unidimensionale si bidimensionale.

Bibliografie:

https://ro.wikipedia.org/wiki/Tabel_de_simboluri_matematice

http://elearning.masterprof.ro/lectiile/informatica/lectie_05/exemple.html

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