Скачиваний:
19
Добавлен:
20.06.2014
Размер:
21.25 Кб
Скачать
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <Math.h>
#include <ShellAPI.h>
#include <stdio.h>

#include "Metod_Gaussa.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

double opredelitel(double **Matr1, int size);
int proverka_zapoln (void);
void na_shag_vverh (double **M, int row); //перемещение строк при возникновении ситуации деления на ноль
int metod_Gaussa(void);
int perepoln_pri_umnosh(double x1, double x2);
int perepoln_pri_slosh(double x1, double x2);
void pogreshnost(void);


TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
        StringGrid1->ColCount = 3;
        StringGrid1->RowCount = 2;
        StringGrid2->ColCount = 1;
        StringGrid2->RowCount = 3;
        StringGrid1->Cells[2][0] = "b";
        StringGrid1->Cells[1][0] = "x1";
        StringGrid1->Cells[0][1] = "y1";
        StringGrid2->Cells[0][0] = "x1";
        Button1->Caption = "Добавить строку и столбец";
        Button2->Caption = "Решить систему";
        Button3->Caption = "Удалить строку и столбец";
        Button4->Caption = "Справка";
        Label1->Caption = "Погрешность= 10";
        Label1->Visible = false;
        Edit1->Visible = false;
}
//---------------------------------------------------------------------------

int metod_Gaussa (void)
{
   int size = Form1->StringGrid1->RowCount - 1;
   double **M;

   M = new double* [size];
   for (int i = 0; i < size; i++)
      {
      M[i] = new double[size + 1];
      }
   for (int i = 0; i < size; i++)
      {
      for (int j = 0; j < size + 1; j++)
         {
         M[i][j] = Form1->StringGrid1->Cells[j + 1][i + 1].ToDouble();
         }
      }

   for (int i = 0; i < size; i++)
       {
       for (int p = i; p < size + 1; p++)
           {
           if (M[i][i] == 0)
               {
               na_shag_vverh(M, i);
               }
           else
               break;
           if (p == size)
                return 1;
           }
       for (int j = 0; j < size; j++)
           {
           for (int k = size; k > i - 1; k--)
               {
               M[i][k] /= M[i][i];
               }
           if (i != j)
               {
               if (M[j][i] != 0)
                   {
                   for (int k = i; k < size + 1; k++)
                       {
                       M[i][k] *= M[j][i];
                       }
                   for (int k = i; k < size + 1; k++)
                       {
                       M[j][k] -= M[i][k];
                       }
                   }
               for (int k = size; k > i - 1; k--)
                   {
                   M[i][k] /= M[i][i];
                   }
               }
           }
       }
   for (int i = 0; i < size; i++)
       {
       Form1->StringGrid2->Cells[i][1] = M[i][size];
       }

   return 0;
}
//----------------------------------------------------------------------------

int proverka_zapoln(void)
{
        // Проверка заполненности всех ячеек
        for (int i = 0; i < Form1->StringGrid1->ColCount - 1; i++)
                {
                for (int j = 0; j < Form1->StringGrid1->ColCount - 2; j++)
                        {
                        if (Form1->StringGrid1->Cells[i + 1][j + 1] == "")
                                {
                                Application->MessageBoxA("Не все ячейки заполнены","Ошибка",0);
                                return 1;
                                }
                        try
                                {
                                Form1->StringGrid1->Cells[i + 1][j + 1].ToDouble();
                                }
                        catch(EConvertError&)
                                {
                                Application->MessageBoxA("Не во всех ячейках числовые данные","Ошибка",0);
                                return 1;
                                }
                        catch(...)
                                {
                                }
                        }
                }
        return 0;
}

//---------------------------------------------------------------------------

double opredelitel(double **Matr1, int size)
{
        double znach, znach1, **Matr, element;
        int error;
        if (size == 2)
                {
                error = perepoln_pri_umnosh(Matr1[0][0], Matr1[1][1]);
                if (error == 1)
                        return 3 * pow(10, 308);
                error = perepoln_pri_umnosh(Matr1[1][0], Matr1[0][1]);
                if (error == 1)
                        return 3 * pow(10, 308);
                error = perepoln_pri_slosh(Matr1[0][0]*Matr1[1][1], -Matr1[1][0]*Matr1[0][1]);
                if (error == 1)
                        return 3 * pow(10, 308);
                znach = Matr1[0][0]*Matr1[1][1] - Matr1[1][0]*Matr1[0][1];
                }
        else
                {
                znach = 0;
                Matr = new double* [size - 1];
                for (int i = 0; i < size - 1; i++)
                {
                Matr[i] = new double [size - 1];
                }
        for (int i = 0; i < size; i++)
                {
                element = Matr1[i][0];
                if (i%2 == 1)
                        element *= -1;
                for (int j = 0, j1 = 0; j < size - 1; j++, j1++)
                        {
                        if (j1 == i)
                                j1++;
                        if (j1 > size)
                                break;
                        for (int k = 0; k < size - 1; k++)
                                {
                                Matr[j][k] = Matr1[j1][k + 1];
                                }
                        }
                znach1 = opredelitel(Matr,size - 1);
                if (znach1 == 3 * pow(10, 308))
                        return 3 * pow(10, 308);
                error = perepoln_pri_umnosh(znach1, element);
                if (error == 1)
                        return 3 * pow(10, 308);
                znach1 *= element;
                error = perepoln_pri_slosh(znach, znach1);
                if (error == 1)
                        return 3 * pow(10, 308);
                znach += znach1;
                }
        }
    return znach;
}
//----------------------------------------------------------------------------

void na_shag_vverh (double **M, int row)
{
    int size = Form1->StringGrid1->RowCount;
    double *str = new double[size];

    for (int i = 0; i < size; i++)
        {
        str[i] = M[row][i];
        }
    for (int i = row; i < size - 2; i++)
        {
        for (int j = 0; j < size; j++)
            {
            M[i][j] = M[i + 1][j];
            }
        }
    for (int i = 0; i < size; i++)
        {
        M[size - 2][i] = str[i];
        }
    delete str;
    return;
}

//----------------------------------------------------------------------------

int perepoln_pri_umnosh(double x1, double x2)
{
        try
                {
                x1 * x2;
                }
        catch (EOverflow&)
                {
                Application->MessageBoxA("Программа не может продолжить вычисления, так как аппаратура не настолько мощна","Ошибка",0);
                return 1;
                }
        return 0;
}

//---------------------------------------------------------------------------

int perepoln_pri_slosh(double x1, double x2)
{
        try
                {
                x1 * x2;
                }
        catch (EOverflow&)
                {
                Application->MessageBoxA("Программа не может продолжить вычисления, так как аппаратура не настолько мощна","Ошибка",0);
                return 1;
                }
        return 0;
}

//---------------------------------------------------------------------------

void pogreshnost(void)
{
        double max = 0, promegut, b;
        for (int i = 1; i < Form1->StringGrid1->RowCount; i++)
                {
                promegut = 0;
                for (int j = 1; j < Form1->StringGrid1->RowCount; j++)
                        {
                        promegut += Form1->StringGrid1->Cells[j][i].ToDouble() * Form1->StringGrid2->Cells[j-1][1].ToDouble();
                        }
                if (promegut < 0)
                        promegut *= -1;
                b = Form1->StringGrid1->Cells[Form1->StringGrid1->RowCount][i].ToDouble();
                if (b < 0)
                        b *= -1;
                promegut = promegut - b;
                if (promegut < 0)
                        promegut *= -1;
                if (promegut > max)
                        max = promegut;
                }
        if (max)
                Form1->Edit1->Text = floor(log10(max));
        else
                Form1->Edit1->Text = "-oo";
        Form1->Label1->Visible = true;
        Form1->Edit1->Visible = true;

}


void __fastcall TForm1::Button1Click(TObject *Sender)
{
 //Добавление строки и столбца
    if (StringGrid1->RowCount > 9)
        return;
    if (StringGrid1->DefaultRowHeight > 30)
        {
        int razmer;
        if (Form1->Height * 1.3 > Form1->Width)
                razmer = Form1->Width;
        else
                razmer = Form1->Height * 1.3;

        StringGrid1->Height = 0.2 * razmer;
        StringGrid1->Width = 0.9 * razmer;
        StringGrid1->ColCount += 1;
        StringGrid1->RowCount += 1;
        StringGrid1->DefaultRowHeight = (StringGrid1->Height - StringGrid1->RowCount - 1)/StringGrid1->RowCount;
        StringGrid1->DefaultColWidth = (StringGrid1->Width - StringGrid1->ColCount - 1)/StringGrid1->ColCount;
        StringGrid1->Width = StringGrid1->DefaultColWidth * StringGrid1->ColCount + (StringGrid1->ColCount + 3);
        StringGrid1->Height = StringGrid1->DefaultRowHeight * StringGrid1->RowCount + (StringGrid1->ColCount + 3);
        StringGrid1->Font->Size = floor(StringGrid1->DefaultColWidth / 7);
        StringGrid2->Font->Size = StringGrid1->Font->Size;

        StringGrid2->DefaultRowHeight = StringGrid1->DefaultRowHeight;
        StringGrid2->DefaultColWidth = StringGrid1->DefaultColWidth;
        StringGrid2->Width = StringGrid1->Width - StringGrid1->DefaultColWidth * 2;
        StringGrid2->Height = StringGrid2->DefaultRowHeight * 2 + 3;
        StringGrid2->ColCount += 1;

        StringGrid1->Cells[StringGrid1->ColCount - 1][0] = StringGrid1->Cells[StringGrid1->ColCount - 2][0];
        StringGrid1->Cells[StringGrid1->ColCount - 2][0] = "x" + IntToStr(StringGrid1->ColCount - 2);
        StringGrid1->Cells[0][StringGrid1->RowCount - 1] = "y" + IntToStr(StringGrid1->RowCount - 1);
        StringGrid2->Cells[StringGrid1->ColCount - 3][0] = StringGrid1->Cells[StringGrid1->ColCount - 2][0];
        for (int i = 1; i < StringGrid1->ColCount; i++)
                {
                        StringGrid1->Cells[StringGrid1->ColCount - 1][i] = StringGrid1->Cells[StringGrid1->ColCount - 2][i];
                        StringGrid1->Cells[StringGrid1->ColCount - 2][i] = "";
                }
        }
    else
        {
        StringGrid1->ColCount += 1;
        StringGrid1->RowCount += 1;
        StringGrid1->Cells[StringGrid1->ColCount - 1][0] = StringGrid1->Cells[StringGrid1->ColCount - 2][0];
        StringGrid1->Cells[StringGrid1->ColCount - 2][0] = "x" + IntToStr(StringGrid1->ColCount - 2);
        StringGrid1->Cells[0][StringGrid1->RowCount - 1] = "y" + IntToStr(StringGrid1->RowCount - 1);
        StringGrid2->ColCount += 1;
        StringGrid2->Cells[StringGrid1->ColCount - 3][0] = StringGrid1->Cells[StringGrid1->ColCount - 2][0];
        for (int i = 1; i < StringGrid1->ColCount; i++)
                {
                        StringGrid1->Cells[StringGrid1->ColCount - 1][i] = StringGrid1->Cells[StringGrid1->ColCount - 2][i];
                        StringGrid1->Cells[StringGrid1->ColCount - 2][i] = "";
                }
        if ((StringGrid2->DefaultColWidth + 1) * StringGrid2->ColCount + 3 <= StringGrid1->Width)
                {
                StringGrid2->Width = (StringGrid2->DefaultColWidth + 1) * StringGrid2->ColCount + 5;
                }
        else
                {
                StringGrid2->Width = StringGrid1->Width;
                StringGrid2->Height = StringGrid2->DefaultRowHeight * 2 + 20;
                }
        }

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button3Click(TObject *Sender)
{
//Удаление строки и столбца
if (StringGrid1->ColCount > 3)
    {
    if (StringGrid1->DefaultColWidth * (StringGrid1->ColCount - 1) + StringGrid1->ColCount < StringGrid1->Width)
       {
        int razmer;
        if (Form1->Height * 1.3 > Form1->Width)
                razmer = Form1->Width;
        else
                razmer = Form1->Height * 1.3;

        StringGrid1->Height = 0.2 * razmer;
        StringGrid1->Width = 0.9 * razmer;
        for (int i = 0; i < StringGrid1->RowCount - 1; i++)
                {
                StringGrid1->Cells[StringGrid1->ColCount - 2][i] = StringGrid1->Cells[StringGrid1->ColCount - 1][i];
                }
        StringGrid1->ColCount--;
        StringGrid1->RowCount--;
        StringGrid2->ColCount--;
        StringGrid1->DefaultRowHeight = (StringGrid1->Height - StringGrid1->RowCount - 1)/StringGrid1->RowCount;
        StringGrid1->DefaultColWidth = (StringGrid1->Width - StringGrid1->ColCount - 1)/StringGrid1->ColCount;
        StringGrid1->Width = StringGrid1->DefaultColWidth * StringGrid1->ColCount + (StringGrid1->ColCount + 3);
        StringGrid1->Height = StringGrid1->DefaultRowHeight * StringGrid1->RowCount + (StringGrid1->ColCount + 3);
        StringGrid1->Font->Size = floor(StringGrid1->DefaultColWidth / 7);
        StringGrid2->Font->Size = StringGrid1->Font->Size;

        StringGrid2->DefaultRowHeight = StringGrid1->DefaultRowHeight;
        StringGrid2->DefaultColWidth = StringGrid1->DefaultColWidth;
        StringGrid2->Width = StringGrid1->Width - StringGrid1->DefaultColWidth * 2;
        StringGrid2->Height = StringGrid2->DefaultRowHeight * 2 + 3;
        }
    else
        {
        for (int i = 0; i < StringGrid1->RowCount - 1; i++)
                {
                StringGrid1->Cells[StringGrid1->ColCount - 2][i] = StringGrid1->Cells[StringGrid1->ColCount - 1][i];
                }
        StringGrid1->ColCount--;
        StringGrid1->RowCount--;
        StringGrid2->ColCount--;
        if ((StringGrid2->DefaultColWidth + 1) * StringGrid2->ColCount + 3 < StringGrid1->Width)
                {
                StringGrid2->Width = (StringGrid2->DefaultColWidth + 1) * StringGrid2->ColCount + 5;
                }
        else
                {
                StringGrid2->Width = StringGrid1->Width;
                StringGrid2->Height = StringGrid2->DefaultRowHeight * 2 + 20;
                }
        }
    if (StringGrid2->DefaultColWidth * StringGrid2->ColCount + StringGrid2->ColCount < StringGrid2->Width)
        StringGrid2->Height = StringGrid2->DefaultRowHeight * 2;
    }

}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
        double op = 1;
        int a = proverka_zapoln();
        if (a == 1)
                {
                return;
                }

        double **M;
        int n = StringGrid1->ColCount - 2;

        M = new double* [n];
        for (int i = 0; i < n; i++)
                {
                M[i] = new double [n];
                }

        for (int i = 0; i < n; i++)
                {
                for (int j = 0; j < n; j++)
                        {
                        M[i][j] = StringGrid1->Cells[j+1][i+1].ToDouble();
                        }
                }

        if (n > 1)
                op = opredelitel(M, n);
        if (op)
                {
                metod_Gaussa();
                pogreshnost();
                }
        else
                Application->MessageBoxA("Эта система содержит линейно зависимые уравнения","Ошибка",0);

}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormResize(TObject *Sender)
{
        int razmer;
        if (Form1->Height * 1.3 > Form1->Width)
                razmer = Form1->Width;
        else
                razmer = Form1->Height * 1.3;
        if (StringGrid1->Top == 0.14 * razmer)
                return;
        StringGrid1->Top = 0.24 * razmer;
        StringGrid2->Top = 0.47 * razmer;
        Button1->Top = 0.06 * razmer;
        Button2->Top = 0.06 * razmer;
        Button3->Top = 0.14 * razmer;
        Button4->Top = 0.06 * razmer;
        Label1->Top = 0.16 * razmer;
        Edit1->Top = 0.14 * razmer;
        StringGrid1->Left = 0.05 * razmer;
        StringGrid2->Left = 0.05 * razmer;
        Button1->Left = 0.05 * razmer;
        Button2->Left = 0.4 * razmer;
        Button3->Left = 0.05 * razmer;
        Button4->Left = 0.82 * razmer;
        Label1->Left = 0.4 * razmer;
        Edit1->Left = 0.57 * razmer;
        StringGrid1->Width = 0.9 * razmer;
        StringGrid1->Height = 0.2 * razmer;

        if ((StringGrid1->Height - StringGrid1->RowCount)/StringGrid1->RowCount > 30)
                {
                StringGrid1->DefaultRowHeight = (StringGrid1->Height - StringGrid1->RowCount)/StringGrid1->RowCount;
                StringGrid1->DefaultColWidth = (StringGrid1->Width - StringGrid1->ColCount)/StringGrid1->ColCount;
                StringGrid1->Width = StringGrid1->DefaultColWidth * StringGrid1->ColCount + (StringGrid1->ColCount + 3);
                StringGrid1->Height = StringGrid1->DefaultRowHeight * StringGrid1->RowCount + (StringGrid1->ColCount + 3);
                StringGrid1->Font->Size = floor(StringGrid1->DefaultColWidth * 1 / 7);
                StringGrid2->Font->Size = StringGrid1->Font->Size;

                StringGrid2->DefaultRowHeight = StringGrid1->DefaultRowHeight;
                StringGrid2->DefaultColWidth = StringGrid1->DefaultColWidth;
                StringGrid2->Width = StringGrid1->Width - StringGrid1->DefaultColWidth * 2;
                StringGrid2->Height = StringGrid2->DefaultRowHeight * 2 + 3;
                }
        else
                {
                StringGrid1->DefaultColWidth = 116;
                StringGrid2->DefaultColWidth = 116;
                StringGrid1->DefaultRowHeight = 30;
                StringGrid1->DefaultRowHeight = 30;
                StringGrid2->Font->Size = StringGrid1->Font->Size;
                StringGrid1->Font->Size = floor(StringGrid1->DefaultColWidth * 1 / 7);
                StringGrid2->Font->Size = StringGrid1->Font->Size;
                if ((StringGrid2->DefaultColWidth + 1) * StringGrid2->ColCount + 3 <= StringGrid1->Width)
                        {
                        StringGrid2->Width = (StringGrid2->DefaultColWidth + 1) * StringGrid2->ColCount + 5;
                        StringGrid2->Height = StringGrid2->DefaultRowHeight * 2 + 5;
                        }
                else
                        {
                        StringGrid2->Width = StringGrid1->Width;
                        StringGrid2->Height = StringGrid2->DefaultRowHeight * 2 + 20;
                        }
                }

        Button1->Height = 0.06 * razmer;
        Button1->Width = 0.3 * razmer;
        Button1->Font->Size = 0.017 * razmer;
        Button2->Height = 0.06 * razmer;
        Button2->Font->Size = 0.017 * razmer;
        Button2->Width = 0.37 * razmer;
        Button3->Height = 0.06 * razmer;
        Button3->Font->Size = 0.017 * razmer;
        Button3->Width = 0.3 * razmer;
        Button4->Height = 0.06 * razmer;
        Button4->Font->Size = 0.017 * razmer;
        Button4->Width = 0.12 * razmer;
        Label1->Font->Size = 0.017 * razmer;
        Edit1->Height = 0.04 * razmer;
        Edit1->Font->Size = 0.017 * razmer;
        Edit1->Width = 0.06 * razmer;


}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button4Click(TObject *Sender)
{
        FILE* stream;
        stream = fopen("Gauss_help.mht","rt");
        if (!stream)
                {
                Application->MessageBoxA("Не найден файл со справкой","Ошибка",0);
                return;
                }
        ShellExecute(Handle,NULL,"Gauss_help.mht",NULL,NULL,SW_RESTORE);
}
//---------------------------------------------------------------------------
Соседние файлы в папке Курсовая работа (метод Гаусса) + метод дихотомии
  • #
    20.06.20142.69 Mб20Merod_Gaussa.ils
  • #
    20.06.201410.41 Кб19Merod_Gaussa.obj
  • #
    20.06.2014876 б19Merod_Gaussa.res
  • #
    20.06.2014720.9 Кб19Merod_Gaussa.tds
  • #
    20.06.20143.97 Кб19Merod_Gaussa.~bpr
  • #
    20.06.201421.25 Кб19Metod_Gaussa.cpp
  • #
    20.06.20143.04 Кб20Metod_Gaussa.dfm
  • #
    20.06.20141.29 Кб20Metod_Gaussa.h
  • #
    20.06.201435.73 Кб19Metod_Gaussa.obj
  • #
    20.06.201421.25 Кб20Metod_Gaussa.~cpp
  • #
    20.06.20143.04 Кб19Metod_Gaussa.~dfm