Реферат: Лабораторная №6 вариант №13 по информатике, выполненная с использованием подпрограмм-процедур и подпрограмм-функций
Название: Лабораторная №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 Программирование с использованием подпрограмм пользователя. Цель работы – овладение навыками алгоритмизации задач с использованием подпрограмм пользователя различных видов, овладение навыками написания программ и обращения к ним, выбора параметров подпрограмм.Задание для самостоятельной работы.
Задание к работеЗадание А.
Задание Б.
Пример выполнения работыЗадание А. Выполнить на ЭВМ решение задачи. Определить ближайшую к началу координат точку, находящуюся в верхней полуплоскости, и наиболее удалённую точку, лежащую в нижней полуплоскости. Координаты точек, находящихся в верхней полуплоскости , заданы массивами X1(N) и Y1(N), а лежащие в нижней полуплоскости ,- массивами X2(M) и Y2(M), где N<=40, M<=60. Для каждой точки верхней полуплоскости следует определить расстояние от начала координат. Из этих расстояний необходимо найти наименьшее. Такие же действия выполнить для точек, находящихся в нижней полуплоскости, однако найти наибольшее расстояние от начала координат. Вычисление расстояний от начала координат и нахождение наименьшего или наибольшего из них выполним в подпрограмме-функции.
Использование
одной подпрограммы
для нахождения
наибольшего
и наименьшего
значений потребует
введения
дополнительного
параметра,
который необходим
для проверки
условия K*R>K*RM.
Если K=1,
то условие R>RM
используется
для нахождения
наибольшего;
если K=
-1, то условие
В подпрограмму
необходимо
передать массивы
координат
точек, их размер,
а также параметр
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.
Данная конкретная
программа в
тестировании
не нуждается,
так как выведенные
на печать результаты
позволяют
однозначно
судить о правильности
выполнения
программы.
Контрольные
вопросы
Указать, при
каких условиях
целесообразно
использование
подпрограмм,
какие выгоды
они представляют
пользователю.
Указать, в
чём отличие
различных
видов подпрограмм
пользователя.
Указать
способы обращения
к подпрограммам
пользователя.
Указать
способы передачи
параматров
в подпрограмму.
Указать, как
организовывать
подпрограмму
без параметров.
Перечислить,
как согласуются
формальные
и фактические
параметры.
Указать
конструкции,
которые могут
быть формальными
и фактическими
параметрами.
Пояснить,
как и куда
осуществляется
выход из подпрограммы.
|