Решение задач на выполнение алгоритма
Задача №1 Определите значение переменной а после выполнения фрагмента алгоритма:
Примечание: знаком * обозначено умножение,
знаком := обозначена операция присваивания.
Решение задачи №1 Последовательно выпишем значения переменных в ходе цикла, пока переменная b не станет равной 1 .
Шаг 1. | b=b-1=3-1=2 a=a*9=1*9=9 |
Шаг 2. | b=b-1=2-1=1 a=a*9=9*9=81 |
Так как после второго шага переменная b равна 1, то по условию «b=1», цикл завершён.
Ответ: Переменная а равна 81.
Задача №2
Примечание: знаком * обозначено умножение,
знаком := обозначена операция присваивания.
Решение задачи №2 Последовательно выпишем значения переменных в ходе цикла, пока переменная b не станет равной 1 .
Шаг 1. | b=b-2=7-2=5 a=a*8=1*8=8 |
Шаг 2. | b=b-2=5-2=3 a=a*8=8*8=64 |
Шаг 3. | b=b-2=3-2=1 а=a*8=64*8=512 |
Так как после второго шага переменная b равна 1, то по условию «b=1», цикл завершён.
Ответ: Переменная а равна 512.
Задача №3
Решение задачи №3 Последовательно выпишем значения переменных в ходе цикла, пока не выполнится следующее условие «а<9» .
Шаг 1. | Проверяем условие «а<b», условия не выполняется (идем по стрелки «нет»). b=b+2=1+2=3 a=a+1=1+1=2 |
Шаг 2. | Проверяем условие «а<b», условия выполняется (идем по стрелки «да»). b=b+2=3+2=5 a=a+3=2+3=5 |
Шаг 3. | Проверяем условие «а<b», условия не выполняется (идем по стрелки «нет»). b=b+2=5+2=7 a=a+1=5+1=6 |
Шаг 4. | Проверяем условие «а<b», условия выполняется (идем по стрелки «да»). b=b+2=7+2=9 a=a+3=6+3=9 |
Так как после четвертого шага переменная а равна 9, то по условию «а<9» , цикл завершён.
Ответ: Переменная b равна 9.
Задача №4 Определите значение переменной b после выполнения фрагмента алгоритма:
Решение задачи №4 Последовательно выпишем значения переменных в ходе цикла, пока не выполнится следующее условие «а<9» .
Шаг 1. | Проверяем условие «а<b», условия не выполняется (идем по стрелки «нет»). b=b*2=1*2=2 a=a+2=1+2=3 |
Шаг 2. | Проверяем условие «а<b», условия не выполняется (идем по стрелки «нет»). b=b*2=2*2=4 a=a+2=3+2=5 |
Шаг 3. | Проверяем условие «а<b», условия не выполняется (идем по стрелки «нет»). b=b*2=4*2=8 a=a+2=5+2=7 |
Шаг 4. | Проверяем условие «а<b», условия выполняется (идем по стрелки «да»). b=b+2=8+2=10 a=a+2=7+2=9 |
Так как после четвертого шага переменная а равна 9, то по условию «а<9» , цикл завершён.
Ответ: Переменная b равна 10.
Задача №5 Определите значение переменной b после выполнения фрагмента алгоритма:
Решение задачи №5 Последовательно выпишем значения переменных в ходе цикла, пока не выполнится следующее условие «а=1» .
Шаг 1. | a=a/2=256/2=128 b=b+a=0+128=128 |
Шаг 2. | a=a/2=128/2=64 b=b+a=128+64=192 |
Шаг 3. | a=a/2=64/2=32 b=b+a=192+32=224 |
Шаг 4. | a=a/2=32/2=16 b=b+a=224+16=240 |
Шаг 5. | a=a/2=16/2=8 b=b+a=240+8=248 |
Шаг 6. | a=a/2=8/2=4 b=b+a=248+4=252 |
Шаг 7. | a=a/2=4/2=2 b=b+a=252+2=254 |
Шаг 8. | a=a/2=2/2=1 b=b+a=254+1=255 |
Так как после восьмого шага переменная а равна 1, то по условию «а=1» , цикл завершён.
Ответ: Переменная b равна 255.
Задачи для самостоятельного решения
Задача №6 Определите значение переменной b после выполнения фрагмента алгоритма:
Задача №7 Определите значение переменной a после выполнения фрагмента алгоритма:
Анализ результата исполнения алгоритма
Термин «алгоритм», впервые употребленный в современном значении. Лейбницем (1646–1716), является латинизированной формой имени великого персидского математика Мухаммеда бен Муссы аль-Хорезми (ок. 783 – ок. 850). Его книга «Об индийском счете» в XII в. была переведена на латинский язык и пользовалась широкой популярностью не одно столетие. Имя автора европейцы произносили как Алгоритми (Algorithmi), и со временем так стали называть в Европе всю систему десятичной арифметики.
Научное определение алгоритма дал А. Чёрч в 1930 году. В наше время понятие алгоритма является одним из основополагающих понятий вычислительной математики и информатики.
Алгоритм — это точное и полное описание последовательности действий над заданными объектами, позволяющее получить конечный результат.
Можно сказать, что алгоритм решения какой-либо задачи — это последовательность шагов реализации (или нахождения) этого решения, а процесс построения алгоритма (алгоритмизация) — разложение задачи на элементарные действия или операции.
Область математики, известная как теория алгоритмов, посвящена исследованию свойств, способов записи, области применения различных алгоритмов, а также созданию новых алгоритмов. Теория алгоритмов находит широкое применение в различных областях деятельности человека — в технике, производстве, медицине, образовании и т. д. Появление компьютера позволило решать чрезвычайно сложные, трудоемкие задачи.
Определение алгоритма для применения в области информатики нуждается в некотором уточнении. Во-первых, решение задач в информатике всегда связано с преобразованием информации, а значит, исходными данными и результатом работы алгоритма должна быть информация. Это может быть представлено в виде схемы.
Во-вторых, алгоритмы в информатике предназначены для реализации в виде компьютерных программ или для создания некоторой компьютерной технологии. Для выполнения алгоритма требуется конечный объем оперативной памяти и конечное время.
Основные требования, предъявляемые к алгоритмам:
Дискретность (прерывность): алгоритм должен представлять решение задачи в виде последовательности простых (или ранее определенных) этапов (шагов). Каждый шаг алгоритма формулируется в виде инструкций (команд).
Определенность (детерминированность; лат. determinate — определенность, точность): шаги (операции) алгоритма должны допускать однозначную трактовку и быть понятными для исполнителя алгоритма. Это свойство указывает на то, что любое действие в алгоритме должно быть строго определено и описано для каждого случая.
Массовость: алгоритм должен давать решение не только для конкретного набора значений, а для целого класса задач, который определяется диапазоном возможных исходных данных (область применимости алгоритма). Свойство массовости подразумевает использование переменных в качестве исходных данных алгоритма.
Результативность: алгоритм должен давать конкретный результат, т. е. должны быть рассмотрены все возможные ситуации и для каждой из них получен результат. Под результатом может пониматься и сообщение о том, что задача решения не имеет.
Конечность: количество шагов алгоритма должно быть конечным.
Эффективность: количество шагов и сами шаги алгоритма должны быть такими, чтобы решение могло быть найдено за конечное и, более того, приемлемое время.
Для оценки и сравнения алгоритмов существует много критериев. Чаще всего анализ алгоритма (или, как говорят, анализ сложности алгоритма) состоит в оценке временных затрат на решение задачи в зависимости от объема исходных данных. Используются также термины «временная сложность», «трудоемкость» алгоритма. Фактически эта оценка сводится к подсчету количества основных операций в алгоритме, поскольку каждая из них выполняется за заранее известное конечное время. Кроме временной сложности, должна оцениваться также емкостная сложность, т. е. увеличение затрат памяти в зависимости от размера исходных данных. Оценка сложности дает количественный критерий для сравнения алгоритмов, предназначенных для решения одной и той же задачи. Оптимальным (наилучшим) считается алгоритм, который невозможно значительно улучшить в плане временных и емкостных затрат.
Анализом сложности алгоритмов, исследованием классов задач, решаемых с помощью алгоритмов той или иной сложности, и многими другими теоретическими вопросами занимается специальная область информатики.
Алгоритмы можно представлять как некоторые структуры, состоящие из отдельных базовых элементов.
Логическая структура любого алгоритма может быть представлена комбинацией трех базовых структур:
- следование — образуется из последовательности действий, следующих одно за другим;
- ветвление (развилка) — обеспечивает в зависимости от результатов проверки условия (ДА или НЕТ) выбор одного из альтернативных путей алгоритма;
- цикл — обеспечивает многократное выполнение некоторой совокупности действий, которая называется телом цикла.
Для описания алгоритмов наиболее распространены следующие методы (языки):
Обычный язык. Изложение алгоритма ведется на обычном языке с разделением на последовательные шаги.
Блок-схемы. Графическое изображение алгоритма с помощью специальных значков-блоков.
Формальные алгоритмические языки (языки программирования). При записи алгоритмов используют строго определенный набор символов и составленных из них специальных зарезервированных слов. Имеют строгие правила построения языковых конструкций.
Псевдокод. Синтез алгоритмического и обычного языков. Элементы некоторого базового алгоритмического языка используются для строгой записи базовых структур алгоритма.
Словесный способ (запись на обычном языке) не имеет широкого распространения, т. к. таких описаний есть ряд недостатков:
- строго не формализуемы;
- достаточно многословны;
- могут допускать неоднозначность толкования отдельных предписаний;
- сложные задачи с анализом условий, с повторяющимися действиями трудно представляются в словесной или словесно-формульной форме.
Графический способ представления информации является более наглядным и компактным по сравнению со словесным. При графическом представлении алгоритм изображается в виде последовательности связанных между собой функциональных блоков, каждый из которых соответствует выполнению одного или нескольких действий. Такое графическое представление алгоритма называется блок-схемой. Определенному типу действия (ввод/вывод данных, проверка условия, вычисление выражения, начало и конец алгоритма и т. п.) соответствует определенная геометрическая фигура — блочный символ. Блоки соединяются между собой линиями переходов, которые определяют очередность выполнения действий.
Название символа | Графическое изображение | Комментарии |
Пуск/Останов (блоки начала и конца алгоритма) | Указание на начало или конец алгоритма | |
Ввод/Вывод данных (блоки ввода, вывода | Организация ввода/вывода в общем виде | |
Процесс (операторные блоки) | Выполнение вычислительного действия или последовательности действий (можно объединять в один блок), которые изменяют значение, форму представления или размещение данных | |
Условие (условный блок) | Выбор направления выполнения алгоритма. Если условие, записанное внутри ромба, выполняется, то управление передается по стрелке «да», в противном случае — по стрелке «нет». Таким образом, реализуется процесс изменения последовательности вычислений в зависимости от выполнения условия | |
Начало цикла с параметром | Используется для организации циклических конструкций с известным количеством итераций (повторений) и известным шагом изменения параметра цикла. Внутри блока для параметра цикла указываются через запятую его начальное значение, конечное значение и шаг изменения. Цикл, для которого неизвестно количество повторений, записывается с помощью условного и операторных блоков | |
Предопределенный процесс | Используется для указания обращений к вспомогательным алгоритмам, существующим автономно в виде некоторых самостоятельных модулей, и для обращения к библиотечным подпрограммам | |
Печать сообщений (документ) | Вывод результатов на печать |
При составлении блок-схемы необходимо проверять выполнение следующих условий:
- из каждого прямоугольника и параллелограмма (кроме конца алгоритма) должна выходить только одна стрелка;
- в каждый прямоугольник и параллелограмм (кроме начала алгоритма) должна входить хотя бы одна стрелка;
- в каждый ромб должна входить хотя бы одна стрелка, а выходить из него — две стрелки, помеченные словами «ДА» и «НЕТ».
Псевдокод занимает промежуточное положение между естественным языком и языками программирования. В псевдокоде не приняты строгие синтаксические правила для записи команд, что отличает формальные языки программирования. Однако в псевдокоде есть некоторые конструкции, которые присущи формальным языкам, что облегчает переход от записи алгоритма на псевдокоде к записи алгоритма на языке программирования. Псевдокоды бывают разные. Рассмотрим учебный (школьный) алгоритмический язык АЯ.
Алфавит учебного алгоритмического языка является открытым. В него могут быть введены любые понятные всем символы: русские и латинские буквы, знаки математических операций, знаки отношений, специальные знаки и т. д. Кроме алфавита, в алгоритмической нотации определяются служебные слова, которые являются неделимыми. Служебные слова обычно выделяются жирным шрифтом или подчеркиванием. К служебным словам относятся:
алг — заголовок алгоритма | нц — начало цикла | знач |
нач — начало алгоритма | кц — конец цикла | и |
кон — конец алгоритма | дано | или |
арг — аргумент | надо | не |
рез — результат | если | да |
цел — целый | то | нет |
сим — символьный | иначе | при |
лит — литерный | всё | выбор |
лог — логический | пока | утв |
вещ — вещественный | для | ввод |
таб — таблица | от | вывод |
длин — длина | до |
Общий вид записи алгоритма на псевдокоде:
алг — название алгоритма (аргументы и результаты)
дано — условие применимости алгоритма
надо — цель выполнения алгоритма
нач — описание промежуточных величин
последовательность команд (тело алгоритма)
Часть алгоритма от слова алг до слова нач называется заголовком, а часть, заключенная между словами нач и кон, — телом алгоритма (исполняемой частью алгоритма).
В предложении алг после названия алгоритма в круглых скобках указываются характеристики (арг, рез) и тип значения (цел, вещ, сим, лит или лог) всех входных (аргументы) и выходных (результаты) переменных. При описании массивов (таблиц) используется служебное слово таб, дополненное именем массива и граничными парами по каждому индексу элементов массива.
Команды учебного языка:
1. Оператор присваивания, который обозначается «:=» и служит для вычисления выражений, стоящих справа, и присваивания их значений переменным, указанным в левой части. Например, если переменная а имела значение 5, то после выполнения оператора присваивания а := а + 1, значение переменной а изменится на 6.
2. Операторы ввода/вывода:
ввод (список имен переменных)
вывод (список вывода)
Список вывода может содержать комментарии, которые заключаются в кавычки.
3. Оператор ветвления (с использованием команды если. то… иначе…всё; выбор);
4. Операторы цикла (с использованием команд для, пока, до).
Запись алгоритма на псевдокоде:
Здесь в предложениях дано и надо после знака «|» записаны комментарии. Комментарии можно помещать в конце любой строки, они существенно облегчают понимание алгоритма.
При записи алгоритма в словесной форме, в виде блок-схемы или на псевдокоде допускается произвольное изображение команд. Вместе с тем такая запись позволяет понять человеку суть дела и исполнить алгоритм. Однако алгоритм, предназначенный для исполнения на компьютере, должен быть записан на строго формализованном языке. Такой язык называется языком программирования, а запись алгоритма на этом языке — компьютерной программой.
Для решения одной и той же задачи можно предложить несколько алгоритмов. Алгоритмы составляются с ориентацией на определенного исполнителя алгоритма. У каждого исполнителя имеется свой конечный набор команд, которые для него понятны и исполняемы. Этот набор называется системой команд исполнителя. Пользуясь системой команд, исполнитель может выполнить алгоритм формально, не вникая в содержание поставленной задачи. От исполнителя требуется только строгое выполнение последовательности действий, предусмотренной алгоритмом. Таким образом, в общем случае алгоритм претерпевает изменения по стадиям:
- первая стадия — алгоритм должен быть представлен в форме, понятной человеку, который его разрабатывает;
- вторая стадия — алгоритм должен быть представлен в форме, понятной исполнителю алгоритма (вторая стадия может отсутствовать, если исполнять алгоритм будет сам разработчик).
Примеры решения задач
Пример 1. Исполнитель Утроитель может выполнить только две команды, которым присвоены номера:
Первая команда уменьшает число на 1, вторая — увеличивает его втрое.
Написать набор команд (не более пяти) получения из числа 3 числа 16. В ответе указать только номера команд.
Ответ: 13311
Пример 2. Имеется Исполнитель алгоритма, который может передвигаться по числовой оси.
Система команд Исполнителя алгоритма:
1. «Вперед N» (Исполнитель алгоритма делает шаг вперед на N единиц).
2. «Назад M» (Исполнитель алгоритма делает шаг назад на M единиц).
Переменные N и M могут принимать любые целые положительные значения. Известно, что Исполнитель алгоритма выполнил программу из 50 команд, в которой команд «Назад 2» на 12 больше, чем команд «Вперед 3». Других команд в программе не было. Какой одной командой можно заменить эту программу, чтобы Исполнитель алгоритма оказался в той же точке, что и после выполнения программы?
1. Найдем, сколько было команд «Вперед», а сколько «Назад». Учитывая, что общее количество команд равно 50 и что команд «Назад» на 12 больше, чем команд «Вперед». Получим уравнение: x + (x + 12) = 50, где x — количество команд «Вперед». Тогда общее количество команд «Вперед»: x = 19, а количество команд «Назад»: 19 + 12 = 31.
2. Будем вести отсчет от начала числовой оси. Выполнив 19 раз команду «Вперед 3», Исполнитель алгоритма оказался бы на отметке числовой оси 57 (19 * 3 = 57). После выполнения 31 раз команды «Назад 2» (31 * 2 = 62) он оказался бы на отметке –5 (57 – 62 = –5).
3. Все эти команды можно заменить одной — «Назад 5».
Ответ: команда«Назад 5».
Пример 3. Черепашка является исполнителем для создания графических объектов на рабочем поле. При движении Черепашка оставляет след в виде линии. Черепашка может исполнять следующие команды:
Название команды | Параметр | Действия исполнителя |
вп | Число шагов | Продвигается в направлении головы на указанное число шагов |
нд | Число шагов | Продвигается в направлении, противоположном направлению головы на указанное число шагов |
пр | Число градусов | Поворачивается направо относительно направления, заданного головой черепашки |
лв | Число градусов | Поворачивается налево относительно направления, заданного головой черепашки |
Для записи повторяющихся действий (цикла) используется команда Повтори. В этой команде два параметра: первый задает количество повторений (итераций), а второй — список команд которые должны повторяться (тело цикла); список заключается в квадратные скобки.
Записать для исполнителя Черепашка алгоритмы:
а) построения квадрата со стороной 100;
б) построения правильного шестиугольника со стороной 50.
в) построения изображения цифры 4, если голова Черепашки смотрит на север.
Ответ: а) Повтори 4 [вп 100 пр 90]; б) Повтори 6 [вп 50 пр 360/6]; в) вп 100; повтори [лв 135 вп 50].
Пример 4. Два игрока играют в следующую игру (это вариант восточной игры). Перед ними лежат три кучки камней, в первой из которых 2, во второй — 3, в третьей — 4 камня. У каждого игрока неограниченно много камней. Игроки ходят по очереди. Ход состоит в том, что игрок или удваивает число камней в одной из кучек, или добавляет по два камня в каждую из них. Выигрывает игрок, после хода которого либо в одной из кучек становится не менее 15 камней, либо общее число камней в трех кучках становится не менее 25. Кто выиграет при безошибочной игре обоих игроков — игрок, делающий первый ход, или игрок, делающий второй ход? Каким должен быть первый ход выигрывающего игрока? Ответ следует обосновать.
Решение. Удобнее всего составить таблицу возможных ходов обоих игроков. Заметим, что в каждом случае возможны всего четыре варианта хода. В таблице курсивом выделены случаи, которые сразу же приносят поражение игроку, делающему этот ход (например, когда камней в какой-либо кучке становится больше или равно 8, другой игрок непременно выигрывает следующим ходом, удваивая количество камней в этой кучке). Из таблицы видно, что при безошибочной игре обоих игроков первый всегда выиграет, если первым ходом сделает 4, 5, 6. У второго игрока в этом случае все ходы проигрышные.
1-й ход | 2-й ход | |||
Начало | 1-й игрок | 2-й игрок | 1-й игрок | 2-й игрок |
2,3,4 | 4,3,4 | 8,3,4 | выигрыш | |
4,6,4 | 8,6,4 | выигрыш | ||
4,12,4 | выигрыш | |||
4,6,8 | выигрыш | |||
6,8,6 | выигрыш | |||
4,3,8 | выигрыш | |||
6,5,6 | 12,5,6 | выигрыш | ||
6,10,6 | выигрыш | |||
6,5,12 | выигрыш | |||
8,7,8 | выигрыш | |||
2,6,4 | 4,6,4 | 8,6,4 | выигрыш | |
4,12,4 | выигрыш | |||
4,6,8 | выигрыш | |||
6,8,6 | выигрыш | |||
2,12,4 | выигрыш | |||
2,6,8 | выигрыш | |||
4,8,6 | выигрыш | |||
2,3,8 | выигрыш | |||
4,5,6 | 8,5,6 | выигрыш | ||
4,10,6 | выигрыш | |||
4,5,12 | выигрыш | |||
6,7,8 | выигрыш |
Пример 5. Записано 7 строк, каждая из которых имеет свой номер. В нулевой строке после номера записана цифра 001. Каждая последующая строка содержит два повторения предыдущей строки и добавленной в конец большой буквы латинского алфавита (первая строка — A, вторая строка — B и т. д.). Ниже приведены первые три строкиєтой записи (в скобках указан номер строки):
Какой символ находится в последней строке на 250-м месте (считая слева направо)?
Примечание. Первые семь букв латинского алфавита: A, B, C, D, E, F, G.
Решение. Найдем длину каждой строки. Длина каждой следующей строки в два раза больше длины предыдущей плюс один символ, длина строк составит:
(6) 127*2+1=255 символов.
Так как задано 7 строк, а нумерация начинается с нулевой строки, последняя строка имеет номер 6 и содержит 255 символов. Последний символ в строке — F. Предпоследний элемент — E, далее идут символы D, C, B, A, 1 (по правилу формирования строк). Таким образом, 250-й символ — это 1.
Пример 6. Имеется фрагмент алгоритма, записанный на учебном алгоритмическом языке:
n := Длина(а)
b := Извлечь(а, k)
нц для i от 7 до n – 1
с := Извлечь(а, i)
b := Склеить(b, с)
Здесь переменные а, b, с — строкового типа; переменные n, i — целые.
В алгоритме используются следующие функции:
Длина(х) — возвращает количество символов в строке х. Имеет тип «целое».
Извлечь(х, i) — возвращает i-й символ слева в строке х. Имеет строковый тип.
Склеить(х, у) — возвращает строку, в которой находятся все символы строки х, а затем все символы строки у. Имеет строковый тип.
Какое значение примет переменная b после выполнения этого фрагмента алгоритма, если переменная а имела значение «ВОСКРЕСЕНЬЕ»?
Решение. Находим общее число символов в строке а, получим, что n = 11.
Выполняя команду b := Извлечь(а, k) при k = 2, получим, что b примет значение «О«.
В цикле последовательно, начиная с 7-го символа строки а и заканчивая предпоследним (n – 1), извлекаем символ из строки а и присоединяем к строке b.
В результате получим слово «ОСЕНЬ» (символы с номерами 2 + 7 + 8 + 9 + 10).
Пример 7. Леонардо из Пизы, известный как Фибоначчи, был первым из великих математиков Европы позднего Средневековья. Числовой ряд, который называется его именем, получился в результате решения задачи о кроликах, которую Фибоначчи изложил в своей «Книге Абака», написанной в 1202 году. Он выглядит так:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144.
В этом ряду каждое следующее число, начиная с третьего, равно сумме двух предыдущих. Составить словесный алгоритм и блок-схему проверки принадлежности введенного числа n ряду Фибоначчи.
Решение. Словесный алгоритм:
- Ввести число n.
- Установить значение первых трех чисел Фибоначчи: 1, 1, 2 (сумма двух предыдущих чисел).
- Пока введенное число n больше очередного числа Фибоначчи, взять два последних числа Фибоначчи и получить из них новое число Фибоначчи.
- Если число Фибоначчи равно введенному n или было введено число n = 1, значит, что было введено число Фибоначчи, в противном случае — введенное число не является числом Фибоначчи.
Приведенный словесный алгоритм в пункте 1, 2 содержит начальные установки, в пункте 3 — цикл с условием, а пункт 4 — это вывод результата работы алгоритма.
F — текущее число ряда Фибоначчи;
F1 и F2 — два предыдущих числа ряда Фибоначчи для числа F;
n — число, для которого требуется определить, является ли оно числом из ряда Фибоначчи.
Использование основных алгоритмических конструкций: следование, ветвление, цикл
Логическая структура любого алгоритма может быть представлена комбинацией трех базовых структур: следование, ветвление, цикл.
Базовая структура СЛЕДОВАНИЕ указывает на то, что управление передается последовательно от одного действия к другому.
Учебный алгоритмический язык | Язык блок-схем |
действие 1 действие 2 … действие n |
Использование исключительно этой структуры возможно лишь для достаточно простых задач, ход решения которых не меняется в зависимости от конкретных исходных данных и состоит в последовательном выполнении определенных операций.
В качестве примера рассмотрим решение простой задачи.
Пример. Найти y(x) = x2 + 3x + 5, используя только операции умножения и сложения.
Решение. На рис. приводятся два алгоритма, реализующие решение поставленной задачи.
Порядок вычисления y(x) в первом случае — обычный, а во втором — (x + 3) x + 5. Обе формулы эквивалентны, но в первом случае для вычисления необходимо 2 умножения, 2 сложения и 3 переменных (x, y, z), а во втором используются 1 умножение, 2 сложения и 2 переменные (x, y).
Приведенный пример показывает, что даже простые задачи могут решаться с помощью различных вариантов алгоритмов.
Обратите внимание, как в блоке следования используется оператор присваивания.
Операция присваивания — важнейшая операция во всех языках программирования. С помощью присваивания переменные получают новые значения: в левой части инструкции ставится идентификатор величины, а в правой части — выражение, значение которого можно определить.
В операторах присваивания используется либо привычный знак равенства, либо сочетание двоеточия и знака равенства «:=». Поскольку знак присваивания — это не знак равенства, возможны записи вида Х := Х + 1 или А := А – В. Нужно учитывать, что оператор присваивания будет выполняться только в том случае, если значения всех переменных правой части уже определены.
Базовая структура ВЕТВЛЕНИЕ (РАЗВИЛКА) используется в случае, когда выполнение программы может измениться в зависимости от результата проверки условия и пойти двумя разными (альтернативными) путями. Другими словами, условие является некоторым высказыванием (предикатом) и может быть истинным или ложным (принимать значение TRUE или FALSE). Каждый из путей ведет к общему выходу, так что работа алгоритма будет продолжаться независимо от того, какой путь будет выбран.
Различают две структуры этого типа — полную и неполную. В случае полной структуры, если условие выполняется (является истинным), вслед за ним выполняется действие 1, иначе — действие 2. В случае неполной структуры, если условие выполняется (является истинным), то вслед за ним выполняется действие 1, иначе ничего не происходит.
Важную роль в операторах ветвления играют содержащиеся в них условия. В простейшем случае условиями служат отношения между величинами. Условия с одним отношением называют простыми условными выражениями, или простыми условиями. В некоторых задачах необходимы более сложные условия, состоящие из нескольких простых, например условие А < X < С, т. е. Х < А и (Х > C) (возможна запись (Х < А) and (Х > C)). Объединение нескольких простых условий в одно образует составное условное выражение, или составное условие. Составные условия образуются с помощью логических операторов not (отрицание), and (логическое И), or (логическое ИЛИ), хоr (исключающее ИЛИ).
Как определить значение переменной после выполнения алгоритма
Задания Д7 № 369
В алгоритме, записанном ниже, используются переменные a и b. Символ «:=» обозначает оператор присваивания, знаки «+», «-», «*» и «/» — соответственно операции сложения, вычитания, умножения и деления. Правила выполнения операций и порядок действий соответствуют правилам арифметики. Определите значение переменной a после выполнения алгоритма:
В ответе укажите одно целое число — значение переменной a.
b := 100 + a/b = 102
a := b/6*a = 17 · 10 = 170.
Задания Д7 № 389
В алгоритме, записанном ниже, используются переменные a и b. Символ «:=» обозначает оператор присваивания, знаки «+», «-», «*» и «/» — соответственно операции сложения, вычитания, умножения и деления. Правила выполнения операций и порядок действий соответствуют правилам арифметики. Определите значение переменной a после выполнения алгоритма:
Мы уже рассказывали про алгоритмы, их виды и свойства. В этой статье поговорим о том, как составить алгоритм решения какой-нибудь задачи, что и в какой последовательности следует написать.
При решении задач на алгоритмы немаловажным является умение использовать язык блок-схем. Процесс решения одной и той же задачи можно реализовать посредством применения алгоритмов разных классов, поэтому результат может отличаться и по времени счета, и по объему вычислений, и по сложности. Записывая алгоритмическую последовательность с помощью составления блок-схем, вы сможете сравнить решения, выбрав самый лучший algorithm. Также появляется возможность упростить способ решения, найти и устранить ошибку.
Можно ли отказаться от языка блок-схем при описании алгоритма и сразу составить его на языке программирования? Можно, однако существует риск выбора неоптимального решения и существенных потерь времени. Именно поэтому при данной постановке вопроса рекомендуется сначала составлять способ решения задачи путем создания блок-схемы, а уже потом переводить алгоритм на нужный язык программирования.
Когда речь идет о задаче высокого класса сложности, не обойтись без пошаговой реализации. Сначала продумывают общую структуру алгоритмической последовательности, то есть детальная проработка отдельных частей здесь не требуется. Модули, которые далее потребуют более детального рассмотрения, обводят пунктиром, чтобы потом продумать и детализировать.
В решении задачи на алгоритмы выделяют ряд этапов:
- Математическое описание.
- Определение входных/выходных данных.
- Разработка алгоритма по решению поставленной задачи.
Алгоритмические конструкции базовых классов
В теории программирования считают, что для того, чтобы составить запись любого, даже самого сложного алгори тма, хватит 3-х базовых структур. Речь идет о следующих алгоритмах:
- линейного класса;
- ветвления (речь идет о разветвляющихся алгоритмах);
- циклического класса.
Алгоритмы линейного класса
Образуются из последовательности действий, которые следуют одно за другим. К примеру, чтобы определить площадь прямоугольника, надо сначала задать длину 1-й стороны, потом — 2-й стороны, ну а в конце уже можно решать пример по формуле нахождения площади.
В качестве примера возьмем задание с разработкой алгоритма по вычислению гипотенузы прямоугольного треугольника, зная длины катетов a и b. Вспоминаем вышеописанные этапы разработки:
1. Математическое описание.
Математически задача решается по следующей формуле:
Здесь c является длиной гипотенузы, a, b – длинами катетов.
2. Определяем входные/выходные данные.
Входные данные — значения катетов a и b. Выходные — длина гипотенузы c.
3. Разработка алгоритма.
Алгоритмы ветвления
В таких алгоритмических последовательностях всегда существует какое-нибудь условие. В зависимости от того, соблюдается это условие либо нет, происходит выполнение той либо иной последовательности действий.
Для примера возьмем задание, постановка которого связана с разработкой алгоритма по вычислению наибольшего числа из 2-х чисел: x и y.
1. Математическое описание.
Из первых классов математики мы знаем, что когда x > y, то x больше y и наоборот, что является очевидными вещами. И если x = y, то числа равны.
2. Определяем входные/выходные данные.
Входные данные — это значения x и y. Выходными данными являются:
- самое большое число;
- любое из чисел в том случае, если они равны.
Таким образом, чтобы решить эту задачу на алгоритмы, надо знать значения переменных x и y.
3. Разработка.
В вышеуказанной схеме цифрами отмечены номера алгоритмических элементов, соответствующие номерам шагов словесного описания. Здесь есть 3 ветви решения:
- 1, 2, 3, 4, 8;
- 1, 2, 3, 5, 6, 8;
- 1, 2, 3, 5, 7, 8.
Алгоритмы циклического класса
В алгоритмах циклического класса некоторая часть действий из задания повторяется до тех пор, пока не нарушится заранее определенное условие. Выполнение условия проверяется в начале. Совокупность операций, которые выполняются многократно, — это тело цикла.
В алгоритмических последовательностях этого класса выделяют ряд понятий:
- параметр цикла (с изменением этой величины связано многократное выполнение цикла);
- начальное и конечное значения циклических параметров;
- шаг цикла (речь идет о значении, на которое меняется параметр при каждом повторе).
Работу циклов организуют по специальным правилам. Алгоритмическая последовательность циклического класса включает в себя и подготовку, и тело, и условия продолжения работы.
В подготовку входят действия, которые связаны с заданием исходных значений:
- начальные значения;
- конечные значения;
- шаг.
В тело цикла входят:
- многократно повторяющиеся операции по вычислению искомых величин;
- подготовка последующего значения параметра;
- подготовка иных значений, нужных для повторного выполнения действий непосредственно в теле.
В условии продолжения цикла определяют допустимость выполнения повторяемых операций. Когда циклический параметр равен либо превышает конечное значение, выполнение прекращается.
Рассмотрим задание, постановка которого связана с разработкой алгоритма вычисления суммы натуральных чисел в диапазоне от 1 до 100.
1. Математическое описание.
Сначала следует обозначить сумму натуральных чисел буквой S. В результате формулу вычисления суммы чисел от 1 до 100 можно записать следующим образом:
Здесь Xi является натуральным числом X c номером i. Этот номер меняется от 1 до n. А n=100 обозначает общее кол-во натуральных чисел.
2. Определяем входные/выходные данные.
Входные данные — это натуральные числа: 1, 2, 3, …, 99, 100.
Выходные данные представляют собой значение суммы членов последовательности натуральных чисел.
Относительно параметра цикла — речь идет о величине, определяющей число циклических повторений. В нашем задании i представляет собой номер натурального числа.
Подготовка цикла — задание начального и конечного значений циклического параметра. Тут надо пояснить следующее:
- начальное значение циклического параметра равняется единице,
- конечное значение — n,
- шаг равен 1.
Чтобы обеспечить корректность суммирования, надо, чтобы начальное значение суммы предварительно равнялось нулю.
Тело цикла. В теле станут выполняться как накопление значения суммы, так и вычисление последующего значения циклического параметра по формулам ниже:
- S=S+i;
- I=I+1.
Циклическое повторение должно осуществляться до тех пор, пока не добавится последний член последовательности натуральных чисел, то есть до тех пор, пока циклический параметр будет меньше либо равен окончательному значению параметра.
3. Разработка.
Вводим следующие обозначения: S – это сумма последовательности, i – это значение натурального числа.
Начальное циклическое значение i=1, конечное — i =100, шаг равен 1.
По материалам: https://www.turbopro.ru/index.php/osnovy-programmirovaniya/6836-algoritmy-razrabotka-algoritma-resheniya-zadachi.
Решение задач с использованием алгоритма бинарного поиска
Время на прочтение
4 мин
Количество просмотров 14K
Алгоритм бинарного (или двоичного) поиска — это один из базовых алгоритмов, который часто применяется при решении алгоритмических задач. На LeetCode на момент написания этой статьи порядка 190 задач в решении которых он используется (можно посмотреть здесь: https://leetcode.com/tag/binary-search/). Бинарный поиск разбирается во множестве статей, его идея достаточно несложная и интуитивно понятная. Однако алгоритм имеет некоторое количество «подводных камней». В этой заметке я хотел бы показать решение одной из задач с его помощью.
Для начала несколько слов о самом алгоритме. Задача, которую он решает, может быть сформулирована следующим образом: «найти в отсортированном массиве индекс элемента, значение которого соответствует заданному». Обычно массив отсортирован по возрастанию и в данной заметке мы будем предполагать, что это так и есть.
Основная идея алгоритма в том, чтобы проверить элемент в середине текущего среза массива (изначально берется весь массив). Если значение этого элемента меньше искомого, то необходимо проверить средний элемент в правой части массива, если больше, то в левой части массива. Мы будем повторять этот процесс, пока значения среднего элемента очередного среза не окажется равным искомому значению, либо больше не останется элементов (и тогда в массиве нет такого элемента). Более наглядно это видно на рисунке:
Сложность алгоритма бинарного поиска по времени выполнения O(logN) (так как мы уменьшаем срез массива на 2 на каждой итерации и проверяем только 1 элемент), и O(1) по памяти. Что касается реализации алгоритма, то обычно она выглядит следующим образом:
left, right = 0, len(array)-1
while left <= right do
middle = (left + right) / 2
if array[middle] > target then
right = middle - 1 // дальше будем проверять левую часть массива
else if array[middle] < target then
left = middle + 1 // дальше будем проверять правую часть массива
else
return middle // нашли элемент
end if
end while
return -1 // элемента нет в массиве
Код на Golang можете посмотреть здесь. Есть тесты, которые включают часть corner cases. На эти случаи стоит обратить внимание и, возможно, почитать про них, например на stackoverflow (найти их описание сейчас не составляет проблем, есть много материалов как на английском, так и на русском языках).
Давайте перейдем к решению задачки с LeetCode. Возьмем для примера задачу Find Target Indices After Sorting Array. Она довольно простая, уровня easy, что позволит нам сосредоточится на одном алгоритме, а точнее его небольшой модификации. Если кратко, то суть задачи состоит в том, что нам необходимо в отсортированном массиве найти индексы всех элементов, значения которых соответствуют заданному. Есть еще одно дополнительное условие: необходимо вернуть их в порядке возрастания значений элементов массива (то есть надо сначала массив отсортировать). Таким образом, очень похоже, что нам подойдет алгоритм бинарного поиска, однако он позволяет найти индекс только одного из элементов.
Важное замечание: приведенное здесь решение задачи не является оптимальным. Оно взято просто как удобный пример. Оптимальное решение за O(N) вы можете посмотреть в этом комментарии или здесь. Далее мы говорим о сложности после сортировки, которая сама по себе O(NlogN).
Наиболее простым способом для нас будет нахождение элемента (любого) с заданным значением, затем распространение вправо и влево от него, пока значение не станет отличным с обеих сторон или мы не достигнем конца и начала массива. Однако, такой подход может привести к O(N) сложности по времени, тогда как бинарный поиск имеет сложность O(logN). Здесь может быть полезным модификация бинарного поиска, которая вернет наиболее левый элемент массива с искомым значением. Реализация алгоритма выглядит так (код на Golang можете посмотреть здесь, тесты здесь):
left, right = 0, len(array)
while left < right do
middle = (left + right) / 2
if array[middle] < target then
left = middle + 1 // дальше будем проверять правую часть массива
else
right = middle // дальше будем проверять левую часть массива
end if
end while
return left
Отлично, теперь мы сможем найти первый индекс в массиве и просто добавить все элементы начиная от него и пока не встретится элемент с отличным значением. Алгоритм будет выглядеть следующим образом (код на Golang здесь, тесты здесь):
sort(array) // сортируем массив по возрастанию ( обычно за O(NlogN) )
// бинарный поиск наиболее левого элемента
left, right = 0, len(array)
while left < right do
middle = (left + right) / 2
if array[middle] < target then
left = middle + 1 // дальше будем проверять правую часть массива
else
right = middle // дальше будем проверять левую часть массива
end if
end while
// собираем индексы элементов в результирующий массив
result = []
while left < length(array) and array[left] == target do
append(result, left)
left = left + 1
end while
Казалось бы, что все неплохо, но мы все еще можем получить сложность по времени O(N) в том случае, если все элементы массива содержат искомое значение. И, что может быть менее очевидным, мы можем потерять скорость на многократном выделении памяти и копировании при append.
Дальнейшим развитием решения может быть поиск индекса наиболее правого элемента массива с искомым значением. Это еще одна небольшая модификация бинарного поиска. Вот так выглядит сам алгоритм (код на Golang здесь, тесты здесь):
left, right = 0, len(array)
while left < right do
middle = (left + right) / 2
if array[middle] > target then
right = middle // дальше будем проверять левую часть массива
else
left = middle + 1 // дальше будем проверять правую часть массива
end if
end while
return right
Теперь мы можем найти оба (самый левый и самый правый) элемента за время O(logN) каждый. Код на golang можете посмотреть здесь и тесты.
Проверка кода на LeetCode дает результаты, представленные в таблице. Она включает в себя еще и результаты решения сортировкой и линейным поиском, которое не было рассмотрено в силу его простоты (код можно посмотреть здесь)
Алгоритм |
Время выполнения |
Сортировка и линейный поиск |
8 ms |
Сортировка, бинарный поиск левого элемента и линейный поиск правого элемента |
7 ms |
Сортировка, бинарный поиск левого и правого элементов |
5 ms |
Бенчмарки на Golang с массивом из 30 одинаковых элементов, каждый из которых равен искомому дают следующие результаты.
Алгоритм |
Время выполнения |
Сортировка и линейный поиск |
717 — 1028 ns/op |
Сортировка, бинарный поиск левого элемента и линейный поиск правого элемента |
943 — 1418 ns/op |
Сортировка, бинарный поиск левого и правого элементов |
581 — 639 ns/op |
В качестве вывода хочется отметить, что знание модификаций алгоритма бинарного поиска может помочь в решении некоторых задач. Возможно оно не настолько важно и полезно, как знание исходного алгоритма, но может позволить нам сэкономить несколько миллисекунд.
Примеры составления блок-схемы алгоритма
Пример 1.
Составить схему алгоритма вычисления
значения :
Для
начала для построения блок –схемы
алгоритма опишем последовательность
действий, необходимых для решения данной
задачи:
-
начало
-
ввод
чисел a,b -
вычисление
х -
вычисление
z -
вывод
результата -
конец
Исходя из этого
составляем блок-схему алгоритма согласно
ГОСТ, используя соответствующие блоки.
Пример
2. Составить
схему алгоритма вычисления значения:
x=a+b
при a>b,
x=a*b,
при a<=b.
Пример 3. Составить схему алгоритма вычисления значения:
Для начала для
построения блок –схемы алгоритма опишем
последовательность действий, необходимых
для решения данной задачи:
Исходя из этого
составляем блок-схему алгоритма согласно
ГОСТ, используя соответствующие блоки.
Порядок выполнения работы
-
Изучить
теоретические сведения по теме
”Построение блок-схем алгоритмов”. -
Получить
у преподавателя индивидуальное задание
и нарисовать блок-схему алгоритма
согласно заданному варианту. -
Ответить
на контрольные вопросы. -
Сформулировать
выводы.
Контрольные вопросы
-
Основные
этапы решения задач на компьютере. -
Свойства алгоритма.
Типы вычислительных процессов. -
Блок схемы. Понятие
и правила построения. -
Примеры построения
блок-схем алгоритмов.
Задание
№1: Разработайте
алгоритм и представьте его в графическом
виде (блок-схемы) для следующих задач:
Задание 1.1
Вычислить значение выражения при
заданных исходных данных.
Указание.
Для упрощения выражений введите
промежуточные переменные.
Сравнить полученное
значение с указанным правильным
результатом.
1.
При
x = 14.26;
y = – 1.22;
z = 3.5ответs
= 0.749155.
2.
При
x = –4.5; y = 0.75;
z = –0.845ответs
= –3.23765.
3.
При
x = 3.74;
y=–0.825; z = 0.16ответs
= 1.05534.
4.
При
x = 0.4;
y = –0.875; z = –0.475ответ
s = 1.98727.
5.
При
x = –15.246; y = 4.642;
z = 21 ответ
s = –182.038.
6.
При
x = 16.55;
y = –2.75; z = 0.15
ответ s
= –40.6307.
7.
При
x = 0.1722; y = 6.33; z = 3.25ответ
s = –205.306.
8.
При
x = –2.235;
y = 2.23; z = 15.221
ответ s
= 39.3741.
9.
При
x = 1.825;
y = 18.225; z = –3.298ответ
s = 1.21308.
10.
При
x = 3.981;
y = –1.625;
z = 0.512
ответ s
= 1.26185.
11.
При
x = 6.251; y = 0.827; z = 25.001
ответ
s = 0.712122.
12.
При
x
= 3.251; y
= 0.325; z
= 0.466
ответ s
= 4.23655.
13.
.
При
x
= 17.421; y
= 10.365;
z
= 0.828
ответ s
= 0.330564.
14.
.
При
x
= 12.3;
y
= 15.4; z
= 0.252
ответ s
= 82.8256.
15.
.
При
x
= 2.444; y
= 0.869;
z
= –0.13
ответ s
= –0.498707.
Задание
1.2 Вычислить
значение выражения при заданных исходных
данных. Предусмотреть вывод информации
о выбранной ветви вычислений.
1. |
2. |
||
3. |
4. |
||
5. |
6. |
||
7. |
8. |
||
9. |
10. |
||
11. |
12. |
||
13. |
14. |
||
15. |
Задание
1.3 Вывести
на экран таблицу значений функции Y(x)
и ее разложения в ряд S(x)
для x,
изменяющегося от a
до b
с шагом h
= (b –
a)/10,
табл. 1.
Таблица 1.
№ |
a |
b |
S(x) |
n |
Y(x) |
1 |
0.1 |
1 |
160 |
||
2 |
0.1 |
1 |
100 |
||
1 |
2 |
3 |
4 |
5 |
6 |
3 |
0.1 |
1 |
120 |
||
4 |
0.1 |
1 |
80 |
||
5 |
0.1 |
1 |
140 |
||
6 |
0.1 |
1 |
80 |
||
7 |
0.1 |
1 |
120 |
||
8 |
0.1 |
1 |
100 |
||
9 |
0.1 |
1 |
140 |
||
10 |
0.1 |
0.5 |
150 |
||
11 |
0.1 |
1 |
100 |
||
12 |
0.1 |
1 |
80 |
||
13 |
–2 |
–0.1 |
160 |
||
14 |
0.2 |
0.8 |
120 |
||
15 |
0.1 |
0.8 |
180 |
Задание
№2:
Решите представленные ниже задачи,
указав номер задачи и полученный ответ.
Задача
2.1
Определите
результаты работы блок-схемы алгоритма
при
Задача
2.2
Какие
значения примут t и k в
результате работы фрагмента блок-схемы
алгоритма?
Задача
2.3.
Определите
значения
элементов
массива А2,
А4,
А6,
А8
при N=8
в результате работы фрагмента алгоритма
Практическая
раборта № 1
Построение
блок-схем алгоритмов(теория)
Предпочтительнее
до записи на алгоритмическом языке представить алгоритм в виде блок-схемы. Для
построения алгоритма в виде блок-схемы необходимо знать назначении каждого из
блоков. В таблице 1. приводятся типы блоков и их назначение.
Таблица 1
№ |
Блок |
Назначение |
1 |
|
Начало блок-схемы |
2 |
|
Ввод |
3 |
|
Процесс |
4 |
|
условие |
6 |
|
Цикл |
Основные
типы алгоритмов
Алгоритмизация выступает как набор
определенных практических приёмов, особых специфических навыков рационального
мышления в рамках заданных языковых средств. Алгоритмизация вычислений
предполагает решение задачи в виде последовательности действий, т.е. решение,
представленное в виде блок-схемы. Можно выделить типичные алгоритмы. К ним
относятся: линейные алгоритмы, разветвляющиеся алгоритмы, циклические
алгоритмы.
Линейные алгоритмы
Линейный алгоритм является наиболее
простым. В нём предполагается последовательное выполнение операций. В этом
алгоритме не предусмотрены проверки условий или повторений.
Пример: Вычислить функцию z=
(х-у)/x +y2.
Составить блок-схему вычисления функции по
линейному алгоритму. Значения переменных х, у могут быть
любые, кроме нуля, вводить их с клавиатуры.
Решение: Линейный алгоритм вычисления
функции задан в виде блок-схемы на рис.1. При выполнении линейного алгоритма
значения переменных вводятся с клавиатуры, подставляются в заданную функцию,
вычисляется результат, а затем выводится результат.
Рис.1. Линейный алгоритм
Назначение блоков в схеме на
рис.1:
·
Блок 1 в схеме служит в качестве
логического начала.
·
Блок 2 соответствует вводу данных.
·
Блок 3 представляет арифметическое
действие.
·
Блок 4 выводит результат.
·
Блок 5 в схеме служит в качестве
логического завершения схемы.
Алгоритмы ветвлений
Разветвляющийся алгоритм предполагает
проверку условий для выбора решения. Соответственно в алгоритме появятся две
ветви для каждого условия.
В
примере рассматривается разветвляющийся алгоритм, где в зависимости от условия
выбирается один из возможных вариантов решений. Алгоритм представляется в виде
блок-схемы.
Пример:
При выполнении условия x>0
вычисляется функция: z=
x+
y,
иначе, а именно, когда х=0 или x<0,
вычисляется функция: z=x2+y2.
Составить
блок-схему вычисления функции по алгоритму ветвления. Значения переменных х,
у могут быть любые, вводить их с клавиатуры.
Решение:
На рис.2 представлен разветвляющийся алгоритм, где в зависимости от условия
выполнится одна из веток. В блок-схеме появился новый блок 3, который проверяет
условие задачи. Остальные блоки знакомы из линейного алгоритма.
Рис.2. Алгоритм ветвления
Пример: Найти максимальное значение
из трёх различных целых чисел, введенных с клавиатуры. Составить блок-схему
решения задачи.
Решение: Данный алгоритм
предполагает проверку условия. Для этого выбирается любая из трёх переменных и
сравнивается с другими двумя. Если она больше, то поиск максимального числа
окончен. Если условие не выполняется, то сравниваются две оставшиеся
переменные. Одна из них будет максимальной. Блок-схема к этой задаче
представлена на рис 3.
Рис. 3. Блок-схема поиска максимума
Циклические алгоритмы
Циклический алгоритм предусматривает
повторение одной операции или нескольких операций в зависимости от условия
задачи.
Из
циклических алгоритмов выделяют два типа:
1)
с заданным количеством циклов или со
счётчиком циклов;
2)
количество циклов неизвестно.
Пример:
В цикле вычислить значение функции z=x*y при условии, что одна из
переменных x
меняется в каждом цикле на единицу, а другая переменная у не
меняется и может быть любым целым числом. В результате выполнения цикла при
начальном значении переменной х=1 можно получить таблицу умножения.
Количество циклов может быть любым. Составить блок-схему решения задачи.
Решение:
В примере количество циклов задаётся. Соответственно выбирается алгоритм
циклов первого типа. Алгоритм этой задачи приводится на рис. 4.
Во
втором блоке вводятся количество циклов n и любые целые числа х,
y.
В
блок-схеме появился новый блок 3, в котором переменная i считает
количество циклов, после каждого цикла увеличиваясь на единицу, пока счётчик не
будет равен i=n. При i=n будет выполнен последний
цикл.
В
третьем блоке указывается диапазон изменения счётчика цикла (от i =1 до i=n).
В
четвёртом блоке изменяются значения переменных: z, x.
В
пятом блоке выводится результат. Четвёртый и пятый блоки повторяются в каждом
цикле.
Рис.4 . Циклический алгоритм со счётчиком
циклов
Этот
тип циклических алгоритмов предпочтителен, если дано количеством циклов.
Если количество циклов неизвестно, то
блок-схемы циклических алгоритмов могут быть представлены в виде рисунков 5, 6.
Пример:
Вычислить у=у-x
пока y>x,
если y=30,
x=4.
Подсчитать количество выполненных циклов, конечное значение переменной у.
В цикле вывести значение переменной у, количество выполненных
циклов. Составить блок-схему решения задачи.
Решение:
В примере количество циклов неизвестно. Соответственно выбирается алгоритм
циклов второго типа. Алгоритм этой задачи приводится на рис. 5.
Условие
проверяется на входе в цикл. В теле цикла выполняется два блока:
1)
у=у-х; i=i+1;
2)
вывод значений переменных i,
y.
Цикл
выполняется до тех пор, пока выполняется условие y>x. При условии
равенства этих переменных у=х или y<x цикл заканчивается.
Алгоритм,
представленный на рис.5, называется циклический алгоритм с предусловием,
так как условие проверяется в начале цикла или на входе в цикл.
Рис.5. Блок-схема
циклического алгоритма с предусловием
Во втором блоке вводятся y=30,
x=4.
В
третьем блоке проверяется условие y>x
на входе в цикл. Если условие выполняется, то переход к блоку 4, иначе на блок
6.
В
четвёртом блоке вычисляется значение переменной у, подсчитывается
количество выполненных циклов i=i+1.
В
пятом блоке выводится результат:
·
значение переменной у,
·
количество выполненных циклов i.
Пример:
Составить блок-схему примера (рисунок 5), проверяя условие выхода из цикла.
В этом примере условие задачи не меняется, и результат выведется тот же, но
блок-схема будет другой.
Решение:
В этом случае проверяется условие на выход из цикла: y<=x. При
этом условии цикл не выполняется. Условие в блок-схеме следует перенести в
конец цикла, после вывода на печать. Цикл выполняется до тех пор, пока
выполняется условие y>x.
Алгоритм,
если условие перенести в конец цикла, называется алгоритмом цикла с
постусловием. Алгоритм этой задачи приводится на рис. 6.
Во
втором блоке вводятся y=30,
x=4.
В
третьем блоке вычисляется значение переменной у, подсчитывается
количество выполненных циклов i=i+1.
В
четвёртом блоке выводится результат:
·
значение переменной у,
·
количество выполненных циклов i.
В
пятом блоке проверяется условие y<=x
на выход из цикла. Если условие выполняется, то переход к блоку 6, иначе на
блок 3 и цикл повторяется.
Рис.6 . Алгоритм цикла с
постусловием
Индивидуальные задания к работе:
1.
Найти
результат работы алгоритма:
Входные данные по вариантам
№ |
A |
B |
C |
D |
1 |
0 |
-1 |
-2 |
-3 |
2 |
1 |
0 |
-1 |
-2 |
3 |
2 |
1 |
0 |
-1 |
4 |
3 |
2 |
1 |
0 |
5 |
4 |
3 |
2 |
1 |
6 |
5 |
4 |
3 |
2 |
7 |
6 |
5 |
4 |
3 |
8 |
7 |
6 |
5 |
4 |
9 |
-3 |
7 |
6 |
5 |
10 |
-4 |
-3 |
7 |
6 |
11 |
-5 |
-4 |
-3 |
7 |
12 |
-6 |
-5 |
-4 |
-3 |
13 |
-7 |
-6 |
-5 |
-4 |
14 |
9 |
-7 |
-6 |
-5 |
15 |
8 |
7 |
-7 |
-6 |
16 |
5 |
5 |
8 |
-7 |
17 |
5 |
2 |
4 |
5 |
2. При
заданном Х условие выполнется? Написать результат вычисления и ответ попадаем в
условие или нет.
Входные данные по вариантам
№ |
X1 |
X1 |
1 |
55 |
12 |
2 |
85 |
13 |
3 |
24 |
17 |
4 |
65 |
15 |
5 |
17 |
54 |
6 |
15 |
67 |
7 |
26 |
3 |
8 |
27 |
21 |
9 |
92 |
34 |
10 |
12 |
23 |
11 |
45 |
22 |
12 |
66 |
45 |
13 |
71 |
46 |
14 |
13 |
76 |
15 |
45 |
67 |
16 |
53 |
35 |
17 |
52 |
23 |
3. Написать
результат выполнения алгоритма с указанными входными данными
Входные данные по вариантам
№ |
S |
1 |
1,5 |
2 |
1,8 |
3 |
2,4 |
4 |
1,6 |
5 |
1,7 |
6 |
1,3 |
7 |
2,6 |
8 |
2,37 |
9 |
1,92 |
10 |
1,12 |
11 |
1,45 |
12 |
2,66 |
13 |
2,71 |
14 |
2,13 |
15 |
1,45 |
16 |
2,53 |
17 |
1,52 |
4. Написать
результат выполнения алгоритма с указанными входными данными
Входные данные по вариантам
№ |
X |
1 |
-1 |
2 |
0 |
3 |
1 |
4 |
2 |
5 |
3 |
6 |
4 |
7 |
5 |
8 |
6 |
9 |
7 |
10 |
-3 |
11 |
-4 |
12 |
-5 |
13 |
-6 |
14 |
-7 |
15 |
7 |
16 |
5 |
17 |
2 |
5. Построить
блок схему к задаче(по вариантам). Указать тип алгоритма, что дано и что нужно
найти.
№ |
Задача |
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 |
|
15 |
|
16 |
|
17 |
|
6. Построить
блок схему к задаче(по вариантам). Указать тип алгоритма, что дано и что нужно
найти.
№ |
Задача |
1 |
Дано двузначное число. |
2 |
Дано двузначное число. |
3 |
Дано двузначное число. |
4 |
Дано двузначное число. |
5 |
Дано двузначное число. |
6 |
Дано трехзначное число. |
7 |
Дано трехзначное число. |
8 |
Дано трехзначное число. |
9 |
Дано трехзначное число. |
10 |
Дано трехзначное число. |
11 |
Дано трехзначное число. |
12 |
Дано трехзначное число. |
13 |
Дано трехзначное число. |
14 |
Дано трехзначное число. |
15 |
Дано трехзначное число, |
16 |
Дано натуральное число |
17 |
Дано натуральное число |
7. Построить
блок схему к задаче(по вариантам). Указать тип алгоритма, что дано и что нужно
найти.
№ |
Задача |
1 |
Определить максимальное |
2 |
Известны два |
3 |
Известны две скорости: |
4 |
Даны радиус круга и |
5 |
Даны объемы и массы |
6 |
Известны сопротивления |
7 |
Даны вещественные числа |
8 |
Известны площади круга |
9 |
Известны площади круга |
10 |
Известны площади круга |
11 |
Известны площади круга |
12 |
Дано двузначное число. |
13 |
Дано двузначное число. |
14 |
Дано двузначное число. |
15 |
Дано двузначное число. Определить: |
16 |
Дано трехзначное число. |
17 |
Дано трехзначное число. |
8. Построить
блок схему к задаче(по вариантам). Указать тип алгоритма, что дано и что нужно
найти.
№ |
Задача |
1 |
Одна штука некоторого |
2 |
Напечатать таблицу |
3 |
Напечатать таблицу |
4 |
Напечатать таблицу |
5 |
Считая, что Земля — |
6 |
. Напечатать таблицу |
7 |
Напечатать таблицу |
8 |
Напечатать |
9 |
Напечатать таблицу |
10 |
Вывести |
11 |
. Вывести |
12 |
Вывести |
13 |
Вывести «столбиком» |
14 |
Напечатать таблицу |
15 |
Составить программу |
16 |
Напечатать таблицу |
17 |
Напечатать таблицу |
9. Построить
блок схему к задаче(по вариантам). Указать тип алгоритма, что дано и что нужно
найти.
№ |
Задача |
1 |
Даны числа а1, а2, |
2 |
Известна масса каждого |
3 |
. Известны оценки |
4 |
В ведомости указана |
5 |
Известна масса каждого |
6 |
Известно сопротивление |
7 |
Известно сопротивление |
8 |
Известны оценки по |
9 |
Известны оценки ученика |
10 |
Известны оценки по |
11 |
Известна масса каждого |
12 |
Известны оценки двух |
13 |
Известны результаты |
14 |
Известен возраст (в |
15 |
Известно количество |
16 |
Известен рост каждого |
17 |
Известны оценки по |
10. Построить
блок схему к задаче(по вариантам). Указать тип алгоритма, что дано и что нужно
найти.
№ |
Задача |
1 |
Дано натуральное число. |
2 |
Дано натуральное число. |
3 |
Дано натуральное число. |
4 |
Дано натуральное число. |
5 |
Дано натуральное число |
6 |
Дано натуральное число. |
7 |
Дано натуральное число. |
8 |
Дано натуральное число. |
9 |
Дано натуральное число. |
10 |
Дано натуральное число. |
11 |
Дано натуральное число. |
12 |
Дано натуральное число. |
13 |
Дано натуральное число. |
14 |
Дано натуральное число. |
15 |
Дано натуральное |
16 |
Дано натуральное число. |
17 |
Дано натуральное число. |