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 conţinutului a două variabile ce pot reţine valori reale. Programul va defini funcţii de citire şi afişare pentru un număr real, precum şi o funcţie proprie pentru interschimbarea conţinutului variabilelor, cu rămânerea rezultatului şi în afara execuţiei funcţiei (rezolvare...)

15) Sa se scrie un program care va realiza interschimbarea conţinutului a două variabile ce pot reţine valori reale. Programul va defini funcţii de citire şi afişare pentru un număr real, precum şi o funcţie proprie pentru interschimbarea conţinutului variabilelor, cu rămânerea rezultatului şi în afara execuţiei funcţiei. Variabilele sunt declarate global; declarate de un tip standard definit. (rezolvare...)

16) Sa se scrie un program care va realiza interschimbarea conţinutului a două variabile ce pot reţine valori reale. Programul va defini funcţii de citire şi afişare pentru un număr real, precum şi o funcţie proprie pentru interschimbarea conţinutului variabilelor, cu rămânerea rezultatului şi în afara execuţiei funcţiei. 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 funcţie care va calcula suma cifrelor unui numar. Funcţia se va scrie cu prototip (zona declarativă diferenţiată de cea definitivă) (rezolvare...)

19) Folosind o funcţie să se realizeze un program care calculează următoarea 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ă funcţii cmmdc-ul şi cmmmc-ul a două numere date de la tastatură (rezolvare...)

21) Să se realizeze adunarea şi înmulţirea a două numere reale folosind variabile de tipul pointer (rezolvare...)

22) Scrieţi o funcţie care primeşte ca parametru lungimea laturii unui pătrat şi returnează aria sa şi o funcţie care returnează diagonala (rezolvare...)

23) Scrieţi o funcţie care primeşte 3 parametri de tip real, cu semnificaţia de lungimi pentru 3 segmente. Funcţia va returna 1, dacă cele trei segmente pot forma un triunghi şi 0, în caz contrar (rezolvare...)

24) Scrieţi o funcţie care returnează ultima cifră a unui număr natural. De exemplu, dacă numărul este 234, funcţia va returna 4 (rezolvare...)

Rezolvari

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


#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;		//initializam pointerul
		/* in adresa b retinem adresa locatiei de memorie (adica a variabilei) x,  
		deci b devine adresa locatiei de memorie x */
 
*b = a;		/* transferul se face intre valori; 
		valorii retinute la adresa b ii atribuim  valoarea retinuta in 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);
}


#include<stdio.h>
void main()
{
	int *a, *b, *c;
	int x=55;
	int y=66;
 
	a=&x;	//initializam a
	b=&y;	//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);
}


#include<stdio.h>
void main()
{
	int *a, *b, c;
	int x=2, y=5;
 
	a=&x;	//initializam a
	b=&y;	//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;	// transfer intre valori, pt ca expresia &c=a; nu ar fi fost valida
	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);
}


#include<stdio.h> 
void main()
{
	int *a, *b, *c;
	int x=2, y=5, z=7;
 
	a=&x;	//initializam a
	b=&y;	//initializam b
	c=&z;	//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);
}


#include<stdio.h>
void main()
{
	int *a, *b, c;
	int x=2, y=5;
 
	a=&x;	//initializam a
	b=&y;	//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;		// 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);
}


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


#include<stdio.h>
void main()
{
	char a[]="ABCDE"; //sirul a retine un sir de caractere, in numar de 5
	char* b;
	b=a;
 
	for(int i=1;i<=5;i++)
	{
		printf("%s\n",b); /* un sir este o adresa, iar, mesajul acesta va
					afisa subsirul incepand cu prima pozitie, adica "ABCDE" */
		b++;
	}
 
	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);
}


#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));	/* in zona HEAP am rezervat spatiu suficient pentru
						 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);
}


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


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


#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);		//11 12 13

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


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


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


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


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


#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 


#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)
		{
			s=s+n%10;
			n/=10;
		}
	return s;
}
/* 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
*/


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


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


#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;	//initializez pointer
	m=&b;	//initializez pointer

 
	printf("\nSuma este: %d", *n+*m);
	printf("\nProdusul este: %d", *n * *m);
 
	getchar();
	int k;
	scanf("%d", k);
}


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


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


#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);
}
Acest site utilizeaza cookie-uri. Navigand in continuare va exprimati acordul asupra folosirii cookie-urilor.