Sunteți pe pagina 1din 16

Ministerul Educaţiei, Culturii și Cercetării al Republicii

Moldova

Universitatea Tehnică a Moldovei


Departamentul Tehnologia Informatiei

RAPORT

Lucrarea de laborator nr. 2 „Pointeri la funcții”

Chişinău – 20XX
/* pr0201
1. Scrieti un program cu pointeri care genereaza 1000 de seturi de
5 numere aleatoare cuprinse între 1 si 40, în final afisând
frecventa cu care a fost generat fiecare numar.
*/
#include <stdio.h>
#include <stdlib.h>
int main() {
int m, c, i, *f; f = (int *)malloc( 41 * sizeof(int) );
// f[i] este frecventa numarului i, pentru i=1,2,3,...,40
printf("Numere random intre 1 si 40 inclusiv\n");
for(i = 0; i < 41; ++i) *(f + i) = 0;
for(i = 0; i < 1000; i++)
{ printf("Set %d :", i);
for (c = 0; c < 5; c++)
{
m = rand() % 40 + 1; // numar aleator intre 1 si 40 inclusiv
*(f + m ) += 1;
printf(" %d ", m);
}
printf("\n");
}
for(i = 1; i < 41; i++) printf("f(%d) = %d\t", i , *(f + i));

return 0;
}
/* pr0202
2. Scrieti un program cu pointeri care sumeaza numerele negative
si pozitive dintr-un tablou.
*/
#include <stdio.h>
#include <stdlib.h>

int main() {

int x[100]={1,6,-9,7,-8,4,-6} , n = 7, i, spoz = 0, sneg = 0; // x =


&x[0]; x[i] = *(x+i)

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


{
if ( *(x+i) < 0 ) sneg += *(x+i);
if ( *(x+i) >= 0) spoz += *(x+i);
}
printf("spoz=%d\tsneg=%d", spoz, sneg);
return 0;
}

/* pr0203
3. Scrieti un program cu pointeri care calculeaza cel mai mare
divizor comun dintr-un sir de numere date.
*/
#include <stdio.h>
#include <stdlib.h>

int main() {
int n, i, j, r, d, pr, cmmdc, *x;
printf("n = "); scanf("%d", &n);
x = (int *)malloc(n * sizeof(int));
for(i = 0; i < n; i++)
{
printf("x[%d] = ", i);
scanf("%d", x + i); // x + i = &x[i]
}
r = x[0]; // gasim cel mai mic x[i]
for(i = 0; i < n; i++)
{
if (r > *(x + i)) r = *(x + i); // *(x +i) este x[i]
}
// cmmdc pentru toti x[i] nu poate fi mai mare ca cel mai mic
x[i]

cmmdc = 1;
for(d = 2; d <= r; d++)
{
pr = 1;
for(j = 0; j < n; j++)
{
if (*(x + j) % d != 0) { pr = 0; break; }
}
if (pr == 1) cmmdc = d;
}
printf("cmmdc = %d", cmmdc);

return 0;
}
/* pr0204
4. Scrieti un program cu pointeri care compara valorile a doua
tablouri date.
*/
#include <stdio.h>
#include <stdlib.h>

int main() {
int *x, *y, i, m, n;

// fie x are n elemente, iar y are m elemente

printf("n = "); scanf("%d", &n);


x = (int *)malloc(n * sizeof(int));

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


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

printf("m = "); scanf("%d", &m);


y = (int *)malloc(m * sizeof(int));

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


{
printf("y[%d] = ", i); scanf("%d", y + i);
}

if( n!= m )
{
printf("Tablourile au un numar diferit de elemente\n");
printf("primul tablou x are %d elemente\n", n);
printf("al doilea tablou y are %d elemente\n", m);
}
else printf("Tablourile x si y au acelasi numar de elemente
%d\n", n);

// comparam cateva elemente din x cu elementele respective


(cu acelasi indice) din y, de exemplu comparam 2 elemente

if (*(x + 0) < *(y + 0)) {


printf("Primul element din x exte mai mic ca primul
element din y\n");
printf("x[%d] = %d este mai mic decat elementul y[%d] =
%d\n", 0, *(x + 0), 0, *(y + 0));
}

return 0;
}
/* pr0205
5. Scrieti un program cu pointeri care efectueaza urmatoarele
operatii: afla daca în prima patrime a unui sir
de caractere sunt mai putin de 10 simboluri si in ultima patrime
a setului de caractere nu sunt simboluri
din segmentul ["a"..."z"]. Totodata sa se calculeze numarul de
simboluri numerice din treimea de mijloc
a setului de caractere date.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main() {
char s[121], sp14[31], su14[31], sm13[41]; int n, np14, nu14,
nm13, i, p;
// s - sirul initial; sp14 - prima patrime a sirului initial
// su14 - ultima patrime a sirului initial; sm13 - treimea din
mijloc a sirului initial
// n - lungimea sirului initial; np14 - lungimea priemi patrime
din sirul initial
// nu14 - lungime ultimei patrimi a sirului initial 9np14 si
nu14 sunt egale)
// nm13 - lungime treimei din mijloc a sirului initial

printf("Introduceti un sir de caractere cu lungimea cel putin


12, cel mult 120:\n");
gets(s); n = strlen(s); np14 = n / 4; nu14 = n / 4; nm13 = n /
3;
printf("\n\nAti introdus sirul de caractere:\n\n%s\n\ncare
are %d caractere\n", s, n);

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


{
sp14[i] = s[i]; // prima patrime a sirului
su14[i] = s[n - 1 - i]; // ultima patrime a sirului; sau
su14[i] = s[n - (nu14 - 1) - 1 + i];
}
sp14[np14] = '\0'; su14[nu14] = '\0';
printf("\nPrima patrime a sirului introdus este: %s\n\n",
sp14);
printf("\nUltima patrime a sirului introdus este: %s\n\n",
su14);
for(i = 0; i < nm13; i++)
{
sm13[i] = s[nm13 + i];
}
sm13[nm13] = '\0';
printf("Treimea din mijloc a sirului este: %s\n\n", sm13);
if (strlen(sp14) < 10)
printf("\nPrima patrime a sirului initial are %d caractere,
mai putin de 10\n", strlen(sp14));
else
printf("\nPrima patrime a sirului initial are %d caractere,
nu mai putin de 10\n", strlen(sp14));

p = 0; // in ultima patrime nu sunt simboluri din segmentul


["a"..."z"]
for(i = 0; i < nu14; i++)
{
if (su14[i] <= 'z' && su14[i] >= 'a') p = 1;
}
if (p == 0)
printf("\nIn ultima patrime a sirului nu sunt simboluri
din segmentul [\"a\"...\"z\"]\n");
else
printf("\nIn ultima patrime a sirului sunt simboluri din
segmentul [\"a\"...\"z\"]\n");

p = 0; // in treimea din mijloc nu sunt simboluri numerice


for(i = 0; i < nm13; i++)
{
if (sm13[i] <= '9' && sm13[i] >= 0) p = p + 1;
}
if (p == 0)
printf("\nIn treimea din mijloc a sirului nu sunt
simboluri numerice\n");
else
printf("\nIn treimea din mijloc a sirului sunt %d
simboluri numerice\n", p);

return 0;
}

/* pr0206
6. Scrieti un program cu pointeri care afiseaza numarul
elementelor pare si impare dintr-un tablou.
*/
#include <stdio.h>
#include <stdlib.h>

int main() {
int n, i, npar = 0, nimpar = 0, *x;
printf("n="); scanf("%d", &n);
x = (int *)malloc(n * sizeof(int));
for(i = 0; i < n; i++)
{
printf("x[%d] = ", i); scanf("%d", x + i);
}
for(i = 0; i < n; i++)
{
if (*(x + i) % 2 == 0) npar +=1;
else nimpar += 1;
}

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


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

return 0;
}

/* pr0208
8. Scrieti un program cu pointeri care efectueaza inmultirea
cifrelor unui numar dat.
*/
#include <stdio.h>
#include <stdlib.h>

int main() {
int c, p = 1, s, *n; // in p va fi produsul cifrelor
n = (int *)malloc(sizeof(int));
printf("n = "); scanf("%d", n);
printf("Ati intorus numarul %d\n", *n);
if( *n == 0 ) p = 0;
while( *n != 0 )
{
p *= *n % 10;
*n /= 10;
}
printf("Prousul cifrelor numarului introdus este %d\n", p);
return 0;
}

/* pr0226
26. Scrieti un program cu pointeri care sa tipareasca toate
tripletele (i,j,k) de numere naturale care verifica conditiile
i*i + j*j = k*k si 1 < i < j < k <= n
*/

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

int main() {
int *i, *j, *k, *n;
i = (int*)malloc(sizeof(int)); j = (int*)malloc(sizeof(int));
k = (int*)malloc(sizeof(int)); n = (int*)malloc(sizeof(int));
printf("*n = "); scanf("%d", n);
for(*k = 4; *k < *n; *k = *k + 1)
{
for(*j = 3; *j < *k; *j = *j + 1)
{
for(*i = 2; *i < *j; *i = *i + 1)
{
if( *i * *i + *j * *j == *k * *k)
printf("(%d, %d, %d)\n", *i, *j, *k);
}
}
}
return 0;
}
/* pr0229
29. Scrieti un program cu pointeri care sa se calculeze si sa se
tipareasca primii n termeni din sirul Fibonacci, sir definit de relatia
de recurenta
t[i + 1] = t[i] + t[i - 1], i = 1, 2, 3, ..., avand t[0] = t[1] = 1.
*/

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

int main() {
int *t, n, i;
printf("n = "); scanf("%d", &n);
t = (int *)malloc(n * sizeof(int)); *(t + 0) = 1; *(t + 1) = 1;
for(i = 1; i < n; i++)
{
*(t + i + 1) = *(t + i) + *(t + i - 1);
}
printf("\nNumerele Fiboncci sunt:\n\n");
for(i = 0; i < n; i++)
{
printf("F(%d) = %d\n", i, *(t + i));
}
// calculeaza corect numai pana la n=46 !!!
//deoarece numerele sunt mari si nu incap in diapazonul
pentru tipul int
return 0;
}

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