Примечание | от автора: В данной работе изложена теория по матрица, рассматривается нахождение определителя по теореме Коши-Бине от редактора: только текстовый файл |
Загрузить архив: | |
Файл: ref-25766.zip (568kb [zip], Скачиваний: 116) скачать |
Введение. PAGEREF _Toc169771091 h 4
Глава I. PAGEREF _Toc169771092 h 5
§ 1 Определение, обозначения и типы матриц. PAGEREF _Toc169771093 h 5
Свойства сложения и умножения матриц на скаляры: PAGEREF _Toc169771094 h 7
Глава II. PAGEREF _Toc169771095 h 7
§1 Умножение матриц. PAGEREF _Toc169771096 h 7
§2 Свойства умножения матриц. PAGEREF _Toc169771097 h 8
§3 Техника матричного умножения. PAGEREF _Toc169771098 h 9
§4 Транспонирование произведения матриц. PAGEREF _Toc169771099 h 10
Глава III. PAGEREF _Toc169771100 h 10
§1 Обратимые матрицы.. PAGEREF _Toc169771101 h 10
§2 Элементарные матрицы.. PAGEREF _Toc169771102 h 12
Глава IV.. PAGEREF _Toc169771103 h 13
§1 Определители. PAGEREF _Toc169771104 h 13
§2 Простейшие свойства определителей. PAGEREF _Toc169771105 h 14
§3 Основные свойства определителей. PAGEREF _Toc169771106 h 14
§4 Миноры и алгебраические дополнения. PAGEREF _Toc169771107 h 18
Теоремы об определителях. PAGEREF _Toc169771108 h 18
§5 Определитель произведение матриц. PAGEREF _Toc169771109 h 21
Необходимые и достаточные условия равенства определителя нулю.. PAGEREF _Toc169771110 h 22
§6 Разбиение матриц. PAGEREF _Toc169771111 h 23
§7 Теорема (формула Бине-Коши) PAGEREF _Toc169771112 h 25
Заключение. PAGEREF _Toc169771113 h 28
Литература. PAGEREF _Toc169771114 h 30
Приложение. PAGEREF _Toc169771115 h 31
При решении различных задач математики очень часто приходится иметь дело с таблицами чисел, называемых матрицами. С помощью матриц удобно решать системы линейных уравнений, выполнять многие операции с векторами, решать различные задачи компьютерной графики и другие инженерные задачи.
Цель данной работы: теоретическое обоснование и необходимость практического применения теоремы Коши-Бине:
Пусть ,- и -матрицы соответственно,
Тогда
Другими словами, при определитель матрицы является суммой произведений всевозможных миноров порядка в на соответствующие миноры матрицы того же самого порядка
Работа состоит из четырех глав, содержит заключение, список литературы и приложение программы для теоремы Коши-Бине. В главе I рассматриваются элементы линейной алгебры – матрицы, операции над матрицами и свойства сложения матриц, и умножения на скаляр. Глава II посвящается умножению матриц и его свойств, а также транспонирование произведения двух матриц. В главе IIIрассматриваются обратимые и элементарные матрицы. В главе IVвводиться понятиеопределителя квадратной матрицы, рассматриваются свойства и теоремы об определителях, а также приводится доказательство теоремы Коши-Бине, что является целью моей работы. В дополнение прилагается программа показывающая механизм нахождения определителя произведения двух матриц.
§ 1 Определение, обозначения и типы матриц
Мы определяем матрицу как прямоугольную таблицу чисел:
Где элементы матрицы aij (1≤i≤m, 1≤j≤n)-числа из поля .Для наших целей поле будет либо множеством всех вещественных чисел, либо множеством всех комплексных. Размер матрицы , где m-число строк, n-число столбцов. Если m=n, то говорят, что матрица квадратная, порядка n. В общем случаем матрица называется прямоугольной.
Каждой матрице с элементами aij соответствует n×m матрица с элементами aji . Она называется транспонированной к и обозначается через=. Строки матрицы становятся столбцами в и столбцы матрицы становятся строками в
Матрица называется нулевой если все элементы равны 0:
Матрица называется треугольной если все ее элементы, расположенные ниже главной диагонали равны 0
Треугольная матрица называется диагональной, если все элементы расположенные вне главной диагонали равны 0
Диагональной матрица называется единичной, если все элементы расположенные на главной диагонали равны 1
Матрица, составленная из элементов, находящихся на пересечении нескольких выбранных строк матрицы и нескольких выбранных столбцов, называется субматрицей для матрицы
В частности, строки и столбцы матрицы можно рассматривать как ее субматрицы.
§2 Операции над матрицами
Определим следующие операции:
I. Сумма двух матриц с элементами и матрица С с элементами
II. Произведение матрицы на число
III. Произведение матрицы матрица С с элементами
IV. поле скаляров, рассмотрим матриц над полем
Опр. Две матрицы равны, если они имеют одинаковую размерность и на одинаковых местах расположены одинаковые элементы. Другими словами: равна матрице
Опр. Пусть и называется столбце расположен элемент
Пример:
Опр. Пусть на матрицу называется у которой в столбце расположен элемент умножить на матрицу нужно все элементы матрицы умножить на скаляр
Определение. Противоположной к матрице называется матрица
1) Сложение матриц ассоциативно и коммутативно.
2)
3)
а)
б)
4)
Опр. Произведением матрицы на матрицу называется матрица
Говорят, что есть скалярное произведение на
Пример:
1.Умножение матриц ассоциативно:
1) и
Доказательство:
Пусть и определено
Определим матрицы:
а)
б)
(1)матрицы, тогда имеют одинаковую размерность
2) Покажем, что на одинаковых местах в матрицах расположены одинаковые элементы
Вывод: Матрицы имеют одинаковую размерность и на одинаковых местах расположены одинаковые элементы.
2.Умножение матриц дистрибутивно
Доказательство:
так как определено и определено
размерности
Матрицы имеют одинаковую размерность, покажем расположение одинаковых элементов:
Вывод:На одинаковых местах расположены одинаковые элементы.
3. матрицы, то доказательство проводим аналогично свойству 2.
4.
Доказательство:
5. Умножение матриц в общем случае не коммутативно. Рассмотрим это на примере:
поле скаляров,
Свойства:
1)Произведение можно рассматривать, как результат умножения столбцов матрицы слева и как результат умножения строк матрицы на справа.
2)Пусть матрица коэффициенты которой служат элементы матрицы
Пример
Пусть коэффициенты которой служат элементы матрицы
Пример:
3)Столбцы матрицы
поле скаляров,
Теорема
если
Доказательство:
1) Пусть
- размерности
2) т.е
на столбец
поле скаляров, множество
Определение. Квадратная матрица порядка называется единичной матрицей
Пусть
Теорема 1
выполняется
Доказательство:
Из этого следует является единичной матрицей. Она выполняет роль единицы при умножении матриц.
Определение. Квадратная матрица так, что выполняются условия
Матрица называется обратной к обозначается обратная к
Теорема 2
Если
Доказательство:
Пусть дана матрица т.е.
Обозначение: Множество всех обратимых матриц порядка над полем обозначается
Теорема 3
Справедливы утверждения:
1) алгебра
2) группа
Доказательство:
а) Пусть
обратные к
Аналогично: обратимая матрица т.е
б)
в) обратима т.е
2) Докажем второе утверждение, что группа. Для этого проверим аксиомы групп:
1)
2)
3)
группа
Следствие:
1)Произведение обратимых матриц есть обратимая матрица
2)Если обратима, то
3)
4)
Пусть поле скаляров
Определение.Элементарной матрицей называется матрица, полученная из единичной матрицы в результате одного из следующих элементарных преобразований:
1)Умножение строки (столбца) на скаляр
2)Прибавление к какой либо строке (столбцу) другой строки (столбца), умноженный на скаляр
Обозначение:
Пример: Элементарные матрицы порядка 2
Обозначение:
Определитель матрицы умноженная на знак, соответствующей подстановки.
Пример
Определитель второго порядка равен произведению элементов главной диагонали вычесть произведение элементов на побоичной.
Для
Получили правило треугольника:
SHAPE* MERGEFORMAT
1)Определитель матрицы с нулевой строкой (столбцом) равен нулю
2)Определитель треугольной матрицы равен произведению элементов, расположенных на главной диагонали
Определитель диагональной матрицы равен произведению элементов, расположенных на главной диагонали. Матрица диагональная если все элементы, расположенные вне главной диагонали равны нулю.
поле скаляров,
1)
Доказательство:
«пробегает» все множество
3)При перестановке двух столбцов (строк) матрицы
Доказательство:
I) Перестановка столбцов:
Пусть перестановкой двух столбцов с номерами
В доказательстве будем использовать равенство:
Если пробегает все множество значений
II) Перестановка строк
Пусть получена из получена из перестановкой двух столбцов, тогда
III) Определитель матрицы, имеющий две одинаковые строки (столбца) равных нулю
Доказательство:
Проведем для такого поля
Замечание
Доказательство для случая
Пусть в есть две одинаковые строки с номерами
и
Если у два одинаковых столбца, то у транспонированной матрицы две одинаковые строки
IV) Если все элементы какой-либо строки (столбца) матрицы умножить на
Доказательство:
Пусть получена из умножением на
так как
Аналогичное доказательство для столбцов
V) Определитель матрицы у которой две строки (столбца) пропорциональны равны нулю
Доказательство:
Пусть в матрице строки пропорциональны т.е на
Для столбцов:
Пусть получена из и пропорциональны и
VI) Если каждый элемент есть сумма двух элементов, то определитель равен сумме двух определителей. В матрице первого определителя в
Доказательство:
VII) Ели к какой либо строке (столбцу) матрице определителя прибавить другую строку (столбец), умноженный на
Доказательство:
Для столбцов анологично.
VIII) Если какая либо строка (столбец) матрицы является линейной комбинацией других строк (столбцов)
Доказательство:
Если какая то строка линейная комбинация других строк, то к ней можно прибавить другие строки, умноженные на скаляры так, чтобы получилась нулевая строка. Определитель такой матрицы равен нулю.
Пример:
(сначала умножаем первую строку на -2 и складываем со второй, затем на -3 и складываем с третей). Такое правило приведения к треугольному виду используется для определителей
так как определитель треугольной матрицы равен произведению элементов расположенных на главной диагонали.
Если квадратная матрица является произведением некоторых матриц (которые могут бытьпрямоугольными), то часто бывает важно иметь возможность выразить определитель произведения в терминах свойств множителей. Следующая теорема –мощный показатель этого.
поле скаляров,
Опр. Минор элемента определителя порядка вычеркиванием
Главные миноры определителя
Для главные миноры есть определители
Пример:
Рассмотрим матрицу и вычислим ее миноры
Определение. Алгебраическим дополнением элемента обозначается называется число
Пример: Вычислим
Лемма 1
Доказательство:
(в сумме только те слагаемые ненулевые, где
Тогда подстановка имеет вид: поставим в соответствие т.е
на множество подстановок что имеют одинаковые инверсии, значит имеют одинаковую четность и знаки
Лемма 2
Если равны нулю все элементы какой-либо строки (столбца) матрицы за исключением быть может одного элемента, то определитель матрицы равен произведению этого элемента на его алгебраическое дополнение
Доказательство:
Пусть все элементы за исключением элемента перестановкой строк и столбцов переместили элемент в правый нижний угол строк и равны нулю. По Лемме 1
Теорема Лагранжа
равна сумме произведений элементов какого-либо столбца (строки) матрицы на их алгебраическое дополнение. Другими словами: разложение по имеет вид: разложение по
Доказательство:
рассмотрим и запишем в виде:
разложение по
Теорема 2
Справедливы равенства:
Рассмотрим матрицу следующим образом: все столбцы матрицы совпадает с два одинаковых столбца, поэтому определитель матрицы равен нулю, разложим определитель матрицы по
Следствие:
поле скаляров,
Лемма 1
Пусть элементарная матрица порядка
1) получена из матрицы
Матрицаполучена из умножением
2)
Матрица, полученная из прибавлением к
Лемма 2
1)
2)
Теорема 1
Определитель произведения двух матриц равен произведению их определителей т.е.
Доказательство:
Пусть строки матрицы линейно независимы, тогда существует цепочка элементарных преобразований
2) Строки линейно зависимы, тогда существует цепочка элементарных преобразований, которая переводит в ступенчатую матрицу
Из того, что
поле скаляров,
Теорема 1
Достаточность:
Если строки (столбцы) матрицы
Необходимость:
Пусть линейно независимы, тогда существует цепочка элементарных преобразований переводящее II следует, что линейно зависима,линейно зависима.
Теорема 2
следующие условия равносильны:
1)
2)
3)
4) представима в виде произведения элементарных матриц
Доказательство:
доказано в Теореме 1
Если матрицу матрицу матрицу и матрицу записать в виде
(1)
То они, образуютнекоторую матрицу могут быть названы блоками матрицы соответственно. Представление (1) называется разбиением матрицы
Если матричное произведениесуществует и соответствует разбиению по строкам матрицы имеет блоки
Таким образом, мы предполагаем, что произведение матриц в терминах блоков, полученных при соответствующих разбиениях сомножителей, формально совпадает с произведением этих матриц в терминах скалярных элементов. Покажем это на примере:
Упражнение1. Пусть
Это проверяется прямым вычислением
Теорема (1)
Пусть матрица из имеет блоки матрица из с блоками имеет блоки
Доказательство. Отметим, что каждое произведение матрицей. Следовательно, существует и будет матрицей. Для фиксированного имеет столбцов и для фиксированного каждое имеет матрицы
Пусть блока является суммой произведений на элементы столбца совпадают с некоторыми элементами строки в определяется неравенствами
Элементы столбца в Следовательно,
Мы определили миноры порядка для определителя. В общем случае, если из порядка
Миноры, для которых - матрица, то и алгебраическое дополнение
Если квадратная матрица является произведением некоторых матриц (которые могут быть прямоугольными), то иногда важно выразить определитель произведения в терминах свойств сомножителей. Следующая теорема - мощный результат этого рода.
Теорема (формула Бине-Коши)
Пусть ,- и -матрицы соответственно,
Тогда
Другими словами, при определитель матрицы является суммой произведений всевозможных миноров порядка в на соответствующие миноры матрицы того же самого порядка.
Упражнение1. Покажем на примере
Пусть и
Доказательство теоремы:
Так как
Определитель-это аддитивная и однородная функция каждого из своих столбцов. Используя этот факт для каждого из столбцов в в виде суммы определителей:
Те члены в суммировании, которые имеют совпадающие два или более индексов членов суммирования, в которых индексы различны. Мы распределяем эти остающиеся члены на групп по членов в каждой таким образом, чтобы в каждой группе члены отличаются лишь порядком индексов
членам, в которых
Переставляя элементы так, чтобы первые индексы в возрастающем порядке, приводим это выражение к виду:
гдечисел
Следствие. Определитель произведения двух кратных матриц равен произведению определителй множителей.
Это следует из Теоремы при
В данной работе рассмотрена основная теория матриц и доказательство теоремы Коши-Бине. Также представлено применение данной теоремы при нахождении определителя произведения двух прямоугольных матриц в программе написанной на языке программирования Дельфи с возможностью ввода матриц вручную и подгрузкой из файла.
Данная теорема Коши-Бине:
Пусть ,- и -матрицы соответственно,
Тогда
На примере можно рассмотреть работу программы реализующей алгоритм нахождения определителя прямоугольных матриц на основе формулы Коши-Бине.
Будем искать миноры 2 порядка:
1)
Пусть Am = 2 n = 3
1 0 2
-1 1 1
Bm = 3 n = 2
-1 -1
-2 0
1 1
получаем матрицу Cm = 2 n = 2
1 1
0 2
Итого: Det C = 2
2)
Переборы:
1A) 1 2
1 0
-1 1
DetA = 1
1B) 1 2
-1 -1
-2 0
DetB = -2
2A) 1 3
1 2
-1 1
DetA = 3
2B) 1 3
-1 -1
1 1
DetB = 0
3A) 2 3
0 2
1 1
DetA = -2
3B) 2 3
-2 0
1 1
DetB = -2
C =(1)*(-2) +(3)*(0) + (-2)*(-2)
Итого по формуле Коши - Бине: 2
Данная программа наглядно показывает нахождение миноров порядка m, где m-это количество строк в матрице
1. Гантмахер Ф.Р. Теория матриц. – 4-е изд. – М.: Наука. Гл.ред. физ. – мат. мет., 1988. с. 13-32.
2. Фаддеев Д.К. Лекции по алгебре.- М.:Наука. Гл.ред. физ. – мат. мет., 1984.-с.216.
3. Курош А.Г. Курс высшей алгебры. – 14 - е изд. - Спб.: Лань, 2005. -с.322
4. Ланкастер П. Теория матриц– М.: Наука. Гл.ред. физ. – мат. мет., 1973, с.17-44
5. Маркус М., Минк Х. Обзор по теории матриц и матричных неравенств. – М.: Наука. Гл.ред. физ. – мат. мет. , 1972, с.232
6. Большакова И.В. Высшая математика - Учебное издание, 2003, с.5-10
Внешний вид программы:
Исходный код:
unit MainUnit;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Menus, Math, cdet;
Const
MaxN = 10; //Максимальное число столбцов в массиве
MaxM = 10; //Максимальное число строк в массиве
DefValueMas = 3; //Значение по умолчанию (размерность)
type
TVS_MAssPerebor = Array of Real; //Массивпереборов
TVS_Mass = array of array of Real; //Описали 2х мерный динамический массив
TVS_MassData = Record//Создаем запись - массив, в котором:
Mass : TVS_Mass ; //Массив
M, //Строки массива
N : Integer; //Столцы массива
Name : Char; //Название матрицы для вывода информации (A, B, C)
end; {TVS_MassData = Record}
TMainForm = class(TForm)
MainMenu1: TMainMenu;
N1: TMenuItem;
NMultiplication: TMenuItem;
N2: TMenuItem;
InputMassB: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
nDetA: TMenuItem;
NDetB: TMenuItem;
ResultMemo: TMemo;
N5: TMenuItem;
DetC: TMenuItem;
nmbn1: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
N10: TMenuItem;
OpenDialog: TOpenDialog;
procedure InputMassAClick(Sender: TObject);
procedure NMultiplicationClick(Sender: TObject);
procedure VS_MultiplicMass (Var inMassA, InMassB, MassOut : TVS_MassData);
procedure InputMassBClick(Sender: TObject);
procedure VS_InputMass(Var InMass : TVS_MassData);
procedure VS_ShowMass (inCaption : String; inMass: TVS_MassData);
procedure FormShow(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure nDetAClick(Sender: TObject);
function VS_Det(InMass : TVS_MassData): Real;
procedure NDetBClick(Sender: TObject);
procedure VS_ShowMassToMemo(Caption : String; InMass : TVS_MassData; ShowRazm : Boolean = True);
procedure N5Click(Sender: TObject);
procedure DetCClick(Sender: TObject);
Procedure AssignMass(InMAss : TVS_MassData; Var OutMass : TVS_MassData);
Procedure VS_VerMass(Var Massin1, MAssIn2: TVS_MassData);
Procedure VS_LoadData(Var InMAss : TVS_MassData);
Procedure VS_GetRazmOnFile(FileName :
String;
Function VS_GetColOnFile(InStr: String): Integer;
//Миноры
function VS_Minor(II, Jj: Integer; InMass : TVS_MassData): REal;
Procedure VS_InitMassInStr(InStr: String; CurRow : Integer; Var InMass: TVS_MassData);
Procedure VS_InitMassPErebor;
Procedure VS_Init2xMassPerebot;
Procedure VS_SortMassPerebor;
Procedure VS_GetMAssForDet;
Function VS_IfMassEq(Massin1, MAssIn2: TVS_MassData) : Boolean;
Function VS_GetKoshi_Bine : Real;
procedure VS_GenerateColMinorData(
procedure VS_GenerateRowMinorData(
Procedure VS_MinorMass(InMass : TVS_MassData; Var OutMass : TVS_MassData);
procedure N6Click(Sender: TObject);
procedure N7Click(Sender: TObject);
procedure N8Click(Sender: TObject);
procedure lll1Click(Sender: TObject);
procedure N9Click(Sender: TObject);
procedure N10Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
MainForm: TMainForm;
MassP : TVS_MAssPerebor;
MassPer,
MassB, MassC : TVS_MassData;
DetB,
DetA : TVS_MAssPerebor; //МассивдетерминантА
implementation
uses InRazmUnit, InMassUnit;
{$R *.dfm}
function TMainForm.VS_Det(InMass : TVS_MassData): Real;
var
Temp, A: TVS_MassData;
Cols, Rows, Count: Word;
i, j, k: Integer;
begin
Result := 1; //Результат функции по умолчанию
If InMass.N <> InMass.M Then Exit; //если матрица не квадратная - уходим, так как решение методом диагонали
Count := InMass.M ; // Получили размерность исходного массива
SetLength(A.Mass, Count, Count);//Установили размер матрицы
SetLength(Temp.Mass, 1, Count); //Установили размер мартицы
AssignMass(InMass, A); //Во временный массив заносим данные из исходного, чтобы не портить исходный массив
//Поиск и решение
for i := 0 to Count - 2 do {Начало преобразования к верхнему треугольному виду}
begin
for j := i to Count - 1 do{*Поиск }
begin {*нулевых }
Rows := 0; {*строк }
Cols := 0; {*и }
for k := i to Count - 1 do {*столбцов }
begin {*в }
Rows := Rows + Ord(A.Mass[j, k] = 0); {*матрице}
Cols := Cols + Ord(A.Mass[k, j] = 0); {* }
end;{for k := i to Count - 1 do} {* }
if Rows + Cols = 0 then {* }
Break; {* }
if (Cols = Count - i) or (Rows = Count - i) then {* }
begin {* }
Result := 0; {* }
Exit {* }
end {if (Cols = Count - i) or (Rows = Count - i) then }
end; {for j := i to Count - 1 do } {* }
if A.Mass[i, i] = 0 then
for j := i + 1 to Count - 1 do
if A.Mass[j, i] <> 0 then
begin
Result := -Result; {* меняемстроку }
Temp.Mass[0] := A.Mass[i]; {* настрокус }
A.Mass[i] := A.Mass[j]; {* первым }
A.Mass[j] := Temp.Mass[0]; {* ненулевым }
Break {* элементом }
end;
for j := i + 1 to Count - 1 do
if A.Mass[j, i] <> 0 then
begin
for k := i + 1 to Count - 1 do
A.Mass[j, k] := A.Mass[j, k] - A.Mass[i, k] * A.Mass[j, i] / A.Mass[i, i];
A.Mass[j, i] := 0
end
end; {Конецпреобразования}
for i := 0 to Count - 1 do { Определитель как произведение }
Result := Result * A.Mass[i, i];{ элементов на главной диагонали}
end;
procedure TMainForm.InputMassAClick(Sender: TObject);
begin
If InRazmForm = Nil Then Application.CreateForm(TInRazmForm, InRazmForm);
With InRazmForm do
Begin
Caption := 'ВводразмерностирядаА';
Hint := Caption; //
ShowHint := True; //Разрешаембыстрыеподсказки
lbPrompt1.Caption := 'Размерность N ';
//Настройка эелемента ввода для размерности массива по строкам - М
sedtRazmA.MinValue := 1; //Установили минимальное знаечение для ввода-переключателя
sedtRazmA.MaxValue := MaxN ; //Установили максимальное значение для ввода - переключателя
sedtRazmA.Value := MassA.N; //Установили значение, выводимое на экран
//Настройка эелемента ввода для размерности массива по столбцам - N
sedtRazmB.MinValue := 1; //Установили минимальное знаечение для ввода-переключателя
sedtRazmB.MaxValue := MaxM; //Установили максимальное значение для ввода - переключателя
sedtRazmB.Value := MassA.M; //Установили значение, выводимое на экран
lbPrompt2.Caption := 'Размерность M ';
btnNext.Caption := 'Далее';
btnCancel.Caption := 'Отмена';
If InRazmForm.ShowModal = Mrok Then //если пользователь нажал кнопку "Далее"
Begin
MassA.N := sedtRazmA.Value; //Сохраняем размерность массива
MassA.M := sedtRazmB.Value; //Сохраняем размерность массива
VS_InputMass(MassA); //Выводим сетку для ввода масива
end; {If ShowModal = Mrok Then}
end; {With InRazmForm do}
end; {procedure TMainForm.InputMassAClick(Sender: TObject);}
procedure TMainForm.NMultiplicationClick(Sender: TObject);
//Умножениематриц
begin
VS_MultiplicMass(
VS_ShowMassToMemo('Результатпроизведения A*B получился ', MassC); //Результат выводим в Мемо
VS_ShowMass('Итоговый результат ', MassC); //Выводим результаты расчета
end;
procedure TMainForm.VS_MultiplicMass(var inMassA, InMassB,MassOut: TVS_MassData);
//Умножаем матрицы
//N, M - размерность матрицы, где
//N - стоблец
//M - строка
//inMassA - массив А
//inMassB - массив Б
//MassOut - массив С / выходной массив
Var P, i, j : Integer;
S: Real;
begin
For I := 0 to inMassA.M - 1 do // i = 1.. m
For J := 0 to inMassB.N - 1 do // j = 1.. k
begin
S := 0; //Сбнуляемсчетчик
For P := 0 to inMassA.N -1 do // p = 1..n
S := S + inMassA.Mass[i, p] * InMassB.Mass[p, j]; //Вычисляемпоформуле (Cij = Ep (Aip *Bpj)? где i=1..m, j = 1..k)
MassOut.Mass[I, J] := s; //Сохраняем результат в массив С
end;
MassOut.N := inMassB.N; //Сохраняем получившиюся размерность массива С
MassOut.M := inMassA.M; //Сохраняем получившиюся размерность массива С
end;
procedure TMainForm.InputMassBClick(Sender: TObject);
begin
If InRazmForm = Nil Then Application.CreateForm(TInRazmForm, InRazmForm);
With InRazmForm do
Begin
Caption := 'ВводразмерностирядаБ';
Hint := Caption;
ShowHint := True;//Разрешаем быстрые подсказки на форме
lbPrompt1.Caption := 'Размерность N ';
sedtRazmA.MinValue := 1; //Установили минимальное знаечение для ввода-переключателя
sedtRazmA.MaxValue := MaxN; //Установили максимальное значение для ввода - переключателя
sedtRazmA.Value :=MassB.N; //Установили значение, выводимое на экран
sedtRazmB.MinValue := 1; //Установили минимальное знаечение для ввода-переключателя
sedtRazmB.MaxValue := MaxM; //Установили максимальное значение для ввода - переключателя
sedtRazmB.Value := MassB.M; //Установили значение, выводимое на экран
lbPrompt2.Caption := 'Размерность M ';
btnNext.Caption := 'Далее';
btnCancel.Caption := 'Отмена';
If ShowModal = Mrok Then //если пользователь нажал "Далее"
Begin
MassB.N := sedtRazmA.Value; //Сохраняем размерность массива
MassB.M := sedtRazmB.Value; //Сохраняем размерность массива
VS_InputMass(MassB); //Выводи окно с сеткой для ввода массива
end{If ShowModal = Mrok Then}
end; {With InRazmForm do}
end;
procedure TMainForm.VS_ShowMass(inCaption : String; inMass: TVS_MassData);
//Выводим массив
//N, M - размерность матрицы, где
//N - стоблец
//M - строка
//inMass - массив, который выводим
Var
I, K : Integer;
begin
If InMassForm = Nil Then Application.CreateForm(TInMassForm, InMassForm);
with InMassForm do
Begin
Caption := 'Выводмассива';
strGrid.RowCount := InMass.M+1;
strGrid.ColCount := inMAss.N+1;
For I := 0 To inMAss.N -1 do //Выводимшапкудлястолбцов
strGrid.Cells[I + 1, 0] :='N = ' + IntToStr( I + 1);
For I := 0 To inMAss.M -1 do //Выводимшапкудлястрок
strGrid.Cells[0, I + 1] :='M = ' + IntToStr( I + 1);
btnNext.Caption := 'Ok';
btnCancel.Visible := False; //Выключаемкнопку "Отмена". Она нам не нужна
For I := 0To inMAss.N -1do //Пробегаемся по строкам
For K := 0To inMAss.M -1do //Пробегаемся по столбцам
InMassForm.strGrid.Cells[I +1,K +1] := FloatToStr(inMass.Mass[K, I]); //Выводим в сетку ранее сохраненный массив
ShowModal; //Выводим окно, ждем реакции пользователя
btnCancel.Visible := True; //Не забываем включить кнопку "Отмена", иначе ее не увидят в других нужных нам метсах
end; {with InMassForm do}
End;
procedure TMainForm.FormShow(Sender: TObject);
//Обрабатываемся прри вызове формы
Var I, J : Integer;
begin
//Обнуляем массивы, во избежание шаманских действий программы
SetLength(MassA.Mass, MaxM , MaxN ); //Установили размер массива в памяти
SetLength(MassB.Mass, MaxM , MaxN ); //Установили размер массива в памяти
SetLength(MassC.Mass, MaxM , MaxN ); //Установили размер массива в памяти
For I := 0 to MaxM - 1 Do //Пробегаемся по строкам
For J := 0 to MaxN - 1 do //Пробегаемся по столбцам
Begin
MassA.Mass[I, J] := 0;
MassB.Mass[I, J] := 0;
MassC.Mass[I, J] := 0;
end; {For J := 1 to MaxN do}
//Обнуляем переменные размерностей массивов
MassA.N := DefValueMas; //Устанавливаемразмерность матрицы по умолчанию
MassA.M := MassA.N;
MassB.N := MassA.N;
MassB.M := MassA.N;
MassC.N := MassA.N;
MassC.M := MassA.N;
MassA.Name := 'A';
MassB.Name := 'B';
MassC.Name := 'C';
ResultMemo.Clear; //ОчищаемМемо-поле.
end;
procedure TMainForm.VS_InputMass(var InMass: TVS_MassData);
//Вводим Элементы массива
Var
I, K : Integer;
begin
If InMassForm = Nil Then Application.CreateForm(TInMassForm, InMassForm);
with InMassForm do
Begin
Caption := 'Вводмассива';
strGrid.RowCount := InMass.M+1; //указали количество строк рамным М
strGrid.ColCount := InMass.N+1; //Указали количество столбцов, равным N
For I := 0 To InMass.N -1 do //Делаемшапкудлястолбцов
strGrid.Cells[I +1, 0] :='N = ' + IntToStr( I +1);
For I := 0 To InMass.M -1 do //Делаемшапкудлястрок
strGrid.Cells[0, I +1] :='M = ' + IntToStr( I +1);
//Заносим результаты массива в сетку, если вводили ранее
For I := 0 to InMass.M -1 do //Пробегаемся по строкам массива
For K := 0 to InMass.N -1 do //Пробегаемся по столбцам массива
Try
strGrid.Cells[I+1, K+1] := FloatToStr (InMass.Mass[K, I]); //Выводиммассивв сетку
except
strGrid.Cells[I+1, K+1] := '0';
end;
btnNext.Caption := 'Далее';
btnCancel.Caption := 'Отмена';
If ShowModal = Mrok Then //Выводим форму, ждем реакции пользователя
Begin
SetLength(MassA.Mass, InMass.M +1 , InMass.N +1); //Установили размер массива в памяти
For I := 0To InMass.N -1do //Пробегаемся по строкам массива
For K := 0To InMass.M -1do //Пробегаемся по столбцам массива
Try //Включаем обработку ошибок
InMass.Mass[K, I] := StrToInt(InMassForm.strGrid.Cells[I +1,K +1]); // Заносим элемент из сетки в массив
except //Если произошла ошибка, например с переводом строки в число
InMass.Mass[I, K] := 0; //Если ошибка - заносим в массив 0
end; {except}
VS_ShowMassToMemo('Успешно введена матрица ',InMass); //Выводим матрицу в Мемо
end;{If ShowModal = Mrok Then}
end;
end;
procedure TMainForm.N3Click(Sender: TObject);
//Выводим результат. Просто выводим массив
begin
VS_ShowMass('', MassC)
end;
procedure TMainForm.nDetAClick(Sender: TObject);
//Определяем определитель матрицы А
Var Det : Real;
begin
Det := VS_Det(MassA); //ВЫчисляем определитель
ResultMemo.Lines.Add('Определитель матрицы А равен' + FloattoStr(Det));//Выводим результат в Мемо
ShowMessage(FloatToStr(Det)); //Выводим результат в диалоговое окно
end;
procedure TMainForm.NDetBClick(Sender: TObject);
//Определяем определитель матрицы B
Var Det : Real;
begin
Det:= VS_Det(MassB); //Вычисляем определитель
ResultMemo.Lines.Add('Определитель матрицы B равен' + FloattoStr(Det)); //Результат вычислений выводим в МЕмо
ShowMessage(FloatToStr(Det)); //Результат выводим в диалоговое окно
end;
procedure TMainForm.VS_ShowMassToMemo(Caption : String; InMass: TVS_MassData; ShowRazm : Boolean = True);
//Выводим массив в МЕмо
Var S : String;
I, J : Integer;
begin
If ShowRazm Then ResultMemo.Lines.Add(Caption + InMass.Name + 'm = ' + IntToStr(InMass.M) + ' n = ' + IntToStr(InMass.n))
Else ResultMemo.Lines.Add(Caption );
For I := 0 to InMass.M - 1 do //Пробегаемся построкам
Begin
S := ''; //Готовимся к формированию строки
For J := 0 To InMass.N -1 Do //Пробегаемся по столбцам
S := S + FloatToStr(InMass.Mass[i,j]) + ' '; //Формируем строку элементов
ResultMemo.Lines.Add(S); //Выводим строку в Мемо
end;{For I := 0 toInMass.M - 1 do //Пробегаемсяпо строкам}
end;
procedure TMainForm.N5Click(Sender: TObject);
Var DetA, DetB, Det : Real;
begin
ResultMemo.Clear;
//Решаем det C обычнымспособом
VS_VerMass(
ResultMemo.Lines.Add('1)');
VS_ShowMassToMemo('Пусть ', MassA); //Выводим матрицу А
VS_ShowMassToMemo('', MassB); //Выводим матрицу Б
VS_MultiplicMass(
VS_ShowMassToMemo('получаем матрицу ', MassC); //Выводим матрицу С
Det := VS_Det(MassC);
ResultMemo.Lines.Add('Итого: Det C = ' + FloatToStr(Det));
ResultMemo.Lines.Add('2)');
//Решаем по Бине-Коши
If (MassA.M > MassA.N) Then
Begin //попали под условие, когда М>n , значит определитель равен 0
ResultMemo.Lines.Add('m > n массива А , исходя из т. Бине - Коши, DetC = 0');
Exit //Завершаемпроцедуру
end;
//If (MassB.M > MassB.N) Then
// Begin //попали под условие, когда М>n , значит определитель равен 0
// ResultMemo.Lines.Add('m > n массива B , исходя из т. Бине - Коши, DetC = 0');
//Exit//Завершаемпроцедуру
// end;
If (MassA.M = MassA.N) And (MassA.M = MassA.N)
Then //попали под условие, когда обе матрицы кувадратные
Begin
ResultMemo.Lines.Add('m = n массивов B и А, исходя из т. Бине - Коши, ');
DetA := VS_Det(
DetB := VS_Det(MassB);
Det := DetA * DetB;
ResultMemo.Lines.Add('DetC = detA * Det B = '+ FloatToStr(DetA) + ' * ' + FloatToStr(DetB) + ' = ' + FloatToStr(Det));
end;
If (MassA.M < MassA.N) And (MassB.M > MassB.N) Then
Begin
IF VS_IfMassEq(
Then
BEgin
VS_VerMass(
VS_InitMassPErebor;
VS_Init2xMassPerebot;
VS_SortMassPerebor;
VS_GetMAssForDet;
ResultMemo.Lines.Add('Итогопо формулеКоши - Бине: ' + FloattoStr(VS_GetKoshi_Bine))
end{IF VS_IfMassEq(
Else ResultMemo.Lines.Add('Матрицыне равны')
end;{If (MassA.M < MassA.N) And (MassB.M > MassB.N) Then}
end;
procedure TMainForm.DetCClick(Sender: TObject);
Var Det : Real;
begin
Det := VS_Det(MassC); //ВЫчисляемопределитель
ResultMemo.Lines.Add('Определитель матрицы C равен' + FloattoStr(Det));//Выводим результат в Мемо
ShowMessage(FloatToStr(Det)); //Выводим результат в диалоговое окно
end;
function TMainForm.VS_Minor(II, Jj: Integer; InMass : TVS_MassData): REal;
//Вычислаем минор
Var
Col, //Текущий столбец новой матрицы
Row, //Текущая строка новой матрицы
I, J : Integer;
TempMass : TVS_MassData;
begin
If InMass.M <> InMass.N Then Exit; // Матрица не квадратная - убегаем
SetLength(TempMass.Mass, InMass.M -1, InMass.N -1);//Установили размер матрицы
Row := 0;
For I := 0 To InMass.M -1 Do
begin
Col := 0; //Начали новый массив с первого элемента
If I <> II -1 Then
Begin //ОтбрасываемI строку
For J := 0 To InMass.N -1 do
If J <> JJ -1 Then
Begin //Перебираем все столюцы, кроме J
TempMass.Mass[Row,
Inc(
end;{If J <> JJ Then}
Inc(Row); //Перешли на сл. строку для нового массива
end;{If I <> II Then}
end; {For I := 0 To InMass.M Do}
TempMass.M := InMass.M - 1;
TempMass.N := InMass.N - 1;
Result := VS_Det(TempMass);
end;
procedure TMainForm.AssignMass(InMAss: TVS_MassData;
var OutMass: TVS_MassData);
//Передаемданныеиз InMass в OutMass;
Var
I,
J : Integer;
begin
for i := 0 to InMAss.M - 1 do //Пробегаемсяпострокам
for j := 0 to InMAss.N - 1 do //Пробегаемся по столбцам
OutMass.Mass[i, j] := InMass.Mass[i, j]; //Переносим значения из InMAss в OutMas
OutMass.M := InMAss.M; //Переносим число, определяющее количество строк
OutMass.N := InMAss.N; //Переносим число, определяющее количество столбцов
OutMass.Name := InMAss.Name; //Переносим название массива
end;
procedure TMainForm.VS_MinorMass(InMass : TVS_MassData; var OutMass: TVS_MassData);
//Находим все миноры входящей матрицы
//InMass - массив, в котором будем искать миноры
//OutMass - массивминор
Var
i,
j : Integer;
begin
If InMass.M <> InMass.N Then Exit; //Вышли, таккакмартицане квадратная
For I := 0 to InMass.M - 1 Do //пробегаемсяпо строкам
For J := 0 To InMass.N - 1 do //Пробегаемсяпо столбцам
OutMass.Mass[I,J] := VS_Minor(I +1, J +1 , InMass); //Получили I, J миноризанесливмассив OutMass
OutMass.M := InMass.M;
OutMass.N := InMass.N;
end;
procedure TMainForm.N6Click(Sender: TObject);
begin
VS_MinorMass(
VS_ShowMass('Минор', MassC);
VS_ShowMassToMemo('Минор', MassC);
end;
procedure TMainForm.N7Click(Sender: TObject);
begin
VS_MinorMass(MassB, MassC);
VS_ShowMass('Минор', MassC);
VS_ShowMassToMemo('Минор', MassC);
end;
procedure TMainForm.N8Click(Sender: TObject);
begin
VS_MinorMass(MassC, MassC);
VS_ShowMass('Минор', MassC);
VS_ShowMassToMemo('Минор', MassC);
end;
procedure TMainForm.lll1Click(Sender: TObject);
begin
IF
VS_IfMassEq(
Then
BEgin
VS_VerMass(
VS_InitMassPErebor;
VS_Init2xMassPerebot;
VS_SortMassPerebor;
VS_GetMAssForDet;
ResultMemo.Lines.Add('Итогопо форумеКоши - Бине: ' + FloattoStr(VS_GetKoshi_Bine))
end
Else ResultMemo.Lines.Add('Матрицынеравны')
end;
procedure TMainForm.VS_InitMassPErebor;
//Создаем массив переборов для вычесления Детерминант формулы Коши-Бине
// Все действия делаются над массивом MAssP
Var
I, J, Curr : Integer;
begin
Curr := 0; //Текущийэлементмассива
SetLength(MassP, MassA.N * MassA.M); //Установилиразмерность
For I := 0 to MassA.M -1 do //Пробегаемсяпо строкам
For J := 0 to MassA.N -1 do //Пробегаемсяпо столбцам
Begin
MassP[Curr] := J +1; //Заполняем массив строками-перестановками/столбцами-перестановками
Inc(Curr); //Перешли к след. элеенту массива
end;
//VS_SortMassPerebor
end;
procedure TMainForm.VS_GetMAssForDet;
//Формуриуем массив для вычисления Дет.
//Данные перестановки уже должны хранится в массиве MassP
//т. е уже нужно иметь Массив А и уже должна быть выполнена VS_InitMassPErebor;
Var I, J : Integer;
Det : Real;
SA, SB : String;
TempB,
TempA : TVS_MassData; //Н*Ммерныймассивминоров
begin
ResultMemo.Lines.Add('Переборы: ');
SetLength(TempA.Mass, MAssA.M, MAssA.M);
SetLength(TempB.Mass, MAssB.N, MAssB.N);
SetLength(DetA, MassA.N);
SetLength(DetB, MassB.M);
TEmpA.M := MAssA.M;
TEmpA.N := MAssA.M;
TEmpB.M := MAssB.N;
TEmpB.N := MAssB.N;
For I := 0 to MassPer.M - 1 do //пробегаемсяпострокам
Begin
SA:= IntToStr(I +1) + 'A) ';
SB:= IntToStr(I +1) + 'B) ';
For J := 0 to MassPer.N - 1 do //Пробегаемся по всем столбцам -1
begin
SA:= SA + FloatToStr(MassPer.Mass[I, J]) + ' ';
SB:= SB + FloatToStr(MassPer.Mass[I, J]) + ' ';
VS_GenerateColMinorData(J, Trunc(MassPer.Mass[I, J]), TempA);
VS_GenerateRowMinorData(J, Trunc(MassPer.Mass[I, J]), TempB);
end;{For J := 0 to MassPer.N - 1 do //Пробегаемсяпо всемстолбцам -1}
ResultMemo.Lines.Add('');
ResultMemo.Lines.Add(SA);
VS_ShowMassToMemo('', TempA, False);
DetA[I] := VS_Det(TempA);
ResultMemo.Lines.Add('DetA = ' + FloatToStr(Deta[I]));
ResultMemo.Lines.Add('');
ResultMemo.Lines.Add(SB);
VS_ShowMassToMemo('', TempB, False);
DetB[I] := VS_Det(TempB);
ResultMemo.Lines.Add('DetB = ' + FloatToStr(DetB[I]));
end;{For I := 0 to MassPer.M - 1 do //пробегаемсяпо строкам}
end;
procedure
TMainForm.VS_GenerateColMinorData(
var inMass: TVS_MassData);
//Формируем массив минор для КоШИ_БИНЕ
//На входе
//CurCol - номер столбюца в новом массиве
//COl - номер столбца для массива, с которого будем брать значения
//InMass - массив, в который будем заносить значения
Var I : Integer;
begin
For I := 0 To MassA.M -1 do
inMass.Mass[I, CurCol] := MassA.Mass[I,
end;
procedure TMainForm.VS_SortMassPerebor;
//Сортируем элементы массива переборов для правильного вычисления миноров
Var
K, I, J, Curr : Integer;
Rez : Real;
begin
For I := 0 to MassPer.M - 1 do //пробегаемсяпострокам
For J := 0 to MassPer.N - 2 do //Пробегаемся по всем столбцам -1
For K := J + 1 to MassPer.N - 1 do
If MassPer.Mass[I, j] > MassPer.Mass[I, K] Then //Текущийэлементбольшеследующего - меняемместами
Begin
REz := MassPer.Mass[I, j];
MassPer.Mass[I, j] := MassPer.Mass[I, K];
MassPer.Mass[I, K] := Rez;
end;
end;
procedure TMainForm.VS_Init2xMassPerebot;
//Формируем 2хмерный массив переборов
//На выходе будет M*N мерный массив переборов (не сортированый)
Var I, J, Curr, CurCol, CurRow : Integer;
Det : Real;
S : String;
begin
Curr := 0; //Текущийэлементвмассиве MassP
SetLEngth(MassPer.Mass, MassA.N, MassA.M); //Установвили размерность массива перестановок
MassPer.M := MassA.N; //Задали размерность
MassPer.N := MassA.M; //Задали размерность
CurRow := 0; //Текущая строка нового массива
For I := 0 to MassA.N -1Do //Запускаем по строкам
begin
CurCol := 0; // Текущий столбец/строка нового массива
For J := 0 to MassA.M - 1 do
Begin
MassPer.Mass[CurRow, CurCol] := MassP[Curr];
Inc(Curr); //Перешли к новому элементу массива MassP
Inc(CurCol); //Перешли кнововму столбцу нового массива
end; {For J := 0 to MassA.M - 1 do}
Inc(CurRow); //Перешли к новой строке нового массива
end;{For I := 0 to MassA.N -1Do //Запускаем}
end;
procedure
TMainForm.VS_GenerateRowMinorData(
var InMass: TVS_MassData);
//Формируем массив минор для КоШИ_БИНЕ
//На входе
//CurCol - номер столбюца в новом массиве
//COl - номер столбца для массива, с которого будем брать значения
//InMass - массив, в который будем заносить значения
Var I : Integer;
begin
For I := 0 To MassB.N -1 do
inMass.Mass[CurCol, I ] := MassB.Mass[
end;
FunctionTMainForm.VS_GetKoshi_Bine: Real;
//Вычисляем формулу Коши-Бине
// ьПеред вызовом должны быть выполнены след. условия:
//1 - введен масив а и б
//выполнены след. процедуры
//VS_InitMassPErebor;
//VS_Init2xMassPerebot;
//VS_SortMassPerebor;
//VS_GetMAssForDet
//
Var I : Integer;
S : String;
begin
Result := 0;
S := '';
For I := 0 to MassA.N - 1 do
Begin
REsult := REsult + DetA[I] * Detb[I];
S := S + ' (' + FloattoStr(DetA[I])+ ')*(' + FloattoStr(DetB[I] ) + ') + ';
end;
ResultMemo.Lines.Add('C = ' + (Copy(S, 1, Length(s) -2)));
end;
function TMainForm.VS_IfMassEq(Massin1, MAssIn2: TVS_MassData): Boolean;
//Сравниваем 2 мартицы
//Получаем True, если
//1. число строк матрицы 1 - числу столбцов матрицы 2
//2. число стоблцов матрицы 1 = числу строкматрицы 2
begin
Result := (Massin1.M = MAssIn2.N) And (Massin1.N = MAssIn2.M)
end;
procedure TMainForm.VS_VerMass(var Massin1, MAssIn2: TVS_MassData);
//Проверяем матрицы
//Если Столбцв матрицы А меньше, чем в Б, меняем матрицы местами
Var TempMass: TVS_MassData;
begin
If Massin1.N < MAssIn2.N Then
Begin
SetLength(TempMass.Mass, MassIn1.M, MassIn1.N);
TempMass := Massin1;
SetLength(Massin1.Mass, MassIn2.M, MassIn2.N);
Massin1 := MAssIn2;
SetLength(Massin2.Mass, TempMass.M, TempMass.N);
MAssIn2 := TempMass;
end;
end;
procedure TMainForm.VS_LoadData(var InMAss: TVS_MassData);
//Загружаем данные из файла в Массив InMAss
Var F : TextFile; //Описали переменную работы с текстовым файлом
RezStr : String;
CurRow,
MaxCol,
MaxRow,
CorCol : Integer;
begin
OpenDialog.DefaultExt := '*.txt'; //Расширениефайловпоумочлчанию
OpenDialog.InitialDir := ExtractFilePath(Application.ExeName); //Открываемкаталог, вкоторомзапущенанашапрограмма
MaXcol := 0;
;
If OpenDialog.Execute Then
Begin //Если пользователь нажал на ОК и выбрал файл - начинаем загрузку
AssignFile(F, OpenDialog.FileName);
If FileExists(OpenDialog.FileName) Then
Reset(f) //Файл есть, открываем
Else Exit; //Файла нету, выходим
CurRow := 0;
VS_GetRazmOnFile(OpenDialog.FileName, MaxCol, MaxRow);
SetLEngth(InMAss.Mass, MaxRow, MaxCol);
While Not Eof(F) Do
Begin
REadLn(F, RezStr);
VS_InitMassInStr(RezStr, CurRow, InMAss);
// ResultMemo.Lines.Add(RezStr);
Inc(CurRow);
end;{While Not Eof(F) Do}
InMass.M := MaxRow;
InMAss.N := MaxCol;
VS_ShowMassToMemo('Успешнозагружен', InMAss);
end;{If OpenDialog.Execute Then}
end;
procedure TMainForm.N9Click(Sender: TObject);
begin
VS_LoadData(
end;
procedure TMainForm.VS_InitMassInStr(InStr: String; CurRow: Integer;
var InMass: TVS_MassData);
//Формируем строку элементов массива.
Var
N : Integer;
RezStr : String;
CurCol : Integer;
begin
inStr := Trim(InStr); //Удалилипробелысобоихконцовстроки
CurCol := 0;
While Length(InStr) > 0 Do
Begin //Запускаем цикл до тех пор, пока строка имеет значения
N := Pos(#32, InStr); //Нашли ближайший пробел
If N <> 0 Then
Begin // Действительно у нас нашелся прьблел
RezStr := Copy(inStr, 1, N);
Delete (inStr,1, N);
RezStr := Trim(RezStr); //Удалили лишние пробелы
Try //Включаем обработку ошибок
InMass.Mass[CurRow, CurCol] := StrtoFloat(RezStr); //Присваиваем элемент массива из строк
except //Если авария
InMass.Mass[CurRow, CurCol] := 0; //Присваиваем элемнту 0
end;
Inc(CurCol);//Перешли к след. стобцу массива
end {If N <> 0 Then}
Else
//Пробела нету, возможно, это последний символ
If Length(InStr)> 0 Then
Begin //Естьзначение
Try //Включаемобработкуошибок
InMass.Mass[CurRow, CurCol] := StrtoFloat(InStr); //Присваиваемэлементмассиваизстрок
except //Еслиавария
InMass.Mass[CurRow, CurCol] := 0; //Присваиваемэлемнту 0
end;
Inc(CurCol);//Перешли к след. стобцу массива
InStr := '';
end; {If Length(InStr)> 0 Then}
end;
end;
procedure
TMainForm.VS_GetRazmOnFile(FileName: String; var
Row: Integer);
Var F : TextFile; //Описали переменную работы с текстовым файлом
RezStr : String;
begin
Row := 0;
AssignFile(F, FileName);
Reset(F);
While Not Eof(F) Do
Begin
ReadLn(F, RezStr);
If (Row = 0) And (Length(RezStr)<> 0)
Then
Inc(Row);
end;{While Not Eof(F) Do}
CloseFile(f);
end;
function TMainForm.VS_GetColOnFile(InStr: String): Integer;
Var
N : Integer;
RezStr : String;
begin
inStr := Trim(InStr); //Удалили пробелы с обоих концов строки
Result := 0;
While Length(InStr) > 0 Do
Begin //Запускаем цикл до тех пор, пока строка имеет значения
N := Pos(#32, InStr); //Нашли ближайший пробел
If N <> 0 Then
Begin // Действительно у нас нашелся прьблел
RezStr := Copy(inStr, 1, N);
Delete (inStr,1, N);
RezStr := Trim(RezStr); //Удалили лишние пробелы
Inc(Result);//Перешли к след. стобцу массива
end {If N <> 0 Then}
Else
//Пробела нету, возможно, это последний символ
If Length(InStr)> 0 Then
Begin //Естьзначение
Inc(Result);//Перешли к след. стобцу массива
InStr := '';
end; {If Length(InStr)> 0 Then}
end;
end;
procedure TMainForm.N10Click(Sender: TObject);
begin
VS_LoadData(MassB);
end;
end.