Sunteți pe pagina 1din 18

C: Pointeri si functii definite de utilizator aplicatii rezolvate

1) Exemplificare in declarare si folosirea variabilelor pointer.


Transferul se va face intre adrese ale locatiilor de memorie, cu retinere simultana si a valorilor
retinute la acestea (rezolvare...)
2) Exemplificare in declarare si folosirea variabilelor pointer.
Transferul se va face doar intre valori retinute la anumite locatii de memorie (rezolvare...)
3) Transmiterea informatiilor prin intermediul adreselor.
Interschimbarea se va face intre adrese ale locatiilor de memorie, elementul auxiliar
interschimbarii fiind tot o adresa (rezolvare...)
4) Transmiterea informatiilor prin intermediul adreselor.
Interschimbarea se va face intre adrese ale locatiilor de memorie, elementul auxiliar
interschimbarii nefiind o adresa (un pointer) (rezolvare...)
5) Transmiterea informatiilor prin intermediul adreselor.
Interschimbarea se va face intre valorile retinute la locatiile de memorie ale respectivelor adrese,
elementul auxiliar interschimbarii fiind o adresa (un pointer) (rezolvare...)
6) Transmiterea informatiilor prin intermediul adreselor.
Interschimbarea se va face intre valorile retinute la locatiile de memorie ale respectivelor adrese,
elementul auxiliar interschimbarii nefiind o adresa (un pointer) (rezolvare...)
7) Aritmetica pointerilor. Se va scrie o rutina in C pentru exemplificarea aritmeticii in cazul
pointerilor, exemplificare pe cazurile operatiilor de incrementare/decrementare, respectiv
adunare/scadere de valori (rezolvare...)
8) Aritmetica pointerilor. Se va scrie o rutina in C pentru exemplificarea aritmeticii in cazul
pointerilor, exemplificare pe cazurile operatiilor de incrementare/decrementare, respectiv
adunare/scadere asupra unui sir de caractere prin prelucrare pe subsiruri ale acestuia
(rezolvare...)
9) Alocarea memorie dinamice n lucrul cu variabile pointer. S se realizeze un program care
interschimb dou valori reale folosind variabile pointer (rezolvare...)
10) Transferul parametrilor prin valoare (exemplul 1) (rezolvare...)
11) Transferul parametrilor prin valoare (exemplul 2) (rezolvare...)

12) Transferul parametrilor prin adresa (exemplul 1) (rezolvare...)


13) Transferul parametrilor prin adresa (exemplul 2) (rezolvare...)
14) Sa se scrie un program care va realiza interschimbarea coninutului a dou variabile ce pot
reine valori reale. Programul va defini funcii de citire i afiare pentru un numr real, precum i
o funcie proprie pentru interschimbarea coninutului variabilelor, cu rmnerea rezultatului i n
afara execuiei funciei (rezolvare...)
15) Sa se scrie un program care va realiza interschimbarea coninutului a dou variabile ce pot
reine valori reale. Programul va defini funcii de citire i afiare pentru un numr real, precum i
o funcie proprie pentru interschimbarea coninutului variabilelor, cu rmnerea rezultatului i n
afara execuiei funciei. Variabilele sunt declarate global; declarate de un tip standard definit.
(rezolvare...)
16) Sa se scrie un program care va realiza interschimbarea coninutului a dou variabile ce pot
reine valori reale. Programul va defini funcii de citire i afiare pentru un numr real, precum i
o funcie proprie pentru interschimbarea coninutului variabilelor, cu rmnerea rezultatului i n
afara execuiei funciei. Variabilele sunt declarate global; declarate de un tip pointer spre un tip
real (rezolvare...)
17) Ce va afisa programul de mai jos? (rezolvare...)
18) Se cere a se scrie o funcie care va calcula suma cifrelor unui numar. Funcia se va scrie cu
prototip (zona declarativ difereniat de cea definitiv) (rezolvare...)
19) Folosind o funcie s se realizeze un program care calculeaz urmtoarea expresie: (1+ +
1/3+ ++1/n)^n , unde n este un ntreg dat de la tastatur (rezolvare...)
20) S se realizeze un program care calculeaza prin intermediul a dou funcii cmmdc-ul i
cmmmc-ul a dou numere date de la tastatur (rezolvare...)
21) S se realizeze adunarea i nmulirea a dou numere reale folosind variabile de tipul pointer
(rezolvare...)
22) Scriei o funcie care primete ca parametru lungimea laturii unui ptrat i returneaz aria sa
i o funcie care returneaz diagonala (rezolvare...)
23) Scriei o funcie care primete 3 parametri de tip real, cu semnificaia de lungimi pentru 3
segmente. Funcia va returna 1, dac cele trei segmente pot forma un triunghi i 0, n caz contrar
(rezolvare...)
24) Scriei o funcie care returneaz ultima cifr a unui numr natural. De exemplu, dac
numrul este 234, funcia va returna 4 (rezolvare...)

Rezolvari
1) Exemplificare in declarare si folosirea variabilelor pointer. Transferul se va face intre adrese
ale locatiilor de memorie, cu retinere simultana si a valorilor retinute la acestea.
#include<stdio.h>
void main()
{
int a=1;
/* a este o locatie de memorie pentru elemente de tip int pe
doi
octeti, pe care am initializat-o cu valoarea 1 */
int* b;

/* b este o variabila pointer spre tipul int, adica capabila a


retine adrese ale altor variabile de tipul specificat */
//declaram pointerul

b=&a;

/* in adresa b retinem adresa locatiei de memorie (adica a


variabilei) a, deci b devine adresa locatiei de memorie a */
printf("Val a= %d\t Val b= %d\n\n", a,*b);
printf("Adresa a= %p\t Adresa b= %p", &a, b);

getchar();
int k;
scanf("&d", k);

2) Exemplificare in declarare si folosirea variabilelor pointer. Transferul se va face doar intre


valori retinute la anumite locatii de memorie.
#include<stdio.h>
void main()
{
int a=1;
/*a este o locatie de memorie pentru elemente de tip int pe
doi octeti,
pe care am initializat-o cu valoarea 1 */
int x=55;
int *b;
/* b este o variabila pointer spre tipul int, adica capabila a
retine adrese ale
altor variabile de tipul specificat */
//declaram pointerul
b=&x;
variabilei) x,
*b = a;

//initializam pointerul
/* in adresa b retinem adresa locatiei de memorie (adica a
deci b devine adresa locatiei de memorie x */
/* transferul se face intre valori;
valorii retinute la adresa b ii atribuim

a */
printf("Val a= %d\t Val b= %d\n\n", a,*b);

valoarea retinuta in

printf("Adresa a= %p\t Adresa b= %p", &a, b);


getchar();
int k;
scanf("&d", k);
}

3) Transmiterea informatiilor prin intermediul adreselor. Interschimbarea se va face intre adrese


ale locatiilor de memorie, elementul auxiliar interschimbarii fiind tot o adresa.
#include<stdio.h>
void main()
{
int *a, *b, *c;
int x=55;
int y=66;
a=&x;
b=&y;

//initializam a
//initializam b

printf("Introduceti a: ",a);
scanf("%d", a);
printf("Introduceti b: ",b);
scanf("%d", b);
printf("\nInainte de interschimbare: \n");
printf("\tVal a= %d\tVal b= %d\n\n", *a,*b);
printf("\tAdresa a= %p\tAdresa b= %p\n", a, b);
//interschimbarea
c=a;
a=b;
b=c;
printf("\nDupa interschimbare: \n");
printf("\tVal a= %d\tVal b= %d\n\n", *a,*b);
printf("\tAdresa a= %p\tAdresa b= %p\n", a, b);

getchar();
int k;
scanf("&d", k);

4) Transmiterea informatiilor prin intermediul adreselor. Interschimbarea se va face intre adrese


ale locatiilor de memorie, elementul auxiliar interschimbarii nefiind o adresa (un pointer).
#include<stdio.h>
void main()
{
int *a, *b, c;
int x=2, y=5;

a=&x;
b=&y;

//initializam a
//initializam b

printf("Introduceti a: ",a);
scanf("%d", a);
printf("Introduceti b: ",b);
scanf("%d", b);
printf("\nInainte de interschimbare: \n");
printf("\tVal a= %d\tVal b= %d\n\n", *a,*b);
printf("\tAdresa a= %p\tAdresa b= %p\n", a, b);
//interschimbarea
valida

c=*a;

// transfer intre valori, pt ca expresia &c=a; nu ar fi fost

a=b;
b=&c;
printf("\nDupa interschimbare: \n");
printf("\tVal a= %d\tVal b= %d\n\n", *a,*b);
printf("\tAdresa a= %p\tAdresa b= %p\n", a, b);
getchar();
int k;
scanf("&d", k);
}

5) Transmiterea informatiilor prin intermediul adreselor. Interschimbarea se va face intre valorile


retinute la locatiile de memorie ale respectivelor adrese, elementul auxiliar interschimbarii fiind
o adresa (un pointer).
#include<stdio.h>
void main()
{
int *a, *b, *c;
int x=2, y=5, z=7;
a=&x;
b=&y;
c=&z;

//initializam a
//initializam b
//initializam c

printf("Introduceti a: ",a);
scanf("%d", a);
printf("Introduceti b: ",b);
scanf("%d", b);
printf("\nInainte de interschimbare: \n");
printf("\tVal a= %d\tVal b= %d\n\n", *a,*b);
printf("\tAdresa a= %p\tAdresa b= %p\n", a, b);

//interschimbarea
*c=*a; // transfer intre valori
*a=*b;
*b=*c;
printf("\nDupa interschimbare: \n");
printf("\tVal a= %d\tVal b= %d\n\n", *a,*b);
printf("\tAdresa a= %p\tAdresa b= %p\n", a, b);

getchar();
int k;
scanf("&d", k);

6) Transmiterea informatiilor prin intermediul adreselor. Interschimbarea se va face intre valorile


retinute la locatiile de memorie ale respectivelor adrese, elementul auxiliar interschimbarii
nefiind o adresa (un pointer).
#include<stdio.h>
void main()
{
int *a, *b, c;
int x=2, y=5;
a=&x;
b=&y;

//initializam a
//initializam b

printf("Introduceti a: ",a);
scanf("%d", a);
printf("Introduceti b: ",b);
scanf("%d", b);
printf("\nInainte de interschimbare: \n");
printf("\tVal a= %d\tVal b= %d\n\n", *a,*b);
printf("\tAdresa a= %p\tAdresa b= %p\n", a, b);
//interschimbarea
c=*a;
*a=*b;
*b=c;

// transfer intre valori

printf("\nDupa interschimbare: \n");


printf("\tVal a= %d\tVal b= %d\n\n", *a,*b);
printf("\tAdresa a= %p\tAdresa b= %p\n", a, b);
getchar();
int k;
scanf("&d", k);

7) Aritmetica pointerilor. Se va scrie o rutina in C pentru exemplificarea aritmeticii in cazul


pointerilor, exemplificare pe cazurile operatiilor de incrementare/decrementare, respectiv
adunare/scadere de valori.
#include<stdio.h>
void main()
{
int a[]={10,20,30,40,50}; /*am declarat un sir de elemente de tip int
pe care

l-am initializat cu valorile aflate in


multime*/
int* b;
// b este pointer spre tipul int
b=a;
//in adresa b retinem sirul a
/* transferul se face astfel deoarece a este o adresa prin numele sau, adresa
primului element din sir*/
for(int i=1; i<=5; i++)
{
printf("%d\n", *b);
/* b-ul prin transfer fiind adresa primului
element,
rezultatul acestei expresii, va fi prima
valoare din sir, adica 10*/
b++;
//se face trecerea la elementul urmator din sir
}
// ne vom intoarce cu pointerul de cursor al sirului in prima
pozitie

b-=5;
//sau b=b-5
printf("Primul element al sirului: %d\n", *b);
/* ne pastram pozitia de pointare in sir, daca vrem sa afisam

elementul

al treilea al sirului*/
printf("Al treilea element al sirului: %d\n", *(b+2));

getchar();
int k;
scanf("&d", k);
}

8) Aritmetica pointerilor. Se va scrie o rutina in C pentru exemplificarea aritmeticii in cazul


pointerilor, exemplificare pe cazurile operatiilor de incrementare/decrementare, respectiv
adunare/scadere asupra unui sir de caractere prin prelucrare pe subsiruri ale acestuia.
#include<stdio.h>
void main()
{
char a[]="ABCDE"; //sirul a retine un sir de caractere, in numar de 5
char* b;
b=a;

va

for(int i=1;i<=5;i++)
{
printf("%s\n",b); /* un sir este o adresa, iar, mesajul acesta

pozitie, adica "ABCDE" */


b++;
}

afisa subsirul incepand cu prima

b-=5;
printf("subsirul incepand cu prima pozitie: %s\n",b);
printf("subsirul incepand cu a treia pozitie: %s",b+2);

getchar();
int k;
scanf("&d", k);
}

9) Alocarea memorie dinamice n lucrul cu variabile pointer. S se realizeze un program care


interschimb dou valori reale folosind variabile pointer.
#include<stdio.h>
#include<stdlib.h> //sau #include<alloc.h>
void main()
{
double *a,*b,*c;
/* vom crea variabile dinamice, adica variabile ce isi vor pastra
memoria extinsa intr-o zona, numita zona HEAP */
a=(double*)malloc(sizeof(double));
spatiu suficient pentru

/* in zona HEAP am rezervat

memorarea unei variabile de


tipul double */
printf("Introduceti a: "); scanf("%lf",a);
b=(double*)malloc(sizeof(double));
printf("Introduceti b: "); scanf("%lf",b);
c=a;
/* pentru c nu este nevoie sa
alocam memorie dinamica,
pentru ca c primeste prin
transfer de la a */
a=b;
b=c;
printf("dupa interschimbare: a= %.2lf\tb= %.2lf",*a,*b);
/* desi in acest caz nu este necesar, pentru ca o variabila dinamica
nu mai este viabila la sfarsitul executiei functiei, totusi noi
putem opta pentru dealocare explicita pentru variabilele create
dinamic */
free(a);
free(b);

getchar();
int k;
scanf("&d", k);

10) Transferul parametrilor prin valoare (exemplul 1).

#include<stdio.h>
void modifica(int x, int y, int z)
{
printf("Valori initiale in functie: %d %d %d\n",x,y,z);
//1 2 3
x+=10;
y+=10;
z+=10;
printf("Valori finale in functie: %d %d %d\n",x,y,z); //11 12 13
}
void main()
{
int a=1,b=2,c=3;
printf("Valori initiale in program: %d %d %d\n",a,b,c);
//1 2 3
modifica(a,b,c);
printf("Valori finale in program: %d %d %d\n",a,b,c); //1 2 3
getchar();
int k;
scanf("&d", k);
}

11) Transferul parametrilor prin valoare (exemplul 2).


#include<stdio.h>
int suma (int s)
{
for(int i=0; i<=10; i++)
s=s+i;
return s;
}
void main()
{
int s=0;
suma(s);
printf("Suma este: %d", s);

//Sume este 0

getchar();
int k;
scanf("%d",k);
}

12) Transferul parametrilor prin adresa (exemplul 1).


#include<stdio.h>
void modifica(int* x, int* y, int* z)

printf("Valori initiale in functie: %d %d %d\n",*x,*y,*z);


*x+=10;
*y+=10;
*z+=10;
printf("Valori finale in functie: %d %d %d\n",*x,*y,*z);

//1 2 3

//11 12

13
}
void main()
{
int a=1,b=2,c=3;
printf("Valori initiale in program: %d %d %d\n",a,b,c);
//1 2 3 modifica(&a,&b,&c);
printf("Valori finale in program: %d %d %d\n",a,b,c);

//11 12

13

getchar();
int k;
scanf("%d",k);

13) Transferul parametrilor prin adresa (exemplul 2).


#include<stdio.h>void suma(int* s)
{
for(int i=0; i<=10; i++)
*s=*s+i;
}
void main()
{
int s=0;
suma(&s);
printf("Suma este: %d\n", s);

//Sume este 55

getchar();
int k;
scanf("%d",k);

14) Sa se scrie un program care va realiza interschimbarea coninutului a dou variabile ce pot
reine valori reale. Programul va defini funcii de citire i afiare pentru un numr real, precum i
o funcie proprie pentru interschimbarea coninutului variabilelor, cu rmnerea rezultatului i n
afara execuiei funciei.
#include<stdio.h>
//citirea unei variabile reale
void citire(float* x, char c)
{
printf("Introduceti %c: ", c);
scanf("%f", x);
}
//afisarea continutului unei variabile reale
void afisare(float x, char c)

printf("Valoarea din %c este: %.2f\n", c,x);


}
//functia de interschimbare a continutului a doua variabile reale
void interschimbare(float *x, float *y)
{
float z;
z=*x;
*x=*y;
*y=z;
}
void main()
{
float a, b;
citire(&a,'a');
citire(&b,'b');
printf("\nINITIAL:\n");
afisare(a,'a');
afisare(b,'b');
printf("\nDUPA INTERSCHIMBARE:\n");
interschimbare(&a,&b);
afisare(a,'a');
afisare(b,'b');
getchar();
int k;
scanf("%d",k);
}

15) Sa se scrie un program care va realiza interschimbarea coninutului a dou variabile ce pot
reine valori reale. Programul va defini funcii de citire i afiare pentru un numr real, precum i
o funcie proprie pentru interschimbarea coninutului variabilelor, cu rmnerea rezultatului i n
afara execuiei funciei. Variabilele sunt declarate global; declarate de un tip standard definit.
#include<stdio.h>
float a,b;
//functia de citire a celor doua variabile
void citire()
{
printf("Introduceti a: ");
scanf("%f", &a);
printf("Introduceti b: ");
scanf("%f", &b);
}
//functia de afisare
void afisare()
{
printf("Valoarile sunt: a=%.2f, b=%.2f\n", a, b);
}
//functia de interschimbare
void interschimbare()
{
float c;

c=a;
a=b;
b=c;

}
void main()
{
citire();
afisare();
printf("\n");
interschimbare();
afisare();
getchar();
int k;
scanf("%d",k);
}

16) Sa se scrie un program care va realiza interschimbarea coninutului a dou variabile ce pot
reine valori reale. Programul va defini funcii de citire i afiare pentru un numr real, precum i
o funcie proprie pentru interschimbarea coninutului variabilelor, cu rmnerea rezultatului i n
afara execuiei funciei. Variabilele sunt declarate global; declarate de un tip pointer spre un tip
real.
#include<stdio.h>
#include<stdlib.h>
float*a,*b;
void alocare()
{
a=(float*)malloc(sizeof(float));
b=(float*)malloc(sizeof(float));
}
void citire()
{
alocare();
printf("dati a: ");
scanf("%f",a);
printf("dati b: ");
scanf("%f",b);
}
void afisare()
{
printf("valorile sunt: a=%.2f, b=%.2f\n",*a,*b);
}
void interschimba()
{
float c;
c=*a;
*a=*b;
*b=c;
}
void main()
{
citire();
afisare();
printf("\n");
interschimba();

afisare();
getchar();
int k;
scanf("%d",k);
}

17) Ce va afisa programul de mai jos?


#include<stdio.h>
int a,b;
int f(int m,int n)
{
m=n+b;
//printf("\nm=%d", m);
n+=1;
//printf("\nn=%d", n);
return n+b+m;
//printf("\nm=%d", n+b+m);
}
void main()
{
a=6;
b=5;
printf("\n%d %d ",a,b);
printf("\n%d ",f(a,b));
printf("\n%d %d ",a,b);

getchar();
int k;
scanf("%d",k);

Raspuns: 6 5 21 6 5

18) Se cere a se scrie o funcie care va calcula suma cifrelor unui numar. Funcia se va scrie cu
prototip (zona declarativ difereniat de cea definitiv).
#include<stdio.h>
//in acest caz rezultatul se va transmite prin tipul rezultat
int suma(int); //suma cifrelor unui nr. intreg
void main()
{
int n, suma_cifrelor=0, nr_invers=0;
printf("Introduceti n: ");
scanf("%d",&n);
suma_cifrelor=suma(n);
printf("\nSuma cifrelor sale este: %d", suma_cifrelor);
getchar();

int k;
scanf("%d",k);
}
/* suma cifrelor unui numar intreg:
Presupunem nr. dorit ca fiind 523 ptr. care sa calculam suma cifrelor
523 : 10 = 52 rest 3
Suma cifrelor intermediara: 0+3=3
52 : 10 = 5 rest 2
Suma cifrelor intermediara: 3+2=5
5 : 10 = 0 rest 5
Suma cifrelor finala: 5+5=10
*/
int suma(int n)
{
int s=0;
while (n)
{
}
return s;

s=s+n%10;
n/=10;

}
/* inversul unui numar intreg:
Presupunem nr. dorit ca fiind 523 ptr. care dorim sa-i aflam inversul
523 : 10 = 52 rest 3
Numarul invers intermediar: 0*10+3=3
52 : 10 = 5 rest 2
Numarul invers intermediar: 3*10+2=32
5 : 10 = 0 rest 5
Numarul invers final: 32*10+5=325
*/

19) Folosind o funcie s se realizeze un program care calculeaz urmtoarea expresie: (1+ +
1/3+ ++1/n)^n , unde n este un ntreg dat de la tastatur.
#include<stdio.h>
#include<math.h>
float suma (int n)
{
float s=0;
float p=1;
for(int i=1; i<=n; i++)
{
p=1/(float)i;
s=s+p;
}
s=pow(s,n);
return s;
}
void main()
{
int n;

printf("\nIntroduceti n: ");
scanf("%d", &n);
printf("\n\tRezultatul expresiei este: %.2f", suma(n));
getchar();
int k;
scanf("%d", k);
}

20) S se realizeze un program care calculeaza prin intermediul a dou funcii cmmdc-ul i
cmmmc-ul a dou numere date de la tastatur.
#include <stdio.h>
#include <math.h>
int cmmdc (int n, int m)
{
while(n!=m)
{
if(n>m)
n=n-m;
else
m=m-n;
}
return n;
}
int cmmmc (int n, int m)
{
int z;
z=(n*m)/cmmdc(n,m);
return z;
}
void main()
{
int n,m;
printf("\nIntroduceti n: ");
scanf("%d", &n);
printf("\nIntroduceti m: ");
scanf("%d", &m);
printf("\nCmmdc este: %d", cmmdc(n,m));
printf("\nCmmmc este: %d", cmmmc(n,m));
getchar();
int k;
scanf("%d", k);
}

21) S se realizeze adunarea i nmulirea a dou numere reale folosind variabile de tipul pointer.
#include<stdio.h>
void main()

int a;
printf("Introduceti a: ");
scanf("%d", &a);
int b;
printf("Introduceti b: ");
scanf("%d", &b);
int* n; //declar pointer
int* m; //declar pointer
n=&a;
m=&b;

//initializez pointer
//initializez pointer

printf("\nSuma este: %d", *n+*m);


printf("\nProdusul este: %d", *n * *m);

getchar();
int k;
scanf("%d", k);

22) Scriei o funcie care primete ca parametru lungimea laturii unui ptrat i returneaz aria sa
i o funcie care returneaz diagonala.
#include<stdio.h>
#include<math.h>
float lungime (int n)
{
float aria;
aria=n*n;
return aria;
}

float diagonala (double n)


{
double diag;
diag=sqrt((n*n)+(n*n));
return diag;
}
void main()
{
int n;
printf("Introduceti n: ");
scanf("%d", &n);
printf("\nAria patratului este: %.2f", lungime(n));
printf("\nDiagonala patratului este: %.2lf", diagonala(n));
getchar();
int k;
scanf("%d", k);

23) Scriei o funcie care primete 3 parametri de tip real, cu semnificaia de lungimi pentru 3
segmente. Funcia va returna 1, dac cele trei segmente pot forma un triunghi i 0, n caz contrar.
#include<stdio.h>
#include<math.h>
int triunghi (float x, float y, float z)
{
if((x>0)&&(y>0)&&(z>0)&&(x<y+z)&&(y<x+z)&&(z<x+y))
return 1;
else return 0;
}
void main()
{
float x;
float y;
float z;
printf("Introduceti x: ");
scanf("%f", &x);
printf("Introduceti y: ");
scanf("%f", &y);
printf("Introduceti z: ");
scanf("%f", &z);
printf("Rezultat: %d",triunghi(x,y,z)),

getchar();
int k;
scanf("%d", k);

24) Scriei o funcie care returneaz ultima cifr a unui numr natural. De exemplu, dac
numrul este 234, funcia va returna 4.
#include<stdio.h>
#include<math.h>
int cifra (int a)
{
int b;
b=a%10;
return b;
}
void main()
{
int a;

printf("Introduceti numarul: ");


scanf("%d", &a);
printf("Ultima cifra este: %d",cifra(a));
getchar();
int k;
scanf("%d", k);