¨ значение S1 выводится на экран - Writeln(s1);
¨ выводится на экран полученное значение Х1 - Writeln(x1);
¨ и новое приглашение - Writeln(Inv1) (‘Повторите ввод’).
¨ Функция F принимает значение FALSE и управление по EXIT передается в главную программу.
Далее описана процедура ввода исходного значения переменной А с проверкой на область допустимых значений. Имя процедуры - Input. В заголовке описаны формальные параметры A:integer и inv:string (имя переменной). В теле процедуры используются локальные переменные al:real и s1:string, в поле описания меток определена метка L.
Алгоритм выполнения процедуры Input
1. На экран сообщаем о вводе переменной А - Write(‘Введите значение ’+ inv,'===>'). При выполнении этого оператора на экране появляется сообщение: Введите значение А===>.
2. Вводим с клавиатуры ее значение - READLN(aL).
3. Проверяем входит ли это значение в допустимый диапазон:
¨ если да, то A:=TRUNC(aL),
¨ если нет , то переменная s1получает значение s1:=inv5+inv4
(‘Вводимое значение выходит за диапазон [-32768...32767]!!!’).
¨ На экран выводится значение inv1 (‘Повторите ввод’).
¨ Управление передается на метку L для повторного ввода значения А.
Эта процедура может быть использована для ввода и контроля диапазона любой целочисленной переменной типа INTEGER.
Описание главной программы
1. В цикле REPEAT ... UNTIL очищается экран (ClrScr), выводится на экран вид исходного задания, через процедуру INPUT вводятся переменные a и b, через функцию F вычисляется искомое значение x.
¨ Если значение функции F равно False, управление передается на метку L1 для повторного ввода переменных а и b .
¨ Если значение функции F равно TRUE, - выводится результат (переменная х).
2. На экране появляется ‘Опять? (Y/N)’.
3. Переменной ch:=ReadKey и в зависимости от ответа управление передается на начало цикла (ch:=’Y’) или программа заканчивает выполнение (ch:= ‘N’).
пример выполнения контрольной работы № 3
ЛИСТИНГ ПРОГРАММЫ Work3.pas
program Work3;
{$N+,E+}
{ Вариант 60 - элементы массива типа LONGINT.
Найти сумму первых K отрицательных элементов массива A.
}
Uses CRT;
Const NN=20; {Максимальная длина вектора}
invN=' N';
invK=' K';
inv1='Повторите ввод';
inv4='выходит за диапазон [-2147483648..2147483647]!!!!';
inv5='Вводимое значение ';
Type ArrayA=Array [1..NN] of LongInt;
Var k,N:integer;
A:ArrayA;
ch:char;
{Ввод значения N, 1<=N<=NN}
Procedure Input(inv:String; NN:Integer; Var N:integer);
Begin
Repeat
Write('Введите значение'+inv,'=====>');
Readln(N);
Until (N<=NN) and (N>=1);
End;
{Ввод N значений компонент вектора A[i], -2147483648<=A[i]<= 2147483647}
Procedure InputVector(N:integer;Var A:arrayA);
Label L;
Var i :integer;
Ra:Real;
s1:String;
Begin
for i:=1 to N do
Begin
L:
Write('Введите значение элемента вектора A[',i,']=====>');
Readln(Ra);
if (Ra>=-2147483648.0)and(Ra<=2147483647.0) then A[i]:=trunc(Ra)
else
Begin
s1:=inv5+inv4;
Writeln(s1);
Writeln(inv1);
goto L;
End
End;
End;
{Вывод значений компонент вектора A построчно}
Procedure OutputVector(N:integer; A:arrayA);
Var i :integer;
Begin
Writeln(' ------- Исходный вектор -------');
for i:=1 to N do
Write(A[i]:11,' ');
Writeln;
End;
{Нахождение суммы первых K отрицательных элементов массива A длиной N}
Function Summa(k,N:Integer; A:ArrayA):Extended;
Var i,Kk:integer;
S:Extended;
Begin
Kk:=1; {Счетчик отрицательных элементов массива}
S:=0;
for i:=1 to N do
if (A[i]<0) and (Kk<=k) then
Begin
S:=S+A[i];
Kk:=Kk+1
End;
Summa:=S
End;
{Главная программа}
begin
Repeat
ClrScr;
Input(invN,NN,N); {ввод конкретной длины массива N<=NN }
{ввод числа считаемых отрицательных элементов массива K<=N}
Input(invK,N,K);
InputVector(N,A);
OutputVector(N,A);
Writeln('Сумма первых K отрицательных элементов массива A=',
Summa(k,N,A):15:0);
Writeln('Повторить? (y/n)');
ch:=ReadKey;
Until (ch='n') or (ch='N');
end.
Для получения результата в контрольной работе №3 (вариант 60) необходимо ввести фактическое значение длины массива N (1<=N<=NN), значение числа считаемых отрицательных элементов массива К (K<=N) и значения элементов исходного массива A[i], i=1,...,N (с проверкой на диапазон LONGINT).
Имя программы - WORK3.
· В фигурные скобки включены директивы компилятора (см. Прил. 8 ) для обработки вещественной суммы типа EXTENDED:
¨ $N+ - использовать числовой сопроцессор (реализовать операции с плавающей точкой аппаратно);
¨ $E+ -включить режим программной эмуляции сопроцессора.
· В поле описания библиотек, констант и переменных заданы стандартный модуль CRT, определены константы: NN, invN, invK, inv1, inv4, inv5.
· Описан собственный тип данных ArrayA для описания массива длиной NN, элементы которого имеют тип LongInt, - Type ArrayA=Array[1..NN] of Longint;
· Описаны переменные k, N:Integer и массив A:ArrayA; задана символьная переменная ch.
· Далее идут описания процедур Input, InputVector, OutputVector, и функции Summa.
· Записана главная программа, которая вызывает нужные процедуры и функции, согласно алгоритму решения задачи.
Описание процедуры Input
¨ В заголовке процедуры описаны формальные переменные:
входные: inv, NN (значения которых передаются из основной программы);
выходное N (значение определяется в процедуре и передается в основную про грамму).
¨ В цикле Repeat ...Until (N<=NN) and (N>=1) вводится значение переменной N - Readln(N) с проверкой (т.е. вводимое N должно быть больше либо равно единице и меньше либо равно NN - заданному по условию задания значению размера массива). Затем управление передается в основную программу.
Описание процедуры InputVector
¨ В заголовке процедуры описаны параметры:
N, передаваемый из основной программы;
A - массив вводимых элементов матрицы.
¨ Описаны локальные переменные:
i : integer- параметр цикла for;
Ra : Real - рабочая переменная (вводимый элемент массива);
s1 : String - строка, формируемая для аварийного вывода.
¨ В цикле for вводятся значения элемента матрицы через рабочую переменную Ra и проверяются на допустимые значения (в данном случае взяты пределы изменения для переменных типа longint).
¨ Если вводимое значение удовлетворяет заданному условию, то элементам матрицы присваивается значение A[i]:=trunc(ra).
¨ Иначе
1) строковой переменной присваивается значение s1:=inv5+inv4;
(‘вводимые значения выходят за диапазон [- 147483648...2147483647]!!!!!!’).
2) это сообщение выводится на экран;
3) также на экран выводится сообщение «Повторите ввод»;
4) управление передается на метку L и снова вводим значения элементов матрицы с проверкой на допустимые значения.
¨ Управление передается в основную программу, когда закончится цикл for .
Описание процедуры OutputVector
¨ В заголовке процедуры описаны параметры: N, передаваемый из основной программы; A - массив выводимых элементов матрицы.
¨ Описана локальная переменная i : integer- параметр цикла for.
¨ В процедуре в цикле for выводятся значения элементов массива А. В операторе вывода Write(A[i]:11,’ ’) задан формат для выводимого элемента массива: A[i]:11, который показывает, что для вывода значения элемента массива А отводится 11 позиций.
¨ Затем управление передается основной программе.
Описание функции Summa
¨ В заголовке функции описаны параметры: k - число считываемых отрицательных элементов массива к<=N; N - размерность массива, А - массив элементов. Функция Summa описана, как Extended.
¨ В теле функции задается счетчик отрицательных элементов массива Кк, ему присваивается начальное значение 1 ( Kk:=1). Начальное значение суммы равно 0 (s:=0).
¨ В цикле for от единицы до N считается сумма первых K отрицательных элементов массива:
1) проверяется A[i]<0 (отрицательное число) и одновременно проверяется значение счетчика Кк<=K (не превышает числа считываемых отрицательных элементов массива K);
2) S:=S+A[i];
3) счетчик отрицательных чисел увеличивается на единицу Кк:=Кк+1.
¨ После окончания цикла функции Summa присваивается значение полученной суммы всех отрицательных чисел - Summa:=S.
¨ Управление передается в основную программу.
Описание главной программы
1. В теле основной программы в цикле Repeat ... Until очищается экран (ClrScr).
2. Производится решение задачи для одного комплекта входных данных N, K, A:
¨ Через вызов процедуры Input(invN,NN,N) осуществляется ввод длины массива N<=NN (переменные invN, NN являются входными, переменная N - результат работы процедуры).
¨ Через эту же процедуру Input(invK,N,K) осуществляет ввод числа считываемых отрицательных элементов массива К<=N (переменные invК, N передаются из основной программы в процедуру, значение переменной K возвращается из процедуры в основную программу).
¨ Процедура InputVector(N,A) осуществляет ввод элементов массива А (значение переменной N передается из основной программы, значение элементов массива А передается из процедуры).
¨ Процедура OutputVector(N,A) осуществляет вывод элементов массива А ( значение переменной N и значения элементов массива А передаются из основной программы).
¨ Выводится значение суммы через функцию Summa(k,N,A) (значение параметров К, N, A передается из основной программы);
¨ На экране появляется сообщение «Опять? (Y/N)».