Librarie de functii si proceduri pentru lucru cu matrici (masive bidimensionale) in limbajul C si C++ – Functii de comparare

No comments - This post in english

Functiile de comparare a matricelor sunt folosite cu scopul de afla informatii despre o matrice sau un set de matrice din punctul de vedere al tipului unei matrice, a tipului elementelor ce o compun sau a numarului de aparitii in cadrul acelei matrice al unei chei definite de utilizator.

Functia symmet verifica daca o matrice patratica este simetrica. Functia primeste ca date de intrare numarul de linii si de coloane al matricei, adica n si m, si matricea X care va fi verificata. Matricea este definita static. Functia returneaza adresa unei variabile de tip intreg, *er, unde se va scrie 1 daca matricea este simetrica si 0 daca matricea nu este simetrica. De asemenea functia verifica si daca matricea nu este patratica, caz in care la adresa acelei variabile se scrie 0.

Functia este :

void symmet(int n,int m,int x[30][30],int *er)
{
int i,j;
			//verifica daca matricea este patratica
if(n!=m) printf("\n The matrix must be a square !");   
else
   	{
	 *er=1;
	for(i=0;i<n;i++)
		for(j=0;j<m;j++)
		if(i<j) if(x[i][j]!=x[j][i]) *er=0;
	if (*er==0) printf("\n The matrix is not symmetrical!");
	    else printf("\n The matrix is symmetrical!");
	}
}

Functia check_unit verifica daca matricea este sau nu matricea unitate. Functia are ca parametrii de intrare dimensiunile matricei X, definita static, care este verificata si anume n, numarul de linii, si m, numarul de coloane. Printre acesti parametrii se afla si adresa unei variabile de tip intreg, *er, unde se va scrie 1, daca matricea este matricea unitate ori 0,daca matricea nu este patratica sau nu este matricea unitate.

Functia este :

void check_unit(int n,int m,int x[30][30],int *er)
{
int i,j;
			//verifica daca matricea este patratica
if(n!=m) printf("\n The matrix must be a square !");
   else
   	{
	 *er=1;
	for(i=0;i<n;i++)
		for(j=0;j<m;j++)
		if(x[i][j]!=1) *er=0;
	if (*er==0) printf("\n The matrix is not a unit matrix");
	    else printf("\n The matrix is a unit matrix");
	}
}

Functia check_no verifica daca un numar dat de utilizator functiei este sau nu in matrice. Parametrii de intrare ai functiei sunt dimensiunile unei matrice definita static, n numarul de linii, m numarul de coloane si matricea X. Rezultatul verificarii este cunoscut prin intermediul unei variabile de tip intreg eror, a carei adresa este parametru de intrare al functiei. Daca numarul cautat este in matrice eror va avea valoare 1 si daca numarul cautat nu este in matrice atunci eror va avea valoarea 0. Numarul ce este cautat este citit in interiorul functiei.

Functia este :

void check_no(int n,int m,int x[30][30],int *eror)
{
int i,j,k,z;
// se citeste de la tastatura numsrul de cautat
printf("\n The searched number is::");
*eror=0;
k=scanf("%d",&z);
//are loc validarea lui
valid_no_integer(&z,k);
 
for(i=0;i<n;i++)
   for(j=0;j<m;j++)
       if(x[i][j]==z)
       {
       // se afisează linia si coloana unde este gasit numarul
       printf("\n Searched number is on line %d and column %d ",i,j);
       *eror=1;
       }
   if(*eror==0) printf("\n The number is not in matrix!");
}

Functia check_line_column primeste ca date de intrare dimensiunile unei matrice, adica numarul de linii n si numarul de coloane m, si matricea respectiva X, definita static. Functia verifica daca un vector citit de la tastatura in interiorul functiei reprezinta sau nu o coloana a matricei. O variabila numita eror, a carei adresa este parametru de intrare al functiei, va lua valorile 1 sau 0 daca este adevarat sau daca nu.

La citirea vectorului, elementele sale sunt validate cu ajutorul functiei valid_no_integer.

Functia este :

void check_line_column(int n,int m,int x[30][30],int *eror)
{
int i,j,h[30],k;
//se citeste vectorul si se validează elementele sale
printf("\n The line to be checked is :");
//dimensiunea vectorului este n
for(i=0;i<n;i++)
   {
   printf("\n The element h[%d] is:",i);
   k=scanf("%d",&h[i]);
   valid_no_integer(&h[i],k);
   }
    //se verifica daca vectorul citit este sau nu coloana a matricei
for(j=0;j<m;j++)
   {
   *eror=1;
   for(i=0;i<n;i++)
      if(x[i][j]!=h[i]) *eror=0;
   if(*eror==1)
	{
	printf("\n The line is the column  %d",j);
	k=2;
	}
    }
if(k!=2) printf ("\n The line doesn't represent a column in the matrix");
}

Functia check_line_line verifica daca un vector citit de la tastatura in interiorul functiei este sau nu linie intr-o matrice X, definita static,si care este parametru de intrare al functiei. Ca date de intrare functia mai are dimensiunile matricei, n linii si m coloane, si adresa unei variabile de tip intreg eror, unde se va scrie 1 in caz de adevar si 0 in caz de neadevar.

La citirea vectorului, elementele sale sunt validate cu ajutorul functiei valid_no_integer.

Functia este:

void check_line_line(int n,int m,int x[30][30],int *eror)
{
int i,j,h[30],k;
//se citeşte vectorul şi se validează elementele sale
printf("\n The line to be checked is:");
//dimensiunea vectorului este m
for(j=0;j<m;j++)
   {
   printf("\n The element h[%d] is:",j);
   k=scanf("%d",&h[j]);
   valid_no_integer(&h[j],k);
   }
//se verifica dacă vectorul citit este sau nu coloana a matricei
for(i=0;i<n;i++)
   {
   *eror=1;
   for(j=0;j<m;j++)
      if(x[i][j]!=h[j]) *eror=0;
   if(*eror==1)
	{
	printf("\n The line is the line  %d",i);
	k=2;
	}
    }
if(k!=2) printf ("\n The line doesn't represent a line in the matrix");
}

Urmatoarele 2 functii check_columns si check_lines verifica daca o matrice are sau nu coloane respectiv linii egale. Ambele functii au ca parametrii : numarul de linii al matricei, n, numarul de coloane al amtricei, m, matricea X definita static si adresa unei variabile de tip intreg, eror, unde se va scrie 1, daca se verifica egalitatea sau 0, daca nu se verifica.

Principiul care sta la baza celor doua functii este faptul ca se ia fiecare coloana, respectiv linie, si se compara cu urmatoarele afisandu-se coloanele sau liniile egale.

Functiile sunt :

void check_columns(int n,int m,int x[30][30],int *eror)
{
int i,j,k,l;
*eror=1;
l=0;
// se iau coloanele pe rand
for(j=0;j<m-1;j++)
   {
   *eror=1;
//se verifica cu urmatoarele
   for(k=j+1;k<m;k++)
       {
       *eror=1;
       for(i=0;i<n;i++)
	     if(x[i][j]!=x[i][k]) *eror=0;
       if(*eror==1)
		{
		l=1;
//se afiseaza coloanele egale
		printf("\n Coloana Column%d is equal with column  %d ",j,k);
		}
       }
    }
if(l==0) printf("\n The matrix has no equal columns");
}

si respectiv :

void check_lines(int n,int m,int x[30][30],int *eror)
{
int i,j,k,l;
*eror=1;
l=0;
//se iau liniile pe rand
for(i=0;i<n-1;i++)
   {
   *eror=1;
// fiecare linie se compara cu urmatoarele linii
   for(k=i+1;k<n;k++)
       {
       *eror=1;
       for(j=0;j<m;j++)
	     if(x[i][j]!=x[k][j]) *eror=0;
       if(*eror==1)
		{
		l=1;
// se afisează liniile egale
		printf("\n Line  %d is equal with line  %d ",i,k);
		}
       }
    }
if(l==0) printf("\n The matrix has no equal lines");
}

Functia key_appar_no avand ca parametrii numarul de linii si de coloane al unei matrice, n respectiv m, matricea respectiva X, definita static, si adresa unei variabile intregi v ; va numara de cate ori un numar citit de la tastatura se afla in acea matrice. Numarul de aparitii va fi memorat la adresa variabilei v.

Numarul citit de la tastatura va fi validat cu ajutorul functiei valid_no_integer.

Functia este :

void key_appar_no(int n,int m,int x[30][30],int *v)
{
int i,j,k,c,l;
clrscr();
//se citeste numarul de la tastatura si se valideaza
printf("\n Type the key:");
l=scanf("%d",&c);
valid_no_integer(&c,l);
 
k=0;
//se numara aparitiile sale in matrice
for (i=0;(i<n);i++)
  for (j=0;j<m;j++)
	     if (x[i][j]==c)  k++;
if (k==0)  printf ("\nThe key does not appear in the matrix!");
	 else
	 {
	 *v=k;//se memoreaza numarul aparitiilor
	 printf("\nThe key appears in the matrix for %d times",*v);
	 }
}

Urmatoarele doua functii key_appar_no_line si key_appar_no_column numara de cate ori apare numar citit de la tastatura intr-o linie respectiv coloana indicata de utilizator. Ambele functii au aceiasi parametrii : n numarul de linii al matricei, m numarul de coloane al matricei, matricea X definita static si adresa unei variabile intregi v. La adresa acelei variabile se va scrie numarul de aparitii al cheii de cautat in coloana sau linia indicata de utilizator.

Functiile sunt :

void key_appar_no_line(int n,int m,int a[30][30],int *v)
{
int i,j,k,c,q,l;
clrscr();
//se citeste cheia de cautat si se valideaza
printf("\n Type the key:");
l=scanf("%d",&c);
valid_no_integer(&c,l);
 
// se indica linia in care se cauta
printf("\n Type the line :\t");
scanf("%d",&q);
k=0;
//se numara aparitiile cheii
for (j=0;j<m;j++)
	      if (a[q][j]==c)  k++;
if (k==0)
	{
	printf ("The key %d does not appear in the line %d!",c,q);
	*v=k;//se memoreaza numarul aparitiilor
	}
    else
	{
	*v=k; //se memoreaza numarul aparitiilor
	printf ("The key %d does appear in the line %d for %d times",c,q,*v);
	}
}

si respectiv

void key_appar_no_column(int n,int m,int a[30][30],int *v)
{
int i,j,k,c,q,l;
clrscr();
 
//se citeste cheia de cautat si se valideaza
printf("Type the key:");
scanf("%d",&c);
valid_no_integer(&c,l);
 
// se indica coloana in care se cauta
printf("\n Type the column:\t");
scanf("%d",&q);
k=0;
//se numara aparitiile cheii
for (i=0;i<n;i++)
	      if (a[i][q]==c)  k++;
if (k==0)
   {
   printf ("The key %d does not appear in the column %d!",c,q);
   *v=k; //se memoreaza numarul aparitiilor
   }
  else
   {
   *v=k; //se memoreaza numarul aparitiilor
   printf ("The key %d does appear in the column %d for %d times",c,q,*v);
   }
}

Pe langa aceste functii aflate in biblioteca matrice.h, in clasa matrix au fost supraincarcati operatorii % si = = , pentru a se putea efectua operatii de comparare asupra obiectelor de tip matrix. Operatorul % supraincarcat face acelasi lucru ca si functia symmet verificand daca o matrice este simetrica.

Operatorul == verifica daca doua obiecte de tip matrix sunt egale, adica verifica daca doua matrice sunt egale. Operatorul primeste ca date de intrare adresa obiectului cu care se compara si returneaza 0 daca cele doua obiecte sunt diferite sau 1 daca obiectele sunt egale.

Secventa de cod care realizeaza acest lucru este :

int matrix::operator ==(matrix &b)
{
int k=0;
//prima data se verifica dimensiunile celor doua obiecte
if ((n==b.n)&&(m==b.m))
			   {
		//dacă au aceeasi dimensiune, se verifica element cu element
			for(i=0;i<n;i++)
			     for(j=0;j<m;j++) if (a[i][j]!=b.a[i][j]) k=1;
			 if (k==1) return 0;//obiectele sunt diferite
			      else  return 1;//obiectele sunt egale
			    }
	  else return 0;
}

Functiile prezentate mai sus si care apartin bibliotecii sunt prezente si in cadrul clasei matrix , dar ele nu mai au parametrii de intrare, ele returnand valori de tip integer.

Modelele lor sunt :

int check_line_column();

int check_line_line();

int check_columns();

int check_lines();

int check_unit();

int key_appar_no(int);

int key_appar_no_line(int,int);

int key_appar_no_column(int,int);

Pe langa aceste modificari de suprafata suferite de definirile functiilor pentru a se lucra cu obiecte, algoritmul folosit de fiecare functie este acelasi in cadrul bibliotecii si clasei.

Tutoriale anterioare pe aceasta tema:

,


  1. No comments yet.
(will not be published)

  1. No trackbacks yet.