Работа с циклами и условными операторами.
Автор материалов - Лада Борисовна Есакова.
В этой задаче используется описание алгоритмов на языках программирования.
Основными используемыми конструкциями являются конструкции ветвления и циклов.
Конструкция ветвления в языке Паскаль
Полная
|
Неполная
|
if <логическое выражение> then
<оператор1>
else <оператор2>;
|
if <логическое выражение> then
<оператор1>;
|
При этом оператор может быть простым, а может быть составным.
Составной оператор имеет структуру:
begin
<Последовательность_операторов>
end
Конструкция циклов в языке Паскаль
Цикл со счетчиком (или цикл for)
Этот цикл используется, когда число повторений не связано с тем, что происходит в теле цикла. Т.е. количество повторений может быть вычислено заранее.
В заголовке цикла указываются два значения. Первое значение присваивается так называемой переменной-счетчику, от этого значения начинается отсчет количества итераций (повторений). Отсчет идет всегда с шагом равным единице. Второе значение указывает, при каком значении счетчика цикл должен остановиться. Другими словами, количество итераций цикла определяется разностью между вторым и первым значением плюс единица. В Паскале тело цикла не должно содержать выражений, изменяющих счетчик.
Цикл for существует в двух формах:
for <счетчик>:=<значение> to <конечное_значение> do
<тело_цикла>;
for <счетчик>:=<значение> downto <конечное_значение> do
<тело_цикла>;
Счетчик – это переменная любого из перечисляемых типов (целого, булевого, символьного, диапазонного, перечисления). Начальные и конечные значения могут быть представлены не только значениями, но и выражениями, возвращающими совместимые с типом счетчика типы данных. Если между начальным и конечным выражением указано служебное слово to, то на каждом шаге цикла значение параметра будет увеличиваться на единицу. Если же указано downto, то значение параметра будет уменьшаться на единицу.
Цикл с предусловием (или цикл while)
Цикл while является циклом с предусловием. В заголовке цикла находится логическое выражение. Если оно возвращает true, то тело цикла выполняется, если false – то нет.
while <логическое_выражение> do
<тело_цикла>;
Когда тело цикла было выполнено, то ход программы снова возвращается в заголовок цикла. Условие выполнения тела снова проверяется (находится значение логического выражения). Тело цикла выполнится столько раз, сколько раз логическое выражение вернет true. Поэтому очень важно в теле цикла предусмотреть изменение переменной, фигурирующей в заголовке цикла, таким образом, чтобы когда-нибудь обязательно наступала ситуация false. Иначе произойдет зацикливание.
Цикл с постусловием (или цикл repeat)
Цикл while может не выполниться ни разу, если логическое выражение в заголовке сразу вернуло false. Однако, бывают ситуации, когда тело цикла должно выполниться хотя бы один раз, независимо от того, что вернет логическое выражение. В таком случае используется цикл repeat – цикл с постусловием.
В цикле repeat логическое выражение стоит после тела цикла. В случае true происходит выход из цикла, в случае false – его повторение:
repeat <тело_цикла>
until <логическое_выражение>;
Тело цикла может включать в себя другой цикл. Количество вложенных циклов не ограничено.
Операции div и mod
Операция div возвращает целочисленный результат деления. При этом дробная часть будет отброшена. X div Y вернет целую часть от деления X на Y.
Например, после работы оператора z := 55 div 6, z будет равно 9.
Операция mod возвращает остаток от деления деления. X mod Y вернет остаток от деления X на Y.
Например, после работы оператора z := 55 mod 6, z будет равно 1.
Поиск наименьшего числа
Пример 1.
Ниже на пяти языках программирования записан алгоритм. Получив на вход число x, этот алгоритм печатает числа: a и b. Укажите наименьшее положительное пятизначное число x, при вводе которого алгоритм печатает сначала 6, а потом 3.
Бейсик
|
Python
|
DIM X, Y, A, B AS INTEGER
A = 0
B = 10
INPUT X
WHILE X > 0
Y = X MOD 10
X = X \ 10
IF Y > A THEN A = Y
IF Y < B THEN B = Y
WEND
PRINT A
PRINT B |
a = 0
b = 10
x = int(input())
while x > 0:
y = x % 10
x = x // 10
if y > a:
a = y
if y < b:
b = y
print(a)
print(b) |
Паскаль
|
Алгоритмический язык
|
var x, y, a, b: integer;
begin
a := 0;
b := 10;
readln(x);
while x > 0 do
begin
y := x mod 10;
x := x div 10
if y > a then
a := y;
if y < b then
b := y;
end;
writeln(a);
writeln(b)
end. |
алг
нач
цел x, y, a, b
a := 0
b := 10
ввод x
нц пока x > 0
y := mod(x, 10)
x := div(x, 10)
если y > a
то a := y
все
если y < b
то b := y
все
кц
вывод a, нс, b
кон |
Си
|
#include <stdio.h>
int main()
{
int x, y, a, b;
a = 0;
b = 10;
scanf("%d", &x);
while (x > 0)
{
y = x % 10;
x = x / 10;
if (y > a)
a = y;
if (y < b)
b = y;
}
printf("%d\n%d\n", a, b);
} |
Решение:
Т. к. оператор div возвращает целую часть от деления, то при делении на 10 это равносильно отсечению последней цифры. Значит, цикл выполниться пять раз.
В переменную a записывается остаток от деления числа x на 10 при условии, что этот остаток больше числа уже записанного в переменной a. В переменную b записывается остаток от деления числа x на 10 при условии, что этот остаток меньше числа уже записанного в переменной b. Таким образом, в переменную a записывается наибольшая цифра числа x, а в переменную b — наименьшая. Итак, нужно найти наименьшее пятизначное число, у которого наименьшая цифра равна 3, а наибольшая - равна 6. Такое число:33336.
Ответ: 33336
Пример 2.
Ниже на пяти языках программирования записан алгоритм. Получив на вход число x, этот алгоритм печатает число M. Известно, что x > 100. Укажите наименьшее такое (т.е. большее 100) число x, при вводе которого алгоритм печатает 26.

Решение:
В теле цикла числа M и L уменьшаются, пока не станут равными. Поскольку в итоге напечатано 26, значит, в конце программы оба числа равны 26. Рассмотрим изменение этой пары чисел в обратном порядке (при этом не знаем, какое именно число M, а какое L):
(26; 26) – (52; 26) – (78; 52) – (130; 52)
Если 130 – это L в начале работы (равное x), то т.к. оно четное, M в начале работы должно быть 52. Условие выполнено для пары (130; 52), значит искомое число 130.
Ответ: 130
Поиск наибольшего числа
Пример 3.
Ниже записана программа. Получив на вход число x , эта программа печатает два числа, L и M. Укажите наибольшее из таких чисел x, при вводе которых алгоритм печатает сначала 3, а потом 7.
var x, L, M: integer;
begin
readln(x);
L:=0; M:=0;
while x > 0 do begin
L:= L + 1;
if x mod 2 = 0 then
M:= M + (x mod 10) div 2;
x:= x div 10;
end;
writeln(L); write(M);
end.
Решение:
На каждом шаге от десятичной записи x отсекается последняя цифра до тех пор, пока все цифры не будут отсечены, то есть x не станет равно 0. В переменной L накапливается число выполнений цикла. L=3, значит цикл выполнился 3 раза, значит исходное число x трехзначное.
Теперь рассмотрим оператор изменения M:
if x mod 2 = 0 then
M:= M + (x mod 10) div 2;
end;
M увеличивается только в случае, если текущее значение x четное, т.е. если четная его последняя цифра. В этом случае к текущему значению M прибавляется целочисленный результат деления последней цифры текущего значения x на 2.
Таким образом, М – это сумма половин четных цифр числа x.
Значит, нам нужно найти наибольшее трехзначное число х, сумма четных цифр которого равна 14.
Наибольшее такое число 986.
Ответ: 986
Пример 4.
Ниже на пяти языках записан алгоритм. Получив на вход число x, этот алгоритм печатает два числа a и b. Укажите наибольшее из таких чисел x, при вводе которого алгоритм печатает сначала 2, а потом 5.
Бейсик
|
Python
|
DIM X, A, B AS INTEGER
INPUT X
A = 0: B = 1
WHILE X > 0
A = A+1
B = B * (X MOD 100)
X = X\100
WEND
PRINT A
PRINT B |
x = int(input())
a, b = 0, 1
while x > 0:
a = a + 1
b = b * x%100
x = x//100
print(a)
print(b) |
Паскаль
|
Алгоритмический язык
|
var x, a, b: integer;
begin
readln(x);
a := 0; b := 1;
while x > 0 do
begin
a := a+1;
b := b*(x mod 100);
x := x div 100;
end;
writeln(a); write(b);
end. |
алг
нач
цел x, a, b
ввод x
a:=0; b:=1
нц пока x > 0
a := a+1
b := b*mod(x,100)
x := div(x,100)
кц
вывод a, нс, b
кон |
Си
|
#include <stdio.h>
void main()
{
int x, a, b;
scanf("%d", &x);
a = 0; b = 1;
while (x > 0) {
a = a+1;
b = b * (x%100);
x = x/100;
}
printf("%d\n%d", a, b);
} |
Решение:
Т. к. оператор div возвращает целую часть от деления, то при делении на 100 это равносильно отсечению последних двух цифр.
На каждом шаге от десятичной записи x отсекается две последних цифры до тех пор, пока все цифры не будут отсечены, то есть x не станет равно 0.
В переменной a накапливается количество выполнений цикла, a=2, значит число x трехзначное или четырехзначное.
В переменной b накапливается произведение двух чисел: числа, состоящего из последних двух цифр числа х и первой цифры числа х, если число x трехзначное (или двух первых цифр, если число x четырехзначное).
Т.к. b=5, то второй из множителей не может быть двузначным, т.е. число x трехзначное. Наибольшее такое число равно 501.
Ответ: 501
Ты нашел то, что искал? Поделись с друзьями!
Спасибо за то, что пользуйтесь нашими публикациями.
Информация на странице «Задача №20. Работа с циклами и условными операторами.» подготовлена нашими авторами специально, чтобы помочь вам в освоении предмета и подготовке к экзаменам.
Чтобы успешно сдать нужные и поступить в высшее учебное заведение или колледж нужно использовать все инструменты: учеба, контрольные, олимпиады, онлайн-лекции, видеоуроки, сборники заданий.
Также вы можете воспользоваться другими материалами из данного раздела.
Публикация обновлена:
06.09.2023