Алгоритмизация - это составление алгоритмов для последующей реализации в виде программ для ЭВМ. Знание и использование систематических методов превращают алгоритмизацию - в строгую дисциплину, позволяющую составлять программы на ЭВМ без ошибок.
Порядок составления программ:
задача ¾
алгоритмы
программа
ЭВМ
На практике широко используются два подхода к алгоритмизации:
1) традиционный подход (с использованием блок-схем);
2) структурный подход (с использованием структурной записи);
Традиционный подход к составлению алгоритмов с применением блок-схем грешит большим числом ошибок в программах из-за их громоздкости и запутанности. Из-за этого традиционный подход к составлению программ чреват большим числом ошибок в создаваемых программах.
Структурный подход к программированию заключается в обязательном предварительном составлении структурированных алгоритмов с записью их на псевдокоде. Простота чтения, понимания и исправления структурированных описаний позволяет существенно уменьшить количество ошибок в алгоритмах и программах и сократить время их отладки на ЭВМ.
При структурном подходе к составлению алгоритмов и программ используются три основных правила композиции:
1) альтернативный выбор;
2) циклический повтор;
3) вспомогательные алгоритмы (подпрограммы).
Структурированными считаются алгоритмы и программы составленными только с использованием указанных трех правил структурной композиции. Неструктурированными считаются алгоритмы и программы, в которых используются операторы goto ... или отсутствует ступенчатая запись циклов и альтернатив.
Основные правила структурной композиции алгоритмов с примерами записи их на языке структурированного Бейсика:
1. Альтернативный выбор:
Алгоритм Запись
если х > 0 то if х > 0 then
у := х у = х
иначе else
у := -х у = -х
кесли end if
2. Циклический повтор:
Алгоритм Запись
пока х > 1 цикл do while х > 1
х: = х/2 х = х/2
кцикл loop
3. Вспомогательные алгоритмы (подпрограммы).
Алгоритм Подпрограмма
алг «у = |х|» mod: 'у = |х|
нач '
если х > 0 то if х > 0 then
у := х у = х
иначе else
у := -х у = -х
все end if
кон return
Обращение к алгоритму Обращение к подпрограмме
«у = |х|» gosub mod
В качестве иллюстрации приведем пример структурированного алгоритма «Галерея картинок» и соответствующей структурированной программы:
Сценарий «Галерея картинок»
Список картинок:
1. треугольник
2. прямоугольник
3. кольцо
номер =? «N»
n = 1 n =2 n = 3
В соответствии с этими четырьмя картинками построим три вспомогательных алгоритма рисования отдельных картинок из «Галереи» и общий алгоритм выбора картинок в соответствии с приведенным выше сценарием:
алг «Галерея картинок»
нач алг «рисунок_треугольника»
вывод («Список картинок:») нач
вывод («1. треугольник») линия (150,50)-(100,100)
вывод («2. прямоугольник») линия (150,50)-(200,100)
вывод («3. кольцо») линия (100,100)-(200,100)
запрос(«номер =», n) кон
графический_экран
если n = 1 то алг «рисунок_прямоугольника»
рисунок_треугольника нач
инес n = 2 то рамка (50,50)-( 150,100)
рисунок_прямоугольника кон
инес n = 3 то
рисунок_кольца алг «рисунок_кольца»
иначе нач
вывод («нет такого рисунка») окружность (100,100), 20
все окружность (100,100),50
кон кон
Реализация данного алгоритма в виде структурированной программы:
Алгоритмы: Программа:
алг «Галерея картинок» 'Галерея картинок
нач cls
вывод («Список картинок:») print «Список картинок:»
вывод («1. треугольник») print «1. треугольник»
вывод («2. прямоугольник») print «2. прямоугольник»
вывод («З. кольцо») print «3. кольцо»
запрос(«номер =», n) input «номер =», n
если n = 1 то if n = 1 then
рисунок_треугольника gosub treug
инеc n = 2 то if n = 2 then
рисунок_прямоугольника gosub box
инеc n = 3 то if n = 3 then
рисунок_кольца gosub ring
инеc п <>или n > 3 то if n <>3 then
вывод («нет такого рисунка») print «нет такого рисунка»
все 'все
кон end
алг «рисунок треугольника» treug: 'рисунок треугольника
нач cls
графический_экран screen 2,0
линия (150,50)-( 100,100) line (150,50)-(100,100),3
линия (150,50)-(200,100) line (150,50)-(200,100),3
линия (100,100)-(200,100) line (100,100)-(200,100),3
кон return
алг «рисунок прямоугольника» box: 'рисунок прямоугольника
нач cls
графический_экран screen 2,0
рамка (50,50)-(150,100) line (50,50)-(150,100),3,b
кон return
алг «рисунок кольца» ring: 'рисунок кольца
нач cls
графический_экран screen 2,0
окружность (100,100),20 circle (100,100),20
окружность (100,100),50 circle (100,100),50
кон return
Данный подход - составление структурированных алгоритмов может применяться к составлению структурированных программ для любых ЭВМ на любых языках программирования - Паскаль, Си, Ада, Модула и т. д.
На практике используется более широкий набор правил структурной композиции алгоритмов и программ, принятых в современных языках программирования, ~ правила альтернативного выбора, а также циклы с выходами и со счетчиками.
1. Условные действия.
если у <> if у <>then
вывод («недопустим») print «недопустим»
кесли end if
2. Многоальтернативный выбор.
если х > 1 то if х > 1 then
у: = 1 у = 1
инес х < -1 то elseif х < -1 then
у: = -1 у = -1
иначе else
у: = х у = х
кесли end if
3. Циклы со счетчиком:
от k = 1 до п цикл for k = 1 to n
вывод (k×k) print k*k
кцикл next k
4. Циклы с выходами.
цикл do
s: = s + x s = s + x
при х < style=""> if х < 1 then exit do
х: = x/2 x = x/2
кцикл loop
В циклах в общем случае возможны несколько выходов. Дополнительные выходы считаются допустимыми даже для циклов со счетчиками. Приведем примеры решения задач с использованием дополнительных правил структурирования алгоритмов и программ.
Пример записи структурированных алгоритмов и программ с использованием циклов для алгоритма игры-эксперимента «звездное небо»:
Алгоритм Программа
алг «звездное небо» ' звездное небо»
нач сls
цикл do
запрос(«звезд=», п) input «звезд=», n
при п <= 0 выход if n <= 0 then exit do
графический_экран screen 2,10
от k = 1 до п цикл for k = 1 to n
х: = случайное [0:200] х = rnd*200
у: = случайное [0:200] у = rnd*200
точка (х,у) pset (x,y),3
кцикл next k
кцикл end do
кон end
Пример структурированного алгоритма и программы с применением многоальтернативного выбора и циклов с несколькими выходами:
Алгоритм Программа
алг «угадай-ка» ' угадай-ка
нач cls
вывод («Угадай-ка число») print «Угадай-ка число»
вывод («от 1 до 100») print от 1 до 100»
z: = случайное [0:100] z = int (rnd*100)
цикл do
запрос («число =», х) input «число =», х
при х = z вых if х = z then exit do
если х <> if х < z then
вывод («мало») print «мало»
инеc х > z тo elseif х > z then
вывод («много») print «много»
все end if
кцикл end do
вывод («молодец, умница») print «молодец, умница»
кон end