Цель
работы.
Целью
работы является
написание
программы на
языке программирования
«Pascal»
для DOS
с использованием
подпрограмм
и функций, задания
для которых
обозначены
вариантом
лабораторной
работы.
2.
Постановка
задачи.
Главной
задачей программиста
является создание
наиболее простого,
и, следовательно,
быстрого алгоритма
программы,
выполняющего
оба задания
– А и Б, причём
задание А необходимо
оформить в виде
процедуры, а
задание Б в
виде функции.
При этом сделать
программу как
можно проще
в использовании.
3.
Описание алгоритма
программы.
Помимо
короткого
основного
модуля программы,
который управляет
процедурами
и функциями,
в программу
включены две
функции и одна
процедура, они
же и являются
подпрограммами,
которые было
необходимо
использовать
по условию
лабораторной
работы.
Процедура
представляет
собой задание
А, в котором
необходимо
было подсчитать
количество
нулей в матрицах.
В программе
матрицы представлены
двухмерным
массивом, числа
в которые заносятся
автоматически
посредством
случайного
их генератора,
после чего над
ними производятся
вычисления.
Необходимо
подчеркнуть,
что как для
занесения в
матрицы случайных
чисел, так и
для подсчёта
их нулевых
элементов,
использовался
один двойной
цикл оператора
FOR.
Первая
функция – это
программное
меню, которое
предоставляет
пользователю
программы выбор
вычисления
заданий и выход.
Соответственно
вторая функция
– это задание
Б, для выполнения
которого автор
программы
использовал
те же принципы
построения
подпрограммы,
что и для выполнения
подпрограммы
задания А.
4.
Блок-схема
программы.
См. на
следующей
странице.
5.
Общие условия.
В программе
использовались
два вида условий.
Первое из них
– условие оператора
IF.
Оно присутствует
в основном
модуле программы,
который управляет
подпрограммами
(т. е. процедурами
и функциями)
и выполняет
задание А или
Б в зависимости
от выбора
пользователя
из меню программы.
Можно также
выйти из программы
без выведения
на экран результатов.
Второе
условие – это
условие оператора
FOR,
которое является
скрытым условием.
Оператор проверяет,
все ли элементы
массивов заполнены.
6.
Исходный текст
программы.
program lab6v13;
uses crt;
const
m1=20;
n1=20;
m2=100;
n2=100;
var
kl,cycle00,cycle01,null_el_a,null_el_b:integer;
a:array [0..n1,0..m1]
of real;
b:array
[0..m1,0..n1] of real;
x:array [0..n2] of
real;
y:array [0..m2] of
real;
mid_x,mid_y,sum_x,sum_y,delt_x,delt_y:real;
label
exitprogr,funct,startprg;
procedure labproc_q_a;
begin
null_el_a:=0;
null_el_b:=0;
for cycle00:=0 to n1
do begin
for cycle01:=0 to m1
do begin
a[cycle00,cycle01]:=int(random(40));
if
a[cycle00,cycle01]=0 then null_el_a:=null_el_a+1;
b[cycle01,cycle00]:=int(random(50));
if
b[cycle01,cycle00]=0 then null_el_b:=null_el_b+1;
end;
end;
window (1,5,75,7);
gotoxy (2,6);
write
('Количество
нулей
в
матрице
А:
',null_el_a:3);
clreol;
writeln (' ');
gotoxy (3,7);
write ('Количество
нулей в матрице
Б: ',null_el_b:3);
clreol;
end;
function
mid_delt(mid_x,mid_y,delt_x,delt_y:real):real;
begin
sum_x:=0;
sum_y:=0;
for cycle00:=0 to m2
do begin
for cycle01:=0 to n2
do begin
x[cycle01]:=int(random(100));
y[cycle00]:=int(random(200));
sum_x:=sum_x+x[cycle01];
sum_y:=sum_y+y[cycle00];
end;
end;
mid_x:=sum_x/n2;
mid_y:=sum_y/m2;
delt_x:=mid_x/mid_y;
delt_y:=mid_y/mid_x;
end;
function menu:byte;
var
str1,str2,str3:string[9];kl:byte;key:char;
begin
str1:='ФУНКЦИЯ';str2:='ПРОЦЕДУРА';str3:='ВЫХОД';
window(25,24,55,24);
textcolor(15);gotoxy(13,1);write(str2);
textcolor(15);gotoxy(25,1);write(str3);
textcolor(14);gotoxy(3,1);write(str1);kl:=1;
repeat
key:=readkey;
case key of
#75: begin
if kl=2 then begin
kl:=1;
textcolor(15);gotoxy(13,1);write(str2);
textcolor(14);gotoxy(3,1);write(str1);
end;
if kl=3 then begin
kl:=2;
textcolor(15);gotoxy(25,1);write(str3);
textcolor(14);gotoxy(13,1);write(str2);
end;
end;
#77: begin
if kl=2 then begin
kl:=3;
textcolor(15);gotoxy(13,1);write(str2);
textcolor(14);gotoxy(25,1);write(str3);
end;
if kl=1 then begin
kl:=2;
textcolor(15);gotoxy(3,1);write(str1);
textcolor(14);gotoxy(13,1);write(str2);
end;
end;
end;
until key=#13;
menu:=kl;
end;
begin
gotoxy (1,1);
write ('Лабораторная
работа - 6, вариант
- 13.');
startprg:
kl:=menu;
textcolor(15);
if kl=3 then goto
exitprogr;
if kl=2 then
labproc_q_a;
if kl=1 then goto
funct;
goto startprg;
funct:
window
(1,5,75,7);clrscr;
gotoxy (3,6);
write ('Средние
значения массивов
X и Y и их отклонения
равны: ',mid_x:3:3,'; ',mid_y:3:3,';
',delt_x:3:3,'; ',delt_y:3:3);
clreol;
goto startprg;
exitprogr:
clrscr;
end.
7.
Входные и выходные
данные.
Входные
данные формируются
посредством
генератора
случайных чисел
и вносятся в
программные
массивы данных
машиной самостоятельно.
Это сделано
для упрощения
алгоритма
программы, в
ущерб вводу
данных с клавиатуры.
Причём в заданиях
заносятся в
массивы целочисленные
данные. Это с
деланно, в частности,
для задания
А с целью увеличения
количества
нулей в матрицах.
Выводные данные
в задании А
представляют
собой целые
числа, так как
они представляют
собой количество
нулей, а в задании
Б – действительные
числа.
Лабораторная
работа №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;
|