Лабораторная №6 вариант №13 по информатике, выполненная с использованием подпрограмм-процедур и подпрограмм-функций
1. Цель работы.
Целью работы является написание программы на языке программирования «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 |
Определить периметры энугольников, координатами их вершин заданы в массивах X, Y. |
Длину стороны энугольников вычислять в подпрограмме |
4 |
Подсчитать число точек, находящихся внутри круга радиусом r с центром в точке с координатами (1,1); координаты заданы массивами X(80), Y(80) |
Расстояние точки от центра круга определять в подпрограмме |
5 |
Вычислить z=(v>1>+v>2>+v>3>)/3 , где v>1> ,v>2>,v>3>, - объёмы шаров с радиусами r>1> , r>2> и r>3> соответственно |
V>i> вычислять в подпрограмме |
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<=x>ij><=1 и 0<=y>ij><=1 |
|
9 |
Вычислить суммы положительных элементов каждой строки для матриц A(10,12) и B(15,10) |
|
10 |
Вычислить z=(x>m>>1>+x>m>>2>)/2 , где x>m>>1> и x>m>>2> – наименьшие элементы массивов X1(70), X2(80) |
|
11 |
Вычислить суммы элементов главных диагоналей матриц A(N,N) B(M,M) |
M<=20 N<=30 |
12 |
Вычислить z=(s>1>+s>2>)/2, где s>1>- сумма положительных элементов массива X(50); s>2>- сумма отрицательных элементов массива 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 = (s>1>+s>2>)/k>1>k>2> ,где s>1> и k>1> – сумма и количество положительных элементов массива X(N); s>2> и k>2> – сумма и количество положительных элементов массива Y(M). |
M<=100 N<=100 |
2 |
Вычислить z = (es1+es2)/k>1>k>2>, где s>1> и k>1> – сумма и количество положительных элементов массива X(100); s>2> и k>2> – сумма и количество положительных элементов массива Y(80). |
Обе суммы вычислять в одной подпрограмме |
3 |
Вычислить и запомнить суммы положительных элементов каждой строки матицы A(10,20), B(15,10). |
|
4 |
Вычислить z = (x>1>+y>1>)/(x>2>-y>2>), где x>1> и x>2> – корни уравнения 2x2+x-4 = 0, y>1> и y>2> – корни уравнения 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, где x>i> и y>i> – заданы массивами |
Все суммы вычислять в одной подпрограмме |
10 |
Вычислить z = (x>max>-y>min>)/2, где x>max> – максимальный элемент массива X(50); y>min> – минимальный элемент массива Y(40) |
x>max> и y>min> вычислять в одной подпрограмме |
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<RM
используется для нахождения наименьшего.
В подпрограмму необходимо передать массивы координат точек, их размер, а также параметр 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.
Данная конкретная программа в тестировании не нуждается, так как выведенные на печать результаты позволяют однозначно судить о правильности выполнения программы.
Контрольные вопросы
Указать, при каких условиях целесообразно использование подпрограмм, какие выгоды они представляют пользователю.
Указать, в чём отличие различных видов подпрограмм пользователя.
Указать способы обращения к подпрограммам пользователя.
Указать способы передачи параматров в подпрограмму.
Указать, как организовывать подпрограмму без параметров.
Перечислить, как согласуются формальные и фактические параметры.
Указать конструкции, которые могут быть формальными и фактическими параметрами.
Пояснить, как и куда осуществляется выход из подпрограммы.