本文实例为大家分享了C++实现图书管理系统课程设计,供大家参考,具体内容如下
1.题目:【1】:工作人员登录后,可以进行的操作
添加学生的信息(学号,姓名,院系,最大借阅的图书数量等);
修改学生的信息(学号,姓名,院系,最大借阅的图书数量等);
删除学生的信息(学号,姓名,院系,最大借阅的图书数量等);
如果某个学生退学,就要清除他的信息;
查看学生的信息;
添加图书的信息(图书号,书名,作者,出版社,数量等);
修改图书的信息(图书号,书名,作者,出版社,数量等);
删除图书的信息(图书号,书名,作者,出版社,数量等);
查看图书的信息;
【2】:学生登录后,可以进行的操作
查看学生自己借阅的数目信息;
借阅图书;
归还图书;
备注:要求将学生和图书信息存放到外存上,每次从外存读取数据;
/**
*项目名称:图书管理系统
*语言:C++
**/
#include <iostream>
#include <fstream>
#include <string>
#include <iomanip>
#include <vector>
#include <stdlib.h>
#include <string.h>
using namespace std;
//构建学生类
class Student
{
public:
Student()
{
memset(s_num, 0, sizeof(s_num));
memset(s_name,0, sizeof(s_name));
memset(s_name, 0, sizeof(college, 0, sizeof(college)));
borrow_max = 0;
borrow_quantity = 0;
memset(borrow_books, 0, sizeof(borrow_books));
}
char s_num[15]; //学号
char s_name[10]; //姓名
char college[30]; //院系
int borrow_max; //最大借阅数量
int borrow_quantity; //借阅数量
char borrow_books[10][30]; //借阅图书
bool S_SetInto(); //设置学生信息
friend istream& operator>>(istream& in, Student& cp); //提取运算符重载
friend ostream& operator<<(ostream& out, Student& cp); //插入运算符重载
bool S_If_match(char p[30]); //判断学号是否匹配
void s_display(); //显示学生信息
};
//设置学生信息
bool Student::S_SetInto()
{
char temp[15];
cout << "请输入学号:(输入+退出)";
cin >> temp;
if (temp[0] == '+')
{
return false;
}
strcpy(s_num, temp);
cout << "学生姓名:";
cin >> s_name;
cout << "院系:";
cin >> college;
do
{
cout << "最大借阅数量(1-10):";
cin >> borrow_max;
}
while (borrow_max <= 0 || borrow_max > 10);
return true;
}
//提取运算符重载
istream& operator>>(istream& in, Student& cp)
{
in >> cp.s_num >> cp.s_name >> cp.college >> cp.borrow_max >> cp.borrow_quantity;
for (int i = 0; i < cp.borrow_quantity; i++)
{
in >> cp.borrow_books[i];
}
return in;
}
//插入运算符重载
ostream& operator<<(ostream& out, Student& cp)
{
out << cp.s_num << ' ' << cp.s_name << ' ' << cp.college << ' ' << cp.borrow_max << ' ' << cp.borrow_quantity << ' ';
for (int i = 0; i < 10; i++)
{
out << cp.borrow_books[i] << ' ';
if (i == 9)
{
out << '\n';
}
}
return out;
}
//判断学号是否匹配
bool Student::S_If_match(char p[30])
{
return (!strcmp(s_num, p)||!strcmp(s_name, p));
}
//显示学生信息
void Student::s_display() //显示
{
cout << setiosflags(ios::left) << "学号:" << setw(12) << s_num << " " << setw(10) << s_name << " " << setw(25) << college << endl
<< "最大借阅量" << borrow_max << endl;
}
//构建图书类
class Book
{
public:
char b_num[15]; //图书号
char b_name[30]; //书名
char author[20]; //作者
char p_house[30]; //Publishing House 出版社
int b_quantity; //图书数量
bool B_SetInto(); //设置图书信息
friend istream& operator>>(istream& in, Book& cp); //提取运算符重载
friend ostream& operator<<(ostream& out, Book& cp); //插入运算符重载
bool B_If_match(char p[30]);
void b_display(); //图书信息显示
};
//设置图书信息
bool Book::B_SetInto()
{
char temp[15];
cout << "请输入图书号:(输入+退出)";
cin >> temp;
if (temp[0] == '+')
return false;
strcpy(b_num, temp);
cout << "书名:";
cin >> b_name;
cout << "作者:";
cin >> author;
cout << "出版社";
cin >> p_house;
cout << "数量:";
cin >> b_quantity;
return true;
}
//提取运算符重载
istream& operator>>(istream& in, Book& cp)
{
in >> cp.b_num >> cp.b_name >> cp.author >> cp.p_house >> cp.b_quantity;
return in;
}
//插入运算符重载
ostream& operator<<(ostream& out, Book& cp)
{
out << cp.b_num <<' '<< cp.b_name <<' '<< cp.author <<' '<< cp.p_house <<' '<< cp.b_quantity<<'\n';
return out;
}
//判断图书号是否匹配
bool Book::B_If_match(char p[30])
{
return (!strcmp(b_num, p)|| !strcmp(b_name, p));
}
//显示函数
void Book:: b_display()
{
cout << setiosflags(ios::left) << setw(12) << b_num << " " << setw(30) << b_name << " " << setw(10) << author << endl
<< setw(20) << p_house << " " <<"剩余数量:"<< setw(3) << b_quantity << endl;
}
//构建管理类
class management
{
public:
int s_sum=0; //学生数
int b_sum=0; //图书数
string key; //管理员密码
vector<Student> s_array; //记录学生类
vector<Book> b_array; //记录图书类
void S_clear(); //清理已有学生信息
void B_clear(); //清理已有图书信息
void S_Read_file(); //读取学生文件
void S_Save_file(); //保存学生文件
void B_Read_file(); //读取图书文件
void B_Save_file(); //保存图书文件
bool Student_add(); //添加学生信息
bool Student_mod(); //修改学生信息
bool Student_del(); //删除学生信息
bool Student_scan(); //查看学生信息
bool Book_add(); //添加图书信息
bool Book_mod(); //修改图书信息
bool Book_del(); //删除图书信息
bool Book_scan(); //查看图书信息
bool s_login(Student& cp); //学生凭学号登录
bool borrow_scan(Student &cp); //查看借阅数目
bool borrow_book(Student &cp); //借书
bool return_book(Student &cp); //还书
bool Student_System(); //学生登录
bool Personnel_System(); //工作人员登录
void login_init(); //登录界面初始化
};
//清理已有学生信息
void management::S_clear()
{
s_array.clear();
s_sum = 0;
}
//清理已有图书信息
void management::B_clear()
{
b_array.clear();
b_sum = 0;
}
//读取学生文件
void management::S_Read_file()
{
ifstream s_file;
s_file.open("Student_Information.txt");
if (!s_file.is_open())
{
cerr << "文件\"Student_Information.txt\"无法打开\n";
exit(1);
}
while (!(s_file.eof()))
{
Student stu;
s_file >> stu;
s_array.push_back(stu);
s_sum++;
}
s_sum--;
s_file.close();
}
//保存学生文件
void management::S_Save_file()
{
ofstream s_file("Student_Information.txt");
if (!s_file)
{
cerr << "文件\"Student_Information.txt\"无法打开!\n";
exit(1);
}
int i = -1;
while (++i < s_sum)
{
s_file << s_array[i];
}
s_file.close();
}
//读取图书文件
void management::B_Read_file()
{
ifstream b_file;
b_file.open("Book_Information.txt");
if (!b_file.is_open())
{
cerr << "文件\"Book_Information.txt\"无法打开\n";
exit(1);
}
while (!b_file.eof())
{
Book _book;
b_file >> _book;
b_array.push_back(_book);
b_sum++;
};
b_sum--;
b_file.close();
}
//保存图书文件
void management::B_Save_file()
{
ofstream b_file("Book_Information.txt");
if (!b_file)
{
cerr << "文件\"Book_Information.txt\"无法打开!\n";
exit(1);
}
int i = -1;
while (++i < b_sum)
{
b_file << b_array[i];
}
b_file.close();
}
//添加学生信息
bool management::Student_add()
{
S_Read_file();
Student _stu;
cout << "请进行信息录入。按“+”结束!\n";
do
{
s_array.push_back(_stu);
}
while (s_array[s_sum++].S_SetInto());
s_sum--;
s_array.pop_back();
return true;
}
//修改学生信息
bool management::Student_mod()
{
char _s_num[15];
S_Read_file();
cout << "请输入您要修改的学生信息的学号或名字:";
cin >> _s_num;
int i = 0;
for (; i < s_sum; i++)
{
if (s_array[i].S_If_match(_s_num))
{
cout << "该同学的原信息为:\n";
s_array[i].s_display();
cout << "请输入正确信息! \n";
s_array[i].S_SetInto();
s_sum++; //保持学生数
return true;
}
if (i == s_sum)
{
cout << "抱歉!您要修改的信息不存在! " << endl;
return false;
}
break;
}
}
//删除学生信息
bool management::Student_del()
{
char _s_num[15];
S_Read_file();
cout << "请输入您要删除的学生信息的学号:";
cin >> _s_num;
for (int i = 0; i < s_sum; i++)
{
if (s_array[i].S_If_match(_s_num))
{
cout << "该同学的原信息为:\n";
s_array[i].s_display();
s_array.erase(s_array.begin() + i);
s_sum--;
return true;
}
if (i == s_sum)
{
cout << "抱歉!您要删除的信息不存在! " << endl;
return false;
}
}
}
//查看学生信息
bool management::Student_scan()
{
S_Read_file();
if (s_sum == 0)
{
cout << "暂无信息!请等待管理人员更新!";
return false;
}
for (int i = 0; i < s_sum; i++)
{
s_array[i].s_display();
}
return true;
}
//添加图书信息
bool management::Book_add()
{
B_Read_file();
Book _book;
cout << "请进行信息录入。按“+”结束!\n";
do
{
b_array.push_back(_book);
} while (b_array[b_sum++].B_SetInto());
b_sum--;
b_array.pop_back();
return true;
}
//修改图书信息
bool management::Book_mod()
{
char _b_num[30];
B_Read_file();
cout << "请输入您要修改的图书信息的图书号或书名:";
cin >> _b_num;
for (int i = 0; i < b_sum; i++)
{
if (b_array[i].B_If_match(_b_num))
{
cout << "该图书的原信息为:\n";
b_array[i].b_display();
cout << "请输入正确信息! \n";
b_array[i].B_SetInto();
b_sum++; //保持总航线数不变
return true;
}
if (i == b_sum)
{
cout << "抱歉!您要修改的信息不存在! " << endl;
return false;
}
break;
}
}
//删除图书信息
bool management::Book_del()
{
char _b_num[15];
B_Read_file();
cout << "请输入您要删除的图书信息的图书号:";
cin >> _b_num;
for (int i = 0; i < b_sum; i++)
{
if (b_array[i].B_If_match(_b_num))
{
cout << "该图书的原信息为:\n";
b_array[i].b_display();
b_array.erase(b_array.begin() + i);
b_sum--;
return true;
}
if (i == b_sum)
{
cout << "抱歉!您要删除的信息不存在! " << endl;
return false;
}
}
}
//查看图书信息
bool management::Book_scan()
{
B_Read_file();
if (b_sum == 0)
{
cout << "暂无信息!请等待管理人员更新!";
return false;
}
for (int i = 0; i < b_sum; i++)
{
b_array[i].b_display();
}
return true;
}
//学生凭学号登录
bool management::s_login(Student& cp)
{
char _s_num[15];
S_Read_file();
cout << "请输入您的学号:";
cin >> _s_num;
for (int i = 0; i < s_sum; i++)
{
if (s_array[i].S_If_match(_s_num))
{
cp=s_array[i];
cout << "欢迎您," << cp.s_name << "同学!" << endl;
S_clear();
return true;
}
}
S_clear();
return false;
}
//查看借阅数数目
bool management::borrow_scan(Student& cp)
{
S_Read_file();
B_Read_file();
cout << "您已借阅图书" << setw(3) << cp.borrow_quantity << "本" << endl;
for (int i = 0; i < cp.borrow_quantity; i++)
{
cout << cp.borrow_books[i] << endl;
}
S_clear();
B_clear();
return true;
}
//借书
bool management::borrow_book(Student& cp)
{
S_Read_file();
B_Read_file();
char _b_num[30];
cout << "请输入想借图书的图书号或书名:";
cin >> _b_num;
for (int i = 0; i < b_sum; i++)
{
if (b_array[i].B_If_match(_b_num))
{
cout << "该图书的信息为:\n";
b_array[i].b_display();
b_array[i].b_quantity--;
if (cp.borrow_quantity > cp.borrow_max - 1)
{
cout << "抱歉,您已达借书最大上限!" << endl;
return false;
}
strcpy(cp.borrow_books[cp.borrow_quantity++],b_array[i].b_name);
for (int j = 0; j < s_sum; j++)
{
if (s_array[j].S_If_match(cp.s_num))
{
s_array[j]=cp;
return true;
}
}
}
if (i == b_sum - 1)
{
cout << "抱歉!您想借的图书未收录! " << endl;
return false;
}
}
}
//还书
bool management::return_book(Student& cp)
{
S_Read_file();
B_Read_file();
char _b_num[30];
cout << "请输入想还图书的图书号或书名:";
cin >> _b_num;
for (int i = 0; i < b_sum; i++)
{
if (b_array[i].B_If_match(_b_num))
{
cout << "该图书的信息为:\n";
b_array[i].b_display();
b_array[i].b_quantity++;
for (int k = 0; k < cp.borrow_quantity; k++)
{
if (!strcmp(cp.borrow_books[k],b_array[i].b_name))
{
for (int m = k; m < cp.borrow_quantity-1; m++)
{
strcpy(cp.borrow_books[m], cp.borrow_books[m+1]);
}
strcpy(cp.borrow_books[--cp.borrow_quantity], "");
// cp.borrow_quantity--;
break;
}
}
for (int j = 0; j < s_sum; j++)
{
if (s_array[j].S_If_match(cp.s_num))
{
s_array[j] = cp;
return true;
}
}
}
if (i == b_sum)
{
cout << "抱歉!您想还的图书未收录! " << endl;
return false;
}
}
}
//工作人员登录
bool management::Personnel_System()
{
while (1)
{
int menu_options;
cout << "请输入登录密码:";
cin >> key;
if (key == "123456") //登录密码
while (1)
{
cout << endl
<< "***** 主菜单: **********" << endl
<< "***** 工作人员 " << endl
<< "***** 1——添加学生信息 "
<< "2——修改学生信息" << endl
<< "***** 3——删除学生信息 "
<< "4——查看学生信息" << endl
<< endl //区分学生和图书
<< "***** 5——添加图书信息 "
<< "6——修改图书信息" << endl
<< "***** 7——删除图书信息 "
<< "8——查看图书信息" << endl
<< "***** 9——退出登录"<<endl
<< "你需要做什么?(1-9)" << endl;
cin >> menu_options;
switch (menu_options)
{
case 1:Student_add(); break;
case 2:Student_mod(); break;
case 3:Student_del(); break;
case 4:Student_scan(); break;
case 5:Book_add(); break;
case 6:Book_mod(); break;
case 7:Book_del(); break;
case 8:Book_scan(); break;
case 9:return false;
default:cout << "输入错误,请重新选择" << endl; break;
}
if (!(menu_options == 4 || menu_options == 8))
{
cout << "是否确认? 《确认/(Y/y)》 《取消/(N/n)》" << endl;
char yn;
do
{
cin >> yn;
} while (!(yn == 'Y' || yn == 'y' || yn == 'N' || yn == 'n'));
if (yn == 'Y' || yn == 'y')
{
if (menu_options == 1 || menu_options == 2 || menu_options == 3)
{
S_Save_file();
}
else if (menu_options == 5 || menu_options == 6 || menu_options == 7)
{
B_Save_file();
}
cout << "操作成功";
}
}
S_clear();
B_clear();
}
else
{
cout << "密码错误!" << endl;
continue;
}
}
return true;
}
//学生登录
bool management::Student_System()
{
while (1)
{
Student cp;
bool key = s_login(cp);
while (key)
{
int menu_options;
cout << "***** 主菜单: **********" << endl
<< "***** 学生: " << endl
<< "***** 1——查看借阅数目" << endl
<< "***** 2——借阅图书" << endl
<< "***** 3——归还图书" << endl
<< "***** 4——退出登录" << endl
<< "你需要做什么?(选择1-4)" << endl;
cin >> menu_options;
switch (menu_options)
{
case 1:borrow_scan(cp); break;
case 2:borrow_book(cp); break;
case 3:return_book(cp); break;
case 4:return false;
}
if (menu_options == 2 || menu_options == 3)
{
cout << "是否确认? 《确认/(Y/y)》 《取消/(N/n)》" << endl;
char yn;
do
{
cin >> yn;
} while (!(yn == 'Y' || yn == 'y' || yn == 'N' || yn == 'n'));
if (yn == 'Y' || yn == 'y')
{
cout << "操作成功!" << endl;
S_Save_file();
B_Save_file();
}
}
S_clear();
B_clear();
}
cout << "未找到您的信息!" << endl;
}
return true;
}
//界面初始化函数
void management::login_init()
{
system("cls");
cout << "\n>>>>>>>>>>欢迎进入图书管理系统<<<<<<<<<<" << endl
<< "请输入您的登录方式" << endl
<< "1——工作人员(需要认证) 2——学生 3——退出系统" << endl;
}
//主函数
int main()
{
management xiangnan;
//若文件不存在,则新建文件
//存放学生信息
ofstream Student_Information("Student_Information.txt", ios::app);
if (!Student_Information)
{
cerr << "文件\"flight information.dat\"无法打开!\n";
exit(1);
}
Student_Information.close();
//存放图书信息
ofstream Book_Information("Book_Information.txt", ios::app);
if (!Book_Information)
{
cerr << "文件\"flight information.dat\"无法打开!\n";
exit(1);
}
Book_Information.close();
int dlry; //登陆人员
while (1)
{
xiangnan.login_init(); //界面初始化
cin >> dlry;
if (dlry == 1)
{
xiangnan.Personnel_System();
}
else if (dlry == 2)
{
xiangnan.Student_System();
}
else if (dlry == 3)
{
return 0;
}
else
{
cout << "输入错误,请重新选择!" << endl;
}
}
return 0;
}