FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
Resolución sistemas de ecuaciones
Saludos: Hay bastantes programas que resuelven problemas matemáticos, pero SIN CÓDIGO FUENTE.
El programa consta de un formulario en el que se han pegado los siguientes controles: - Un TStringGrid que sirve para introducir la matriz ampliada del sistema (coeficientes de las variables + los términos independientes). Se ha puesto a cero las propiedades FixedCols y FixedRows para que no se muestren los botones de filas y de columnas. - Un TMemo con en el que se indica como introducir los datos. La propiedad Lines tiene el siguiente texto: Introduzca los coeficientes de las incógnitas en las n primeras columnas y los términos independientes en la columna n+1: Ejemplo: X1+X2+X3=6; Introducir; 1 1 1 6 X1-X2+X3=2; " 1 -1 1 2 X1+X2-X3=0; " 1 1 -1 0 Las soluciones son: X1=1; X2=2; X3=3 Se permite hasta 100 incógnitas. La propiedad ReadOnly está a true para impedir modificar el texto. -Un TEdit con una etiqueta (Nº de incónitas) -Un TStatusBar para dar las soluciones. -Un botón para inicial los cálculos. -Un botón para imprimir la pantalla, si se desea Cómo funciona: 1) Se introduce el nº de incógnitas en el TEdit. Se pulsa intro y se redimensiona la rejilla con n filas y n+1 columnas. También se redimensionan las celdas. 2) Se introduce la matriz ampliada y se pulsa el botón para calcular. Código:
//--------------------------------------------------------------------------- #include <vcl\vcl.h> #include <stdio.h> #include <malloc.h> #pragma hdrstop #include "ecu1.h" //--------------------------------------------------------------------------- #pragma link "Grids" #pragma resource "*.dfm" TEcuaci *Ecuaci; //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- #include <vcl\vcl.h> #pragma hdrstop //--------------------------------------------------------------------------- int resuelve(int filas,double *datos); //-------------------------------------------------- int resuelve(int filas,double *datos) { /* Función que resulve el sistema. Recibe como parámetros el número de incógnitas y por la matriz ampliada */ int i,j,k; int columnas; columnas=filas+1; for (i=0;i<filas;i++) { if (*(datos+i*columnas+i)==0.0) return 1; for (j=columnas-1;j>=0;j--) { *(datos+i*columnas+j) /= *(datos+i*columnas+i); } for (j=i+1;j<filas;j++) { for (k=columnas-1;k>=i;k--) *(datos+j*columnas+k)-=*(datos+j*columnas+i) * *(datos+i*columnas+k); } } for (i=filas-2;i>=0;i--) { for (j=columnas-2;j>i;j--) { *(datos+i*columnas+columnas-1)-= \ *(datos+i*columnas+j) * *(datos+j*columnas+columnas-1); *(datos+i*columnas+j)=0; } } return 0; } __fastcall TEcuaci::TEcuaci(TComponent* Owner) : TForm(Owner) { } //---------------------------------------------------------- void __fastcall TEcuaci::Edit1Exit(TObject *Sender) { //Al salir del control TEdit se limpia la rejilla for (int i=1;i<Grid1->ColCount;i++) {for (int n=1;n<Grid1->RowCount;n++) Grid1->Cells[i][n]="";} //Se asignan tantas filas como incógnitas y como columnas //una mas que filas. Grid1->ColCount=atoi(Edit1->Text.c_str())+1; Grid1->RowCount=atoi(Edit1->Text.c_str()); //Se redimensinan las celdas if (Grid1->ColCount*Grid1->DefaultColWidth<393) Grid1->DefaultColWidth=384/Grid1->ColCount; else Grid1->DefaultColWidth=64; Grid1->Col=1; } //---------------------------------------------------------- void __fastcall TEcuaci::Button1Click(TObject *Sender) { //este botón obtiene el nº de incógnitas de TEdit y //rellena una matriz de n*n+1 con los datos introducidos //en la rejilla, convirtiéndolos a coma flotante int nVariables=atoi(Edit1->Text.c_str()); double V[100][101]; double *V1=&V[0][0]; int i=0; for (int a =0;a<nVariables;a++) { for (int b =0;b<nVariables+1;b++) { *(V1+i)=atof(Ecuaci->Grid1->Rows[a]->Strings[b].c_str()); i++; } } if (resuelve(nVariables,V1)==1)// L ShowMessage("Matriz singular"+String("\nSistema incompatible o indeterminado")); else { String Cadena; int g=1; StatusBar1->SimpleText=""; for (int a=nVariables;a<nVariables*(nVariables+1);a=a+nVariables+1) { Cadena=Cadena+"X"+String(g)+"="+String(*(V1+a))+"; "; g++; } StatusBar1->SimpleText=Cadena; } } void __fastcall TEcuaci::Edit1KeyUp(TObject *Sender, WORD &Key, TShiftState Shift) { if ((Key==13)|(Key ==9)) Grid1->SetFocus(); //si se pulsa enter en el TEdit pasa el foco a la rejilla. } //--------------------------------------------------------------------------- void __fastcall TEcuaci::BitBtn1Click(TObject *Sender) { Print(); } //---------------------------------------------------------- |
|
|
|