Решение системы линейных уравнений методом Крамера

Автор работы: Пользователь скрыл имя, 26 Сентября 2013 в 15:33, курсовая работа

Краткое описание

Пять лет назад известная компания Borland выпустила первую версию своего средства визуального программирования Delphi. К разочарованию приверженцев фигурных скобок (в связи со спецификой языка именно так называют программистов, использующих С или С++) программы в Delphi надо было писать на языке Pascal, имеющем дурную репутацию "студенческого". Однако большинство серьёзных разработчиков вскоре поняло, что Pascal уже не "игрушка для детей", каким его можно было считать раньше, а новое профессиональное средство для быстрой разработки высококачественных программных продуктов.

Содержание

.Введение………………………………………………………………..3
2.Постановка задачи и сфера её использования…………………..…11
3.Теоретическая часть………………………………………………….12
3.1 Определители………………………………………………...12
3.2 Метод Крамера……………………………………………….16
4.Программная реализация…………………………………………….19
4.1 Представление алгоритма программы……………………...19
4.2 Описание компонентов программы………………………...20
5.Инструкция пользователя…………………………………………….33
6.Вывод…………………………………………………………………..34
7.Список литературы…………………………………………………...

Вложенные файлы: 1 файл

Пояснительная записка.doc

— 8.17 Мб (Скачать файл)

Кнопка Копировать используется для копирования текста отчёта ,для этого нужна выделить текст и нажать на кнопку Копировать. Выполняется процедура: procedure TfmReport.BitBtn4Click(Sender: TObject).

Кнопка Закрыть используется для закрытия формы fmReport. Реализуется процедура: procedure TfmReport.BitBtn1Click(Sender: TObject).

3. При выборе пункта меню Настройки       Параметры вызывается форма  fmSetting.


На ней находятся объекты типа: TbitBtn(2), TgroupBox(3), Tlabel(4), TcheckBox(3) , Tedit(2), TspinEdit(1).

Для обработки выводимого  результата используется 2 компонента типа: TcheckBox и TspinEdit.

    • Компонент типа TcheckBox используется для настройки округления выводимых чисел.

    • Компонент типа TspinEdit позволяет выбрать нужное количество знаков после запятой в выводимом результате.

Для задания начальных  параметров заполнения таблицы коэффициентов при неизвестных используются  компоненты типа: Tedit(2), TcheckBox.

    • Компоненты типа Tedit предназначены для выбора минимального  и максимального случайного числа.

    • Компонент  типа TcheckBox используется для настройки заполнения пустых ячеек нулями.

Для настройки сохранения результатов отчёта при наполнении  таблицы другими элементами предназначен компонент типа TcheckBox.

Кнопка Применить предназначена для сохранения всех выбранных настроек, реализуется с помощью процедуры: procedure TfmSetting.BitBtn1Click(Sender: TObject).

Кнопка Отменить предназначена для отмены выбранных настроек и возвращения старых , выполняется процедура: procedure TfmSetting.BitBtn2Click(Sender: TObject).

4.Форма fAbout появляется  при нажатии на пункт меню О программе,

реализуется процедура : procedure TfmMain.N8Click(Sender: TObject).

На ней расположен компонент типа Тimage, который используется для вывода рисунка на форму.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

5 ИНСТРУКЦИЯ ПОЛЬЗОВАТЕЛЯ

 

Программа, которая была разработана в ходе выполнения курсовой работы, позволяет с помощью метода Крамера и с помощью расширенной матрицы решить систему линейных уравнений.

Минимальные системные требования для работы программы:

- OS MS-DOS или Windows

- 1,51 МБ на жестком диске

Прилагаемый к курсовой работе диск содержит следующие файлы:

- Kramer.exe (разработанная программа)

- Delphi proekt(текст программы)

- Курсовой.doc (пояснительная записка)

Для запуска программы Kramer необходимо запустить находящуюся на дискете программу Kramer.exe.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6 ВЫВОД

 

В ходе выполнения курсовой работы была разработана программа, с помощью которой можно решить систему линейных уравнений по методу Крамера и с помощью расширенной матрицы.

Ниже приведен результат работы программы.

Настройка параметров:

Заполнение таблицы:

Решение:

 

Вывод Отчёта:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

7 СПИСОК ЛИТЕРАТУРЫ

1.А.Я. Архангельский  Программирование в Delphi 7

2. Культин Н. Б.  Основы программирования в Delphi 7

3. http://www.allbest.ru

4. Библия Delphi (Михаил Фленов)

5. Алексей Савкин. Delphi: программирование для всех!

6. physics.herzen.spb.ru

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

8 ПРИЛОЖЕНИЕ

unit main;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Grids, Spin, Menus, ExtCtrls, Buttons, IniFiles, XPMan;

 

type

  TfmMain = class(TForm)

    mm: TMainMenu;

    Panel1: TPanel;

    GroupBox1: TGroupBox;

    sg1: TStringGrid;

    GroupBox2: TGroupBox;

    lb: TListBox;

    N1: TMenuItem;

    N2: TMenuItem;

    N3: TMenuItem;

    N4: TMenuItem;

    N5: TMenuItem;

    OD: TOpenDialog;

    SD: TSaveDialog;

    Panel2: TPanel;

    sed: TSpinEdit;

    Label1: TLabel;

    BitBtn1: TBitBtn;

    N6: TMenuItem;

    N7: TMenuItem;

    btGo: TButton;

    Button1: TButton;

    btClear: TBitBtn;

    btReport: TBitBtn;

    N8: TMenuItem;

    procedure btGoClick(Sender: TObject);

    procedure sedChange(Sender: TObject);

    procedure FormCreate(Sender: TObject);

    procedure sedKeyPress(Sender: TObject; var Key: Char);

    procedure Button1Click(Sender: TObject);

    procedure N5Click(Sender: TObject);

    procedure Image1Click(Sender: TObject);

    procedure N2Click(Sender: TObject);

    procedure N3Click(Sender: TObject);

    procedure BitBtn1Click(Sender: TObject);

    procedure N7Click(Sender: TObject);

    procedure sg1KeyPress(Sender: TObject; var Key: Char);

    procedure btClearClick(Sender: TObject);

    procedure btReportClick(Sender: TObject);

    procedure N8Click(Sender: TObject);

  

  private

    { Private declarations }

  public

    { Public declarations }

    rndmax : integer;

    rndmin : integer;

    okr:boolean;

    nzn:integer;

    zapnul : boolean;

    clrep : boolean;

    ini : TIniFile;

    procedure Zap();

    function AllZap(StrGrid:TStringGrid):boolean;

    procedure SaveStringGrid(StringGrid: TStringGrid; const FileName: TFileName);

    procedure LoadStringGrid(StringGrid: TStringGrid; const FileName: TFileName);

  end;

 

var

  fmMain: TfmMain;

  MaxDimension : integer;

 

implementation

 

uses sett, report, Unit1;

 

{$R *.dfm}

procedure TfmMain.btGoClick(Sender: TObject);   //при нажатии на кнопку  Решыть

type

  Vector = array[1..21] of Double;

  Matrix = array[1..21] of Vector;

var

  a: Matrix;

  b,x: Vector;

  h: Double;

  i,j,k,n:integer;

begin

  if not AllZap(sg1) then

  begin

    Application.MessageBox('Недопустимое  значение!','Ошибка!',mb_ok or mb_iconerror);

    exit;

  end;

//Размерность  системы

  n := StrToIntDef(Text, sg1.ColCount);

  //Коэффициенты

  for j := 1 to n - 2 do

    for i := 1 to n - 2 do

      a[i, j] := StrToFloatDef(sg1.Cells[j, i], 0);

  //Правая  часть уравнения

  for I := 1 to n - 2 do

    b[i] := StrToFloatDef(sg1.Cells[sg1.colcount-1, i], 0);

  //Прямой  ход - исключение переменных

  for i:=1 to n-2 do

    for j:=i+1 to n-1 do

    begin

    IF a[i,i] = 0 then

    begin

      Application.MessageBox('Система несовместна','Решено!',mb_ok or mb_iconwarning);

      lb.Clear;

      lb.Items.Add('Система несовместна!');

      exit;

    end;

      a[j,i]:=-a[j,i]/a[i,i];

      for k:=i+1 to n-1 do

        a[j,k]:=a[j,k]+a[j,i]*a[i,k];

        b[j]:=b[j]+a[j,i]*b[i]

    end;

    x[n-2]:=b[n-2]/a[n-2,n-2];

    //Обратный  ход - нахождение корней

    for i:=n-2 downto 1 do

    begin

      h:=b[i];

      for j:=i+1 to n-1 do h:=h-x[j]*a[i,j];

      x[i]:=h/a[i,i]

    end;

    //Вывод  результата

    lb.Clear;

    for i:=1 to n-2 do

      if okr then

        lb.Items.Append('x(' + IntToStr(i) + ') = ' + IntToStr(Round(x[i])))  else

          lb.Items.Append('x(' + IntToStr(i) + ') = ' + format('%10.'+IntToStr(nzn)+'f',[x[i]]));

    btReport.Enabled:=true;

end;

 

procedure TfmMain.sedChange(Sender: TObject);  //количество уравнений

begin

  if sed.Value < 2 then sed.Value:=2;

  if sed.Value >10 then sed.Value:=20;

  sg1.ColCount:=sed.Value+2;

  sg1.RowCount:=sed.Value+1;

  Zap();

end;

 

procedure TfmMain.FormCreate(Sender: TObject);

begin

  sed.Value:=2;

  sg1.ColCount:=sed.Value+2;

  sg1.RowCount:=sed.Value+1;

  Zap();

  try

    ini:=TIniFile.Create(ExtractFilePath(Application.ExeName)+'\setting.ini');

    rndmax:=ini.ReadInteger('PARAM','RandMax',20);

    rndmin:=ini.ReadInteger('PARAM','RandMin',0);

    okr:=ini.ReadBool('PARAM','IsRound',false);

    nzn:=ini.ReadInteger('PARAM','ZnCount',2);

    zapnul:=ini.ReadBool('PARAM','IsZapNul',true);

    clrep:=ini.ReadBool('PARAM','IsClearRep',false);

  except

  end;

end;

 

procedure TfmMain.sedKeyPress(Sender: TObject; var Key: Char);

begin

  key:=#0;

end;

 

procedure TfmMain.Zap;

var

  i:integer;

begin

  for i:=1 to sg1.RowCount do

  begin

    sg1.Cells[0,i]:='x'+inttostr(i);

  end;

  for i:=1 to sg1.ColCount do

  begin

    if (i<>sg1.ColCount-1) then

      sg1.Cells[i,0]:='a'+IntTostr(i)

       else

        sg1.Cells[i,0]:='b';

  end;

end;

 

function TfmMain.AllZap(StrGrid: TStringGrid): boolean;

var

  i,j:integer;

begin

  for i:=1 to StrGrid.ColCount-1 do

    for j:=1 to StrGrid.RowCount - 1 do

    begin

      if StrGrid.Cells[i,j] = '' then

      begin

        if not okr then

        begin

          Result:= false;

          exit;

        end else

          begin

            StrGrid.Cells[i,j] := '0';

          end;

      end;

      if pos('-',StrGrid.Cells[i,j])>1 then

      begin

        StrGrid.Row:=j;

        StrGrid.Col:=i;

        Result:=false;

        exit;

      end;

    end;

  Result:=true;

end;

 

procedure TfmMain.Button1Click(Sender: TObject); //Заполнение таьлицы случайными  числами

var

  i,j:integer;

begin

  lb.Clear;

  randomize;

  for i:=1 to sg1.ColCount-1 do

    for j:=1 to sg1.RowCount-1 do

      sg1.Cells[i,j]:=IntToStr(Random(rndmax)-rndmin);

  btReport.Enabled:=false;

end;

 

procedure TfmMain.N5Click(Sender: TObject);   //выход

begin

  Close;

end;

 

procedure TfmMain.Image1Click(Sender: TObject);

begin

  close;

end;

 

procedure TfmMain.SaveStringGrid(StringGrid: TStringGrid;

  const FileName: TFileName);

var 

   f:    TextFile;  

   i, k: Integer;

begin

   if ExtractFileExt(FileName)='.stm' then AssignFile(f, FileName) else

   AssignFile(f, FileName+'.stm');

   Rewrite(f);  

   with StringGrid do 

   begin 

    Writeln(f, ColCount);

     Writeln(f, RowCount);  

    for i := 0 to ColCount - 1 do

       for k := 0 to RowCount - 1 do 

         Writeln(F, Cells[i, k]);  

   end;  

   CloseFile(F);

end;

 

procedure TfmMain.LoadStringGrid(StringGrid: TStringGrid;

  const FileName: TFileName);

var 

   f:          TextFile;  

   iTmp, i, k: Integer;  

   strTemp:    String;

begin 

   AssignFile(f, FileName);  

   Reset(f);  

   with StringGrid do 

   begin 

    Readln(f, iTmp);

     ColCount := iTmp;  

    Readln(f, iTmp);

     RowCount := iTmp;  

    for i := 0 to ColCount - 1 do

       for k := 0 to RowCount - 1 do 

       begin 

         Readln(f, strTemp);  

         Cells[i, k] := strTemp;  

       end;  

   end;  

   CloseFile(f);

end;

 

procedure TfmMain.N2Click(Sender: TObject);    //сохранение системы

begin

  if not allZap(sg1) then

  begin

    Application.MessageBox('Недопустимое  значение!','Ошибка!',mb_ok or mb_iconerror);

    exit;

  end;

  if sd.Execute then

  begin

    SaveStringGrid(sg1,sd.FileName);

  end;

end;

 

procedure TfmMain.N3Click(Sender: TObject);    //Загзика системы с файла

begin

  if od.Execute then

  begin

    LoadStringGrid(sg1,od.FileName);

    sed.Value:=sg1.RowCount-1;

  end;

end;

 

procedure TfmMain.BitBtn1Click(Sender: TObject);   //Выход

begin

  Close;

end;

 

procedure TfmMain.N7Click(Sender: TObject);   // вызов формы fmSetting

begin

  fmSetting.ShowModal;

end;

 

procedure TfmMain.sg1KeyPress(Sender: TObject; var Key: Char);

begin

  if not (key in ['0'..'9',#8,'-',#13,#9]) then key:=#0;

end;

 

procedure TfmMain.btClearClick(Sender: TObject);  //Очистка поля

var

  i,j:integer;

begin

  lb.Clear;

  for i:=1 to sg1.colcount-1 do

    for j:=1 to sg1.RowCount-1 do

      sg1.Cells[i,j]:='';

  btReport.Enabled:=false;

end;

 

procedure TfmMain.btReportClick(Sender: TObject);

var                                               //Выдача отчёта

  s:string;

  i,j,n:integer;

begin

  if not AllZap(sg1) then

  begin

    Application.MessageBox('Недопустимое  значение!','Ошибка!',mb_ok or mb_iconerror);

    exit;

  end;

  with fmReport do

  begin

    if clRep then

    begin

      mem.Clear;

      mem.Lines.Add('Решение системы линейных  уравнений методом Крамера');

    end else

      if mem.Lines.Strings[0] <> 'Решение системы  линейных уравнений методом Крамера' then

    mem.Lines.Add('Решение  системы линейных уравнений методом Крамера');

    mem.Lines.Add('');

    mem.Lines.Add('Система:');

    for j:=1 to sg1.RowCount-1 do

    begin

      n:=0;

      for i:=1 to sg1.ColCount-1 do

      begin

        inc(n);

        if i=sg1.ColCount-1 then

        begin

         s:=s+' = '+sg1.Cells[i,j];

          continue;

        end;

        if s='' then

        begin

          if StrToFloat(sg1.Cells[i,j])=0 then continue;

          if StrToFloat(sg1.Cells[i,j])=1 then

          begin

            s:=s+' x'+IntToStr(n)+' ';

          end;

          if StrToFloat(sg1.Cells[i,j])>0 then s:=s+

                sg1.Cells[i,j]+' x'+IntToStr(n)+' ' else

              s:=s+sg1.Cells[i,j]+' x'+IntToStr(n)+' ';

        end

          else

          begin

            if StrToFloat(sg1.Cells[i,j])=0 then continue;

            if StrToFloat(sg1.Cells[i,j])>0 then s:=s+' + '+

                sg1.Cells[i,j]+' x'+IntToStr(n)+' ' else

              s:=s+' '+sg1.Cells[i,j]+' x'+IntToStr(n)+' ';

          end;

      end;

      mem.Lines.Add(s);

      s:='';

    end;

    mem.Lines.Add('');

    mem.Lines.Add('Корни:');

    for i:=1 to lb.Items.Count do mem.Lines.Add( lb.Items[i-1]);

    mem.Lines.Add('');

    mem.Lines.Add('');

  end;

  fmReport.ShowModal;

end;

 

procedure TfmMain.N8Click(Sender: TObject);  //вызов формы fAbout

begin

   fAbout.ShowModal;

end;

 

end.

 

 

unit report;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, Buttons;

 

type

  TfmReport = class(TForm)

    mem: TMemo;

    BitBtn1: TBitBtn;

    pd: TPrintDialog;

    BitBtn2: TBitBtn;

    BitBtn3: TBitBtn;

    BitBtn4: TBitBtn;

    procedure BitBtn1Click(Sender: TObject);

    procedure BitBtn2Click(Sender: TObject);

    procedure BitBtn3Click(Sender: TObject);

    procedure BitBtn4Click(Sender: TObject);

  private

    { Private declarations }

  public

    { Public declarations }

  end;

 

var

  fmReport: TfmReport;

 

implementation

 

{$R *.dfm}

 

procedure TfmReport.BitBtn1Click(Sender: TObject);    //выход

begin

  Close;

end;

 

procedure TfmReport.BitBtn2Click(Sender: TObject);   //выдача на печать

begin

  pd.Execute;

end;

 

procedure TfmReport.BitBtn3Click(Sender: TObject);  //очистка поля для вывода  отчёта

begin

  mem.Clear;

end;

 

procedure TfmReport.BitBtn4Click(Sender: TObject); // копирование текста отчёта

begin

  mem.CopyToClipboard;

end;

 

end.

 

 

unit sett;

 

interface

 

uses

  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

  Dialogs, StdCtrls, Spin, Buttons;

 

type

  TfmSetting = class(TForm)

    BitBtn1: TBitBtn;

    BitBtn2: TBitBtn;

    GroupBox1: TGroupBox;

    chround: TCheckBox;

    sedzn: TSpinEdit;

    Label1: TLabel;

    GroupBox2: TGroupBox;

    edrnd: TEdit;

    Label2: TLabel;

Информация о работе Решение системы линейных уравнений методом Крамера