C++课程设计实训_基于多态书籍信息管理系统的设计与实现、附源码、有过程截图

C++课程设计实训_基于多态书籍信息管理系统的设计与实现、附源码,有过程截图

书籍信息管理系统的设计与实现(基于多态)

学生姓名:
学 号:
指导老师:
所 在 系:
专 业:
班 级:

课程设计实训报告)

目录

目录

摘 要

摘 要
        本次C++课程设计自主选材,根据本学期所学课程面向对象程序设计的知识自主开发–基于多态的书籍信息管理系统,根据书籍的主要五大类型分类,继承抽象基类,对抽象类中纯虚函数方法进行重载,来实现书籍的不同类型的功能;实现对书籍信息的管理,如录入、增加、删除、修改、查找,排序,以及将书籍信息数据写入文件、读出文件,及文件数据的清空,具体相关操作和不同功能的实现,将会在具体实现中展示。通过对书籍信息的合理化管理,使得书籍信息的高效化展示和数据的维护。
      关键词:书籍信息管理系统 C++ 程序设计 数据维护

一 前 言

1.1系统前景

      使用计算机对书籍信息数据进行管理,具有手工管理所无法比拟的优点,从时间大大缩短对信息的处理,高效精准,查阅速度快,安全性高、可靠、存储量大、保密性强、成本低,极大地提高书籍信息管理的效率。

1.2开发环境

      本课程设计使用Visual Studio 2019进行开发,是一款专为帮助程序设计人员更好,设计更优质程序开发的功能强大。Visual Studio 2019企业版页面简洁大方,适用范围广,操作简单的专业IDE开发环境,开发人员可以期待更好的重构,更好的导航功能,调试器功能更加丰富,更快的负载解决方案,以及更快的编译。 Visual Studio 2019新增源代码编辑器功能帮助用户可以更快、更稳定、更有生产力及更易于使用的Debug调试功能。

1.3系统主要功能

1.3.1管理系统需求

      书籍信息管理系统可以用来管理书籍内的所有书籍相关信息
书籍主要类型分为五大类22小类(主要设计五大类):学术理论类、自然科学类、哲学类、社会科学类、综合性书籍

1.3.2书籍信息管理系统主要功能

其中还包括对文件的相关操作等)
(1)添加书籍信息Add_Book();实现批量添加数据信息的功能,将信息录入到文件中,书籍信息为:书籍类型、ISBN编号、书籍名称、书籍作者、出版社、 书籍类型描述
(2)展示书籍信息Show_Books();显示所有书籍的信息
(3)删除书籍信息del_Books();按照书籍的ISBN编号删除指定的书籍信息
(4)修改书籍信息alter_Books();按照书籍的ISBN编号进行修改书籍的信息
(5)查找书籍相关信息Find_Books();这里用4种方式实现对书籍的查找(按书籍的ISBN编号查找、按书籍的名称查找、按书籍编写的作者查找、按照书名模糊查找书籍的信息)
(6)书籍编号排序Order_Books();按照书籍的ISBN编号进行排序2种(升序、降序)
(7)清空文件数据信息ClearFile();清空文件中的记录的所有书籍的相关数据
(0)退出系Exit_System();退出当前管理系统

二 程序设计具体实现

2.1创建书籍管理类(bookManagement)

      用与系统与用户交互的菜单界面,对书籍进行增删改查等的相关具体操作,及对文件的读写交互操作:
初始化书籍的属性分三种情况考虑:(即考虑对文件操作)
①第一种:文件不存在
②第二种:文件存在,但是没有任何数据(即数据为空)
③第三种:文件存在而且文件中有书籍的数据记录

#include"bookManagement.h"
bookManagement::bookManagement() //书籍管理构造函数
{
      //初始化书籍的属性:分三种情况考虑
	//第一种:文件不存在
	ifstream ifs;
	ifs.open(FILENAME,ios::in);//读文件
	if (!ifs.is_open())//ifs.is_open()返回值为bool类型: !ifs.is_open() 没有成功打开文件夹
	{
   
		//cout << "文件不存在!" << endl;
		this->book_Num = 0; //文件不存在,则书籍的数量的初始化为: 0
		this->book_Array = NULL; //初始化书籍指针数组指向空 
		this->book_FileIsEmpty = true;//初始化文件是否为空:true表示文件为空
		ifs.close();//关闭文件
		return;
	}

	//第二种:文件存在,但是没有任何数据(即数据为空)
	char ch;
	ifs >> ch;
	if (ifs.eof())
	{
   
		//cout << "文件数据为空!" << endl;
		this->book_Num = 0; //书籍的数量的初始化为: 0
		this->book_Array = NULL; //初始化书籍指针数组指向空 
		this->book_FileIsEmpty = true;//初始化文件是否为空:true表示文件为空
		ifs.close();//关闭文件
		return;
	}
	//第三种:文件存在而且文件中有书籍的数据记录
	int count = this->get_bookNum();
	//cout << "文件中已有 " << count << " 条数据记录"<< endl;
	this->book_Num = count;
	this->book_Array = new BooksType * [this->book_Num];//开辟空间
	this->init_BooksType();//将文件中的数据,存到数组中

	//测试代码
	//for(int i = 0; i < this->book_Num; i++)
	//{
   
	//	cout << "书籍ISBN:" << this->book_Array[i]->book_Isbn
	//		 << "\t书籍名称:" << this->book_Array[i]->book_Name
	//		 << "\t书籍作者:" << this->book_Array[i]->book_Author
	//		 << "\t出版社:" << this->book_Array[i]->book_Press
	//		 << "\t书籍分类编号:" << this->book_Array[i]->book_TypeId << endl;
	//}
}

2.2功能菜单display_Menu()(用于与用户进行交互的界面)

      功能描述及其功能展示:用于和用户进行交互,让用户更好的运用该信息管理系统,并可以展示该系统的相关功能:

void bookManagement::display_Menu()//展示菜单:功能菜单的实现
{
   
	cout << "<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>" << endl;
	cout << "--->>>>  欢迎使用书籍信息管理系统  <<<<---" << endl;
	cout << "--->>>>>>>>>  1.添加书籍信息  <<<<<<<<<---" << endl;
	cout << "--->>>>>>>>>  2.展示书籍信息  <<<<<<<<<---" << endl;
	cout << "--->>>>>>>>>  3.删除书籍信息  <<<<<<<<<---" << endl;
	cout << "--->>>>>>>>>  4.修改书籍信息  <<<<<<<<<---" << endl;
	cout << "--->>>>>>>>>  5.查找相关书籍  <<<<<<<<<---" << endl;
	cout << "--->>>>>>>>>  6.书籍编号排序  <<<<<<<<<---" << endl;
	cout << "--->>>>>>>>>  7.清空信息文档  <<<<<<<<<---" << endl;
	cout << "--->>>>>>>>>  0.退出管理系统  <<<<<<<<<---" << endl;
	cout << "<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>" << endl;
	cout << endl;
}

在这里插入图片描述

2.3创建书籍类型分类类

2.3.1创建类型抽象类class BooksType

      书籍的类型分类为五大类:学术理论类、自然科学类、哲学类、社会科学类、综合性书籍,五个子类继承抽象基类,并重写基类的抽象方法。

类的继承如下图:
在这里插入图片描述

//抽象类(基类)
#pragma once
#include<iostream>
#include<string>
using namespace std;

class BooksType //书籍类型—基类(抽象类),不需要实现,用于子类继承,重写抽象方法
{
   
public:
	virtual void display_Info() = 0; //纯虚函数:显示书籍的信息
	virtual string getBookType() = 0;//纯虚函数:获得书籍的类型
	__int64 book_Isbn;//书籍ISBN编号(__int64用于存储13位ISBN编号)
	string book_Name;//书籍名称
	string book_Author;//书籍作者
	string book_Press;//书籍出版社
	int book_TypeId;//书籍类型编号(五大类:1,2,3,4,5表示)
};
2.3.2创建子类:实现多态
//子类:(多态)
//maliemaodeng_type.h
//理论学术类书籍书籍头文件
#pragma once
#include"bookstype.h"
#include<iostream>
using namespace std;
class MaLieMaoDeng :public BooksType //需要导入bookstype.h头文件
{
   
public:
	MaLieMaoDeng(__int64 bIsbn, string bName, string bAuthor, string bPress, int bTypeId);//构造函数:初始化属性
	virtual void display_Info(); //显示书籍的信息
	virtual string getBookType();//获得书籍的类型
};
//naturalscience_type.h
//自然科学类书籍头文件
#pragma once
#include"bookstype.h"
#include<iostream>
using namespace std;
class NaturalScience :public BooksType //需要导入bookstype.h头文件
{
   
public:
	NaturalScience(__int64 bIsbn, string bName, string bAuthor, string bPress, int bTypeId);//构造函数:初始化属性
	virtual void display_Info(); //显示书籍的信息
	virtual string getBookType();//获得书籍的类型
};
//philosophy_type.h
//哲学类书籍头文件
#pragma once
#include"bookstype.h"
#include<iostream>
using namespace std;
class Philosphy :public BooksType //需要导入bookstype.h头文件
{
   
public:
	Philosphy(__int64 bIsbn, string bName, string bAuthor, string bPress,int bTypeId);//构造函数:初始化属性
	virtual void display_Info(); //显示书籍的信息
	virtual string getBookType();//获得书籍的类型
};
//socialsciences_type.h
#pragma once
#include"bookstype.h"
#include<iostream>
using namespace std;
class SocialSciences :public BooksType //需要导入bookstype.h头文件
{
   
public:
	SocialSciences(__int64 bIsbn, string bName, string bAuthor, string bPress, int bTypeId);//构造函数:初始化属性
	virtual void display_Info(); //显示书籍的信息
	virtual string getBookType();//获得书籍的类型
};
//integrity_type.h
//综合性类书籍书籍头文件
#pragma once
#include"bookstype.h"
#include<iostream>
using namespace std;
class Integrity :public BooksType //需要导入bookstype.h头文件
{
   
public:
	Integrity(__int64 bIsbn, string bName, string bAuthor, string bPress, int bTypeId);//构造函数:初始化属性
	virtual void display_Info(); //显示书籍的信息
	virtual string getBookType();//获得书籍的类型
};

2.4添加书籍信息

功能描述:添加指定的数量的书籍,并且保存到文件中
分析:用户在添加书籍时,可能会创建不同种类的书籍类型;
       如果想把所有不同种类的书籍放入一个数组中,可以将所有员工的指针安置到一个数组中:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.5展示书籍信息

在这里插入图片描述

2.6删除书籍信息

2.6.1假设输入不存在的ISBN编号

友好的提示用户,删除失败,未能找到该书籍:
在这里插入图片描述

2.6.2 输入存在的ISBN编号

假设删除数据中已存在的ISBN:(删除9787553442020)
在这里插入图片描述
提示用户:删除成功
查看结果:(ISBN编号:9787553442020 已删除)
在这里插入图片描述
到Books_Info_Files.txt文件查看数据是否通过程序的操作,保存到文件中
在这里插入图片描述

2.7修改书籍信息

假设用户输入文件不存在的ISBN编号:
在这里插入图片描述
输入正确要修改的ISBN编号:(修改:9787302540854)的书籍名称
修改前:Books_Info_Files.txt文件查看数据
在这里插入图片描述
修改后:到Books_Info_Files.txt文件查看数据是否通过程序的操作,保存到文件中
在这里插入图片描述
在这里插入图片描述

2.8查找相关书籍

可以按书籍的ISBN编号查找、按书籍的名称查找、按书籍编写的作者查找、按照书名模糊查找书籍的信息,让用户根据所需要来做出选择:
在这里插入图片描述
在这里插入图片描述
按ISBN编号:9787302540854
在这里插入图片描述
按书籍名称:Python编程
在这里插入图片描述
按作者:严蔚敏
在这里插入图片描述
按模糊查询:按P
在这里插入图片描述
在这里插入图片描述

2.9书籍编号排序

    有两种排序方式:

       第一种:升序排序

结果如下图:
在这里插入图片描述

       第二种:降序排序

结果如下图:
在这里插入图片描述

2.10清空信息文档

清空信息文件:为了防止误操作,会有提示用户的信息:
在这里插入图片描述
当前文件存储内容:
在这里插入图片描述
清空后:
在这里插入图片描述
在这里插入图片描述

2.11退出管理系统

在这里插入图片描述

三 程序测试

      通过对程序的实际测试,对一个完成了全部或部分功能、模块的计算机程序在正式使用前的检测,以确保该程序能按预定的方式正确地运行。正确性尚未得到根本的解决,软件测试仍是发现软件错误和缺陷的主要手段。为了发现系统中的错误,应竭力设计能暴露错误的测试用例。测试用例是由测试数据和预期结果构成的。一个好的测试用例是极有可能发现至今为止尚未发现的错误的测试用例。
      通过测试发现其中存在的问题,来展示程序的使用性,及对数据安全性做出相应的解决方法。
测试用例:
测试数据(5条书籍记录):第一条,第四条为错误输入的数据,用于修改
115394842 C++程序设计教程 传播智客 人民邮电出版社 5 (错误数据ISBN)
9787302540854 PHP+Mysql动态网页设计 文杰书院 清华大学出版社 4
9787517067146 Python编程 刘渝 中国水利水电出版社 5
9787115379504 数据结构C语言版 严蔚敏 人民u邮电出版社5 (错误数据出版社)
9787302478904 Python数据基础分析 余本国 清华大学出版社 5
①通过程序添加五条测试数据
在这里插入图片描述

②展示输入的数据
结果如下图:
在这里插入图片描述
打开文件查看是否已保存输入的书籍数据:
在这里插入图片描述

③修改错误的数据
输入之前输入的ISBN:如 115394842 修改如图:
在这里插入图片描述
查看文件保存:修改后
在这里插入图片描述

④删除数据
如测试例子: 9787115379504 数据结构C语言版 严蔚敏 人民u邮电出版社5 (错误数据出版社)
如下图删除成功:
在这里插入图片描述
假设输入不存在的ISBN编号:如:123456789 提示:删除失败,未找到该书籍
在这里插入图片描述

⑤查找书籍
设置了4中查找方式,更便于用户的具体需求来查找书籍信息:
1.按书籍的ISBN编号查找
2.按书籍的名称查找
3.按书籍编写的作者查找
4.按照书名模糊查找书籍的信息
在这里插入图片描述
比如
方式1:查找测试第一条书籍ISBN编号:9787115394842
在这里插入图片描述
方式2:查找书籍名称为:C++程序设计教程
在这里插入图片描述

方式3:按作者查找书籍:如传播智客
在这里插入图片描述

方式4:假设用户不清楚书籍的全部名称,可以使用模糊查询来查找书籍:如以P 开头的书籍名称:查找结果如下图:
在这里插入图片描述

⑥用户可以根据书籍的ISBN编号排序
提供两种排序方式:按书籍ISBN升序,降序排序
例如:这5条测试数据按升序排序,排序结果如下图:
在这里插入图片描述
按降序排序,结果如下图:
在这里插入图片描述

⑦数据文件清空
为了便于用户对全部数据的管理,设置了文件数据清空功能,为了防止误操作,会有提示用户的信息:如图所示:
在这里插入图片描述

四 程序测试过程中发现的问题

      通过程序的测试过程中发现,在实现该书籍信息管理系统时,没有关注到书籍的ISBN编号是唯一的,存在问题,当用户在添加书籍时,可能会添加文件已经存在的书籍信息的ISBN编号,导致数据存在冗余,不仅浪费了用户的录入时间,还对数据的管理增加了不必要的管理,浪费内存空间,数据得不到真正的管理,数据重复,可能会导致其他功能的正常运行和后续功能的添加的实现,造成了很大的麻烦。
      解决的方法就是在用户录入的ISBN编号进行检测,判断文件数据中是否已经存在用户输入的ISBN编号的书籍的信息,假设录入的在文件中已存在,提示用户:已存在该ISBN的书籍,请勿重复添加,并且显示文件中已存在输入的对应的ISBN编号书籍的信息,展示给用户查看,这样一来,即减少了数据的冗余,又提高用户对该程序的使用效率,又不会导致添加后续功能的实现造成不必要的异常。
在这里插入图片描述

五 心得总结

      通过这次实训,使我明白C++语言这门课程光仅仅是听课是远远不够的,总体看来,实现该程序的模块功能并不复杂,只是要注意相关功能实现的方式方法,同时上机训练也不容忽视。
      通过上机训练,才能够明白自己知识的不足,才能够有的放矢,更加深刻的理解C语言中的知识点。 通过实训,我找到了许多知识漏点,学到了很多以前不懂的知识,以前认为自己已经懂了的知识点也理解更加深刻了。
      要加深对课堂讲授内容的理解,熟悉程序开发环境、学习计算机系统的操作方法。
      感谢老师教学相关基础知识,扩展眼界,增添知识储备,能更好的掌握该课程的知识。

附件(源代码)

附件一:头文件源码:

//bookManagement.h
#pragma once//防止头文件重复包含
#include<iostream>//输入输出流头文件
#include<iomanip>//setw()格式控制头文件
#include"bookstype.h"
#include"maliemaodeng_type.h"
#include"philosophy_type.h"
#include"naturalscience_type.h"
#include"socialsciences_type.h"
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ThereisnothingtoenvyIcan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值