Interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls,Menus, Spin, Grids;
type
TForm1 = class(TForm)
mm1: TMainMenu;
N1: TMenuItem;
N2: TMenuItem;
N3: TMenuItem;
N4: TMenuItem;
N5: TMenuItem;
N6: TMenuItem;
N7: TMenuItem;
N8: TMenuItem;
N9: TMenuItem;
N10: TMenuItem;
N11: TMenuItem;
dlgOpen1: TOpenDialog;
dlgSave1: TSaveDialog;
se1: TSpinEdit;
lbl1: TLabel;
sd1: TStringGrid;
sd11: TStringGrid;
sd12: TStringGrid;
lbl2: TLabel;
lbl3: TLabel;
procedure N4Click(Sender: TObject);
procedure N9Click(Sender: TObject);
procedure N11Click(Sender: TObject);
procedure N6Click(Sender: TObject);
procedure N7Click(Sender: TObject);
procedure N8Click(Sender: TObject);
procedure N10Click(Sender: TObject);
procedure N2Click(Sender: TObject);
procedure N3Click(Sender: TObject);
procedure sd1KeyPress(Sender: TObject; var Key: Char);
private
{ Private declarations }
public
{ Public declarations }
end;
tmas2=array[1..10,1..10] of integer;
var
Form1: TForm1;
Implementation
{$R *.dfm}
var
a,b,c:tmas2;
n:Integer;
procedure TForm1.N9Click(Sender: TObject);
//Пункт меню "Выход"
begin
Close;
end;
procedure TForm1.N4Click(Sender: TObject);
//Пункт меню "Выход"
begin
Close;
end;
procedure TForm1.N11Click(Sender: TObject);
//Формирование StringGrid для ввода с клавиатуры
begin
with sd1 do
begin
n:=se1.Value;
ColCount:=n;
RowCount:=n;
Width:=n*(DefaultColWidth+2)+4;
Height:=n*(DefaultRowHeight+2)+4;
end;
with sd11 do
begin
ColCount:=n;
RowCount:=n;
Width:=n*(DefaultColWidth+2)+4;
Height:=n*(DefaultRowHeight+2)+4;
Left:=sd1.Left+sd1.Width+24;
end;
with sd12 do
begin
ColCount:=n;
RowCount:=n;
Width:=n*(DefaultColWidth+2)+4;
Height:=n*(DefaultRowHeight+2)+4;
Left:=sd11.Left+sd11.Width+24;
end;
lbl2.Left:=sd11.Left-22;
if Odd(n) then
lbl2.Top:=sd1.Top+(n div 2)*(sd1.DefaultRowHeight+2)
else
lbl2.Top:=sd1.Top+(n div 2)*(sd1.DefaultRowHeight+2)-12;
lbl2.Caption:='';
lbl3.Left:=sd12.Left-22;
if Odd(n) then
lbl3.Top:=sd11.Top+(n div 2)*(sd11.DefaultRowHeight+2)
else
lbl3.Top:=sd11.Top+(n div 2)*(sd11.DefaultRowHeight+2)-12;
lbl3.Caption:='=';
Form1.Width:=sd1.Left+sd1.Width+sd11.Width+sd12.Width+70;
N6.Enabled:=True;
N7.Enabled:=True;
N8.Enabled:=True;
N10.Enabled:=True;
sd1.SetFocus;
end;
procedure matr(var a,b:tmas2;n:Integer);
//Формирование массивов a и b
var
i,j:Integer;
begin
for i:=1 to n do
for j:=1 to n do
begin
a[i,j]:=StrToInt(Form1.sd1.Cells[j-1,i-1]);
b[i,j]:=StrToInt(Form1.sd11.Cells[j-1,i-1]);
end;
end;
procedure res(c:tmas2;n:Integer);
//Результат-матрица C помещается в StringGrid
var
i,j:Integer;
begin
for i:=1 to n do
for j:=1 to n do
Form1.sd12.Cells[j-1,i-1]:=IntToStr(c[i,j]);
end;
procedure TForm1.N6Click(Sender: TObject);
//Сложение матриц
var
i,j:Integer;
begin
lbl2.Caption:='+';
matr(a,b,n);
for i:=1 to n do
for j:=1 to n do
c[i,j]:=a[i,j]+b[i,j];
Res(c,n);
end;
procedure TForm1.N7Click(Sender: TObject);
//Вычитание матриц
var
i,j:Integer;
begin
lbl2.Caption:='-';
matr(a,b,n);
for i:=1 to n do
for j:=1 to n do
c[i,j]:=a[i,j]-b[i,j];
Res(c,n);
end;
procedure TForm1.N8Click(Sender: TObject);
//Произведение матриц
var
i,j,k,s:Integer;
begin
lbl2.Caption:='x';
matr(a,b,n);
for i:=1 to n do
for j:=1 to n do
begin
s:=0;
for k:=1 to n do
s:=s+a[i,k]*b[k,j];
c[i,j]:=s;
end;
Res(c,n);
end;
procedure TForm1.N10Click(Sender: TObject);
//Очистка StrigGrid
var
i,j:Integer;
begin
for i:=1 to n do
for j:=1 to n do
begin
Form1.sd1.Cells[j-1,i-1]:='';
Form1.sd11.Cells[j-1,i-1]:='';
Form1.sd12.Cells[j-1,i-1]:='';
end;
end;
procedure TForm1.N2Click(Sender: TObject);
//Чтение исходных матриц из файла
var
i,j,s:Integer;
fin:TextFile;
begin
if dlgOpen1.Execute then
begin
AssignFile(fin,dlgOpen1.FileName);
Reset(fin);
Readln(fin,n);
with sd1 do
begin
se1.Value:=n;
ColCount:=n;
RowCount:=n;
Width:=n*(DefaultColWidth+2)+4;
Height:=n*(DefaultRowHeight+2)+4;
end;
with sd11 do
begin
ColCount:=n;
RowCount:=n;
Width:=n*(DefaultColWidth+2)+4;
Height:=n*(DefaultRowHeight+2)+4;
Left:=sd1.Left+sd1.Width+24;
end;
with sd12 do
begin
ColCount:=n;
RowCount:=n;
Width:=n*(DefaultColWidth+2)+4;
Height:=n*(DefaultRowHeight+2)+4;
Left:=sd11.Left+sd11.Width+24;
end;
lbl2.Left:=sd11.Left-22;
if Odd(n) then
lbl2.Top:=sd1.Top+(n div 2)*(sd1.DefaultRowHeight+2)
else
lbl2.Top:=sd1.Top+(n div 2)*(sd1.DefaultRowHeight+2)-12;
lbl2.Caption:='';
lbl3.Left:=sd12.Left-22;
if Odd(n) then
lbl3.Top:=sd11.Top+(n div 2)*(sd11.DefaultRowHeight+2)
else
lbl3.Top:=sd11.Top+(n div 2)*(sd11.DefaultRowHeight+2)-12;
lbl3.Caption:='=';
Form1.Width:=sd1.Left+sd1.Width+sd11.Width+sd12.Width+70;
for i:=1 to n do
for j:=1 to n do
begin
read(fin,s);
sd1.Cells[j-1,i-1]:=IntToStr(s);
end;
Readln(fin);
for i:=1 to n do
for j:=1 to n do
begin
read(fin,s);
sd11.Cells[j-1,i-1]:=IntToStr(s);
end;
N6.Enabled:=True;
N7.Enabled:=True;
N8.Enabled:=True;
N10.Enabled:=True;
CloseFile(fin);
end;
end;
procedure TForm1.N3Click(Sender: TObject);
//Сохранение матриц a и b
var
i,j:Integer;
fout:TextFile;
begin
if dlgSave1.Execute then
begin
matr(a,b,n);
AssignFile(fout,dlgSave1.FileName);
Rewrite(fout);
Writeln(fout,n);
for i:=1 to n do
begin
for j:=1 to n do
write(fout,a[i,j]:8);
Writeln(fout);
end;
for i:=1 to n do
begin
for j:=1 to n do
write(fout,b[i,j]:8);
Writeln(fout);
end;
CloseFile(fout);
end;
end;
procedure TForm1.sd1KeyPress(Sender: TObject; var Key: Char);
//Обработка нажатых клавиш при вводе исходных данных
var
stringGrid:TStringGrid;
begin
stringGrid:=sender as TStringGrid;
with stringGrid do
case key of
'0'..'9',#8:;
'-','+':if (pos('-',cells[col,row])<>0) or (pos('+',cells[col,row]) <>0) then
key:=#0;
#13:begin
if col<colcount-1 then
col:=col+1
else
if row<rowcount-1 then
begin
row:=row+1;
col:=0;
end
else
if stringGrid.Name='sd1' then
sd11.SetFocus;
end;
else
key:=#0;
end;
end;
end.
Задания
Разработайте алгоритм и программу, реализующую этот алгоритм. Основные функции программы оформите в виде процедур и функций.
Исходные данные вводите из текстового файла. Результаты работы программы также поместите в текстовый файл и выведите на экран.
Заданиями второго уровня являются те же задачи, но реализованные как полноэкранные приложения Windows.
1. Найдите произведение вектора на матрицу.
2. Даны две матрицы одинаковой размерности. Найдите сумму или разность этих матриц в зависимости от значения параметра flag.
3. К данной матрице А порядка n добавьте нулевую и n + 1-ю строки с элементами, равными 1.
4. К данной матрице А порядка n добавьте нулевой и n + 1-й столбцы с элементами, равными 0.
5. Определите количество строк заданной матрицы, которые упорядочены по возрастанию.
6. Сложите две треугольные матрицы порядка n, у которых только элементы над главной диагональю отличны от нуля.
7. В данной матрице определите количество столбцов, у которых элементы расставлены в порядке возрастания.
8. Выполните «прямой ход» в решении системы линейных алгебраических уравнений методом Гаусса.
9. Выполните «обратный ход» в решении системы линейных алгебраических уравнений методом Гаусса. Вводите только элементы матрицы системы, стоящие выше главной диагонали, и вектор свободных членов.
10. Дана матрица Аm×n, содержащая оценки группы за первый семестр. Найдите количество «хорошистов» в группе (оценки не ниже шестерки, но не все выше восьмерки).
11. Дана квадратная матрица А порядка n. Найдите количество строк матрицы, сумма модулей элементов которых больше 1.
12. Дана квадратная матрица А порядка n. Найдите среднее арифметическое положительных элементов каждого столбца матрицы.
13. Дана квадратная матрица А порядка n. Найдите номер строки матрицы, в которой больше всего единичных элементов.
14. Дана квадратная матрица А порядка n. Проверьте, равны ли суммы элементов матрицы по строкам, столбцам, главной и побочной диагоналям между собой, т.е. является ли матрица магическим квадратом.
15. Дана квадратная матрица А порядка n. Определите норму заданной матрицы. Одна из норм матрицы равна наибольшей из сумм модулей элементов, стоящих в одной строке.
16. Дана квадратная матрица А порядка n. Постройте вектор, элементы которого являются наибольшими числами каждой строки матрицы.
17. Дана квадратная матрица А порядка n. Найдите сумму положительных элементов матрицы, стоящих под главной диагональю.
18. Дана квадратная матрица А порядка n. Транспонируйте данную матрицу.
19. Дана квадратная матрица А порядка n. Проверьте, является ли данная матрица симметричной.
20. Дана квадратная матрица А порядка n. Проверьте, является ли матрица единичной.
21. Дана матрица А, имеющая n строк и m столбцов, содержащая оценки группы за первый семестр. Выведите номера отличников (оценки не ниже 8).
22. Дана матрица А, имеющая n строк и m столбцов, содержащая оценки группы за первый семестр. Определите средний балл каждого студента.
23. Дана матрица А, имеющая n строк и m столбцов, содержащая оценки группы за первый семестр. Найдите количество единиц, двоек и троек у каждого студента.
24. Дана матрица А, имеющая n строк и m столбцов, содержащая оценки группы за первый семестр. Определите средний балл студентов группы по каждому предмету.
25. Дана матрица А, имеющая n строк и m столбцов, содержащая оценки группы за первый семестр. Определите количество неуспевающих студентов (имеются оценки 0, 1, 2 или 3).
26. Если все элементы какой-либо строки данной матрицы равны между собой, то все элементы такой строки замените нулями.
27. Дана матрица А, имеющая n строк и m столбцов, содержащая оценки группы за первый семестр. Выведите номера предметов, по которым имеются нулевые оценки.
28. Дана матрица А порядка n. Определите количество строк матрицы, элементы которых представляют перестановки чисел от 1 до n.
29. Найдите наибольшую сумму модулей элементов строк заданной матрицы.
30. Найдите произведение матрицы на вектор.
Лабораторная работа 8
Сложные циклы. Обработка массивов.
Создание и использование Unit-ов и библиотек DLL
Цель работы: формирование умений и навыков в разработке сложных циклических алгоритмов обработки массивов с использованием процедур и функций пользователя, находящихся в отдельном модуле; использование текстовых файлов для ввода-вывода.
Что нужно знать для выполнения работы
1. Структуру вложенного цикла.
2. Метод пошаговой детализации (последовательного уточнения) разработки алгоритмов.
3. Особенности использования массивов в качестве параметров в процедурах и функциях.
4. Объявление и использование текстовых файлов.
5. Структуру Unit-а.
6. Структуру динамически подключаемой библиотеки.
Примеры выполнения задания лабораторной работы
Пример 1. Составьте программу перемножения матриц Am×n и Bn×l. В результате должна получиться матрица Cm×l. Процедуры ввода матрицы, вывода матрицы, перемножения матриц поместите в модуль Matr. В головной программе введите имена входного текстового файла, в котором находятся исходные матрицы, и выходного файла, в который будут выведены исходные матрицы и матрица произведения.
Текст головной программы
program lr8_1_1;
{Нахождение произведения матрицы Amxn на матрицу Bnxl,
получая матрицу Cmxl. Использование Unit-a}
{$APPTYPE CONSOLE}
uses
SysUtils, Unit1 ;
{type
matr =array[1..10,1..10] of real;
stroka =string[30];}//эти типы описаны в Unit-е
var
a,b,c:matr; {исходные матрицы и матрица результата}
l,m,n:integer;
namefilein,namefileout:stroka;
begin
write('Vvedite imja vchodnogo fayla ');
readln(namefilein);
write('Vvedite imja vichodnogo fayla ');
readln(namefileout);
vvodmatr(a,namefilein,m,n,true,false);
vvodmatr(b,namefilein,n,l,false,true);
vivodmatr(namefileout,a,m,n,'Matrica A',true);
vivodmatr(namefileout,b,n,l,'Matrica B',false);
multmatr(a,b,c,m,n,l);
vivodmatr(namefileout,c,m,l,'Matrica C=A*B',false);
end.
Текст Unit-а Unit1.pas
unit unit1;
{Процедуры ввода, вывода матриц, нахождения произведения
матрицы Amxn на матрицу Bnxl,
получая матрицу Cmxl}