Administratie | Alimentatie | Arta cultura | Asistenta sociala | Astronomie |
Biologie | Chimie | Comunicare | Constructii | Cosmetica |
Desen | Diverse | Drept | Economie | Engleza |
Filozofie | Fizica | Franceza | Geografie | Germana |
Informatica | Istorie | Latina | Management | Marketing |
Matematica | Mecanica | Medicina | Pedagogie | Psihologie |
Romana | Stiinte politice | Transporturi | Turism |
DEFINIREA SI UTILIZAREA DE FUNCTII
EXEMPLE DE PROGRAME
E3.1a Functie fara argumente si fara rezultat asociat numelui sau.
// Stergere ecran in mod text, prin defilare
#include <stdio.h>
// definire functie
void clear()
// utilizare functie
void main ()
Observatii:
- Functia 'clrscr()' nu este standard in limbajul C, dupa cum nici fisierul
antet CONIO.H nu este standard (dar ele exista in Borland-C).
- Dupa stergere ecran cu 'clrscr' cursorul este in prima linie de sus si
ecranul trece in mod pagina (implicit este in modul defilare).
E3.1b Aceeasi functie de la 3.1a, dar plasata dupa programul principal
#include <stdio.h>
void clear(); // declarare functie (prototip)
// utilizare functie
void main ()
// definire functie (cu declaratie ca in C++)
void clear()
E3.2 Functie de tip 'void' cu un argument
#include <stdio.h>
// Desenarea unei bare orizontale compuse din n caractere
void bar (int n)
// Desenare histograma pe baza unui vector de intregi
void main () ,n=5,k;
clear(); // sterge ecran
for (k=0;k<n;k++)
bar (a[k]); // desenare bara k de lungime a[k]
}
E3.3 Functie de tip 'void' cu doua argumente de tipuri diferite
// Desenarea unei bare orizontale din n caractere ch
void bar1 (int n, char ch)
E3.4 Functie de tip 'void' cu argument de tip vector
// Desenare histograma pe baza unui vector de intregi
void hist (int a[], int n)
E3.5 Functie cu rezultat si argument de tip vector
// Determinare valoare minima dintr-un vector dat
float minim (float x[], int n)
// utilizare functie
void main () , tmin;
printf ('%f n', minim(t,6));
}
E3.6 Functie care verifica satisfacerea unei conditii
// Verifica daca un caracter dat este un spatiu alb
int isspace (char ch)
Obs.
- In C exista functii standard pentru verificarea tipului unui caracter dat
(isspace, isalpha,isdigit,), declarate in CTYPE.H.
E3.7 Functie care verifica respectarea unei conditii de catre toate
elementele unui vector dat.
// Verifica daca un vector este ordonat crescator sau nu
int sorted (int a[], int n)
E3.8 Functie cu doua rezultate (cu argumente de tip pointer)
// Determinare minim si maxim dintr-un vector
void minmax ( float x[],int n,float* pmin, float* pmax)
*pmin=xmin; *pmax=xmax;
}
// utilizare functie
void main () ;
float a1,a2;
minmax (a,6,&a1,&a2);
printf('%f %f n',a1,a2);
}
Obs.: Este preferabila scrierea a doua functii separate care transmit prin
numele functiei valoarea minima sau maxima.
E3.9 Functie cu argument vector apelata pentru o linie dintr-o matrice
// Determinare valoare minima dintr-o matrice
float minim (float x[],int n); // prototip functie
void main ()
E3.10 Functie cu argument matrice (cu numar impus de coloane)
// Generare matrice unitate
void matrunit (float u[][30], int n)
}
// afisare matrice patratica (cu 30 de coloane declarate)
void scrmatr (float a[][30], int n)
}
// utilizare
void main ()
}
E3.11 Functie recursiva pentru ridicarea unui numar la o putere intreaga
pe baza relatiei de recurenta x^k = x * x^(k-1) si cu x^0=1
double power (double x, int n)
E3.12 Functie recursiva pentru ridicarea unui numar la o putere intreaga
cu numar redus de inmultiri, pe baza relatiei de recurenta
x^k = x^(k/2) * x^(k/2) daca k este par si x^k= x * x^(k-1) daca k impar
double power (double x, int n)
else
return (x * power (x,n-1));
}
PROBLEME PROPUSE
P3.1 Functie pentru determinarea numarului de cifre al unui numar dat (de
orice tip intreg). Program pentru citirea unui intreg n si afisarea a n
numere aleatoare intre 0 si n, cu determinare numar de coloane in functie
de valorile afisate. ( nr de coloane = 80/(nr.cifre+2) )
Se va utiliza functia 'random' declarata in <math.h>
P3.2 Functie care verifica daca un numar dat este prim sau nu. Program
pentru afisarea descompunerilor numerelor pare mai mici ca un intreg dat
in sume de doua numere prime (Ipoteza lui Goldbach = orice numar par se
poate scrie ca suma a doua numere prime).
P3.3 Functie care primeste doi intregi a si b si determina alti doi
intregi k si c astfel ca a = c * b^k ( b este un divizor posibil al lui a,
k este ordinul de multiplicitate, c este numarul ramas dupa k impartiri
repetate a lui a prin b). Program pentru descompunerea unui numar dat in
factori primi (cu puterile lor) folosind functia. Exemplu:
360 = 2^3 * 3^2 * 5^1
P3.4 Functie care determina pozitia valorii maxime intr-un vector. Program
pentru ordonarea unui vector de numere prin determinarea repetata a valorii
maxime dintr-un vector si schimbarea cu ultimul element din vector.
P3.5 Functie care determina semnul unui numar intreg ('sign') si are
rezultat 0 (valoare zero), -1 (numar negativ) sau +1 (numar pozitiv).
Functie care determina numarul cadranului in care se afla un punct de
coordonate intregi date x,y; rezultatul este 0 daca punctul se afla pe
una din axe sau la intersectia axelor. Indicatie: Se face o selectie
('switch') dupa valoarea 3*sign(x)+sign(y). Program de verificare.
P3.6 Functie pentru cautare binara intr-un vector ordonat in doua moduri:
iterativ si recursiv. Cautarea binara se face prin compararea valorii
cautate cu valoarea din mijlocul vectorului cercetat si alegerea primei
sau ultimei jumatati din vector pentru pasul urmator, in functie de
rezultatul comparatiei. Procesul de injumatatire a vectorului se opreste
fie la gasirea valorii cautate, fie la reducerea dimensiunii pana la 1.
Functia primeste ca argumente valoarea cautata, adresa vectorului si
indicii (pozitiile) din vector intre care se cauta.
P3.7 Functii pentru operatii cu multimi de 256 intregi realizate printr-un
sir de 256 de biti (16 intregi fara semn sau 32 de octeti). Bitul k din
sir este 1 daca multimea contine elementul cu valoarea k si este zero
daca multimea nu contine valoarea k. Bitul k din sir se afla in bitul cu
numarul k%16 din intregul k/16 din vectorul de 16 intregi. Operatii
(functii): initializare multime vida, adaugare intreg la multime, verifica
apartenenta unui numar la o multime, afisare multime (intre acolade),
reuniune, intersectie si diferenta de multimi.
Program pentru verificarea acestor functii
P3.8 Functii pentru operatii cu multimi de numere intregi reprezentate
prin vectori neordonati de lungime fixa, in care elementele multimii sunt
grupate la inceputul vectorului, dupa care urmeaza zerouri. Operatii:
initializare multime vida, verificare apartenenta la o multime, adaugare
element la o multime (daca nu exista deja), afisare multime (intre acolade),
reuniune, intersectie si diferenta de multimi. Program pentru verificarea
acestor functii.
P3.9 Functie pentru determinarea divizorilor unui numar intreg dat.
Functie pentru calculul valorii unui polinom cu coeficienti intregi.
P(x)= a[0]*x^n+a[1]*x^(n-1)+ +a[n-1]*x + a[n]
Functie pentru determinarea coeficientilor polinomului cat ('b') al
impartirii unui polinom (dat prin coeficientii 'a') prin (x-r). Se vor
folosi relatiile de recurenta urmatoare:
b[0]=a[0]; b[k]=a[k]+b[k-1]*r k=1,n-1
Program care determina si afiseaza radacinile unei ecuatii polinomiale
cu coeficienti intregi, aflate printre divizorii termenului liber; se
vor afisa divizorii (cu valori pozitive sau negative) care anuleaza
valoarea polinomului dat. exemplu: x^3+3x^2+2x+6 are ca radacina x=-3
(dar nu are radacinile 2,-2,3). Coeficientul puterii maxime a lui x va fi 1.
P3.10 Functie pentru calculul valorii polinomului de interpolare Lagrange
pentru o valoare data xx folosind relatia :
yy = Suma (y[k]*Prod((xx-x[i])/(x[k]-x[i]) )
Suma pentru k=1,n. Produs pentru i=1,n si i!=k
Program pentru citirea a 2 vectori x si y ce definesc o functie prin n
puncte si calculeaza valorile functiei la mijlocul intervalelor de pe
axa X prin interpolare Lagrange. Se vor afisa coordonatele celor n-1
puncte astfel determinate.
P3.11 Functie pentru inmultirea unui polinom cu coeficienti dati cu un
binom de forma (x+c). Program pentru calculul coeficientilor polinomului
care are ca radacini numerele intregi c[1],c[2],c[n] (citite ca date
initiale). (Termenul liber trebuie sa fie egal cu produsul r[1]*r[2]*,
iar coeficientul lui x^(n-1) sa fie egal cu suma r[1]+r[2]+r[n])
Pentru c[1]=c[2]=..=c[n]=1 coeficientii afisati sunt coeficientii puterii
n a binomului (x+1)
P3.12 Functie recursiva pentru determinarea celui mai mare divizor comun
a 2 intregi, pe baza relatiei cmmdc(a,b) = cmmdc (b,a%b) daca a%b != 0
si cmmdc(a,b) =b daca a%b==0.
P3.13 Functie recursiva pentru afisare in binar a unui intreg primit ca
argument. Algoritm: echivalentul binar al lui m se obtine din echivalentul
binar al lui m/2 urmat de cifra binara m%2. Scrieti si o forma iterativa
pentru acest algoritm de impartiri succesive la 2 si afisare de resturi
in ordinea inversa obtinerii lor.
P3.14 Functie recursiva pentru cautarea secventiala intr-un vector a unei
valori date, cu rezultat pozitia in vector a numarului cautat sau -1 daca
negasit. Rezultatul cautarii intr-un vector a cu n elemente este fie
a[n-1] fie egal cu rezultatul cautarii in primele n-1 elemente (daca n>0).
P3.15 Functie pentru inmultirea a doua matrice patratice cu acelasi numar
de linii si coloane. Functie pentru ridicarea unei matrice patratice la
o putere intreaga, prin inmultiri repetate (folosind prima functie).
Program pentru verificare pe o matrice unitate.
P3.16 Functie care schimba intre ele doua linii i si j dintr-o matrice
patratica. Program care foloseste functia pentru a aduce pe diagonala
principala numai elemente nenule (daca este posibil). Se va afisa matricea
obtinuta prin schimbari de linii.
SOLUTII LA PROBLEME PROPUSE
R3.1
// determinare nr de cifre la p.intreaga a unui nr. dat
int digits (double x)
return nc;
// varianta mai simpla ptr functia digits
int digits(double x)
// afisare vector de numere cu tabelare automata
void main ()
// printf ('nr. max. cifre=%d n',max);
// afisare vector
nv=80/(max+1); // nr. maxim de coloane
for ( i=0;i<n;i++)
R3.2
// verifica daca este numar prim
int prim ( int n)
// verif. ipotezei lui Goldbach
main ()
R3.3
// factorul de multiplicitate al lui b in a
int mult (int a, int b, int * c)
*c=a;
return k;
// descompunere in factori primi
void main ()
printf('n');
// varianta pentru functia 'mult' (cu alt mod de folosire)
void mult (int a, int b, int * m, int *c)
*c=a; *m=k;
R3.4
// determina pozitie maxim in vector de numere
int imax ( float x[], int n)
// ordonare vector
void sort ( float x[], int n)
// verificare
void main () ;
int i, n = sizeof(t)/sizeof(t[0]);
sort (t,n);
for (i=0;i<n;i++)
printf ('%.2f ',t[i]);
R3.5
#include <stdio.h>
#include <math.h>
// semn numar algebric = -1 sau 1 sau 0
int sign (int x)
// determinare cadran
int cadran ( int x, int y)
// verificare functii
void main () while (1);
R3.6
// cautare binara, nerecursiva
int caut(int b,int a[],int i,int j)
return -1;
// cautare binara, recursiva
int caut(int b,int a[],int i,int j)
R3.7
// operatii cu multimi de biti
#include <stdio.h>
#define DIM 16
typedef unsigned int Set[DIM];
// initializare multime vida
void init (Set m)
// adauga la multimea m valoarea x
void add (Set m,int x)
// reuniune de multimi ( c=a+b)
void or (Set a, Set b, Set c)
// intersectie de multimi (c=a&b)
void and (Set a, Set b, Set c)
// diferenta simetrica de multimi
void xor (Set a, Set b, Set c)
// diferenta de multimi (c=a-b)
void dif (Set a, Set b, Set c)
// verifica aparteneta la multimea m a lui x
int is (Set m,int x)
// afisarea multimii m
void print (Set m)
n');
// verificarea unor functii
main()
R3.8
// operatii cu multimi reprezentate prin vectori neordonati
#include <stdio.h>
#define M 256 // dimensiune maxima vectori (multimi)
// initializare multime vida
void init (int a[])
// test daca o valoare data apartine unei multimi
int contine (int a[], int x)
// dimensiunea (cardinalul) unei multimi
int dim (int a[])
// adaugare element la o multime
void plus (int a[], int x)
// eliminare valoare data dintr-o multime
void minus (int a[], int x)
// afisarea elementelor unei multimi
void scrie (int a[])
printf (' } n');
// reuniune de multimi
void plusm (int a[],int b[], int c[])
// intersectie de multimi
void inters (int a[],int b[], int c[])
// diferenta de multimi a-b
void minusm (int a[], int b[], int c[])
// comparatie la egalitate multimi
int egal (int a[], int b[])
// citire multime vector
int citmul (int a[]) while (a[i-1]);
return i;
// verificare functii
void main ()
R3.9
#include <stdio.h>
// calcul valoare polinom ptr un x dat
long valPol ( int c[], int n, int x)
// vector cu divizorii unui intreg dat (pozitivi si negativi)
int div (int n, int d[])
return j;
// impartire polinom prin x-r
void impPol (int a[],int n, int b[], int r)
// radacini intregi ec. polinomiala
void main ()
}
} while (nr>0);
// scrie coeficienti polinom fara radacini intregi
// return ;
if (n >1)
R3.10
#include <stdio.h>
// Interpolare Lagrange
float lagrange ( float x[], float y[], int n, float xx)
return s;
// program principal
void main ()
// creare vector de n-1 puncte prin interpolare
for (i=1;i<n;i++)
for (i=1;i<=n-1;i++)
printf ('%f %f n', xm[i],ym[i]);
R3.11
#include <stdio.h>
// produs dintre un polinom si un binom
// (a[n]+a[n-1]*x++a[0]*x^n)(x+c) = b[n+1]+b[n]*x++b[0]*x^(n+1)
int prodpoli (int a[], int n, int c, int b[])
// calcul produs (x+c[0])*(x+c[1])* (x+c[n-1])=b[n]+b[n-1]*x++b[0]*x^n
void produs (int c[], int n, int b[])
// verificare functii
void main ()
R3.12
int cmmdc (int a,int b)
R3.13
// recursiv
void binar (int n)
else
printf('0');
// iterativ (cu vector)
void binar2 ( int n)
printf ('%dn',i);
// scrie vector in ordine inversa
while (i>0)
printf ('%d',c[--i]);
R3.14
// cautare secventiala recursiva intr-un vector
int lsearch (int a[], int n, int b)
R3.15
#include <stdio.h>
#define M 20 // dimensiuni matrice
typedef float num;
typedef num mat[M][M]; // definire tip 'mat'
// generare matrice unitate
void matunit ( mat u,int n)
// produs matrice patratice
void prodmat ( mat a, mat b, mat c,int n)
// copiaza din t in c
for (i=0;i<n;i++)
for (j=0;j<n;j++)
c[i][j]=t[i][j];
// afisare matrice
void scrmat (mat a, int n)
// ridicare la putere matrice
void expmat (mat a,int n,int k, mat p)
// verificare functii
void main () ,,};
mat b,c ;
matunit(b,n);
prodmat (a,b,a,n);
scrmat (a,n);
// ridicare la putere matrice
expmat (a,n,2,c);
scrmat(c,n);
R3.16
#include <stdio.h>
#define M 10 // nr maxim linii/coloane
typedef float mat[M][M];
// schimba intre ele doua linii dintr-o matrice patratica
void schimb ( mat a, int n, int i, int j)
// aducere valori nenule pe diagonala unei matrice patratice
// rezultat 1 daca a reusit si 0 daca nu a reusit
int transf (mat a, int n)
if (gasit) continue;
else return 0;
}
return 1;
// verificare functie
void main ()
i=transf (a,n); // transforma matricea a
if (i==0)
for (i=1;i<=n;i++)
Acest document nu se poate descarca
E posibil sa te intereseze alte documente despre: |
Copyright © 2024 - Toate drepturile rezervate QReferat.com | Folositi documentele afisate ca sursa de inspiratie. Va recomandam sa nu copiati textul, ci sa compuneti propriul document pe baza informatiilor de pe site. { Home } { Contact } { Termeni si conditii } |
Documente similare:
|
ComentariiCaracterizari
|
Cauta document |