Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Оператор цикла с предусловием




While <условие>Do <тело цикла>;

 

Выполнение оператора цикла с предусловием начинается с проверки условия, записанного после слова While. Если оно соблюдается, то выполняется <тело цикла>, затем вновь проверяется условие и т.д. Как только при очередной проверке окажется, что условие не соблюдается, <тело цикла> выполняться не будет.

Примечание

1. Если <тело цикла> состоит из нескольких операторов, то они объединяются операторными скобками.

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

Пример 1

Подсчитать количество цифр заданного натурального числа n.

Решение

Подсчет количества цифр начнем с последней цифры числа. На очередном шаге цикла увеличим счетчик цифр на единицу, а число уменьшим в 10 раз (тем самым мы избавляемся от последней цифры числа). Далее с получившимся числом проделаем ту же последовательность действий и т.д., пока число не станет равным нулю.

Program Example_43;

Var m, n: Longint;

k: Integer; {счетчик цифр}

Begin

Writeln('Введите натуральное число');

{вводим натуральное число n>0}

Readln(n);

m:=n; k:=0;

While m<>0 Do

{пока (While) число m<>0 делать (Do)}

Begin

Inc(k); {k:=k+1;}

m:=m div 10;

{"выбрасываем" из числа последнюю цифру}

 End;

Writeln('В числе ',n,' - ' ,

 k,' цифр');

{вывод количества цифр}

Readln;

End.

Пример 2

Дана непустая последовательность натуральных чисел, за которой следует 0. Найти порядковый номер наименьшего элемента последовательности.

Решение

Обозначим через х и i очередной элемент последовательности и его номер; min и k − минимальный элемент последовательности и его номер. Считывание элементов последовательности производится до тех пор, пока не будет введен 0, то есть пока х<>0. Начальное значение минимума определяется значением первого элемента последовательности. Очередное вводимое число (очередной элемент последовательности) требуется сравнивать с текущим значением минимума, и если текущее значение min окажется больше очередного элемента последовательности, то min нужно изменить, а номер очередного элемента последовательности − запомнить. Учитывая вышесказанное, составим программу:

Program Example_44;

Var x, i, min, k: Integer;

Begin

Writeln('Введите первый элемент

последовательности');

Read(x); k:=1;

min:=x; i:=2;

While x<>0 Do

Begin

If x<min Then

Begin min:=x; k:=i-1End;

Writeln('Введите ', i , 'элемент

последовательности');

Read(x);

Inc(i);

End;

Writeln('Номер минимального

элемента - ', k);

End.

Пример 3

Напечатать таблицу значений функции sin x на отрезке [0,1] с шагом 0,1 (каждое вещественное число вывести в четырех позициях на отдельной строке).

Решение

Для перебора всех значений из отрезка с некоторым шагом проще всего использовать цикл с параметром. Но нам требуется перебирать вещественные числа, а параметр цикла не может быть вещественным. Поэтому придется использовать цикл While.

Сравните два решения этой задачи, представленные ниже.

Program Example_45;

Var i: Real;

Begin

i:=0;

While i<=1 Do

Begin

Writeln(i: 2: 1,' ', sin(i): 4: 3);

i:=i+0.1;

End;

Readln;

End.

 

Program Example_46;

Var i: Integer;

Begin

i:=0;

While i<=10 Do

Begin

Writeln(i,' ',sin(i/10):4:3);

Inc(i);

End;

Readin;

End.

На первый взгляд эти программы должны работать одинаково, но, запустив их, мы обнаружим, что первая программа выдает значения функции для всех значений х от 0 до 0,9, а вторая программа − для всех значений х от 0 до 1. Это происходит из-за приближенного представления вещественного числа - последнее значение получается чуть больше 1.

Как вы знаете, вся информация представляется в памяти ЭВМ в виде 0 и 1. Для хранения переменной типа Real в памяти ЭВМ отводится 48 бит (6 байт). При решении задач следует избегать использования циклов, в условиях которых используются вещественные переменные.

Цикл с постусловием

 

Для программной реализации циклических алгоритмов с неизвестным заранее числом повторений имеется еще один оператор − оператор цикла с постусловием, который имеет следующий вид:

Оператор цикла с постуславием

Repeat (повторять}

<оператор 1>;

<оператор 2>;

……………

<оператор n>;

Until{до тех пор, пока не} <условие>;

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

Обратите внимание на то, что данный оператор цикла предполагает наличие нескольких операторов в теле цикла, поэтому служебные словаBeginиEnd не нужны.

Последовательность операторов, входящих в тело цикла, выполняется один раз, после чего проверяется соблюдение условия, записанного следом за служебным словом Until. Если условие соблюдается, цикл завершается. В противном случае тело цикла выполняется еще раз, после чего снова проверяется соблюдение условия.

С помощью процедуры KeyPressed модуля CRT и цикла с постусловием можно организовать ожидание нажатия любой клавиши:

Repeat Until KeyPressed.

 

Пример 1

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

Решение

Обозначим через х и k цену и количество товара, через р − заданную предельную сумму, через s − стоимость покупки. Начальное значение общей стоимости покупки s равно нулю. Значение предельной суммы считывается с клавиатуры. Необходимо повторять запрос цены и количества выбранного товара, вычислять его стоимость, суммировать ее с общей стоимостью и выводить результат на экран до тех пор, пока стоимость не превысит предельной суммы р.

 

Program Example_47;

Var x, k, p, s: Integer;

Begin

Writeln('Предельная сумма');

Readln(p);

s:=0;

Repeat

Writeln('Введите цену товара и его

 количество');

Readln(x, k);

s:=s+x*k;

Writeln('Стоимость покупки равна ',s);

Until s>p;

Writeln('Суммарная стоимость покупки

превысила предельную сумму');

End.

 

Пример 2

Дано х, принадлежащее интервалу от -1 до 1. Составить программу вычисления частичной суммы ряда х-(х2/2)+(х3/3-… с заданной точностью е. Нужная точность считается полученной, если очередное слагаемое оказалось по модулю меньше, чем е (это и все последующие слагаемые учитывать не надо).

Program Example_48;

Var x, st, sl, у, e: Real;

n, z: Integer;

Begin

Write('Введите х, принадлежащее

(-1,1)');

Readln(х);

Write('Введите погрешность

вычисления ');

Readln(е);

у:=0; n:=1; z:=1; st:=x; sl:=x;

Repeat

Inc(y, z*sl); Inc (n); z:=-z;

st:=st*x; sl:=st/n;

Until sl<e;

Writeln(y);

Readln;

End.

 

Алгоритм Евклида

Алгоритм Евклида - это алгоритм нахождения наибольшего общего делителя (НОД) двух целых неотрицательных чисел.

Пусть х и y - одновременно не равные нулю целые неотрицательные числа, и пусть x>y. Если y=0, то НОД(х, у)=х, а если y¹0, то для чисел х, y и r, где r − остаток от деления x на y, выполняется равенство НОД(х,y)=НОД(x,r).

Например, пусть х=48, а у=18.

НОД(48,18)=НОД(18,12)=НОД(12,6)=

НОД(6,0)=6.

Пример 1

Написать программу нахождения наибольшего общего делителя двух неотрицательных чисел.

Решение

Для решения данной задачи воспользуемся циклом с постусловием:

Program Example_49;

Var x, у: Integer;

Begin

Writeln('Введите два числа');

Readln(х,у);

Repeat {выполнять}

If x>y Then x:=x mod у Else y:=y mod х;

Until (x=0) or (y=0);

{до тех пор, пока одно из чисел не

 станет равно нулю}

Writeln('НОД=', х+у); {вывод НОД.

Одно из чисел обязательно равно нулю}

Readln;

End.

Пример 2

Даны натуральные числа х и у, не равные нулю одновременно. Найти d=НОД(х, у) и такие целые qи w, что d=q*x+w*y.

Решение

Введем переменные р, q, r, s, m и n, такие, что m=p*a+q*b, n=r*a+s*b. Первоначально m=a=x, n=b=y.

Program Example_50;

Var x, y: Integer; {исходные данные}

p, q, r, s, m, n: Integer;

{введенные вспомогательные переменные}

к: Integer;

{для изменения значений P, q, r, s}

d: Integer;

{значение наибольшего общего делителя}

Begin

Read(x, у);

m:=x; n:=y; р:=1; q:=0; r:=0; s:=1;

Repeat

If m>n Then

Begin

k:=m div n; m:=m mod n;

p:=p-k*r; q:=q-k*s

End

Else Begin

k:=n div m; n:=n mod m; r:=r-k*p;

s:=s-k*q;

End;

Until (m=0) or (n=0);

If m=0 ThenBegin d:=n; q:=r; w:=s;End

ElseBegin d:=m; q:=p; w:=q;End;

Writeln(d, '=',q,'*',x,'+',w,'*',y);

End.

Значения переменных p, q, r, s изменяются следующим образом:

• как только значение переменной m уменьшается на k*n, значение р уменьшается на k*r, а q уменьшается на k*s;

• аналогично, как только значение n уменьшается на k*m, значения переменных r и s уменьшаются соответственно на k*p и на k*q.

 

Вложенные циклы

 

Пример 1

Даны натуральные числа n и k. Составить программу вычисления выражения 1k+2k+…+nk.

Решение

Для вычисления указанной суммы целесообразно организовать цикл с параметром i, в котором, во-первых, находилось бы значение очередного члена ряда (у:=ik) и, во−вторых, осуществлялось бы накопление искомой суммы путем прибавления полученного слагаемого к сумме всех предшествующих (s:=s+y).

 

Program Example_51;

Var n, k, у, i, s, m: Integer;

Begin

Writeln('Введите n и k ');

Readln(n,k);

s:=0;

For i:=1 To n Do

Begin

y:=1;

For m:=1 To k Do y:=y*i;

{нахождение степени k числа i}

s:=s+y;

End;

Writeln('Ответ: ',s);

End.

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

 

Пример 2

Написать программу, которая находит и выводит на печать все четырехзначные числа abcd, где а, b, с, d − различные цифры, для которых выполняется соотношение: ab-cd=a+b+c+d.

Решение

Задачу можно решать несколькими способами. Можно просто перебрать все четырехзначные числа и для каждого проверять соблюдение условий. Попробуем сократить перебор, для этого преобразуем второе условие:

аb-cd=а+b+с+d;

10a+b-(10c+d)=a+b+c+d;

9(a-c)=2(c+d);

a-c/(c+d)=2/9

Учитывая первое условие (a, b, с, d − различные цифры), получаем, что a=с+2, d=9-с и 0≤с≤7.

 

Program Example_52;

Var a, b, с, d: Integer;

Begin

For c:=0 To 7 Do

Begin

a:=c+2; d:=9-c;

For b:=0 To 9 Do

If (b<>c) and (b<>a) and (b<>d)

Then Write(a, b, c, d,' ');

Writeln

End;

End.

Таким образом, мы решили задачу, значительно сократив перебор.

 

Пример 3

Модифицировать пример 1 так, чтобы в ней вычислялась сумма 11+22+…+nn

Решение

Данная задача отличается от предыдущей тем, что показатель степени очередного слагаемого совпадает со значением ее основания, следовательно, верхняя граница внутреннего цикла (в котором вычисляется очередное слагаемое) определяется значением счетчика внешнего цикла.

 

Program Example_53;

Var n, у, i, s, m: Integer;

Begin

Writeln('Введите значение n');

Readln(n);

s:=0;

For i:=1 To n Do

Begin

y:=1;

For m:=1 To i Do y:=y*i;

{нахождение степени k числа i}

s:=s+y;

End;

Writeln('Ответ: ',s);

End.

Пример 4

 

Cтаринная задача. Cколько можно купить быков, коров и телят, если плата за быка − 10 рублей, за корову − 5 рублей, за теленка − полтинник (0,5 рубля) и на 100 рублей надо купить 100 голов скота?

Решение

Обозначим через b количество быков; k − количество коров; t − количество телят. После этого можно записать два уравнения: 10b+5k+0.5t=100 и b+k+t=100. Преобразуем их: 20b+10k+t=200 и b+k+t=100.

На 100 рублей можно купить:

• не более 10 быков, т.е. 0≤b≤10;

• не более 20 коров, т.е. 0≤k≤<20;

• не более 200 телят, т.е. 0≤t≤200. Таким образом, получаем:

Program Example_54;

Var b, k, t: Integer;

Begin

For b:=0 To 10 Do

For k:=0 To 20 Do

For t:=0 To 200 Do

If (20*b+10*k+t=200) and (b+k+t=100)

Then Writeln('быков ',b,' коров ',

k,' телят ',t);

End.

Значение переменной b изменяется 11 раз (от 0 до 10), для каждого ее значения переменная k изменяется 21 раз, а для каждого значения переменной k переменная t изменяется 201 раз. Таким образом, условие будет проверяться 11х21х201 раз. Но если известно количество быков и коров, то количество телят можно вычислить по формуле t=100-(b+k) − и цикл по переменной t исключается.

Program Example_55;

Var b, k, t: Integer;

Begin

For b:=0 To 10 Do

For k:=0 To 20 Do

Begin

t:=100-(b+k);

If (20*b+10*k+t=200) Then

Writeln('быков ',b,' коров ',

k,' телят ',t);

End;

End.

При этом решении условие проверяется 11х21 раз.

Пример 5

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

 

Program Example_56;

var k, a, b: integer;

begin

k:=0;

for a:=1 to 100 do

for b:=1 to 100 do

   begin

      if a+b=a*b then

         begin

           k:=k+1;

           writeln('Искомая пара

чисел: ',a, ' и ', b);

         end;

      end;

if k=0 then writeln('Таких чисел нет');

end.

 










Последнее изменение этой страницы: 2018-05-31; просмотров: 175.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...