Автор работы: Пользователь скрыл имя, 27 Января 2016 в 21:47, лабораторная работа
Построить класс для работы с книгами. Класс должен включать следующие поля: название, количество страниц, тираж.
Класс должен обеспечивать простейшие методы для работы с полями класса: изменение значений, вывод значений.
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Лабораторные работы №1, 2 и 3
По дисциплине «Программирование»
Темы:
1. Разработка классов, создание конструкторов и деструкторов. Использование статических членов класса.
2. Переопределение операций. Дружественные функции.
3. Наследование. Создание динамического списка объектов,
связанных наследованием.
Группа:
Студенты:
Преподаватель:
НОВОСИБИРСК 2016
Задание
К лабораторной работе №1
Построить класс для работы с книгами. Класс должен включать следующие поля: название, количество страниц, тираж.
Класс должен обеспечивать простейшие методы для работы с полями класса: изменение значений, вывод значений.
К лабораторной работе №2
Для класса из лаб. работы №1 реализовать дружественный класс, выполняющий какую-либо функцию из базового класса.
Изменить демонстрационную пpогpамму, показав все перегруженные операции.
К лабораторной работе №3
С учетом предыдущих лабораторных работ реализовать класс-наследник (частный случай базового), выполняющий еще одну функцию.
Изменить демонстрационную программу.
Проектирование программы
(Обсуждение основных идей алгоритма)
По лабораторной работе №1
Программа предлагает ввести название книги, считывает ввод, то же самое повторяется для ввода количества страниц и тиража, а так же уточняет - хочет ли пользователь изменить количество страниц. Затем полученные данные выводятся на экран.
По лабораторной работе №2
Программа делает все то же, что описано выше, но дополнительно был создан дружественный класс, который уточняет - хочет ли пользователь исправить тираж; считывает ввод, затем полученные данные выводит на экран.
По лабораторной работе №3
Добавляем класс-наследник, к которому применяются те же функции (из класса-родителя), но так как это частный случай класса-родителя с предполагаемой большей информацией, то вводим дополнительную функцию.
Составные части программы
Класс book - описание названия, количества страниц и тираж книги:
Общедоступные данные и методы:
name - название, строковая;
pages - поле страница, целочисленная
edition - тираж, целочисленная;
setName - метод, в котором задаётся через ввод с клавиатуры название;
setPages - метод, в котором вводится с клавиатуры количество страниц;
setEdition - метод, в котором
setRpoz - метод, меняющий количество страниц объекта класса.
getName - метод, в котором выводится на экран название;
getPages - метод, в котором выводится количество страниц;
getEdition - метод, в котором выводится на экран тираж.
Класс CEdition - класс, меняющий количество страниц в объекте класса book:
Общедоступные данные и методы:
changeEdition(book&) - метод, в котором изменяется количество страниц, в него передается информация о данных объекта класса book, для которого необходимо изменить количество страниц.
Класс magazine - наследник класса book, описывает название, количество страниц, тираж и год издания для журнала. Использует следующие данные и методы класса book:
name - название, строковая;
pages - поле страница, целочисленная
edition - тираж, целочисленная;
setName - метод, в котором задаётся через ввод с клавиатуры название;
setPages - метод, в котором вводится с клавиатуры количество страниц;
setEdition - метод, в котором
getName - метод, в котором выводится на экран название;
getPages - метод, в котором выводится количество страниц;
getEdition - метод, в котором выводится на экран тираж.
Данные класса magazine:
year - год издания журнала
Общедоступные данные:
setYear - метод ввода года с клавиатуры
getYear - метод вывода года на экран
Методы классов:
1. setName - метод класса book который вводит временную переменную n.
n - временная переменная, в которую будут записываться данные ввода с клавиатуры.
Предложение ввести название;
Пользователь вводит с клавиатуры название;
Присваивание значения временной переменной n в переменную name объекта класса book.
2. Для методов setPages (класс book) и setEdition (класс book), setYear (класс magazine) используется алгоритм аналогичный указанному для setName.
3. setRpoz - метод класса book, который меняет количество страниц.
Вводится переменная r, которой присваивается значение 0.
Пользователю задается вопрос хочет ли он изменить количество страниц.
Проверка соответствия ответа на запрос. Да - 1, Нет - 0. В случае если пользователь ввёл иной символ, программа просит его повторить ввод.
После верного ввода очистить экран.
Затем программа проверяет равно ли введённое значение 1, что соответствует ответу ДА.
Вызов функции setPages для данного объекта.
4. changeEdition(book &obj) - передаем объект класса в метод и вносим изменения в переменную edition объекта класса book. Метод использует алгоритм аналогичный алгоритму метода setRpoz, в конце вызывая вместо метода setPages метод setEdition.
В основном теле программы:
Инициализируем объект класса book.
b - объект класса book
Вызов методов для описания объекта b класса book:
Методы setName, setPages, setEdition.
Очищаем экран.
Инициализируем объект класса magazine.
m - объект класса magazine
Вызов методов для описания объекта m класса magazine:
Методы setName, setPages, setEdition, setYear.
change - инициализация объекта класса CEdition.
Вызов метод changeEdition в котором изменяется тираж.
Вывод информации о книге через методы:
Методы getName, getPages, getEdition.
Вывод информации о журнале через методы:
Методы getName, getPages, getEdition, getYear.
Текст программы с комментариями
#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;
class CEdition; //Объявление класса CEdition.
//Описание класса book:
class book {
//Объявление переменных класса book:
public:
string name;
int pages;
int edition;
book(string, int, int){}; //Конструктор
//Объявление функций класса book (сеттеры):
void setName();
void setPages();
void setEdition();
void setRpoz (book&p);
//Объявление функций класса book (геттеры):
string getName();
int getPages();
int getEdition();
friend class CEdition; //Объявление дружественного класса
~book(){}; //Деструктор
};
// Функция ввода названия:
void book::setName() {
string n;
cout <<"Input name : " ;
cin>>n; //Ввод названия с клавиатуры
name = n;
}
// Функция ввода количества страниц:
void book::setPages() {
int p = 0;
cout <<"Input pages : ";
cin >> p; //Ввод количества страниц с клавиатуры
pages = p;
}
// Ввод тиража:
void book::setEdition() {
int e = 0;
cout <<"Input edition : " ;
cin >> e; //Ввод тиража с клавиатуры
edition = e;
}
//Функция изменения страниц книги
void book::setRpoz(book &p) {
int r;
r = 0;
cout <<"Do you want to change information about book's pages? Y(1) N(0) : "<< endl;
//Проверка значения: в случае, если не равно 1 или 0, просит ввести заново:
for (cin>>r; r!=1 && r!=0; cin>>r) {cout <<"Whrong answer. Try again."<< endl;}
system("cls");
//Проверка ответа
да или нет. При "YES"(1) выполняется
изменение страницы через
if (r == 1)
{
cout <<"Change information : "<< endl;
p.setPages();
}
}
//Вывод на экран названия:
string book::getName() {
cout <<"Name : "<< name << endl;
return name;
}
//Вывод на экран количества страниц:
int book::getPages() {
cout <<"Pages : "<< pages << endl;
return pages;
}
//Вывод на экран тиража:
int book::getEdition() {
cout <<"Edition : "<< edition << endl;
return edition;
}
//Описания дружественного класса для класса book
class CEdition {
public:
CEdition(){}; //конструктор класса CEdition
void changeEdition(book &);
~CEdition(){}; //деструктор класса CEdition
};
//Функция изменения тиража книги
void CEdition::changeEdition(book &obj) //Передаем объект класса и вносим изменения в int edition
{
//Запрос на изменение информации:
int r = 0;
cout <<"Do you want change information about book's edition? Y(1) N(0) : "<< endl;
//Проверка значения. В случае, если не равно 1 или 0, просит ввести заново.
for (cin>>r; r!=1 && r!=0; cin>>r) {cout <<"Whrong answer. Try again."<< endl;}
system("cls");
//Проверка ответа. При соответствии значению "YES"(1) изменяет информацию тиража:
if (r == 1)
{
obj.setEdition();
}
}
//Описание класса наследника:
class magazine: public book {
//Переменные класса наследника:
int year;
public:
magazine(string n, int p, int e, int y): book(n, p, e){this->year = y;}; //Конструктор класса наследника
void setYear();
int getYear();
~magazine(){}; //деструктор класса наследника
};
//Функция ввода информации о годе издания журнала
void magazine::setYear() {
int y = 0;
cout <<"Input year : " ; // Ввод года издания журнала
cin >> y;
year = y;
}
//Функция вывода на экран года издания журнала
int magazine::getYear() {
cout <<"Year : "<< year << endl;
return year;
}
void main() {
book b("name", 0, 0); //Создание объекта класса book
//Вызов функций для описания объекта b класса book
cout <<"Set book information: "<< endl;
b.setName();
b.setPages();
b.setEdition();
system("cls");
magazine m("name", 0, 0, 0); //Создания объекта m класса magazine
//Вызов функций для описания объекта m класса magazine
cout <<"Set magazine information: "<< endl;
m.setName();
m.setPages();
m.setEdition();
m.setYear();
system("cls");
b.setRpoz(b); //Вызов функции изменения количества страниц
system("cls");
CEdition change; //Создание класса change
change.changeEdition(b); //Вызов функции изменения тиража
system("cls");
//Вывод через функции информации о книге
cout <<"Information about book : "<< endl;
b.getName();
b.getPages();
b.getEdition();
//Вывод через функции информации о журнале
cout <<"Information about magazine : "<< endl;
m.getName();
m.getPages();
m.getEdition();
m.getYear();
system("pause");
}
Примеры работы программы
Ограничения:
В названии книги нельзя ввести более одного слова, а так же в полях с указанием страниц, тиража и года если вводить не цифры, а другие символы, программа "вылетает".
Выводы:
В первой лабораторной работе программа принимает данные, введенные с клавиатуры, прописывает их в созданном классе, при изменениях одного из параметров, учитывает новые введенные данные и выводит их на экран.
Во второй лабораторной работе программа с помощью дружественного класса дополнительно меняет другие данные по желанию пользователя после уточняющего запроса и выводит на экран исправленный результат.
В третьей лабораторной работе программа дополнительно указывает информацию еще об одном классе (наследнике) и так же выводит о нем информацию совместно с данными о предыдущем классе (родителе)