Автор Анна Евкова
Преподаватель который помогает студентам и школьникам в учёбе.

Алгоритмизация как обязательный этап разработки программы

Содержание:

ВВЕДЕНИЕ

Благодаря развитию информатики и её проникновению в различные отрасли народного хозяйства слово "алгoритм" стало часто встречающимся и наиболее употребляемым в бытовом плане понятием для широкого круга специалистов. Более того, с переходом к информационному обществу алгоритмы становятся одним из важнейших факторов цивилизации.

Понятие алгоритма является одним из основных понятий современной математики (Древний Египет, Вавилон, Греция) в ней стали возникать различные вычислительные процессы чисто механического характера. С их помощью искомые величины ряда задач вычислялись последовательно из исходных величин по определенным правилам и инструкциям. Со времени все такие процессы в математике получили название алгоритмов (алгорифмов).

Термин алгоритм происходит от имени средневекового узбекского математика Аль-Хорезми, который еще в IX в. (825) дал правила выполнения четырех арифметических действий в десятичной системе счисления. Процесс выполнения арифметических действий был назван алгоризмом. С 1747 г. вместо слова алгоризм стали употреблять алгорисмус, смысл которого состоял в комбинировании четырех операций арифме­тического исчисления — сложения, вычитания, умножения, деления. К 1950 г. Алгорисмус стал алгоритмом. Смысл алгоритма чаще всего связывался с алгоритмами Евклида — процессами нахождения наибольшего общего делителя двух натуральных чисел, наибольшей общей меры двух отрезков и т.п. [2].

При разработке программного обеспечения необходимо освоить и детально изучить все этапы разработки и особое внимание стоит уделить именно алгоритму. Выделяют следующие этапы разработки любой программы: постановку задачи; формализацию задачи; разработку алгоритма решения задачи; разработку машинной программы задачи на языке программирования; составление описания задачи.

Таким образом, когда возникает необходимость разработки прикладной задачи следует при постановке задачи, отвечать на вопрос, какие цели преследует решение данной задачи и что должно быть на ее выходе. Затем, на этапе формализации, необходимо определиться с методами, с помощью которых задача может быть решена, и инструментами, которые нужно будет использовать для решения задачи, а на этапе алгоритмизации – указать предполагаемую последовательность действий, которая приведет к получению необходимого результата и указать необходимый порядок выдачи результатов, если их много.

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

1. Алгоритм и его свойства

В повседневной жизни каждый человек сталкивается с необходимостью решения задач самой разной сложности. Некоторые из них трудны и требуют длительных размышлений для поиска решений (а иногда его так и не удается найти), другие же, напротив, столь просты и привычны, что решаются автоматически. При этом выполнение даже самой простой задачи осуществляется в несколько последовательных этапов (шагов). В виде последовательности шагов можно описать процесс решения многих задач, известных из школьного курса математики: приведение дробей к общему знаменателю, решение системы линейных уравнений путем последовательного исключения неизвестных, построение треугольника по трем сторонам с помощью циркуля и линейки и т.д. Такая последовательность шагов в решении задачи называется алгоритмом. Каждое отдельное действие – это шаг алгоритма. Последовательность шагов алгоритма строго фиксирована, т.е. шаги должны быть упорядоченными.

Понятие алгоритма близко к другим понятиям, таким, как метод (метод Гаусса решения систем линейных уравнений), способ (способ построения треугольника по трем сторонам с помощью циркуля и линейки) [1].

Алгоритм – описание последовательности действий, исполнение которых приводит к решению поставленной задачи за конечное число шагов.

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

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

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

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

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

Свойства алгоритма:

  1. Дискретность (от лат. Discretus – разделенный, прерывистый) – это свойство предполагает, что любой алгоритм должен состоять из последовательности шагов, следующих друг за другом.
  2. Детерминированность (от лат. Determinate – определенность, точность) - это свойство указывает, что любое действие в алгоритме должно быть строго и недвусмысленно определенно и описано для каждого случая.
  3. Массовость - свойство подразумевает, что один и тот же алгоритм может применяться для решения целого класса задач, отличающихся исходными данными.
  4. Результативность (конечность) состоит в том, что при точном исполнении всех команд алгоритма процесс решения задачи должен прекратиться за конечное число шагов и при этом должен быть получен определенный постановкой задачи ответ.
  5. Понятность означает, что алгоритм должен быть понятен исполнителю, и исполнитель должен быть в состоянии выполнить его команды. Следовательно, алгоритм нужно разрабатывать с ориентацией на определенного исполнителя, то есть в алгоритм можно включать команды только из системы команд данного исполнителя [7].

На основании этих свойств иногда дается определение алгоритма, например: “Алгоритм – это последовательность математических, логических или вместе взятых операций, отличающихся детерменированностью, массовостью, направленностью и приводящая к решению всех задач данного класса за конечное число шагов”. Алгоритм – искусственная конструкция, которую мы сооружаем для достижения своих целей. Чтобы алгоритм выполнил свое предназначение, его необходимо строить по определенным правилам. Поэтому нужно говорить не о свойствах алгоритма, а о правилах построения алгоритма, или о требованиях, предъявляемых к алгоритму.

Первое правило – при построении алгоритма, прежде всего, необходимо задать множество объектов, с которыми будет работать алгоритм. Формализованное (закодированное) представление этих объектов носит название данных. Алгоритм приступает к работе с некоторым набором данных, которые называются входными, и в результате своей работы выдает данные, которые называются выходными. Таким образом, алгоритм преобразует входные данные в выходные. Это правило позволяет сразу отделить алгоритмы от «методов» и «способов». Пока мы не имеем формализованных входных данных, мы не можем построить алгоритм.

Второе правило – для работы алгоритма требуется память. В памяти размешаются входные данные, с которыми алгоритм начинает работать, промежуточные данные и выходные данные, которые являются результатом работы алгоритма. Память является дискретной, т.е. состоящей из отдельных ячеек. Поименованная ячейка памяти носит название переменной. В теории алгоритмов размеры памяти не ограничиваются, т.е. считается, что мы можем предоставить алгоритму любой необходимый для работы объем памяти. В школьной «теории алгоритмов» эти два правила не рассматриваются.

Третье правило – дискретность. Алгоритм строится из отдельных шагов (действий, операций, команд). Множество шагов, из которых составлен алгоритм, конечно.

Четвертое правило – детерменированность. После каждого шага необходимо указывать, какой шаг выполняется следующим, либо давать команду остановки.

Пятое правило – сходимость (результативность). Алгоритм должен завершать работу после конечного числа шагов. При этом необходимо указать, что считать результатом работы алгоритма.

2. Способы описания алгоритмов

Применяют пять форм представления алгоритмов: табличную, словесную, графическую, псевдокод, через языки программирования (программу) но не все формы возможны для любого из алгоритмов. Форма представления алгоритма зависит от его типа.

Рисунок 1 – Способы описания алгоритма

Табличная форма представления алгоритмов применяется только для линейных вычислительных алгоритмов. Ее пример — таблице 1.

Таблица 1

R, см

3,14 R, см

3,14∙R∙R, см2

1

3,14

3,14

2

6,28

12,56

Словесная форма представления (для всех типов алгоритмов). Выберем русский язык для записи алгоритма в этой форме и запишем последовательность команд, выполнение которых позволит при заданном значении радиуса круга R найти его площадь S:

1. Прочесть значение R.

2. Умножить значение R на 3,14.

3. Умножить результат второго действия на значение R.

4. Записать полученный в предыдущей команде результат как значение S.

Графическая форма представления (применима для алгоритмов всех типов) основана на замене (кодировании) типичных алгоритмических команд определенными геометрическими фигурами.

При проектировании визуальных алгоритмов используют специальные графические символы. Результатом алгоритмизации решения задачи является блок-схема алгоритма, состоящая из некоторой последовательности графических блоков, связанных по управлению линиями (направлениями потока) со стрелками. В блоках записывается последовательность действий. Блоки могут нумероваться. Порядковые номера проставляются слева в верхней части символов. В пределах одной схемы рекомендуется изображать блоки одинаковых размеров. Для визуального представления алгоритмов обычно используют символы в соответствии с ГОСТ 19.701–90 «Единая система программной документации. Схемы алгоритмов, программ, данных и систем.

Псевдокод – описание структуры алгоритма на естественном, частично формализованном языке, позволяющее выявить основные этапы решения задачи перед точной его записью на языке программирования. В псевдокоде используются некоторые формальные конструкции и общепринятая математическая символика. Строгих синтаксических правил для записи псевдокода не существует. Это облегчает запись алгоритма при проектировании и позволяет описать алгоритм, используя любой набор команд. Однако в псевдокоде обычно используются некоторые конструкции, присущие формальным языкам, что облегчает переход от псевдокода к записи алгоритма на языке программирования. Единого или формального определения псевдокода не существует, поэтому возможны различные псевдокоды, отличающиеся набором используемых слов и конструкций.

Описания алгоритма в словесной форме, на псевдокоде или в виде блок-схемы допускают некоторый произвол при изображении команд. Вместе с тем она настолько достаточна, что позволяет человеку понять суть дела и исполнить алгоритм. На практике исполнителями алгоритмов выступают компьютеры. Поэтому алгоритм, предназначенный для исполнения на компьютере, должен быть записан на «понятном» ему языке, такой формализованный язык называют языком программирования.

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

Диаграмма Нэсси-Шнейдермана была предложена в сочетании со структурным программированием как средство борьбы с присущей схемам алгоритмов проблемой большого количества стрелок, отображающих передачу управления на другую часть программы (так называемого «спагетти-кода»). Эта диаграмма заменяет одномерное представление вложенных операторов двумерным. Тем не менее и в этом случае по мере роста сложности программного кода проявляются проблемы отображения, поскольку элементы диаграммы быстро становятся все меньше и меньше [4]

Рисунок 2 – Алгоритм, представленный при помощи

диаграммы Нэсси-Шнейдермана

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

Элементарные шаги алгоритма можно объединить в следующие алгоритмические конструкции: линейные (последовательные), раз­ветвляющиеся, циклические с предусловием и циклические с постусловием. Любой алгоритм можно составить, используя эти четыре алгоритмические конструкции.

Линейной называют алгоритмическую конструкцию, реализованную в виде последовательности действий (шагов), в которой каждое действие (шаг) алгоритма выполняется ровно один раз, причем после каждого i-го действия (шага) выполняется (i+1)-е действие (шаг), если i-е действие — не конец алгоритма.

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

https://studfiles.net/html/1611/166/html_y84fz7HOHZ.QNcO/img-3M1dTK.jpg

Рисунок 3 - Полное ветвление

Циклической (или циклом) называют алгоритмическую конструкцию, в которой некая, идущая подряд группа действий (шагов) алгоритма можем выполняться несколько раз, в зависимости от входных данных или условия задачи. Группа повторяющихся действий на каждом шагу цикла называется телом цикла. Любая циклическая конструкция содержит в себе элементы ветвящейся алгоритмической конструкции [12].

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

В данной циклической структуре сначала проверяется значение условного выражения (условие) перед выполнением очередного шага цикла. Если значение условного выражения истинно, исполняется тело цикла. После чего управление вновь передается проверке условия и т.д. Эти действия повторяются до тех пор, пока условное выражение не примет значение ЛОЖЬ. При первом же несоблюдении условия цикл завершается. Количество шагов цикла заранее не определено и зависит от входных данных задачи. Особенностью цикла с предусловием является то, что если изначально условное выражение ложно, то тело цикла не выполнится ни разу.

а)

б)

Рисунок 2 - Блок-схема цикла с предусловием: два варианта изображения с помощью условного блока а) и с помощью блока границы цикла б)

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

Как и в цикле с предусловием, в циклической конструкции с постусловием заранее не определено число повторений тела цикла, оно зависит от входных данных задачи. В отличие от цикла с предусловием, тело цикла с постусловием всегда будет выполнено хотя бы один раз, после чего проверяется условие. В этой конструкции тело цикла будет выполняться до тех пор, пока значение условного выражения ложно (условие "окончания" цикла). Как только оно становится истинным, выполнение команды прекращается. Возможно построение цикла и с условием "продолжения" цикла, т.е. тело цикла будет выполняться до тех пор, пока значение условия истинно. Блок-схема данной конструкции представлена на рис. 3 двумя способами: с помощью условного блока а и с помощью блока управления б [5].

https://studfiles.net/html/1611/166/html_y84fz7HOHZ.QNcO/img-dRKLIb.jpghttps://studfiles.net/html/1611/166/html_y84fz7HOHZ.QNcO/img-N0bDfb.jpg

Рисунок 3 - Блок-схема цикла с постусловием

Рассмотрим три типа циклических алгоритмов: цикл с параметром (который называют арифметическим циклом), цикл с предусловием и цикл с постусловием (их на­зывают итерационными).

Существует разновидность цикла с предусловием, называемая арифметический цикл. В арифметическом цикле число его шагов (повторений) одно­значно определяется правилом изменения параметра, которое задается с помощью начального (N) и конечного (К) значений параметра и шагом (h) его изменения. Т.е., на первом шаге цикла значение параметра равно N, на втором – N + h, на третьем – N + 2h и т.д. На последнем шаге цикла значение параметра не больше К, но такое, что дальнейшее его изменение приведет к значению, большему; чем К.

Например, вывести 10 раз слово «Привет!». Его блок-схема использует специальный блок начала арифметического цикла с указанием, что переменная i в нем будет изменяться от 1 до 10 с шагом 1.

Рисунок 4 – Арифметический цикл

4. Понятие программирования и компьютерной программы

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

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

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

Программирование включает в себя:

  1. Анализ.
  2. Проектирование - разработка комплекса алгоритмов.
  3. Кодирование и компиляцию - написание исходного текста программы и преобразование его в исполнимый код с помощью компилятора.
  4. Тестирование и отладку - выявление и устранение ошибок в программах.
  5. Испытания и сдачу программ.
  6. Сопровождение.

Различные языки программирования поддерживают различные стили программирования (так называемые «парадигмы программирования»). Отчасти, искусство программирования состоит в том, чтобы выбрать один из языков, наиболее полно подходящий для решения имеющейся задачи. Разные языки требуют от программиста различного уровня внимания к деталям при реализации алгоритма, результатом чего часто бывает компромисс между простотой и производительностью (или между временем программиста и временем пользователя) [9].

Единственный язык, напрямую выполняемый процессором - это машинный язык (также называемый «машинным кодом»). Как уже было сказано, изначально, все программисты прорабатывали каждую мелочь в машинном коде, но сейчас эта трудная работа уже не делается. Вместо этого, программисты пишут исходный код, и компьютер (используя компилятор, интерпретатор или ассемблер, речь о которых пойдёт чуть позже) транслирует его, в один или несколько этапов, уточняя все детали, в машинный код, готовый к исполнению на целевом процессоре. Однако, в некоторых языках, вместо машинного кода генерируется интерпретируемый двоичный код «виртуальной машины», также называемый байт-кодом (byte-code). Такой подход применяется в Forth, Lisp, Java.

В основе того или иного языка программирования лежит некоторая руководящая идея, оказывающая существенное влияние на стиль соответствующих программ. В зависимости от назначения и/или способа написания программ различают парадигмы [8] (также известные как подходы или технологии) программирования:

Структурное программирование - методология программирования, базирующаяся на системном подходе к анализу, проектированию и реализации программного обеспечения. Эта методология родилась в начале 70-х годов и оказалась настолько жизнеспособной, что и до сих пор является основной в большом количестве проектов. Основу этой технологии составляют следующие положения:

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

Простота управляющих структур, используемых в задаче. Это положение означает, что логически задача должна состоять из минимальной, функционально полной совокупности достаточно простых управляющих структур. В качестве примера такой системы можно привести алгебру логики, в которой каждая функция может быть выражена через функционально полную систему: дизъюнкцию, конъюнкцию и отрицание.

Разработка программы должна вестись поэтапно. На каждом этапе должно решаться ограниченное число четко поставленных задач с ясным пониманием их значения и роли в контексте всей задачи. Если такого понимания не достигается, это говорит о том, что данный этап слишком велик и его нужно разделить на более элементарные шаги.

Концепция модульного программирования. Так же, как и для структурной технологии программирования, концепцию модульного программирования можно сформулировать в виде нескольких понятий и положений:

Функциональная декомпозиция задачи - разбиение большой задачи на ряд более мелких, функционально самостоятельных подзадач - модулей. Модули связаны между собой только по входным и выходным данным.

Модуль - основа концепции модульного программирования. Каждый модуль в функциональной декомпозиции представляет собой «черный ящик» с одним входом и одним выходам. Модульный подход позволяет безболезненно производить модернизацию программы в процессе ее эксплуатации и облегчает ее сопровождение. Дополнительно модульный подход позволяет разрабатывать части программ одного проекта на разных языках программирования, после чего с помощью компоновочных средств объединять их в единый загрузочный модуль.

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

Назначение всех переменных модуля должно быть описано с помощью комментариев по мере их определения.

Объектно-ориентированное программирование (ООП). Идея ООП заключается в стремлении связать данные с обрабатывающими эти данные процедурами в единое целое - объект. ООП основано на трех важнейших принципах, придающих объектам новые свойства. Этими принципами являются инкапсуляция, наследование и полиморфизм.

Инкапсуляция - объединение в единое целое данных и алгоритмов обработки этих данных. В рамках ООП данные называются полями объекта, а алгоритмы - объектными методами.

Наследование - свойство объектов порождать своих потомков. Объект - потомок автоматически наследует от родителей все поля и методы, может дополнять объекты новыми полями и заменять (перекрывать) методы родителя или дополнять их.

Полиморфизм - свойство родственных объектов (т.е. объектов, имеющих одного общего родителя) решать схожие по смыслу проблемы разными способами.

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

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

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

Декларативное (логическое, продукционное) программирование - метод программирования, предназначенный для решения задач искусственного интеллекта. В указанном контексте программа описывает логическую структуру решения задачи, указывая преимущественно, что нужно сделать, не вдаваясь в детали, как это делается. Используются языки программирования типа Пролог.

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

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

Функциональное программирование - метод программирования, основанный на разбиении алгоритма решения задачи на отдельные функциональные модули, а также описании их связей и характера взаимодействия. Для функционального программирования наиболее широко используются языки НОРЕ и ML. Элементы функционального программирования реализуются также другими языками, например, Си.

Эвристическое программирование - метод программирования, основанный на моделировании мыслительной деятельности человека. Используется для решения задач, не имеющих строго формализованного алгоритма или связанных с неполнотой исходных данных [10].

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

  • прежде всего, программа работает не с пользователем, а с данными. Эта первая и основная компонента программы – предметы (объекты), над которыми реализуется алгоритм. Данные состоят из отдельных переменных, связанных как между собой непосредственно (через указатели), так и косвенно (как входные данные – результат);
  • в языке программирования имеются средства описания данных, которые позволяют программисту конструировать различные формы их представления – типы данных;
  • программа базируется на наборе операций (системе команд), которые можно выполнять над данными. В этот набор входят арифметические операции, присваивание (сохранение результата в переменной), ввод-вывод, проверка значения переменной и т.п.;
  • вторая основная компонента программы – описание порядка, последовательности выполняемых действий, также называется алгоритмом «в узком смысле», или алгоритмической компонентой. Она обычно состоит из двух частей. Первая часть – выражения, представляет собой описание линейной последовательности выполнения простейших действий из набора операций (арифметические операции, присваивание, условные выражения). Они включаются во вторую компоненту – операторы, которые задают ту или иную последовательность действий;
  • как уже отмечалось, программа работает исключительно с данными, что и определяет сущность алгоритма. В наборе операций имеются команды ввода-вывода, осуществляющие обмен данными между переменными и внешней средой (посредством устройств ввода-вывода). С «программно-эгоцентрической» точки зрения это выглядит чистой формальностью и не является существенной частью программы;

Любая программа выполняется в компьютере. Посмотрим, как соотносятся между собой компоненты программы и компьютерной архитектуры:

  • компоненты программы находятся в памяти. В принципе, память является общей для них всех, но логически она разделяется на области, именуемые сегментами. Прежде всего, это сегмент данных, содержащий, естественно, данные программы. Алгоритмическая компонента (выражения, операторы) также находится в памяти в собственном сегменте команд;
  • одновременное нахождение в памяти «алгоритма» и данных соответствует принципу хранимой программы. Перед загрузкой в память эти же компоненты находятся в программном файле, который представляет собой точную копию представления программы в памяти – «образ памяти». Это позволяет рассматривать всю программу (в том числе и алгоритм) как данные для работы других программ, например, трансляторов;
  • набор операций, выполняемый в программе, соответствует системе команд процессора, на котором она выполняется. Сюда же входят команды, которые обеспечивают заданный в программе порядок действий (операторов).

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

  • средства описания данных: определение типов данных (форма представления) и переменных;
  • набор операций над основными типами данных (включая ввод-вывод), а также средства записи выражений;
  • набор операторов, определяющих различные варианты порядка выполнения выражений в программе (последовательность, условие, повторение, блок);
  • средства разбиения программы на независимые части – модули (функции, процедуры), взаимодействующие между собой через программные интерфейсы.

Определение программы уже давно дано в простой формуле: «Программа = алгоритм + данные». Но в ней алгоритм и данные не просто «складываются» в одно целое как независимые части, но являются двумя взаимозависимыми элементами. Это своего рода «Янь и Инь» программы, олицетворяющие единство и борьбу двух противоположных начал (в философии этот принцип положен в основу диалектики – учения о развитии). Попробуем привести несколько аналогий, поясняющих сущность взаимодействий в этой «парочке»:

  • если данные можно в какой-то мере обладают свойствами пространства (объем, протяженность), то алгоритм – свойствами времени (эффективность, быстродействие). Тезис «проигрывая в пространстве, выигрываем во времени» здесь также уместен: эффективность программ может быть принципиально повышена за счет использования дополнительных структур данных в памяти;
  • cинтаксически данные являются аналогом существительных (объектов, над которыми производятся действия), набор операций – аналогом глаголов (выполняемых действий). Программа в целом аналогично предложению, описывающему процесс – последовательность действий над заданными предметами с целью получения результата.

Взаимосвязь алгоритма и данных в программе не является простой и линейной. Процесс выполнения любой программы можно рассматривать с двух точек зрения: как последовательность выполнения операций (команд), в которых содержится информация об операндах (данных), которые они обрабатывают – поток команд (поток управления). С другой стороны – любой элемент данных можно рассматривать как результат выполнения действий над исходными данными и как источник данных (операнд) для последующих результатов. Т.е. в программе также присутствует логическая последовательность вычислений (преобразований данных), называемая потоком данных. Исторически сложилось, что в традиционной (фон Неймановской) архитектуре в программе в явном виде задается последовательность команд, т.е. программа выглядит как поток управления, в котором алгоритмическая компонента является первичной (ведущей), а данные – вторичной (ведомой) [11].

5. Алгоритмизация - обязательный этап программирования

Алгоритмизация – это сложный процесс, носящий в значительной степени творческий характер. По оценкам специалистов, постановка задачи и ее алгоритмизация нередко составляют 20 - 30% общего времени на разработку программных средств решения задачи. Сложность и ответственность реализации данного этапа объясняется тем, что для решения одной и той же задачи, как правило, существует множество различных алгоритмов, отличающихся друг от друга уровнем сложности, объемами вычислительных работ, составом необходимой исходной и промежуточной информации и другими факторами, которые оказывают существенное влияние на эффективность выбранного способа решения задачи.

Процесс алгоритмизации решения задачи в общем случае реализуется по следующей схеме:

• выделение автономных этапов процесса решения задачи (как правило, с одним входом и одним выходом);

• формализованное описание содержания работ, выполняемых на каждом выделенном этапе;

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

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

Алгоритм является более общим понятием, чем программа; в этом смысле программа для вычислительной машины – это запись алгоритма решения некоторой задачи в виде, пригодном для данной вычислительной машины.

Отсюда следует, что основная сущность процесса решения задач с помощью программно-управляемой техники – это разработка алгоритмов.

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

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

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

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

Конечно, будут моменты, когда вы будете натыкаться на ранее не изученные проблемы. В таких случаях нужно придумать новый алгоритм, или по-новому применить старый алгоритм. Чем больше вы знаете об алгоритмах, тем больше у вас шансов найти хорошее решение проблемы. Во многих случаях новая задача легко сводится к старой, но для этого нужно иметь фундаментальное понимание старых задач.

В качестве примера можно рассмотреть, как работают сетевые коммутаторы. Коммутатор имеет N подключенных к нему кабелей, и принимает пакет данных, поступающих по этим кабелям. Коммутатор должен сначала проанализировать пакеты, а затем отправить их обратно по правильному кабелю. Коммутатор также, как и компьютер работает в дискретном режиме - пакеты отправляются дискретными интервалами, а не непрерывно. Быстрый коммутатор стремится послать, как можно больше пакетов в течение каждого интервала иначе они накопятся и коммутатор "упадет". Цель алгоритма отправлять максимальное количество пакетов в течение каждого интервала, а также обеспечить порядок, при котором пакеты, пришедшие раньше других отправлялись тоже раньше других. В этом случае оказывается, что для решения этой задачи подходит алгоритм известный как "stable matching", хотя на первый взгляд это может быть не очевидно. Такие связи между задачей и решением можно обнаружить только с помощью уже имеющихся алгоритмических знаний.

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

Составление алгоритмов решения задач - это работа творческая. Нет универсального способа, позволяющего без особого труда составлять любые алгоритмы. К сожалению, такого способа не существует, ведь жизненные ситуации и задачи так разнообразны и непредсказуемы! Если бы дело обстояло иначе, появилась бы реальная возможность автоматизировать сам процесс алгоритмизации, поручив его некоторому исполнителю - вероятно, очень высокоинтеллектуальному компьютеру [3].

При решении простых задач можно воспользоваться определенной схемой. Есть раздел математики, называемый вычислительной математикой, в котором накоплен многолетний (а порой и многовековой) опыт решения разных вычислительных задач. Нет необходимости разрабатывать заново те алгоритмы, которые уже созданы - надо только их изучить и практически применять при решении своих задач. Таковы, например, методы отыскания корней нелинейных уравнений, вычисления определенных интегралов, численного интегрирования дифференциальных уравнений, методы сортировки данных и многие другие.
В большинстве случаев та или иная задача может быть решена несколькими численными методами. Выбор конкретного численного метода решения задачи обычно производится по следующим критериям:

  • обеспечение оптимального времени решения задачи;
  • обеспечение оптимального использования имеющихся ресурсов (памяти);
  • обеспечение требуемой точности вычислений;
  • минимальные стоимостные затраты;
  • возможность использования стандартных подпрограмм.

При дальнейшей постановке задачи на ПК отыскивается наиболее рациональный способ решения задачи.

Однако, алгоритмы становятся все более и более сложными, соответственно растет трудность понимания того, как они работают. А еще труднее обнаружить и исправить в них ошибки или внести какие-то изменения. От 50 до 100% времени программист тратит на исправление и модификацию программ. В связи с этим индустрия программирования предлагает более систематичные подходы к программированию (а тем самым и к алгоритмизации задач в общем), т.е. предлагает методики, использование которых уменьшает вероятность ошибок в программах, упрощает их понимание и облегчает модификацию.

Структурное программирование - одна из популярных методик. Фундаментом структурного программирования является доказанная Бемом и Джекопини теорема о структурировании. Эта теорема устанавливает, что как бы сложна ни была задача, блок-схема соответствующей программы (читай - "соответствующего алгоритма") всегда может быть представлена с использованием весьма ограниченного числа элементарных управляющих структур (последовательность, ветвление, цикл).

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

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

Разработка алгоритма, являясь четким логичным процессом, упрощается на каждом уровне шаг за шагом. Затем в процессе задействуется следующий метод алгоритмизации - метод пошагового уточнения (совершенствования). Сначала задача рассматривается в целом, выделяются наиболее крупные ее части. Алгоритм, указывающий порядок выполнения этих частей, описывается в структурированной форме, не вдаваясь в мелкие детали. Затем от общей структуры переходят к описанию отдельных частей. Таким образом, разработка алгоритма состоит из последовательности шагов в направлении уточнения алгоритма.

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

Модульное программирование позволяет значительно ускорить процесс за счет привлечения к работе нескольких специалистов сразу, доверив каждому разработку отдельного модуля. Кроме того, модульное программирование предполагает возможность использования заранее разработанных стандартных программ (т.н. библиотек стандартных подпрограмм) [6].

На этапе проектирования алгоритма решения сложной задачи, состоящей из нескольких подзадач, используют два подхода: нисходящий и восходящий.
При нисходящем проектировании вначале проектируются функции управляющей программы - драйвера. Затем более подробно представляют каждую подзадачу и разрабатывают другие модули. При нисходящем проектировании на каждом шаге функционирование модуля описывается с помощью ссылок на последующие, более подробные шаги.

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

Существует также несколько общих алгоритмических методов решения очень сложных задач.

ЗАКЛЮЧЕНИЕ

Любой человек постоянно встречается с множеством задач: от самых простых и хорошо известных до очень сложных. Для множества из них существуют определенные правила (инструкции, предписания), объясняющие исполнителю, как решать данную задачу. Эти правила человек может изучить заранее или сформулировать сам в процессе решения. Чем более точно и однозначно будут описаны правила решения задач, тем быстрее человек овладеет ими и будет эффективнее их применять. Такие правила принято называть алгоритмами.

Таким образом, алгоритм - это четкая последовательность действий, направленная на достижение поставленной цели или решения задачи.

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

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

СПИСОК ЛИТЕРАТУРЫ

  1. Алгоритм. Спосoбы описания алгоритма. Учебно-методическое пособие для учителей информатики / Сост. Е.А.Пархoменко, Ю.В.Сюбаева – Коломна: Лицей, 2005. – 33 с.
  2. Голицына О.Л. Основы алгоритмизации и программирования: Учеб. Пособие / О.Л.Голицына, И.И.Попов. – М.: ИНФРА-М, 2004. – 432 с.
  3. Теория алгоритмов. Методическое пособие по дисциплине «Математическая логика и теория алгоритмов» / В.П. Битюцкий, Н.В. Папуловская. Екатеринбург: ГОУ ВПО УГТУ-УПИ, 2006.
  4. Макарова Н.В. Информатика и ИТК. М:. 2006 г.
  5. Семакин И.Г. Основы программирования: Учебник для среднего профессионального образования / И.Г.Семакин, А.П.Шестаков. — М.: Издательский центр «Академия», 2003. – 432 с.
  6. Основы информатики. Беляев М.А., Лысенко В.В., Малинина Л.А. – Ростов н/Д.: Феникс, 2006.
  7. Шауцукова Л.З. Информатика. Теория. М:. 2002 г.
  8. Орлов С.А. Теория и практика языков программирования. СПб.: 2013. – 688 с.
  9. Ахметов И.Г. Программирование для студентов и школьников на примере Small Basic. СПб.: 2012. – 160 с.
  10. Информатика и программирование. Комлева Н.В., Смирнов А.А., Хрипков Д.В. М.: ЕАОИ, 2008. — 94 с.
  11. Программирование: введение в профессию. Т. 1. Азы программирования. Столяров А.В. М.: 2016. — 464 с.
  12. https://www.lessons-tva.info/edu/e-inf1/e-inf1-4-2.html