В.2. этапы решения задач

B.1. Основные понятия и определения

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

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

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

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

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

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

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

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

В различных моделях компьютеров используют ОС с разной архитектурой и возможностями. Для их работы требуются разные ресурсы. Они предоставляют разную степень сервиса для программирования и работы с готовыми программами.

Кроме того, программное обеспечение условно можно разбить на два класса: «малое» и «большое».

«Малое» программное обеспечение имеет следующие характеристики: решает одну несложную, четко поставленную задачу; размер исходного программного кода не превышает нескольких сотен строк; скорость работы программного обеспечения и необходимые ему ресурсы не играют большой роли; ущерб от неправильной работы не имеет большого значения; модернизация программного обеспечения, дополнение его возможностей требуется редко; как правило, разрабатывается одним разработчиком или небольшой группой; подробная документация не требуется, ее может заменить исходным кодом с комментариями.

Примером «малого» ПО могут служить программы базовых алгоритмов, изучаемые в данном пособии и примеры проектов из лабораторных работ.

«Большое» программное обеспечение имеет две три или более характеристик из следующего перечня: решает совокупность взаимосвязанных задач; использование приносит значимую выгоду; удобство его использования играет важную роль; обязательно наличие полной и понятной документации; низкая скорость работы приводит к потерям; сбои, неправильная работа, наносит ощутимый ущерб; программы в составе ПО во время работы взаимодействует с другими программами и программно-аппаратными комплексами; работает на разных платформах; требуется развитие, исправление ошибок, добавление новых возможностей; группа разработчиков состоит из более чем 5 человек[ 9 ].

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

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

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

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

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

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

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

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

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

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

Процедурное программирование –это парадигма программирования, основанная на концепции описания и вызова процедур. Процедуры также известны как подпрограммы, методы или функции.

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

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

Структурное программирование – методология разработки ПО, в основе которой лежит представление программы в виде иерархической структуры базовых алгоритмических блоков. Она предложена в 70-х годах XX векаЭ. Дейкстрой, разработана и дополнена Н. Виртом. В соответствии с этой методологией:

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

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

3) Разработка программы ведётся пошагово, методом «сверху вниз».

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

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

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

Таким образом, пошаговая реализация – это тактика разработки программы, а нисходящее проектирование – это стратегия программирования.

Объектно-ориентированное программирование (ООП) –парадигма программирования, в которой основными концепциями являются понятияобъектовиклассов.

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

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

В.2. Этапы решения задач

Почти все языки высокого уровня современных интегрированных систем разработки ПО объектно-ориентированные. Для изучения базовых средств VB мы будем использовать «простейшие» программы с использованием процедур. Данный подход используется для разработки методов классов.

Тогда общая схема решение «простейшихзадач», ориентированная на разработку процедур (методов) включает в себя следующие основные этапы, часть из которых осуществляются до использования компьютера:

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

2) Анализ и исследование задачи. На этом этапе анализируются существующие аналогичные задачи; разрабатывается математическая модель задачи; осуществляется формализация; определяются структуры данных.

3) Разработка алгоритма. Этап заключается в выборе формы записи алгоритма и в последующем процессе разработки алгоритма и его описания.

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

5) Тестирование и отладка. При тестировании и отладке выявляют синтаксические, семантические (смысловые) и логические ошибки, допущенные при разработке алгоритма и программировании. Анализ результатов тестирования позволяет устранить все выявленные семантические и логические ошибки.

6) Анализ результатов решения задачи. На этом этапе осуществляется прогон программы при реальных исходных данных. В результате анализа результатов расчета возможно уточнение математической модели и повторение этапов 2-5.

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

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

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

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

Существуют различные способы описания алгоритмов. На практике наиболее распространены следующие формы представления алгоритмов:

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

Рассмотрим некоторые формы представления алгоритмов подробнее.

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

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

Графический способ представления алгоритмов является более компактным и наглядным по сравнению со словесным представлением.

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

Наименование Обозначение Назначение
Пуск/останов В.2. этапы решения задач Начало или конец обработки данных.
Ввод/вывод В.2. этапы решения задач Ввод исходных данных или вывод результатов.
Процесс В.2. этапы решения задач Выполнение операции или группы операций, в результате которых изменяется значение, форма представления или расположения данных.
Решение В.2. этапы решения задач Выбор направления выполнения алгоритма в зависимости от значения логического условия
Модификация В.2. этапы решения задач Начало регулярной циклической структуры.
Предопределенный процесс В.2. этапы решения задач Использование ранее созданных и отдельно описанных алгоритмов.
Линии потока В.2. этапы решения задач Указание последовательности связей между блоками.
Соединитель В.2. этапы решения задач Указатель связей между прерванными линиями потока.
Комментарий В.2. этапы решения задач Пояснения элементов схемы.
Межстраничный соединитель В.2. этапы решения задач Указатель связей между страницами, если схема алгоритма занимает несколько листов.

Рис. В.2-1. Основные обозначения, принятые в схемах алгоритмов

Пример В.2-1.Рассмотрим запись алгоритма нахождения наибольшего общего делителя (НОД) двух натуральных чисел (алгоритм Эвклида) с помощью схемы алгоритма.

Извыше перечисленных способов описания алгоритмов самым распространенным и наиболее наглядным является графический способ, поэтому в дальнейшем все алгоритмы будут изображаться графически, в виде схем алгоритмов, реализованные средствами графической программы Visio[10] и см. Приложение 2 настоящего пособия.

В.2. этапы решения задач

Рис В.2-2. Пример графического описания алгоритмов

Этапы решения задач (проблем)


Похожие статьи.

Понравилась статья? Поделиться с друзьями: