План урока:
Понятие циклического алгоритма
Программирование циклического алгоритма
Операторы цикла
Решение задач с использованием операторов while, repeat, for
Понятие циклического алгоритма
В жизни людей очень часто встречаются циклы. Будь то жизнь маленького ребёнка или взрослого человека, а то и пожилых людей. Эти циклы можно расписать как выполнение одних и тех же действий, пока выполняется определённое условие. К примеру, взрослый человек находится на работе до момента, когда наступит время его ухода. И так изо дня в день, однако, есть и исключения в виде выходных. В жизни детей можно привести такой пример, как обязанность каждый день ходить в школу до момента, когда наступят выходные или каникулы.
Циклические алгоритмы – это алгоритмы, в которых некоторая часть операций повторяется многократно.
Цикл – конструкция с оператором, который повторяется определённое или неопределённое заранее количество раз. Действия, выполняющиеся последовательно внутри цикла, называют телом цикла.
В разных средах программирования циклические конструкции могут быть реализованы по-разному, но неизменным остается главный признак, отличающий циклы от линейных операций и ветвлений – возможность перемещения по программе не только «сверху-вниз», но и «снизу-вверх», для возврата к уже выполненным ранее действиям.
Циклы разделяют на три типа в зависимости от метода организации повторений:
- Цикл, в котором задано условие окончания работы;
- Когда известно условие продолжения работы цикла;
- Когда известно число повторений цикла.
Программирование циклического алгоритма
Выбрав среду программирования Паскаль необходимо познакомиться с операторами, с помощью которых можно разработать программу с циклом. Ими являются while, repeat, for. Оператор while был разобран ещё на прошлом уроке, однако забывать о нём нельзя.
Цикл с предусловием
Цикл с предусловием реализует циклический алгоритм, записанный на языке программирования, с использованием определённого условия, истинность которого проверяется перед каждой итерацией цикла. Выполнение цикла прекращается, когда условие становится ложным.
Цикл с постусловием
Цикл с постусловием – это алгоритм циклической структуры, в котором проверка условия продолжения осуществляется после выполнения тела цикла.
Тело цикла с постусловием всегда выполняется как минимум один раз, независимо от истинности или ложности условия. Это его ключевое отличие от цикла с предусловием.
Такие циклы удобны, когда в условии используется результат выполнения тела цикла. Например, если мы хотим найти в тексте слово «стоп», мы должны сначала прочитать очередное слово, и только потом проверить, является ли оно искомым или следует продолжить поиск.
Цикл с заданным числом повторений
Этот вид цикла вместо логического условия выполнения использует параметр (счетчик) – специальную переменную, которая на каждом шаге цикла получает очередное значение из определенного диапазона. Цикл повторяется до тех пор, пока не будут перебраны все элементы диапазона. Таким образом, определяя диапазон, мы определяем заранее заданное число повторений.
Операторы цикла
Для программирования циклических алгоритмов и корректного выполнения программ с их использованием, необходимо знать операторы цикла. Чаще всего, в языке Паскаль используют операторы цикла: for, repeat и while. Разберем их подробнее.
Оператор while
Оператор while используется, когда нужно создать цикл с предусловием. Его схема в циклическом алгоритме выглядит следующим образом:
Если переводить его дословно, то можно сказать, что он работает по принципу «пока <условие> выполнять действие <оператор 1>», а заканчивается при переходе программы на слово end. Перед выполнением операторов внутри цикла условие обязательно проверяется и уже дальше, в зависимости от его истинности, программа либо выполняет тело цикла, либо переходит к последующим операторам.
Решение задач с использованием оператора while
Для более чёткого понимания решения задач нужно разобрать циклические алгоритмы, примеры которых приведены в решениях.
Задача 1. На вход подаются целые числа. До тех пор, пока не будет введено число, которое больше 17, программа должна вывести сумму полученного числа и числа 8. Когда вводимое число будет больше 17, то после выполнения программы цикл завершается.
Решение.
Шаг 1. Для начала необходимо дать программе название.
Шаг 2. Учитывая, что на вход подаётся целое число, указать тип данных, в данном случае – integer.
Шаг 3. Запись командного блока. Нужно написать слово, обозначающее начало, begin.
Шаг 4. Нужно дать переменной a значение 1, чтобы цикл начался автоматически.
Шаг 5. Запись цикла. Поскольку известно условие окончания работы, для этой задачи необходимо написать «пока a меньше или равно 17» и сделать переход к последующим операторам путём написания составного цикла.
Шаг 6. Первоначальный вывод программы. Необходимо написать то, что программа будет выдавать в первую очередь. В данном случае, она будет запрашивать целое число, запрос так и пишется: «Введите целое число: » .
Шаг 7. Запись необходимых операторов. Используя оператор readln программа считывает данные и переводит курсор на новую строку. Далее она производит операции над поступившими данными.
Шаг 8. Запись суммы. Исходя из условия задачи необходимо сделать так, чтобы программа выводила сумму входящего числа и числа 8. Осуществить это можно используя оператор writeln.
Шаг 9. Запись вывода программы после цикла. После того, как программа выполнит свою работу в цикле, необходимо показать, что она из него вышла. Можно просто попрощаться, как в данном случае.
Шаг 10. Проверка правильности записи алгоритма. В конце программного блока, после слова end нельзя забывать точку, её обязательно нужно поставить.
Оператор repeat
Оператор цикла repeat until используется для создания циклического алгоритма с постусловием. Его схема выглядит так:
Дословно оператор Паскаля repeat можно перевести как «повторяй <оператор 1>, до <условие>». В зависимости от истинности условия, либо происходит переход на повторение «оператора 1», либо осуществляется выход из цикла к последующим операторам.
Оператор repeat имеет два важных отличия от оператора while:
- в операторе repeat сначала выполняется тело, а затем проверяется условие;
- в операторе repeat прописывается условие завершения цикла, тогда как в операторе while – условие его продолжения.
Решение задач с использованием оператора repeat
Задача 1. Придумать алгоритм и написать по нему программу, результатом выполнения которой будет вывод последовательности натуральных чисел от 1 до введенного пользователем числа.
Решение.
Шаг 1. Название программы. В данном случае – «задача 1».
Шаг 2. Учитывая, что на вход подаются целые числа, требуется указать тип данных – integer.
Шаг 3. Командный блок. Запись начального слова begin.
Шаг 4. Вывод запроса программы. Поскольку программе необходимо целое число, нужно попросить пользователя ввести его. Осуществляется это с помощью процедуры writeln и текста «Введите целое число, которое больше 1: ».
Шаг 5. Необходимо присвоить переменной i значение 1 для того, чтобы последовательность начиналась с натурального числа.
Шаг 6. Запись цикла. Учитывая, что используется цикл с постусловием, необходимо сначала записать оператор, который будет повторяться, затем увеличить i на 1, чтобы образовывалась последовательность, и уже после этого прописать условие повторения. В данной задаче цикл перестаёт повторяться тогда, когда переменная i принимает значение больше введённого числа, которое является последним членом последовательности.
Шаг 7. Проверка программы на правильность в выводе. В результате своей работы программа должна вывести последовательность натуральных чисел от 1 до n, через пробел.
Оператор for
Используя оператор for можно задать нужное количество повторений одних и тех же действий. По-другому его называют оператором циклов с известным числом повторений. Он имеет два соединительных слова – это to и downto. Различие между ними в том, что при использовании первого к предыдущему значению переменной цикла прибавляется единица, а при написании второго – вычитается единица. Схемы оператора имеют следующий вид:
Дословно его можно перевести как «для переменной в значении от начального к конечному выполнять <оператор 1> ».
Решение задач с использованием оператора for
Рассмотреть пример с оператором for можно при написании короткого алгоритма для следующей задачи.
Задача 1. Напишите на одном из языков программирование алгоритм, который выводит квадраты чисел от 1 до 10.
Решение.
Шаг 1. Необходимо дать программе название.
Шаг 2. Поскольку на вход числа не подаются, тип указывается в зависимости от данных, которые изначально находятся в программе. В данном случае – это целые числа.
Шаг 3. Запись блока с командами алгоритма.
Шаг 4. Перебор последовательности чисел осуществляется в цикле for, в котором счетчик i пробегает значения от 1 до 10, а расчет и вывод квадратов осуществляется в процедуре write.
Решение задач с использованием операторов while, repeat, for
Задача 1 Разработать алгоритм программы, которая выведет таблицу умножения чисел от 1 до 10 на 9.
Решение
Для решения можно написать два вида кода. Однако, этапы разработки программы, задачи, которые ей необходимо выполнить, очень похожи на прошлые примеры, и она ничем не отличается от решения обычной задачи. Поскольку различие в этих двух кодах лишь в использованном операторе while и for, то рассматривать их по-отдельности нет смысла. Последовательность написания первого кода выглядит так:
Шаг 1. Нужно назвать программу.
Шаг 2. Так как пользователь не вводит никаких данных, то их можно ввести в сам код программы. Тип используемых данных в данном случае – это integer.
Шаг 3. Написание команд. Изначально нужно сделать так, чтобы программа вывела название того, для чего она предназначена. В данной задаче это «Таблица умножения на 9».
Шаг 4. Запись цикла for. С помощью него программа будет последовательно умножать числа от 1 до 10 на 9 и составлять таблицу умножения путём вывода каждого значения по схеме «9x, i, =, p», где i – умножаемое на 9 число, p – результат произведения 9 и i.
Шаг 6. Программа завершает свою работу. Необходимо проверить правильность выведенных данных и, если это необходимо, поправить код для более корректной работы.
В этой статье будет рассмотрена работа циклического алгоритма — что это, как он работает, какие виды существуют. Также будут рассмотрены примеры циклических алгоритмов в разных языках программирования.
Прежде чем приступить к основной теме статьи, следует прояснить терминологию вопроса и рассмотреть основные определения:
— цикл — вид управляющей конструкции в языках программирования. Он позволяет организовать многократное исполнение определённого набора инструкций (последовательность действий, при котором выполняется тело цикла);
— тело цикла — последовательность инструкций, обеспечивающая их многократное исполнение;
— итерация — однократное исполнение тела цикла;
— условие выхода (условие окончания) — выражение, которое определяет, станет ли в очередной раз выполняться итерация либо произойдёт завершение цикла;
— счётчик цикла — переменная, которая сохраняет номер итерации.
Счётчик не обязательно должен содержаться в цикле и счётчик совсем не обязательно должен быть один, то есть условие выхода порой зависит от нескольких изменяемых переменных. Вдобавок к этому, условие выхода иногда зависит от внешних условий (как пример — наступление определённого времени).
Работа любого цикла вне зависимости от его вида включает в себя:
— первоначальную инициализацию циклических переменных;
— проверку условия выхода из цикла;
— выполнение тела;
— обновление циклической переменной на каждой итерации.
Многие языки программирования предоставляют разработчику средства, обеспечивающие досрочное завершение цикла (выход из него вне зависимости от истинности условия выхода).
Виды циклических алгоритмов
Безусловные циклы
В некоторых программах и линейных алгоритмах на компьютерах выход из циклов не предусмотрен логикой. Эти циклы называются безусловными (другое название — бесконечные). При написании таких алгоритмов для решения поставленных задач специальных синтаксических средств не используют (они часто и не предусмотрены). На практике вполне достаточно конструкций, которые предназначены для формирования обычных (условных) циклов. Чтобы обеспечить бесконечное повторение, проверка условия или исключается (LOOP…END LOOP, язык программирования Ада), или заменяется константным значением (while true do …, Pascal).
Теперь следует рассмотреть группу циклов с условием.
Циклический алгоритм с предусловием
При наличии предусловия цикл выполняется до тех пор, пока истинно определённое условие, которое указано перед началом. Данное условие проверяется ещё до выполнения тела, в результате чего тело алгоритма может вообще ни разу не выполнится (пример такой ситуации с нулевым количеством итераций — условие изначально ложно). Что касается применения и реализации, то во многих процедурных языках программирования такой алгоритм реализуется с помощью оператора while.
Циклический алгоритм с постусловием
В данном случае проверка условия происходит уже после выполнения тела. Это означает, что тело цикла хотя бы раз, да выполнится. В Pascal такой алгоритм реализуется посредством оператора repeat..until, в языке программирования Си — с помощью do…while.
В зависимости от языка, трактовка условий бывает разной. В том же Pascal речь идёт об условии выхода (работа линейного алгоритма завершится, когда условие истинно; «цикл до»), а в вышеупомянутом Си можно говорить об условии продолжения (цикл завершится, когда условие ложно; «цикл пока»).
Циклический алгоритм с выходом из середины
Это самая общая форма условного линейного алгоритма. Синтаксически оформляется посредством 3-х конструкций:
— начало цикла,
— конец,
— команда выхода.
Конструкция начала обеспечивает маркировку программной точки, где начинается тело, конструкция конца — где тело заканчивается. Внутри циклического алгоритма присутствует команда, обеспечивающая выход — цикл оканчивается, а управление передаётся оператору, следующему за конструкцией конца.
Если сравнивать этот алгоритм с вышеупомянутыми, то он имеет особенность: часть тела, которая расположена после начала и до команды выхода, выполнится всегда, а часть тела, расположенная после команды выхода, при последней итерации не выполнится.
Чтобы организовать выход из середины, в некоторых языках программирования необходимо использовать специальные конструкции. В Ада это LOOP…END LOOP и команда EXIT либо EXIT WHEN:
Внутри этого алгоритма может находиться любое число команд выхода обоих типов — как EXIT WHEN (используется, если проверяется лишь условие выхода), так и просто EXIT (используется, если выход осуществляется в одной из вариаций сложного условного оператора).
В некоторых языках специальные конструкции для выхода из середины отсутствуют. В таких случаях смоделировать выход можно, используя любой условный цикл и оператор досрочного выхода (тот же break в Си) или goto — оператор безусловного перехода.
Циклический алгоритм cо счётчиком
При реализации этого алгоритма на компьютере определённая переменная меняет своё значение с некоторым шагом (она имеет заданное начальное и конечное значения), причём для каждого значения переменной тело цикла выполнится хотя бы раз. Во многих процедурных языках программирования алгоритм со счётчиком реализуется с помощью оператора for. В нём указывается счётчик (его ещё называют переменной цикла), определённое число проходов (граничное значение счётчика) и, в некоторых случаях, шаг изменения счётчика. В качестве примера — циклический алгоритм со счётчиком в языке программирования Оберон-2:
Хотите знать про алгоритмы больше? Записывайтесь на специализированные курсы в OTUS!
Источник — https://dic.academic.ru/dic.nsf/ruwiki/1188296.
Цель: изучение алгоритмической структуры циклы, создание моделей и алгоритмов для решения практических задач.
Ход урока
I. Актуализация знаний
- Повторить понятие алгоритма, основные конструкции алгоритмического языка.
- Уметь разрабатывать математическую модель, алгоритм и блок схему решения задачи.
- Иметь понятие о языках программирования и их назначении.
- Уметь работать в среде программирования.
- Знать структуры программы.
- Уметь записывать выражения, содержащие числовые и символьные величины.
- Знать структуры операторов и особенности их работы.
- Уметь применять операторы при написании программ с линейными и ветвящимися структурами.
- Уметь на компьютере создавать и запускать программы на отладку.
II. Теоретический материал урока
Большинство практических задач требует многократного повторения одних и тех же действий, т. е. повторного использования одного или нескольких операторов. (Презентация)
Пусть требуется ввести и обработать последовательность чисел. Если чисел всего пять, можно составить линейный алгоритм. Если их тысяча, записать линейный алгоритм можно, но очень утомительно и нерационально. Если количество чисел к моменту разработки алгоритма неизвестно, то линейный алгоритм принципиально невозможен.
Другой пример. Чтобы найти фамилию человека в списке, надо проверить первую фамилию списка, затем вторую, третью и т.д. до тех пор, пока не будет найдена нужная или не будет достигнут конец списка. Преодолеть подобные трудности можно с помощью циклов.
Циклом называется многократно исполняемый участок алгоритма (программы). Соответственно циклический алгоритм — это алгоритм, содержащий циклы.
Различают два типа циклов: с известным числом повторений и с неизвестным числом повторений. При этом в обоих случаях имеется в виду число повторений на стадии разработки алгоритма.
Существует 3 типа циклических структур:
- Цикл с предусловием;
- Цикл с послеусловием;
- Цикл с параметром;
Иначе данные структуры называют циклами типа «Пока», «До», «Для».
Графическая форма записи данных алгоритмических структур:
Цикл с предусловием (иначе цикл пока) имеет вид:
Форматы записи операторов алгоритма | Блок-схема | Форматы записи операторов на Паскале |
Пока (условие) нц серия команд кц |
while условие do begin серия команд; end; |
где
условие – выражение логического типа.
Цикл может не выполняться ни разу, если значение логического выражения сразу же оказывается ложь.
Серия команд, находящихся между begin и end, выполняются до тех пор, пока условие истинно.
Для того чтобы цикл завершился, необходимо, чтобы последовательность инструкций между BEGIN и END изменяла значение переменных, входящих в условие.
Цикл с постусловием (иначе цикл до) имеет вид:
Форматы записи операторов алгоритма | Блок-схема | Форматы записи операторов на Паскале |
В алгоритмическом языке нет команды которая могла бы описать данную структуру, но ее можно выразить с помощью других команд (Например, ветвления). | repeat серия команд until условие |
где
условие – выражение логического типа.
Обратите внимание:
Последовательность инструкций между repeat и until всегда будет выполнено хотя бы один раз;
Для того чтобы цикл завершился, необходимо, чтобы последовательность операторов между repeat и until изменяла значения переменных, входящих в выражение условие.
Инструкция repeat, как и инструкция while, используется в программе, если надо провести некоторые повторяющиеся вычисления (цикл), однако число повторов заранее не известно и определяется самим ходом вычисления.
Цикл с параметром (иначе цикл для) имеет вид:
Форматы записи операторов алгоритма | Блок-схема | Форматы записи операторов на Паскале |
Для i от а до b шаг h делай Нц Серия команд кц |
h = +1 for i:= a to b do begin серия команд end; h = -1 for i:= b downto a do begin Cерия команд; end; |
где
i – параметр цикла;
a – начальное значение цикла;
b – конечное значение цикла;
h – шаг изменения параметра.
Структура данного цикла иначе называют циклом i раз.
Эта команда выполняется таким образом: параметру i присваивается начальное значение а, сравнивается с конечным значением b и, если оно меньше или равно конечному значению b, выполняется серия команд. Параметру присваивается значение предыдущего, увеличенного на величину h – шага изменения параметра и вновь сравнивается с конечным значением b.
На языке программирования Паскаль шаг изменения параметра может быть равным одному или минус одному.
Если между begin и end находится только один оператор, то операторные скобки можно не писать. Это правило работает для цикла типа «Пока» и «Для».
Рассмотрим пример решения задач с использованием данных структур
Пример.
Вычислить произведение чисел от 1 до 5 используя различные варианты цикла
Математическая модель:
Р= 1· 2· 3· 4· 5=120
Составим алгоритм в виде блок-схемы.
Для проверки правильности алгоритма заполним трассировочную таблицу.
Шаг | Операция | Р | i | Проверка условия |
1 | P:=1 | 1 | ||
2 | i:=1; | 1 | 1 | |
3 | i<=5 P:=P*I i:=i+1 |
1 | 1 | 1<=5, да (истина) |
4 | i<=5 P:=P*I i:=i+1 |
2 | 2 | 2<=5, да (истина) |
5 | i<=5 P:=P*I i:=i+1 |
6 | 3 | 3<=5, да (истина) |
6 | i<=5 P:=P*I i:=i+1 |
24 | 4 | 4<=5, да (истина) |
7 | i<=5 P:=P*I i:=i+1 |
120 | 5 | 5<=5, да (истина) |
8 | i<=5 P:=P*I i:=i+1 |
6<=5, нет (ложь) |
Проверка условия происходит в несколько шагов: проверка условия и выполнение команд на одной из ветвей. Поэтому в трассировочной таблице записываются не команды алгоритма, а отдельные операции, выполняемые компьютером на каждом шаге.
Шаг первый: Р присваивается значение один.
Шаг второй: i присваивается значение один.
Шаг третий: при i равном единице проверяем условие один меньше или равен пяти, да, условие истинно, значит Р присваивается значение один умноженное на один, будет два. Для i: один плюс один, будет два.
Шаг четвертый: при i равном двум проверяем условие два меньше или равен пяти, да, условие истинно, значит Р присваивается значение 2 умноженное на один, будет 2. Для i: два плюс один, будет три.
Шаг пятый: при i равном трем проверяем условие три меньше или равен пяти, да, условие истинно, значит Р присваивается значение два умноженное на три, будет шесть. Для i: три плюс один, будет четыре.
Шаг шестой: при i равном четырем проверяем условие четыре меньше или равен пяти, да, условие истинно, значит Р присваивается значение шесть умноженное на четыре, будет двадцать четыре. Для i: четыре плюс один, будет пять.
Шаг седьмой: при i равном пяти проверяем условие пять меньше или равен пяти, да ,условие истинно, значит Р присваивается значение двадцать четыре умноженное на пять, будет сто двадцать. Для i: пять плюс один, будет шесть.
Шаг восьмой: при i равном шести проверяем условие шесть меньше или равен пяти, нет, условие ложно, тогда мы выходим из цикла, а в результате получаем последнее значение равное сто двадцати.
Program Pr1;
Var i: integer;
Begin
P:=1;
i:=1;
While i<=5 do
begin
P:=P*i;
i:=i+1;
end;
Write (‘P=’, P);
end.
Для цикла с постусловием построим блок-схему и трассировочную таблицу. (слайд16)
В результате получаем последнее значение равное сто двадцати на седьмом шаге
И для Цикла с параметром построим блок-схему и трассировочную таблицу. (слайд17)
В результате получаем последнее значение равное сто двадцати на шестом шаге
Задача:
Вывести на экран числа от 1 до 5 в:
- прямом порядке;
- обратном порядке.
Математическая модель:
- 1 2 3 4 5;
- 5 4 3 2 1.
Блок-схема и программа решения задачи представлена для чисел в прямом порядке и обратном порядке.
(слайд 21)
Запишем рассмотренные алгоритмы на языке программирования Паскаль.
(слайд 22)
III. Подведение итогов урока
И так мы рассмотрели следующие вопросы:
- Алгоритмическая структура цикл;
- Виды алгоритмических структур:
- Цикл с предусловием;
- Цикл с послеусловием;
- Цикл с параметром;
- Рассмотрели способы записи данных структур;
- Разобрали примеры решения задач с помощью этих структур.
17
Рис.9. Алгоритм вычисления корней уравнения X2+B*X+C=0
Задания для самостоятельного выполнения
Составить визуальные разветвленные алгоритмы для следующих задач.
1.Для двух чисел Х,У определить, являются ли они корнями уравнения А*Р^4+D*P^2+C=0
2.Если среди трех чисел А,В,С имеется хотя бы одно четное вычислить максимальное, иначе – минимальное 3.Ввести положительное А>=1. Найти наибольшее из выражений вида 1А и SIN(A).
4.Ввести два числа . Меньшее заменить полусуммой, а большее – удвоенным произведением. 5.Ввести три числа А,В,С . Удвоить каждое из них , если А>=В>=С, иначе поменять значения А и В.
6.Определить является ли точка с координатами X,Y точкой пересечения диагоналей квадрата со стороной R ,одна вершина которого расположена в начале координат.
7.* Определить значения функции в зависимости от значения аргумента
а*х2 , |
если х > 10 |
|
у= |
1/х , |
если –10 ≤ х ≤ 10 |
Sin(х) , если х < 10 |
7.ЦИКЛИЧЕСКИЕ АЛГОРИТМЫ
Циклические алгоритмы являются наиболее распространенным видом алгоритмов, в них предусматривается повторное выполнение определенного набора действий при выполнении некоторого условия. Такое повторное выполнение часто называют циклом.
Существуют два основных видов циклических алгоритмов: циклические алгоритмы с предусловием, циклические алгоритмы с постусловием. Они отличаются друг от друга местоположением условия выхода их цикла.
Цикл с предусловием начинается с проверки условия выхода из цикла. Это логическое выражение, например I<=6. Если оно истинно, то выполняются те действия, которые должны повторяться. В противном случае, если логическое выражение I<=6 ложно, то этот цикл прекращает свои действия.
Цикл с постусловием функционирует иначе. Сначала выполняется один раз те действия, которые подлежат повторению, затем проверяется логическое выражение , определяющее условие выхода из цикла, например, I>6
.Проверка его осуществляется тоже по-другому. Если условие выхода истинно, то цикл с постусловием прекращает свою работу, в противном случае – происходит повторение действий, указанных в цикле. Повторяющиеся действия в цикле
18
называются “телом цикла”.Разновидности циклов приведены на рис. 10а),б).
i=1 |
|||||||||||||||||
i=1 |
|||||||||||||||||
K:=K+1 |
|||||||||||||||||
I<=6 |
|||||||||||||||||
K |
|||||||||||||||||
i:=i+0,1 |
+ |
||||||||||||||||
K:=K+S
+
i>6 K
i:=i+1
а) Цикл с постусловием |
б) Цикл с предусловием |
Рис. 10. Виды циклических алгоритмов
Классическим примером циклического алгоритма служит алгоритм для вычисления степени числа Y=Xⁿ . Этот алгоритм может быть реализован на основе операции умножения. Табличное представление такого алгоритма, отражающего зависимость У от Х при изменении показателя степени n от 1 до 3, представлено в табл.3. В этой таблице показанны также реккурентные соотношения между У и Х, определяющие как на каждом шаге зависит значение У от значения Х и от значения У, вычисленного на предыдущем шаге.
Таблица 3.Реккурентные соотношения при вычислении Y=Xⁿ
n |
Y |
Реккурентные соотно- |
шения |
||
1 |
Y[1]=X |
Y=X |
2 |
Y[2]=X*X или |
Y=X*X или Y=Y*X |
Y[2]=Y[1]*X |
||
3 |
Y[3]=X*X*X или |
Y=X*X*X или Y=Y*X |
Y[3]=Y[2]*X |
||
Текстовая форма алгоритма
___________________
Начало
Присвоить Х = -15
+
ПОКА Х <= 15
1.Вычислить |
K:=K+1 |
|
Y= SIN(X) |
||
Y:=Y*x |
||
2.Вывести |
||
Y,X |
S:=S+Y
3.Вычислить X=X+1,5
КОНЕЦ
19 |
|
НАЧАЛО |
|
Ввод x, N |
|
S:=0 |
НАЧАЛО |
Y:=x |
|
K:=1 |
X:= -15 |
K<N |
x<=15 |
КОНЕЦ |
|
Y =sin (X) |
|
Вывод S |
|
Y, X |
|
КОНЕЦ |
|
X: =X+1,5 |
Рис.12. Алгоритм вычисления суммы ряда S=x+x^2+x^3+…+x^n
Пример 5.Пусть требуется составить алгоритм вычисления суммы ряда
S=x+x^2+x^3+…+x^n.
Решение. Исходные данные для алгоритма это переменные x и n. На каждом шаге будем вычислять очередной член суммы Y и прибавлять его к предыдущему значению суммы S.Для этого используем реккурентную формулу вычисления степени Х (см. таблицу 3) Y=Y*Х, тогда сумма ряда на каждом шаге итерации будет вычисляться по формуле S=S+Y. Количество итераций K изменяется от 1 до n и равно количеству членов ряда. Начальное значение суммы ряда S равно 0. На рис. 12 представлен циклический алгоритм с предусловием для вычисления заданной суммы ряда.
Пример 6. Требуется составить алгоритм получения на отрезке
[-15,15] множества значений функции Y= SIN(X) в виде таблицы значений (X,Y) при изменении аргумента Х по формуле X[k]=X[k-1]+h, где h=1,5.
Решение. Такие задачи относят к задачам табулирования функций. Из условия задачи определяем, что начальное значение отрезка табулирования X= -15, конечное значение – X=15. Процесс получения множества пар Х,Y) является итерационным, значит проектируемый алгоритм будет циклическим. Условие выхода из цикла Х>15. На рис. 13 представлен циклический алгоритм с предусловием вычисления табличного значения функ-
20
ции Y= SIN(X) на отрезке -15<X<15 при изменении Х на каждом шаге итерации на величину 1,5. Результатом выполнения алгоритма является циклический вывод множеств пар
(Y,X) .
Рис. 13. Циклический алгоритм табулирования функции Y =sin (X)
Задания для самостоятельного выполнения
Составить визуальные циклические алгоритмы для следующих задач.
1.Вычислить число в факториале Y=X!
2.Вычислить сумму ряда , общий член которого задан формулой An=(x*n)/n!.
3.При табулировании функции y=cos(x+a) на отрезке [1,10] c шагом h=1 определить сумму значений y , больших p.
4.Подсчитать количество цифр в целом числе Х.
5.Вычислить сумму значений функции у=x^2 на отрезке [1,5] c шагом 1.
6.* Найти минимальное значение функции Y=Sin(X)*X , на отрезке [C,D] с шагом 0.001. Реализовать цикл с постусловием.
7.Протабулировать функцию y=sin(x) на отрезке [1,5] с шагом h=0,5. Вывести предпоследнее положительное значение функции.
8.Определить постановку задачи и составить визуальный алгоритм для этой задачи, если табличное представление ее решения изображено ниже:
Условие N>0 |
S |
N |
|
0 |
125 |
||
125>0 |
да |
0+5=5 |
12 |
12>0 |
да |
5+2=7 |
1 |
1>0 |
да |
7+1=8 |
0 |
0>0 |
нет |
9.Составить визуальную и табличную формы алгоритма по его текстовому представлению, а также определить конечное значение S .
А) I=0; S=0; |
В) I=1; S=0; |
ПОКА I<3 |
ПОКА I >1 |
I=I+3 |
S=S+1/I |
S=S+I*I |
I=I-1 |
ВЫВОД S |
ВЫВОД S |
10. Составить визуальную и текстовую форму представления алгоритма, заданного в табличной форме.
21
0 |
||
1 |
2 |
0+1+2=3 |
3 |
3+1+3=7 |
|
2 |
2 |
7+2+2=11 |
3 |
11+2+3=16 |
11.Определить является ли данный фрагмент алгоритма циклом, если да, то какого вида и какое действие является телом цикла?
A) |
I=1 |
В) |
I =1 |
||||
I<=6 |
+ + |
|
+ |
||
K |
||
+ |
||
K:=K+S |
I := I +1 |
|
22
12.* Протабулировать функцию Y=tg(X), при изменении X на отрезке [A,B] с шагом K и определить количество точек разрыва(M) этой функции.
13.Определите местонахождение ошибок в алгоритмическом решении следующей задачи. Найти минимальное значение функции Y=A*X2+Sin(X)*X0,5 , для Х изменяющемся на отрезке [C,D] с шагом 0,01.
НАЧАЛО |
|
C, D |
|
X := C |
|
M := A*X2+SIN(X)*X 0. 5 |
|
Y := A*X2+SIN(X)*X 0. 5 |
|
Y <M |
Y=М |
C := Y |
|
Y, X |
|
X := X+0.001 |
|
X > D |
M |
КОНЕЦ |
23
8.АЛГОРИТМЫ ОБРАБОТКИ ПОСЛЕДОВАТЕЛЬНОСТЕЙ ЧИСЕЛ
Последовательность значений – это набор однотипных величин, которые вводятся и обрабатываются циклически. Примером последовательности целых чисел может быть следующий набор значений: (2,5,-4,10,1,0). Последовательности значений отличаются от массивов значений тем, что в памяти одновременно все значения последовательности не хранятся. Для обозначения значения последовательности используют одну переменную, в которую на каждом шаге итерации вводится очередное значение последовательности. Отличительной особенностью последовательности является также возможность содержания неопределенного или неизвестного заранее количества ее значений. В этом случае критерием окончания последовательности служит некоторое особое значение, например, ноль.
Пример 7. В числовой последовательности определить сумму положительных и произведение отрицательных чисел. Реализовать с помощью цикла с предусловием. Признак конца последовательности – значение 0. Решение. Обозначим за Х переменную, содержащую очередное значение последовательности, за S – сумму положительных значений , за Р – произведение отрицательных значений. Полученный алгоритм приведен на рис. 14. Условие
Рис.14. Алгоритм вычисления суммы положительных и произведения отрицательных значений числовой последовательности
для выбора вычислений Х>0. Для вычисления суммы значений воспользуемся реккурентной формулой S=S+X с начальным значением S=0, для вычисления произведения – реккурентной формулой P=P*X с начальным значением Р=1. Условие выхода из цикла неравенство Х<>0.
НАЧАЛО |
||
Ввод X |
||
P:=1 |
||
S:=0 |
||
X<>0 |
+ |
|
+ |
||
X>0 |
||
Вывод P, S |
P:=P*X |
S:=S+X |
КОНЕЦ
Ввод Х
Пример 8.Составить циклический алгоритм для определения в последовательности целых чисел количества четных чисел.
Решение. Обозначим за Х переменную, содержащую очередное значение последовательности, за K – количество четных значений (рис. 15). Условие для выбора четных значений Х mod 2=0 (остаток приделении Х
24
на 2 равен 0). Для вычисления количества значений воспользуемся реккурентной формулой К=К+1 с начальным значением К=0.
Рис. 15. Алгоритм определения количества четных чисел в последовательности значений
Задания для самостоятельного выполнения
Составить визуальные циклические алгоритмы для следующих задач обра-
НАЧАЛО
Ввод X
K=0
+
X<>0
K:=K+1
Вывод K
КОНЕЦ
Ввод Х
ботки последовательности значений.
1.В последовательности вещественных чисел подсчитать произведение чисел, кратных
3.
2.В последовательности чисел сравнить ,что больше сумма положительных или произведение отрицательных.
3.В последовательности чисел определить предпоследнее отрицательное число.(При решении введите дополнительную переменную для хранения предпоследнего отрицательного числа).
4.В последовательности целых положительных чисел определить
максимальное число (Рекомендуем реализовать такой алгоритм :
25 |
||||||
Вводим Х |
mах=Х |
|||||
Начало |
Цикл с постусловием |
|||||
а. Если элемент Х > max |
||||||
то max:=Х (значение этого элемента); |
||||||
б. Вводим новый элемент последовательности Х. |
||||||
K=1 |
Условие выхода из цикла Х=0 ) |
|||||
5. |
В последовательности целых чисел определить |
|||||
третье положительное число и подсчитать ко- |
||||||
Конец |
личество цифр в нем. |
|||||
K<=9 |
||||||
Ввод А(к) |
9.АЛГОРИТМЫ ОБРАБОТКИ |
|||||
ОДНОМЕРНЫХ ЧИСЛОВЫХ |
||||||
МАССИВОВ |
||||||
К=К+1 |
||||||
Под структурой данных типа массив |
||||||
понимают |
однородную структуру |
одно- |
||||
Рис. 16.Алгоритм ввода элементов |
типных |
данных, одновременно хранящихся |
||||
в |
последовательных ячейках оперативной |
|||||
памяти. Эта структура должна иметь имя и |
||||||
определять заданное количество данных (элементов). Однотипность данных |
||||||
определяет возможность использования циклических алгоритмов для |
обра- |
|||||
ботки всех элементов массива. |
Количество итераций цикла определяется |
|||||
количеством элементов массива Одновременное хранение в памяти всех эле- |
||||||
ментов массива позволяет решать |
большой |
набор задач, таких как поиск |
||||
элементов, упорядочение и изменение порядка следования элементов. |
||||||
Доступ |
к любому элементу массива осуществляется по его номеру ( |
|||||
индексу ). Поэтому для обращения |
к |
элементу массива используют |
||||
имя_массива(номер элемента), например, А(5). |
||||||
Массив называется одномерным , если для получения доступа к его |
||||||
элементам достаточно одной индексной переменной. |
||||||
Рассмотрим простой алгоритм ввода элементов одномерного числового |
||||||
массива A из 9 элементов. В этом циклическом алгоритме условие выхода из |
||||||
цикла определяется значением специальной |
||||||
переменной К, которая называется |
счетчиком элементов массива А |
|||||
(рис.16), эта же переменная К определяет количество итераций циклического |
||||||
алгоритма ввода элементов массива. На каждом шаге итерации переменная |
||||||
К(значение номера элемента массива А) изменяется на 1, то есть происходит |
||||||
переход к новому элементу массива.В дальнейшем, при рассмотрении |
||||||
алгоритмов обработки одномерных массивов в целях устранения дублирова- |
||||||
ния алгоритм ввода элементов массива будем заменять одним блоком, |
под- |
|||||
разумевая, что он реализуется по схеме, циклического алгоритма, представ- |
||||||
ленного на ри- |
сунке 16. |
26
Пример 9. Составить алгоритм определения в одномерном числовом массиве А из N элементов суммы положительных элементов.
Решение. Алгоритм представлен на рисунке 17. В этом алгоритме переменная К – является счетчиком элементов массива, S – сумма элементов массива, она вычисляется по реккурентной формуле S=S+A(K). Ввод количества и значений элементов массива осуществляется вначале в отдельном блоке ввода, который реализуется по схеме алгоритма ввода элементов массива, изображенного на рис.16.
+
Часто для проверки правильности работы алгоритмов на конкретных наборах данных используют таблицу трассировки. Эта таблица содержит столько столбцов, сколько переменных и условий в алгоритме, в ней мы вы-
полняем действия шаг за шагом от начала до конца алгоритма для конкретных наборов входных данных.НАЧАЛО
Пример 10. Составить алгоритм поиска |
элемента |
с максимальным значением в |
||||||||||||||||||||||||
М |
||||||||||||||||||||||||||
одномерном массиве А(1..n) и его таблицу трассировки |
для значений (3, 7, 0, 9). |
|||||||||||||||||||||||||
Решение. |
Введем обозначения K- текущий номер элемента, A[K] – текущее значение элемента массива, |
|||||||||||||||||||||||||
Ввод N и А( 1.. N) |
||||||||||||||||||||||||||
N=4 количество элементов одномерного массива, M- номер максимального элемента массива, A[M] – зна- |
||||||||||||||||||||||||||
чение максимального элемента массива. Основной идеей |
алгоритма |
является выполнение сравнения теку- |
||||||||||||||||||||||||
+ |
A[М], |
|||||||||||||||||||||||||
щего элемента массива A[K] и элемента с максимальным значением |
||||||||||||||||||||||||||
определенным на предыдущем |
A [K]>A[M] |
|||||||||||||||||||||||||
шаге итерации. |
По алгоритму |
НАЧАЛО |
||||||||||||||||||||||||
изображенному |
на рис.18 |
по- |
||||||||||||||||||||||||
лучено |
максимальное значе- |
|||||||||||||||||||||||||
ние для массива |
(3, 7, 0, |
9), |
N, |
A(N) |
||||||||||||||||||||||
процесс |
и правильный резуль- |
|||||||||||||||||||||||||
тат поиска которого показаны в |
||||||||||||||||||||||||||
таблице 4. |
+ |
|||||||||||||||||||||||||
K<=N K := 1 |
||||||||||||||||||||||||||
Вывод А[M] |
||
K <= N |
Вывод S |
|
КОНЕЦ |
||
+ |
КОНЕЦ |
|
A(K) > 0 |
+ |
|
S := S+A(k) |
||
K := K + 1
Рис. 17. Алгоритм вычисления суммы положительных элементов
27
Рис.18. Алгоритм поиска максимального значения в массиве
Таблица 4. Таблица трассировки алгоритма примера 10.
Номер элемен- |
Значение эле- |
Номер |
макси- |
Значение |
мак- |
Проверка |
|
та массива К |
мента А (К) |
мального М |
симальнго А(М) |
А(К)>А(М) |
|||
1 |
3 |
1 |
3 |
Нет |
|||
2 |
7 |
1 |
2 |
3 |
7 |
да |
|
3 |
0 |
2 |
7 |
нет |
|||
4 |
9 |
2 |
4 |
7 |
9 |
да |
Рассмотрим несколько более сложных алгоритмов, в которых осуществляется изменение порядка следования элементов в одномерном массиве . К таким алгоритмам относят алгоритмы с перестановкой элементов местами, алгоритмы удаления некоторых элементов или циклического переноса некоторых элементов в начало или конец массива.
Основным требованием при составлении алгоритмов обработки массивов является неиспользование дополнительных массивов.
Чтобы точнее уяснить постановку задачи следует сначала рассмотреть частные решения для конкретных наборов входных данных (провести анализ) , затем обобщить полученное решение и определить набор решаемых задач. Составив визуальный алгоритм, его следует проверить на различных наборах исходных данных. Эти наборы исходных данных требуется подбирать таким образом, чтобы при заполнении таблиц трассировок проверить все пути вычислений данного алгоритма от начальной вершины до конечной.
Пример 11.Составить алгоритм решения и таблицу трассировки следующей задачи. В одномерном массиве поменять местами 2-ой нулевой элемент и последний положительный элемент. Применить нисходящее проектирование алгоритма.
Решение. Пусть одномерный массив содержит 9 элементов: (5, 0, 4, -3, -7, 0, -2, -4, 0). Среди этих элементов имеются три нулевых значения, отрицательные и положительные значения. Второй нулевой элемент имеет порядковый номер 6, а последний положительный элемент – номер 3, его значение равно 4. Если поменять местами 2-ой нулевой элемент и последний положительный в исходном массиве (5, 0, 4, -3, -7, 0, -2, -4, 0)
то получим новый массив, в котором изменен порядок следования элементов 5, 0, 0, -3, -7, 4, -2, -4, 0 . Основными операциями алгоритма будут: поиск второго нулевого элемента массива, поиск по-
следнего положительного элемента массива и перестановка найденных элементов. Отметим, что для пере-
НАЧАЛО |
|||||||||
Перестановка эле- |
|||||||||
Ввод мас- |
ментов в массиве |
||||||||
Определение номера |
|||||||||
сива |
|||||||||
последнего |
|||||||||
элемента >0 |
|||||||||
Вывод Определение номера массива второго нулевого
элемента
КОНЕЦ
становки элементов необходимо знать номера переставляемых элементов. На рис. 19 изображен обобщенный алгоритм решения задачи, который в дальнейшем будет детализирован.
28
Рис. 19. Обобщенный алгоритм к примеру 11
Ввод количества и значений элементов массива осуществляется вначале в отдельном блоке ввода, который реализуется по схеме алгоритма ввода элементов массива, изображенного на рис.16.
Поиск второго нулевого элемента массива будем осуществлять в цикле, проверяя значение очередного элемента на 0. Если очередной элемент равен 0, то для подсчета количества таких элементов используем реккурентную формулу M=M+1. В тот момент времени, когда значение М=2, нам необходимо запомнить номер текущего элемента массива, так как это и есть искомый второй положительный элемент исходного массива. На рис.20 приведен фрагмент алгоритма, реализующего поиск второго нулевого элемента в некотором массиве А из N элементов.
Рис. 20. Фрагмент алгоритма поиска второго нулевого элемента в массиве А, состоящем из N элементов. Здесь К- номер очередного элемента, А(К) – значение
K:=1 , m=0 |
||
A [K]=0 |
+ |
m=2 |
m:=m+1 |
P:=K
K:=K+1
+
K=N
очередного элемента, m -количество нулевых элементов, Р- номер второго нулевого элемента в массиве
Поиск последнего положительного элемента массива будем осуществлять аналогично в цикле, запоминая номер очередного элемента, значение которого больше нуля, в дополнительной переменной S. Учитывая тот факт, что после того как будут просмотрены и проверены на положительность все элементы массива в переменной S будет храниться номер последнего положительного элемента массива. На рис. 21 представлен фрагмент алгоритма поиска последнего положительного элемента в массиве А.
Рис. 21. Фрагмент алгоритма поиска последнего положительного элемента
Рассмотрим фрагменты алгоритма, приведенные на рис. 20 и 21. Можно заметить, что оба этих фрагмента выполняют поиск под управлением цикла, с одинаковым числом повторений, равным количеству элементов исходного массива N. Поэтому в итоговом алгоритме решения задачи примера 11 вместо композиции этих двух фрагментов в виде двух последовательных циклов можно использовать параллельное выполнение операций поиска под управлением одного цикла, который приведен на рис. 22.
+
S=K
K:=K+1
+
29
Рис 22. Алгоритм поиска второго нулевого и последнего положительного элементов массива А.
НАЧАЛО |
||
Ввод N и элемен- |
||
Q: =A [P] |
A [P]: =A [S] |
|
тов А(1.. N) |
||
K:=1, m=0 |
A [S]: =Q |
|
+ |
||
A [K]<0 |
||
A [K]=0 |
+ |
m=2 |
m:=m+1 |
||
+ |
||
S:=K |
P:=K |
|
K=N |
+ |
|
Перестановка |
||
K:=K+1 |
элементов массива |
|
Вывод нового |
||
массива A[1..N] |
КОНЕЦ
Напомним, что исходный одномерный массив содержит 9 элементов: (5, 0, 4, -3, -7, 0, -2, -4, 0).По условию задачи необходимо поменять местами 2-ой нулевой элемент и последний положительный элемент.
Так как задачи поиска необходимых для перестановки элементов алгоритмически решены (рис. 22), то рассмотрим задачу перестановки элементовДля реализации перестановки найденных элементов достаточно воспользоваться управляющей структурой следования. Для того, чтобы во время перестановки не потерять переставляемые значения используем дополнительную переменную Q, временно хранящую одно из переставляемых значений элемента массива, в частности второе нулевое значение.На рис. 23 представлен универсальный алгоритм перестановки двух элементов одномерного массива, имеющих порядковые номера P и
S .
30
Рис. 23.Фрагмент перестановки двух элементов массива, с номерами S и P
Подводя итог для алгоритмического решения примера 11, приведем на рис. 24 алгоритм для вывода элементов преобразованного массива после перестановки найденных элементов.
Рис. 24. Алгоритм вывода элементов массива
Таким образом, процесс проектирование первоначального алгоритма перестановки второго нулевого элемента и последнего положительного элемента в одномерном массиве завершен. Полученный алгоритм представлен на рис.25. Следует заметить, что целью решения примера 11 было показать процесс нисходящего проектирования алгоритма ” сверху-вниз ” с использованием декомпозиции и метода структурной алгоритмизации. Отметим, что с целью упрощения в полученном алгоритме не рассматриваются ситуации, когда в составе элементов массива отсутствуют положительные значения или нулевые значения в количестве большем одного.
НАЧАЛО |
||
Ввод N и элемен- |
||
тов А(1.. N) |
||
K=1, m=0 |
||
A [K]<0 |
||
A [K]=0 |
m:=m+1 |
m=2 |
S:=K |
P:=K |
|
Начало |
||
Q: =A [P] |
A [P]: =A [S] |
|
K=1 |
A [S]: =Q |
|
K:=K+1 |
||
K<=9 |
Конец |
Вывод нового |
массива A[1..N] |
||
+ |
||
Вывод |
КОНЕЦ |
|
А к |
||
К=К+1 |
Рис.25. Алгоритм перестановки второго нулевого и последнего положительного элемента в одномерном массиве
31
Для проверки правильности работы полученного алгоритма составим таблицу трассировки для одномерного массива из 9 элементов: (5, 0, 4, -3, -7, 0, -2, -4, 0), приведенных в примере 11. Напомним, что заполнение таблицы происходит по строкам. Считаем, что все начальные значения числовых переменных равны 0. В таблице 5 выполнена трассировка фрагмента поиска второго нулевого и последнего положительного элементов (их номеров), а в таблице 6 выполнена трассировка следующего фрагмента алгоритма по перестановке в массиве найденных элементов, где K- текущий номер элемента, A[K] – текущее значение элемента массива, М- количество нулей, обнаруженных в массиве при анализе очередного элемента, P- номер второго нулевого элемента массива, S- номер последнего положительного элемента массива, A[S] – значение последнего положительного элемента массива, A[P] – значение второго нулевого элемента массива.
Таблица 5.Таблица трассировки операций |
Таблица 6. Таблица трассировки |
поиска второго нулевого элемента и |
перестановки найденных элемен- |
последнего положительного |
тов массива |
К |
Входной мас- |
M |
М=2 |
Р |
S |
сив А(К) |
|||||
1 |
5 |
0 |
Нет |
1 |
|
2 |
0 |
1 |
Нет |
||
3 |
4 |
3 |
|||
4 |
-3 |
||||
5 |
-7 |
||||
6 |
0 |
2 |
Да |
6 |
|
7 |
-2 |
||||
8 |
-4 |
||||
9 |
0 |
3 |
Нет |
A(P) |
Q |
А(S) |
Выходной мас- |
||
А(6) |
А(3) |
сив А(К) |
|||
0 |
0 |
4 |
1 |
5 |
|
4 |
0 |
4 |
2 |
0 |
|
4 |
0 |
0 |
3 |
0 |
|
4 |
-3 |
||||
5 |
-7 |
||||
6 |
4 |
||||
7 |
-2 |
||||
8 |
-4 |
||||
9 |
0 |
Пример 12. Составить алгоритм удаления в одномерном массиве элемента с максимальным значением. Решение. Анализ постановки задачи позволяет выделить две последовательно решаемые задачи: поиск элемента с максимальным значением и удаление этого значения из массива. Алгоритм первой задачи был рассмотрен ранее в примере 10 (рис.18). В этом алгоритме был определен номер максимального значения М, а максимальное значение определялось как А(М). Удаление элемента из массива приводит к уменьшению количества элементов массива за счет их перемещения на позицию удаляемого. Например, требуется удалить максимальное значение в массиве (2,4,13,5,7). Максимальное значение в этом примере равно 13. После удаления количество элементов данного массива уменьшится на 1 и станет равным 4, а массив примет вид (2,4,5,7). Таким образом, можно сделать вывод , что для удаления элемента из массива необходимо знать его номер, например М, удаление производится путем сдвига на одну позицию влево всех следующих за удаляемым элементов А(М)=А(М+1), этот сдвиг должен осуществляться под управлением цикла. Цикл завершит свою работу, когда последний элемент массива сдвинется на место предпоследнего элемента .
После приведенных рассуждений и используя алгоритмическое решение примера 10, изображенное на рис.18, составим алгоритм удаления элемента с максимальным значением из одномерного массива из N элементов (см. рис.26).
32
Рис. 26. Алгоритм удаления элемента с максимальным значением
К – номер очередного элемента, М- номер элемента с максимальным значением, N-1 – уменьшенное
НАЧАЛО |
|
Ввод N и элемен- |
|
тов А(1.. N) |
|
А |
|
K:=1 |
|
M:=1 |
|
A [K]>A [M] |
M:=K |
K:=K+1 |
|
K>N |
|
K=М |
|
A [K]: =A [K+1] |
|
K:=K+1 |
|
Вывод N-1 элемента |
|
K=N-1 |
массива A |
КОНЕЦ
в результате удаления одного элемента количество элементов массива А, A [K]: =A [K+1] – удаление путем сдвига влево следующих за удаляемым элементов на одну позицию.
Задания для самостоятельного выполнения
Составить визуальные циклические алгоритмы и таблицы трассировки для следующих задач обработки одномерных массивов.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
- #
Алгоритм циклической структуры
Алгоритм циклической структуры
Как вы помните, любой алгоритм можно составить из нескольких базовых структур. В простейшей — линейной — команды выполняются однократно в той последовательности, как записаны. Если на каком-то этапе исполнитель должен выбирать один вариант из нескольких, используют разветвленную структуру. Но чаще всего автоматизируют те действия, которые нужно выполнять много раз подряд. И здесь на помощь приходит циклическая структура.
В алгоритме циклической структуры (цикле) серия команд (тело цикла) повторяется многократно. При этом нужно указать, либо сколько раз исполнитель должен выполнить тело цикла, либо при каком условии исполнитель будет повторять тело цикла еще раз.
Разновидности циклической структуры
Разновидности циклической структуры
Задается количество повторений
Цикл с параметром
Задается условие продолжения/окончания повторений
блок-схема
фрагмент программы
for i:=1 to 10 do
write(i, ‘ ‘);
Результат:
1 2 3 4 5 6 7 8 9 10
for k:=8 downto 1 do
write(k*k, ‘ ‘);
n:=1;
while n < 100 do
begin
write(n, ‘ ‘);
n:=n*2;
end;
Результат:
1 2 4 8 16 32 64
m:=1;
repeat
write(m, ‘ ‘);
m:=m*3;
until m > 500;
Результат:
1 3 9 27 81 243
Результат:
64 49 36 25 16 9 4 1
(В примерах фрагментов программ ключевые слова операторов цикла выделены полужирным шрифтом).
Если тело цикла состоит более чем из одной команды, в операторах for…to…do и while…do ее необходимо, как и в условном операторе, заключать в операторные скобки begin…end (см. пример цикла с предусловием).
При составлении циклического алгоритма, нужно…
При составлении циклического алгоритма, нужно…
- Определить, какая последовательность действий должна повторяться.
- Выяснить, что будет известно о количестве повторений тела цикла до начала цикла.
- Если число повторений известно, можно использовать цикл с параметром.
- Если тело цикла обязательно выполняется хотя бы один раз, можно использовать цикл с постусловием.
- Если число повторений неизвестно и может быть нулевым, необходимо использовать цикл с предусловием.
- Определить пределы изменения параметра (для цикла с параметром) либо условие повторения/окончания (для циклов с условием).
- Определить, значения каких переменных должны быть известны до начала цикла (особое внимание обратить на переменные, входящие в условие оператора цикла с предусловием). Операторы для ввода или вычисления этих переменных должны быть записаны до заголовка цикла.
- Записать алгоритм на языке программирования.
- Подобрать данные для тестирования программы (предусмотреть несколько наборов данных, в том числе для предельных случаев, например, для случая, когда тело цикла с предусловием не должно выполняться ни разу).