![]() |
![]() |
| Paypal | 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();
}
//----------------------------------------------------------
|
![]() |
|
|
|