01.11.2013, 18:06. Просмотров 524. Ответов 17
Задания:
Создать пустой проект и добавить в него файл main.cpp с функцией main. Создать заголовочный файл book.h (не забывая о стражах включения) и описать в нём класс book со следующими полями и функциями-членами (все поля должны быть в секции private, а функции-члены в секции public, тела функций-членов определять внутри описания класса, если явно не требуется обратное):
1.поля _title (название) и _author (автор) типа std::string;
2.вещественное поле _price (цена); целочисленное поле _discount (скидка в процентах от 0 до 100);
3.конструктор с параметрами, задающими значения всех полей, причем скидка *— параметр, равный по умолчанию нулю; используйте списки инициализации (тело конструктора должно быть пустым!);
4.константные функции-члены title, author, price и discount, возвращающие значения соответствующих полей (указание: константность функции означает, что в теле этой функции не меняется состояние объекта, константность обозначается спецификатором const после списка параметров в сигнатуре функции);
5.константная функция-член real_price, вычисляющая цену товара с учётом скидки; вынесите определение этой функции в соответствующий заголовку cpp-файл (book.cpp);
6.перегруженная операция вывода книги в поток (реализация в book.h со спецификатором inline):ostream & operator<<(ostream & os, book const & b);
7.функции, устанавливающие новые значения цены и скидки, также в book.cpp;Указание: если скидка не находится в диапазоне от 0 до 100, должно генерироваться стандартное исключение invalid_argument, объявленное в заголовочном файле <stdexcept>:
throw invalid_argument("Incorrect discount");
Ошибки:цена со скидкой не работает (real_price). И исключение (hrow invalid_argument("Incorrect discount")

Выводит ошибку как на скрине,это нормально?Где тогда текст "Incorrect discount"?
1.book.h:
C++ |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
| #ifndef BOOK_H
#define BOOK_H
#include <string>
#include <iostream>
class book
{
std::string _title;
std::string _author; //1.поля _title (название) и _author (автор) типа std::string;
double _price; //2.вещественное поле _price (цена);
int _discount; //целочисленное поле _discount (скидка в процентах от 0 до 100);
public:
book(std::string const & title,std::string const & author,double const & price,int const & discount=0):_title(title),_author(author),_price(price),_discount(discount) {};
/*3.конструктор с параметрами, задающими значения всех полей, причем скидка *— параметр, равный по умолчанию нулю;
используйте списки инициализации (тело конструктора должно быть пустым!);*/
std::string title() const
{
return _title;
}
std::string author() const
{
return _author;
}
double price() const
{
return _price;
}
int discount() const
{
return _discount;
}
/*4.константные функции-члены title, author, price и discount, возвращающие значения соответствующих полей (указание: константность функции означает,
что в теле этой функции не меняется состояние объекта, константность обозначается спецификатором const после списка параметров в сигнатуре функции);*/
/*5.константная функция-член real_price, вычисляющая цену товара с учётом скидки; вынесите определение этой функции в соответствующий заголовку cpp-файл (book.cpp);*/
double real_price() const;
/*7.функции, устанавливающие новые значения цены и скидки, также в book.cpp;Указание: если скидка не находится в диапазоне от 0 до 100,
должно генерироваться стандартное исключение invalid_argument, объявленное в заголовочном файле <stdexcept>:*/
void change_price(double price) ;
void change_discount(int discount) ;
};
/*6.перегруженная операция вывода книги в поток (реализация в book.h со спецификатором inline):ostream & operator<<(ostream & os, book const & b);*/
inline std::ostream & operator<<(std::ostream &os,book const & b) {
return os<<b.title()<<" "<<b.author()<<" "<<b.price()<<" "<<b.discount()<<std::endl;
return os;
}
#endif B |
|
2.book.cpp
C++ |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| #include "book.h"
#include <stdexcept>
/*5.константная функция-член real_price, вычисляющая цену товара с учётом скидки; вынесите определение этой функции в соответствующий заголовку cpp-файл (book.cpp);*/
double book:: real_price() const {
return (_price-_price*(_discount/100));
}
/*7.функции, устанавливающие новые значения цены и скидки, также в book.cpp;Указание: если скидка не находится в диапазоне от 0 до 100,
должно генерироваться стандартное исключение invalid_argument, объявленное в заголовочном файле <stdexcept>:*/
void book:: change_price(double price) {
_price=price;
}
void book:: change_discount(int discount) {
if(discount<0||discount>100) throw std::invalid_argument("Incorrect discount");
_discount=discount;
} |
|
3.main.cpp
C++ |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| #include <locale>
#include <iostream>
#include "book.h"
using namespace std;
int main() {
std::locale::global(std::locale(""));
book A("MatAn","Dimedovich",100,10);
cout<<A;
cout<<"Цена со скидкой = "<<A.real_price()<<endl;
A.change_price(1000);
A.change_discount(50);
cout<<A;
cout<<"Цена со скидкой = "<<A.real_price()<<endl;
book B("abc","bca",1000,10);
B.change_discount(200);
system("pause");
return 0;
} |
|