实验内容
(3) 在实验一的基础上应用构造函数、对象数组等知识对Book类进一步设计与实现。
Book类进一步设计与实现
void insert( );图书的添加功能:想要创建书目列表,可使用数组完成对多本图书的操作功能,即建立Book类类型的数组,数组中的一个元素存储一本图书的数据。
void showBook( );图书的显示功能:对已经添加的图书,并且格式化进行遍历显示输出
1、操作步骤:
(1)Book类的声明:
class Book{
private:
string name; //图书名称
float price; //价格
string isbn; //ISBN
string puvlisher;//出版社
string author; //作者
public:
Book(); //保护作用
Book(string name,float price,string isbn,string puvlisher,string author);
string get_name();
void setName(const string newName);
float get_price();
void setPrice(const float newPrice);
string get_isbn();
void setIsbn(const string newIsbn);
string get_puvlisher();
void setPuvlisher(const string newPuvlisher);
string get_author();
void setAuthor(const string newAuthor);
};
(2)动态功能的实现:
Book::Book()
{
}
Book::Book(string name,float price,string isbn,string puvlisher,string author)
{
this->name=name; //如果不用this指针可换别名进行赋值
this->price=price;
this->isbn=isbn;
this->puvlisher=puvlisher;
this->author=author;
}
string Book::get_name(){
return name;
}
void Book::setName(const string newName){
name=newName;
}
float Book::get_price(){
return price;
}
void Book::setPrice(const float newPrice){
price=newPrice;
}
string Book::get_isbn()
{
return isbn;
}
void Book::setIsbn(const string newIsbn)
{
isbn=newIsbn;
}
string Book::get_puvlisher()
{
return puvlisher;
}
void Book::setPuvlisher(const string newPuvlisher)
{
puvlisher=newPuvlisher;
}
string Book::get_author()
{
return author;
}
void Book::setAuthor(const string newAuthor)
{
author=newAuthor;
}
(3)Book类的使用:
增加一个图书类型的bookList数组存储多本图书信息,增加一个整型的变量bookNum存储当前实际的图书数目。
多本书存取的实现,用数组:每个数组元素存储一本图书信息Book bookList[10];生成Book类对象数组,并且设置存放空间大小为10 。
Book bookList[10];//设置存放空间大小为10
int bookNum=0//设置计数初值
void insert(Book b)//加入书
{
bookList[bookNum].setName(b.get_name());//依次添加图书信息
bookList[bookNum].setPrice(b.get_price());
bookList[bookNum].setIsbn(b.get_isbn());
bookList[bookNum].setPuvlisher(b.get_puvlisher());
bookList[bookNum].setAuthor(b.get_author());
bookNum++;//图书添加成功后,现有图书数目bookNum+1
}
增加输出图书信息的功能函数,设置输出的域宽setw(15),15个字段宽度,并且左对齐。void showBook(int i),输出一本书,参数i代表要输出的那本书在图书列表数组的下标。
//输出书本信息
void showBook(int i)
{
cout<<left<<setw(15)<<bookList[i].get_name()<<setw(15)<<bookList[i].get_price()<<setw(15)<<bookList[i].get_isbn()<<setw(15)<<bookList[i].get_puvlisher()<<setw(15)<<bookList[i].get_author()<<endl;
}
使用循环进行可重复执行添加图书
string Bname,Bisbn,Bpuvlisher,Bauthor;
float Bprice;
char flag='N';
while(true)
{
cout<<"请输入图书名:";
cin>>Bname;
cout<<"请输入图书价格:";
cin>>Bprice;
cout<<"请输入图书ISBN:";
cin>>Bisbn;
cout<<"请输入图书出版社:";
cin>>Bpuvlisher;
cout<<"请输入图书作者:";
cin>>Bauthor;
Book b(Bname,Bprice,Bisbn,Bpuvlisher,Bauthor);
insert(b);//加入书
cout<<endl;
cout<<"图书系统已有一下书籍:"<<endl;
cout<<left<<setw(15)<<"书名"<<setw(15)<<"价格"<<setw(15)<<"ISBN"<<setw(15)<<"出版社"<<setw(15)<<"作者"<<endl;
showBook(bookNum-1);
cout<<endl;
cout<<"是否继续录入图书(Y/N):";
cin>>flag;
if(((flag=='N')||(flag=='n')))
{
cout<<"已退出录入......"<<endl;
break;
}
}
由于输入的价格Price为数字,设定一段判断输入合法性代码
其中,Bprice的类型是 unsigned long ,如果此时输入的不是数字,则 cin.fail() 函数的返回值是 true 。在 while() 循环中,首先调用 istream 类的成员函数 clear() 来清空错误标志,因为 cin.fail() 返回 true 时,会将输入流中的 failbit 位(错误标志位)置为 1 ,为了能够在后续的动作中正常接收输入数据,必须先通过 cin.clear() 将 failbit 位重新置 0 。接下来,通过 cin 和输入操作符 >> 将错误的输出保存在 string 类型的变量中,并且输出错误提示信息。最后,再次通过 cin 等待正确的输出,直到输入的数据为数字时,程序才会跳出 while() 语句。
unsigned long Bprice=0;
cout<<"请输入图书价格:";
cin>>Bprice;
string num_Bprice;
while (cin.fail())
{
cin.clear();
cin>>num_Bprice;
cout<<"输入的"<<num_Bprice<<"不是一个合理价格数,请重新输入一个数:";
cin>>Bprice;
}
由于上述代码只能进行打印本次输入的图书信息,故利用for循环进行逐一遍历打印所有的图书信息
j=bookNum;
for(bookNum=0;bookNum<j;bookNum++)
{
showBook(bookNum);
}
2、完整代码:
Book.h
#include <iostream>
using namespace std;
class Book{
private:
string name; //图书名称
float price; //价格
string isbn; //ISBN
string puvlisher;//出版社
string author; //作者
public:
Book();
Book(string Bname,float Bprice,string Bisbn,string Bpuvlisher,string Bauthor);
string get_name();
void setName(const string newName);
float get_price();
void setPrice(const float newPrice);
string get_isbn();
void setIsbn(const string newIsbn);
string get_puvlisher();
void setPuvlisher(const string newPuvlisher);
string get_author();
void setAuthor(const string newAuthor);
};
Book::Book()
{
}
Book::Book(string B_name,float B_price,string B_isbn,string B_puvlisher,string B_author)
{
name=B_name;
price=B_price;
isbn=B_isbn;
puvlisher=B_puvlisher;
author=B_author;
}
string Book::get_name(){
return name;
}
void Book::setName(const string newName){
name=newName;
}
float Book::get_price(){
return price;
}
void Book::setPrice(const float newPrice){
price=newPrice;
}
string Book::get_isbn()
{
return isbn;
}
void Book::setIsbn(const string newIsbn)
{
isbn=newIsbn;
}
string Book::get_puvlisher()
{
return puvlisher;
}
void Book::setPuvlisher(const string newPuvlisher)
{
puvlisher=newPuvlisher;
}
string Book::get_author()
{
return author;
}
void Book::setAuthor(const string newAuthor)
{
author=newAuthor;
}
Box_main.cpp
#include <iostream>
#include <iomanip>
#include "Book.h"
using namespace std;
//对象数组
Book bookList[10];//设置存放空间大小为10
int bookNum=0,i=0,j=0;//设置计数初值
void insert(Book b)
{
bookList[bookNum].setName(b.get_name());//依次添加图书
bookList[bookNum].setPrice(b.get_price());
bookList[bookNum].setIsbn(b.get_isbn());
bookList[bookNum].setPuvlisher(b.get_puvlisher());
bookList[bookNum].setAuthor(b.get_author());
bookNum++;//图书添加成功后,现有图书数目bookNum+1
}
//输出书本信息
void showBook(int i)
{
cout<<left<<setw(15)<<bookList[i].get_name()<<setw(15)<<bookList[i].get_price()<<setw(15)<<bookList[i].get_isbn()<<setw(15)<<bookList[i].get_puvlisher()<<setw(15)<<bookList[i].get_author()<<endl;
}
using namespace std;
int main(){
string Bname,Bisbn,Bpuvlisher,Bauthor;
float Bprice;
char flag='N';
while(true)
{
cout<<"请输入图书名:";
cin>>Bname;
unsigned long Bprice=0; //Bprice 的类型是 unsigned long ,如果此时输入的不是数字,则 cin.fail() 函数的返回值是 true 。
cout<<"请输入图书价格:";
cin>>Bprice;
string num_Bprice;
while (cin.fail())
{
cin.clear();//首先调用 istream 类的成员函数 clear() 来清空错误标志
cin>>num_Bprice;//通过 cin 和输入操作符 >> 将错误的输出保存在 string 类型的变量中,并且输出错误提示信息
cout<<"输入的"<<num_Bprice<<"不是一个合理价格数,请重新输入一个数:";
cin>>Bprice;
}
cout<<"请输入图书ISBN:";
cin>>Bisbn;
cout<<"请输入图书出版社:";
cin>>Bpuvlisher;
cout<<"请输入图书作者:";
cin>>Bauthor;
Book b(Bname,Bprice,Bisbn,Bpuvlisher,Bauthor);
insert(b);//加入书
cout<<endl;
cout<<"图书系统已有一下书籍:"<<endl;
cout<<left<<setw(15)<<"书名"<<setw(15)<<"价格"<<setw(15)<<"ISBN"<<setw(15)<<"出版社"<<setw(15)<<"作者"<<endl;
j=bookNum;
for(bookNum=0;bookNum<j;bookNum++)
{
showBook(bookNum);
}
cout<<endl;
cout<<"是否继续录入图书(Y/N):";
cin>>flag;
if(((flag=='N')||(flag=='n')))
{
cout<<"已退出录入......"<<endl;
break;
}
}
}
3、录入信息:
书名 | 价格 | ISBN | 出版社 | 作者 |
---|---|---|---|---|
狂人日记 | 31 | 9787505738478 | 中国友谊出版 | 鲁迅 |
朝花夕拾 | 20 | 9787538763010 | 时代文艺出版社 | 鲁迅 |
阿Q正传 | 10 | 9787550241077 | 北京联合出版社 | 鲁迅 |