Documentos de Académico
Documentos de Profesional
Documentos de Cultura
REPORTE DE PRÁCTICA #1
Semestre: 04.2022
Índice
1. INTRODUCCIÓN ..................................................................................................................... 2
2. ANÁLISIS ................................................................................................................................ 2
Función menu(): ................................................................................................................ 2
Función llenar_matriz(): .................................................................................................... 4
Función traspuesta(): ........................................................................................................ 5
Función determinante(): ................................................................................................... 6
Función cofactor(): ............................................................................................................ 7
Función inversa: ................................................................................................................ 8
Función escribir_matriz: .................................................................................................... 9
3. CÓDIGO EM C++ .................................................................................................................. 10
4. CONCLUSIÓN ....................................................................................................................... 18
Tabla de Ilustraciones
1. Menu Principal .......................................................................................................................... 3
2. Opción inválida .......................................................................................................................... 3
3. Llenar una matriz A ................................................................................................................... 4
4. Matriz inversa ............................................................................................................................ 4
5. Matriz A ..................................................................................................................................... 5
6. Matriz Traspuesta de A ............................................................................................................. 6
7. Determinante de la matriz A ..................................................................................................... 7
8. Matriz de cofactores de la matriz A .......................................................................................... 8
9. Matriz inversa ............................................................................................................................ 9
10. Presentación del programa ................................................................................................... 17
11. Opción 1 seleccionada........................................................................................................... 17
12. Opción 2 seleccionada........................................................................................................... 17
13. Opción 3 seleccionada........................................................................................................... 18
14. Opción 4 seleecionada .......................................................................................................... 18
15. Opción 5 seleccionada........................................................................................................... 18
1. INTRODUCCIÓN
2. ANÁLISIS
Para el análisis del código, se tomará función por función para una mejor
organización y compreensión.
Función menu():
Para el menú del programa principal, fue usada una función del tipo vacía
(void) que no regresa valores. Dentro de esta función están definidas las
variables utilizadas por las funciones siguientes y las variables de control.
2
Fue utilizado como ciclo principal del menú el do…while, porque el menú se
debe realizar al menos una vez. Como variable de control de este ciclo fue
usada la variable entera o (de opción), que almacena números enteros. Como
el programa ofrece seis opciones y la última es justamente para salir de él, el
ciclo termina cuando se teclea el número 6, como se puede apreciar en la
imagen abajo.
1. Menu Principal
Dentro del ciclo do…while fue usada la estructura selectiva switch para tener
acceso a las diferentes opciones del menú. La variable de control de switch
es la misma (o). Los valores válidos de o son de 1 a 6. Si el número es
diferente de estos, el programa regresa el siguiente mensaje:
2. Opción inválida
Para control del menú se utilizaron dos variables de control más, b1 y b2.
Estas dos variables son banderas que permiten que el programa siga
funcionando correctamente. Por ejemplo, si la matriz A no fue definida, no se
puede generar ni la traspuesta, ni el determinante, ni la matriz de cofactores,
ni la matriz inversa. Por eso, las variables b1 y b2 recibieron un valor falso (el
cero). Caso la matriz A no es definida, esas funciones permanecerán con el
valor b1 falso y regresarán el mensaje: “Llenar una matriz A!”.
3
3. Llenar una matriz A
4. Matriz inversa
Función llenar_matriz():
4
La función llenar_matriz() tiene como objetivo justamente llenar una matriz A.
Es formada por dos ciclos for: uno para los renglones y otro para las
columnas.
Es una función vacía (void) y que genera un arreglo de dos dimensiones tipo
double. Los arreglos, por default, trabajan con llamadas por referencia.
Función traspuesta():
5. Matriz A
5
6. Matriz Traspuesta de A
Función determinante():
Para la función determinante() fue utilizada una función del tipo double que
recibe un arreglo del mismo tipo y una variable tipo entera que recibe el orden
de la matriz.
Como dicho a principio, el cálculo de los determinantes fue una limitación del
programa, ya que calcula nada más los determinantes de orden 2 y 3. No fue
programado un algoritmo general, de orden n.
6
𝑑𝑒𝑡 = 𝑎[0][0] ∗ (𝑎[1][1] ∗ 𝑎[2][2] − 𝑎[1][2] ∗ 𝑎[2][1]) − (𝑎[0][1] ∗ (𝑎[1][0]
∗ 𝑎[2][2] − 𝑎[1][2] ∗ 𝑎[2][0])) + (𝑎[0][2] ∗ (𝑎[1][0] ∗ 𝑎[2][1]
− 𝑎[1][1] ∗ 𝑎[2][0]))
Esta fórmula toma en consideración los cofactores de la matriz 3x3.
Al final del cálculo, la función regresa el valor de det.
7. Determinante de la matriz A
Función cofactor():
Para la función cofactor(), fue utilizada una función tipo double que recibe un
arreglo del mismo tipo, tres números enteros y regresa un valor tipo double.
Los enteros requeridos para esta función son el orden, la fila y la columna de
la matriz A.
Esta función genera una matriz menor (matriz de orden n-1). La matriz menor
elimina de la matriz grande un renglón y una columna, definidos por el índice
del elemento que sirve como pivote. Si elemento es de la primera fila y
primera columna, todos los elementos de la primera fila y primera columna
serán eliminados, quedando apenas los elementos de la segunda y tercera
filas y columnas.
7
Para generar esta matriz de cofactores, en el menú principal fue usado dos
ciclos for para moverse en las filas y columnas de la matriz A, generando, así,
una nueva matriz de cofactores.
Dentro de la función cofactor(), fueron usados dos ciclos for y dos estructuras
selectivas if.
Las estructuras for fueron usadas para recorrer todas las filas y columnas de
la matriz A, mientras que el primer if fue usado para eliminar las filas y
columnas correspondientes a los índices de los elementos. El segundo if es
usado como un ciclo for, que recorre las filas y columnas de la matriz menor.
Al final, es calculado el determinante de cada matriz menor, usando la función
determinante(), y el valor es regresado para un nuevo elemento en una nueva
matriz de cofactores.
Función inversa:
8
Por tanto, si se calcula la traspuesta de la matriz de cofactores y se divide
cada uno de sus elementos por el determinante de la matriz A, se obtiene la
matriz inversa.
La función inversa es del tipo void, recibe dos arreglos del tipo double y envía
un arreglo tipo double.
Como mencionado, la función está hecha por una estructura selectiva if…else
y, además, dos ciclos for para formar la nueva matriz inversa.
9. Matriz inversa
Función escribir_matriz:
9
Por último, la función escribir_matriz() tiene como objetivo mostrar en pantalla
como quedó la matriz de orden 3 que se desea ver.
Esta función está formada por dos ciclos for que recorre todos los renglones
y columnas del arreglo y se trata de una función tipo vacía que recibe un
arreglo del tipo double. La función es usada cada vez que se solicite una
matriz. Para que se vea bien estéticamente, fue agregado un tabulador antes
de cada número escrito.
Por fin, se tiene la función principal main() que es donde corre el programa. Como
todas las opciones están en la función menu(), esta es la única que aparece en
la función main().
3. CÓDIGO EM C++
#include <iostream.h>
#include <conio.h>
#include <math.h>
#define R 3
#define C 3
void menu(void);
void llenar_matriz(double [][C]);
void traspuesta(double [][C], double [][C]);
double determinante(double [][C], int);
double cofactor(double [][C], int, int, int);
void inversa (double [][C], double [][C], double [][C]);
void escribir_matriz(double[][C]);
10
void main (void)
{
menu();
}
//------------------------------------------------------
//MENU
//------------------------------------------------------
void menu(void)
{
int o, b1=0, b2=0, ban, b3;
double m[R][C];
double tras[R][C];
double cof[R][C];
double inv[R][C];
double det;
do
{
cout<<"MENU\n1. Llenar una matriz A;\n2. Obtener la
matriz traspuesta de A;\n3. Obtener el determinante de A;\n4. Obtener
la matriz de cofactores de A;\n5. Obtener la matriz inversa de A;\n6.
Salir;\nOpcion: ";
cin>>o;
switch (o)
{
case 1:
llenar_matriz(m);
escribir_matriz(m);
b1=1;
break;
case 2:
{
if (b1)
{
traspuesta(m,tras);
11
escribir_matriz(tras);
}
else
{
cout<<"Llenar una matriz A!";
}
break;
}
case 3:
if (b1)
{
det = determinante(m, R);
cout<<"Determinante = "<<det;
}
else
{
cout<<"Llenar una matriz A!";
}
break;
case 4:
if (b1)
{
for(int i=0;i<R;i++)
{
for (int j=0;j<C;j++)
{
cof[i][j]=cofactor(m, R, i, j);
}
}
escribir_matriz(cof);
b2=1;
}
else
{
12
cout<<"Llenar una matriz A!";
}
break;
case 5:
if (b1 && b2)
{
inversa(cof,inv,m);
}
else
{
cout<<"Llenar una matriz A o generar la
Matriz de Cofactores!";
}
break;
case 6:
break;
default:
cout<<"Elegir opcion valida!";
break;
}
getch();
clrscr();
}while(o!=6);
}
//------------------------------------------------------
//LLENAR LA MATRIZ A
//------------------------------------------------------
13
{
cout<<"A["<<i+1<<"]["<<j+1<<"] = ";
cin>>a[i][j];
}
}
}
//------------------------------------------------------
//TRASPUESTA DE LA MATRIZ A
//------------------------------------------------------
void traspuesta(double a[][C], double b[][C])
{
for (int i=0;i<R;i++)
{
for(int j=0;j<C;j++)
{
b[j][i] = a[i][j];
}
}
}
//------------------------------------------------------
//DETERMINANTE DE LA MATRIZ A
//------------------------------------------------------
double determinante(double a[R][C], int orden)
{
double det=0.0;
if (orden==R-1)
{
det=a[0][0]*a[1][1]-(a[0][1]*a[1][0]);
}
else
{
det=a[0][0]*(a[1][1]*a[2][2]-a[1][2]*a[2][1])-
(a[0][1]*(a[1][0]*a[2][2]-a[1][2]*a[2][0]))+(a[0][2]*(a[1][0]*a[2][1]-
a[1][1]*a[2][0]));
}
return det;
}
14
//------------------------------------------------------
//COFACTOR DE LA MATRIZ A
15
if (det!=0)
{
for (int i=0;i<R;i++)
{
for (int j=0;j<C;j++)
b[i][j]=b[i][j]/det;
}
escribir_matriz(b);
}
else
{
cout<<"La matriz no tiene inversa!";
}
}
//------------------------------------------------------
//ESCRIBIR LA MATRIZ A
//------------------------------------------------------
16
10. Presentación del programa
17
13. Opción 3 seleccionada
4. CONCLUSIÓN
18
razón es importante desarrollar maneras computacionales de resolver estos
tipos de problemas.
19