К лабораторным работам по дисциплине

МЕТОДИЧЕСКИЕ УКАЗАНИЯ

“Проектирование программ в ИС”

Ч. 1 (2010-11-12 гг.)

-----------------------------------------------------------------------------

ОГЛАВЛЕНИЕ

ЛИТЕРАТУРНЫЕ ИСТОЧНИКИ, МЕТОДИЧЕСКИЕ УКАЗАНИЯ.. 2

ПРИМЕРНОЕ СОДЕРЖАНИЕ ОТЧЕТА. 2

ТРЕБОВАНИЯ К РАЗРАБАТЫВАЕМЫМ ПРОГРАММАМ.. 3

СПИСОК ЛАБОРАТОРНЫХ РАБОТ (3 семестр, 32 часа) 4

ЛАБОРАТОРНАЯ РАБОТА № 1. “Среда программирования С++. Разработка и документирование консольных приложений. Классы” (4 часа) 4

ЛАБОРАТОРНАЯ РАБОТА № 2. “Перегрузка функций. Разработка и реализация пользовательских классов” (4 часа) 10

ЛАБОРАТОРНАЯ РАБОТА № 3. “Ссылочный тип. Инициализация классов, конструкторы и деструкторы” (4 часа) 13

ЛАБОРАТОРНАЯ РАБОТА № 4. “Функции-друзья классов. Перегрузка операторов классов” (4 часа) 14

ЛАБОРАТОРНАЯ РАБОТА № 5. “Иерархии классов. Наследование” (4 часа) 15

ЛАБОРАТОРНАЯ РАБОТА № 6. “Пространства имен. Исключения” (4 часа) 16

ЛАБОРАТОРНАЯ РАБОТА № 7. “Шаблоны” (4 часа) 17

ЛАБОРАТОРНАЯ РАБОТА № 8. “Потоки ввода-вывода” (4 часа) 18


ЛИТЕРАТУРНЫЕ ИСТОЧНИКИ, МЕТОДИЧЕСКИЕ УКАЗАНИЯ

Основная литература

1. Павловская Т.А. С/С++. Программирование на языке высокого уровня. – СПб.: Питер, 2001. – 460 с.

2. Шилдт Г. Самоучитель С++, 3-е изд. – СПб.: БХВ-Петербург, 2003. – 688 с.

3. Буч, Г. Язык UML. Руководство пользователя / Г. Буч. - М. : ДМК, 2007. - 296 с.

4. Орлов С.А. Технологии разработки программного обеспечения: Учебник для вузов. – СПб.: Питер, 2004. – 527 с.

5. ГОСТ 19.701.

6. Справочный материал “Потоковый ввод-вывод” (см. в сети файл - ПотоковыйВводВывод ).

Дополнительная литература

7. Б. Страуструп. Язык программирования С++. М., Радио и связь, 1991. – 352 с.

8. Демидович Е.М. Основы алгоритмизации и программирования. Язык СИ. – Мн.: Бестпринт, 2003. – 384 с.

9. Шилдт Г. Справочник программиста по С/С++, 3-е изд. – М.: Изд. Дом Вильямс, 2003. – 432 с.

10. Йодан Э. Структурное программирование и конструирование программ. - М.: Мир, 1979.

11. Павловская Т.А., Щупак Ю.А. С++. Объектно-ориентированное программирование: практикум. – СПб.: Питер, 2004. – 265 с.

12. Буч, Г. Унифицированный процесс разработки программного обеспечения / Г. Буч, Дж. Рамбо, А. Якобсон. - СПб.: Питер, 2002. - 496 с.

13. Шмуллер Дж. Освой самостоятельно UML за 24 часа. – М.: Изд. Дом Вильямс, 2002. – 352 с.

14. Буч, Г. UML / Г. Буч, А. Якобсон, Дж. Рамбо. - СПб.: Питер, 2005. - 736 с.

15. UML [Электронный ресурс]. - 2007. - Режим доступа: http://www.uml.org.

ПРИМЕРНОЕ СОДЕРЖАНИЕ ОТЧЕТА

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

Обязательные разделы отчета:

1. Цель работы.

2. Описание задачи, задания, предметной области.

3. Описание контрольного (тестового примера).

4. Описание классов (при их использовании).

5. Описание диаграмм классов (при их использовании).

6. Описание структуры программы.

7. Описание алгоритмов.

8. Описание реализации программы.

Приложение 1. Листинги программы.

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

Приложение 3. Результаты испытания и тестирования программы (на контрольных примерах).

ПРИМЕЧАНИЕ

Пункты 2-8 повторяются для каждой задачи. После проверки исправления добавляются к отчету на новых листах либо (если незначительные) делаются на старом отчете.

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

В п.4 приводится описание разработанных классов: в виде графических блоков языка UML; в виде спецификаций (текстовых описаний) назначения (роли, обязанности) класса, свойств (назначение, тип), спецификаций методов (назначение, прототипы, входные-выходные данные).

В п.5 приводится описание разработанных диаграмм классов: в виде графических блоков языка UML со спецификацией (текстовым описанием) типов связей.

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

В п.7 приводится описание алгоритмов модулей (функций) в терминах графических схем программ [ГОСТ 19.701], а по указанию преподавателя на псевдоязыке и в виде диаграмм видов деятельности UML.

В п.8 приводится описание модулей приложения.

ТРЕБОВАНИЯ К РАЗРАБАТЫВАЕМЫМ ПРОГРАММАМ

1. Структурированность – текст программы должен быть составлен в соответствии с требованиями структурного программирования.

2. Документированность – до текста программы должен быть приведен текст задания и выполнена спецификация программы. Каждый модуль (функция, класс) программы специфицируется аналогично. В каждом модуле (функции, классе) должны быть специфицированы все объявляемые переменные.

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

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

СПИСОК ЛАБОРАТОРНЫХ РАБОТ (3 семестр, 32 часа)

Работа с базовыми элементами языка С++, разработка консольными Windows-приложений

ЛАБОРАТОРНАЯ РАБОТА № 1. “Среда программирования С++. Разработка и документирование консольных приложений. Классы” (4 часа)

ЦЕЛЬ РАБОТЫ

1. Знакомство с интегрированной средой (на примере Microsoft Visual Studio). Изучение ГОСТ 19.701 и правил описания графических схем алгоритмов.

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

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

СПИСОК ЗАДАЧ

Получить задания на разработку классов (например, арифметического и не арифметического классов - задачи 4, а, б)

ЗАДАЧА 1 (индивидуальное задание).

Объект автоматизации – предметная область типа “Неарифметический класс”, например, СТУДЕНТ, ГРУППА, ТОВАР, ПРАЙС, КНИГА, РЕЙС, МАРШРУТ и т.п.

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

1. 2-3 свойства-атрибута (один массивного типа).

2. Три конструктора (по одному каждого типа).

3. Методы, достаточные для установки и получения свойств объекта класса (например, TO_SET(), TO_SHOW() и т.п.).

4. Три перегруженных оператора (операторы типа “=”, а также двуместный и одноместный операторы).

ЗАДАЧА 2 (индивидуальное задание).

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

Для заданной предметной области следует разработать класс аналогично ЗАДАЧЕ 2.

ТЕОРИЯ. КЛАССЫ.

Класс представляет собой главное инструментальное средство C++ для объектно-ориентированного программирования. Класс очень похож на структуру, в которой сгруппированы элементы, соответствующие данным о некотором объекте, и оперирующие этими данными функции (называемые методами). Объект представляет собой некоторую сущность, например телефон. Класс C++ позволяет вашим программам определять все атрибуты объекта. В случае, когда объектом является телефон, класс может содержать такие элементы данных, как номер и тип телефона (кнопочный или дисковый) и функции, работающие с телефоном, например dial, answer, и hang_up. Группируя данные об объекте и кодируя их в одной переменной, вы упрощаете процесс программирования и увеличиваете возможность повторного использования своего кода.

Основные концепции:

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

- Программы на C++ представляют объекты посредством классов.

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

- Каждый класс имеет уникальное имя.

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

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

- Программы могут определять функцию класса внутри или вне определения класса. Если вы определяете функцию вне определения класса, вам следует указать имя класса и использовать оператор глобального разрешения, например class:: function.

Соответственно:

- Для определения класса программа должна указать имя класса, элементы данных класса и функции класса (методы).

- Определение класса обеспечивает шаблон, с помощью которого ваши программы могут создать объекты типа этого класса, подобно тому, как программы создают переменные типа int, char и т. д.

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

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

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

Класс позволяет вашим программам группировать данные и функции которые выполняют операции над этими данными. Большинство книг и статей об объектно-ориентированном программировании называют функции класса методами. Подобно структуре, класс C++ должен иметь уникальное имя, за которым следует открывающая фигурная скобка, один или несколько элементов и закрывающая фигурная скобка:

class class_name

{

int data_member; // Элемент данных

void show_member(int); // Функция-элемент

};

После определения класса вы можете объявлять переменные типа этого класса (называемые объектами), как показано ниже:

class_name object_one, object_two, object_three;

Следующее определение создает класс employee, который содержит определения данных и метода:

class employee

{

public:

char name[64];

long employee_id;

float salary;

void show_employee(void)

{

cout << "Имя: " << name << endl;

cout << "Номер служащего: " << employee_id << endl;

cout << "Оклад: " << salary << endl;

};

};

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

employee worker, boss, secretary ;

Следующая программа EMPCLASS.CPP создает два объекта employee. Используя оператор точку, программа присваивает значения элементам данных Затем программа использует элемент show_employee для вывода информации о служащем:

#include <iostream.h>

#include <string.h>

class employee

{

public:

char name [64];

long employee_id;

float salary;

void show_employee(void)

{

cout << "Имя: " << name << endl;

cout << "Номер служащего: " << employee_id << endl;

cout << "Оклад: " << salary << endl;

};

};

void main(void)

{

employee worker, boss;

strcpy(worker.name, "John Doe");

worker.employee_id = 12345;

worker.salary = 25000;

strcpy(boss.name, "Happy Jamsa");

boss.employee_id = 101;

boss.salary = 101101.00;

worker.show_employee();

boss.show_employee();

}

Как видите, программа объявляет два объекта типа employee — worker и boss, а. затем использует оператор точку для присваивания значений элементам и вызова функции show_employee.

Представление об объектах

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

ОПРЕДЕЛЕНИЕ МЕТОДОВ КЛАССА ВНЕ КЛАССА

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

class employee

{

public:

char name[64];

long employee_id;

float salary;

void show_employee(void); |————————> Прототип функции

};

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

void employee:: show_employee (void) //-------------->Имя класса

{

сout << "Имя: " << name << endl; Имя элемента cout << "Номер служащего: " << employee_id << endl;

cout << "Оклад: " << salary << endl;

};

Как видите, приведенный код предваряется определением функции с именем класса (employee) и оператором глобального разрешения (::). Следующая программа CLASSFUN.CPP помещает определение функции show_employee вне класса, используя оператор глобального разрешения для указания имени класса:

#include <iostream.h>

#include <string.h>

class employee

{

public:

char name [64];

long employee_id;

float salary;

void show_employee(void);

};

void employee::show_employee(void)

{

cout << "Имя: " << name << endl;

cout << "Номер служащего: " << employee_id << endl;

cout << "Оклад: " << salary << endl;

};

void main(void)

{

employee worker, boss;

strcpy(worker.name, "John Doe");

worker.employee_id = 12345;

worker.salary = 25000;

strcpy(boss.name, "Happy Jamsa");

boss.employee_id = 101;

boss.salary = 101101.00;

worker.show_employee();

boss.show_employee();

}

Методы класса

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

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

return_type class_name::function_name(parameters)

{ // Операторы }

ВТОРОЙ ПРИМЕР

Следующая программа PEDIGREE.CPP создает класс dog, который содержит несколько полей данных и функцию show_breed. Программа определяет функцию класса вне определения самого класса. Затем программа создает два объекта типа dog и выводит информацию о каждой собаке:

#include <iostream.h>

#include <string.h>

class dogs

{

public:

char breed[64];

int average_weight;

int average_height;

void show_dog(void)

};

void dogs::show_breed(void)

{

cout << "Порода: " << breed << endl;

cout << "Средний вес: " << average_weight << endl;

cout << "Средняя высота: " << average_height << endl;

}

void main(void)

{

dogs happy, matt;

strcpy(happy.breed, "Долматин") ;

happy.average_weight = 58;

happy.average_height = 24;

strcpy(matt.breed, "Колли");

matt.average_weight =22;

matt.average_height = 15;

happy.show_breed() ;

matt.show_breed();

}

ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ

1. Выполнить разработку консольных приложений в соответствии с заданиями преподавателя.

2. Изучить правила описания классов в языке UML [С. Кендалл. “UML. Основные концепции”. Глава 3, с. 30-32, Глава 6, с.77-80].

3. Разработать и описать классы индивидуальных заданий без использования конструкторов-деструкторов и перегрузки функций, методов, операторов. Результаты проектирования классов (диаграммы UML) согласовать с преподавателем!

ЛАБОРАТОРНАЯ РАБОТА № 2. “Перегрузка функций. Разработка и реализация пользовательских классов” (4 часа)

ЦЕЛЬ РАБОТЫ

1. Изучение перегрузки функций.

2. Программирование классов.

СПИСОК ЗАДАЧ

Перегрузка функций (задачи 5 а, б).

Индивидуальные задания.

ТЕОРИЯ. ПЕРЕГРУЗКА ФУНКЦИЙ

Перегрузка функций является особенностью языка C++, которой нет в языке С.

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

Перегрузка функций улучшает удобочитаемость программ

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

При определении функций в своих программах вы должны указать тип возвращаемого функцией значения, а также количество параметров и тип каждого из них. В прошлом (если вы программировали на языке С), когда у вас была функция с именем add_values, которая работала с двумя целыми значениями, а вы хотели бы использовать подобную функцию для сложения трех целых значений, вам следовало создать функцию с другим именем. Например, вы могли бы использовать add_two_values и add_three_values. Аналогично если вы хотели использовать подобную функцию для сложения значений типа float, то вам была бы необходима еще одна функция с еще одним именем. Чтобы избежать дублирования функции, C++ позволяет вам определять несколько функций с одним и тем же именем. В процессе компиляции C++ принимает во внимание количество аргументов, используемых каждой функцией, и затем вызывает именно требуемую функцию. Предоставление компилятору выбора среди нескольких функций называется перегрузкой.

Таким образом:

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

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

• В процессе компиляции C++ определит, какую функцию следует вызвать, основываясь на количестве и типе передаваемых параметров.

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

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

#include <iostream.h>

int add_values(int a,int b)

{ return(a+b); )

int add_values (int a, int b, int c)

( return(a+b+c); )

void main(void)

{

cout<<"200+801="<<add_values(200,801)<<endl;

cout<<"100+201+700="<<add_values(100,201,700)<<endl;

}

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

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

#include <iostream.h>

void show_message(void)

{

cout << "Стандартное сообщение: " << "Учимся программировать на C++" << endl;

}

void show_message(char *message)

{

cout << message << endl;

}

void show_message(char *first, char *second)

{

cout << first << endl;

cout << second << endl;

}

void main(void)

{

show_message();

show_message("Учимся программировать на языке C++!");

show_message("B C++ нет предрассудков!","Перегрузка - это круто!") ;

}

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

int day_of_week(int julian_day)

{

// Операторы

}

int day_of_week(int month, int day, int year)

{

// Операторы

}

ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ

1. Изучить правила перегрузки функций.

2. Реализовать задания по перегрузке функций.

3. Реализовать разработанные классы на языке С++ в виде консольных приложений, обеспечивающих использование их объектов.

4*. Повторить п.3, реализовав разработанные классы в виде оконных приложений.

ПРИМЕЧАНИЕ

Пункты * - выполняются по указанию преподавателя!


ЛАБОРАТОРНАЯ РАБОТА № 3. “Ссылочный тип. Инициализация классов, конструкторы и деструкторы” (4 часа)

ЦЕЛЬ РАБОТЫ

1. Изучение использования ссылочного типа в пользовательских классах.

2. Программирование классов с использованием конструкторов (по умолчанию, с параметрами, конструктора копирования) и деструкторов.

СПИСОК ЗАДАЧ

Лекционные примеры по использованию ссылочного типа.

Индивидуальные задания по разработке классов.

ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ

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

2. Воспроизвести лекционные примеры, выполнить задания по использованию ссылок.

3. Модифицировать классы индивидуальных заданий, использовав для их инициализации конструкторы всех типов.

4. Реализовать разработанные классы на языке С++ в виде консольных приложений, обеспечивающих использование их объектов.


ЛАБОРАТОРНАЯ РАБОТА № 4. “Функции-друзья классов. Перегрузка операторов классов” (4 часа)

ЦЕЛЬ РАБОТЫ

1. Изучение использования friend-функций для доступа к классам извне.

2. Изучение особенностей перегрузки операторов в пользовательских классах.

СПИСОК ЗАДАЧ

Индивидуальные задания по разработке классов.

ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ

1. Изучить правила использования friend-функций.

2. Изучить правила и способы перегрузки операторов.

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


ЛАБОРАТОРНАЯ РАБОТА № 5. “Иерархии классов. Наследование” (4 часа)

ЦЕЛЬ РАБОТЫ

1. Изучение правил наследования классов.

2. Реализация одиночного наследования классов.

3. Изучение управления методами и свойствами производных классов через объекты производных классов и через указатели на объекты производных классов.

4. Изучение правил описания наследования и диаграмм классов в языке UML.

СПИСОК ЗАДАЧ

Индивидуальные задания на разработку классов. Реализовать одиночное прямое наследование.

ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ

1. Изучить правила описания диаграмм классов с наследованием в языке UML [С. Кендалл. “UML. Основные концепции”. Глава 3, с. 36-37].

2. Для каждого индивидуального задания разработать и описать диаграммы классов с прямым наследованием. Для этого добавить классы, выполняющие роль базовых или производных по отношению к классу индивидуального задания. Для производного класса добавить 1-2 новых свойства и соответственно методы для их установки и получения (например, TO_SET(), TO_SHOW() и т.п.). Результаты проектирования классов (диаграммы UML) согласовать с преподавателем!

3. Описать на языке С++ разработанные классы, включая конструкторы производного класса.

4. Реализовать консольные приложения для демонстрации работы с объектами базовых и производных классов. Т.е. продемонстрировать: - вызов всех public-членов базового класса со стороны объектов базового класса; - вызов всех public-членов базового класса и всех public-членов производного класса со стороны объектов производного класса. Вызов членов реализовать сначала через сами объекты (оператор “.”), а затем через указатели на объекты (оператор “->”) – итого 6 вариантов.


ЛАБОРАТОРНАЯ РАБОТА № 6. “Пространства имен. Исключения” (4 часа)

ЦЕЛЬ РАБОТЫ

Знакомство с использованием пространств имен.

Знакомство с исключениями.

СПИСОК ЗАДАЧ

Индивидуальные задания на разработку классов.

ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ

1. Описать пространства имен и реализовать приложения.

2. Реализовать исключения для индивидуального задания.


ЛАБОРАТОРНАЯ РАБОТА № 7. “Шаблоны” (4 часа)

ЦЕЛЬ РАБОТЫ

1. Изучение правил написания шаблонов функций.

2. Изучение правил написания шаблонов классов.

3. Реализация шаблонов функций.

4. Реализация шаблонов классов.

СПИСОК ЗАДАЧ

Индивидуальные задания на разработку классов.

ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ

1. Изучить правила написания шаблонов функций и классов.

2. Для каждого индивидуального задания разработать шаблоны.

3. Реализовать консольные приложения для демонстрации работы шаблонов.


ЛАБОРАТОРНАЯ РАБОТА № 8. “Потоки ввода-вывода” (4 часа)

ЦЕЛЬ РАБОТЫ

Знакомство с объектно-ориентированной библиотекой ввода-вывода C++ (иерархия классов iostream).

СПИСОК ЗАДАЧ

Индивидуальные задания на разработку классов.

ЛИТЕРАТУРА

Выполнение работы ведется по методическому материалу “ Потоковый ввод-вывод” (см. в сети файл - ПотоковыйВводВывод).

ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ

1. Ознакомиться с объектно-ориентированной библиотекой ввода-вывода C++. Изучить классы, иерархии классов, методы.

2. Выполнить примеры с использованием методов get(), функции getline().

3. Выполнить примеры с использованием метода put().

4. Выполнить примеры с использованием методов организации файлового ввода-вывода.

5. Выполнить примеры с использованием с использованием манипуляторов.

6. Реализовать сохранение и загрузку данных (массива объектов) из файла для индивидуальных заданий.


ПРИМЕРНЫЙ СПИСОК индивидуальных ЗАДАЧ

Для структурной разработки и тестирования навыков - Задача 1. Составить и отладить программы табулирования функций для любых! допустимых значений всех исходных данных в следующей последовательности [см. в сети “СИ_Задание1”] (индивидуальная задача):

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

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

в) в виде одно файловой программы из нескольких функций, используя аппарат функций языка С;

г) в виде одно файловой программы из нескольких функций, используя аппарат функций языка С и передачу имени табулируемой функции (-ий) в качестве аргумента (-ов). В качестве табулируемых функций СЛЕДУЕТ брать 3 математические функции с одинаковым набором параметров, в качестве исходных данных СЛЕДУЕТ брать границы и шаг табулирования. Выбор табулируемой функции производится через простейшее меню.

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

Для структурной разработки и тестирования навыков - Задача 2. Составить и отладить программы обработки для любых! допустимых массивов данных (матриц) и строк – реализовать заданную последовательность элементарных преобразований и вычислений (например, ввести матрицу, найти максимальный элемент, транспонировать матрицу и т.п.). После каждого преобразования, вычисления все промежуточные результаты преобразования исходных данных выводить на экран дисплея или в отдельный файл в формате: - описание вида преобразования (выполняемого действия); - исходную матрицу (вид массива, строки и т.п. до действия); - преобразованную матрицу (вид массива, строки и т.п. после действия) или другие результаты вычислений; - запрос на продолжение и выполнение следующего действия (для выполнения следующего преобразования, вычисления пользователь должен нажать любую клавишу) [см. в сети “СИ_Задание2”] (индивидуальная задача).

Составить и отладить программы в следующей последовательности:

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

б) в виде одно файловой программы из одной функции с применением адресной арифметики и динамического распределения памяти под массивы данных заранее неопределенного размера (размер массива - задается после запуска программы как вводимое данное);

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

г) в виде много файловой программы из нескольких функций с обработкой массивов с применением аппарата функций языка С (на базе варианта “в”). Декомпозиция программы на файлы в виде проекта и с использование файла проекта;

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

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

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

Составить и отладить программы в следующей последовательности:

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

б)* для реализации файлового хранения структур данных и поддержки соответствующих файловых операций.

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

Задача 4. Разработать классы:

а) арифметические;

б) неарифметические.

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

Задача 5. Выполнить перегрузку функций.

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

Наши рекомендации