C++ 图书馆管理系统

一、实验名称
图书馆管理系统
二、实验目的
利用C++语言设计开发一个小型的图书馆管理系统模拟程序,具有如下功能:退出系统、增加图书、删除图书、借阅图书、归还图书、显示图书信息、查询图书等功能。实验中应掌握继承结构,并掌握对象、类、链表的使用和成员函数、构造函数的定义及调用,并掌握使用实验设备的技能技巧和程序的调试方法。
三、实验平台
运行环境:VC++6.0
四、问题分析
图书馆管理系统模拟程序可划分为7个模块:退出模块、增加图书模块、删除图书模块、借阅图书模块、归还图书模块、显示图书信息模块、查询图书模块。各模块之间均有着或多或少的联系,比如: 借阅图书模块、显示图书信息模块、查询图书模块都需要在进行增加图书模块后进行。理解了各模块之间的主要关系有利于程序的设计与完成,使程序的层次结构清晰,便于程序的编写、阅读和调试。以下为本次试验的项目构架图:
在这里插入图片描述
本次实验定义了三个类:Item类、Person类、Library类
Item类中有public函数: name、item_type、bool Register(bool函数输出值只有ture和force,用来判断是否注册)。

Person类中public函数:Name ()、Adress ()、Regist_items。

Library类中public函数:addBook()向图书馆里加书籍、deleteBook()删除无用书籍、brrowBook()借书,之前先判断书籍是否存在、returnBook()还书、getReader()查询某编号的书是谁借了、indexOfNum(string num) 根据编号得到书在数组中的下标;
private函数:vector books所有书籍、map<string, int> readers存储读者及其所借的书籍数目、currentNum库存书籍数目、brrowNum借出书籍数目。

附录:
程序源代码:

#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<iomanip>
#include <list>
using namespace std;


class item
{
	public:
	string name;
	string item_type;

	bool Register;


};

//杂志类
class magazine :public item
{
	string Type;
	string Writer;
};
//MusicCd类
class MusicCd :public item
{
	string Singer;
};
//电影类
class Movie :public item
{
	string Type;
	string Director;
	string Actor;
};

//书籍类
class Book : public item
{
public:
	Book() { borrow_flag = false; }   //无参构造函数
	Book(string name, string num, string auther)
		:name(name), num(num), auther(auther) {
		borrow_flag = false;
	}  //有参构造函数
	void setReader(string reader, int lcn, string data); //设置读者
	void setInfo(string name, string num, string auther); //设置书籍信息
	string getName() {
		return name;
	}
	string getNum() { return num; }
	string getAuther() {
		return auther;
	}
	bool getBorrow_flag() {
		return borrow_flag;
	}
	string getReader() {
		return reader;
	}
	int getLcn() {
		return lcn;
	}
	string getData() {
		return data;
	}
	bool isBorrow() { return borrow_flag; }        //判断书籍是否借出
	void setBorrow_flag(bool b) { borrow_flag = b; }
	void showInfo();        //显示数据信息
private:
	string name;  //书名
	string num;   //编号(唯一标示)
	string auther; //作者

	bool borrow_flag;
	string reader; //读者
	int lcn;       //借书证号
	string data;   //借书日期
};
//DVD电影类
class DVD :public Movie
{

};
//蓝光电影类
class Blue_ligh :public Movie
{

};

//用户
class Person
{
public:
	string Name;
	string Adress;
	list<item> Regist_items;
};



void Book::setReader(string reader, int lcn, string data)
{
	borrow_flag = true;
	this->reader.assign(reader);
	this->lcn = lcn;
	this->data.assign(data);
}
void Book::setInfo(string name, string num, string auther)
{
	this->name.assign(name);
	this->num.assign(num);
	this->auther.assign(auther);
}
void Book::showInfo()
{
	cout << "书籍名称:" << setiosflags(ios_base::left) << setw(56) << name << endl
		 << "书籍编号:" << setw(56) << num<< endl
		 << "书籍作者:" << setw(56) << auther  << endl;
	if (borrow_flag)
	{
	   cout << "书籍被借出。                                                      \n"
			<< "读者姓名:" << setw(56) << reader<< endl
			<< "借书证号:" << setw(56) << lcn << endl
			<< "借书日期:" << setw(56) << data << endl;
	}
	else {
		cout << "书籍未被借出。                                                    \n";
	}
}
class Library
{
public:
	//书籍库
	list<item> itemList;
	Library() { currentNum = 0; brrowNum = 0; }
	void addBook();                //向图书馆里加书籍
	void addBook(string name, string num, string auther);
	void deleteBook();   //删除无用书籍
	void brrowBook();   //借书,之前先判断书籍是否存在
	void returnBook();   //还书
	void getReader();  //查询某编号的书是谁借了
	int indexOfNum(string num); //根据编号得到书在数组中的下标
	vector<Book> getBooks() {
		return books;
	}
	void showInfo();
	int getTotalBooks() { return currentNum + brrowNum; }
private:
	vector<Book> books;//所有书籍
	map<string, int> readers;  //存储读者及其所借的书籍数目 
	int currentNum;   //库存书籍数目(不包括借出的)
	int brrowNum;     //借出书籍数目
};
void Library::showInfo()
{
	cout << "  ***************************所有图书信息***************************\n\n";
	for (int i = 0; i < books.size(); i++)
	{
		cout << "第" << i + 1 << "本书籍的信息。" << endl;
		books[i].showInfo();
	}
	system("pause");
	system("cls");
}
int Library::indexOfNum(string num)
{
	int i;
	for (i = 0; i < books.size(); i++)
	{
		if (books[i].getNum() == num)
			return i;
	}
	return -1;
}
void Library::addBook()
{
	Book b;
	int temp;
	string name, num, auther;
	cout << "  *****************************增加界面*****************************\n\n";
	do {
		cout << "输入书籍名称,编号,作者:";
		cin >> name >> num >> auther;
		b.setInfo(name, num, auther);
		if (indexOfNum(num) == -1) {
			books.push_back(b);
			currentNum++;
			cout << "\n添加成功。" << endl;
			cout << "输入1继续增加,返回上一层输入2:";
			cin >> temp;
		}
		else {
			cout << "已存在该编号的书籍,添加失败。" << endl;
			cout << "输入1继续重新增加,返回上一层输入2:";
			cin >> temp;
		}
	} while (temp == 1);
	system("pause");
	system("cls");
}
void Library::addBook(string name, string num, string auther)
{
	Book b;
	b.setInfo(name, num, auther);
	books.push_back(b);
}
void Library::deleteBook()
{
	int index, temp;
	string num;
	cout << "  *****************************删除界面*****************************\n\n";
	do {
		cout << "输入要删除的书籍的编号:";
		cin >> num;
		index = indexOfNum(num);
		if (index != -1) {
			if (!books[index].getBorrow_flag()) {
				cout << "删除的书籍的信息:\n";
				books[index].showInfo();
				books.erase(books.begin() + index);
				currentNum--;
				cout << "删除成功。" << endl;
				cout << "输入1继续继续删除,返回上一层输入2:";
				cin >> temp;
			}
			else {
				cout << "删除失败!书籍已经被借出。" << endl;
				cout << "输入1继续继续删除,返回上一层输入2:";
				cin >> temp;
			}
		}
		else
		{
			cout << "删除失败。未找到编号为" << num << "的书籍。\n";
			cout << "输入1继续继续删除,返回上一层输入2:";
			cin >> temp;
		}
	} while (temp == 1);
	system("pause");
	system("cls");
}
void Library::brrowBook()
{
	string num;
	int index;
	cout << "  *****************************借阅界面*****************************\n\n";
	cout << "输入要借阅的书籍的编号:";
	cin >> num;
	index = indexOfNum(num);
	if (index != -1) {
		if (books[index].isBorrow()) {
			cout << "借阅失败,书籍以及被借出。\n";
			system("pause");
			system("cls");
		}
		else
		{
			cout << "要借的书籍的信息:\n";
			books[index].showInfo();
			string reader, data;
			int lcn;
			cout << "输入读者姓名,借书证号,借书日期:";
			cin >> reader >> lcn >> data;
			if (readers[reader] != 2) {
				books[index].setReader(reader, lcn, data);
				cout << "借书完成。\n";
				currentNum--;
				brrowNum++;
				readers[reader]++;
				system("pause");
				system("cls");
			}
			else
			{
				cout << "借书失败,该读者以借超过两本书籍。\n";
				system("pause");
				system("cls");
			}
		}
	}
	else
	{
		cout << "借书失败。未找到编号为" << num << "的书籍.\n";
		system("pause");
		system("cls");
	}

}
void Library::returnBook()
{
	string num;
	cout << "  *****************************还书界面*****************************\n\n";
	cout << "输入要还的书籍的编号:";
	cin >> num;
	int index;
	index = indexOfNum(num);
	if (index != -1)
	{
		cout << "要还的书籍的信息为:\n";
		books[index].showInfo();
		books[index].setBorrow_flag(false);
		readers[books[index].getReader()]--;
		cout << "还书成功。\n";
		system("pause");
		system("cls");
	}
	else
	{
		cout << "还书失败,请检查书籍编号是否输入错误!\n";
		system("pause");
		system("cls");
	}
}
void Library::getReader()
{
	string num;
	cout << "  *****************************查询界面*****************************\n\n";
	cout << "输入要查找的书籍编号:";
	cin >> num;
	int index;
	index = indexOfNum(num);
	if (index != -1)
	{
		if (books[index].getBorrow_flag())
			cout << "读者为:" << books[index].getReader() << endl;
		else {
			cout << "无读者。" << endl;
		}
		system("pause");
		system("cls");
	}
	else
	{
		cout << "查询失败,请检查书籍编号是否输入错误!\n";
		system("pause");
		system("cls");
	}
}
Library l;

void menu()
{
	int temp;
	
	while (1)
	{
		cout << "___________________________ 图书馆管理系统____________________________\n";
	    cout << "                  ┏━━━━━━━━━━━━━┓                      \n";
		cout << "                  ┃ [0]退出系统。            ┃                      \n";
		cout << "                  ┃ [1]增加图书。            ┃                      \n";
		cout << "                  ┃ [2]删除图书。            ┃                      \n";
		cout << "                  ┃ [3]借阅图书。            ┃                      \n";
		cout << "                  ┃ [4]归还图书。            ┃                      \n";
		cout << "                  ┃ [5]显示图书信息。        ┃                      \n";
		cout << "                  ┃ [6]查询图书。            ┃                      \n";
		cout << "                  ┗━━━━━━━━━━━━━┛                      \n";
		cout << "输入要进行的操作:";
		cin >> temp;
		switch (temp) {
		case 1:
			system("cls");
			l.addBook(); 
			break;
		case 2:system("cls");
			l.deleteBook(); 
			break;
		case 3:system("cls");
			l.brrowBook(); 
			break;
		case 4:system("cls");
			l.returnBook(); 
			break;
		case 5:system("cls");
			l.showInfo();
			break;
		case 6:system("cls");
			l.getReader();
			break;
		case 0:
			
			exit(1);
			break;
		default:
			cout << "输入错误!" << endl;
			system("pause");
			system("cls");
		}
	}
}
int main()
{
	menu();
	return 0;
}
  • 67
    点赞
  • 575
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
图书馆流通管理软件 作为面向对象程序设计的第一步,在实际系统中,识别对象和类是很重要的。在这里,我们以图书馆流通管理系统为例,介绍识别对象与类的一般方法。 1、对象和类的识别 在一个信息系统内识别对象最简单也是最主要的方法是对具体事物的属性和功能进行分析,一旦识别到一个对象,就能识别出相同类型的所有对象,把它们归纳为类。 图书馆流通系统内,有书、读者、借书证、管理人员、借书还书行为等对象和事件,他们分别各是一个群体。例如每个图书馆都有几万甚至几十万册图书,每册图书都是一个对象,它们形成图书类(在此暂时用Item款目表示)。相应的,在图书流通系统内,还可以得到以下类: 读者(Reader)类,在图书馆注册的每位借书人都是一个读者类的对象; 图书借阅信息类(Loan),每次发生借书行为,都产生一个借阅信息的对象; 管理人员类(Manager),是借书还书行为的操作人。 借书证对象虽然是实实在在的对象,但每位读者对应一本借书证,且只需要知道其编号,因此不需要另外定义类,只作为读者类的一个数据成员。 同一个信息系统,从不同的角度分析,或根据要求的不同,有不同的侧重面,这样建立的对象模型不同,可能得出的分类方法也不同。 2、对象属性的识别 每个对象的情况称为对象的属性,同类型的对象具有共同的属性,只是每个对象的属性值不一定相同。属性是对一个对象状态的描述,如“在馆图书类”,从流通管理的角度来看,应包含书名Title、作者名Author、分类号IndexCode、册数Number、条码号BarCode等属性。 其它类的属性如下: 读者类,包含姓名Name、职务Position、年龄Age、借书证编号Code等。一个读者允许借阅若干册书,在此用一个Item的数组items保存相应信息。另外对读者所借书册数要统计,定义一个计数的成员Counter; 图书借阅信息类,包含所借书item、借书人reader、借书操作员manager等; 管理人员类,包含姓名Name、年龄Age、工号Code等; 管理人员类只有在发生借书行为时才作为操作人员记录下来,可以作为借书信息类的一个数据成员记录备查,程序中未定义其对象。 同一个类(对象),从不同的角度分析,或根据要求的不同,描述它的属性也可能不一致。 3、对象功能的确定 对象的功能指为了达到目的必须执行的动作,或是对象对所发生事件的反应。功能也可称为对象的操作。 在图书馆流通管理系统内,图书类应包含为各属性赋值(Set…)的操作、读取条码(GetCode)和显示图书基本信息(Show)的操作,另外还定义了缺省构造函数和拷贝构造函数。 读者类,需定义为各属性赋值(Set…)的操作、读取借书证号的操作,借书和还书需要向所借书数组中添加或减少书,定义AddBook和DelBook两个操作,还有显示所借书的操作ShowBooks。 4、对象和类的标记 在这里采用科德(Coad)定义的面向对象方法的描述符号,这一方法是Peter Coad和Ed YourDon于1990年提出的,这一方法的优点是图形简单、易于理解和掌握,但对类和对象属性的访问权限无法进行有效的描述。 科德标记法中,使用一个圆角矩形表示类,矩形内部分为三个部分,上部写类名,中部写属性(数据成员),下部表示该类的操作(函数成员)。对象是类的实例,在科德标记法中,在相应类标记外加一个圆角矩形框表示对象,并将矩形内部的表示类名的地方写上对象名,如图4.15。 科德表示法可形象地用扑克牌示意图来表示。如图4.16,一个类可能有0个或1个2个3个甚至更多对象,但没有实例化以前,它们在图上只画一个圆角矩形,就像一叠扑克牌,只看见最上面的一张牌;当把这叠牌散开时,它们是若干个对象,就像类被实例化了。 科德标记法还有表示连接的符号,如图4.17,一个带线段的半圆弧表示A是通用类,B是特殊类,中间带空心三角形的线段表示A类包含B类即整体与部分的关系,中间带实心箭头的线段表示A向B发送消息,一段实线表示对象之间的连接线。 根据上面对的图书馆流通管理系统的分析,在图4.18中,用科德标记法表示Item, Reader, Manager, Loan四个类,它们的数据成员及其类型、函数成员的原型都在图中标出,但无法标出它们的访问权限。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值