赞
踩
【问题描述】
调研、选择一个小型图书借阅管理案例,实现学生管理、图书信息、借阅信息等数据管理维护功能。
学生信息包括:学号(唯一)、姓名、专业、班级、已借图书数量等
图书信息包括:图书登记号(唯一)、书号(ISBN号)、书名、作者,单价、库存数量、出版时间、出版单位、价格、图书状态(已借出、未借出、丢失、销毁等)等。
借阅信息包括:借阅序列号、学生学号、图书登记号、借阅时间、归还时间等。
【基本功能】
1、采用可视化界面设计学生信息管理、图书信息管理和借阅管理等功能。
2、设计文本文件格式,保存学生信息、图书信息和图书借阅记录,并在程序启动时从文件中加载数据。
3、修改记录:能对任意存在的记录进行修改,并能显示修改后的数据。
- #include <iostream>
- #include <stdio.h>
- #include<fstream>
- #include <cstring>
- using namespace std;
-
- //图书管理模块
- //图书类
- class book {
- public:
- int no; //图书编号
- char name[20]; //图书名称
- int b_flag; //1:在架 2:借出
- int b_del; //1:存在 2:删除
- public:
- book() {} //无参构造函数
- void setno(int n); //设置图书编号
- int getno(); //返回图书编号值
- void setname(char na[]);//设置图书名称
- char* getname(); //返回图书名称
- void borbook();//借书
- void delbook();//删除
- void addbook(int no, char na[]); //增加图书功能
- };
- //图书类函数实现
- void book::setno(int n) {
- no = n;
- }
-
- int book::getno() {
- return no;
- }
-
- void book::setname(char na[]) {
- strcpy_s(name, na);
- }
-
- char* book:: getname() {
- return name;
- }
-
- void book::borbook() {
- b_flag = 2; //借书标志
- }
-
- void book::delbook() {
- b_del = 2; //删除标志
- }
-
- void book::addbook(int no, char na[]) {
- setno(no);
- setname(na);
- b_flag = 1;
- b_del = 1;
- }
- //图书数据库类
- const int BMAX = 50; //定义书本最大值
- class bdatabase {
- public:
- book btarray[BMAX]; //图书集合
- int top;//数组的大小
- public:
- bdatabase();
- ~bdatabase(); //析构函数,将btarray[]写到book.txt文件中
- void addbooks(); //在图书数据库中添加图书
- int findbooks(int suffix); //查找图书,该函数用于借书操作,suffix是数组下标
- int findbooks(); //查找图书,该函数用于图书维护
- void editbooks(); //编辑图书
- void delbooks(); //删除图书
- void listbooks(); //显示全部图书
- };
- bdatabase::bdatabase() {
- book b; //建立book类对象并b
- top = -1; //数组下标从0开始,此处top值置为-1可保证从数组第一个元素开始存储信息
- fstream file("book.txt", ios::in);//打开文件进行读操作,若文件不存在则出错.输入输出指:内存与硬盘间的信息传递
- while (1) {
- file.read((char*)&b, sizeof(b));//从文件中读取b个字符到char*指向的缓存中(book类对象b的地址)
- if (!file) //若读取到文件尾EOF,返回非0值(一般为1),结束书本数量的计数,关闭文件
- break;
- top++;
- btarray[top] = b;
- }
- file.close();
- }
-
- bdatabase::~bdatabase() {
- fstream file("book.txt", ios::out);//输出:内存->硬盘
- for (int i = 0; i <= top; i++) {
- if (btarray[i].b_del == 1)//图书存在
- file.write((char*)&btarray[i], sizeof(btarray[i]));
- }
- file.close();
- }
-
- void bdatabase::addbooks() {
- book bk; //创建book类对象bk
- int no; //书号
- char bname[20]; //书名 用数组存放
- cout << "请输入书号:";
- cin >> no;
- cout << endl << "请输入书名:";
- cin >> bname;
- cout << endl;
- bk.b_flag = 1;//让图书的状态为在架
- bk.addbook(no, bname); //类中成员函数addbook(),设置书号与书名 修改标志
- top++;//记录存入书的个数
- btarray[top] = bk;//将新添加的书放入数组
- return; //返回上个操作界面
- }
-
- int bdatabase::findbooks(int suffix) {
- int no;
- cout << "请输入书号:";
- cin >> no;
- for (int i = 0; i <= top; i++) {
- if (btarray[i].no == no && btarray[i].b_del == 1) {//此书存在并且为存在状态
- return i;
- }
- }
- return -1;
- }
-
- int bdatabase::findbooks() {
- int no;
- char value[6];
- cout << "请输入书号:";
- cin >> no;
- for (int i = 0; i <= top; i++) {
- if (btarray[i].no == no && btarray[i].b_del == 1) {
- if (btarray[i].b_flag == 1)
- strcpy_s(value, "在架");
- if (btarray[i].b_flag == 2)
- strcpy_s(value, "借出");
- cout << "书号:" << btarray[i].no << " " << "书名:" << btarray[i].name << " " << "图书状态:" << value << endl;
- return i;
- }
- }
- return -1;
- }
-
- void bdatabase::editbooks() {
- int cur;
- cur = findbooks();
- if (cur == -1) {
- cout << "该书不存在" << endl;
- return;
- }
- cout << "当前图书信息--" << "书号:" << btarray[cur].no << " " << "书名:" << btarray[cur].name << endl;
- cout << endl;
- cout << "请继续操作以修改图书信息" << endl;
- cout << endl << "书名:";
- cin >> btarray[cur].name;
- return;
- }
-
- void bdatabase::delbooks() {
- int cur;
- cur = findbooks();
- if (cur == -1) {
- return;
- }
- if (btarray[cur].b_flag == 2) { //删除时判断图书是否借出
- cout << "该图书已经借出,请归还后删除!" << endl;
- return;
- }
- btarray[cur].b_del = 2;
- return;
- }
-
- void bdatabase::listbooks() {
- char value[6];
- for (int i = 0; i <= top; i++) {
- if (btarray[i].b_del == 1) {
- if (btarray[i].b_flag == 1)
- strcpy_s(value, "在架");
- if (btarray[i].b_flag == 2)
- strcpy_s(value, "借出");
- cout << "书号:" << btarray[i].no << " 书名:" << btarray[i].name << " 图书状态:" << value << endl;
- }
- }
- return;
- }
- //读书管理模块
- //读者类
- class reader {
- public:
- int no;//学号
- char name[20];//姓名
- int r_del; //1存在 2删除
- int r_bor; //1借过书 2未借书
- book brbook;
- public:
- void addreader(int id, char na[]); //增加读者
- void setbrbook(book bt); //设置借书标记
- book getbrbook() {
- return brbook; //返回借书信息
- }
- };
- //读书管理模块
- //读者类函数实现
- void reader::addreader(int id, char na[]) {
- no = id;
- strcpy_s(name, na);
- r_del = 1;
- }
-
- void reader::setbrbook(book bt) {
- brbook = bt;
- }
- //读者数据库类
- class rdatabase {
- public:
- reader rdarray[BMAX];
- int top;
- public:
- rdatabase();
- ~rdatabase();
- void addreaders(); //添加读者
- int findreaders(int suffix); //查找读者,该函数用于借书还书操作,suffix是数组下标
- int findreaders(); //查找读者,该函数用于读者维护操作
- void editreaders(); //编辑读者信息
- void delreaders(); //删除读者,读者如果借书,需要还书后才能删除
- void listreaders(); //显示所有读者
- };
-
- void readersmange();
- rdatabase::rdatabase() {
- reader rd;
- top = -1;
- fstream file("reader.txt", ios::in);
- while (1) {
- file.read((char*)&rd, sizeof(rd));
- if (!file) break;
- top++;
- rdarray[top] = rd;
- }
- file.close();
- }
-
- rdatabase::~rdatabase() {
- fstream file("reader.txt", ios::out);
- for (int i = 0; i <= top; i++) {
- if (rdarray[i].r_del == 1)
- file.write((char*)&rdarray[i], sizeof(rdarray[i]));
- }
- file.close();
- }
-
- void rdatabase::addreaders() {
- reader rd;
- int no;
- char rname[20];
- cout << "请输入学号:";
- cin >> no;
- cout << endl << "请输入姓名:";
- cin >> rname;
- cout << endl;
- rd.addreader(no, rname);
- rd.r_bor = 2;
- top++;
- rdarray[top] = rd;
- return;
- }
-
- int rdatabase::findreaders(int suffix) {
- int no;
- cout << "请输入学号:";
- cin >> no;
- for (int i = 0; i <= top; i++) {
- if (rdarray[i].no == no && rdarray[i].r_del == 1) {
- return i;
- }
- }
- return -1;
- }
-
- int rdatabase::findreaders() {
- int no;
- char value[3];
- cout << "请输入学号:";
- cin >> no;
- for (int i = 0; i <= top; i++) {
- if (rdarray[i].no == no && rdarray[i].r_del == 1) {
- if (rdarray[i].r_bor == 1)
- strcpy_s(value, "借");
- if (rdarray[i].r_bor == 2)
- strcpy_s(value, "无");
- cout << "学号:" << rdarray[i].no << " " << "姓名:" << rdarray[i].name << " " << "是否借书:" << value << endl;
- return i;
- }
- }
- return -1;
- }
-
- void rdatabase::editreaders() {
- int cur;
- cur = findreaders();
- if (cur == -1) {
- cout << "未找到该学生" << endl;
- return;
- }
- cout << "请修改数据:" << endl;
- cout << endl << "姓名:";
- cin >> rdarray[cur].name;
- return;
- }
-
- void rdatabase::delreaders() {
- int cur;
- cur = findreaders();
- if (cur == -1) {
- return;
- }
- if (rdarray[cur].r_bor == 1) {
- cout << "该用户已借出图书,请归还后删除!" << endl;
- return;
- }
- rdarray[cur].r_del = 2;
- return;
- }
-
- void rdatabase::listreaders() {
- char value[3];
- for (int i = 0; i <= top; i++) {
- if (rdarray[i].r_del == 1) {
- if (rdarray[i].r_bor == 1)
- strcpy_s(value, "借");
- if (rdarray[i].r_bor == 2)
- strcpy_s(value, "无");
- cout << "学号:" << rdarray[i].no << " " << "姓名:" << rdarray[i].name << " " << "是否借书:" << value << endl;
- }
- }
- return;
- }
- void booksmanage(); //图书信息管理界面 声明
- void borrow_or_return(char br);//借出还是归还
- //界面
- void login();
- void Main_Interface();
- void Book_Maintenance_Interface();
- void Reader_Maintenance_Interface();
- void UI();
- void readersmange();
- int main() {
- char in = -1;
- login();
- do{//退出系统限制条件
- UI(); //系统界面改变
- Main_Interface();
- cin >> in;
- switch (in) {
- case'1':
- borrow_or_return(in);
- break;
- case'2':
- borrow_or_return(in);
- break;
- case'3':
- booksmanage();
- break;
- case'4':
- readersmange();
- break;
- case'0': {
- cout << "感谢您使用本系统,再见!" << endl;
- break;
- }
- default:
- cout << "In Put Error!!! Please try again!!!" << endl;
- }
- } while (in != '0');
- system("pause");
- return 0;
- }
- //函数的实现
- void borrow_or_return(char br) { //借书、还书函数,参数br:判断 “借书”,“还书”. 1 借书 2 还书
- int reader_ID = 0; //读者id
- int book_ID = 0; //书的id
- int rsuffix, bsuffix;
- bdatabase t_bd;
- rdatabase t_rd;
- if (br == '1') { //借书
- rsuffix = t_rd.findreaders(reader_ID);
- bsuffix = t_bd.findbooks(book_ID);
- if (rsuffix == -1 || bsuffix == -1)
- return;
- if (t_bd.btarray[bsuffix].b_flag == 2) {
- cout << "图书已经借出,请选择其它图书" << endl;
- return;
- }
- t_bd.btarray[bsuffix].b_flag = 2;
- t_rd.rdarray[rsuffix].r_bor = 1;
- t_rd.rdarray[rsuffix].brbook = t_bd.btarray[bsuffix];
- return;
- }
- if (br == '2') {
- rsuffix = t_rd.findreaders(reader_ID);
- bsuffix = t_bd.findbooks(book_ID);
- if (rsuffix == -1 || bsuffix == -1)
- return;
- if (t_rd.rdarray[rsuffix].brbook.no == t_bd.btarray[bsuffix].no) {
- t_bd.btarray[bsuffix].b_flag = 1;
- t_rd.rdarray[rsuffix].r_bor = 2;
- t_rd.rdarray[rsuffix].brbook = t_bd.btarray[bsuffix];
- }
- else {
- cout << "请重新输入,读者借阅图书书号错误" << endl;
- return;
- }
- return;
- }
- }
-
- void booksmanage() {
- char in;
- bdatabase bd;
- do {
- system("pause");
- system("cls");//切换UI时,刷新缓冲区当前内容,完成下次更新
- UI();
- Book_Maintenance_Interface();
- cin >> in;
- switch (in) {
- case'1':
- bd.addbooks();
- break;
- case'2':
- bd.editbooks();
- break;
- case'3':
- bd.delbooks();
- break;
- case'4':
- bd.findbooks();
- break;
- case'5':
- bd.listbooks();
- break;
- case'6':
- break;
- default:
- cout << "In Put Error!!! Please try again!!!" << endl;
- }
- } while (in != '6');
- return;
- }
- void login() {
- char passward[2] = "2"; //此变量用于存储登录密码
- char s[2];//获取输入的密码,用于验证和登录密码是否相同
- int n = 3; //限定输入错误次数是3次
- cout << "请输入登录密码: ";
- cin >> s;
- if (!strcmp(s, passward)) { //若密码正确
- cout << "恭喜您登陆成功!!!请稍等......\n\n";
- system("pause");
- }
- else {
- cout << "Waring!!!密码输入错误,请退出系统后重新尝试\n";
- system("pause");
- exit(0);
- }
- }
-
- void Main_Interface() { //主界面
- system("cls"); //清屏函数 clean screen
- system("title 图书管理系统 项目开发人员 : 韩女士 ");//对控制台文件名重命名
- cout << "\n\n\n\n\n";
- cout << "\t\t\t***************欢 迎 进 入 图 书 管 理 系 统***********************\n";//与case顺序一致
- cout << "\t\t\t*\t 1. 借书 * \n ";
- cout << "\t\t\t*\t 2. 还书 * \n ";
- cout << "\t\t\t*\t 3. 图书信息管理 * \n ";
- cout << "\t\t\t*\t 4. 读者信息管理 * \n ";
- cout << "\t\t\t*\t 0. 退出 * \n ";
- cout << "\t\t\t*******************************************************************\n ";
- cout << " ";
- cout << "\t\t\t Copyright (C) 2020-2021. All Rights Reserved \n ";
- cout << "\t\t\t\n请选择您要执行的操作编号(1-4-0): ";
- cout << endl;
- }
-
- void Book_Maintenance_Interface() { //图书维护子菜单
- cout << "\n\n\n\n\n";
- cout << "\t\t\t***************图 书 信 息 维 护 管 理 员 后 台********************\n";//与case顺序一致
- cout << "\t\t\t*\t 1. 添加 * \n ";
- cout << "\t\t\t*\t 2. 修改 * \n ";
- cout << "\t\t\t*\t 3. 删除 * \n ";
- cout << "\t\t\t*\t 4. 查找 * \n ";
- cout << "\t\t\t*\t 5. 显示 * \n ";
- cout << "\t\t\t*\t 6. 返回上级操作 * \n ";
- cout << "\t\t\t*******************************************************************\n ";
- cout << " ";
- cout << "\t\t\t\n请选择您要执行的操作编号(1-6): ";
- cout << endl;
- }
-
- void Reader_Maintenance_Interface() { //读者维护子菜单
- cout << "\n\n\n\n\n";
- cout << "\t\t\t***************读 者 信 息 维 护 管 理 员 后 台********************\n";//与case顺序一致
- cout << "\t\t\t*\t 1. 添加 * \n ";
- cout << "\t\t\t*\t 2. 修改 * \n ";
- cout << "\t\t\t*\t 3. 删除 * \n ";
- cout << "\t\t\t*\t 4. 查找 * \n ";
- cout << "\t\t\t*\t 5. 显示 * \n ";
- cout << "\t\t\t*\t 6. 返回上级操作 * \n ";
- cout << "\t\t\t*******************************************************************\n ";
- cout << " ";
- cout << "\t\t\t\n请选择您要执行的操作编号(1-6): ";
- cout << endl;
- }
- //0 = 黑色 8 = 灰色
- //1 = 蓝色 9 = 淡蓝色
- //2 = 绿色 A = 淡绿色
- //3 = 浅绿色 B = 淡浅绿色
- //4 = 红色 C = 淡红色
- //5 = 紫色 D = 淡紫色
- //6= 黄色 E = 淡黄色
- //7 = 白色 F = 亮白色
- void UI() //自定义函数实现颜色变化
- {
- system("color F0");//前景黑 背景亮白 白底黑字
- }
- void readersmange() {
- char in;
- rdatabase bd;
- do {
- system("pause"); //暂停界面,以便显示所需数据
- system("cls");
- UI();
- Reader_Maintenance_Interface();
- cin >> in;
- switch (in) {
- case'1':
- bd.addreaders();
- break;
- case'2':
- bd.editreaders();
- break;
- case'3':
- bd.delreaders();
- break;
- case'4':
- bd.findreaders();
- break;
- case'5':
- bd.listreaders();
- break;
- case'6':
- break;
- default:
- cout << "In Put Error!!! Please try again!!!" << endl;
- }
- } while (in != '6');
- return;
- }
-

本实验代码,是我在其他博主那借鉴的,然后进行运行操作,并对代码进行更深的了解,希望整理出来,也可以对你们有用。
首先就是针对背景颜色的设计:
//0 = 黑色 8 = 灰色
//1 = 蓝色 9 = 淡蓝色
//2 = 绿色 A = 淡绿色
//3 = 浅绿色 B = 淡浅绿色
//4 = 红色 C = 淡红色
//5 = 紫色 D = 淡紫色
//6= 黄色 E = 淡黄色
//7 = 白色 F = 亮白色
void UI() //自定义函数实现颜色变化
{
system("color F0");//前景黑 背景亮白 白底黑字
}
这是我自己从网上搜索了一下关于变化颜色的操作,以及对应的颜色。
好啦,今天的分享就到这里啦,如果你们还有什么疑问的话,可以私信我哟!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。