Practica 5
Practica 5
Practica 5
REPORTE DE PRÁCTICA #5
Semestre: 04.2022
Índice
1. INTRODUCCIÓN ..................................................................................................................... 2
2. ANÁLISIS ................................................................................................................................ 2
Función main(): ................................................................................................................. 3
Función menu(): ................................................................................................................ 5
Constructor CVector(): ...................................................................................................... 5
Método set_v1(): ............................................................................................................... 5
Método get_v1(): .............................................................................................................. 6
Método show_v1(): ........................................................................................................... 6
Constructor CMatriz(): ...................................................................................................... 6
Método set_m1(): ............................................................................................................. 6
Método get_m1(): ............................................................................................................. 7
Método det_m1(): ............................................................................................................. 7
Método cof_m1(): ............................................................................................................. 7
Método adj_m1(): ............................................................................................................. 8
Método tras_m1(): ............................................................................................................ 8
Método inv_m1(): ............................................................................................................. 8
Método show_m1():.......................................................................................................... 9
Constructor CSSE(): ........................................................................................................... 9
Método result(): ................................................................................................................ 9
Método get_result(): ....................................................................................................... 10
3. CÓDIGO EM C++ .................................................................................................................. 10
4. CONCLUSIÓN ....................................................................................................................... 19
Tabla de Ilustraciones
Ilustración 1. Menu ....................................................................................................................... 3
Ilustración 2. Opción Inválida ........................................................................................................ 4
Ilustración 3. Llenar matriz o vector! ............................................................................................ 4
Ilustración 4. Llenado del vector “b” ............................................................................................. 5
Ilustración 5. Impresión del vector "b" ......................................................................................... 6
Ilustración 6. Llenar matriz A ........................................................................................................ 7
Ilustración 7. Impresion de la matriz "A" ...................................................................................... 9
Ilustración 8.Resultado del sistema de ecuaciones .................................................................... 10
Ilustración 9.Resultado del sistema de ecuaciones sin solución ................................................. 10
1. INTRODUCCIÓN
El programa deberá de tener dos clases (CVector y CMatriz) y una clase derivada
(CSSE), que hereda los constructores, datos miembros y métodos de las dos
clases.
2. ANÁLISIS
Para el análisis del código, se tomará función por función para una mejor
organización y comprensión.
2
Para la clase CVector, fueron utilizados los siguientes métodos: set_v1(),
get_v1(), show_v1().
Además de los métodos, los constructores de cada clase llevan el mismo nombre
que estas.
Función main():
La función principal está formada por el ciclo do…while para correr, al menos
una vez, la función menú(). Al recibir el valor de la opción del menú, se utilizó
la estructura selectiva switch para evaluar cada opción del número uno al
cuatro. Caso el número digitado esté fuera de este rango, el mensaje “Opción
inválida!” aparece en pantalla.
Ilustración 1. Menu
3
Ilustración 2. Opción Inválida
Para control del menú se utilizó dos variables de control, b1 y b2. Estas
variables son banderas que permiten que el programa siga funcionando
correctamente. Por ejemplo, si no se llena el vector “b”, no se puede obtener
el vector resultante de la ecuación. Por esto, la variable b1 recibió un valor
falso (el cero). Al llenar el vector “b”, el valor de b1 cambia a verdadero (1) y
permite generar la opción 3.
La misma función tiene b2. Sin embargo, esta variable está ligada a la opción
“llenar la matriz A”. Si se llena la matriz, la variable de control pasará de un
cero a uno (valor verdadero) y se podrá generar el vector resultante de la
ecuación.
La opción 3 tiene que tener, obligatoriamente, los dos valores (de b1 y b2)
verdaderos.
4
Al final del código de la función principal, se utiliza la función getch(), para
esperar a que el usuario teclee algún carácter, y la función clrscr(), para
limpiar la pantalla, por cuestiones de limpieza y estética.
Función menu():
Constructor CVector():
El constructor utiliza un ciclo for para inicializar los datos del vector v1 a cero.
Método set_v1():
Se usó un polimorfismo para este método: set_v1(double []). Esto para que
el programador pueda definir un vector en la función principal, sin necesidad
de que el usuario introduzca los datos.
5
Método get_v1():
Al momento del usuario ingresar los valores al vector “b”, el método get_v1()
es llamado y es asignado, en la función principal, los valores de v1 a un
arreglo de una dimensión llamado vector.
Método show_v1():
Está formado por un ciclo for que recorre todo el vector e imprime los valores
en pantalla, uno debajo del otro.
Constructor CMatriz():
Método set_m1():
6
Para el método set_m1() se utilizó el tipo void y que no recibe nada. Lo que
hace la función es llenar la matriz “A”. El método es compuesto por dos ciclos
for.
Método get_m1():
Método det_m1():
Método cof_m1():
El método cof_m1() es del tipo double y recibe tres datos: la matriz a ser
calculada el cofactor, un entero para la fila y otro entero para la columna a
7
ser eliminadas. Lo que hace el método es recorrer la matriz principal,
introducida por el usuario, y calcular una matriz menor (de orden inferior, es
decir, dos). Al llenar la matriz, el método regresa el valor del determinante de
esta matriz menor para luego asignar el valor a la matriz de cofactores. El
método es formado por dos ciclos for y dos estructuras selectivas if para
controlar el llenado de la matriz menor.
Método adj_m1():
El método adj_m1() es del tipo void y recibe un arreglo del tipo double y
regresa otro arreglo del mismo tipo. El método asigna los valores calculados
de los determinantes de las matrices menores a una matriz de cofactores
llamada cof. Esta matriz fue definida en protected al inicio de la clase.
Después se usa el método de la matriz traspuesta para transformar la matriz
“A” en adjunta. La matriz adjunta, por definición, es la traspuesta de la matriz
de cofactores.
Método tras_m1():
El método tras_m1() cambia columnas por filas, usando dos ciclos for. El
método es del tipo void y recibe un arreglo del tipo double y regresa otro
arreglo del mismo tipo.
Método inv_m1():
8
matriz adjunta dividida por el determinante. En este caso, la bandera ban
cambia de cero a uno.
El método es del tipo int, recibe un arreglo del tipo double y regresa otro
arreglo del mismo tipo. El método regresa el valor entero contenido en ban.
Método show_m1():
Está formado por dos ciclos for que recorren toda la matriz e imprime los
valores en pantalla.
Constructor CSSE():
El constructor inicializa todos los elementos del vector en cero. Para esto, se
utiliza un ciclo for para recorrer todas las posiciones. También inicializa los
constructores de las clases heredadas.
Método result():
9
Método get_result():
3. CÓDIGO EM C++
#include <iostream.h>
#include <conio.h>
#include <math.h>
class CVector
{
protected:
double v1[3];
public:
CVector(void);
void set_v1(void);
10
void set_v1(double []);
void get_v1(double []);
void show_v1(double []);
};
CVector::CVector(void)
{
for (int i=0;i<3;i++)
{
v1[i]=0;
}
}
void CVector::set_v1(void)
{
for (int i=0;i<3;i++)
{
cout<<"V1["<<i+1<<"] = ";
cin>>v1[i];
}
}
11
}
cout<<endl<<"===================================="<<endl<<"\t\tVECTOR"
<<endl<<"===================================="<<endl<<endl;
for (int i=0;i<3;i++)
{
cout<<a[i]<<endl;
}
}
class CMatriz
{
protected:
double m1[3][3], m_menor[2][2], cof[3][3];
double d;
public:
CMatriz(void);
void set_m1(void);
void get_m1(double [][3]);
double det_m1(double [][3]);
double det_m1(double [][2]);
double cof_m1(double [][3], int, int);
void adj_m1(double [][3], double[][3]);
void tras_m1(double [][3], double[][3]);
int inv_m1(double [][3], double [][3]);
void show_m1(double [][3]);
};
CMatriz::CMatriz(void)
{
for (int i=0;i<3;i++)
{
for (int j=0;j<3;j++)
{
12
m1[i][j]=0;
}
}
}
void CMatriz::set_m1(void)
{
cout<<"Escribir Matriz: "<<endl;
for (int i=0;i<3;i++)
{
for (int j=0;j<3;j++)
{
cout<<"M["<<i+1<<"]["<<j+1<<"] = ";
cin>>m1[i][j];
}
}
}
}
}
13
double CMatriz::det_m1(double a[][2])
{
return (a[0][0]*a[1][1]-a[0][1]*a[1][0]);
}
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
if(i!=b && j!=c)
{
m_menor[x][y]=a[i][j];
y++;
if(y>=2)
{
x++;
y=0;
}
}
}
}
return pow((-1),b+c)*det_m1(m_menor);
}
14
cof[i][j]=cof_m1(a,i,j);
}
}
tras_m1(cof, b);
}
if(d!=0)
{
for (int i=0;i<3;i++)
{
for (int j=0;j<3;j++)
{
b[i][j]=b[i][j]/d;
}
}
ban=1;
}
else
{
cout<<"La matriz no tiene inversa!"<<endl;
15
}
return ban;
}
cout<<endl<<"===================================="<<endl<<"\t\tMATRIZ"
<<endl<<"===================================="<<endl<<endl;
for(int i=0;i<3;i++)
{
cout<<"| ";
for(int j=0;j<3;j++)
{
cout<<" "<<a[i][j];
}
cout<<" |"<<endl;
}
}
CSSE::CSSE(void)
:CVector(), CMatriz()
{
for(int i=0;i<3;i++)
{
v2[i]=0;
}
16
}
int menu(void);
void main(void)
{
CSSE c;
double vector[3], x[3];
double matriz[3][3], inversa[3][3];
17
{
case 1:
c.set_v1();
c.get_v1(vector);
c.show_v1(vector);
b1=1;
break;
case 2:
c.set_m1();
c.get_m1(matriz);
c.show_m1(matriz);
b2=1;
break;
case 3:
if(b1 && b2)
{
b3=c.inv_m1(matriz, inversa);
c.result(inversa,vector);
c.get_result(x);
if(b3)
{
c.show_v1(x);
}
else
{
cout<<"Ecuacion sin
solucion!!";
}
}
else
{
cout<<"Llenar matriz o vector!";
}
break;
18
case 4:
break;
default:
cout<<"Opcion invalida!";
break;
}
getch();
clrscr();
}while(o!=4);
}
int menu(void)
{
int o;
cout<<"===================================="<<endl<<"\t\tMENU"<<endl<<
"===================================="<<endl;
cout<<"1. Llenar el vector b;\n2. Llenar la matriz A;\n3. Obtener
el vector resultante x, del sistema Ax+b=0;\n4. Salir;\nOpcion: ";
cin>>o;
return o;
}
4. CONCLUSIÓN
19