Sie sind auf Seite 1von 6

#include <iostream>

#include <iomanip>
#include <string>
#include <cmath>
#include <fstream>
using namespace std;
int cant_variables=0;
int cant_ecuaciones;
void Sist_ecuaciones();
float **CrearMatriz(int filas, int columnas);
void imprimir_matriz(float **matriz, int fila, int columnas);
int longitud(float valor);
void op_filas_1(float **matriz, int fila, float k, int columnas);
void op_filas_2(float **matriz, int fila1, int fila2, float k, int columnas);
void op_filas_3(float **matriz, int fila1, int fila2, int columnas);
void sistema_resolvente(float **matriz, int filas, int columnas);
int main(){
cout << " BIENVENIDO AL ASISTENTE DE RESOLUCION DE ECUACIONES LINEALES POR M
ATRICES V0.1\n\n";
char opc;
int control = 1;
while(control){
switch(control){
case 1:
cout << " Elija una opcion: \n"
<< "\t A.Ingresar sistema de ecuaciones lineales. \n"
<< "\t B.Calcular A^(-1) de A que se ingreso la ultima vez.
\n"
<< " Opcion que desea: ";
cin >> opc;
cout << endl;
switch(opc){
case 'A':
case 'a':
control = 2;
Sist_ecuaciones();
break;
default:
cout << " La opcion elegida no es correcta. Intente nuev
amente. \n\n";
}
break;
case 2:
cout << "\n Desea realizar otra operacion?(S/N)";
cin >> opc;
switch(opc){
case 'S':
case 's':
control = 1;
break;
case 'N':
case 'n':
cout << "\n\n Programa codificado por FRANCO SABBATINI y
DENIS LORENZON. Licencia tipo GPL. \n\n";
control = 0;
break;
default:
cout << " La opcion elegida no es correcta. Intente nuev
amente. \n\n";
}
break;
}
}
system("PAUSE");
return 0;
}
void Sist_ecuaciones(){
cout << " Cuantas variables (Xn) posee su sistema de ecuaciones lineales? "
;
cin >> cant_variables;
cant_variables++; //suma 1 para terminos independientes
cout << " Cuantas ecuaciones lineales posee su sistema ";
cin >> cant_ecuaciones;

float **matriz = CrearMatriz(cant_ecuaciones, cant_variables);


//Poner todas los coeficientes de las variables de cada ecuacion en 0
for(int i=0; i<cant_ecuaciones; i++){
for (int a=0; a<cant_variables; a++){
matriz[i][a]=0;
}
}
for (int ecuacion=0; ecuacion<cant_ecuaciones; ecuacion++){
for (int variable=0; variable<cant_variables; variable++){
if(variable<(cant_variables-1)){
cout << "\n Ingrese el coeficiente de la variable X" << variabl
e+1 << " de la ecuacion " << ecuacion+1 << ": ";
while (!(cin >> matriz[ecuacion][variable])){
cout << " Lo que usted ingreso no es un numero, intente n
uevamente:";
cin.clear();
string c;
cin >> c;
}
} else {
cout << "\n Ingrese el termino independiente de la ecuacion
" << ecuacion+1 << ": ";
while (!(cin >> matriz[ecuacion][variable])){
cout << " Lo que usted ingreso no es un numero, intent
e nuevamente:";
cin.clear();
string c;
cin >> c;
}
}
cout << "Su matriz hasta ahora: \n";
imprimir_matriz(matriz, cant_ecuaciones, cant_variables);
}
}//introduccion de matriz concluida
sistema_resolvente(matriz, cant_ecuaciones, cant_variables);
}
float **CrearMatriz(int filas, int columnas)
{
float **p = new float* [filas]; //siendo p la matriz que se creara
for (int j = 0; j < filas; j ++)
p[j] = new float[columnas];
return p;
}
void imprimir_matriz(float **matriz, int filas, int columnas){
int mas_largo = 1;
//ver cual es el valor mas largo de toda la matriz para adaptarlo a todas l
as filas
for(int i=0; i<filas; i++){
for (int a=0; a<columnas; a++){
if (mas_largo < longitud(matriz[i][a])){
mas_largo = longitud(matriz[i][a]);
}
}
}
for(int i=0; i<filas; i++){
cout << "| ";
for (int a=0; a<columnas; a++){
if(a<(columnas-1))
cout << setw(mas_largo+4)<< setprecision(3)<< fixed << matr
iz[i][a] << " ";
else
cout << "| " << setw(mas_largo+4)<< setprecision(3)<< fixed
<< matriz[i][a] << " ";
}
cout << "|\n";
}
}
//calcula la longitud de un numero
int longitud(float valor){
int contador = 1;
int temp = (int)valor;
//incrementa en un digito cada vez
for(int i=1; i<temp; i*=10){
contador++;
}
return contador;
}
//kF siendo k un escalar
void op_filas_1(float **matriz, int fila, float k, int columnas){
for (int a=0; a<columnas; a++)
matriz[fila][a] *= k;
}
//F1 + kF2 siendo k un escalar y F1 la modificada
void op_filas_2(float **matriz, int fila1, int fila2, float k, int columnas){
for (int a=0; a<columnas; a++)
matriz[fila1][a] += (k*matriz[fila2][a]);
}
//F1<->F2 intercambio de filas
void op_filas_3(float **matriz, int fila1, int fila2, int columnas){
float temp = 0;
for (int a=0; a<columnas; a++){
temp = matriz[fila1][a];
matriz[fila1][a] = matriz[fila2][a];
matriz[fila2][a] = temp;
}
}
//obtiene sistema resolvente
void sistema_resolvente(float **matriz, int filas, int columnas){
int fila_operada = 0;
int cant_col_nulas = 0;
int filas_cambiadas = 0;
ofstream escArchivo("operaciones.txt");
/*
el archivo de salida sera escrito del siguiente modo
1 2 4 0 operacion 1, F2*4, es decir tipo_operacion, fila, escalar, 0
(sin_parametro)
2 4 3 5 operacion 2, F4+5*F3, es decir tipo_opeacion, fila_modificada
, fila_premultiplicada, escalar
3 5 8 0 operacion 3, F5<->F8, es decir tipo_operacion, fila1, fila2,
0(sin_parametro)
*/
//busca filas nulas y las coloca al final
for(int a = (filas-1); a>=0; a--){
for(int i=0; i<(columnas-1); i++){
if(matriz[a][i] == 0){
cant_col_nulas++;
fila_operada = a;
} else {
cant_col_nulas = 0;
break;
}
}
if(cant_col_nulas == (columnas-1)){
if(fila_operada != (filas-1)){ //si la fila nula no es la ultima
cout << "Hace operacion de filas tipo 3: F" << fila_operada+1
<< "<->" << "F" << filas-filas_cambiadas << "\n";
filas_cambiadas++;
op_filas_3(matriz, fila_operada, (filas-filas_cambiadas), colu
mnas);
imprimir_matriz(matriz, cant_ecuaciones, cant_variables);
if(escArchivo.is_open()){
escArchivo << "3 " << fila_operada << " " << (filas-filas_
cambiadas) << " " << 0 << endl;
}
cant_col_nulas = 0;
} else {
filas_cambiadas++;
cant_col_nulas = 0;
}
}
} //termina de colocar filas nulas al final
//comienza buscando en la primera columna el primer elemento no nulo
int centinela = 0;
for(int i=0; i<(columnas-1); i++){ //columnas-1 para que no evalue terminos
independientes
for(int a=0; a<(filas); a++){
if((matriz[a][i] != 1) && (matriz[a][i] != 0)){
if(a > centinela){ //si el elemento no nulo de esa columna no e
sta en su lugar correspondiente
if(matriz[centinela][i] == 0){
cout << "Hacer operacion de filas tipo 3: F" << a+1 <<
"<->F" << centinela+1 << "\n";
op_filas_3(matriz, a, centinela, columnas);
imprimir_matriz(matriz, cant_ecuaciones, cant_variables
);
if(escArchivo.is_open()){
escArchivo << "3 " << a << " " << centinela << " "
<< 0 << endl;
}
}
}
/* una vez ubicado en su lugar correspondiente, convertir este
valor en 1
utilizando su valor inverso como escalar para igualar a 1 */
if(matriz[centinela][i] != 0){
if(escArchivo.is_open()){
//guardamos operacion antes de operar
escArchivo << "1 " << centinela << " " << pow(matriz[ce
ntinela][i], -1) << " " << 0 << endl;
}
cout << "Hacer operacion de filas tipo 1: " << pow(matriz[c
entinela][i], -1) << "F" << centinela+1 << "\n";
op_filas_1(matriz, centinela, pow(matriz[centinela][i], -1)
, columnas);
imprimir_matriz(matriz, cant_ecuaciones, cant_variables);
}
} else if(matriz[a][i] == 1) {
if(a > centinela){ //si el elemento conductor de esa columna no
esta en su lugar correspondiente
cout << "Hacer operacion de filas tipo 3: F" << a+1 << "<->
F" << centinela+1 << "\n";
op_filas_3(matriz, a, centinela, columnas);
imprimir_matriz(matriz, cant_ecuaciones, cant_variables);
if(escArchivo.is_open()){
escArchivo << "3 " << a << " " << centinela << " " << 0
<< endl;
}
}
}
//una vez hecho esto, igualar a 0 todos los elementos restantes de
esa columna
if((matriz[a][i] != 0) && (a != centinela)){ //para no convertir el
emento conductor a 0
if(matriz[centinela][i] != 0){
if(escArchivo.is_open()){
//guardamos operacion antes de operar
escArchivo << "2 " << a << " " << centinela << " " << -
1*(matriz[a][i]) << endl;
}
cout << "Hacer operacion de filas tipo 2: F" << a+1 << "+("
<< -1*(matriz[a][i]) << ")F" << centinela+1 << "\n";
op_filas_2(matriz, a, centinela, -(matriz[a][i]), columnas)
;
imprimir_matriz(matriz, cant_ecuaciones, cant_variables);
if(escArchivo.is_open()){
escArchivo << "2 " << a << " " << centinela << " " << -
1*(matriz[a][i]) << endl;
}
}
}
}
centinela++;
}
escArchivo.close();
}

Das könnte Ihnen auch gefallen