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] [2] [3] 1 0 0 1 0 1 1 1 1 0 1 0 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: [0] 25 4 13 14 5 int valores[3][5]; [1] [2] 2 42 18 32 52 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 const int tam=4; { private: 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; } Tamaño fijo Dos tipos de constructores
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() { 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); } } Llena la matriz con valores dados por el usuario ~ Contenedor() { // memoria estática }
Clase Contenedor básica En el main la creación de objetos puede ser de diversas formas: int main(){. Contenedor mat1; Contenedor mat2(5); 0 0 0 0 0 0 0 0 0 0 0 0 5 5 5 5 0 0 0 0 5 5 5 5 5 5 5 5 5 5 5 5. } cout<<"llenando la matriz"<<endl; mat1.llenarmatriz(); 1 2 9 3 5 6 7 8 9 3 2 3 8 4 1 6
Clase Contenedor básica 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 class Matriz 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();
Ejercicio: Clase Colonia (cont..) class Colonia { private: }; int matriz [tam] [tam]; //tam valor constante definido previamente bacteria [0] [1] [2] [3] 1 0 0 1 0 1 1 1 1 0 1 0 1 1 0 0 [0] [1] [2] [3] alimento
Ejercicio: Clase Colonia(cont..) 1. Método que determine la existencia de la bacteria k en el alimento p. 2. Método que devuelva en cuantos alimentos se encuentra la bacteria i. 3. 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 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 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 En la clase Contenedor defina un método que calcule el promedio de todos los elementos de la matriz.
Clase Contenedor básica 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 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 5 6 7 8 9 3 2 3 8 4 1 6 2 4 18 6 10 12 14 16 18 6 4 6 16 8 2 12
Clase Contenedor básica 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 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 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 En la clase Contenedor defina un método que retorne el mayor valor de la matriz.
Mayor elemento 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 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 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 En la clase Contenedor : 1. Escriba un método que busque un elemento determinado en una matriz e indique cuantas veces lo encuentra. 2. Escriba un método que retorne la posición del elemento menor de una matriz. 3. 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
Ejercicio #1 int cuentaelem(int num) { int cont=0; } for(int i = 0;i <tam;i++) return cont; for(int j = 0;j <tam;j++) if (matriz[i][j]== num) 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 void buscaposminimo(int &fil, int &col) { int min=matriz[0][0]; } En el main 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; } int x,y; mat1.buscaposminimo(x,y); cout<< "La posicion del valor minimo en la matriz es ["<<x<<"]["<<y<<"]"<<endl;
Ejercicio #3 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;
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
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] [3] 1 2 9 3 2 6 7 8 9 7 2 3 3 8 3 6 [0] [1] [2] [3] Diseñe un método que determine si la matriz es simétrica o no
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;
Matriz Transpuesta La transpuesta de una matriz se obtiene cambiando filas por columnas [0] [1] [2] [3] 1 2 9 3 5 6 7 8 9 3 2 3 8 4 1 6 [0] [1] [2] [3] [0] [1] [2] [3] 1 5 9 8 2 6 3 4 9 7 2 1 3 8 3 6 [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();
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 1 2 3 x x x x x x x x x x x x x x x x
Ejercicio int sumatriangulomatriz () { 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; } const int fil=4; const int col=7; int matriz[fil][col]; En el main cout<<"la suma del triangulo de la matriz es "<<mat1.sumatriangulomatriz()<<endl;
Ejercicio: Clase Bacteria (cont..) 4. 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. 5. 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