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 Ax,y = Ay,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