Целью
работы является
написание
программ на
ЭВМ, согласно
условию в выбранном
варианте, первая
программа для
задания А, и
вторая программа
для задания
Б. Для написания
программ
использовался
Borland
Turbo
Pascal
версии 7.1. Рассмотрим
по очереди эти
два задания.
ЗАДАНИЕ
А. Необходимо
подсчитать
количество
нулевых элементов
для матриц
А(N,M)
и В(M,N),
причём M
и N
не могут быть
больше 20.
Матрицы
А и В представляют
в машинном
исполнении
двухмерные
массивы, число
элементов в
которых не
может быть
больше 20х20=400 элементов
по условию.
Каждый индекс
числа – M и N
представляет
собой «координату»
числа в матрице,
по его строке
и столбцу,
соответственно.
Автор программы
ввёл в неё выбор
количества
строк и столбцов
для каждой
матрицы (массива),
дав пользователю
возможность
выбрать его
в пределах от
двух до двадцати
(по условию).
Программа
занесения
данных в сами
массивы построена
на цикле оператора
FOR,
причём если
пользователю
будет лень
вносить данные
самостоятельно
– программа
может сделать
это за него
посредством
генерации
случайных чисел
и занесения
их в массивы,
что на современных
компьютерах
занимает считанные
наносекунды.
На программу
самогенерации-самоввода
элементов
матриц автор
программы ввёл
некоторые
ограничения
во избежании
не занесения
в них нулевых
элементов, что
необходимо
для проверки
правильности
работы программы.
Если вручную
вы можете ввести
любое действительное
число от -32768 до
32767, то программа
самогенерации
генерирует
целые числа
от нуля до двадцати.
И, если вы, к
примеру, задали
в программе
размер матриц
2X3,
что составляет
всего шесть
элементов, то
вполне вероятно
(как показала
практика тестирования
программы), что
в ней будет
хотя бы один
нулевой элемент,
или, попросту
– ноль. Подпрограмма
подсчёта количества
нулевых элементов
тоже построена
на цикле оператора
FOR,
и если бы она
не была необходима
по условию, без
неё можно было
бы обойтись,
включив подсчёт
таких элементов
в цикл ввода
данных / цикл
генерации
данных, тем
самым повысив
быстродействие
программы. Эта
подпрограмма
(так же, как и
подпрограмма
в задании Б)
оформлена в
виде процедуры.
ЗАДАНИЕ
Б. Найти средние
значения и
стандартные
отклонения
для элементов
массивов X(N),
Y(M),
причём количество
элементов не
может быть
более 100.
В этом
примере реализована
та же подпрограмма
ввода / генерации
данных, что и
в задании А, с
разницей в
массивах –
здесь мы имеем
одномерные
массивы. На
программу
генерации
элементов
массивов наложены
те же самые
ограничения,
что и в задании
А, с той разницей,
что число
генерируется
в интервале
от нуля до ста,
а не до двадцати.
В подпрограмму
вычисления
условий задачи
внесён тот же
цикл оператора
FOR,
несущий в этом
задании вспомогательную
функцию вычисления
среднего числа
массивов в
частности.
Подпрограмма
оформлена в
виде отдельной
процедуры, как
и в задании А,
однако без этой
процедуры
обойтись, как
в первом задании,
нельзя, так как
разбросав её
на алгоритмы
ввода и генерации
данных мы усложняем,
запутываем
алгоритм программы,
снижая тем
самым её производительность
(быстродействие).
Лабораторная
работа №6
Программирование
с использованием
подпрограмм
пользователя.
Цель
работы – овладение
навыками
алгоритмизации
задач с использованием
подпрограмм
пользователя
различных
видов, овладение
навыками написания
программ и
обращения к
ним, выбора
параметров
подпрограмм.
Задание для
самостоятельной
работы.
Изучить:
правила
записи подпрограмм
различных
видов и способов
обращений к
ним;
способы
передачи параметров
в подпрограмму;
правила
записи программ,
использующих
подпрограммы.
Разработать
алгоритм решения
задачи.
Составить
программу
решения задачи.
Подготовить
тестовый вариант
программы и
исходных данных.
Задание
к работе
Задание А.
Выполнить
на ЭВМ программу,
использующую
подпрограмму
функцию, в
соответствии
с номером параметра,
указанным в
таблице.
Проверить
правильность
выполнения
программы с
помощью тестового
варианта.
Вариант
Задания
|
Условия
задачи |
Примечания |
1 |
Вычислить
большие корни
кв. уравнений
x2-ax+b=0
cy2-dy-f=0
|
Все
корни действительные |
2 |
Подсчитать
число точек,
находящихся
внутри круга
радиусом r
с центром в
начале координат;
координаты
заданы массивами
X(100),
Y(100) |
Расстояние
точки от начала
координат
вычислять в
подпрограмме |
3 |
|
Длину
стороны энугольников
вычислять в
подпрограмме |
4 |
Подсчитать
число точек,
находящихся
внутри круга
радиусом r
с центром в
точке с координатами
(1,1); координаты
заданы массивами
X(80),
Y(80) |
Расстояние
точки от центра
круга определять
в подпрограмме |
5 |
Вычислить
z=(v1+v2+v3)/3
, где v1
,v2,v3,
- объёмы шаров
с радиусами
r1
, r2 и r3
соответственно
|
Vi
вычислять в
подпрограмме
|
6 |
Вычислить
суммы положительных
элементов
массивов X(N),
Y(M),
Z(K) |
N<=60 M<=60 K<=70
|
7 |
Вычислить
среднее арифметическое
положительных
элементов
для массивов
A(N1),
B(N2),
C(N3) |
N1<=100
N2<=100
N3<=100
|
8 |
Подсчитать
количество
элементов
матриц X(10,15)
и Y(20,12),
удовлетворяющих
условиям 0<=xij<=1
и 0<=yij<=1
|
|
9 |
Вычислить
суммы положительных
элементов
каждой строки
для матриц
A(10,12)
и B(15,10) |
|
10 |
Вычислить
z=(xm1+xm2)/2
, где xm1
и xm2
– наименьшие
элементы массивов
X1(70),
X2(80)
|
|
11 |
Вычислить
суммы элементов
главных диагоналей
матриц A(N,N)
B(M,M) |
M<=20
N<=30
|
12 |
Вычислить
z=(s1+s2)/2,
где s1-
сумма положительных
элементов
массива X(50);
s2-
сумма отрицательных
элементов
массива Y(60)
|
Обе
суммы вычислять
в одной подпрограмме |
13
|
Подсчитать
число нулевых
элементов
для матриц
A(N,M)
и B(M,N) |
M<=20
N<=20
|
14 |
Вычислить
суммы элементов
нижних треугольных
матриц для
матриц A(15,15)
и B(20,20) |
|
15 |
Определить
число положительных
элементов до
первого отрицательного
в массивах
X(40),
Y(50),
Z(N) |
N<=50
|
Задание Б.
Выполнить
на ЭВМ программу,
использующую
подпрограмму-процедуру
в соответствии
с номером, указанным
в таблице.
Проверить
правильность
выполнения
программы с
помощью тестового
варианта .
Вариант
Задания
|
Условие
задачи
|
Примечания |
1 |
Вычислить
z
= (s1+s2)/k1k2
,где s1
и k1
– сумма и количество
положительных
элементов
массива X(N);
s2
и k2
– сумма и количество
положительных
элементов
массива Y(M).
|
M<=100
N<=100
|
2 |
Вычислить
z
= (es1+es2)/k1k2,
где s1
и k1
– сумма и количество
положительных
элементов
массива X(100);
s2
и k2
– сумма и количество
положительных
элементов
массива Y(80).
|
Обе
суммы вычислять
в одной подпрограмме |
3 |
Вычислить
и запомнить
суммы положительных
элементов
каждой строки
матицы A(10,20),
B(15,10). |
|
4 |
Вычислить
z
= (x1+y1)/(x2-y2),
где x1
и x2
– корни уравнения
2x2+x-4
= 0, y1
и y2
– корни уравнения
ay2+2y-1
= 0 .
|
Все
корни действительные |
5 |
Найти
наибольшие
элементы и
их порядковые
номера массивов
X(N)
и Y(M) |
N<=80
M<=70
|
6 |
Переписать
положительные
элементы массива
X(100)
и Y(80)
в массив Z
подряд |
Запись
в массив Z
осуществлять
в подпрограмме |
7 |
Найти
наименьшие
элементы и
номера строк
и столбцов,
в которых они
расположены,
для матриц
A(10,15)
и B(15,12) |
|
8 |
Вывести
на печать элементы
целочисленных
матриц N(5,8)
и M(10,6),
кратные трём |
|
9
|
Вычислить
z,
где xi
и yi
– заданы массивами
|
Все
суммы вычислять
в одной подпрограмме |
10 |
Вычислить
z
= (xmax-ymin)/2,
где xmax
– максимальный
элемент массива
X(50);
ymin
– минимальный
элемент массива
Y(40)
|
xmax
и ymin
вычислять в
одной подпрограмме
|
11 |
Вычислить
и запомнить
количество
отрицательных
элементов
каждого столбца
для матриц
A(10,10),
B(15,20) |
|
12 |
Вычислить
суммы элементов
верхней треугольной
матрицы для
матриц A(10,10),
B(15,15) |
|
13
|
Найти
средние значения
и стандартные
отклонения
для элементов
массивов X(N),
Y(M) |
N<=100
M<=100
|
14 |
Вычислить
суммы и количества
элементов,
находящихся
в интервале
от a
до b
для матриц
X(10,8)
и Y(10,12) |
|
15 |
Преобразовать
массивы X(50)
и Y(60),
расположив
в них подряд
только положительные
элементы. Вместо
остальных
элементов
записать нули |
|
Пример
выполнения
работы
Задание А.
Выполнить
на ЭВМ решение
задачи. Определить
ближайшую к
началу координат
точку, находящуюся
в верхней
полуплоскости,
и наиболее
удалённую
точку, лежащую
в нижней полуплоскости.
Координаты
точек, находящихся
в верхней
полуплоскости
, заданы массивами
X1(N)
и Y1(N),
а лежащие в
нижней полуплоскости
,- массивами
X2(M)
и Y2(M),
где N<=40, M<=60.
Для каждой
точки верхней
полуплоскости
следует определить
расстояние
от начала координат.
Из этих расстояний
необходимо
найти наименьшее.
Такие же действия
выполнить для
точек, находящихся
в нижней полуплоскости,
однако найти
наибольшее
расстояние
от начала координат.
Вычисление
расстояний
от начала координат
и нахождение
наименьшего
или наибольшего
из них выполним
в подпрограмме-функции.
Использование
одной подпрограммы
для нахождения
наибольшего
и наименьшего
значений потребует
введения
дополнительного
параметра,
который необходим
для проверки
условия K*R>K*RM.
Если K=1,
то условие R>RM
используется
для нахождения
наибольшего;
если K=
-1, то условие
R
В подпрограмму
необходимо
передать массивы
координат
точек, их размер,
а также параметр
K,
который может
принимать
значения +1 или
–1. Результат,
полученный
в подпрограмме–функции,
присваивается
её имени. Программа,
реализующая
алгоритм, имеют
вид:
program coord;
usec crt;
const n=40;
type mas =array[1..n] of real;
var i,n : byte;
s : real;
x ,y : mas;
function vec(x,y:mas; n,kx:integer):real;
var j : integer;
r,rm : real;
begin
rm := -1e20;
for j := 1 to n do begin
r := sqrt(sgr(x[i])+sgr(y[i]));
if (kx*r>=kx*rm) then rm := r;
end;
vec := rm
end;
{ исполняемая
часть главной
программы }
begin
textattr:=27;clrscr;
gotoxy(30,2);writeln(‘');
write('Введите
кол-во координат
верхней полуплоскости.
');
readln(n);
writeln('Введите
координаты');
for i :=1 to n do begin
read(x[i]); write(‘ ‘);readln(y[i]);
end;
writeln(‘Ближайшая
точка удалена
на расстояние
=’, s:=vec(x,y,n,-1);
write('Введите
кол-во координат
нижней полуплоскости.
');
readln(n);
writeln('Введите
координаты');
for i :=1 to n do begin
read(x[i]); write(‘ ‘);readln(y[i]);
end;
writeln(‘Наиболее
удаленная точка
находится на
расстояни =’,
s:=vec(x,y,n,1);
end.
Проверить
правильность
выполнения
программы для
массивов, заданных
значениями:
Для верхней
полуплоскости
x={-4,0,3}; y={0,5,4};
Для нижней
полуплоскости
x={-4,0,2}; y={-2,-5,-1};
Для которых
наименьшее
расстояние
от начала координат
в верхней
полуплоскости
s = 4, а наибольшее
- в нижней полуплоскости
s = 5.
Задание Б.
Решить на
ЭВМ задачу.
Переписать
положительные
элементы массивов
X(n),Y(m)
в массив Z подряд.
Запись положительных
элементов в
массив осуществить
в подпрограмме.
Принять ограничения:
n<=100 и m<=100.
В подпрограмме
должна осуществляться
запись положительных
элементов
исходного
массива в массив
результатов.
Для этого
в подпрограмму
необходимо
передать следующие
параметры: имя
и количество
элементов
исходного
массива, имя
и номер элемента
с которого
дописывать
результирующий
массив. Поскольку
в массив результатов
Z записывается
подряд положительные
элементы из
нескольких
массивов, в
списке параметров
должны фигурировать
также: входной
параметр L –
номер ячейки,
начиная с которой
необходимо
осуществлять
запись в массив
результатов.
При первом
обращении к
подпрограмме
в неё необходимо
передать имя
массива Х, количество
его элементов
N; входной параметр
L=1, запись осуществляется
в массив Z, начиная
с элемента с
индексом 1. При
завершении
первого обращения
L
хранит номер
последней
занятой ячейки
в массиве Z.
При втором
обращении
необходимо
передать
соответственно
массив Y,
количество
его элементов
M,
и L=L+1
равной номеру
ячейки преднозначенной
для до записи
в массив Z.
В схеме алгоритма
при первом
обращении к
подпрограмме
параметр L задан
равным нулю,
так как в подпрограмме
перед записью
элемента в
массив z индекс
L
увеличивается
на 1. По этой же
причине при
втором обращении
параметру L
опять увеличивается
на 1, что даёт
возможность
обратиться
к следующей
ячейки массива
Z
при втором
обращении.
Программа,
реализующая
алгоритм, имеют
вид:
program sort (input,output);
uses crt;
{подключение
модуля упровляющего
текстовым
режимом монитора}
const n=200;
type mas:array[1..n] of real;
var i,n,m,l: byte;
x,y,z:mas;
procedure st (var a,c:mas;n:byte;var l:byte);
var j:byte;
begin
for j:=1 to n do
if a[i]>0 then begin
inc(l);
c[l] := a[j];
end;
end;
{ исполняемая
часть главной
программы }
begin
window(1,
1, 80, 25);textattr
:= 27; clrscr;
gotoxy(5,
2);write('Введите кол-во
элементов
массива X');
readln(n);
gotoxy(5,
3);write('Введите значения
массива X');
for i := 1 to n do begin
gotoxy(i*4-2, 5); read(x[i]);
end;
gotoxy(5,
9);write('Введите кол-во
элементов
массива Y');
readln(m);
gotoxy(5,
10);write('Введите значения
массива Y');
for i := 1 to m do begin
gotoxy(i*4-2, 12); read(y[i]);
end;
l := 0;
st(x,z,n,l);
st(y,z,m,l);
gotoxy(5,
15);write(‘Результативный
массив Z’);
for i:=1 to l do begin
gotoxy(i*4-2, 17);write(z[i]);
end;
end.
Данная конкретная
программа в
тестировании
не нуждается,
так как выведенные
на печать результаты
позволяют
однозначно
судить о правильности
выполнения
программы.
Контрольные
вопросы
Указать, при
каких условиях
целесообразно
использование
подпрограмм,
какие выгоды
они представляют
пользователю.
Указать, в
чём отличие
различных
видов подпрограмм
пользователя.
Указать
способы обращения
к подпрограммам
пользователя.
Указать
способы передачи
параматров
в подпрограмму.
Указать, как
организовывать
подпрограмму
без параметров.
Перечислить,
как согласуются
формальные
и фактические
параметры.
Указать
конструкции,
которые могут
быть формальными
и фактическими
параметрами.
Пояснить,
как и куда
осуществляется
выход из подпрограммы.
|