【sy2_类的进一步应用与编程_3_Book】

实验内容

(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出版社作者
狂人日记319787505738478中国友谊出版鲁迅
朝花夕拾209787538763010时代文艺出版社鲁迅
阿Q正传109787550241077北京联合出版社鲁迅
4、运行结果:

image-20220910123448233

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值