Основы алгоритмизации и программирования (11 ч)

Вид материалаДокументы

Содержание


Begin ... End.
If ((month=12) And
Задачи и упражнения
Program ttt
2. Циклы с условиями.
Program exam
Program nnn
Program mmm
Холки не ниже 55 см ',k,'штук')
Подобный материал:

Основы алгоритмизации и программирования (11 ч)

Простые и составные условия. Основные алгоритмические конструкции: ветвление, повторение. Запись основных алгоритмических конструкций на языке программирования.

Реализация алгоритмов с ветвлением, повторением.

Основная цель:

формирование логического и алгоритмического мышления.

Учащиеся должны знать:

основные алгоритмические конструкции.

Учащиеся должны уметь:

использовать основные алгоритмические конструкции при решении практических задач.



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

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

Признаком разветвляющегося алгоритма является наличие условия.

Различают два вида условий - простые и составные.

Простым условием называется выражение, составленное из двух арифметических выражений или двух текстовых величин связанных одним из знаков:

  < - меньше, чем...
  > - больше, чем...
  <= - меньше, чем... или равно
  >= - больше, чем... или равно
  <> - не равно
  = - равно

Например, простыми условиями являются следующие:

x-y>10; 9<>11; ‘мама’<>‘папа’.

В приведенных примерах первые два отношения включают в себя переменные, поэтому о верности этих отношений можно судить только при подстановке некоторых значений:
  • если х=25, у=3, то отношение x-y>10 будет верным, т.к. 25-3>10
  • если х=5, у=30, то отношение x-y>10 будет неверным, т.к. 5-30<10

? Проверьте верность отношения k*a=c-b при подстановке следующих значений:
  1. k=5, a=1, b=3, c=8
  2. k=65, a=10, b=33, c=2

Выражения, при подстановке в которые некоторых значений переменных, о нем можно сказать истинно (верно) оно или ложно (неверно) называются логическими выражениями.

Определение. Переменная, которая может принимать одно из двух значений: True (правда) или False (ложь), называется логической переменной.

? Определите, какие значения будут принимать величины:

К:=”на улице всегда ярко светит солнце»;

F:=5>3.

Общий вид оператора условия:

If <условие> Then <оператор_1> Else <оператор_2>;

Условный оператор выполняется следующим образом. Вычисляется значение условия (выражение логического типа). Если условие истинно, то выполняется оператор 1, в противном случае выполняется оператор 2.

Пример. Дано целое число п. Определить, являет­ся ли оно четным.

If n Mod 2=0

Then Writeln('Число четное')

Else Writeln('Число нечетное');

Если в качестве оператора должна быть выполнена се­рия операторов, то ее заключают в операторные скобки Begin ... End.

Пример. Даны два числа а и b. Если оба числа по­ложительны, то увеличить их в два раза, иначе каждое число возвести в квадрат. Написать фрагмент прог­раммы.

If (a>0) And (b>0)

Then

Begin

a:=a*2;

b:=b*2

End

Else

Begin

a:=a*a; b:=b*b ;

End;

Если какое-либо действие нужно выполнить только при выполнении условия, условный оператор может быть записан в сокращенной форме:

If <условие> Then <оператор>;

Пример. Зимние каникулы начинаются 25 декабря и заканчиваются 10 января. Написать условный опера­тор, который выводит сообщение «Каникулы!», если дата (число и номер месяца) попадает в этот проме­жуток.

If ((month=12) And (day>=25)) Or ((month=l) And (day<=10)) Then Writeln('Каникулы!');

Оператор выбора Case является обобщением условно­го оператора и позволяет сделать выбор из произвольного числа имеющихся вариантов.

Общий вид оператора выбора:

Case <выражение> Of

<список_1>: <оператор_1>;

<список_2>: <оператор_2>;



<список_п>: <оператор_п>;

Else <оператор п+1>

End;

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

Оператор выбора может иметь и сокращенную форму, то есть вариант Else может отсутствовать.

Пример. По заданному номеру месяца определить пору года.


Case month Of

12,1,2: Writeln('Зима');

3..5: Writeln ('Весна');

6..8: Writeln('Лето');

9.. 11: Writeln('Осень');

Else Writeln('Неверные исходные данные')

End;

Задачи и упражнения:

  1. Компьютер спрашивает: "Что сегодня нужно всем?" и если получает ответ ЭВМ, то пишет "Ну, конечно ЭВМ!", иначе "Это тоже нужно всем, но нужнее ЭВМ!"
  2. Написать программу, по которой компьютер приветствовал бы только своего хозяина, а при попытке ввести какое-либо другое имя спрашивал бы: "А где (например) Вася?"
  3. Запишите условный оператор, в котором значение переменной с вычисляется по формуле a+b, если а - нечетное и a*b, если а - четное.
  4. Задать с помощью генератора случайных чисел № дня недели - целое число от 1 до 7. Напечатать, является ли он выходным.
  5. Задать с помощью генератора случайных чисел час суток - целое число от 0 до 23. Напечатать, к какой половине дня он относится (до или после полудня).
  6. Ввести с клавиатуры 2 числа. Напечатать:

а) меньшее;

б) большее.
  1. Ввести с клавиатуры 2 числа. Напечатать их разность, вычитая из большего меньшее.
  2. Ввести с клавиатуры 2 числа. Напечатать их частное или сообщение "Делить на ноль нельзя!"
  3. Ввести с клавиатуры значение для X. Вычислить и напечатать соответствующее значение для Y по правилу:
    a) Y=X+5, если Х<6 Y = X/2, если X>=6

б) Y=X-4, если Х<= 100 Y = X*3, если Х>100.
  1. Если целое число М делится нацело на целое число N, то вывести на экран частное от деления, в противном случае вывести сообщение 'M на N нацело не делится'.
  2. Определить, является ли число А делителем числа В.
  3. Дано целое число. Определить:

а) является ли оно четным;

б) оканчивается ли оно цифрой 7;

в) оканчивается ли оно четной цифрой.
  1. Известны два расстояния: одно в километрах, другое - в футах (1 фут=0,45 м). Какое из расстояний меньше?
  2. Известны площади круга и квадрата. Определить:

а) уместится ли круг в квадрате;

б) уместится ли квадрат в круге?
  1. Дано трехзначное число. Определить, какая из его цифр больше:

а) первая или последняя; б) первая или вторая;

в) вторая или последняя.
  1. Дано трехзначное число.

а) Верно ли, что все его цифры одинаковы?

б) Определить, есть ли среди его цифр одинаковые.
  1. Дано четырехзначное число. Определить:

а) Равна ли сумма двух первых его цифр сумме двух его последних цифр;

б) Кратно ли трем сумма его цифр;

в) Кратно ли четырем произведение его цифр;

г) Кратно ли произведение его цифр числу А.


"Сложные условия в операторе IF"
  1. Ввести с клавиатуры 2 положительных целых числа: день и месяц. Определить, нет ли ошибки. Считать, что в каждом месяце по 30 дней.
  2. Ввести с клавиатуры 2 положительных целых числа: часы и минуты. Определить, нет ли ошибки.
  3. В зрительном зале 30 рядов по 25 мест. Ввести с клавиатуры № места и № ряда. Определить, нет ли ошибки.
  4. Поезд составлен из 17 вагонов по 36 мест в каждом. Ввести с клавиатуры № вагона и места. Определить, нет ли ошибки.
  5. Известны год и номер месяца рождения человека, а также год и номер месяца сегодняшнего дня (Январь-1 и т.д.). Определить возраст человека (число полных лет). В случае совпадения указанных месяцев считать, что прошел полный год.
  6. Поезд в Варшаву отправляется по вторникам и пятницам. Ввести с клавиатуры № дня недели. Определить, можно ли уехать в Варшаву в этот день.
  7. На мини-рынке продают рыбу, молоко и цветы. Задать с помощью генератора случайных чисел № торгового места - целое число от 1 до 6, определить, чем торгуют: 1 и 4 - рыба, 2 и 6 - молоко, 3 и 5 - цветы.
  8. Задать с помощью генератора случайных чисел целое число от 0 до 100 - возраст человека. Определить его возрастную группу: до 15 лет - детство, от 16 до 30 - молодость, от 31 до 70 - зрелость, после 71 - старость.
  9. В поезде 3-й, 7-й, 9-й вагоны купейные, а остальные - плацкартные. Ввести с клавиатуры целое положительное число. Напечатать вид вагона.
  10. В шеренге спортсмены стоят по росту. Задать с помощью генератора случайных чисел № спортсмена - целое число от 1 до 9, определить вид спорта: 1, 2, 9 - баскетбол, 3, 4, 5 - бег , 6, 7, 8 - штанга.
  11. В поликлинике кабинеты распределены так: 1, 2, 3, 17 - окулисты; 4, 18, 19, 20 - хирурги; 5 - 8 - стоматологи; 9 - 16 - педиатры. Задать с помощью генератора случайных чисел № кабинета - целое число от 1 до 20, определить специальность врача.
  12. С автостанции автобусы отправляются по 16 маршрутам и переезжают через реку по 4 мостам: №№ 1, 2, 3, 5 - по Южному; №№ 4, 6, 7, 8 - по Центральному; №№ 9, 10, 11, 12 - по Северному; №№ 13,14,15,16 - по Окружному. Ввести с клавиатуры № маршрута. Напечатать, по какому мосту он поедет.
  13. Задать с помощью генератора случайных чисел № ряда в кинотеатре - целое число от 1 до 25. Определить, сколько стоит билет, если его цена зависит от ряда: 1, 2, 3, 25 - 10 руб; 4, 5 - 15 руб; с 6 по 24 - 20 руб.



Циклы

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

Рассмотрим основные циклы в программах:

1) цикл с параметром;

2) циклы с условиями:

2.1. цикл с предусловием;

2.2. цикл с постусловием.


1. Цикл с параметром


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


For <параметр>:=А То В Do

<тело цикла>;

For <параметр>:=A Downto B Do

<тело цикла>;

где А - начальное значение параметра,

В - конечное значение параметра.


Оператор цикла с параметром применяют тогда, когда заранее известно число повторений одной и той же последовательности операторов.

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

Рассмотрим, как выполняется оператор цикла с параметром вида

For <параметр>:=A To B Do <тело цикла>

Сначала вычисляются значения выражения А и В. Если А<=B, то <параметр> последовательно принимает значения, равные А, А+1, ..., В-1, В и для каждого из этих значений выполняется <тело цикла>. Если А>В, то <тело цикла> не выполняется ни разу.

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

For <параметр>:=A Downto B Do <тело цикла>

выполняется аналогичным образом, но значение <параметра> изменяется с шагом, равным -1.

Если <тело цикла> состоит из нескольких операторов, то операторы тела цикла заключаются в операторные скобки Begin-End.


Пример.

Из чисел от 10 до 99 вывести те, сумма цифр которых равна s.

Вопросы для обсуждения:

1. Каким образом можно выделить последнюю (младшую) цифру числа?

2. Каким действием можно выделить первую (старшую) цифру числа?

Обозначим через k очередное число, р1 - старшую цифру числа k, р2 - младшую цифру числа, s - сумму цифр числа k. Число k будем печатать только в том случае, когда сумма р1 и р2 будет равна s.

Program ttt;

Var

k,n,p1,p2,s: Integer;

Begin

Writeln ('введите целое число');

Readln(n); {Вводим целое число}

For k:=10 to 99 do {для (for) k от 10 до (to) 99 делать(do)}

Begin

p1:=k div 10; {Выделяем старшую цифру}

p2:=k mod 10; {Выделяем младшую цифру}

If s=n then Writeln(k);

{если сумма равна n, то выводим k}

End;

Readln;

End.


Рекомендации:

Перед решением задач можно рассмотреть следующие вопросы:

1. Сколько раз будет выполнено тело цикла в следующих фрагментах программ:

а) For k:=-1 To 1 Do ...

б) For k:=10 To 20 Do ...

в) For k:=20 To 10 Do ...

г) k:=5; r:=15;

For i:=k+1 To r-1 Do ...

д) k:=5; r:=15;

For i:=0 To k*r Do ...

е) k=r;

For i:=k To r Do ...

2. Определить значение переменной s после выполнения следующих операторов:

s:=0; n:=10;

For i:=2 To n Do s:=s+100 div i;


2. Циклы с условиями.


2.1. Цикл с предусловием


Цикл с предусловием используется тогда, когда число повторений оператора цикла заранее неизвестно, а задаётся некоторое условие повторения цикла.


Оператор

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

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


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

Примечание.

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

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


Пример 1.

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


Решение.

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


Program exam;

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. Найти порядковый номер наименьшего элемента последовательности.


Решение.

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

Program nnn;

Var

x,i,min,k : integer;

Begin

Writeln('Введите первый элемент последовательности');

Read(x); k:=1;

min:=x; i:=2;

While x<>0 do

begin

if x

begin min:=x; k:=i-1 end;

Writeln ('Введите',i,'элемент последовательности');

Read (x);

Inc (i);

end;

Writeln('Номер минимального элемента -',k);

End.

Рекомендации:

Перед решением задач можно рассмотреть следующие вопросы:

1. Дана последовательность операторов:

a:=1;b:=1;

While a+b<8 do

Begin a:=a+1; b:=b+2 end;

s:=a+b;

Сколько раз будет повторен цикл и какими будут значения переменных a,b,s после завершения этой последовательности операторов?

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

While c<0 do c:=c+k;

While k<>0 do k:=k+1;

While k<>0 do k:=k-2.


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


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


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

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

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

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

...

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

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

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

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

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


Пример.

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


Решение.

Обозначим через x,k - цена и количество товара, р - заданная предельная сумма, s - стоимость покупки.

Program mmm;

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.

Рекомендации:

Перед решением задач можно рассмотреть следующий вопрос:


1. Определить значение переменной s после выполнения следующих операторов:

s:=0; i:=1;

Repeat

s:=s+5 div i; i:=i-1;

Until i<=1;


3. Примеры решения некоторых задач.


1.Найти сумму Ряда чисел от 100 до 1, каждый из которых на единицу меньше другого (100 + 99 + ... + 2 + 1)

Решение:

program SUM;

var x,s;real;

begin

s:=0;

x:=100;

while x>0.5 do

begin

s:=s+x;

x:=x+1;

end;

writeln ('Сумма=',s)

end.


2. На выставке собак, где были представлены разные породы, отбор животных производился по возрасту и высоте холки. Определить, сколько было боксеров 2-3-летнего возраста с высотой холки не менее 55 см.

Решение:

Для решения задачи:

- формируем тело программы и описываем переменные;

- вводим длину последовательности, задаем начальное значение счетчика К;

- в цикле вводим породу собаки, возраст и высоту холки;

- если собака удовлетворяет всем требованиям, то увеличиваем значение счетчика на единицу;

- в зависимости от К выводим результат.

Переменные:


K - счетчик

I - переменная цикла

N - количество собак

AGE - возраст собаки

L - высота холки

PORODA - порода.


Program sob;

Var

PORODA : string;

I,K,N : integer;

AGE, L : real;

Begin

Repeat

write ('Введите длину последовательности N=');

readln (N);

Until N>0;

K:=0;

For I:=1 To N Do

Begin

writeln ('Введите породу, возраст, высоту холки ');

readln (PORODA);

readln (AGE,L);

If (PORODA='БОКСЕР') and (AGE>=2) and (L>=55)

Then K:=K+1;

End;

If K=0 Then writeln('ТАКИХ СОБАК НЕТ')

Else writeln ('БОКСЕРОВ 2-3 ЛЕТ С ВЫСОТОЙ

ХОЛКИ НЕ НИЖЕ 55 СМ ',K,'ШТУК');

End.


3. Вывести на экран произведение натуральных чисел, находящихся в интервале K и L.

Решение.

Program shtet; (*имя программы shtet*)

Var i,j,a,b,k,L : integer; (*объявление целых переменных i,j,a,b,k,L*)

Begin

writeln('введите значения k,L,a,b');

read(k,L,a,b); (*ввод нижнего значения интервала - К, верхнего значения интервала - L, чисел А и В. Далее будет определяться, какие произведения чисел А и В попадают в интервал К-L. Здесь А - одно из чисел 1,...,А, В - одно из чисел 1,...,В; предполагается, что числа К,L,А,В не более, чем двухразрядные*)

writeln;

writeln('Интервал ',k:2,'********',L:2);

writeln('число число число');

writeln(' I J I*J');

(*после выполнения этих четырех инструкций на экране дисплея появится соответствующая текстовая информация *)

for i:=1 to a do

begin

for j:=1 to b do

if (i*j>=k) and (i*j<=L) then writeln(i:3,j:8,i*j:9);

end; (*здесь выполняется цикл в цикле, т.е. берется первое число, например, 1 и умножается на каждое из чисел 1,..,В, если результат попадает в интервал в K-L, то печатается соответствующая строка *)

end.

4. Приписать к числу 1022 слева и справа по одной цифре так, чтобы полученное шестизначное число делилось на 7, 8, 9.

Решение:

Формула искомого шестизначного числа а1022в - 100000а+10220+в


var a,b:shortint;

x:=longint;

begin

for a:=1 to 9 do

begin

x:=100000*a+10220;

for b:=0 to 9 do

if (x+b) mod 504=0 {7*8*9=54}

then write(x+b);

end;

end.

5. Найдите на натуральном отрезке [а,b] чётное число с наибольшей суммой всех своих делителей.

Var

m,p,s,max,i,a,b:longint;

Begin

writeln('Введите числа А и В (А<В)');

readln(a);

readln(b);

if Odd(a) then a:=a+1;

p:=a;

While a<=b do

begin

s:=a;

for i:=1 to trunc(a/2) do

if (a mod i)=0 then s:=s+i;

if p=a then max:=s;

if max<=s then

begin

max:=s;

m:=a

end;

a:=a+2;

end;

writeln('чётное число с наибольшей суммой делит.=',m)

End.

6.Определить все натуральные числа из интервала [10,20000], сумма цифр каждого из которых, возведённая в некоторую степень, даёт само число. Например, 18*18*18=5832, 9*9=81


Var

k,n,i,s:longint;

Begin

i:=10;

While i<=20000 do

begin

n:=i;

s:=0;

while n>=1 do

begin

s:=s+n mod 10;

n:=n div 10;

end;

n:=i; k:=s;

while (s1) do

begin

s:=s*k;

if s=n then writeln(i);

end;

i:=i+1;

end;

End.


7. Найдите и выведите без повторений все простые делители целого числа m.

Решение:

Var

i:boolean;

m,j:integer;

Begin

writeln('Введите число');

readln(m);

i:=true;

j:=2;

while m<>1 do

begin

if m mod j=0 then

begin

if i then writeln(j);

m:=m div j;

i:=false;

end

else

begin

j:=j+1;

i:=true;

end;

end;

End.


8. Найдите и выведите все пифагоровы тройки натуральных чисел на интервале [a,b].

Пифагоровы числа - это тройки таких натуральных чисел, что треугольник, длины сторон которого пропорциональны (или равны) этим числам, является прямоугольным.

Решение:

Var

a,b,i,j,k:longint;

Begin

writeln('Введите числа А и В (А<В)');

readln(a);

readln(b);

for i:=b downto a+2 do

for j:=b-1 downto a+1 do

for k:=b-2 downto a do

if sqr(i)=sqr(j)+sqr(k) then writeln('(',i,',',j,',',k,')');

End.


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

Решение:

Var

a:byte;

l,s,v:longint;

Begin

writeln('Введите основание с/с');

readln(a);

writeln('Введите число L');

readln(l);

s:=0;v:=1;

While l>1 do

begin

s:=s+(l mod a)*v;

v:=v*10;

l:=l div a;

end;

writeln ('Число в новой с/с=',s)

End.


10. Существует строка текста, состоящая из 1,2,3,4-х-значных натуральных чисел, отделённых друг от друга пробелом, в конце строки стоит точка. Необходимо найти и вывести все числа Армстронга в этой строке.

Натуральное число А, состоящее из n цифр, называется числом Армстронга, если оно равно сумме n степеней своих цифр. Например, 13+53+33=153.

Решение:

Var

a1:array[1..4] of integer;

cod,i,k,n:integer;

a,s:longint;

st1,s1:string;

f:boolean;

Begin

writeln('Введите строку из цифр');

readln(st1);

k:=1; n:=1; f:=false;

while k<=(lenght(st1)+1) do

begin

if (st1[k]=' ') or (st1[k]='.') then

begin

s1:=copy(st1,n,k-n);

val(s1,a,cod);

s:=0;

for i:=1 to length(s1) do

begin

val(s1[i],a1[i],cod);

s:=s+trunc(exp(length(s1)*ln(a1[i])));

end;

if a=s then

begin

writeln('число Армстронга:',a);

f:=true;

end;

n:=k+1;

end;

inc(k);

end;

if not(f) then writeln('Чисел Армстронга в строке нет');

End.


11. Найти количество натуральных четырехзначных чисел, делящихся на 23 и на свою последнюю цифру.

Решение:

1 способ.

var a,b,c,d,g:byte;

x:word;

begin

g:=0;

for a:=1 to 9 do

for b:=0 to 9 do

for c :=0 to 9 do

for d:=1 to 9 do

begin

x:=((10*a+b)*10+c)*10+d;

if (x mod 23=0) and (x mod d=0)

then inc(g);

end;

write(g);

end.


2 способ.

var g,d:byte;

x:word;

begin

g:=0;x:=1012;

repeat

d:=x mod 10 ;

if d<>0 then

if x mod d=0 then

inc(g);

inc(x,23);

until x>9999;

write (g);

end.


Предпочтительней 2 способ, в котором нет вложенных циклов.

1012 - первое четырехзначное число, кратное 23. Далее достаточно в одном цикле с шагом 23 отделять последнюю цифру d четырехзначного числа х и, если она не равна 0, а х кратно d, то вести подсчет.


12. Двузначное число в сумме с числом, записанном теми же цифрами, но в обратном порядке дает квадрат натурального числа. Найти все такие числа.

Решение:

1 способ.

var a,b:byte;

begin

for a:=1 to 9 do

for b:=0 to 9 do

if frac(sqrt(11*(a+b)))=0

then write(10*a+b,' ');

end.


2 способ.

var a,b:byte;

begin

for a:=2 to 5 do

begin

b:=11-a;

write(10*a+b:3,10*b+a:3);

end;

end.


Двузначное число в сумме с числом, записанном теми же цифрами, но в обратном порядке, записывают как 10а+в+10в+а=11а+11в=11(а+в).


В 1 решении - перебираются все суммы.

Условие frac(sqrt(11*(a+b)))=0 обозначает, что дробная часть числа

sqrt(11*(a+b) равна 0, т.е. из числа 11(а+в) извлекается квадратный корень и оно представимо в виде квадрата натурального числа.

Во 2 решении используется кратность сумм числу 11, откуда

следует, что условие выполняется только при а+в=11. Итак, в=11-а,

в<=9, поэтому а>=2. Кроме того, так как а и в входят в равенство

а+в=11 симметрично, то можно ограничиться максимальным значением параметра, равным 5, а искомые числа выводить парами

10а+в, 10в+а в операторе вывода.

Вывод: если между параметрами вложенных циклов существует

зависимость, заданная формулой, то один из циклов можно исключить.


13. Последовательность abcdef из 6 цифр называется счастливым билетом, если a+b+c=d+e+f. Определить число таких билетов.

Решение:

1 способ - простой перебор (6 вложенных циклов).

2 способ:


var a,b,c,d,e,f,x1,x2,x3:shortint;

g:word;

begin

g:=0

for a:=0 to 9 do

for b:=0 to 9 do

begin

x1:=a+b;

for c:=0 to 9 do

begin

x2:=x1+c; {a+b+c}

for d:=0 to 9 do

begin

x3:=x2-d; {a+b+c-d}

if x3>=0 then

for e:=0 to 9 do

case x3-e of 0..9:inc(g) end;

{x3-e=f=a+b+c-d-e}

end;

end;

end;

write(g);

end.


Во 2 решении учтена зависимость между парами циклов и использованы промежуточные переменные х1,х2,х3 и вообще исключен цикл с f. Во вложенных циклах выгоднее вычислять величину один раз и хранить ее, а не повторять вычисления. Условие a+b+c=d+e+f соответствует условию a+b+c-d-e=f.

x3 может быть <0, поэтому необходима проверка х3>=0.

В первом решении выбор - 1000000 раз, а во втором - меньше 10000 раз.


14. Какие числа выведут на экран 2 программы:


1) var a,b,n:byte; 2) var a,b,n:byte;

begin begin

for a:=1 to 3 do for a:=1 to 3 do

begin for b:=0 to 2 do

n:=10*a; begin

for b:=0 to 2 do n:=10*a+b;

begin write(n:3);

n:=n+b; end;

write(n:3); end.

end;

end;

end.


Эти примеры указывают на возможную ошибку при использовании промежуточных переменных во вложенных циклах. Казалось бы, что результат должен быть одним и тем же, но 1-я программа выведет числа 10,11,12,13,20,21,23,30,31,33, а 2-я - 10,11,12,20,21,22,30,31,32.

Одинаковый результат получим, используя в 1-й программе промежуточную переменную nn и выполнив присваивание:

nn:=10*a и n:=nn+b вместо n:=10*a и n:=n+b соответственно.

Вывод: необходимо оптимизировать части программы, исполняемые многократно; вносить изменения и вводить промежуточные переменные надо осторожно, избегая ошибок.




Найти все решения заданного числового ребуса. Каждой букве соответствует некоторая цифра. Причём одинаковым буквам соответствуют одинаковые цифры, разным буквам - разные цифры.

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

program zadacha3_8a;

var k, t, o, kto, kot, tok:longint;

Begin

for k:=0 to 9 do

for t:=0 to 9 do

for o:=0 to 9 do

begin

kto:=k*100+t*10+o;

kot:=k*100+o*10+t;

tok:=t*100+o*10+k;

if (k<>t) and (k<>o) and (t<>o) and (kto+kot=tok) then

writeln(kto,'+',kot,'=',tok);

end;

End.

В данном алгоритме тело цикла выполнялось 10∙10∙10=1000 раз. (будем говорить сложность алгоритма =1000)

Если же для решения более сложных ребусов потребуется написать 8-10 вложенных циклов, то такой полный перебор будет работать достаточно долго.

Можно немного упростить данный алгоритм, если увидеть что 1≤k≤4, t≥2.

for k:=1 to 4 do

for t:=2 to 9 do

for o:=0 to 9 do

Теперь сложность алгоритма 4∙8∙10=320. Простое косметическое исправление дало увеличение скорости в 3 раза.

Но и данный алгоритм не является оптимальным. Посмотрите, при k=2 и t=2 программа переберёт все 10 вариантов o. В таких случаях когда k=t цикл по o вообще необходимо не выполнять. Назовём такой метод - контролируемый перебор.

program zadacha3_8c;

var k, t, o, kto, kot, tok:longint;

Begin

for k:=1 to 4 do

for t:=2 to 9 do

if k<>t then

for o:=0 to 9 do

if (k<>o) and (t<>o) then

begin

kto:=k*100+t*10+o;

kot:=k*100+o*10+t;

tok:=t*100+o*10+k;

if kto+kot=tok then writeln(kto,'+',kot,'=',tok);

end;

End.

Такой алгоритм даже при 8-10 вложенных циклах работает очень быстро.

Задания для самостоятельной работы:
  1. Найти все решения следующих числовых ребусов:
  1. БАБКА+ДЕДКА+РЕПКА=СКАЗКА (4 решения)
  2. КОРОВА+ТРАВА+ДОЯРКА=МОЛОКО (2 решения)
  3. АЛЁНКА+ИВАН+КОЗЛИК=СКАЗКА (1 решение)
  4. ВЕТКА+ВЕТКА+СТВОЛ=ДЕРЕВО (3 решения)
  5. ВОРОТА+ТРАВА=ФУТБОЛ (3 решения)


4. Примерный перечень задач.

    1. Определить количество трехзначных чисел, сумма цифр которых равна заданному числу n.
    2. Составить программу вычисления суммы кубов чисел от 25 до 125.
    3. Среди двузначных чисел найти те, сумма квадратов цифр которых делится на 13.
    4. Написать программу поиска двузначных чисел, обладающих следующим свойством: если к сумме цифр числа прибавить квадрат этой суммы, то получится снова данное число.
    5. Квадраты некоторых трехзначных чисел оканчивается тремя цифрами, которые как раз и составляют исходные числа. Написать программу поиска таких чисел.
    6. Написать программу поиска четырехзначного числа, которое при делении на 133 дает в остатке 125, а при делении на 134 дает в остатке 111.
    7. Найти сумму положительных нечетных чисел, меньших 100.
    8. Найти сумму целых положительных чисел из промежутка от А до В, кратных 4 (значения переменных А и В вводятся с клавиатуры).
    9. Найти сумму целых положительных чисел, больших 20, меньших 100, кратных 3 и заканчивающихся на 2, 4 или 8.
    10. Найти сумму цифр числа.
    11. Найти старшую цифру числа.
    12. Приписать по 1 в начало и конец записи числа n. Например, из числа n=3456 надо получить 134561.
    13. Поменять местами первую и последнюю цифру числа.
    14. Сколько раз данная цифра встречается в целом числе?
    15. Составить программу, проверяющую, является ли заданное натуральное число палиндромом, т.е. таким, десятичная запись которого читается одинаково слева направо и справа налево.
    16. Cоставить программу для определения того, является ли заданное натуральное число совершенным. Совершенным называется число, равное сумме всех своих положительных делителей (включая 1 и исключая само число).
    17. С
      колько слагаемых должно быть в сумме


чтобы эта сумма оказалась большее 5?
    1. Найдите наибольший общий делитель натуральных чисел M и N.
    2. Найдите сумму S и произведение P а) четных чисел от 1 до n; б) нечетных чисел от 1 до n; в) чисел, кратных 3, от 1 до n.
  1. Найдите сумму а) квадратов первых n натуральных чисел; б) кубов первых n натуральных чисел; в) квадратов четных чисел из первых n натуральных чисел; г) кубов четных чисел из первых n натуральных чисел.
  2. Задана последовательность из m чисел. Найти сумму всех положительных и всех отрицательных чисел, а также количество нулей.
  3. Вводится последовательность из N целых чисел. Найти наибольшее число.
  4. Вводится последовательность целых чисел, 0 - конец последовательности. Найти два наименьших числа.
  5. Вводится последовательность чисел, 0 - конец последовательности. Определить, содержит ли последовательность хотя бы два равных соседних числа (аii+1).
  6. Вводится последовательность ненулевых чисел, 0 - конец последовательности. Определить, сколько раз последовательность меняет знак.
  7. Вводится последовательность ненулевых чисел, 0 - конец последовательности. Определить, является ли последовательность возрастающей.
  8. Вводится последовательность ненулевых чисел, 0 - конец последовательности. Определить, является ли данная последовательность убывающей.
  9. В очереди за билетами стоят мужчины и женщины. Какое количество мужчин стоит в начале очереди до первой женщины.

Для решения задачи:

- формируем тело программы и описываем переменные;

- водим длину последовательности, задаем начальное значение счетчика К
  1. Найдите наименьшее натуральное число х, удовлетворяющее условию: а) х32=100; б)х43=500.
  2. Найдите наибольшее двузначное натуральное число х, удовлетворяющее условию: а)х3-10х2=777768;

б)х3+10х2=810000.
  1. Найдите а) наименьшее двузначное число, сумма кубов цифр которого равна 730; б) наибольшее двузначное число, сумма кубов цифр которого равна 730.
  2. Найдите три натуральных числа х, у, z, удовлетворяющих условию 15х+20у+30z=270.
  3. Имеется товар в ящиках по 16, 17 и 21 кг. Как получить 185 кг этого товара, не вскрывая ящики?
  4. Три приятеля были свидетелями нарушения правил дорожного движения. Номер автомобиля - четырехзначное число - никто не запомнил. Из их показаний следует, что номер делится на 2, на 7 и на 11, в записи номера участвуют только две цифры, сумма цифр номера равна 30. Напишите программу для определения номера автомашины.
  5. Задано n троек чисел а, в, с. Определить, сколько из предложенных троек можно использовать для построения треугольника, если а, в, с - длины его сторон. (а<=b<=c)/
  6. Ивана Александровича Хлестакова пригласили управлять департаментом. В первый день к нему прислали 1000 курьеров, а в каждый последующий - в два раза больше, чем в предыдущий. Иван Александрович согласился тогда, когда к нему прибыло сразу не менее 30000 курьеров. На какой день Хлестаков согласился управлять департаментом? Учтите, что он не умеет ни делить, ни умножать.
  7. Можно ли разменять 25 р. десятью купюрами достоинством 1, 3 и 5 р.?
  8. Найти все простые числа, меньшие заданного n.
  9. Найти все простые делители предложенного числа.
  10. Найти все простые числа из заданного промежутка [a,b].
  11. Спортсмен в первый день пробежал 10 км. Каждый следующий день он увеличивал дневную норму на 10% от нормы предыдущего дня.

а) Какой путь пробежит спортсмен в седьмой день?

б) Определить, через сколько дней спортсмен будет пробегать более 20 км.

в) Определить, через сколько дней спортсмен пробежит суммарный путь более 100 км.
  1. В переменную Х по очереди вводятся 10 чисел. В переменной Р получить минимальное из этих чисел.
  2. Вводятся 14 чисел. Определить, сколько среди них положительных (включая 0) и сколько отрицательных.
  3. Задана последовательность из m чисел. Сосчитать все положительные и все отрицательные числа в последовательности. Нули (если они есть) учитывать отдельно.
  4. Дано натуральное число n.

а) Сколько цифр в числе n ?

б) Чему равна сумма его цифр ?

в) Найти первую цифру числа n.
  1. Даны натуральные числа n, m. Получить сумму m последних цифр числа n .
  2. Дано натуральное число n.

а) Выяснить, входит ли цифра 3 в запись числа n2.

б)Поменять порядок цифр числа n на обратный.

в)Переставить первую и последнюю цифры числа n.

г) Приписать по единице в начало и конец записи числа n.
  1. Даны натуральные числа m, n. Найти такие натуральные p, q, не имеющие общих делителей, что p/q=m/n .
  2. Индейцы продали остров Манхеттен в 1668 году за 6 долларов. Сколько денег имели бы индейцы в 2000 году, если бы поместили свои сбережения в банк под 4 % годового прироста.
  3. Население города Орши в 2000 году составило 134000 человек. Через сколько лет население удвоится, если известно, что процент годового прироста 1/16 .
  4. Произведение первых n нечётных чисел равно р. Сколько сомножителей взято.
  5. Показать, что любой оператор цикла с постусловием можно записать с помощью условного оператора и оператора цикла с предусловием.
  6. Дана непустая последовательность натуральных чисел, за которой следует 0. Вычислить сумму положительных элементов последовательности, порядковые номера которых нечётны.
  7. Найдите остаток r от деления натурального числа m на натуральное число n, считая, что система команд исполнителя состоит из двух команд: вычитание двух чисел, сравнение двух чисел.
  8. Число а возводят в квадрат и результат увеличивают на 1. Полученное число снова возводят в квадрат и результат увеличивают на 1. Этот процесс продолжается до тех пор, пока не будет получено число х, большее миллиона. Найдите число х.
  9. Сколько можно купить быков, коров и телят, если плата за быка 10 рублей, за корову- 5 рублей, за теленка – полтинник (0.5 рубля), если на 100 рублей надо купить 100 голов скота.
  10. Стороны прямоугольника заданы натуральными числами М и N . Составить программу, которая будет находить, на сколько квадратов, стороны которых выражены натуральными числами, можно разрезать данный прямоугольник, если от него каждый раз отрезается квадрат максимально большой площади.
  11. Каждый год жители островов А и В обмениваются своими ценностями. Жители острова А отвозят половину своих ценностей на остров В, а жители острова В – третью часть своих ценностей на остров А. Сколько ценностей будет на каждом острове через n лет, если первоначально на островах А и В было Х и Y ценностей соответственно.
  12. Деньги в сумме 100000 рублей положены в сберегательную кассу на текущий счет. Каждый год прибыль равна 10%. Через сколько времени положенная сумма денег станет в 2 раза больше.
  13. Население города каждый год увеличивается на 16%. Через сколько лет население увеличится в 2 раза, если в начале было а тысяч человек, а вводится с клавиатуры.
  14. Мячик упал с высоты h, ударился о землю, потом снова поднялся на 2/3 предыдущей высоты. Через сколько ударов мяч поднимется на высоту р? Значение h, p вводятся с клавиатуры.
  15. Гриб за сутки увеличивает свою массу на 40%. Через сколько суток масса гриба увеличится в 2.5 раза, если первоначальная масса гриба была а, а вводится с клавиатуры.
  16. В сосуде А с литров воды, в сосуде В х литров воды. С сосуда А вылили половину воды в сосуд В, потом с сосуда В вылили 1/3 воды в сосуд А. Сколько воды будет в каждом сосуде после к переливаний. Значения с, х, к вводятся с клавиатуры.
  17. Кащей Бессмертный зарыл клад на глубину 1 м. Этого ему показалось не достаточно, он отрыл клад, углубил колодец до 2 м и снова зарыл. Этого ему опять показалось мало, он отрыл клад, углубил колодец до 3 м и зарыл. Затем он проделал тоже, углубив колодец до 4 м, потом до 5 м, 6 м и т. д. Известно, что колодец глубиной N метров Кощей вырывает за N2 дней. Известно также, что на 1001-й день Кащей умер от непосильной работы. На какой глубине остался клад? (Временем, необходимым для закапывания клада, пренебречь).