Реферат: Лабораторная №6 вариант №13 по информатике, выполненная с использованием подпрограмм-процедур и подпрограмм-функций

Цель работы.


Целью работы является написание программы на языке программирования «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. Изучить:

  • правила записи подпрограмм различных видов и способов обращений к ним;

  • способы передачи параметров в подпрограмму;

  • правила записи программ, использующих подпрограммы.

  1. Разработать алгоритм решения задачи.

  2. Составить программу решения задачи.

  3. Подготовить тестовый вариант программы и исходных данных.


Задание к работе

Задание А.


  1. Выполнить на ЭВМ программу, использующую подпрограмму функцию, в соответствии с номером параметра, указанным в таблице.

  2. Проверить правильность выполнения программы с помощью тестового варианта.


Вариант

Задания

Условия задачи Примечания
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=(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. Выполнить на ЭВМ программу, использующую подпрограмму-процедуру в соответствии с номером, указанным в таблице.

  2. Проверить правильность выполнения программы с помощью тестового варианта .


Вариант

Задания

Условие задачи

Примечания
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.


Данная конкретная программа в тестировании не нуждается, так как выведенные на печать результаты позволяют однозначно судить о правильности выполнения программы.


Контрольные вопросы


  1. Указать, при каких условиях целесообразно использование подпрограмм, какие выгоды они представляют пользователю.

  2. Указать, в чём отличие различных видов подпрограмм пользователя.

  3. Указать способы обращения к подпрограммам пользователя.

  4. Указать способы передачи параматров в подпрограмму.

  5. Указать, как организовывать подпрограмму без параметров.

  6. Перечислить, как согласуются формальные и фактические параметры.

  7. Указать конструкции, которые могут быть формальными и фактическими параметрами.

  8. Пояснить, как и куда осуществляется выход из подпрограммы.