
- •Оглавление
- •Введение
- •1. Рекомендации по изучению теоретического материала
- •1.1. Общие указания
- •1.2. Рекомендации по конкретным разделам курса
- •1.3. Методология обобщенного программирования
- •Почему не интерфейсы?
- •Вызов объекта
- •Реализация компараторов
- •Техника traits
- •2. Рекомендации по подготовке эссе, рефератов и докладов
- •2.1. Эссе: рекомендации по подготовке
- •2.2. Рефераты: рекомендации по подготовке
- •2.3. Доклады: рекомендации по подготовке
- •2.4. Моделирующие программы: рекомендации по разработке
- •3.2. Домашнее задание №2. Использование алгоритмов и контейнеров данных в прикладной задаче. Задачи домашнего задания
- •Задание
- •Требования к отчетности
- •Предлагаемые этапы выполнения задания
- •Теоретический материал, необходимый для выполнения домашнего задания
- •Функциональный и объектно-ориентированный подходы к программированию – краткое описание
- •Основы uml
- •Понятие агрегации в объектно-ориентированном программировании
- •Рекомендованные правила оформления исходных текстов
- •4.1. Правила выбора идентификаторов
- •4.2. Выравнивание исходных текстов Символ табуляции запрещён
- •Выравнивание блоков
- •Пробелы
- •Длинные операторы
- •4.3. Комментарии
- •Заключение
- •Литература
- •Кафедра компьютерной фотоники
Требования к отчетности
В качестве отчета студент предоставляет в электронном виде программу на языке C++, решающую поставленную задачу, примеры тестовых данных о программы и отчет, описывающий основные принятые при разработке программы решения (в частности, в виде UML-диаграмм).
Предлагаемые этапы выполнения задания
Изучение теоретического материала.
Создание проекта программы.
Выделение основных классов и их операций.
Разработка UML-диаграмм.
Выбор используемых контейнеров данных и алгоритмов.
Выбор форматов данных, хранимых в файлах.
Разработка функциональных компонентов и консольных тестовых программ к ним.
Отладка функциональных компонентов.
Разработка пользовательского интерфейса.
Отладка программы в целом.
Оформление отчета.
Теоретический материал, необходимый для выполнения домашнего задания
Описание работы с классами в языке программирования C++
Класс в C++ - это определяемый пользователем тип данных. Переменную, типом которой является класс, называют объектом (экземпляром) класса.
В случае динамического выделения памяти мы создаем экземпляр класса в момент вызова new. Может существовать множество указателей на один и тот же экземпляр класса. Копирование указателя не приводит к копированию экземпляра класса.
Это правило иллюстрируется кодом ниже:
TClass* ptr_class1 = new TClass; //создан экземпляр класса
TClass* ptr_class2 = ptr_class1; //копируется указатель – их 2, экземпляр 1
TClass class1;
TClass class2 = class1; //Копируется объект, создан второй экземпляр
Пользователь может задать поля данных класса и методы класса. Поля данных (у каждого из которых есть тип) – это значения, которые объект класса должен помнить внутри себя. Методы – это операции, которые могут быть выполнены с объектом класса.
Например, может существовать класс строки, выглядящий примерно так:
class TString
{
public:
TString();//Конструктор класса – создание строки
~TString();//Деструктор – разрушение строки
//Методы установки значения строки и поиска символа – доступны //пользователю
void Set( const char* ptr_string );
int Find( char symbol );
private:
//Освобождение памяти – только изнутри класса.
void ReleaseMemory();
private:
char* ptr_Buffer;//Указатель на начало строки
int BufferLength;//Длина выделенной по адресу ptr_Buffer памяти
};
//Что мы делаем, когда создается новая строка
TString::TString()
{
//Мы обнуляем указатель и длину - память не выделена
ptr_Buffer = 0;
BufferLength = 0;
}
//Разрушение строки
TString::~TString()
{
//Достаточно вызвать метод освобождения памяти
ReleaseMemory();
}
//Если у нас вызовут метод Set и передадут нам строку – что мы сделаем
void TString::Set( const char* ptr_string )
{
//Определим необходимую длину строки
int need_length = strlen( ptr_string ) + 1;
if ( need_length > BufferLength )
{
//при необходимости выделим нужный объем памяти
ReleaseMemory();
ptr_Buffer = new char[ need_length ];
BufferLength = need_length;
}
//Скопируем переданную строку в выделенную память.
strcpy( ptr_Buffer , ptr_string );
}
//Что делать, если вызван метод ReleaseMemory (освободить память)
void TString::ReleaseMemory()
{
//Освободить выделенную память и установить в 0 указатель и длину
delete[] ptr_Buffer;
ptr_Buffer = 0;
BufferLength = 0;
}
//Что делать, если нас попросили найти в строке символ
int TString::Find( char symbol )
{
//Вызвать стандартную функцию strchr и определить номер символа по
//возвращаемому ей указателю на символ
char* ptr_symbol = strchr( ptr_Buffer , symbol );
if ( ptr_symbol )
return ptr_symbol - ptr_Buffer;
else
return -1;
}
int _tmain(int argc, _TCHAR* argv[])
{
TString string; //Создаем переменную типа TString
string.Set( "Test" ); //Устанавливаем ее значение
int pos1 = string.Find( 's' ); //Ищем символ
int pos2 = string.Find( 'a' ); //Ищем символ
printf( "%d %d" , pos1 , pos2 );
getch();
return 0;
}