Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Б3.Б.5 Основы объектно-ориентированного программирования

.pdf
Скачиваний:
21
Добавлен:
28.03.2016
Размер:
1.59 Mб
Скачать

10.Жизненный цикл объекта. Инициализация массивов. Конструкторы и деструкторы. Порядок вызова конструкторов и деструкторов при наследовании.

11.Варианты реализации отношения клиент-сервер. Объекты при передаче параметров и возврате из методов.

12.Исключения в C++. Обработка исключений.

13.Шаблоны классов и шаблоны функций. Специализация.

14.Основы STL. Структура и назначение. Контейнеры. Алгоритмы

15.Стандартная библиотека, ввод-вывод

Пример экзаменационного билета:

БИЛЕТ №2

1.Основные принципы объектного подхода. Абстрагирование.

2.Средства абстракции C++. Структура класса. Статические члены и их инициализация

Примеры заданий для лабораторных работ

(полное описание лабораторных работ приводится в Приложении А к данной программе):

Задание №2. Перегрузка функций, указатели на функции, перечисления

2а (8 баллов)

Написать программу сортировки содержимого файла на диске.

Исходный файл содержит данные одного из 3 типов: строки либо целые числа либо вещественные числа. Тип содержимого задается ключом в первом параметре программы. Максимальная длина строки в файле — 1024 символа. Строки могут содержать пробелы и разделены символом первода строки '\n'.

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

Исходный файл задается третьим параметром, файл для сохранения результата — четвертым параметром программы:

filesort.exe –x –y input_file output_file

Где x может принимать значения: s (строки), i (целые числа), f (плавающая точка) Где y может принимать значения: a (ascending — по возрастанию), d (descending — по убыванию)

Общие указания:

Для чтения исходного файла нужно использовать функцию scanf

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

namespace storage { struct Storage {

int count; //хранит текущее число используемых элементов в массиве int allocated; //хранит реальный выделенный размер массива pchars

char **pchars; //массив указателей, размер которого можно динамически изменять

};

21

/* Создает экземпляр структуры в динамической памяти и выделяет память под pchars заданного размера */

Storage* allocate(int initial_capacity);

/*Освобождает память под строки указатели на которые хранятся в pchars, память под pchars и структуру Storage */

void free (Storage* pcont);

/* Добавляет (копирует) строку в содержимое, при этом при необходимости изменяет размер выделенной памяти под pchars увеличивая его в полтора раза */

void add_string (Storage* pcontent, const char* pchars);

}

В случае работы (сортировки) с целыми или вещественными числами, необходимо прочитанные строки сохраняемые в структуре storage::Storage преобразовать в массив чисел double[] или int[] размещенный в свободной памяти

Для преобразования чисел из строки можно использовать функцию sscanf Сортировка строк ведется в лексикографическом порядке (по кодам символов) Режим сортировки должен быть представлен перечислением enum SortMode {ASC,

DESC};

Функции сортировки должны быть перегружены по аргументу: namespace sort {

void sort (char** parray, int len, SortMode m); void sort (double* pdarray, int len, SortMode m); void sort(int* piarray, int len, SortMode m);

};

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

сравнение разными способами для данного типа должны быть собраны в отдельные модули (double_sort.cpp, int_sort.cpp, string_sort.cpp)

Таким образом программа должна состоять минимум из 5 модулей (исходных cpp файлов) и двух заголовочных файлов:

storage.h (объявления для Storage)

storage.cpp (содержит реализацию функций для Storage) sort.h (объявления для функций сортировки)

double_sort.cpp (содержит реализацию сортировки для вещественных чисел) int_sort.cpp (для целых)

string_sort.cpp (для строк)

main.cpp (главный модуль ответственный за чтение исходных данных, запуск сортировки, сохранение результата)

2б (2 балла)

Реализовать режим сортировки путем случайного перемешивания исходного содержимого (режим RAND, ключ режима –r )

Дополнительное указание: можно использовать сортировку по значению хеш-фукнции над исходной строкой вне зависимости от типа данных, т. е. сортировать сущности struct CharsWithHash {

char* pchar; int hash;

};

22

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

Впроцессе обучения студентов применяются следующие формы контроля успеваемости:

Посещаемость лекций

Результат письменного теста на коллоквиуме (балльно-рейтинговая система)

Посещаемость лабораторных занятий.

Выполнение и сдача заданий для лабораторных работ (балльно-рейтинговая

система)

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

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

На письменном коллоквиуме студент может набрать от 0 до 21 баллов.

За пропуски занятий начисляются штрафные баллы в размере 3 балла за занятие.

Тема задания

Максимальный

 

 

балл

1.

Раздельная компиляция и пространства имен

10

баллов

2.

Перегрузка функций, указатели на функции, перечисления

10

баллов

3.

Классы. Реализация упрощенного григорианского календаря

10+5 = 15 баллов

4.

Классы. Перегрузка операций. Реализация матрицы и вектора

8+7 = 15 баллов

5.

Иерархии классов, наследование. Реализация командного

15+5 = 20 баллов

 

процессора

 

 

6.

Шаблоны. Реализация шаблонов вектора и матрицы, реализация

10

+ 10 = 20

 

шаблона «умного» указателя

баллов

7.

Реализация эмулятора АЛУ

30

баллов

Распределение оценок (максимально за семестр с учетом коллоквиума можно набрать 141 балл):

65+ баллов – оценка «удовлетворительно»

85+ баллов – оценка «хорошо»

105+ баллов – оценка «отлично»

Итоговая оценка на экзамене формируется из оценки за работу в семестре выставленной по набранным баллам и устного ответа на вопросы экзаменационного билета.

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

23

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

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

1.Б. Страуструп Язык программирования C++, спец. изд., 3 изд. /Пер. с англ. — СПб.; М.: «Невский Диалект» — «Издательство БИНОМ», 2004 г., 2011 г. ISBN

978-5-7989-0425-9, 0-201-70073-5, 5-7940-0064-3, 5-7989-0223-4, 5-7940-0064-3

б) дополнительная литература:

2.Г. Буч, Объектно-ориентированный анализ и проектирование с примерами приложений на С++, 2-е изд./Пер. с англ. — СПб.; М.: «Невский Диалект» — «Издательство БИНОМ», 1999 г. ISBN 0-8053-5340-2, 5-7989-0067-3, 5-7940-0017- 1

3.Г. Буч, Объектно-ориентированный анализ и проектирование с примерами приложений. 3-е изд. /Пер. с англ. «Вильямс». 2010 г. ISBN 978-5-8459-1401-9, 0- 201-89551-X

4.Б. Страуструп Дизайн и эволюция языка C++, Пер. с англ. – ДМК Пресс, Питер, 2006г. ISBN 5-469-01217-4, 0-201-54330-3; 2006 г. ISBN 978-5-94074-738-3; 2011 г.

5.Скотт Мейерс, Эффективное использование C++. 50 рекомендаций по улучшению ваших программ и проектов, Пер. с англ. – ДМК, 2006. ISBN: 5-469-01213-1, 0- 201-92488-9

6.Скотт Мейерс, Эффективное использование С++. 55 верных советов улучшить структуру и код ваших программ. Книга по требованию. ISBN 9785940743040; 2006 г.

7.Скотт Мейерс, Наиболее эффективное использование С++. 35 новых рекомендаций по улучшению ваших программ и проектов. Пер. с англ. ДМК.

ISBN 5-94074-033-2; 2012 г

8.Скотт Мейерс, Эффективное использование STL. Питер. ISBN 5-94723-382-7; 2002 г.

в) учебно-методическая литература:

9.Рылов В.Ю. «Основы Объектно-ориентированного программирования». Электронный лекционный курс. Новосибирск 2012. (свободно доступно по адресу https://sites.google.com/site/nguoop/materialy-lekcij---s)

10.Мухортов В.В., Рылов В.Ю. Объектно-ориентированное программирование, анализ и дизайн. Методическое пособие. ИМ СО РАН, 2002 г. (свободно доступно по адресу https://sites.google.com/site/nguoop/materialy-lekcij---

s/OOP%26OOD.PDF?attredirects=0&d=1)

9. Перечень ресурсов информационно-телекоммуникационной сети «Интернет», необходимых для освоения дисциплины

1)Основным учебно-образовательным ресурсом курса является WWW сайт http://sites.google.com/site/nguoop

На данном сайте представлены:

Правила учета успеваемости

Посещаемость лекций в текущем учебном году

Демонстрационные презентации лекций курса в формате Microsoft Power Point

Демонстрационные примеры программ, представленные на лекциях

Условия практических заданий и курсовых работ для текущего учебного года

Список основной и дополнительной литературы

Список вопросов для самоподготовки к экзамену

2)Справочный сайт по языку C++ и стандартной библиотеке (на английском языке): http://www.cplusplus.com/

3)Справочный сайт Microsoft Developer Network, Visual C++ в Visual Studio 2013 (на русском языке) https://msdn.microsoft.com/ru-ru/library/60k1461a.aspx

4)http://www.omg.org – Object Management Group (Теория объектного подхода, UML)

5)https://code.google.com/p/googletest/ - Google C++ Testing Framework

10.Методические указания для обучающихся по освоению дисциплины

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

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

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

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

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

1)Операционная система Microsoft Windows 7/8

2)Microsoft Visual Studio Express 2013 for Windows (свободная лицензия)

3)Либо Microsoft Visual Studio 2013 (коммерческая либо академическая лицензия)

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

Для проведения лекций необходима аудитория оснащенная экраном и проектором, подключенным к персональному компьютеру/ноутбуку, оснащенному средством просмотра демонстраций в формате Microsoft Power Point.

Для проведения лабораторных занятий по C++ необходим терминальный класс, оснащенный персональными компьютерами под управлением операционных систем

Microsoft Windows.

25

Приложение А

(обязательное)

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

1. План-график выполнения СРС по дисциплине

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

Вид самостоятельной

 

 

 

 

 

 

Номер недели семестра

 

 

 

 

 

 

работы

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Изучение

 

1

1

1

1

1

1

1

1

1

1

1

1

1

1

 

 

разделов

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

дисциплины по

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

учебной

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

литературе,

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

электронным

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

презентациям

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

лекций

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Подготовка к

 

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

 

лабораторным

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

занятиям

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Реализация

1

1

2

1

2

1

1

2

1

2

1

1

2

1

2

3

 

заданий

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

лабораторных

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

работ

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Итого

1

3

4

3

4

3

3

4

3

4

3

3

4

3

4

4

 

в неделю

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

часов

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

2.Характеристика и описание заданий на СРС

Впроцессе изучения дисциплины предусмотрены следующие контрольные точки:

Контрольная точка

Срок сдачи (номер недели

семестра)

 

Раздельная компиляция и пространства имен

3 неделя

Перегрузка функций, указатели на функции,

5 неделя

перечисления

 

Классы. Реализация упрощенного григорианского

8 неделя

календаря

 

Классы. Перегрузка операций. Реализация матрицы и

10 неделя

вектора

 

Коллоквиум

12 неделя

Иерархии классов, наследование. Реализация

13 неделя

командного процессора

 

Шаблоны. Реализация шаблонов вектора и матрицы,

15 неделя

реализация шаблона «умного» указателя

 

Реализация эмулятора АЛУ

16 неделя

26

Задание №1. Раздельная компиляция и пространства имен (namespaces) Пример программы

File module1.h:

#include <string>

namespace Module1

{

std::string getMyName();

}

File module1.cpp

#include "module1.h"

namespace Module1

{

std::string getMyName()

{

std::string name = "John"; return name;

}

}

File module2.h:

#include <string>

namespace Module2

{

std::string getMyName();

}

File module2.cpp

#include "module2.h"

namespace Module2

{

std::string getMyName()

{

std::string name = "James"; return name;

}

}

File main.cpp:

#include "module1.h"

#include "module2.h"

#include <iostream>

int main(int argc, char** argv)

{

std::cout << "Hello world!" << "\n";

std::cout << Module1::getMyName() << "\n"; std::cout << Module2::getMyName() << "\n";

using namespace Module1;

std::cout << getMyName() << "\n"; // (A) std::cout << Module2::getMyName() << "\n";

//using namespace Module2; // (B)

//std::cout << getMyName() << "\n"; // COMPILATION ERROR (C)

using Module2::getMyName;

std::cout << getMyName() << "\n"; // (D)

}

Задача 1а (2 балла)

Собрать программу и убедиться, что на каждый *.cpp файл создается отдельный объектный файл с тем же именем (для Visual Studio, например, в папке Debug будут создаваться файлы с расширением *.obj).

27

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

Объяснить, что выведется при выполнении строк с комментариями (А) и (D) в main.cpp

Убедиться, что раскомментирование строк (B) и (C) в main.cpp приводит к ошибке компиляции. Объяснить, почему эта ошибка происходит, и предложить пути её устранения.

Добавить в программу еще одну функцию getMyName(), возвращающую имя Peter. Обернуть её в еще одно пространство имён.

Объяснить, как можно избавиться от необходимости писать std::cout и вместо этого писать просто cout.

Задача 1б (8 баллов)

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

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

Аргументы командной строки программы:

> changer.exe input.txt output.txt Hello Goodbye

Требования к программе:

Работа с файлами должна осуществляться стандартными средствами C (fscanf, fprintf).

Каждая прочитанная строчка должна быть преобразована в тип std::string

Для замены содержимого строки воспользуйтесь методами класса std::string (см. http://www.cplusplus.com/reference/string/string/)

При записи нового файла тип std::string можно приводить к C-строкам (см. документацию к классу std::string)

Преобразование исходного файла должно быть вынесено в отдельный модуль и реализовано в виде функции replace_strings(FILE *in, FILE *out, char *what, char *repl);

Функция replace_strings должна быть объявлена в отдельном пространстве имен

Задание №2. Перегрузка функций, указатели на функции, перечисления 2а (8 баллов)

Написать программу сортировки содержимого файла на диске.

28

Исходный файл содержит данные одного из 3 типов: строки либо целые числа либо вещественные числа. Тип содержимого задается ключом в первом параметре программы. Максимальная длина строки в файле — 1024 символа. Строки могут содержать пробелы и разделены символом первода строки '\n'.

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

Исходный файл задается третьим параметром, файл для сохранения результата — четвертым параметром программы:

filesort.exe -x -y input_file output_file

Где x может принимать значения: s (строки), i (целые числа), f (плавающая точка) Где y может принимать значения: a (ascending — по возрастанию), d (descending — по убыванию)

Общие указания:

Для чтения исходного файла нужно использовать функцию scanf

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

namespace storage { struct Storage {

int count;

//хранит текущее число используемых элементов в массиве

int allocated;

//хранит реальный выделенный размер массива pchars

char **pchars; //массив указателей, размер которого можно динамически изменять

};

/* Создает экземпляр структуры в динамической памяти и выделяет память под pchars заданного размера */

Storage* allocate(int initial_capacity);

/*Освобождает память под строки указатели на которые хранятся в pchars, память под pchars и структуру Storage */

void free (Storage* pcont);

/* Добавляет (копирует) строку в содержимое, при этом при необходимости изменяет размер выделенной памяти под pchars увеличивая его в полтора раза */

void add_string (Storage* pcontent, const char* pchars);

}

В случае работы (сортировки) с целыми или вещественными числами, необходимо прочитанные строки сохраняемые в структуре storage::Storage преобразовать в массив чисел double[] или int[] размещенный в свободной памяти

Для преобразования чисел из строки можно использовать функцию sscanf

Сортировка строк ведется в лексикографическом порядке (по кодам символов)

Режим сортировки должен быть представлен перечислением enum SortMode {ASC,

DESC};

Функции сортировки должны быть перегружены по аргументу:

namespace sort {

void sort (char** parray, int len, SortMode m); void sort (double* pdarray, int len, SortMode m); void sort(int* piarray, int len, SortMode m);

};

29

Для реализации сортировки можно использовать функцию qsort стандартной библиотеки

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

Реализации функции сортировки для каждого типа, а также функции реализующие сравнение разными способами для данного типа должны быть собраны в отдельные модули (double_sort.cpp, int_sort.cpp, string_sort.cpp)

Таким образом программа должна состоять минимум из 5 модулей (исходных cpp файлов) и двух заголовочных файлов:

1.storage.h (объявления для Storage)

2.storage.cpp (содержит реализацию функций для Storage)

3.sort.h (объявления для функций сортировки)

4.double_sort.cpp (содержит реализацию сортировки для вещественных чисел)

5.int_sort.cpp (для целых)

6.string_sort.cpp (для строк)

7.main.cpp (главный модуль ответственный за чтение исходных данных, запуск сортировки, сохранение результата)

2б (2 балла)

Реализовать режим сортировки путем случайного перемешивания исходного содержимого (режим RAND, ключ режима -r )

Дополнительное указание: можно использовать сортировку по значению хеш-фукнции над исходной строкой вне зависимости от типа данных, т. е. сортировать сущности struct CharsWithHash {

char* pchar; int hash;

};

Задание №3. Классы

3а (10 баллов)

Написать программу реализующую работу с упрощенным григорианским календарем (датами).

Использовать следующие правила для календаря:

Минимальный год — 1-ый год н.э., максимальный год 9999 н.э.

Момент времени представляется годом, месяцем, числом месяца, часом, минутами, секундами

Каждый год, номер которого кратен 4 является високосным

Каждый год, номер которого кратен 100 не является високосным

Каждый год, номер которого кратен 400 является високосным

Часовой пояс не учитывается (считается равным UTC)

Не учитывать правило, согласно которому следующим днем после 4 октября 1582 года идет 15 октября 1582 года

Не требуется совпадение юлианского и данного календаря в датах до 4 октября 1582 года (проблема високосных годов кратных 100 но не кратных 400)

Класс даты должен поддерживать корректные операции приращения минут, секунд, часов, дней, месяцев и лет с учетом правил календаря.

Месяцы реализовать перечислением Month {Jan=1, …, Dec = 12}.

30