lab_9-10_pclp (1)

64
7/23/2019 Lab_9-10_PCLP (1) http://slidepdf.com/reader/full/lab9-10pclp-1 1/64 http://adl.anmb.ro Lect.dr.ing. Florin Postolache Programarea calculatoarelor si limbaje de programare Laborator 9-10

Upload: liviucatalin

Post on 18-Feb-2018

217 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 1/64

http://adl.anmb.ro

Lect.dr.ing. Florin Postolache

Programarea calculatoarelor si

limbaje de programare

Laborator 9-10

Page 2: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 2/64

   ©    A

  c  a   d  e  m

   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă

  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r

  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   2

Masive de date unidimensionale

Un masiv unidimensional se   numeşte   vector. Un vector sedeclară conform sintaxei:

tip identificator[n];–   tip este tipul (predefinit sau utilizator) comun al tuturor elementelor vectorului;–   identificator  este numele vectorului;–   n este un număr natural nenul care precizează numărul de componente ale vectorului.

•   Numărul de elemente/componente se declară între [].•   Fiecare componentă a unui tablou poate fi tratată exact ca o variabilă simplă

(identificator[i]).•   Referirea la componenta   i  a vectorului se face cu identificatorul[i].  Această

componentă are valoarea memorată la adresa adr+i*sizeof(tip).

Declaraţia

int vector[1000];

  creează un tablou cu 1000 de elemente/componente, toate de tip int.   Primul element are indicele 0, al doilea are indicele 1, iar ultimul are indicele 999.   se rezervă o zonă contiguă de memorie de dimensiune sizeof(int)*1000=4*1000=4000

octeţi.

Page 3: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 3/64

   ©    A

  c  a   d  e  m

   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă

  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r

  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   3

Masive de date unidimensionale

Tabourile cu valori tip  char :Declaraţia

char sir[7];

  Tabloul   sir   este declarat ca un   şir   de caractere care poate   săstocheze 6 caractere + terminatorul de şir (caracterul  null ) '\0'.  Programator stabileste dimensiunea tabloului în care se vor  păstra

aceste caractere.

Scrierea/initializarea tablourilor de caractere:

•   prin constante individuale printr-o listă de iniţializare.Ex:

char sir[] = {’p’,’r’,’ i’,’m’,’u’,’l’,’ \0’};Putem accesa componentele individuale ale unui tablou de caractere prinfolosirea indicilor: sir[0] este caracterul ’p’, sir[1] este caracterul ’r’, etc.

•   individual: vor fi citite 6 caractere de la   tastatură după   care seadaugă automat caracterul  null ('\0').

Page 4: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 4/64

   ©    A

  c  a   d  e  m

   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă

  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   4

Masive de date bidimensionale

Un masiv bidimensional se numeşte matrice si se declară conformsintaxei:

tip identificator [m][n];–   tip este tipul (predefinit sau utilizator) comun al tuturor elementelor matricii;–   identificator  este numele matricii;–   m, n este un număr natural nenul care precizează numărul de linii si coloane ale matricii

–   Liniile se numerotează cu 0,1, ...,(m-1). Coloanele se numerotează cu 0,1, ...,(n-1).–   Fiecare element din matrice are acelaşi tip, dat de tipul matricei. Nu se pot defini matrici cuelemente de tipuri diferite.

–   Referirea la elementul de pe linia i şi coloana j din matrice se face cu identificator[i][j].

Declaraţia

int matrice[10][10];   creează o matrice patratica cu 10 linii si coloane (100 elemente), toate de tip int.   se rezervă o zonă contiguă de memorie de dimensiune m*n*sizeof(int)=100*4=400 octeţi.

Page 5: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 5/64

   ©    A

  c  a   d  e  m

   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă

  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   5

Masive de date n-dimensionale

Un masiv n-dimensional este limitat doar de memoria   fizică  acalculatorului pe care  rulează   programul si se  declară  conformsintaxei:

tip identificator [dim1][dim2]…[dimn];–   tip este tipul (predefinit sau utilizator) comun al tuturor elementelor tabloului;–   identificator  este numele tabloului;

–   dim1 , dim2 , dimn   sunt expresii constante a   căror   valori   reprezintă numărul   decomponente pentru fiecare dimensiune.

– Numărul   total de elemente ale unui masiv cu n dimensiuni este egal cudim1*dim2*...*dimn.

–   Pentru memorarea unui masiv cu tipul tip cu n dimensiuni sunt necesarisizeof(tip)*dim1*dim2*...*dimn octeţi.

–   Accesarea unui element al masivului se face cu construcţia nume[i1][i2]…[in], unde i1, i2, …,

in sunt coordonatele elementului pe fiecare dintre dimensiuni (0 ≤ i j < dim j, 1≤j≤n).

Declaraţia

int masiv[3][3][3];

  creează masivul tridimensional cu 3x3x3 elemente de tip real, toate de tip int.   se rezervă o zonă contiguă de memorie de dimensiune sizeof(int)*27=4*27=108 octeţi.

Page 6: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 6/64

   ©    A

  c  a   d  e  m

   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă

  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   6

Initializare masive de date

Vectorii•   tip vector[n]={v1,v2,...,vp}; p<=n;•   tip vector[]={v1,v2,...,vp}; p<n;Matrici•   tip matrice[m][n]={M 0,M1,...,Mp}•

  tip matrice[][n]={M 0,M1,...,Mp}•   Mh={vh1,vh2,...,vht}  mulţimea  valorilor primelor t elemente

de pe linia h. Dacă t>n-1 se semnalează eroare. Dacă t<n-1ultimele n-t elemente de pe linia h se  iniţializează  cu valorinule.

Masive•   tip masiv [dim1][dim2]…[dimn]={{...},{...},...,{...}};•   tip masiv [][dim2]…[dimn]={{v1,…,vp},{vp+1...},...,{...vn}};

Dacă numărul de valori folosite la iniţializare depăşeşte numărul de elemente din masiv atunci compilatorulgenerează un mesaj de eroare. Dacă numărul de valori folosite la iniţializare este mai mic decât numărul deelemente din masiv, atunci restul valorilor sunt iniţializate cu 0.

Page 7: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 7/64

   ©    A

  c  a   d  e  m

   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă

  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   7

Elementele unui vector•   Citeste/initializeaza elementele unui vector

•   Varianta 1

for(i=0;i<n;i++){printf("a[%d]=",i);

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

•   Varianta 2

•   i=0;•   while (i<n)•   {•   printf("a[%d]=",i);•   scanf("%d",&a[i]);•   i++;•

  }

Page 8: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 8/64

   ©    A

  c  a   d  e  m

   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă

  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   8

Elementele unui vector•   Scrie elementele unui vector

•   Varianta 1

for(i=0;i<n;i++){printf("Elementul a[%d]=%d\n",i,a[i]);

}

•   Varianta 2

•   i=0;•   while (i<n)•   {printf (“Elementul a[%d]=%d\n",i,a[i]);•   i++;•   }

Page 9: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 9/64

   ©    A

  c  a   d  e  m

   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă

  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   9

Exercitii•   Citeste si scrie elementele unui vector

Page 10: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 10/64

   ©    A

  c  a   d  e  m

   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă

  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   10

Exercitii•   Citeste si scrie elementele unui vector

#include <stdio.h>#include<conio.h>int i,n,a[25];main(){printf("Stabiliti numarul de elemente ale vectorului:");scanf("%d",&n); // citire/initializare elemente vector

for(i=0;i<n;i++){printf("a[%d]=",i);scanf("%d",&a[i]);} // afisare elemente vectorprintf("Elementele vectorului sunt:\n");for(i=0;i<n;i++)

printf("a[%d]=%d\n",i,a[i]);

 //system("pause");return 0;}

Page 11: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 11/64

   ©    A

  c  a   d  e  m

   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă

  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   11

Exercitii•   Citeste si scrie elementele unui vector de tip char

#include <stdio.h>#include <conio.h>int main(){

char s[50]; // Declararea sirului de caractere sputs(" Inserati sirul:");gets(s);

printf(" Sirul inserat este: %s\n",s);getch(); //system("pause");return 0;}

Page 12: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 12/64

   ©    A

  c  a   d  e  m

   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă

  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   12

Exercitii•   Numarul de cuvinte dintr-un vector de tip char

#include "stdio.h"#include "conio.h"int main(){char sir[100];int nc,i;puts(" Sirul :");gets(sir);i=0;if(sir[i]==' ' || sir[i]==',' || sir[i]==';')nc=-1;else nc=0;while(sir[i]!='\0'){if(sir[i]==' ' || sir[i]==',' || sir[i]==';'){nc++;

i++;while(sir[i]==' ' || sir[i]==',' || sir[i]==';')i++;}i++;}nc++;printf("Numar cuvinte in sir=%d \n",nc);getch();

}

Page 13: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 13/64

   ©    A

  c  a   d  e  m

   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă

  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   13

Exercitii•   Suma elementelor unui vector

Page 14: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 14/64

   ©    A

  c  a   d  e  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă

  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   14

Exercitii•   Suma elementelor unui vector

#include <stdio.h>#include<conio.h>int s=0,i,n,a[25];main(){printf("Stabiliti numarul de elemente ale vectorului, n<=25:");scanf("%d",&n); // initializare elemente vector

for(i=0;i<n;i++){printf("a[%d]=",i);scanf("%d",&a[i]);} /* afisare elemente vectorprintf("Elementele vectorului sunt:\n");for(i=0;i<n;i++)

printf("a[%d]=%d\n",i,a[i]);*/

 //suma elemente vectorfor(i=0;i<n;i++)s=s+a[i];printf("Suma elementelor vectorului=%d\n",s); //system("pause");

return 0;}

Page 15: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 15/64

   ©    A

  c  a   d  e  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă

  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   15

Exercitii•   Suma elementelor cu valoare para, produsul elementelor cu

valoare impara ale unui vector

Page 16: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 16/64

   ©    A

  c  a   d  e  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă

  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   16

Exercitii•   Suma elementelor cu valoare para, produsul elementelor cu

valoare impara ale unui vector•   #include <stdio.h>•   #include <conio.h>•   int main()•   {•   int v[100]; // Declararea vectorului v•   int s,p,i,n; // s-suma, p-produsul, i-index in vector, n-numar de componente•   printf(" Introduceti numarul de componente ale vectorului ");•   scanf("%d",&n);•   printf(" Tastati componentele vectorului \n");•   for(s=0,p=1,i=0;i<n;i++)•   {•   printf(" v[%d] = ",i);•   scanf("%d",&v[i]);•   if(v[i]%2) // Elementul v[i] impar•

  p*=v[i];•   else // Elementul v[i] par•   s+=v[i];•   }•   printf(" Suma componentelor pare este %d \n",s);•   printf(" Produsul componentelor impare este %d \n",p);•   getch();•   return 0;•   }

Page 17: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 17/64

   ©    A

  c  a   d  e  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă

  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   17

Exercitii•   Sortarea elementelor unui vector in ordine crescatoare

Page 18: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 18/64

   ©    A

  c  a   d  e  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă

  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   18

Exercitii•   Sortarea elementelor unui vector in ordine crescatoare

#include <stdio.h>#include <conio.h>int main(){

int i,j,n,pmin;float v[100], aux;printf("Introduceti numarul de termeni:");scanf("%d",&n);printf("Introduceti componentele:\n");for(i=0; i<n; i++){

printf("v[%d]=",i);scanf("%f",&v[i]);

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

for(j=i+1;j<n;j++)if(v[i]>v[j]) //sortare in ordine crescatoare{

aux=v[i];

v[i]=v[j];v[j]=aux;}

printf("Vectorul sortat crescator este:\n");for(i=0;i<n;i++)

printf("a[%d] = %.2f\n",i,v[i]);getch();

 //system("pause");return 0;}

Page 19: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 19/64

   ©    A

  c  a   d  e  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă

  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .

  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   19

Exercitii•   Zilele saptamanii

#include <stdio.h>#include <conio.h>int main(){int n;char *zile[] = {"Eroare", "Luni", "Marti", "Miercuri", "Joi", "Vineri","Sambata", "Duminica"};printf("Introduceti un numar intre 1 si 7:");scanf("%i", &n);if(n>=1 && n<=7)printf(zile[n]);elseprintf(zile[0]);getch();}

Page 20: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 20/64

   ©    A

  c  a   d  e  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă

  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .

  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   20

Exercitii•   determinarea valorii minime  şi poziţia  sa într-un vector de

numere reale:#include <stdio.h>#include <conio.h>int main(){int i,n,pmin;

float v[100];printf("Introduceti numarul de termeni:");scanf("%d",&n);printf("Introduceti componentele:\n");for(i=0; i<n; i++) {printf("v[%d]=", i);scanf("%f",&v[i]);}for(pmin=0,i=1; i<n; i++)if(v[pmin]>v[i])pmin = i;printf("Minimul este v[%d]=%f.2\n", pmin, v[pmin]);getch();

}

Page 21: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 21/64

   ©    A

  c  a   d  e  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă

  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .

  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   21

Exercitii•   Produsul scalar al elementelor vectorilor v1 si v2

Page 22: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 22/64

   ©    A

  c  a   d  e  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă

  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .

  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   22

Exercitii•   Produsul scalar al elementelor vectorilor v1 si v2

#include <stdio.h>#include <conio.h>int main(){

int i,j,n;float v1[100], v2[100],ps=0;printf("Introduceti numarul de termeni ai vectorilor:");scanf("%d",&n);printf("Introduceti componentele vectorului 1:\n");for(i=0; i<n; i++){

printf("v1[%d]=",i);scanf("%f",&v1[i]);

}printf("Introduceti componentele vectorului 2:\n");for(i=0; i<n; i++){

printf("v2[%d]=",i);scanf("%f",&v2[i]);

}for(i=0;i<n;i++)ps+=v1[i]*v2[i];printf("Produsul scalar al vectorului =%.2f\n",ps);

getch(); //system("pause");return 0;}

Page 23: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 23/64

   ©    A

  c  a   d  e  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .

  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   23

Exercitii•   Produsul scalar al elementelor vectorilor v1 si v2

#include <stdio.h>#include <conio.h>int main(){

int i,j,n;float v1[100], v2[100],ps=0;printf("Introduceti numarul de termeni ai vectorilor:");scanf("%d",&n);printf("Introduceti componentele vectorilor:\n");for(i=0; i<n; i++){

printf("v1[%d]=",i);scanf("%f",&v1[i]);printf("v2[%d]=",i);scanf("%f",&v2[i]);ps+=v1[i]*v2[i];

}printf("Produsul scalar al vectorului =%.2f\n",ps);

getch(); //system("pause");return 0;}

Page 24: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 24/64

   ©    A

  c  a   d  e  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .

  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   24

Exercitii•   Identificarea unui character intr-un vector de tip char•   Afisarea numarului de caractere identice intalnite.

Page 25: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 25/64

   ©    A

  c  a   d  e  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .

  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   25

Exercitii•   Identificarea unui character intr-un vector de tip char

#include <stdio.h>#include <conio.h>int main(){

int n=0,i=0;char s[50],c; // Declararea sirului de caractere sputs(" Inserati sirul:");gets(s);puts(" Caracterul ");

scanf("%c",&c);while(s[i]!='\0'){

if(s[i]==c)n++;

i++;}if(n==0)

printf("Sirul %s nu contine caracterul %c \n",s,c);else

printf(" Numarul de caractere %c din sirul %s este egal cu %d \n",c,s,n);getch();

 //system("pause");return 0;}

Page 26: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 26/64

   ©    A

  c  a   d  e  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .

  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   26

Exercitii•   determină şi sortează descrescător frecvenţele de apariţie ale

tuturor caracterelor dintr-un şir de caractere#include <stdio.h>#include <conio.h>int main(){

int n=0,i=0;char s[50],c; // Declararea sirului de caractere sputs(" Inserati sirul:");gets(s);

puts(" Caracterul ");scanf("%c",&c);while(s[i]!='\0'){

if(s[i]==c)n++;

i++;}if(n==0)

printf("Sirul %s nu contine caracterul %c \n",s,c);elseprintf(" Numarul de caractere %c din sirul %s este egal cu %d \n",c,s,n);

getch(); //system("pause");return 0;}

Page 27: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 27/64

   ©    A

  c  a   d  e  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   27

Exercitii•   Oglinda caracterelor dintr-un şir de caractere#include <stdio.h>#include <conio.h>#include <string.h>int main(){char mesaj[256];

int i, len;printf("Introduceti un text:\n");gets(mesaj);len = strlen(mesaj);for(i = 0; i<len/2; ++i) {char temp = mesaj[i];

mesaj[i] = mesaj[len - i - 1];mesaj[len - i - 1] = temp;}printf("Rezultat:\n%s", mesaj);getch();}

Page 28: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 28/64

   ©    A

  c  a   d  e  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   28

Exercitii•   Criptarea cu n deplasari ASCII intr-un şir de caractere

#include <stdio.h>#include <string.h>#include <conio.h>int main(){char mesaj[256];int i, len, n;printf("Introduceti un text:\n");gets(mesaj);printf("Introduceti n:");scanf("%d", &n);

len = strlen(mesaj);for(i = 0; i<len; ++i)mesaj[i] += n;printf("Rezultat:\n%s", mesaj);getch();}

Page 29: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 29/64

   ©    A

  c  a   d  e

  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   29

Exercitii•   Primul cuvant din propozitie cu majuscula

#include <stdio.h>#include <string.h>#include <ctype.h>#include <conio.h>int main(){char mesaj[256];int i, len, frazanoua = 1;

printf("Introduceti un text:\n");gets(mesaj);len = strlen(mesaj);for(i = 0; i<len; ++i)if(isalpha(mesaj[i]))if(frazanoua){mesaj[i] = toupper(mesaj[i]);

frazanoua = 0;}else{mesaj[i] = tolower(mesaj[i]);}else if(ispunct(mesaj[i]))frazanoua = 1;printf("Rezultat:\n%s", mesaj);getch();

}

Page 30: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 30/64

   ©    A

  c  a   d  e

  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   30

Elementele unei matrici•   Citeste/initializeaza elementele matricii

for(i=0;i<n;i++)for(j=0;j<n;j++){printf("a[%d][%d]=",i,j);scanf("%d",&a[i][j]);

}

•   Scrie elementele matricii

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

{printf("%d=", a[i][j]);}

Page 31: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 31/64

   ©    A

  c  a   d  e

  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   31

Matrici

Algoritmul de citire/scriere a elementelor, de calcul a sumei

elementelor diagonalei principale si secundare ale matricii.Intr-o matrice pătratică, numarul de linii= numarul de coloane (n=m).

Diagonala principala:elementele a[i][i], cu i=1,n   sau  a[i][i], cu i=0,n-1

Diagonala secundara:elementele a[i][n-i+1], cu i=1,n sau   a[i][n-i-1], cu i=0,n-1

Zonele determinate de diagonale:I. Pe diagonala principala   i=j

Sub diagonala principala: i>j

Deasupra diagonalei principale: i<j

II. Pe diagonala secundară j=n-i+1Sub diagonala secundara: j>n-i+1Deasupra diagonalei secundare: j<n-i+1

Page 32: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 32/64

   ©    A

  c  a   d  e

  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   32

Exercitii•   Suma elementele matricii de pe diagonala principala si secundara#include <stdio.h>#include<conio.h>int sp=0,ss=0,i,j,n,a[30][30];main(){printf("Numerul de linii si coloane ale matricii:");scanf("%d",&n);

for(i=0;i<n;i++)for(j=0;j<n;j++){printf("a[%d][%d]=",i,j);scanf("%d",&a[i][j]);}for(i=0;i<n;i++)for(j=0;j<n;j++){if(i==j)sp=sp+a[i][j];}printf("Suma elementelor de pe diagonala principala=%d\n",sp);for(i=0;i<n;i++)

for(j=0;j<n;j++){if(i+j==n-1)ss=ss+a[i][j];}printf("Suma elementelor de pe diagonala secundara=%d\n",ss); //system("pause");return 0;}

Page 33: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 33/64

   ©    A

  c  a   d  e

  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   33

Exercitii // Suma elemente matrice pe coloana k

#include "stdio.h"

int sum(int a[][20], int n,int k){int i,j,s;s=0;for(i=0;i<n;i++)for(j=0;j<n;j++)if(j==k) s+=a[i][j];return s;}int main()

{int n,i,j,a[20][20],k;printf(" Dimensiunea: ");scanf("%d",&n);printf(" Elementele matricei \n");for(i=0;i<n;i++)for(j=0;j<n;j++){printf(" a [ %d ][ %d ] = ",i,j);

scanf("%d",&a[i][j]);}printf(" Coloana pe care se calculeaza suma: ");scanf("%d",&k);if(k>=0 && k<=n-1)printf(" Suma elementelor de pe coloana %d este %d\n",k,sum(a,n,k));elseprintf(" Coloana %d inexistenta \n",k);getch();}

Page 34: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 34/64

   ©    A

  c  a   d  e

  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   34

Exercitii // Suma elemente matrice de pe linia k#include "stdio.h"#include "conio.h"

int sum(int a[][20], int n,int k){int i,j,s;s=0;for(i=0;i<n;i++)for(j=0;j<n;j++)if(i==k) s+=a[i][j];return s;}int main()

{int n,i,j,a[20][20],k;printf(" Dimensiunea: ");scanf("%d",&n);printf(" Elementele matricei \n");for(i=0;i<n;i++)for(j=0;j<n;j++){printf(" a [ %d ][ %d ] = ",i,j);

scanf("%d",&a[i][j]);}printf(" Linia pe care se calculeaza suma: ");scanf("%d",&k);if(k>=0 && k<=n-1)printf(" Suma elementelor de pe linia %d este %d\n",k,sum(a,n,k));elseprintf(" Linia %d inexistenta \n",k);getch();}

Page 35: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 35/64

   ©    A

  c  a   d  e

  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B

   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   35

Functii

Funcţia reprezintă unitatea fundamentală de execuţie a programelor C

prin care se obţine o divizare logică a programelor mari şi complexe.Funcţiile, numite si subrutine, încapsulează prelucrări bine precizate carepot fi reutilizate, impiedicand scrierea repetata a aceluiasi cod in cadrulunui program. Reprezinta o variabila globala a programului.

Practic, nu există program care să nu apeleze atât funcţii din bibliotecile

existente cât  şi funcţii  definite în cadrul  aplicaţiei  respective. Cu altecuvinte, programul (aplicaţia) este de fapt o   colecţie   de   funcţii(subprograme).

În utilizarea unei   funcţii   sunt implicate 2   entităţi:   apelantul   (careapelează /cheamă funcţia) şi  funcţia apelată.

Apelantul (este tot o funcţie), transmite parametri (numiti şi argumente)catre funcţia   apelata.   Funcţia primeşte aceşti parametri,   efectueazăoperaţiile   din corpul   funcţiei şi returnează rezultatul/rezultatele înapoifuncţiei apelante.Pentru a construi şi folosi o funcţie trebuie să cunoaştem trei elementecare sunt implicate în utilizarea   funcţiilor: declararea   funcţiei, apelulfuncţiei si prototipul funcţiei

Page 36: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 36/64

   ©    A

  c  a   d  e

  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B

   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   36

Functii

#include "stdio.h" //----------------------------------void afisare_string(void){printf("Acesta este un string!");}

 //----------------------------------main(){afisare_string();

 //system ("PAUSE"); //return 0;

}

Page 37: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 37/64

   ©    A

  c  a   d  e

  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B

   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   37

Functii

1. Declararea funcţiei

tip   nume_funcţie (lista parametri){declaraţii localeinstrucţiunireturn expresie

}

2. Apelul funcţiei

nume_functie(p1, p2, . . . ,pn);

3. Prototipul funcţieitip  nume_funcţie(lista declaraţii parametri);

Page 38: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 38/64

   ©    A

  c  a   d  e

  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B

   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   38

Exemple

1. Declararea funcţiei

float suma_numere (int a, int b){

float sum;sum=a+b;

return sum;}

2. Apelul funcţiei

suma_numere(a,b);

3. Prototipul funcţiei

float suma_numere (int a, int b);

Page 39: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 39/64

   ©    A

  c  a   d  e

  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B

   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   39

Exemple

#include "stdio.h"

 //----- functia suma ----float suma_numere (int a, int b){

float sum;sum=a+b;return sum;

} //-------------------------int main(){int a,b;printf("Inserati valoarea variabilei a:");

scanf("%d",&a);printf("Inserati valoarea variabilei b:");scanf("%d",&b);printf("Suma numerelor=%.2f\n", suma_numere(a,b));

 //system ("PAUSE"); //return 0;}

Page 40: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 40/64

   ©    A

  c  a   d  e

  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B

   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   40

Exemple

#include "stdio.h" //--------Functia factorial------int factorial(int a){

int i,fact=1;for (i=1;i<=a;i++)fact=fact*i;return fact;

}

 //----------------------------------int main(){int a,b;printf("Inserati valoarea variabilei a:");scanf("%d",&a);printf("Inserati valoarea variabilei b:");

scanf("%d",&b);printf("a!=%d\n",factorial(a));printf (“b!=%d\n",factorial(b));printf (“(a-b)!=%d\n",factorial(a-b)); //system ("PAUSE");return 0;}

Page 41: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 41/64

   ©    A

  c  a   d  e

  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B

   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   41

Functii

 // Functie pentru determinarea lungimii unui sir de caractere

#include "stdio.h"#include "conio.h"void strlen(char *s,int &n){

int i;for(i=0;*(s+i)!='\0';i++);

n=i;}int main(){char s[100];int lung;puts(" Sirul ");gets(s);strlen(s,lung);printf(" Sirul %s are %d caractere \n",s,lung);getch();}

Page 42: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 42/64

   ©    A

  c  a   d  e

  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B

   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b

 .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   42

Functii

#include <stdio.h>#include <conio.h>

 // Declararea variabilei globale vectorint vector[100];void citvector(int k){int i;for(i=0;i<k;i++) {printf(" v [ %d ] = ",i);scanf("%d", &vector[i]);

}}int suma(int k){int s = 0,i;for(i=0;i<k;i++)s+=vector[i];return s;}int main(){int n;printf(" Numar de componente n = ");scanf("%d",&n);citvector(n);printf("Suma componentelor: %d\n", suma(n));getch();

}

Page 43: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 43/64

   ©    A

  c  a   d  e

  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B

   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b

 .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   43

Functii recursive

Recursivitatea este o   tehnică   de programare frecvent   utilizată   în

implementarea   funcţiilor. Tehnica   recursivităţii constă   în autoapelulfuncţiei (de către ea însăşi), în mod direct sau indirect. Tehnica poate fifolosită   în cazul problemelor cu  natură recursivă şi simplifică  scriereaprogramelor prin scrierea directă a formulelor recursive.

De exemplu,   funcţia   factorial   recursivă prezentată   anterior, poate fiimplementată în limbajul C astfel:

long factorial (unsigned int n){if(n==0)return 1;else

return n*factorial(n-1);}

Page 44: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 44/64

   ©    A

  c  a   d  e

  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B

   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b

 .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   44

Functii (CMMDC)

#include <stdio.h>

#include <conio.h>int euclid(int p, int q){int r;while(r=p%q) {p=q;q=r;}return q;}int main(){int m,n;

printf("Valoarea lui m = ");scanf("%d",&m);printf("Valoarea lui n = ");scanf("%d",&n);printf("cmmdc(%d,%d) = %d \n", m, n, euclid(m,n));getch();}

Page 45: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 45/64

   ©    A

  c  a   d  e

  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B

   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b

 .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   45

Functii (CMMDC)

#include <stdio.h>

#include <conio.h>int euclid(int, int); // Prototipul functieiint main(){int m,n;printf("Valoarea lui m = ");scanf("%d",&m);printf("Valoarea lui n = ");

scanf("%d",&n);printf("cmmdc(%d,%d) = %d \n", m, n,euclid(m,n));getch();}int euclid(int p, int q) // Definitia functiei{

int r;while(r=p%q) {p=q;q=r;}return q;}

Page 46: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 46/64

   ©    A

  c  a   d  e

  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B

   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b

 .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   46

Functii recursive (CMMDC)

 // Varianta recursiva a algoritmului lui Euclid#include "stdio.h"#include "conio.h"int cmmdc(int m, int n){if(n==0) return m;else return cmmdc(n,m%n);}int main()

{int m,n;printf(" m = ");scanf("%d",&m);printf(" n = ");scanf("%d",&n);if(cmmdc(m,n)==1)

printf(" Numerele %d si %d sunt prime intre ele\n",m,n);elseprintf(" Numerele %d si %d nu sunt prime intre ele \n",m,n);printf(" cmmdc( %d , %d ) = %d\n",m,n,cmmdc(m,n));getch();}

Page 47: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 47/64

   ©    A

  c  a   d  e

  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B

   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b

 .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   47

Functii

Problema turnurilor din Hanoi

Se dau trei tije notate A, B, C, aşezate în poziţie verticală. Pe tijaA se  găsesc  n discuri care au razele r1>r2>...>rn,   aşezate   înordine   descrescătoare   a razelor începând de la baza tijei.Problema constă în determinarea mutărilor necesare transferuluicelor n discuri de pe tija A pe tija B, în final discurile fiind aşezatepe tija B în  aceeaşi   ordine ca pe tija A. O mutare   constă   înaşezarea unui singur disc pe o tijă goală, sau peste un disc curaza mai mare, pe oricare dintre tije. Nu se poate aşeza un disccu rază mai mare peste un disc cu raza mai mică.

Page 48: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 48/64

   ©    A

  c  a   d  e

  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B

   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b

 .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   48

FunctiiProblema turnurilor din Hanoi

#include <stdio.h>#include <conio.h>void hanoi(int n, char a, char b, char c){if (n==1) {printf("Se muta discul %d de pe %c pe %c\n", n, a, b);} else {

hanoi(n-1,a,c,b);printf("Se muta discul %d de pe %c pe %c\n", n, a, b);hanoi(n-1,c,b,a);}}int main(){int n;printf("Problema turnurilor din Hanoi\n");printf("Numarul de discuri n = ");scanf("%d",&n);hanoi(n,'A','B','C');getch();}

Page 49: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 49/64

   ©    A

  c  a   d  e

  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B

   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b

 .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   49

Functii

Avantajele utilizării funcţiilor:•   Evită  repetarea codului: este   uşor să   faci copy  şi  paste, dar este greu  să

menţii şi să sincronizezi toate duplicarile/copiile;•   Utilizarea de   funcţii   permite   după   cum spuneam dezvoltarea   progresivă   a

unui program mare, fie de jos în sus (bottom up), fie de sus în jos(top down), fie combinat. Astfel, un program mare poate fi mai uşor descris, de înţeles şi de modificat dacă este modular,  adică format din modulefuncţionale relativ mici;

•   O   funcţie poate fi reutilizată  în mai multe aplicaţii (prin adăugarea ei într-obibliotecă de funcţii) ceea ce reduce efortul de programare al unei noi aplicaţii;•   O   funcţie poate fi scrisă şi verificată separat de restul aplicaţiei, ceea ce reduce

timpul de punere la punct al unei   aplicaţii  mari (deoarece erorile pot aparenumai la comunicarea între subprograme corecte);

•   Întreţinerea unei aplicaţii este simplificată, deoarece modificările se fac numai în anumite   funcţii şi   nu   afectează   alte   funcţii   (care nici nu mai trebuie

recompilate);

Page 50: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 50/64

   ©    A

  c  a   d  e

  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B

   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b

 .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   50

Adrese de memorie. Pointeri

Orice variabilă are două elemente caracteristice:•   Valoarea pe care o are variabila la un moment dat (int a=10;)•   valoarea adresei locaţiei de memorie (&a).

O variabilă se memorează într o zonă de memorie de o anumită lungime,funcţie de tipul ei: o variabilă de tip char se memorează pe 1 octet, o

variabila de tip int sau float pe 4 octeţi iar un double pe 8 octeti.

printf("Dimensiunea int=%d\n", sizeof (int));printf("Dimensiunea float=%d\n", sizeof (float));printf("Dimensiunea char=%d\n", sizeof (char));printf("Dimensiunea double=%d\n", sizeof (double));

printf("Dimensiunea u int=%d", sizeof (unsigned int));

Adresa locaţiei de memorie în care este stocată valoarea unei variabile sepoate   obţine   aplicând operatorul de   adresă   (operatorul &) înainteanumelui variabilei (operaţie întâlnită   frecvent în cazul  apelării funcţieiscanf).

Page 51: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 51/64

   ©    A

  c  a   d  e  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B

   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b

 .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   51

Pointeri

Mecanismul transmiterii parametrilor prin intermediul pointerilor este oextensie a transmiterii prin referinţă.Un pointer este o  variabilă   care are ca valoare adresa unei zone dememorie a unui obiect (o variabila sau o functie). Pointerul este ovariabilă care poate memora numai adrese de memorie.

Fie  T  = un tip de data standard(int, double, char, etc.)Fie T* = un nou tip de data de tip pointer (o variabila de tip pointer areca valoare adresele variabilelor de tip pointer).

int *p;   //variabila de tip pointer si poate sa memoreze numai adrese de memorie de variabile ale carorvalori sunt de tip intreg

float *f  //variabila de tip pointer si poate sa memoreze numai adrese de memorie de variabile ale carorvalori sunt de tip float

T*p   //p este o variabila pointer si va contine adrese de memorie alocate unor date de tip T // * semnifica faptul ca variabila p este pointer la tipul de data T

Pointerii se utilizează pentru a face referire (a avea acces) la valoareaunei variabile atunci când se cunoaşte adresa ei.

Page 52: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 52/64

   ©    A

  c  a   d  e  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B

   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b

 .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   52

Operatorii de adresare si dereferenţiere

Pentru a atribui variabilei p valoarea adresei variabilei a, se folosesteoperatorul de adresă într-o expresie de atribuire de forma:p=&a;

În urma acestei   operaţii, se poate spune   că   pointerul p   indică   sprevariabila a.

Un nume de  variabilă referă  direct o valoare

Un pointer  referă   indirect o valoareReferirea unei valori printr-un pointer se  numeşte   indirectare

Pentru a  obţine  valoarea obiectului indicat de un pointer se  utilizeazăoperatorul de  dereferenţiere  (indirectare) (operatorul *):Dacă   p este o variabilă de tip pointer care are ca valoare adresa locaţieide memorie a variabilei întregi   a  ( p  indică spre   a) atunci expresia   *p

reprezintă o valoare întreagă (valoarea variabilei  a).

int a=2, *p;p=&a;*p=6; // variabila a ia valoarea 6

Page 53: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 53/64

   ©    A

  c  a   d  e  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B

   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b

 .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   53

Pointeri

Astfel, un pointer nu reprezintă numai adresa unei variabile ci si:

•   adresa unei zone de memorie;•   tipul variabilei (int, char, double etc.) care este memorată în acea zonă

de memorie.

Pentru a  obţine  valoarea obiectului indicat de un pointer se  utilizeazăoperatorul de dereferenţiere (indirectare) (operatorul *).

int a=2,*p;   /*definesc o variabila de tip intreg si o variabila p pointer la intreg care va contineadrese de memorie in care se memoreaza valori intregi*/

p=&a; //operatorul &, numit "de adresa", furnizeaza adresa zonei de memorie unde este memorata valoarea variabilei a

printf("a=%d, Adresa lui a=%d\n",a,&a);

printf("a=%d, Adresa lui a=%d\n",a,p);printf("a=%d, Adresa lui a=%d\n",*p,&a);

printf("a=%d, Adresa lui a=%d\n",*p,p);   //operatorul unar *, numit "de dereferentiere", sau "de indirectare"

*p=20;  //reinitializare variabila a (a=20)

Page 54: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 54/64

   ©    A

  c  a   d  e  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B

   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b

 .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   54

Pointeri#include <stdio.h>#include<conio.h>int s=0,i,n,a[25];main(){printf("Stabiliti numarul de elemente alevectorului, n<=25:");scanf("%d",&n);

 // initializare elemente vectorfor(i=0;i<n;i++){printf("a[%d]=",i);scanf("%d",&a[i]);}

 // afisare elemente vector

printf("Elementele vectorului sunt:\n");for(i=0;i<n;i++)printf("a[%d]=%d\n",i,a[i]);

 //suma elemente vectorfor(i=0;i<n;i++)s=s+a[i];printf("Suma elementelor vectorului=%d\n",s);

 //system("pause");return 0;}

#include <stdio.h>#include<conio.h>int s=0,i,n,a[25],*p;main(){printf("Stabiliti numarul de elemente alevectorului, n<=25:");scanf("%d",&n);

 // initializare elemente vectorfor(i=0;i<n;i++){printf("a[%d]=",i);scanf("%d",&a[i]);}

 // afisare elemente vectorp=&a[0];printf("Elementele vectorului sunt:\n");for(i=0;i<n;i++)printf("a[%d]=%d\n",i,*p+i);

 //suma elemente vectorfor(i=0;i<n;i++)s=s+*(p+i);printf("Suma elementelor vectorului=%d\n",s);

 //system("pause");return 0;}

Page 55: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 55/64

   ©    A

  c  a   d  e  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B

   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b

 .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   55

Pointeri

#include<stdio.h>#include<stdlib.h>

#include<conio.h>int main(){int n, i, pal=1;int *vector;printf("Dimensiunea vectorului n:");scanf("%i", &n);

vector = (int*) malloc(sizeof(int) * n);for(i=0; i<n; ++i) {printf("Introduceti v[%d]:", i);scanf("%i", &vector[i]);}for(i=0; i<n/2 && pal == 1; ++i)if(vector[i] != vector[n-i-1])pal = 0;if(pal == 1)printf("Vectorul este palindrom.\n");elseprintf("Vectorul nu este palindrom.\n");free(vector);getch();}

Page 56: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 56/64

   ©    A

  c  a   d  e  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B

   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b

 .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   56

Pointeri

Page 57: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 57/64

   ©    A

  c  a   d  e  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B

   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b

 .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   57

Pointeri. Functii

#include "stdio.h" //----------------------------------

int schimba_valori(int *a, int *b){int t;t=*a;*a=*b;*b=t;}

 //----------------------------------int main(){int a,b; //float sum;printf("Inserati valoarea variabilei a:");scanf("%d",&a);printf("Inserati valoarea variabilei b:");scanf("%d",&b);schimba_valori(&a,&b);printf("Valoarea variabilei a:%d\n",a);printf("Valoarea variabilei b:%d\n",b); //system ("PAUSE"); //return 0;}

Page 58: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 58/64

   ©    A

  c  a   d  e  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B

   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b

 .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   58

Pointeri

Page 59: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 59/64

   ©    A

  c  a   d  e  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B

   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b

 .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   59

Operatii cu pointeri

Toate  operaţiile  de manipulare a pointerilor iau în considerare în mod

automat dimensiunea obiectului spre care se indică.Pointerii pot fi folosiţi în expresii aritmetice, asignări şi comparaţii, însănu toţi operatorii pot avea pointeri ca operanzi.

Asupra pointerilor pot fi realizate operaţii de:•   incrementare (++)•

  decrementare (--)•   adăugare a unui întreg (+ sau +=)•   scădere a unui întreg (- sau -=)•   scădere a unui pointer din alt pointer

Operaţiile  permise cu pointeri  sunt:•

  atribuirea pointerilor de acelasi tip;•   adunarea unui pointer cu un întreg sau scăderea unui întreg;•   scăderea sau compararea a doi pointeri care indică spre elementele

aceluiasi tablou;•   atribuirea valorii zero (NULL) sau compararea cu aceasta.

Page 60: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 60/64

   ©    A

  c  a   d  e  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B

   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b

 .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   60

Operatii cu pointeri

Operatorii unari de   incrementare si   decrementare se pot aplica asupravariabilelor de tip pointer, în format prefix si postfix.T * p;p++; p--; // incrementarea/decrementarea lui p cu lungimea in octeti a tipului de data T

++p; --p;Operatorul de incrementare aplicat asupra unui operand de tip pointer la

tipul   T   măreste   adresa   conţinută   de operand cu   numărul   de   octeţinecesar pentru a păstra o dată de tipul  T  (se adună  sizeof(T));

p++; // incrementarea lui p cu lungimea in octeti a tipului de data T

p++=> 1* sizeof(T)

ex:int *p;p++ => p=1*sizeof(int)=> p=1*4=4

Page 61: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 61/64

   ©    A

  c  a   d  e  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B

   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b

 .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   61

Operatii cu pointeri

T tab[N];T * p;int i;p=&tab[i];p++;

 p va contine adresa elementului  tab[i+1];

Dacă   p este un pointer la tipul   T  si   n o valoare întreagă, expresia   p+nmăreste valoarea lui   p cu   n*sizeof(T). Analog, expresia   p-n micsoreazăvaloarea lui  p cu  n*sizeof(T);

Adunarea si scaderea unei constante la un pointern = nr intreg

p+n;p-n;p+/-n=n*sizeof(T)

Page 62: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 62/64

   ©    A

  c  a   d  e  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B

   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b

 .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   62

Pointeri#include <stdio.h>#include<conio.h>int s=0,i,n,a[25];main(){printf("Stabiliti numarul de elemente alevectorului, n<=25:");scanf("%d",&n);

 // initializare elemente vectorfor(i=0;i<n;i++){printf("a[%d]=",i);scanf("%d",&a[i]);}

 // afisare elemente vector

printf("Elementele vectorului sunt:\n");for(i=0;i<n;i++)printf("a[%d]=%d\n",i,a[i]);

 //suma elemente vectorfor(i=0;i<n;i++)s=s+a[i];printf("Suma elementelor vectorului=%d\n",s);

 //system("pause");return 0;}

#include <stdio.h>#include<conio.h>int s=0,i,n,a[25],*p;main(){printf("Stabiliti numarul de elemente alevectorului, n<=25:");scanf("%d",&n);

 // initializare elemente vectorfor(i=0;i<n;i++){printf("a[%d]=",i);scanf("%d",&a[i]);}

 // afisare elemente vectorp=&a[0];printf("Elementele vectorului sunt:\n");for(i=0;i<n;i++)printf("a[%d]=%d\n",i,*p+i);

 //suma elemente vectorfor(i=0;i<n;i++)s=s+*(p+i);printf("Suma elementelor vectorului=%d\n",s);

 //system("pause");return 0;}

Page 63: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 63/64

   ©    A

  c  a   d  e  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B

   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b

 .  r  o

14 decembrie 2015 Lect.dr.ing. Florin Postolache   63

Pointeri. Functii#include <stdio.h>#include<conio.h>int suma_vector(int i, int n, int *p)//suma elemente vector

{int s=0;for(i=0;i<n;){s+=(*p+i);i++;}printf("Suma elemente vector=%d\n",s);return s;} //-----------------------main(){int i,n,a[25],*p;p=&a[0];printf("Stabiliti numarul de elemente ale vectorului, n<=25:");scanf("%d",&n);printf("Inserati elementele vectorului:\n"); // initializare elemente vectorfor(i=0;i<n;i++)

{printf("a[%d]=",i);scanf("%d",&a[i]);}suma_vector(i,n,a); //system("pause");return 0;}

b

Page 64: Lab_9-10_PCLP (1)

7/23/2019 Lab_9-10_PCLP (1)

http://slidepdf.com/reader/full/lab9-10pclp-1 64/64

   ©    A

  c  a   d  e  m   i  a   N  a  v  a   l   ă   “   M   i  r  c  e  a

  c  e   l   B

   ă  t  r   â  n   ”  –

   h  t  t  p  :   /   /  a   d   l .  a  n  m   b

 .  r  o

Intrebari?

Multumesc!