Цельработы.
Цельюработы являетсянаписаниепрограммы наязыке программирования«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] ofreal;
y:array [0..m2] ofreal;
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 n1do begin
for cycle01:=0 to m1do begin
a[cycle00,cycle01]:=int(random(40));
ifa[cycle00,cycle01]=0 then null_el_a:=null_el_a+1;
b[cycle01,cycle00]:=int(random(50));
ifb[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;
functionmid_delt(mid_x,mid_y,delt_x,delt_y:real):real;
begin
sum_x:=0;
sum_y:=0;
for cycle00:=0 to m2do begin
for cycle01:=0 to n2do 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;
varstr1,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 beginkl:=1;
textcolor(15);gotoxy(13,1);write(str2);
textcolor(14);gotoxy(3,1);write(str1);
end;
if kl=3 then beginkl:=2;
textcolor(15);gotoxy(25,1);write(str3);
textcolor(14);gotoxy(13,1);write(str2);
end;
end;
#77: begin
if kl=2 then beginkl:=3;
textcolor(15);gotoxy(13,1);write(str2);
textcolor(14);gotoxy(25,1);write(str3);
end;
if kl=1 then beginkl:=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 gotoexitprogr;
if kl=2 thenlabproc_q_a;
if kl=1 then gotofunct;
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 |
7 | Вычислитьсреднее арифметическоеположительныхэлементовдля массивовA(N1),B(N2),C(N3) | N1 N3 |
8 | Подсчитатьколичествоэлементовматриц X(10,15)и Y(20,12),удовлетворяющихусловиям 0ijij | |
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 |
12 | Вычислитьz=(s1+s2)/2,где s1-сумма положительныхэлементовмассива X(50);s2-сумма отрицательныхэлементовмассива Y(60) | Обесуммы вычислятьв одной подпрограмме |
13 | Подсчитатьчисло нулевыхэлементовдля матрицA(N,M)и B(M,N) | M |
14 | Вычислитьсуммы элементовнижних треугольныхматриц дляматриц A(15,15)и B(20,20) | |
15 | Определитьчисло положительныхэлементов допервого отрицательногов массивахX(40),Y(50),Z(N) | N |
Задание Б.
Выполнитьна ЭВМ программу,использующуюподпрограмму-процедуру в соответствиис номером, указаннымв таблице.
Проверитьправильностьвыполненияпрограммы спомощью тестовоговарианта .
Вариант Задания | Условиезадачи | Примечания |
1 | Вычислитьz= (s1+s2)/k1k2,где s1и k1– сумма и количествоположительныхэлементовмассива X(N);s2и k2– сумма и количествоположительныхэлементовмассива Y(M). | M |
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 |
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 |
14 | Вычислитьсуммы и количестваэлементов,находящихсяв интервалеот aдо bдля матрицX(10,8)и Y(10,12) | |
15 | Преобразоватьмассивы X(50) и Y(60),расположивв них подрядтолько положительныеэлементы. Вместоостальныхэлементовзаписать нули |
Задание А.
Выполнитьна ЭВМ решениезадачи. Определитьближайшую кначалу координатточку, находящуюсяв верхнейполуплоскости,и наиболееудалённуюточку, лежащуюв нижней полуплоскости.Координатыточек, находящихсяв верхнейполуплоскости, заданы массивамиX1(N)и Y1(N),а лежащие внижней полуплоскости,- массивамиX2(M)и Y2(M),где N
Для каждойточки верхнейполуплоскостиследует определитьрасстояниеот начала координат.Из этих расстоянийнеобходимонайти наименьшее.Такие же действиявыполнить дляточек, находящихсяв нижней полуплоскости,однако найтинаибольшеерасстояниеот начала координат.
Вычислениерасстоянийот начала координати нахождениенаименьшегоили наибольшегоиз них выполнимв подпрограмме-функции.
Использованиеодной подпрограммыдля нахождениянаибольшегои наименьшегозначений потребуетвведениядополнительногопараметра,который необходимдля проверкиусловия 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 В подпрограммедолжна осуществлятьсязапись положительныхэлементовисходногомассива в массиврезультатов. Для этогов подпрограммунеобходимопередать следующиепараметры: имяи количествоэлементовисходногомассива, имяи номер элементас которогодописыватьрезультирующиймассив. Посколькув массив результатов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. Данная конкретнаяпрограмма втестированиине нуждается,так как выведенныена печать результатыпозволяютоднозначносудить о правильностивыполненияпрограммы. Контрольныевопросы Указать, прикаких условияхцелесообразноиспользованиеподпрограмм,какие выгодыони представляютпользователю. Указать, вчём отличиеразличныхвидов подпрограммпользователя. Указатьспособы обращенияк подпрограммампользователя. Указатьспособы передачипараматровв подпрограмму. Указать, какорганизовыватьподпрограммубез параметров. Перечислить,как согласуютсяформальныеи фактическиепараметры. Указатьконструкции,которые могутбыть формальнымии фактическимипараметрами. Пояснить,как и кудаосуществляетсявыход из подпрограммы.
R