Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Практикум1_2014.doc
Скачиваний:
19
Добавлен:
25.02.2016
Размер:
1.79 Mб
Скачать

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}