Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Для Оксаны 2.doc
Скачиваний:
0
Добавлен:
25.08.2019
Размер:
121.86 Кб
Скачать

1 Жизненный цикл программного продукта – это период времени, который начинается с момента принятия решения о необходимости создания программного продукта и заканчивается в момент его полного изъятия из эксплуатации. Программы любого вида характеризуются жизненным циклом, состоящим из этапов : a) маркетинг рынка программных средств, спецификация требований к программному продукту; b) проектирование структуры программного продукта; c) программирование (создание программного кода), тестирование, автономная и комплексная отладка программ; d) документирование программного продукта, подготовка эксплуатационной и технологической документации; e) выход на рынок программных средств, распространение программного продукта; f) эксплуатация программного продукта пользователями; g)сопровождение программного продукта; h) снятие программного продукта с продажи, отказ от сопровождения. №2 Понятие Модульного программирования. Модульность программ характеризуется тем, что вся программа состоит из модулей. Некоторые смысловые группы модулей сосредоточиваются в отдельных файлах.Один из способов решения сложной задачи – это разбиение её на части. В этом состоит метод нисходящего программирования.  При программировании на языке Си сложная программа может быть разделена на более простые подзадачи( функции). Это позволяет: 1)упростить структуру программы; 2) избежать избыточности кода, т.к. функции записывают один раз, а вызывать её на выполнение можно многократно; 3) упростить процесс отладки и сопровождение программы, поместив часто используемые ф-ии в библ. Разработанные ф-ии можно сгруппировать в отдельные файлы (модули ) компилируемые отдельно, кот. затем объединяются в исполняемою программу с помощью компоновщика.  Ф-ия – это самостоятельная единица программы, реализующая конкретную задачу или её часть. Каждая программа написанная на Си должна содержать главную ф-ию «main».

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

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

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

— модульность программ;

— структурное кодирование модулей программ;

— нисходящее проектирование рациональной иерархии модулей программ;

— нисходящая реализация программы с использованием заглушек;

— осуществление планирования на всех стадиях проекта;

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

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

4. Принципы объектно-ориентированного программирования

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

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

5. Понятие класса и объекта Описание классов.

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

Класс – программная конструкция для объединения функций и данных.

Класс для объекта – это тип. Т.e. класс можно рассматривать как шаблон для изготовления объектов. Важно помнить о том, что все рабочие данные хранятся в объекте. Класс не содержит никаких данных, он лишь описывает поведение объекта.

Классы редко бывают изолированными; напротив, они вступают в отношения друг с другом. Различают следующие отношения:

Ассоциация – классы взаимодействуют через указатели, которые объявляется внутри них и ссылаются на членов ассоциации

Агрегация – разновидность физического включения. Внутри класса объявлен

6. Атрибуты и методы класса Доступ к членам класса.

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

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

В определении класса на языке C++ и атрибуты, и методы называются членами этого класса; их определения могут следовать в тексте определения класса в произвольном порядке. Члены класса могут быть открытыми (public), или закрытыми (private); вне класса определен доступ только к его открытым членам, а закрытые члены доступны только методам своего класса. Так же члены могут быть защищёнными в этом случае они как и закрытые будут доступны методам своего класса, а так же методам наследственного класса.

7. Конструкторы и деструкторы.

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

Функцией обратной конструктору является деструктор. Эта функция вызывается при удалении объекта. Зачастую, при работе с объектом в момент его удаления должны выполняться некоторые действия. Например, если  при создании объекта для него динамически выделялась память, то её необходимо освободить при удалении объекта. Имя деструктора совпадает с именем класса, но с символом ~ (тильда) в начале.

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

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

8.Присваивание объектов. Указатели на объекты.

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

Оператор присваивания присваивает значение ячейке памяти. Операцию присваивания можно использовать несколько раз подряд. Операция присваивания выполняется поочередно, справа налево. В С++ существует пять операций присваивания, не считая основную операцию присваивания: “=”. Операции присваивания в С++:

+= операция присваивания-сложения; -= операция присваивания-вычитания;

*= операция присваивания-умножения; /= операция присваивания-деления;

%= операция присваивания-остатка от деления;

Указатель (pointer) - это переменная, которая содержит адрес другой переменной.

С помощью указателя осуществляется так называемая косвенная адресация (indirection), т.к. он не связан напрямую с данными в памяти.

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

9. Реализация принципов наследования в С++

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

Наследующий класс называется производным (наследником). Базовый класс определяет все те качества, которые будут общими для всех производных от него классов. Производный класс наследует эти общие черты и добавляет свойства, характерные только для него. Основная форма наследования базового класса: class имя_производного_класса : спец_доступа имя_базового_класса { };

спец_доступа – одно из ключевых слов:  public (открытый)   private (закрытый),  protected (защищённый). Спецификация доступа определяет то, как элементы базового класса наследуются производным классом. Если спец_доступа public, то все открытые члены базового класса остаются открытыми и в производном. Если спец_доступа наследуемого класса private, то все открытые члены базового класса становятся в производном закрытыми. В обоих случаях все закрытые члены базового класса в производном классе становятся недоступными. Важно понимать, что если спец_доступа ключевое слово private, то хотя открытые члены базового класса становятся закрытыми в производном, они остаются доступными для членов производного класса.

Таблица 1. Схема передачи режима доступа к элементам класса при наследовании

Режим доступа к элементу в базовом классе

Режим доступа при наследовании

Режим доступа в производном классе

private

 

public

недоступен

protected

protected

public

public

private

 

protected

недоступен

protected

protected

public

protected

private

 

private

недоступен

protected

private

public

private

10. Реализация Полиморфизма в С++. Перегрузка операций.

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

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

формат: тип_возвр_значения operator знак_операции(специф_параметров) {операторы_тела_функции}.Унарные операции, перегружаемые в рамках определенного класса, могут перегружаться только через нестатическую компонентную функцию без параметров. Вызываемый объект класса автоматически воспринимается как операнд.Любая бинарная операция @ может быть определена двумя способами: либо как компонентная функция с одним параметром, либо как глобальная (возможно дружественная) функция с двумя параметрами. В первом случае x @ y означает вызов x.operator @(y), во втором – вызов operator @(x, y).

11. Реализация Полиморфизма в С++. Перегрузка функций

Полиморфизм –см вопрос 10

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

Методы класса, так же как и обычные функции, можно перегружать.

12. Дружественные функции

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

1.Дружественная функция вызывается как обычная функция; она не член класса и к ней нельзя обратиться, используя имя объекта и операцию доступа к члену класса.

2. Хотя дружественная функция «знает» о закрытых элементах класса, для которого она является другом, доступ к ним она может получить только через объект этого класса, который объявляется внутри неё или передается ей.

13. Виртуальные функции.

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

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

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

Виртуальная функция должна быть членом класса, она не может быть дружественной для класса, в котором она определена, но она может быть другом другого класса

Таким образом, базовый класс задает основной интерфейс, который будут иметь производные классы, а производные классы задают свои методы. Отделение интерфейса от определения метода позволяет создавать классы библиотек.

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

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

Форма объявления чисто виртуальной функции:

virtual тип имя_функции (список форм.параметров)=0;

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

14.  Тестирование программных продуктов. Назначение. Принципы.

Тестирование является одним из этапов ЖЦ ПП, направленным на повышение качественных характеристик. При создании типичного ПП от 30% до 60% общей трудоемкости отводится на тестирование.

Особенностями тестирования ПП

1)  Отсутствие эталона (программы), которому должна следовать тестируемая

программа).

2) Высокая сложность программ и принципиальная невозможность исчерпывающего тестирования.

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

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

1.Процесс тестирования более эффективен, если его проводит не автор.

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

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

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

5.Необходимо проверять не только,  делает ли программа то, для чего она предназначена, но не делает ли она то, что не должна делать.

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

15. Методы тестирования программ.

Процесс отладки включает:

- действия, направленные на выявление ошибок (тестирование);

- диагностику и локализацию ошибок (определение характера и местонахождение ошибок);

- внесение исправлений в программу с целью устранения ошибок.

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

Наиболее трудоемким и детализированным является детерминированное тестирование, которое требует многократного выполнения программы на ЭВМ с использованием определенных, специальным образом подобранных наборов данных. Детерминированное тестирование в силу трудоемкости возможно применять для отдельных модулей в процессе сборки программы или для небольших и несложных программных комплексов.

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

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

- системный тест или лабораторные испытания;

- опытная эксплуатация;

- приемочный тест.

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

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

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

16. Методы проектирования тестовых наборов данных

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

1) покрытие операторов – выбор такого тестового набора данных, который вызывает выполнение каждого оператора в программе хотя бы один раз;

2) покрытие узлов ветвления – проход по веткам «истина» и «ложь» хотя бы один раз;

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

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

К стратегии «черного ящика» относятся методы:

1)эквивалентного разбиения; 2)анализ граничных значений;3)функциональных диграмм.

Эквивалентное разбиение осуществляется в два этапа:

1.Выделение классов эквивалентности. 2. Построение тестов.

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

Применение данного метода носит творческий характер, требует специализации в данной области

17. Документирование и сопровождение программных продуктов

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

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

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

На машинном уровне программного продукта, как правило, создаются:

-         автоматизированная контекстно-зависимая помощь (HELP);

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

В соответствии с ГОСТ описание программного продукта должно содержать следующие разделы:

1        Общие сведения.

2        Функциональное назначение.

3        Описание логической структуры.

4        Требования к техническому обеспечению.

5        Вызов программы.

6        Входные данные.

7        Выходные данные.

8        Описание тестовых прогонов.

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

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

18. Парадигма визуального программирования.

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

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

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