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

Interface

type

matr =array[1..10,1..10] of real;

stroka =string[30];

{Ввод матрицы}

procedure vvodmatr(var a:matr;namefile:stroka;var m,n: integer; flag1,flag2:boolean);

{Вывод матрицы}

procedure vivodmatr(namefile:stroka;a:matr;m,n:integer;zag: stroka; flag:boolean);

{Нахождение произведения матрицы}

procedure multmatr(a,b:matr;var c:matr;m,n,l:integer);

Implementation

procedure vvodmatr(var a:matr;namefile:stroka;var m,n: integer; flag1,flag2:boolean);

{Ввод матрицы}

var

i,j:integer;

fin:text;

begin

if flag1 then {Открывать файл?}

begin

assign(fin,namefile);

reset(fin);

end;

readln(fin,m,n);

for i:=1 to m do

for j:=1 to n do

read(fin,a[i,j]);

if flag2 then {Закрывать файл?}

close(fin);

end;

procedure vivodmatr(namefile:stroka;a:matr;m,n:integer;zag: stroka; flag:boolean);

{Вывод матрицы}

var

i,j:integer;

fout:text;

begin

assign(fout,namefile);

if flag then

rewrite(fout)

else

append(fout);

writeln(fout,zag);

for i:=1 to m do

begin

for j:=1 to n do

write(fout,a[i,j]:8:2);

writeln(fout);

end;

close(fout);

end;

procedure multmatr(a,b:matr;var c:matr;m,n,l:integer);

{Нахождение произведения матрицы}

var

i,j,k:integer;

s:real;

begin

for i:=1 to m do

for j:=1 to l do

begin

s:=0;

for k:=1 to n do

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

c[i,j]:=s;

end;

end;

end.

Решим данную задачу с использованием внешнего файла Unit1.pas вместо Unit-а.

Текст головной программы

program lr8_1_2;

{Нахождение произведения матрицы Amxn на матрицу Bnxl, получая матрицу Cmxl.

Использование внешнего файла}

{$APPTYPE CONSOLE}

uses

SysUtils;

type

matr =array[1..10,1..10] of real;

stroka =string[30];

var

a,b,c:matr; {исходные матрицы и матрица результата}

l,m,n:integer;

namefilein,namefileout:stroka;

{$I Unit1.pas} //Подключение внешнего файла

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.

Содержимое файла Unit1.pas

{Процедуры ввода, вывода матриц, нахождения произведения

матрицы Amxn на матрицу Bnxl,

получая матрицу Cmxl}

procedure vvodmatr(var a:matr;namefile:stroka;var m,n: integer; flag1,flag2:boolean);

{Ввод матрицы}

var

i,j:integer;

fin:text;

begin

if flag1 then {Открывать файл?}

begin

assign(fin,namefile);

reset(fin);

end;

readln(fin,m,n);

for i:=1 to m do

for j:=1 to n do

read(fin,a[i,j]);

if flag2 then {Закрывать файл?}

close(fin);

end;

procedure vivodmatr(namefile:stroka;a:matr;m,n:integer;zag: stroka; flag:boolean);

{Вывод матрицы}

var

i,j:integer;

fout:text;

begin

assign(fout,namefile);

if flag then

rewrite(fout)

else

append(fout);

writeln(fout,zag);

for i:=1 to m do

begin

for j:=1 to n do

write(fout,a[i,j]:8:2);

writeln(fout);

end;

close(fout);

end;

procedure multmatr(a,b:matr;var c:matr;m,n,l:integer);

{Нахождение произведения матрицы}

var

i,j,k:integer;

s:real;

begin

for i:=1 to m do

for j:=1 to l do

begin

s:=0;

for k:=1 to n do

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

c[i,j]:=s;

end;

end;

Вместо Unit-а воспользуемся динамически подключаемой библиотекой (DLL).

Текст головной программы

program Project1;

//Перемножение матриц

//Использование библиотеки DLL

{$APPTYPE CONSOLE}

uses

SysUtils;

type

matr =array[1..10,1..10] of real;

stroka =string[30];

{Ввод матрицы}

procedure vvodmatr(var a:matr;namefile:stroka;var m,n:

integer; flag1,flag2:boolean);

external 'project2.dll';

{Вывод матрицы}

procedure vivodmatr(namefile:stroka;a:matr;m,n:integer;zag: stroka; flag:boolean); external 'project2.dll';

{Нахождение произведения матрицы}

procedure multmatr(a,b:matr;var c:matr;m,n,l:integer);

external 'project2.dll';

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.

Текст библиотеки DLL

library Project2;

{ Все процедуры здесь }

uses

SysUtils,

Classes;

{$R *.res}

type

matr =array[1..10,1..10] of real;

stroka =string[30];

procedure vvodmatr(var a:matr;namefile:stroka;var m,n: integer; flag1,flag2:boolean);

{Ввод матрицы}

var

i,j:integer;

fin:text;

begin

if flag1 then {Открывать файл?}

begin

assign(fin,namefile);

reset(fin);

end;

readln(fin,m,n);

for i:=1 to m do

for j:=1 to n do

read(fin,a[i,j]);

if flag2 then {Закрывать файл?}

close(fin);

end;

procedure vivodmatr(namefile:stroka;a:matr;m,n:integer;zag: stroka; flag:boolean);

{Вывод матрицы}

var

i,j:integer;

fout:text;

begin

assign(fout,namefile);

if flag then

rewrite(fout)

else

append(fout);

writeln(fout,zag);

for i:=1 to m do

begin

for j:=1 to n do

write(fout,a[i,j]:8:2);

writeln(fout);

end;

close(fout);

end;

procedure multmatr(a,b:matr;var c:matr;m,n,l:integer);

{Нахождение произведения матрицы}

var

i,j,k:integer;

s:real;

begin

for i:=1 to m do

for j:=1 to l do

begin

s:=0;

for k:=1 to n do

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

c[i,j]:=s;

end;

end;

exports vvodmatr,vivodmatr,multmatr;

begin

end.

Задания

Разработайте алгоритм и программу, реализующую этот алгоритм.

Исходные данные вводите из текстового файла. Результаты работы программы также поместите в текстовый файл.

Функции программы, оформленные в виде процедур и функций, поместите в

  • отдельный Unit;

  • отдельный файл;

  • динамически подключаемую библиотеку.

1. Дана матрица A порядка n. Найдите наибольший среди отрицательных элементов матрицы.

2. Дана матрица A порядка n. Определите количество столбцов матрицы, в которых имеются нулевые элементы.

3. Дана последовательность чисел a1, a2, ..., an. Найдите наибольшую сумму, образованную двумя, идущими подряд, элементами.

4. Дана функция Найдите наибольшее значение данной функции на промежутке [a; b].

5. Дана последовательность чисел a1, a2, ..., an. Каждый член этой последовательности, кроме крайних, замените суммой соседних с ним членов.

6. Дана матрица A порядка n. Расставьте элементы каждой строки в порядке возрастания.

7. Дана матрица A порядка n. Расставьте строки матрицы в порядке возрастания количества нулевых элементов.

8. Дана матрица A порядка n. Удалите строки, содержащие нулевые элементы.

9. Дана матрица A порядка n. Поменяйте местами наибольший и наименьший элементы матрицы.

10. Дана матрица A порядка n. Расставьте элементы строк с четными номерами матрицы в порядке убывания.

11. Дана матрица A порядка n. Найдите два наибольших элемента матрицы с указанием номеров строк и столбцов, в которых они находятся.

12. Дана матрица A порядка n. Поменяйте местами строки: первую с последней, вторую с предпоследней и т.д.

13. Дана матрица A порядка n. Отсортируйте строки матрицы в порядке возрастания наибольших элементов в каждой строке.

14. Дана квадратная матрица А порядка n. Найдите седловую точку матрицы, т.е. элемент, который является наименьшим в своей строке и наибольшим в своем столбце.

15. Дана квадратная матрица А порядка n. Найдите суммы элементов тех строк матрицы, на главной диагонали которой стоят отрицательные элементы.

16. Даны два упорядоченных по возрастанию массива целых чисел: А, состоящего из n элементов, и В, состоящего из m элементов. Выполните слияние этих двух массивов в один упорядоченный массив C.

17. Даны координаты xi и yi n точек на плоскости. Определите количество точек, лежащих в первой четверти.

18. Даны две последовательности чисел a1, a2, ..., an и b1, b2, ..., bn. Сформируйте новые последовательности, элементы которых вычисляются по следующему правилу:

ai = max(ai, bi), bi = min(ai, bi), i = 1, 2, ..., n.

19. Даны две последовательности чисел a1, a2,..., an и b1, b2, ..., bn. Сформируйте новые последовательности, элементы которых вычисляются по следующему правилу:

ai = ai + bi, bi = aibi, i = 1, 2, ..., n.

20. Дана последовательность чисел a1, a2, ..., an. Проверьте, верно ли, что каждый член этой последовательности больше его номера.

21. Дана последовательность чисел a1, a2, ..., an. Проверьте, является ли данная последовательность арифметической прогрессией.

22. Дан массив А, состоящий из n натуральных чисел. Упорядочите элементы массива методом простого выбора.

23. Дан массив А, состоящий из n натуральных чисел. Упорядочите элементы массива методом простых вставок.

24. Дан массив А, состоящий из n натуральных чисел. Найдите наибольший общий делитель элементов массива.

25. Дан массив А, состоящий из n натуральных чисел. Найдите наименьшее общее кратное элементов массива.

26. Дан массив А, состоящий из n натуральных чисел. Определите количество элементов, являющихся простыми числами.

27. Дан массив А, состоящий из n натуральных чисел. Выберите элементы, встречающиеся более одного раза.

28. Дан массив А, состоящий из n натуральных чисел. Определите максимальное число идущих подряд элементов, равных 1.

29. Дана последовательность n целых чисел a1, a2, ..., an. Найдите длину самой длинной возрастающей последовательности подряд идущих элементов.

30. Дана матрица A порядка n. Найдите строку матрицы, в которой больше всего нулевых элементов.

31. Дана действительная квадратная матрица порядка n. Постройте одномерный массив, k-й элемент которого равен 0, если все элементы k-й строки матрицы равны между собой и 1 в противном случае.

Задачи второго уровня

1. Дан массив А, состоящий из n натуральных чисел. Найдите элемент массива, сумма цифр которого наибольшая.

2. Дана действительная квадратная матрица порядка n. Найдите сумму элементов, расположенных в заштрихованной части матрицы (рис. 8.1).

3. Дана действительная квадратная матрица порядка n. Найдите сумму элементов, расположенных в заштрихованной части матрицы (рис. 8.2).

4. Дана действительная квадратная матрица порядка n. Найдите сумму элементов, расположенных в заштрихованной части матрицы (рис. 8.3).

Рис. 8.1

Рис. 8.2

Рис. 8.3

5. Даны две последовательности a1, a2, ..., an и b1, b2, ..., bn целых чисел. Среди членов каждой последовательности нет повторяющихся чисел. Получите все члены последовательности b1, b2, ..., bn, которые не входят в последовательность a1, a2, ..., an.

6. Дана действительная квадратная матрица порядка n. Найдите сумму элементов, расположенных в заштрихованной части матрицы (рис. 8.4).

7. Дана действительная квадратная матрица порядка n. Найдите сумму элементов, расположенных в заштрихованной части матрицы (рис. 8.5).

8. Дана действительная квадратная матрица порядка n. Найдите сумму элементов, расположенных в заштрихованной части матрицы (рис. 8.6).

Рис. 8.4

Рис. 8.5

Рис. 8.6

9-12. Дана действительная квадратная матрица порядка 2n (рис. 8.7). Цифрами обозначены подматрицы порядка n.

9. Получите новую матрицу (рис. 8.8).

10. Получите новую матрицу (рис. 8.9).

11. Получите новую матрицу (рис. 8.10).

12. Получите новую матрицу (рис. 8.11).

Рис. 8.7

Рис. 8.8

Рис. 8.9

Рис. 8.10

Рис. 8.11

13. Даны две последовательности a1, a2, ..., an и b1, b2, ..., bn целых чисел. Среди членов каждой последовательности нет повторяющихся чисел. Постройте пересечение последовательностей (т.е. получите в каком-нибудь порядке все числа, принадлежащие обеим последовательностям одновременно).

14. Даны две последовательности a1, a2, ..., an и b1, b2, ..., bn целых чисел. Среди членов каждой последовательности нет повторяющихся чисел. Постройте объединение данных последовательностей (равные члены разных последовательностей должны входить только один раз).

15. Постройте n строк треугольника Паскаля (рис. 8.12).

1