Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование. Методичка по лабам..doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
526.34 Кб
Скачать

2.1.3. Контрольные вопросы и задания

1) Какие операторы реализуют развилку в языке Паскаль?

2) Какую конструкцию следует добавить, чтобы при выполнении (невыполнении) условия выполнялись несколько операторов?

3) Как реализовать вложенную развилку?

2.2. Лабораторная работа 2. Циклический вычислительный процесс

Цель работы – приобретение навыков:

  • проектирования циклических алгоритмов;

  • применения операторов цикла;

  • отладки и тестирования программ.

2.2.1. Теоретические сведения, необходимые для выполнения работы

Для программирования циклических алгоритмов используются операторы цикла. Каждой базовой циклической конструкции в языке Паскаль соответствует свой оператор цикла.

Оператор цикла с постусловием (Repeat). В данном операторе оператор(ы) тела цикла располагаются между ключевыми словами Repeat и Until :

Repeat

операторы тела цикла

Until выражение;

О

Рис. 4. Цикл Repeat

ператор Repeat (рис. 4) задает повторяющееся выполнение операторов нтела цикла. После каждого выполнения тела цикла производится проверка значения булевского выражения, которое служит критерием повторения: пока результат выражения не примет значе-

ние True, тело цикла продолжает выполняться. Цикл завершается, как только значение выражения станет True. Последовательность операторов выполнится по крайней мере один раз.

Пример 1. Применение оператора цикла Repeat в программе ввода с контролем значения действительной переменной:

Program inprealkont;

{ввод real с контролем в интервале [n1,n2]}

const n1=-300; n2=5000;

Var p:real; { вводимая переменная }

f:integer; { рабочая переменная }

begin

repeat

{$I-} readln(p); f:=IOResult; {$I+}

if (f<>0)or(p<n1)or(p>n2) then

writeln(' недопустимое число! ');

until (f=0)and(p>=n1)and(p<=n2);

writeln('p=',p);

end.

Цикл ввода переменной P будет повторяться до тех пор, пока не будет введено правильное значение.

О ператор цикла с предусловием (While). Оператор цикла с предусловием начинается ключевым словом While и содержит выражение-условие, которое управляет повторным выполнением тела цикла. Общий вид оператора

While выражение L do оператор S.

П

Рис. 5. Цикл While

еред каждым выполнением тела цикла происходит вычисление значения булевского выражения (рис. 5). Если это выражение принимает значение Тruе, то оператор тела цикла выполнится повторно. В противном случае (значение выраже- ния False) выполнение цикла завершается. Если выражение с самого начала принимает значение False, то цикл с предусловием не выполнится ни разу.

Оператор While действует только на один оператор, поэтому если тело цикла состоит из нескольких операторов, то следует их заключить в операторные скобки, то есть применить составной оператор.

Пример 2. Применение оператора While для печати таблицы значений y=sinx на интервале [a,b] с шагом h :

Program Table_While;

VAR a,b,h, X,y:real;

BEGIN

Writeln('Введите A, B, H ');

readln(a,b,h);

Writeln(' x y=sinx ')

x:=a; { инициализация x }

WHILE x<b do

begin {начало тела цикла }

y:=sin(x);

Writeln(x:5:1,y:8:5);

x:=x+h; {модификация x}

end; { конец тела цикла }

End.

Переменной x до начала цикла присваивается значение a. Пока выражение x < b имеет значение TRUE, будут выполняться операторы тела цикла. При a = 0, b = 1, h = 0.2 параметр цикла x примет значения 0, 0.2, 0.4, 0.6, 0.8, 1, то есть цикл выполнится 6 раз.

Оператор цикла FOR с параметром.

Если число повторений цикла заранее известно и параметр цикла меняется по закону арифметической прогрессии с шагом, равным  1, то подходящей конструкцией является оператор For.

Оператор For имеет два вида записи:

For x := x1 to x2 do оператор;

For x := x1 downto x2 do оператор;

Использованы обозначения: x – параметр, или счетчик цикла, x1 и x2 – исходное и конечное значения параметра.

Параметр цикла должен иметь порядковый тип: char, boolean, целые типы. Начальное и конечное значения вычисляются до начала цикла и сохраняются на все время выполнения оператора For. Перед началом цикла параметру X присваивается начальное значение х1. После каждого выполнения операторов тела цикла значение параметра автоматически меняется на 1: если использовано ключевое слово to и x1 <= x2, параметр увеличивается, если использовано слово downto и x1 >= x2, параметр цикла уменьшается.

Пример 3. Демонстрация работы оператора For:

For x:=1 TO 5 do Write(x:5);

writeln;

For x:=5 DOWNTO 1 do write(x:5);

readln;

На экран будут выведены вначале значения X : 1 2 3 4 5

Затем эти же числа по убыванию : 5 4 3 2 1

Пример 4. Применение оператора цикла FOR для печати таблицы:

Program Table_for;

Var

A,b,h, X,Y :real;

I, n:integer;

BEGIN

Writeln('Введите A, B, H '); readln(a,b,h);

N:=round((b-a)/h);

Writeln(' x y=sinx ')

For i:=0 to n do

begin {начало тела цикла }

x:=a+i*h;

y:=sin(x); Writeln(x:5:1,y:8:5);

end; { конец тела цикла }

end.

Пример 5. Для вводимой последовательности целых чисел запрограммировать элементарные схемы вычислений: сумма, среднее арифметическое, произведение. Все вычисления выполняются при вводе, без запоминания последовательности.

program Shems_3;

Var

i,sum,prod,n:integer;

Begin

writeln('Вычисление суммы, среднего арифметического и произведения

');

writeln('целых чисел из входной последовательности');

writeln('вводите по одному числу, последовательность завершите

нулем');

readln(i);

if i=0 then begin

writeln('пустая последовательность');

readln; Halt

end;

sum:=0; n:=0; prod:=1;

while i<>0 do

begin

sum:=sum+i; {к сумме прибавляется очередное слагаемое}

prod:=prod*i; {произведение умножается на очередной множитель}

n:=n+1; {счетчик увеличивается на 1}

readln(i) {чтение следующего числа}

end; {конец ввода чисел}

writeln('сумма равна ', sum);

writeln('среднее арифметическое равно ', sum/n:10:5);

writeln('произведение равно ',prod);

readln;

end.

В наборе тестов для данного примера должно быть по крайней мере три теста:

а) входной поток состоит из одного числа, равного 0,

ожидаемый ответ: 'пустая последовательность';

б) входной поток состоит из двух чисел: 1 0,

ожидаемые ответы: 1 1.00000 1;

в) входной поток состоит из четырех чисел: 1 2 3 0,

ожидаемые ответы: 6 2.00000 6 1.

Пример 6. Логической переменной P присвоить значение TRUE, если целое N (n>1) простое число, и значение False в противном случае.

{ У составного числа N обязательно есть делитель K из отрезка [2,n ], он и ищется }

Program Simple_n;

Var

K,n: integer;

P:boolean;

Begin

Writeln('введите N>1'); readln(n);

P:=true; k:=2;

While p and (k*k<=n) do

If n mod k=0 then p:=false else k:=k+1;

Writeln('число ',n,' простое?',p );

Readln;

End.

В наборе тестов для данного примера должно быть, по крайней мере, одно простое и одно составное. Среди четных чисел единственное простое число 2 должно обязательно входить в набор тестов, затем любое четное число как составное. Среди нечетных чисел взять хотя бы два простых числа и составное. Окончательный набор тестов мог бы выглядеть следующим образом:

a) n = 2 – простое, б) n = 3 – простое, в) n = 6 – составное, г) n = 11 – простое, д) n = 99 – составное.

Пример 7. Найти наибольший общий делитель и наименьшее общее кратное двух заданных натуральных чисел X и Y.

program nod_nok;

var

x,y,u,v:longint;

d,nod:longint;

begin

write('X=');readln(x);

write('y=');readln(y);

u:=x; v:=y;

repeat

writeln('u=',u,' v=',v);

d:=u mod v; {остаток от деления u/v}

u:=v;

v:=d;

until v=0;

nod:=u;

writeln('nod=',nod);

writeln('NOK=',x*y div nod);

readln;

end.

В наборе тестов для данного примера должны быть следующие тесты:

a) числа X и Y равны между собой;

б) Y кратно X;

в) X кратно Y;

г) X и Y не кратны и не имеют общих множителей;

е) X и Y не кратны, но имеют общие множители.

Пример 8. Подсчитать количество цифр в десятичной записи целого неотрицательного числа N.

program Count_number;

var

n, r:longint;

k: byte;

begin

repeat

write('Введите целое неотрицательное число n ');readln(n);

until n>=0;

r:=n; k:=0;

repeat

r:=r div 10; { убираем младшую цифру в записи числа }

k:=k+1;

until r=0;

write('количество цифр в десятичной записи числа ', n);

writeln(' равно ',k);

end.

Набор тестов для данного примера может выглядеть следующим образом:

а) число n = 0 ->'количество цифр в десятичной записи равно 1';

б) число n = 1 ->'количество цифр в десятичной записи равно 1';

в) число n = 12090 ->'количество цифр в десятичной записи равно 5'.