Functii de prelucrare în matrice
Functiile de prelucrare în matrice sunt acele functii care fac diferite operatii matematice, operatii de interschimbare, numarare, modificare, stergere, înlocuire asupra elementelor unei matrice modificând-o în cele mai mult 131b12b e cazuri.
Toate aceste functii sunt diferite între ele, nu numai prin ceea ce fac ele, ci si prin parametrii care îi primesc sau prin valorile returnate. Totusi toate functiile din acest capitol primesc ca date de intrare un set standard de date si anume : n numarul de linii, m numarul de coloane si matricea respectiva X sau A, matricea fiind definita static.
Urmatoarele 2 functii primesc ca date de intrare dimensiunile matricei, adica n numarul de linii si m numarul de coloane, si matricea respectiva X , definita static. Functiile sunt bubble_sort_line si bubble_sort_column si ele sorteaza o linie respectiv coloana a matricei prin metoda bulelor. Linia respectiv coloana de sortat este data functiei în interiorul ei de catre utilizator. Cum aceste doua functii nu modifica dimensiunile matricei si lucreaza doar cu valorile elementelor matricei, functiile nu returneaza nici o valoare.
Prima funtie este :
void bubble_sort_line(int n,int m,int x[30][30])
}
iar ce de-a doua functie este :
void bubble_sort_column(int n,int m,int x[30][30])
}
Functiile void lines_sum si columns_sum afla suma elementelor matricei de pe fiecare linie, respectiv de pe fiecare coloana. Pe lânga setul standard de date de intrare (n, m, si X), functiile primesc un vector definit static cu maxim 30 de elemente, int y[30], si adresa unei variabile de tip întreg, int *v
În acel vector se vor memora sumele de pe fiecare linie, respectiv coloana, iar la adresa variabilei se scrie dimensiunea vectorului, care este egala cu numarul de linii/coloane. Astfel la terminarea apelului functiei avem vectorul de sume si dimensiunea lui.
Functiile sunt :
void lines_sum(int n,int m,int x[30][30],int y[30],int *v)
//se retine dimensiunea vectorului
*v=n;
si respectiv :
void columns_sum(int n,int m,int x[30][30],int y[30],int *v)
*v=m; //se retine dimensiunea vectorului
Urmatoarea pereche de functii interchange_lines si interchange_columns interschimba doua linii, respectiv doua coloane ale matricei între ele. si aceste doua functii primesc dimensiunile matricei, n si m, si matricea X în care se lucreaza. Ele mai au ca date de intrare si pozitiile în matrice al celor doua linii/coloane care se interschimba. În interiorul functiilor exista validari ale acestor pozitii.
Cele doua functii sunt :
void interchange_lines(int n,int m,int x[30][30],int a,int b)
}
si
void interchange_columns(int n,int m,int x[30][30],int a,int b)
}
Cele doua functii care urmeaza column_sort si lines_sort au ca parametrii de intrare dimensiunile matricei si matricea în care se lucreaza. Functiile sorteaza coloanele, respectiv liniile matricei în functie de suma elementelor lor. Pentru a face acest lucru functiile apeleaza functia care calculeaza sumele dupa care se sorteaza, adica columns_sum si lines_sort, si functia de interschimbare a doua coloane/linii.
Functiile nu returneaza nici o valoare, ci doar modifica valorile elementelor matricei.
Functiile sunt :
void column_sort(int n,int m,int x[30][30])
void lines_sort(int n,int m,int x[30][30])
Urmeaza o serie de functii care vor avea ca parametrii de intrare : dimensiunile matricei, m si n, matricea si adresa unei variabile de tip integer numita s. La aceasta adresa, functia scrie suma anumitor elemente ale matricei, elemente selectate dupa o caracteristica.
Aceste functii sunt :
main_diag_sum care calculeaza suma elementelor din matrice care se afla pe diagonala principala.
void main_diag_sum(int n,int m,int x[30][30],int *s)
sec_diag_sum care calculeaza suma elementelor din matrice care se afla pe diagonala secundara.
void sec_diag_sum(int n,int m,int x[30][30],int *s)
up_main_diag_sum care calculeaza suma elementelor din matrice aflate deasupra diagonalei principale
void up_main_diag_sum(int n,int m,int x[30][30],int *s)
down_main_diag_sum care calculeaza suma elementelor din matrice aflate sub diagonala principala
void down_main_diag_sum(int n,int m,int x[30][30],int *s)
up_sec_diag_sum care calculeaza suma elementelor din matrice aflate deasupra diagonalei secundare
void up_sec_diag_sum(int n,int m,int x[30][30],int *s)
down_sec_diag_sum care calculeaza suma elementelor din matrice aflate sub diagonala principala
void down_sec_diag_sum(int n,int m,int x[30][30],int *s)
elem_sum care calculeaza suma tuturor elementelor din matrice
void elem_sum(int n,int m,int x[30][30],int *s)
up_with_main_diag_sum care calculeaza suma elementelor din matrice aflate deasupra si pe diagnala secundara
void up_with_main_diag_sum(int n,int m,int a[30][30],int *s)
getch();
down_with_main_diag_sum care calculeaza suma elementelor din matrice aflate sub si pe diagonala principala
void down_with_main_diag_sum(int n,int m,int a[30][30],int *s)
getch();
down_with_sec_diag_sum care calculeaza suma elementelor din matrice aflate sub si pe diagonala secundara
void down_with_sec_diag_sum(int n,int m,int a[30][30],int *s)
getch();
up_with_sec_diag_sum care calculeaza suma elementelor din matrice aflate deasupra si pe diagonala secundara
void up_with_sec_diag_sum(int n,int m,int a[30][30],int *s)
getch();
Asemanatoare cu functiile prezentate anterior, din punctul de vedere al parametrilor de intrare sunt si urmatoarele. Singura diferenta este aceea ca la adresa variabilei de tip integer nu se mai scrie valoarea unei sume de elemente ale matricei ci, valoarea unui element al matricei, cum ar fi valoarea minima sau valoarea maxima.
minim care gaseste valoarea minima a elementelor matricei
void minim(int n,int m,int x[30][30],int *min)
printf("\n The minimum element is %d and it is on line %d and column%d",*min,j1,i1);
maxim care gaseste valoarea maxima a elementelor din matrice
void maxim(int n,int m,int x[30][30],int *max)
printf("\n The maximum element is %d and it is on line %d and column %d",*max,j1,i1);
max_up_main care gaseste valoarea maxima a elementelor matricei aflate deasupra diagonalei principale
void max_up_main(int n,int m,int x[30][30],int *max)
min_up_main care gaseste valoarea minima a elementelor din matrice aflate deasupra diagonalei principale
void min_up_main(int n,int m,int x[30][30],int *min)
max_down_main care gaseste valoarea maxima a elementelor din matrice aflate sub diagonala principala
void max_down_main(int n,int m,int x[30][30],int *max)
min_down_main care gaseste valoarea minima a elementelor matricei aflate sub diagonala principala
void min_down_main(int n,int m,int x[30][30],int *min)
max_down_sec care gaseste valoarea maxima a elementelor matricei aflate sub diagonala secundara
void max_down_sec(int n,int m,int x[30][30],int *max)
min_down_sec care gaseste valoarea minima a elementelor matricei aflate sub diagonala secundara
void min_down_sec(int n,int m,int x[30][30],int *min)
min_main_diag care gaseste valoarea minima a elementelor din matrice aflate pe diagonala principala
void min_main_diag(int n,int m,int a[30][30],int *min)
max_main_diag care gaseste valoarea maxima a elementelor din matrice aflate pe diagonala principala
void max_main_diag(int n,int m,int a[30][30],int *max)
min_sec_diag care gaseste valoarea minima a elementelor din matrice aflate pe diagonala secundara
void min_sec_diag(int n,int m,int a[30][30],int *min)
getch();
max_sec_diag care gaseste valoarea maxima a elementelor din matrice aflate pe diagonala secundara
void max_sec_diag(int n,int m,int a[30][30],int *max)
max_up_sec care gaseste valoarea maxima a elementelor din matrice aflate deasupra diagonalei secundare
void max_up_sec(int n,int m,int a[30][30],int *max)
min_up_sec care gaseste valoarea minima a elementelor din matrice aflate deasupra diagonalei secundare
void min_up_sec(int n,int m,int a[30][30],int *min)
Functiile lines_min, lines_max si columns_min, columns_max vor afla elementele minime si maxime de pe fiecare linie, respectiv coloana si le vor scrie într-un vector. Parametrii de intrare ale acestor functii sunt aceiasi la toate si anume : n numarul de linii al matricei, m numarul de coloane al matricei, X[ ][ ] matricea respectiva, h[ ] vectorul în care se scriu valorile minime sau maxime si adresa unei variabile întregi la care se scrie valoarea numarului de elemente ale vectorului.
Astfel functia lines_min afla minimul elementelor de pe fiecare linie.
void lines_min(int n,int m,int x[30][30],int h[30],int *l)
*l=n;//se scrie dimensiunea vectorului
Functia columns_min gaseste minimul elementelor de pe fiecare coloana
void columns_min(int n,int m,int x[30][30],int h[30],int *l)
*l=m;//dimensiunea vectorului
Functia columns_max gaseste valoarea maxima a elementelor de pe fiecare coloana
void columns_max(int n,int m,int x[30][30],int h[30],int *l)
*l=m; //dimensiunea vectorului
Functia lines_max gaseste valoarea maxima a elementelor de pe fiecare linie
void lines_max(int n,int m,int x[30][30],int h[30],int *l)
*l=n;//dimensiunea vectorului
Functia repl_neg înlocuieste toate elementele negative ale unei matrice. Pentru a face acest lucru ea are ca date de intrare doar dimensiunile matricei si matricea, ea nereturnând vreo valoare. De asemenea functia afiseaza pe ecran numarul de elemente a caror valoare a fost modificata.
Functia nu modifica structura matricei sau adresele fizice ale elementelor sale, ci doar valoarea elementelor.
void repl_neg(int n,int m,int x[30][30])
printf("\n %d elements have been replaced with 0",count);
Urmatoarele doua functii delete_line si delete_column modifica structura unei matrice, în sensul ca sterg o linie/coloana din matrice modificând astfel dimensiunea matricei. Pentru a memora noua dimensiune a matricei, pe lânga parametrii obisnuiti de intrare (n, m si X) functiile mai au ca parametru si adresa unei variabile de tip întreg unde se scrie valoarea noului numar de linii sau coloane. Folosind acest pointer la întreg ca parametru de intrare tipul functiilor este void.
Ambele functii primesc pozitia liniei/coloanei de sters din matrice în interiorul lor, ele cerând acest lucru utilizatorului.
Prima functie care realizeaza stergerea unei linii este :
void delete_line(int n,int m,int x[30][30],int *n1)
A doua functie care sterge o coloana este :
void delete_column(int n,int m,int x[30][30],int *m1)
Functia how_many_0 primind ca date de intrare dimensiunile unei matrice, matricea si adresa unei variabile de tip întreg scrie la aceasta adresa numarul de elemente din matrice care au valoarea 0.
void how_many_0(int n,int m,int x[30][30],int *no)
Functia care urmeaza modifica structura unei matrice în sensul ca adauga o noua linie la matrice. Pentru a face acest lucru ea are ca parametrii de intrare numarul de linii al matricei, n, numarul de coloane, m, matricea si doi pointeri la întregi. La cele doua adrese de variabile de tip întreg se scriu noile valori ale dimensiunilor matricei. La adreasa lui n1 se scrie noul numar de linii, iar la adresa lui m1 se scrie noul numar de coloane. Functia odata apelata cere utilizatorului sa introduca elementele noii linii. Noua linie va avea m elemente.
void add_line(int n,int m,int x[30][30],int *n1,int *m1)
//se adauga noua linie
for(j=0;j<m;j++)
x[n][j]=h[j];
*n1=n+1;//noul numar de linii al matricei
*m1=m;//noul numar de coloane al matricei
Urmatoarea serie de functii primesc ca parametrii de intrare dimensiunile matricei (n si m) si matricea A si returneaza diferite valori calculate pe baza valorilor elementelor matricei.
Functia pos_elem_geom_avr returneaza o valoare de tip float calculata ca medie geometrica a elementelor pozitive ale matricei
float pos_elem_geom_avr(int n,int m,int a[30][30])
//daca sunt elemente pozitive în matrice se calculeaza media geometrica ca fiind radical de ordinul k din produsul valorilor elementelor pozitive//
if(k>1) avr=exp(log(avr)/k);
else avr=-1;//daca nu sunt elemente pozitive atunci functia returneaza -1
return avr;
Functia prime_elem_no returneaza un întreg ce reprezinta numarul de elemente prime din matrice
int prime_elem_no(int n,int m,int a[30][30])
Functia pos_elem_sum returneaza un întreg care reprezinta suma elementelor pozitive
int pos_elem_sum(int n,int m,int a[30][30])
Functia pos_elem_no returneaza un întreg ce reprezinta numarul de elemente pozitive
int pos_elem_no(int n, int m,int a[30][30])
Functia zero_elem_no returneaza un întreg ce reprezinta numarul de elemente ale matricei egale cu 0
int zero_elem_no(int n, int m, int a[30][30])
Functia neg_elem_sum returneaza un întreg care reprezinta suma elementelor negative din matrice
int neg_elem_sum(int n,int m,int a[30][30])
Functia even_elem_no returneaza un întreg care reprezinta numarul de elemente impare din matrice
int even_elem_no(int n, int m,int a[30][30])
Functia odd_elem_no returneaza un întreg care reprezinta numarul de elemente pare din matrice
int odd_elem_no(int n, int m, int a[30][30])
Functia sum_module returneaza un întreg ce reprezinta suma valorilor în modul ale elementelor matricei
int sum_module(int n,int m,int x[30][30])
Functia abs_lines_max_sum returneaza un întreg ce reprezinta suma valorilor în modul ale maximelor de pe linii
int abs_lines_max_sum(int n,int m,int x[30][30])
Functia abs_columns_max_sum returneaza un întreg care reprezinta suma valorilor în modul a maximelor de pe coloane
int abs_columns_max_sum(int n,int m,int x[30][30])
Functia max_on_one_linie primeste ca date de intrare numarul de linii al matricei, n, numarul de coloane al matricei, m, matricea definita static, X, un întreg numit l care reprezinta linia pe care se lucreaza si un pointer la o variabila de tip integer, *r. Functia cauta pe linia l valoarea maxima si la adresa variabilei r scrie numarul coloanei pe care se afla valoarea maxima a liniei respective. De asemenea functia returneaza maximul.
int max_on_one_linie(int n,int m,int x[30][30],int l,int *r)
for(j=0;j<m;j++)
//se cauta maximul pe linia l
if (max<x[l][j])
return max;
Functia max_on_one_column este asemanatoare cu cea precedenta, numai ca ea cauta maximul pe o coloana si la adresa variabilei l se scrie linia pe care se afla maximul din acea coloana
int max_on_one_column(int n,int m,int x[30][30],int c,int *l)
for(i=0;i<n;i++)
//se cauta maximul pe coloana c
if (max<x[i][c])
return max;
Functia lines_max_position returneaza un vector care contine numarul coloanei pe care se afla elementele maxime de pe fiecare linie. Parametrii functiei sunt : n numarul de linii al matricei, m numarul de coloane al matricei, X matricea definita static, vectorul definit static în care se trec coloanele si un pointer la întreg unde se scrie dimensiunea vectorului.
void lines_max_position(int n,int m,int x[30][30],int v[30],int *l)
}
*l=n; //se memoreaza dimensiunea vectorului
Functia max_on_diag pune pe diagonala principala a unei matrice patratice maximele de pe fiecare linie cu ajutorul operatiilor de interschimbare a liniilor sau coloanelor. Parametrii functiei sunt : n numarul de linii al matricei, m numarul de coloane al matricei si X matricea definita static. Functia nu face acest lucru atunci când maximele a doua sau mai multe linii se afla pe aceeasi coloana pentru ca doar cu operatiile de interschimbare aceste maxime nu se pun pe diagonala.
void max_on_diag(int n,int m, int x[30][30])
/*cu ajutorul functiei lines_max_position definita anterior se trec într-un vector maximele de pe fiecare linie*/
lines_max_position(n,m,x,v,&l);
//se verifica în vectorul creat anterior daca doua maxime sunt pe aceeasi coloana
for(i=0;i<l-1;i++)
for(j=i+1;j<l;j++)
if(v[i]==v[j]) vb=0;
if(vb==0)
/*se fac interschimarile de linii si coloane pentru a pune maximele pe diagonala principala */
for(i=0;i<l;i++)
Functia operation primeste pe lânga dimensiunile matricei (n si m) si matricea respectiva, 3 întregi reprezentând numerele a 3 linii si un caracter ce este unul din operatorii matematici +, -, *. Daca cei trei întregi sunt k, i, j atunci functia calculeaza elementele liniei k ca suma/diferenta/produs dintre elementele liniilor i si j dupa formula a[k][r]=a[i][r] operator a[j][r]
void operation(int n,int m,int x[30][30],int k,int i,int j,char oper)
//în functie de opeartor se creaza noua linie
switch(oper)
case '-':
case '*':
default :
}
Functiile change_line si change_column modifica elementele liniei/coloanei primita ca parametru de intrare cu o valoare dorita. Valoarea este primita ca data de intrare.
Functiile sunt :
void change_line(int n,int m,int x[30][30],int line,int value)
si
void change_column(int n,int m,int x[30][30],int column,int value)
Functia balance_sum calculeaza elementele linie line, data ca parametru, ca suma de elementele a altor linii care formeaza la rândul lor o lista de parametrii reprezentata prin . . Primul parametru a functiei este matricea în care se lucreaza si dimensiunile ei (n si m).
Daca functia are urmatorul apel balance_sum(a, n, m, n-1,256,-1) atunci elementele liniei n-1 vor fi egale cu suma elementelor tututor liniilor din matrice. Valoarea -1 indica functiei când se termina lista de parametrii.
Daca functia are urmatorul apel balance_sum(a, n, m, n-1,2,3,-1) atunci elementele liniei n-1 vor fi egale cu suma elementelor liniilor 2 si 3 din matrice. Valoarea -1 indica functiei când se termina lista de parametrii.
void balance_sum(int a[30][30],int n,int m,int line,...)
k=va_arg(lista, int);
else
}
va_end(lista);
Functiile prezentate în acest capitol apartin bibliotecii de functii matrice.h , ele fiind prezente si în clasa matrix însa sunt modificate listele de parametrii pentru a putea facilita lucrul cu obiecte de tip matrix.
|