Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Требования к отчетности




Домашнее задание №2. Использование алгоритмов и контейнеров данных в прикладной задаче.

Задачи домашнего задания

Задачами данного задания являются:

1. Закрепление полученных знаний об алгоритмах и контейнерах STL.

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

Задание

Разработать программу на языке C++, решающую задачу в соответствии с вариантом задания.

Варианты задания:

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

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

Землю можно считать плоской.

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

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

4. Разработать программу, хранящую список доступных карт и список установленных. В каждом списке для карты задано имя и дата обновления. Пользователь может:

1. Сформировать заказ на карты – выбрать из списка доступных ему нужные. Уже установленные автоматически отбрасываются.

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

3. Загрузить новый список доступных карт.

4. Загрузить новый список установленных карт.

5. Разработать программу – редактор символов. Символом является совокупность отрезков и окружностей. Программа хранит набор символов, пользователь может выбрать символ для редактирования, добавить в него отрезок или окружность, удалить из него отрезок или окружность.

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

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

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

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

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

Предлагаемые этапы выполнения задания

1. Изучение теоретического материала.

2. Создание проекта программы.

a. Выделение основных классов и их операций.

b. Разработка UML-диаграмм.

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

d. Выбор форматов данных, хранимых в файлах.

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

4. Отладка функциональных компонентов.

5. Разработка пользовательского интерфейса.

6. Отладка программы в целом.

7. Оформление отчета.

Теоретический материал, необходимый для выполнения домашнего задания

Описание работы с классами в языке программирования 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;

}

Функциональный и объектно-ориентированный подходы к программированию – краткое описание

Основные принципы функционального подхода к программированию следующие:

1. Мы задаем себе вопрос «Что программа должна сделать» и формулируем ответ на него.

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

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

4. Как правило, существующие в программе функции соответствуют глаголам постановки задачи.

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

Основы объектно-ориентированного проектирования следующие:

1. Мы задаем себе вопрос «с какими объектами работает наша программа?» Какие объекты реального мира она моделирует? Какими свойствами обладают эти объекты и какие операции могут с ними выполняться?

2. После этого мы создаем классы (возможные типы объектов), методы и члены данных.

3. Если реализация какого-то метода нетривиальна – обычно это говорит о необходимости промоделировать (более точно, чем раньше) тот или иной объект.

4. Как правило, существующие в программе классы соответствуют существительным постановки задачи.

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

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

1. Инкапсуляция – объединение данных и методов в рамках класса и скрытие данных от пользователя (как правило, пользователь может вызвать лишь методы класса).

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

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

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




Поделиться с друзьями:


Дата добавления: 2015-01-03; Просмотров: 347; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.031 сек.