Методические указания к курсовой работе Цель курсовой работы


Скачать 244.52 Kb.
НазваниеМетодические указания к курсовой работе Цель курсовой работы
страница1/4
Дата публикации06.05.2013
Размер244.52 Kb.
ТипМетодические указания
userdocs.ru > География > Методические указания
  1   2   3   4
Пермский государственный технический университет

Кафедра ИТАС

дисциплина «Программирование.

Объектно-ориентированное программирование»
Методические указания к курсовой работе
Цель курсовой работы

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

  1. Создание классов, методов класса, конструкторов и деструкторов, объектов класса.

  2. Создание иерархии классов путем наследования.

  3. Использование виртуальных функций, абстрактных классов и полиморфных объектов.

  4. Использование классов-контейнеров для хранения объектов

  5. Использование стандартной библиотеки C++.

  6. Использование потоковых классов стандартной библиотеки C++ для сохранения объектов в файле и их загрузки из файла

  7. Использование стандартной библиотеки шаблонов С++.

  8. Получение практических навыков программирования алгоритмов обработки данных.


^ Содержание курсовой работы

Используя технологию объектно-ориентированного программирования разработать программу для создания объектов пользовательского класса, сохранения их в контейнере и в файле с возможностью последующего восстановления. Использовать алгоритмы сортировки и поиска для работы с данными, хранящимися в контейнере. Программа разрабатывается на языке С++ в среде Microsoft Visual Studio как консольное приложение.
^ Методические указания к выполнению курсовой работы

Курсовая работа выполняется поэтапно.

I этап. Определение классов. Программирование меню.

  1. В соответствии с вариантом (смотри приложение 1) написать программный код для иерархии классов. Определить поля и методы классов. Во главе иерархии должен стоять абстрактный класс. На первом этапе для классов создается только конструктор с параметрами. При определении полей следует учитывать возможность выполнения запроса (смотри приложение 3).

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

Пример иерархии классов

Файл person.h

#include //для класса string

#include // для потокового ввода-вывода

#include // для смены кодовой страницы

#include //для контейнера

using namespace std; //использовать пространство имен std

//абстрактный класс

class person abstract{

protected:

string name;

int age;

public:

person(string Name,int Age);

virtual void show() abstract;

};

//класс «рабочий»

class worker:public person{

protected:

int rang; //разряд

public:

worker(string Name,int Age,int Rang);

void show() override;

};

//класс «служащий»

class employe:public person{

protected:

string post; //должность

public:

employe(string Name,int age,string Post);

void show() override;

};
Определение классов помещается в файл *.h

Определение функций – членов класса помещается в файл *.cpp


  1. После создания и отладки иерархии классов создается класс Program, который выполняет основную работу:

    • создание коллекции для хранения объектов;

    • создание объектов и помещение их в коллекцию;

    • просмотр коллекции;

    • сохранение коллекции в файле;

    • загрузка коллекции из файла;

    • очистка коллекции;

    • сортировка коллекции;

    • поиск в коллекции;

    • выполнение запроса.


В функции main() последовательно вызываются методы класса Program:

- Init() Инициализация программы: создание пустой коллекции, установка кодовой страницы, выделение других ресурсов;

- Run() Выполнение программы - Вывод на экран меню и вызов функции работы через меню;

- Done() Освобождение ресурсов.

Возможно два варианта реализации класса Program.

Первый.

Коллекция определяется как статическое поле класса Program, например

typedef list MyCollection;

static MyCollection collection;

В этом случае методы Init(), Run(), Done() определяются как статические public методы. Другие методы, требующие доступа к коллекции, определяются как статические закрытые методы.

Функции main() будет иметь следующий вид:

void main()

{

Program::Init();

Program::Run();

Program::Done();

}

Второй.

Коллекция определяется как нестатическое поле класса Program - указатель на коллекцию, например

typedef list MyCollection;

MyCollection* collection;

В этом случае методы Init(), Run(), Done() определяются как нестатические public методы класса Program. Другие методы определяются как закрытые.

Вызов меню помещается в функцию Run()/ Меню предусматривает вызов функций – членов класса Program для выполнения различного вида работ.

Пример функции Init()

void Init()

{

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

collection=new MyCollection;

}

Пример функции Run()

void Run()

{

int i;

char s[10];

do {

system("cls");

cout<<" <<ГЛАВНОЕ МЕНЮ>> "<
cout<<"<Выберите пункт меню>"<
cout<<"<1>.Создать объект-рабочий"<
cout<<"<2>.Создать объект-инженер"<
cout<<"<3>.Просмотреть фабрику"<
cout<<"<4>.Очистить фабрику"<
cout<<"<5>.Сохранить в файле"<
cout<<"<6>.Загрузить из файла"<
cout<<"<7>.Отсортировать объекты в контейнере"<
cout<<"<8>.Выполнить поиск"<
cout<<"<9>.Выполнить запрос"<
cout<<"<10>.Выход в WINDOWS"<
cout<<"Выбранный пункт меню:";

cin.getline(s,10);

i=atoi(s);

switch(i)

{

case 1:

{

system("cls");

CreateWorker();

system("pause");

break;

}

//и т. д

default:if(i>10 || i<1) {cout<<"Вводите значения от 1 до 10"<
}

}

while (i!=10);

}

Пример функции Done()

void Done()

{

collection->clear();

delete collection;

}

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


^ II этап. Создание объектов. Использование контейнеров.

1.После отладки меню реализуются функции создания объектов и помещения их в контейнер. На этом этапе объект инициализируется без ввода данных с клавиатуры непосредственно в теле функции. В качестве контейнера используется шаблон – контейнер в соответствии с вариантом (смотри приложение 2).

Пример реализации метода CreateWorker()

void CreateWorker()

{

Person* p;

cout<<"<Создание объекта Worker>"<
string ss="Иванов Иван";

int ii=23;

int rr=5;

p= new worker(ss,ii,rr);

collection->push_back(p);

}

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


  1. Дальше следует реализовать просмотр и очистку контейнера.

Итак, итогом второго этапа является реализация пунктов 1-4 меню без ввода данных с клавиатуры.
^ III этап. Сохранение объектов в файле.

К третьему этапу переходим после того, как убедимся, что объекты помещаются в контейнер, контейнер можно просмотреть и очистить.

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

При вводе данных с клавиатуры необходимо учесть ввод строк, содержащих пробелы. Использовать для ввода таких слов перегруженную операцию “>>” нельзя, так как она рассматривает пробел, как конец ввода символов. Поэтому, для ввода строк следует использовать метод getline() либо класса istream, либо класса string. Числа также надо вводить как строки с последующим преобразованием.
^ Пример корректного ввода строк и чисел

//Метод создания объекта с вводом значений полей с клавиатуры

void Program::CreateEmployer()

{

Person* p;

cout<<"<Создание объекта Employee>"<
p = new Employee();

p->Input();

collection->push_back(p);

}

void Employee::Input()

{

char s[10];

cout<<"Имя>";getline(cin,name,'\n');

cout<<"Возраст>";cin.getline(s,10); age=atoi(s);

cout<<"Должность>";getline(cin,post,'\n');

}
При сохранении объектов в файле возникает несколько проблем.

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

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

Решение этой задачи «в лоб» простым копированием данных объекта в файл не всегда приемлемо. Например, если объект содержит указатели или ссылки на другие объекты. Есть два пути решения этой проблемы.

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

Второй – использовать специальные классы для сериализации. Например, класс CArchive библиотеки MFC Microsoft Visual Studio.

Вторая проблема связана с тем, что, поскольку в контейнере хранятся полиморфные объекты разных классов, то и в файл должны записываться объекты разных классов. Следовательно, файл должен быть полиморфным. Основная сложность при работе с таким файлом связана с тем, что объекты разных классов имеют разную структуру. Мы должны иметь механизм для выполнения различных функций сериализации в зависимости от типа объекта. Одним из способов решения этой задачи является запись перед полями объекта идентификатора, определяющего тип объекта. Например, это может быть целое число (в примере int k).

Пример 1

Перегрузка операций << и >> записи в поток ostream и чтения из потока istream объектов класса Worker-рабочий и Employee-служащий.
Напишем методы-функции для записи коллекции в файл и для чтения из файла.

void Program::Save()

{

cout<<"<<<Сохранение коллекции>>>"<
int l=WritePersons(fact);

cout<<"Сохранено объектов: "<
}

void Program::Load()

{

cout<<"<<<Загрузка коллекции>>>"<
int l=ReadPersons(fact);

cout<<"Прочитано объектов: "<
}

Здесь WritePersons() и ReadPersons – методы для записи в файл и чтения из файлов объектов, хранящихся в коллекции.

Реализация методов WritePersons() и ReadPersons выполняется по следующей схеме

Метод WritePersons()

//Сериализация коллекции

int Program::WritePersons(list
& fact)

{

//Здесь проверить не пустая ли коллекция

//Если пустая, то сообщение и выход

//Создаем поток и открываем файл для записи

ofstream out("persons.dat");

//Здесь проверить состояние потока

//Пройти по коллекции и для каждого объекта коллекции

выполнить (it- iterator)

if(typeid(*(*it))==typeid(Worker))

{

out<<1<<' '; //записываем в файл 1

//Выполняем сериализацию объекта Worker

out<<(*((Worker*)(*it))); count++;

}

if(typeid(*(*it))==typeid(Employee))

{

out<<2<<' '; //записываем в файл 2

//Выполняем сериализацию объекта Employee

out<<(*((Employee*)(*it)));


Метод ReadPersons()

//Десериализация коллекции

int Program::ReadPersons(list
& fact)

{

//Создаем поток и открываем его для чтения

ifstream in("persons.dat");

//Здесь проверить состояние потока

Worker* w;

Employee* emp;

int k,count=0;

//Прочитать признак типа объекта

in>>k;

//Пока не конец файла выполнять

while(!in.eof())

{

if(k==1)//Это объект Worker

{

w=new Worker();

in>>(*w); //Читаем его и помещаем в контейнер

fact.push_back(w);

count++;

}

if(k==2)//Это объект Employee

{

emp=new Employee();

in>>(*emp); //Читаем его и помещаем в контейнер

fact.push_back(emp);

count++;

}

in>>k;

}

return count;

}
Естественно, мы должны перегрузить для классов Worker и Employee операции << и >> записи в поток ostream и чтения из потока istream.
Пример 2

Использование средств, предоставляемых библиотекой MFC для сериализации и десериализации объектов.

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

Use of MFC: Use MFC in Shared DLL

Character Set: Not Set

Также необходимо подключить #include

Для поддержки сериализации наши пользовательские классы должны наследовать класс CObject. Для использования возможностей класса CObject для сериализации необходимо при объявлении класса указать макрос

DECLARE_SERIAL(имя_класса), а в реализации класса – макрос

IMPLEMENT_SERIAL(имя_класса, имя_базового_класса,0).

2. Объект CArchive аналогичен объектам класса iostream библиотеки С++, но выполняет операции чтения и записи в двоичном формате без форматирования.

Для создания архива необходимо:

1)Создать объект класса CFile

^ CFile File(имя_файла,CFile::modeCreate|CFile::modeWrite);- для записи

CFile File(FileName,CFile::modeRead);- для чтения

2)Вызвать конструктор класса CArchive

CArchive ar(&File, CArchive::store); - для передачи данных из памяти в файл.

^ CArchive ar(&File, CArchive::load); - для передачи данных из файла в память

3. Непосредственная запись/чтение данных выполняются с помощью перегруженных операций << / >>.

Эти операции перегружены для большинства встроенных типов С++.

Сложнее обстоит дело со строками. Для типа string эти операции не перегружены. Зато они перегружены для MFC строк CString. Пеэтому необходимо самим написать конвертацию строк их string в CString и наоборот.

Преобразование string->CString.
  1   2   3   4

Похожие:

Методические указания к курсовой работе Цель курсовой работы iconМетодические указания знакомят студентов с организационной стороной...
Методические указания по выполнению курсовой работы предназначены для студентов 4 курса, обучающихся по специальности 270802 «Строительство...
Методические указания к курсовой работе Цель курсовой работы iconМетодические указания знакомят студентов с организационной стороной...
Методические указания по выполнению курсовой работы предназначены для студентов 1 курса, обучающихся по специальности 270802 «Строительство...
Методические указания к курсовой работе Цель курсовой работы iconМетодические указания к выполнению курсовой работы
Объем курсовой работы 25-35 страниц, требования к оформлению такие же как и к вкр. По содержанию курсовой работы и результатам ее...
Методические указания к курсовой работе Цель курсовой работы iconМетодические указания к курсовой работе по дисциплине «Статистика»
Методические указания к курсовой работе по дисциплине «Статистика» / Сост. Т. И. Мазаева, Н. Н. Скитер, Е. Е. Смотрова, О. А. Донскова;...
Методические указания к курсовой работе Цель курсовой работы iconМетодические указания по выполнению курсовой работы по курсу «региональная...
В рамках изучения данной дисциплины предусматривается выполнение курсовой работы
Методические указания к курсовой работе Цель курсовой работы iconМетодические указания по подготовке и написанию курсовой работы по...
Целью курсовой работы является исследование по избранной проблеме учебной дисциплины в письменном виде
Методические указания к курсовой работе Цель курсовой работы iconМетодические указания по выполнению курсовой работы по дисциплине «Экономика организации»
Приведены методические указания по выполнению курсовой работы по дисциплине «Экономика организации» для учащихся дневной формы обучения...
Методические указания к курсовой работе Цель курсовой работы iconМетодические указания по выполнению курсовой работы студентами экономического...
Медведева Т. Н. Налоги и налогообложение. Методические указания по выполнению курсовой работы студентами экономического факультета....
Методические указания к курсовой работе Цель курсовой работы iconМетодические указания по выполнению курсовой работы по предмету «статистика»
Приложение Примерный план курсовой работы на тему: «Сравнительный анализ уровня жизни населения РФ и других стран на основе использования...
Методические указания к курсовой работе Цель курсовой работы iconМетодические указания к выполнению курсовой работы по дисциплине «Экономика предприятия»
Методические указания к выполнению курсовой работы по дисциплине «Экономика предприятия» на тему: «Расчет издержек производства и...
Вы можете разместить ссылку на наш сайт:
Школьные материалы


При копировании материала укажите ссылку © 2015
контакты
userdocs.ru
Главная страница