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

Рекомендации по организации кода проекта

При выполнении лабораторной работы студентам предполагается придерживаться следующей структуры для кода проекта, включающей как минимум три файла: main.cpp – «главный» модуль, управляющая программа; application.h – интерфейс «исполнителя» приложения, содержащий прототипы и объявления; application.cpp – реализация «исполнителя» приложения, определения интерфейсов приложения.

$с++ main.cpp application.cpp –o main

// filename: application.h

#ifnde APPLICATION_H__

#define APPLICATION_H__

/* Класс, предназначенный для хранения информации об объекте информатизации */

class MyClass {. . .};

/* Класс «Хранилище» */

MyClass MyStorage{

private:

enum{SIZE=1024};

MyClass Arr[SIZE];

. . .

};

// Бизнес-логика проекта

struct Application {}; // определение структуры данных, «обертки» для класса

int appRun(Application& app); // объявление «главной» функции проекта

int appMenu(Application& app);

int appCreateData(Application& app);

int appClearData(Application& app);

int appLoadData(Application& app);

int appSaveData(Application& app);

int appDisplayData(Application& app);

. . .

#endif

// filename: application.cpp

#include “application.h”

#include <iostream>

using namespace std;

// Данный модуль содержит реализацию интерфейсов создаваемых классов

MyClass::MyClass() {

. . .

}

. . .

MyStorage::MyStorage() {

. . .

}

// определение бизнес-логики «главной» функции проекта

int appRun(Application& app)

{

if(app == NULL)

{

cout << “Error: Bad object Application.” << endl;

return 1;

}

cout << “Run Application.” << endl;

appCreateData(app);

while(1) // «Главный» цикл программы

{

appMenu(app); // Отображение на экран меню пользователя

}

appClearData(app);

return 0;

}

// filename: main.cpp

//главный модуль проекта

#include “application.h”

#include <iosteam>

using namespace std;

int main(void)

{

appRun();

return 0;

}

Лабораторная работа №2. Использование «исключений» при разработке устойчивых программных систем.

Задание. Используя технологию объектно-ориентированного проектирования решить задачу разработки проблемно-ориентированного программного обеспечения (ПО). Средствами языка С++ разработать класс, предназначенный для хранения информации об некотором объекте информатизации (автоматизации). Все члены данных (атрибуты класса) должны быть определены в «закрытой» секции. Для всех вариантов заданий обязательным является требование о наличии в классе членов-данных, отвечающих за хранение информации о дате и времени «создания» объекта предметной области, подлежащего автоматизации. Для разрабатываемого класса определить следующие конструкторы: конструктор по умолчания, перегруженный конструктор, конструктор копирования. Открытый интерфейс класса должен как минимум содержать следующие методы, предназначенные для работы с атрибутами класса: get( ), set( ), print( ). Кроме этого, необходимо определить дружественные перегруженные операции operator>> и operator<< для ввода/вывода объектов в стандартные символьные потоки (Character OUTput, Character INput).

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

/* Классы, предназначенные для хранения значения даты и времени */

/* ---------- класс, определенный пользователем ---------- */

class MyClass : public TTime, public TData {

. . .};

MyClass MyStorage{ /* Класс «Хранилище» */

private:

enum{SIZE=1024};

MyClass Arr[SIZE]; /* статический массив экземпляров объектов класса */

};

MyClass MyStorage{ /* Класс «Хранилище» */

private:

int SIZE;

MyClass* Arr; /* динамический массив … */

};

Объяснить, какие конструкторы были использованы в процессе создания массивом экземпляров класса. Предусмотреть программные средства контроля ошибок типа: передача некорректного значения индекса элемента массива, ошибки выделения памяти из «кучи». В качестве метода защитного программирования использовать «стандартный механизм обработки исключений» (try … catch). Для программ разработать тестовые примеры.

class MyClass { . . . }; // Класс для представления «объектов»

class MyStorage { . . . }; // Класс «хранилище»

int main() {

set_new_handler(); // Установить собственный обработчик

// «ошибок» выделения памяти в куче

MyClass* p = NULL;

int num_objects, i;

// ввод количества экземпляров «объектов»

cin >> num_objects;

MyStorage stash(num_objects);

// Загрузить экземпляры класса MyClass

for(i=0; i<num_objects; i++) {

p=new MyClass( );

p.set();

stash.append(p);

}

// Выполнить обработку данных, затем удалить объекты…

for(i=0; i<num_objects; i++) {

stash[i]->print(); // stash.at(i)->print();

. . .

}

stash.clear();

}

При разработке программы исходить из следующего перечня «вариантов использования», то есть действий, поддерживаемых программой:

        1. Создать «базу данных» (БД) для хранения экземпляров классов, соответствующих «объектам автоматизации».

        2. Сохранить созданную в оперативной памяти, адресном пространстве приложения, БД в текстовом/бинарном файле. Предложить возможность сохранения файла в CSV-формате либо другом, «OpenDocumen»t-совместимом формате.

Загрузить БД из текстового/бинарного файла.

В контексте взаимодействия с БД должны поддерживаться следующие «прецеденты»:

  1. Создать новую запись и задать для неё значения атрибут.

  2. Сохранить новую запись в БД, то есть включить ее состав структуры хранения записей.

  3. «Вставить» сохраняемую запись в БД в заданную позицию.

  4. Вывести список существующих в БД записей в формате «номер записи : список атрибут». Если вся совокупность записей, сохраненных в БД, при выводе не умещаются на экране компьютера, в окне терминала, то необходимо организовать постраничный вывод.

  5. Найти запись в БД по значению индекса, номера в массиве экземпляров класса объектов MyClass, и вывести ее на экран в формате «номер записи : список атрибут».

  6. Редактировать атрибуты существующей в БД записи. Для указания записи пользователь вводит ее номер.

  7. Очистить БД, то есть удалить из нее все записи.

  8. Удалить из БД часть записей, указав значения диапазона индексов для записей подлежащих удалению. После удаления записей произвести «дефрагментацию» хранилища данных.

Общие требования к структуре класса MyStorage и его интерфейсам:

  1. Создание динамического либо статического массива экземпляров объектов класса MyClass.

  2. Разработать механизмы для работы с псевдо контейнером MyStorage, предназначенным для хранения информации об объекте автоматизации.

  3. В случае, когда в классе MyStorage используется динамический массив экземпляров класса MyClass, предусмотреть контроль над процессом освобождения ресурсов.

  4. Реализовать следующие механизмы обеспечения проверки правильности значения индекса: для operator[] использовать assert(), а для at() – trycatch (обработка исключения std::out_of_range).

Создать шаблон myVector по аналогии со стандартным шаблоном-контейнером std::vector. Организовать хранение объектов автоматизации в созданном контейнере. Для данного контейнера реализовать методы size(), resize(), capacity(), front(), back(), push_back(), push_front(), insert(), begin(), end(), reserve(), at(), operator[] , конструкторы по умолчанию, копирования. Перегрузить конструктор по умолчанию для предоставления возможности задания размера контейнера.

Реализовать следующие механизмы обеспечения проверки правильности значения индекса: для operator[] использовать assert(), а для at() – trycatch (обработка исключения std::out_of_range).

Разработать тестовый пример, демонстрирующий работу разработанных методов обращения к элементам контейнера.

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

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

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

$./myprogr002 < data<Enter>

Где текстовый файл data содержит все необходимые данные, вводимые пользователем с консоли.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]