Жизненный цикл программного обеспечения

Ответы к экзамену по программированию

1)Введение в программирование и основы алгоритмизации. Предмет курса, основные понятия и определения. Алгоритмизация, алгоритм, свойства алгоритма, алгоритмический язык, язык программирования, программа, данные, оператор, переменная, свойства переменной, система программирования, транслятор, интерпретатор, компилятор.

Предметом курса являются методы и средства составления алгоритмов и программ с целью решения задач на ЭВМ.

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

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

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

1) Детерминированность – точность указаний, исключающее их произвольное толкование.

2) Дискретность – возможность расчленения вычислительного процесса на отдельные элементарные операции, возможность выполнения которых не вызывает сомнений

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

4) Массовость – пригодность алгоритма для решения всех задач заданного класса.

Алгоритмический язык — набор символов и система правил образования и истолкования конструкций из этих символов для задания алгоритмов.

Язык программирования – язык, предназначенный для реализации программ на ЭВМ.

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

Данные – факты и идеи, представленные в формализованном виде, позволяющем передавать и обрабатывать эти идеи с помощью некоторого процесса.

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

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

Свойства переменной:

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

2. В каждый момент времени переменная может иметь любое значение либо быть неопределенной.

3. Последущее значение уничтожает, стирает предыдущее. Выбор (чтение) из переменной и ее использование не изменяет значение переменной.

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

Транслятор – программа, которая переводит с одного языка на другой.

Интерпретатор – программа, которая сразу выполняет переводимые программы.

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

 

2)Синтаксис и семантика алгоритмического языка программирования. Средства изображения алгоритмов. Классификация языков программирования. Базовые канонические структуры алгоритмов.

Основными изобразительными средствами алгоритмов являются следующие способы их записи:

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

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

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

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

· структурные диаграммы - могут использоваться в качестве структурных блок-схем, для показа межмодульных связей, для отображения структур данных, программ и систем обработки данных. Существуют различные структурные диаграммы: диаграммы Насси-Шнейдермана, диаграммы Варнье, Джексона, МЭСИД и др.

· языки программирования -изобразительные средства для непосредственной реализации программы на ЭВМ.

Программа – алгоритм, записанный в форме, воспринимаемой ЭВМ.

Классификация языков программирования:

1. Машинно-ориентированные языки – это языки, наборы операторов и изобразительные средства которых существенно зависят от особенностей ЭВМ (внутреннего языка, структуры памяти и т.д.).

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

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

Классификация машинно-ориентированных языков по степени автоматизации программы:

1. Машинный язык – система команд конкретной вычислительной машины, которая интерпретирует процессом или микропрограммой этой вычислительной машины.

2. Языки символического кодирования (командные) – коды операций и адреса в машинных командах, представляющие собой последовательность двоичных или восьмеричных. Цифры заменены на символы(идентификаторы).

3. Автокоды – языки, включающие в себя все возможные языки символического кодирования посредством расширения введ. макрокоманд. Ассемблеры – развитые автокоды.

4. Макрос – язык является средством для замены последовательных символов, описывающих выполнение действий ЭВМ, на более сжатую форму.

Классификация машинно-независимых языков:

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

2. Декларативные (непроцедурные) – построенные на описании данных и искомого результата.

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

· Логические – позволяют выполнять описание проблемы в терминах, актах и логических формах. Решение проблемы выполняет система с помощью механизмов логического вывода.

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

Доказано, что любую программу можно написать с использованием трех управляющих структур:

· следования, или последовательности операторов;

· развилки, или условного оператора;

· повторения, или оператора цикла.

Регулярная программа - программа, составленная из канонических структур (имеет 1 вход и 1 выход, каждый оператор в программе может быть достигнут при входе через ее начало (нет недостижимых операторов и бесконечных циклов). Управление в такой программе передается сверху-вниз. Снабженные комментариями, такие программы хорошо читабельны).

Следование

A; B;

Действия А и В могут быть:

· отдельным оператором;

· вызовом с возвратом некоторой процедуры;

· другой управляющей структурой.

Развилка

IF P then A else B;

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

IF P then A ;

Повторение

Цикл – пока

 

While P do A ;

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

Цикл – до

Repeat A until P;

Повторение типа Repeat until всегда выполняется хотя бы 1 раз. Действие А перестает выполняться, как только предикат становится истинным.

4) выбор – переключатель case (обобщение развилки), структура, облегчающая программирование без ущерба для ясности программы. Структура выбор полезна в том случае, когда требуется выбрать одну из нескольких альтернатив.

 

В зависимости от значения Р выполняется одно из действий А, В, …Z. После чего происходит переход к выполнению следующей управляющей структуры.

3)Структурное и модульное программирование. Цели и основные принципы структурного программирования. Нисходящие проектирование. Структурное кодирование. Модульное программирование. Требования к программе, разработанной в соответствии с принципами структурного программирования.

Цели структурного программирования:

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

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

3) Уменьшить время и стоимость программной разработки (Достижимо при повышении производительности труда программиста);

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

Принципы структурного программирования:

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

2) Принцип формальности - предполагает строгий методический подход к программированию, придает творческому процессу определенную строгость и дисциплину

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

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

Нисходящее проектирование

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

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

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

Структурное кодирование

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

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

Модульное программирование

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

Программа, разработанная в соответствии с принципами структурного программирования, должна удовлетворять следующим требованиям:

· программа должна разделяться на независимые части, называемые модулями

· модуль - это независимый блок, код (текст) которого физически и логически отделен от кода других модулей;

· модуль выполняет только одну логическую функцию, иначе говоря, должен решать самостоятельную задачу своего уровня по принципу: один программный модуль - одна функция;

· работа программного модуля не должна зависеть:

1. от входных данных;

2. от того, какому программному модулю предназначены его выходные данные;

3. от предыстории вызовов программного модуля;

· размер программного модуля желательно ограничивать одной-двумя страницами исходного листинга (50-100 строк исходного кода);

· модуль должен иметь только одну входную и одну выходную точку;

· взаимосвязи между модулями устанавливаются по иерархической структуре;

· каждый модуль должен начинаться с комментария, объясняющего его назначение, назначение переменных, передаваемых в модуль и из него, модулей, которые его вызывают, и модулей, которые вызываются из него;

· при создании модуля можно использовать только стандартные управляющие конструкции: выбор, цикл, блок (последовательность операторов);

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

· в тексте модуля необходимо использовать комментарии, в особенности в сложных местах алгоритма;

· идентификаторы переменных и модулей должны быть смысловыми, «говорящими»;

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

· желательно не допускать вложенности более, чем трех уровней;

· следует избегать использования языковых конструкций с неочевидной семантикой и программистских «трюков».

Все эти вместе взятые меры направлены на повышение качества разрабатываемого программного обеспечения.

Жизненный цикл программного обеспечения

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

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

Основные этапы разработки

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