12 Matrices POO

Anuncio
Programación Orientada a
Objetos
Ejercicio: clase Colonia

Se define la clase Colonia, representando a una colonia
de bacterias que se desarrollan o no en una serie de
alimentos. Básicamente se almacena información de la
existencia de x bacterias en y alimentos. Se representa
con un 1 la existencia de una bacteria i en un alimento j, y
con un 0 la no existencia de la misma.
bacteria
[0]
1
0 0
1
[1]
0 1 1
1 0 1
1
0
[2]
[3]
1
1 0 0
[0] [1] [2] [3]
alimento
Arreglos multidimensionales

Un arreglo multidimensional
es un arreglo donde los
elementos se encuentran
organizados en varias
dimensiones.

Para su definición se usa una
sintaxis similar a la usada
para declarar arreglos
unidimensionales, pero
separando las diferentes
dimensiones.
Arreglos bidimensionales


En lo particular un arreglo bidimensional (matriz) es un arreglo
de dos dimensiones.
Para crear arreglos bidimensionales en C++, hay que indicar:
 El tipo de los elementos (ejemplo, int, char, float, bool,
string o un tipo definido por el programador)
 El nombre del arreglo
 El número de filas y el número de columnas del arreglo
(ambas entre [ ])
<tipo de los elementos> <nombre del arreglo> [<filas >] [<columnas >]
Arreglos bidimensionales

Ejemplo:
int valores[3][5];


[0]
25
4
13
14
5
[1]
2
42
18
32
52
[2]
54
23
37
60
15
[0]
[1]
[2]
[3]
[4]
Para acceder a cada elemento se usa el nombre del arreglo y
un índice por cada dimensión.
En el caso de las matrices se necesitan dos índices: uno para
las filas y otro para las columnas.
 cout <<valores[2][3]  60
Clase Contenedor básica
Tamaño
fijo
const int tam=4;
class Contenedor{
Dos tipos de
constructores
private:
int matriz[tam][tam];
public:
Contenedor(){
for (int i = 0; i<tam; i++)
for (int j = 0; j<tam ; j++)
matriz[i][j]=0;
}
Contenedor(int a){
for (int i = 0; i<tam; i++)
for (int j = 0; j<tam ; j++)
matriz[i][j]= a;
}
Clase Contenedor básica
void setPos (int i, int j, int val)
matriz[i][j] = val;
{
}
int getPos (int i, int j){
return matriz[i][j];
void llenarMatriz()
}
Llena la matriz
con valores dados
por el usuario
{
int valor;
for (int i = 0; i<tam;i++)
for (int j = 0; j<tam;j++)
{
cout<<"valor["<<i<<"]["<<j<<"]: ";
cin>>valor;
setPos(i,j,valor);
~ Contenedor() { // memoria estática
}
}
}
Clase Contenedor básica

En el main la creación de objetos puede ser de
diversas formas:
0 0 0 0
int main(){
0 0 0 0
0 0 0 0
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
5
1
2
9
3
5
6
7
8
…….
9
3
2
3
}
8
4
1
6
….
Contenedor mat1;
0 0 0 0
Contenedor mat2(5);
cout<<"Llenando la matriz"<<endl;
mat1.llenarMatriz();
Clase Contenedor básica
class Contenedor
{ private:
int matriz[tam][tam];
En la clase Contenedor defina un método que
permita imprimir la matriz de forma ordenada
por filas y columnas.
 Ejemplo:

1
2
9
3
5
6
7
8
9
3
2
3
8
4
1
6
Clase Matriz básica
string toString()
{
stringstream s;
for (int i = 0; i< tam;i++){
for (int j = 0; j< tam;j++)
s<<matriz[i][j]<<" ";
s<<endl;
}
s<<endl;
return s.str();
}
En el main
cout<<mat1.toString();
class Matriz
{ private:
int matriz[tam][tam];
Ejercicio: Clase Colonia (cont..)
class Colonia {
private:
int matriz [tam] [tam];
… };
[0]
bacteria
[1]
[2]
[3]
//tam valor constante definido
previamente
1 0 0
0 1 1
1
1
1
1
0 1 0
1 0 0
[0] [1] [2] [3]
alimento
Ejercicio: Clase Colonia(cont..)
1.
2.
3.
Método que determine la existencia de la
bacteria k en el alimento p.
Método que devuelva en cuantos alimentos se
encuentra la bacteria i.
Método que muestre que bacterias están
presentes en el alimento j.
Ejercicio: Clase Colonia(cont..)
1.
Método que determine la existencia de la
bacteria k en el alimento p.
bool existeBacteria() {
if (matriz[k][p]== 1)
return true;
else
return false;
}
Ejercicio: Clase Colonia(cont..)
2.
Método que devuelva en cuantos alimentos se
encuentra la bacteria i.
int numAlimentos(int i) {
int cont = 0;
for (int j = 0; j<tam; j++)
cont += matriz[i][j];
return cont;
}
Ejercicio: Clase Colonia(cont..)
3.
Método que muestre que bacterias están
presentes en el alimento j.
void bacteriasAlimento(int j) {
for (int i = 0; i<tam; i++)
if (matriz[i][j]== 1)
cout<<"El alimento"<<j<<"tiene la bacteria "<<i;
}
Clase Contenedor básica
class Contenedor
{ private:
int matriz[tam][tam];
En la clase Contenedor defina un método que
sume todos los elementos de la matriz.
 Por ejemplo, si la matriz es:


1
2
9
3
5
6
7
8
9
3
2
3
8
4
1
6
La suma es 77
Clase Contenedor básica
class Contenedor
{ private:
int matriz[tam][tam];
int suma() {
int sum = 0;
for (int i = 0; i<tam;i++)
for (int j = 0; j<tam;j++)
sum += matriz[i][j];
return sum;
}
En el main
cout<<"La suma de los valores de la matriz es "<<mat1.suma()<<endl;
Clase Contenedor básica

class Contenedor
{ private:
int matriz[tam][tam];
En la clase Contenedor defina un método que
calcule el promedio de todos los elementos de la
matriz.
Clase Contenedor básica
class Contenedor
{ private:
int matriz[tam][tam];
float promedio() {
float suma = 0;
for (int i = 0; i<tam;i++)
for (int j = 0; j<tam;j++)
suma += matriz[i][j];
return (float)suma/(tam*tam);
}
En el main
cout<<"El promedio de los valores de la matriz es "<<mat1.promedio()<<endl;
Clase Contenedor básica
class Contenedor
{ private:
int matriz[tam][tam];
En la clase Contenedor defina un método que
multiplique todos los elementos de la matriz por
un escalar (dado por el usuario)
 Por ejemplo, si el escalar = 2

1
2
9
3
2
4
18
6
5
6
7
8
10
12 14
16
9
3
2
3
18
6
4
6
8
4
1
6
16
8
2
12
Clase Contenedor básica
class Contenedor
{ private:
int matriz[tam][tam];
void multiplicarEscalar (int escalar){
for (int i = 0; i<tam;i++)
for (int j = 0; j<tam;j++)
matriz[i][j]*= escalar;
}
En el main
cout<<"Digite el valor por el que desea multiplicar la matriz ";
cin>>valor;
mat1.multiplicarEscalar(valor);
mat1.toString();
Búsqueda de un elemento

class Contenedor
{ private:
int matriz[tam][tam];
En la clase Contenedor defina un método que
retorne true si un elemento determinado se
encuentra en la matriz y false si no.
Búsqueda de un elemento
class Contenedor
{ private:
int matriz[tam][tam];
bool encuentraElem(int num) {
for(int i = 0;i <tam;i++)
for(int j = 0;j <tam;j++)
if (matriz[i][j]== num)
return true;
return false;
}
En el main
cout<<"Digite el valor que desea buscar ";
cin>>valor;
if (mat1.encuentraElem(valor))
cout <<"El valor " <<valor<<" SI se encuentra en la matriz "<<endl;
else
cout <<"El valor " <<valor<<" NO se encuentra en la matriz "<<endl;
Mayor elemento

class Contenedor
{ private:
int matriz[tam][tam];
En la clase Contenedor defina un método que
retorne el mayor valor de la matriz.
Mayor elemento
class Contenedor
{ private:
int matriz[tam][tam];
int buscaMaximo()
{
int max=matriz[0][0];
for(int i = 0;i <tam;i++)
for(int j = 0;j <tam;j++)
if (matriz[i][j] > max)
max=matriz[i][j];
return max;
}
En el main
cout<<"El valor maximo de la matriz es "<<mat1.buscaMaximo()<<endl;
Suma diagonal




class Contenedor
{ private:
int matriz[tam][tam];
En la clase Contenedor defina un método que calcule la
suma de los elementos de la diagonal principal de la
matriz.
Por ejemplo, si la matriz es:
1
2
9
3
5
6
7
8
9
3
2
3
8
4
1
6
La suma de la diagonal es 15
A la suma de los elementos de la diagonal principal de una
matriz cuadrada se le llama traza de la matriz
Suma diagonal
class Contenedor
{ private:
int matriz[tam][tam];
int sumaDiagonal(){
int i = 0, suma=0;
while (i<tam){
suma = suma + matriz[i][i];
i++;
}
return suma;
}
En el main
cout<<"La suma de la diagonal es "<<mat1.sumaDiagonal()<<endl;
Ejercicios

1.
2.
3.
En la clase Contenedor :
Escriba un método que busque un elemento
determinado en una matriz e indique cuantas veces lo
encuentra.
Escriba un método que retorne la posición del elemento
menor de una matriz.
Defina un método que calcule la suma de los elementos
de la diagonal inversa de la matriz.
1
2
9
3
2
6
7
8
9
7
2
3
3
8
3
6
class Contenedor
{ private:
int matriz[tam][tam];
Ejercicio #1
int cuentaElem(int num)
{
int cont=0;
for(int i = 0;i <tam;i++)
for(int j = 0;j <tam;j++)
if (matriz[i][j]== num)
cont++;
return cont;
}
En el main
cout<<"Digite el valor que desea contar ";
cin>>valor;
cout<<"El valor "<<valor<<" se encuentra "<<mat1.cuentaElem(valor)<<" veces"<<endl;
Ejercicio #2
class Contenedor
{ private:
int matriz[tam][tam];
void buscaPosMinimo(int &fil, int &col)
{
int min=matriz[0][0];
fil=0;
col=0;
for(int i = 0;i <tam;i++)
for(int j = 0;j <tam;j++)
if (matriz[i][j] < min)
{
min=matriz[i][j];
fil=i;
col=j; }
}
En el main
int x,y;
mat1.buscaPosMinimo(x,y);
cout<< "La posicion del valor minimo en la matriz es ["<<x<<"]["<<y<<"]"<<endl;
Ejercicio #3
class Contenedor
{ private:
int matriz[tam][tam];
int sumaDiagonalInversa(){
int suma=0;
for (int i=0; i<tam; i++)
suma = suma + matriz[i][tam-1-i];
return suma;
}
En el main
cout<<"La suma de la diagonal inversa es "<<mat1.sumaDiagonalInversa()<<endl;
class Contenedor
{ private:
int matriz[tam][tam];
Matriz identidad


Una matriz se dice que es la matriz identidad si tiene
todos sus elementos nulos excepto los de la diagonal
principal que son iguales a 1
1
0
0
0
0
1
0
0
0
0
1
0
0
0
0
1
En la clase Contenedor defina un método que retorne
true si la matriz es la matriz identidad y false si no
class Contenedor
{ private:
int matriz[tam][tam];
Matriz identidad
bool esIdentidad()
{ for(int i=0;i<tam;i++)
for(int j=0;j<tam;j++)
if (i == j)
{
if (matriz[i][j] != 1)
return false;
}
else { if (matriz[i][j] != 0)
return false;
return true;
}
}
En el main
if (mat1.esIdentidad())
cout <<"La matriz SI es la matriz identidad "<<endl;
else
cout <<"La matriz NO es la matriz identidad "<<endl;
Matriz simétrica

Una matriz A de tamaño mxn se dice que es una matriz
simétrica si:


m=n y
si cumple que Ax,y = Ay,x para 1<= x<= m y 1<= y <= n.
[0]
1
2
9
3
[1]
2
6
7
8
[2]
9
7
2
3
[3]

class Contenedor
{ private:
int matriz[tam][tam];
3 8 3 6
[0] [1] [2] [3]
Diseñe un método que determine si la matriz es simétrica
o no
class Contenedor
{ private:
int matriz[tam][tam];
Matriz simétrica
bool esSimetrica()
{
for(int i = 0;i <tam;i++)
for(int j = 0;j <tam;j++)
if (matriz[i][j]!=matriz[j][i])
return false;
return true;
}
En el main
if (mat1.esSimetrica())
cout <<"La matriz SI es simetrica "<<endl;
else
cout <<"La matriz NO es simetrica "<<endl;
class Contenedor
{ private:
int matriz[tam][tam];
Matriz Transpuesta

La transpuesta de una matriz se obtiene
cambiando filas por columnas
[0]
1
2
9
3
[0]
1
5
9
8
[1]
5
6
7
8
[1]
2
6
3
4
[2]
9
3
2
3
[2]
9
7
2
1
[3]
8
4
1
6
[3]
3
8
3
6
[0] [1] [2] [3]

[0] [1] [2] [3]
Diseñe un método que cambie la matriz por su
transpuesta
Matriz Transpuesta
void transponerMatriz(){
//usando set y get
int aux;
for (int i = 1; i<tam ;i++)
for (int j = 0; j< i ;j++)
{
aux=getPos(i,j);
setPos(i,j,getPos(j,i));
setPos(j,i,aux);
}
}
En el main
cout<<"La matriz transpuesta es"<<endl;
mat1.transponerMatriz();
cout<<mat1.toString();
class Contenedor
{ private:
int matriz[tam][tam];
class Contenedor
{ private:
int matriz[tam][tam];
Ejercicio


Suponga que se tiene creada una instancia Contenedor
mat2 de n filas y 2*n-1 columnas.
Escriba un método que calcule la suma de los elementos
que forman un triángulo en la matriz. Por ejemplo si
n=4, el método debe sumar los elementos contenidos en
las casillas marcadas con x
0 1 2 3
4 5 6
0
x
1
x x x
2
x x x x x
3
x x x x x x x
Ejercicio
int sumaTrianguloMatriz ()
{
const int fil=4;
const int col=7;
class Contenedor
{ private:
int matriz[fil][col];
…
int ini=0;
int fin=col-1;
int suma=0;
for (i=fil-1;i>=0;i--)
{
for (j=ini;j<=fin;j++)
suma=suma+matriz[i][j];
ini++;
fin--;
}
return suma;
}
En el main
cout<<"La suma del triangulo de la matriz es "<<mat1.sumaTrianguloMatriz()<<endl;
Ejercicio: Clase Bacteria (cont..)
4.
5.
Un alimento está imposibilitado para el consumo
humano si presenta al menos tam/2 existencias de
bacterias. Diseñe un método que devuelva cuántos
alimentos están deshabilitados para el consumo
humano.
Un alimento es enviado a estudios bacteriólogos si se
encuentra en él la presencia de cierta cantidad de
bacterias continuas (por ejemplo las bacterias 1,2,3, o
2,3,4,5, o 3,4,5,6,7 etc). Diseñe un método que devuelva
el máximo número de bacterias que se encuentran de
manera consecutiva para el alimento m.
Usado únicamente con fines académicos
Descargar