Universidad de Costa Rica Escuela de Computación |
Examen 02 |
CI-1201 Programación II - 2016b Profesor Jeisson Hidalgo-Céspedes |
En cada ejercicio se evaluará la eficiencia del código, el uso de identificadores significativos, la indentación, escritura correcta de llaves {} y el uso adecuado de la palabra reservada const. Se dispone de tres horas para entregar la prueba y debe realizarse en forma estrictamente individual.
Las matrices son estructuras de datos importantes para resolver una cantidad importante de problemas en ciencias de la computación. Sin embargo, su programación es un poco compleja en lenguajes como C/C++. Escriba una plantilla para generar clases Matriz
(en inglés Matrix
) que faciliten el trabajo con matrices de dos dimensiones de valores de tipos arbitrarios de datos. Debe implementar al menos los siguientes miembros.
new tipo_datos[n][m]
no es válida en C++. Provee métodos de acceso a los datos: rows()
y cols()
, que retornan la cantidad de filas y columnas en la matriz."(null)"
, sin las comillas. Constructor Matrix(n,m)
. Crea una matriz de n
filas por m
columnas de valores. Si alguno de los valores n
ó m
son cero, crea una matriz nula.Matrix
utiliza memoria dinámica, debe evitar fugas de memoria o accesos inválidos a toda costa.false
si es la matriz nula, true
en cualquier otro caso. Operador ! se evalúa como true
si la matriz es nula, false
en cualquier otro caso.i
y j
son válidos. Es decir, si se utilizan valores fuera de rango hará que el programa se caiga. El mismo comportamiento si se invoca este operador en una matriz nula.Anxm + Bnxm
es una matriz Cnxm
resultado de sumar cada entrada respectiva de ambas matrices. De forma análoga la resta de dos matrices es la resta de sus respectivas entradas. Es decir: $$ A_{n \times m} + B_{n \times m} = C_{n \times m} \Longrightarrow c_{ij} = a_{ij} + b_{ij}$$ $$ A_{n \times m} - B_{n \times m} = C_{n \times m} \Longrightarrow c_{ij} = a_{ij} - b_{ij}$$Anxm
con un valor r
es una matriz Cnxm
resultado de multiplicar r
por cada entrada de A
. Debe implementar esta operación en forma conmutiativa. Matemáticamente: $$ r * A_{n \times m} = C_{n \times m} \Longrightarrow c_{ij} = r * a_{ij}$$Anxm
con una matriz Bmxp
es una matriz Cnxp
, denotado por: $$ A_{n \times m} \times B_{m \times p} = C_{n \times p} \Longrightarrow c_{ij} = \sum_{k=1}^{m} a_{ik} b_{kj} $$ Note las restricciones de tamaño que deben cumplir las matrices para poderse multiplicar, de lo contrario, se debe retornar la matriz nula.Su clase Matrix
debe hacer funcionar el siguiente main():
> n; std::cin.ignore(); std::cin >> m; Matrixm1(n, m); std::cin >> m1; std::cout << "Matrix 2 (nxm): "; std::cin >> n; std::cin.ignore(); std::cin >> m; Matrix m2(n, m); std::cin >> m2; std::cout << "m1 + m2 =" << std::endl << m1 + m2 << std::endl; std::cout << "m1 - m2 =" << std::endl << m1 - m2 << std::endl; std::cout << ".5 * m2 =" << std::endl << .5 * m2 << std::endl; std::cout << "m1 * m2 =" << std::endl << m1 * m2 << std::endl; return 0; }]]>
Ejemplos de ejecución:
Matrix 1 (nxm): 2x3 1 -2 3 -3 0 4 Matrix 2 (nxm): 2x3 3 0 -4 -1 1 2 m1 + m2 = 4 -2 -1 -4 1 6 m1 - m2 = -2 -2 7 -2 -1 2 .5 * m2 = 1.5 0 -2 -0.5 0.5 1 m1 * m2 = (null)
Matrix 1 (nxm): 2x3 1 0 2 -1 -2 1 Matrix 2 (nxm): 3x4 2 1 3 1 -2 -1 0 -1 1 0 -1 -3 m1 + m2 = (null) m1 - m2 = (null) .5 * m2 = 1 0.5 1.5 0.5 -1 -0.5 0 -0.5 0.5 0 -0.5 -1.5 m1 * m2 = 4 1 1 -5 3 1 -4 -2