本文实例为大家分享了C++实现图书管理系统的具体代码,供大家参考,具体内容如下
大一 C++课设,没有用分文件的形式,只是把菜单页面单独分开了。用的是链表,都是一些基础的东西。另外采用了二维数组来保存读者借书信息,并将二维数组读入文件中。
功能:1.首先是注册,登录,找回密码和修改密码功能,登录和注册使用了多态,并且登录页面采用了*符号加密。2.管理员在删除图书时,若用户此时已将此书借走,则会将此书从用户的借书书单中删去,实现了动态管理。3.容错率极高,每个页面都有返回上一页面的功能。4.每个页面都有设置有滚键盘机制,提高了容错率。
菜单:#pragma once
void _mainmenu();
void Loginmenu();
void Registmenu();
void readermenu();
void mangermenu();
void changebookmenu();
void browsemenu();
菜单文件`#include “menu.h”
void _mainmenu(){
printf("\n\n");
printf(" 欢 迎 使 用 图 书 管 理 系 统 !\n");
printf(" **************************************************\n");
printf(" ** 1.登录 **\n");
printf(" ** **\n");
printf(" ** 2.注册 **\n");
printf(" ** **\n");
printf(" ** 3.找回密码 **\n");
printf(" ** **\n");
printf(" ** 4.退出 **\n");
printf(" **************************************************\n");
printf("请按键选择:");
}void Loginmenu(){ printf(“ 登录页面\n”); printf(“ **\n”); printf(“ 1.管理员登录 \n”); printf(“ \n”); printf(“ 2.用户登录 \n”); printf(“ \n”); printf(“ 3.返回 \n”); printf(“ \n”); printf(“ 4.退出 \n”); printf(“ **\n”); printf(“请按键选择:”);}
void Registmenu(){ printf(“ 注册页面\n”); printf(“ **\n”); printf(“ 1.管理员注册 \n”); printf(“ \n”); printf(“ 2.用户注册 \n”); printf(“ \n”); printf(“ 3.返回 \n”); printf(“ \n”); printf(“ 4.退出 \n”); printf(“ **\n”); printf(“请按键选择:”);}
void readermenu(){ printf(“ 用户页面\n”); printf(“ **\n”); printf(“ 1.借书 \n”); printf(“ \n”); printf(“ 2.还书 \n”); printf(“ \n”); printf(“ 3.浏览图书信息 \n”); printf(“ \n”); printf(“ 4.查看已借阅书籍 \n”); printf(“ \n”); printf(“ 5.修改密码 \n”); printf(“ \n”); printf(“ 6.返回 \n”); printf(“ \n”); printf(“ 7.退出 \n”); printf(“ **\n”); printf(“请按键选择:”);}
void mangermenu(){ printf(“ 管理员页面\n”); printf(“ **\n”); printf(“ 1.增加图书 \n”); printf(“ \n”); printf(“ 2.删除图书 \n”); printf(“ \n”); printf(“ 3.修改图书信息 \n”); printf(“ \n”); printf(“ 4.查看读者信息 \n”); printf(“ \n”); printf(“ 5.浏览图书信息 \n”); printf(“ \n”); printf(“ 6.修改密码 \n”); printf(“ \n”); printf(“ 7.返回 \n”); printf(“ \n”); printf(“ 8.退出 \n”); printf(“ **\n”); printf(“请按键选择:”);}
void changebookmenu(){ printf(“\n\n”); printf(“\t\t\t\t*\n”); printf(“\t\t\t\t 1.修改id号 \n”); printf(“\t\t\t\t \n”); printf(“\t\t\t\t 2.修改图书名称 \n”); printf(“\t\t\t\t \n”); printf(“\t\t\t\t 3.修改图书作者 \n”); printf(“\t\t\t\t \n”); printf(“\t\t\t\t 4.修改出版社 \n”); printf(“\t\t\t\t \n”); printf(“\t\t\t\t 5.修改图书数量 \n”); printf(“\t\t\t\t \n”); printf(“\t\t\t\t 6.修改是否可借 \n”); printf(“\t\t\t\t \n”); printf(“\t\t\t\t 7.返回 \n”); printf(“\t\t\t\t*“); printf(“\n\n”);}
void browsemenu(){ printf(“\n\n\n\n”); printf(“\t\t\t\t*\n”); printf(“\t\t\t\t 1.按id号浏览 \n”); printf(“\t\t\t\t \n”); printf(“\t\t\t\t 2.按图书数量浏览 \n”); printf(“\t\t\t\t \n”); printf(“\t\t\t\t 3.返回 \n”); printf(“\t\t\t\t \n”); printf(“\t\t\t\t 4.退出 \n”); printf(“\t\t\t\t*\n”); printf(“请按键选择:”);}主程序
#define _CRT_SECURE_NO_WARNINGS
using namespace std;class User{protected : char account[20]; char password[20]; char spassword[20];
public : virtual void Login() = 0; virtual void Regist() = 0; virtual void save() = 0; virtual void BrowseBook() = 0; virtual void ChangePassword() = 0; virtual void FindPassword() = 0;};
class Reader : public User{private: int number; string name; string sex; int books; // 借书数量 int bookcnt;// 借阅次数 char booklist[20][20];// 储存借阅书籍 class Reader* next;
public : virtual void Login(); virtual void Regist(); virtual void save(); virtual void BrowseBook(); virtual void ChangePassword(); virtual void FindPassword(); void creat(); void BrowseBorrowBook(Reader pp); void BorrowBook(Reader pp); void ReturnBook(Reader* pp);
public : void set_number(int _number) { number = _number; }; void set_name(string _name) { name = _name; }; void set_sex(string _sex) { sex = _sex; }; void set_next(Reader p) { next = p; }; void set_books(int _books) { books = _books; }; void set_bookcnt(int _bookcnt) { bookcnt = _bookcnt; }; int get_bookcnt() { return bookcnt; }; int get_number() { return number; }; int get_books() { return books; }; Reader get_next() { return next; } string get_name() { return name; }; string get_sex() { return sex; }; char get_account(Reader p) { return p->account; }; char get_password(Reader p) { return p->password; }; char get_spassword(Reader p) { return p->spassword; }; char get_booklist(Reader p, int i) { return p->booklist[i]; };
};
class Manger : public User{private: class Manger* next;
public :
virtual void Login();
virtual void Regist();
virtual void BrowseBook();
virtual void save();
virtual void ChangePassword();
virtual void FindPassword();
void creat();
void AddBook();
void ChangeBook();
void DeleteBook();
void DeleteReaderBook(char* bookname);
void BrowseReader();
public : void set_next(Manger p) { next = p; }; Manger get_next() { return next; }; char get_account(Manger p) { return p->account; }; char get_password(Manger p) { return p->password; }; char get_spassword(Manger p) { return p->spassword; };};
class Book{private: int id; int amount; int flag; string bookname; string author; string press; class Book* next;
public :
void creat();
void save();
void show_book();
void set_id(int _id) { id = _id; };
void set_amount(int _amount) { amount = _amount; };
void set_flag(int _flag) { flag = _flag; };
void set_bookname(string _bookname) { bookname = _bookname; };
void set_author(string _author) { author = _author; };
void set_press(string _press) { press = _press; };
void set_next(Book* p) { next = p; };
int get_id() { return id; };
int get_amount() { return amount; };
int get_flag() { return flag; };
string get_bookname() { return bookname; };
string get_author() { return author; };
string get_press() { return press; };
Book* get_next() { return next; };
};
class DBFile{public : void cls(); void over(); void login(); void useLogin(User base); void regist(); void useRegist(User base); void usebrowsebook(User base); void usesave(User base); void usechangepassword(User base); void usefindpassword(User base); void findpassword(); int exist(char acconut, int flag); void _main(); void idsort(); void bookamountsort(); void showidsort(); void showbookamountsort(); void mangerfunction(); void readerfunction(Reader rp);};Reader rhead = NULL; Reader _rend = NULL;Manger mhead = NULL, mend = NULL;Book bhead = NULL; Book bend = NULL;char code[20] = “glysw”;
// 读者类void Reader::Login(){ int cnt = 4; int flag = 0; int k = 0; int i; char c; DBFile fp = new DBFile; Reader p = rhead->get_next(); char rpassword[2000]; char raccount[2000]; cout << “\n\n\n\n\n\n\n”; printf(“请输入您的账户(按0退出):”); while (cin >> raccount) { if (strcmp(raccount, “0”) == 0) { return; } if (strlen(raccount) <= 16) { break; } else { cout << “请输入长度为1到16位的账户:”; } }
cout << "请输入您的密码(按0退出):";
for (i = 0; (c = _getch()) != '\r';)
{
if (c == '0')
{
return;
}
if (i <= 15 && isprint(c))
{
rpassword[i] = c;
i++;
k++;
cout << "*";
}
if (k > 0 && c > 0 && c == '\b')
{
i--;
k--;
cout << "\b";
cout << " ";
cout << "\b";
}
}
rpassword[i] = '\0';
cout << "\n";
while (p)
{
if (strcmp(p->account, raccount) == 0)
{
flag = 1;
while (strcmp(p->password, rpassword) != 0)
{
cnt--;
if (cnt == 1)
{
fp->cls();
cout << "\n\n\n\n\n\n\n";
cout << "密码输入次数已用完! " << "\n" << "即将退出登录页面...";
Sleep(3000);
fp->cls();
return;
}
cout << "密码错误!您还有" << cnt - 1 << "次机会\n" << endl;
cout << "请重新输入(按0退出):";
k = 0;
for (i = 0; (c = _getch()) != '\r';)
{
if (c == '0')
{
return;
}
if (i <= 15 && isprint(c))
{
rpassword[i] = c;
i++;
k++;
cout << "*";
}
if (k > 0 && c > 0 && c == '\b')
{
i--;
k--;
cout << "\b";
cout << " ";
cout << "\b";
}
}
rpassword[i] = '\0';
cout << "\n";
}
cout << "读者" << raccount << "登陆成功!\n" << "即将跳转至读者页面..." << endl;
Sleep(2000);
fp->cls();
fp->readerfunction(p);
return;
}
p = p->get_next();
}
if (!flag)
{
cout << "不存在此账号!\n请先前往注册!\n" << endl;
cout << "即将跳转至主页面...";
Sleep(2000);
}
}
void Reader::Regist(){ DBFile fp = new DBFile; Reader rp = new Reader; char raccount[2000]; char rpassword[2000]; char rspassword[2000]; char name[200]; char sex[10]; int number;
Reader* p = new Reader;
cout << "\n\n\n\n\n\n\n";
cout << "请输入账户(按0退出):";
while (cin >> raccount)
{
if (strcmp(raccount, "0") == 0)
{
return;
}
if (strlen(raccount) <= 16 && !fp->exist(raccount, 0))
{
break;
}
else if (fp->exist(raccount, 1))
{
cout << "该账户已存在!请重新输入(按0退出):";
}
else
{
cout << "请输入长度为1到16位的账户:";
}
}
strcpy_s(p->account, raccount);
cout << "请输入密码(按0退出):";
while (cin >> rpassword)
{
if (strcmp(rpassword, "0") == 0)
{
return;
}
if (strlen(rpassword) <= 16)
{
break;
}
else
{
cout << "请输入长度为1到16位的密码(按0退出):";
}
}
strcpy_s(p->password, rpassword);
cout << "请输入您的密保(按0退出):";
while (cin >> rspassword)
{
if (strcmp(rspassword, "0") == 0)
{
return;
}
if (strlen(rspassword) <= 16)
{
break;
}
else
{
cout << "请输入长度为1到16位的密保(按0退出):";
}
}
strcpy_s(p->spassword, rspassword);
cout << "请输入您的姓名(按0退出):";
cin >> name;
if (strcmp(name, "0") == 0)
{
return;
}
p->name = name;
cout << "请输入您的性别(按0退出):";
while (cin >> sex)
{
if (strcmp(sex, "0") == 0)
{
return;
}
if (strcmp(sex, "男") == 0 || strcmp(sex, "女") == 0)
{
p->sex = sex;
break;
}
else
{
cout << "请输入男或女(按0退出):";
}
}
cout << "请输入您的学号(按0退出):";
while (cin >> number)
{
if (number == 0)
{
return;
}
if (number >= 0)
{
p->number = number;
break;
}
else
{
cout << "请输入正确格式的学号(按0退出):";
}
}
_rend->set_next(p);
_rend = p;
_rend->set_next(NULL);
rp->save();
fp->cls();
printf("\n\n\n\n\n\n\n");
printf("\t\t\t\t\t*******************************\n");
printf("\t\t\t\t\t** **\n");
printf("\t\t\t\t\t 读者%s注册成功!! \n", raccount);
printf("\t\t\t\t\t** 即将跳转至主页面... **\n");
printf("\t\t\t\t\t** **\n");
printf("\t\t\t\t\t*******************************\n");
Sleep(1500);
}void Reader::save(){ Reader* rp = rhead->get_next(); ofstream f_reader(“reader.txt”, ios::out); while (rp) { f_reader << rp->account << “ “ << rp->password << “ “ << rp->spassword << “ “ << rp->number << “ “ << rp->name << “ “ << rp->sex << “ “ << rp->bookcnt << “ “ << rp->books; for (int i = 0; i < rp->bookcnt; i++) { f_reader << “ “ << booklist[i]; } f_reader << endl; rp = rp->get_next(); } f_reader.close();}
void Reader::BrowseBook(){ DBFile fp = new DBFile; int sign = 0; while (1) { fp->cls(); browsemenu(); char choose = _getch(); switch (choose) { case ‘1’: fp->cls(); fp->showidsort(); break; case ‘2’: fp->cls(); fp->showbookamountsort(); break; case ‘3’: fp->cls(); sign = 1; break; case ‘4’: fp->cls(); fp->over(); break; default: break; } if (sign) { break; } }}void Reader::creat(){ ifstream f_reader(“reader.txt”, ios::in); char _account[20]; char _password[20]; char _spassword[20]; int number; int bookcnt; int books; char name[20]; char sex[20]; char booklist[20][20]; while (f_reader >> _account && f_reader >> _password && f_reader >> _spassword) { Reader p = new Reader; strcpy_s(p->account, _account); strcpy_s(p->password, _password); strcpy_s(p->spassword, _password); _rend->set_next(p); p->set_next(NULL); _rend = _rend->get_next(); } while (f_reader >> number && f_reader >> name && f_reader >> sex && f_reader >> bookcnt && f_reader >> books) { Reader p = new Reader; p->number = number; p->sex = sex; p->name = name; p->bookcnt = bookcnt; p->books = books; _rend->set_next(p); p->set_next(NULL); _rend = _rend->get_next(); } while (f_reader >> bookcnt) { Reader p = new Reader; for (int i = 0; i < bookcnt; i++) { f_reader >> booklist[i]; strcpy_s(p->booklist[i], booklist[i]); } _rend->set_next(p); p->set_next(NULL); _rend = _rend->get_next(); } f_reader.close();}void Reader::BrowseBorrowBook(Reader* pp){ int cnt = pp->bookcnt; long long sign; if (cnt == 0) { printf(“\n\n\n\n\n\n\n”); printf(“\t\t\t\t\t\t您还未借阅任何书籍!\n”); } printf(“\n\n\n\n\n\n”);
for (int i = 0; i < cnt; i++)
{
printf("\t第%d次借阅的书籍:", i + 1);
printf("%s\t", pp->get_booklist(pp, i));
cout << "借阅数量:" << pp->get_books() << endl;
}
printf("\n\n请输入0退出:");
while (scanf("%lld", &sign))
{
if (sign == 0)
{
break;
}
else
{
printf("-------------无效的输入!请重新输入!");
}
}
}
void Reader::BorrowBook(Reader pp){ Book bp = bhead->get_next(); Book* _bp = new Book; _bp->show_book(); char bookname[200]; int amount; int flag = 1; int sign = 1; int exist = 0;
cout << "\n\n\n\n";
cout << "请输入要借书的名称(按0退出):";
cin >> bookname;
if (strcmp(bookname, "0") == 0)
{
return;
}
while (bp)
{
if (bp->get_bookname() == bookname)
{
if (bp->get_amount() == 0)
{
cout << "此书无余量!\n";
sign = 0;
}
if (bp->get_flag() == 0)
{
cout << "此书不可借!\n";
flag = 0;
}
if (sign == 1 && flag == 1)
{
cout << "请输入要借阅书籍的数量:";
while (cin >> amount)
{
if (bp->get_amount() < amount)
{
cout << "借阅数量超过此书已有库存!请重新输入:";
}
else
{
int a = pp->get_books() + amount;
pp->set_books(a);
int b = bp->get_amount() - amount;
bp->set_amount(b);
break;
}
}
pp->bookcnt++;
strcpy_s(pp->booklist[pp->bookcnt - 1], bookname);
pp->save();
bp->save();
exist = 1;
break;
}
}
bp = bp->get_next();
}
if (exist == 0 && sign == 1 && flag == 1)
{
cout << "不存在此书!!\n";
}
else if (exist == 1)
{
cout << "图书:" << bookname << "借阅成功!!\n";
}
cout << "页面即将跳转...";
Sleep(1200);
}void Reader::ReturnBook(Reader pp){ Book bp = bhead->get_next(); char bookname[200]; int amount; int exist = 0; int flag = 0; int cnt = pp->bookcnt; if (cnt == 0) { printf(“\n\n\n\n\n\n\n”); printf(“\t\t\t\t\t\t您还未借阅任何书籍!\n”); system(“pause”); return; } printf(“\n\n\n\n\n\n”); for (int i = 0; i < cnt; i++) { cout << “——————-第” << i + 1 << “次借阅的书籍:” << pp->booklist[i] << “\t\t”; cout << “借阅数量:” << pp->books << endl; } cout << “请输入您要退还的书籍(按0退出):”; while (cin >> bookname) { if (strcmp(bookname, “0”) == 0) { return ; } for (int i = 0; i < pp->bookcnt; i++) { if (strcmp(pp->booklist[i], bookname) == 0) { flag = i; exist = 1; break; } } if (!exist) { cout << “未查询到该书!\n”; cout << “请重新输入(按0退出):”; } else { break; } } while (bp) { if (bp->get_bookname() == bookname) { cout << “请输入您要退还书籍的数量:”; while (cin >> amount) { if (pp->books < amount) { cout << “您未持有此数量的书籍!\n”; cout << “请重新输入:”; } else { int a = pp->books - amount; int b = bp->get_amount() + amount; pp->set_books(a); bp->set_amount(b); break; } } } bp = bp->get_next(); } if (pp->books == 0) { for (int i = flag; i < pp->books - 1; i++) { strcpy_s(pp->booklist[i], pp->booklist[i + 1]); } pp->bookcnt—; } pp->save(); bp->save(); cout << bookname << “退还成功!!\n”; cout << “即将返回上一页面…”; Sleep(1100);}void Reader::FindPassword(){ Reader rp = rhead->get_next(); char password[200]; char account[200]; char spassword[200]; int flag = 0; int sign = 0; cout << “请输入您的账户(按0退出):”; while (cin >> account) { if (strcmp(account, “0”) == 0) { return; } while (rp) { if (strcmp(rp->get_account(rp), account) == 0) { flag = 1; break; } rp = rp->get_next(); } if (flag) { break; } else { printf(“此账号不存在!请重新输入(按0退出):”); rp = rhead->get_next(); } } if (flag) { rp = rhead->next; printf(“请输入您设置的密保(按0退出):”); while (cin >> spassword) { if (strcmp(spassword, “0”) == 0) { return; } while (rp) { if (strcmp(rp->get_spassword(rp), spassword) == 0) { sign = 1; break; } rp = rp->get_next(); } if (sign) { printf(“密保输入正确!\n”); printf(“您的密码为%s\n”, rp->get_password(rp)); system(“pause”); return; } else { printf(“——————-密保输入错误!请重新输入(按0退出):”); rp = rhead->get_next(); } } }}void Reader::ChangePassword(){ DBFile fp = new DBFile; Reader p = rhead->get_next(), rp = new Reader; int flag = 0; int sign = 0; char raccount[200]; char rpassword[200]; char rspassword[200]; cout << “请输入您的账户(按0退出):”; while (cin >> raccount) { if (strcmp(raccount, “0”) == 0) { return; } while (p) { if (strcmp(p->account, raccount) == 0) { flag = 1; break; } p = p->get_next(); } if (flag) { break; } else { cout << “此账号不存在!请重新输入(按0退出):”; p = rhead->get_next(); } } if (flag) { p = rhead->get_next(); cout << “请输入您设置的密保(按0退出):”; while (cin >> rspassword) { if (strcmp(rspassword, “0”) == 0) { return; } while (p) { if (strcmp(p->spassword, rspassword) == 0) { sign = 1; break; } p = p->get_next(); } if (sign) { cout << “请输入修改后的密码(按0退出):”; while (cin >> rpassword) { if (strcmp(rpassword, “0”) == 0) { return; } if (strlen(rpassword) <= 16) { break; } else { cout << “请输入长度为1到16位的密码(按0退出):”; } } strcpy_s(p->password, rpassword); cout << “密码修改成功!”; fp->usesave(p); system(“pause”); return; } else { cout << “密保输入错误!!请重新输入(按0退出):”; p = rhead->get_next(); } } }}
// 数据操作类void DBFile::cls(){ system(“cls”);}void DBFile::over(){ DBFile* dbp = new DBFile; dbp->cls(); system(“color 6”); int time = 6; printf(“\n\n\n\n\n\n\n\n\n”); printf(“\t\t\t\t\t\t感谢您的使用!!\n\n\n\n\n”); printf(“ 程序即将关闭…”); while (—time >= 1) { printf(“\r%d”, time); printf(“\b”); Sleep(1000); } dbp->cls(); exit(0);}
void DBFile::login(){ Reader rp = new Reader; Manger mp = new Manger; int sign = 0; while (1) { cls(); Loginmenu(); char choose = _getch(); switch (choose) { case ‘1’: cls(); useLogin(mp); break; case ‘2’: cls(); useLogin(rp); break; case ‘3’: cls(); sign = 1; break; case ‘4’: cls(); over(); break; default: cout << “输入无效!!”; break; } if (sign) { break; } }}void DBFile::useLogin(User base){ base->Login();}void DBFile::regist(){ Reader rp = new Reader; Manger mp = new Manger; int sign = 0; while (1) { cls(); Registmenu(); char choose = _getch(); switch (choose) { case ‘1’: cls(); useRegist(mp); break; case ‘2’: cls(); useRegist(rp); break; case ‘3’: cls(); sign = 1; break; case ‘4’: cls(); over(); break; default: cout << “无效输入!!”; break; } if (sign) { break; } }}void DBFile::usesave(User base){ base->save();}void DBFile::usechangepassword(User* base){ base->ChangePassword();}
void DBFile::useRegist(User* base){ base->Regist();}
void DBFile::usebrowsebook(User* base){ base->BrowseBook();}
void DBFile::usefindpassword(User base){ base->FindPassword();}void DBFile::findpassword(){ printf(“\n\n\n\n\n\n”); printf(“\t\t\t\t\t**\n”); printf(“\t\t\t\t\t \n”); printf(“\t\t\t\t\t 1.管理员找回密码 \n”); printf(“\t\t\t\t\t \n”); printf(“\t\t\t\t\t 2.用户找回密码 \n”); printf(“\t\t\t\t\t \n”); printf(“\t\t\t\t\t 3.返回 \n”); printf(“\t\t\t\t\t \n”); printf(“\t\t\t\t\t**\n”); printf(“请按键选择:”); int choose; int sign = 0; Reader rp = new Reader; Manger* mp = new Manger; scanf(“%d”, &choose); while (1) { cls();
switch (choose)
{
case 1:
cls();
usefindpassword(mp);
sign = 1;
break;
case 2:
cls();
usefindpassword(mp);
sign = 1;
break;
case 3:
sign = 1;
break;
default:
printf("输入无效!");
break;
}
if (sign)
{
break;
}
}
}int DBFile::exist(char account, int flag){ if (flag == 0) { Reader p = rhead->get_next(); while (p != NULL) { if (strcmp(account, p->get_account(p)) == 0) { return 1; } p = p->get_next(); } } else if (flag == 1) { Manger* p = mhead->get_next(); while (p != NULL) { if (strcmp(account, p->get_account(p) ) == 0) { return 1; } p = p->get_next(); } } return 0;}void DBFile::_main(){ while (1) { cls(); _mainmenu(); char choose = _getch(); switch (choose) { case ‘1’: cls(); login(); break; case ‘2’: cls(); regist(); break; case ‘3’: cls(); findpassword(); break; case ‘4’: cls(); over(); break; default: cout << “无效输入!!”; break; } }}
void DBFile::idsort(){ Book f, x, y, p; f = NULL; if (bhead->get_next() == NULL || bhead->get_next()->get_next() == NULL) { return; } while (f != bhead->get_next()->get_next()) { for (p = bhead; p->get_next()->get_next() != f; p = p->get_next()) { if (p->get_next()->get_id() > p->get_next()->get_next()->get_id()) { x = p->get_next(); y = p->get_next()->get_next(); p->set_next(y); x->set_next(y->get_next()); y->set_next(x); } } f = p->get_next(); }}void DBFile::bookamountsort(){ Book f, x, y, p; f = NULL; if (bhead->get_next() == NULL || bhead->get_next()->get_next() == NULL) { return; } while (f != bhead->get_next()->get_next()) { for (p = bhead; p->get_next()->get_next() != f; p = p->get_next()) { if (p->get_next()->get_amount() > p->get_next()->get_next()->get_amount()) { x = p->get_next(); y = p->get_next()->get_next(); p->set_next(y); x->set_next(y->get_next()); y->set_next(x); } } f = p->get_next(); }}void DBFile::showidsort(){ DBFile fp = new DBFile; Book bp = new Book; fp->idsort(); bp->show_book(); system(“pause”);}void DBFile::showbookamountsort(){ DBFile fp = new DBFile; Book bp = new Book; fp->bookamountsort(); bp->show_book(); system(“pause”);}void DBFile::mangerfunction(){ DBFile fp = new DBFile; Manger mp = new Manger; int sign = 0; int choose; while (1) { fp->cls(); mangermenu(); cin >> choose; switch (choose) { case 1: fp->cls(); mp->AddBook(); break; case 2: fp->cls(); mp->DeleteBook(); break; case 3: fp->cls(); mp->ChangeBook(); break; case 4: fp->cls(); mp->BrowseReader(); break; case 5: fp->cls(); mp->BrowseBook(); break; case 6: fp->cls(); fp->usechangepassword(mp); break; case 7: fp->cls(); sign = 1; break; case 8: fp->cls(); fp->over(); break; default: cout << “输入无效!!”; break; } if (sign) { break; } }}void DBFile::readerfunction(Reader pp){ DBFile fp = new DBFile; Reader rp = new Reader; int sign = 0; while (1) { fp->cls(); readermenu(); char choose = _getch(); switch (choose) { case ‘1’: fp->cls(); rp->BorrowBook(pp); break; case ‘2’: fp->cls(); rp->ReturnBook(pp); break; case ‘3’: fp->cls(); fp->usebrowsebook(rp); break; case ‘4’: fp->cls(); rp->BrowseBorrowBook(pp); break; case ‘5’: fp->cls(); fp->usechangepassword(rp); break; case ‘6’: fp->cls(); sign = 1; break; case ‘7’: fp->over(); break; default: cout << “输入无效!!”; break; } if (sign) { break; } }}// 管理员类void Manger::Login(){ int cnt = 4; int flag = 0; int k = 0; int i; char c; DBFile fp = new DBFile; Manger* p = mhead->get_next(); char mpassword[2000]; char maccount[2000]; cout << “\n\n\n\n\n\n\n”; printf(“请输入您的账户(按0退出):”); while (cin >> maccount) { if (strcmp(maccount, “0”) == 0) { return; } if (strlen(maccount) <= 16) { break; } else { cout << “请输入长度为1到16位的账户:”; } }
cout << "请输入您的密码(按0退出):";
for (i = 0; (c = _getch()) != '\r';)
{
if (c == '0')
{
return;
}
if (i <= 15 && isprint(c))
{
mpassword[i] = c;
i++;
k++;
printf("*");
}
if (k > 0 && c > 0 && c == '\b')
{
i--;
k--;
printf("\b");
printf(" ");
printf("\b");
}
}
mpassword[i] = '\0';
printf("\n");
while (p)
{
if (strcmp(p->account, maccount) == 0)
{
flag = 1;
while (strcmp(p->password, mpassword) != 0)
{
cnt--;
if (cnt == 1)
{
fp->cls();
cout << "\n\n\n\n\n\n\n";
cout << "密码输入次数已用完! " << "\n" << "即将退出登录页面...";
Sleep(3000);
fp->cls();
return;
}
cout << "密码错误!您还有"<< cnt - 1 << "次机会\n"<< endl;
cout << "请重新输入(按0退出):";
k = 0;
for (i = 0; (c = _getch()) != '\r';)
{
if (c == '0')
{
return;
}
if (i <= 15 && isprint(c))
{
mpassword[i] = c;
i++;
k++;
printf("*");
}
if (k > 0 && c > 0 && c == '\b')
{
i--;
k--;
printf("\b");
printf(" ");
printf("\b");
}
}
mpassword[i] = '\0';
printf("\n");
}
cout << "管理员"<< maccount << "登陆成功!\n" << "即将跳转至管理员页面..." << endl;
Sleep(2000);
fp->cls();
fp->mangerfunction();
return;
}
p = p->get_next();
}
if (!flag)
{
cout << "不存在此账号!\n请先前往注册!\n" << endl;
cout << "即将跳转至主页面...";
Sleep(2000);
}
}void Manger::Regist(){ DBFile fp = new DBFile; Manger mp = new Manger; char maccount[2000]; char mpassword[2000]; char mspassword[2000]; char mangercode[2000]; cout << “\n\n\n\n\n\n\n”; cout << “请输入管理员验证码:”; cin >> mangercode; int cnt = 2; while (—cnt >= 0) { if (strcmp(mangercode, code) == 0) { cout << “管理员验证成功!!\n” << “即将跳转至注册页面…”; Sleep(1000); fp->cls(); break; } else { cout << “管理员验证失败!!\n” << “您还有” << cnt + 1 << “次机会\n”; cout << “请重新输入:”; cin >> mangercode; } if (cnt == 0) { cout << “输入次数已用完\n” << “即将退出管理员注册系统…”; Sleep(1000); fp->cls(); return; } } Manger* p = new Manger; cout << “\n\n\n\n\n\n\n”; cout << “请输入账户(按0退出):”; while (cin >> maccount) { if (strcmp(maccount, “0”) == 0) { return; } if (strlen(maccount) <= 16 && !fp->exist(maccount, 1)) { break; } else if (fp->exist(maccount, 1)) { cout << “该账户已存在!请重新输入(按0退出):”; } else { cout << “请输入长度为1到16位的账户:”; } } strcpy_s(p->account, maccount); cout << “请输入密码(按0退出):”; while (cin >> mpassword) { if (strcmp(mpassword, “0”) == 0) { return; } if (strlen(mpassword) <= 16) { break; } else { cout << “请输入长度为1到16位的密码(按0退出):”; } } strcpy_s(p->password, mpassword); cout << “请输入您的密保(按0退出):”; while (cin >> mspassword) { if (strcmp(mspassword, “0”) == 0) { return; } if (strlen(mspassword) <= 16) { break; } else { cout << “请输入长度为1到16位的密保(按0退出):”; } } strcpy_s(p->spassword, mspassword); mend->set_next(p); mend = p; mend->set_next(NULL);
mp->save();
fp->cls();
printf("\n\n\n\n\n\n\n");
printf("\t\t\t\t\t*******************************\n");
printf("\t\t\t\t\t** **\n");
printf("\t\t\t\t\t 管理员%s注册成功!! \n", maccount);
printf("\t\t\t\t\t** 即将跳转至主页面... **\n");
printf("\t\t\t\t\t** **\n");
printf("\t\t\t\t\t*******************************\n");
Sleep(1500);
}void Manger::BrowseBook(){ DBFile fp = new DBFile; int sign = 0; while (1) { fp->cls(); browsemenu(); char choose = _getch(); switch (choose) { case ‘1’: fp->cls(); fp->showidsort(); break; case ‘2’: fp->cls(); fp->showbookamountsort(); break; case ‘3’: fp->cls(); sign = 1; break; case ‘4’: fp->cls(); fp->over(); break; default: break; } if (sign) { break; } }}void Manger::save(){ Manger mp = mhead->get_next(); ofstream f_manger(“manger.txt”, ios::out); while (mp) { f_manger << mp->account << “ “ << mp->password << “ “ << mp->spassword << endl; mp = mp->get_next(); } f_manger.close();}void Manger::creat(){ char account[20]; char password[20]; char spassword[20];
ifstream f_manger("manger.txt", ios::in);
while (f_manger >> account && f_manger >> password && f_manger >> spassword)
{
Manger* p = new Manger;
strcpy_s(p->account, account);
strcpy_s(p->password, password);
strcpy_s(p->spassword, password);
mend->set_next(p);
p->set_next(NULL);
mend = mend->get_next();
}
f_manger.close();
}void Manger::AddBook(){ DBFile fp = new DBFile; Book p = bhead->get_next(); int a; int id = 0; int amount; char bookname[2000]; do { fp->cls(); cout << “\n\n\n\n\n”; cout << “请输入要添加书名id(按0退出):”; while (cin >> id) { if (id == 0) { return; } if (id < 0) { cout << “请输入正确格式的id号(按0退出):”; } else { break; } } int flag = 0; while (p) { if (p->get_id() == id) { flag = 1; break; } p = p->get_next(); } if (flag) { cout << “已查出此书,请输入再次增加图书的数量:”; while (cin >> amount) { if (amount <= 199 && amount > 0) { int temp = p->get_amount() + amount; p->set_amount(temp); cout << “图书” << p->get_bookname() << “添加成功!”;
break;
}
else
{
cout << "请输入数量为0-199以内的图书:";
}
}
}
else
{
p = new Book;
p->set_id(id);
cout << "请输入增加图书的数量:";
while (cin >> amount)
{
if (amount <= 199 && amount > 0)
{
p->set_amount(amount);
break;
}
else
{
cout << "请输入数量为0-199范围以内的图书:";
}
}
cout << "请输入是否可借:";
int sign = 0;
while (cin >> sign)
{
if (sign == 1 || sign == 0)
{
p->set_flag(sign);
break;
}
else if (sign < 0 || sign > 1)
{
cout << "请输入正确格式的可借标志(1为可借,0为不可借):";
}
}
char bookname[200];
cout << "请输入书名:";
cin >> bookname;
p->set_bookname(bookname);
char author[200];
cout << "请输作者:";
cin >> author;
p->set_author(author);
char press[200];
cout << "请输入出版社:";
cin >> press;
p->set_press(press);
bend->set_next(p);
bend = p;
bend->set_next(NULL);
}
p->save();
fp->cls();
printf("\n\n\n\n\n\n");
printf("\t\t\t\t\t********************************\n");
printf("\t\t\t\t\t** **\n");
printf("\t\t\t\t\t 图书%d添加成功! \n", bend->get_id());
printf("\t\t\t\t\t** **\n");
printf("\t\t\t\t\t********************************\n");
Sleep(1000);
fp->cls();
cout << "\n\n\n\n\n";
cout << "是否继续添加?\n" << "继续请按1,返回请按0:";
cin >> a;
} while (a == 1);
printf("页面即将跳转...");
Sleep(1000);
}void Manger::ChangeBook(){ DBFile fp = new DBFile; Book p = bhead->get_next(); int id; int amount; int flag = 0; char bookname[200]; char author[200]; char press[200]; int exist = 0; int sign = 0;
Book* bp = bhead->get_next();
bp->show_book();
cout << "请输入要修改书名的id号(按0退出):";
while (cin >> id)
{
if (id == 0)
{
return;
}
while (p)
{
if (p->get_id() == id)
{
exist = 1;
break;
}
p = p->get_next();
}
if (!exist)
{
p = bhead->get_next();
cout << "为查询到该id号!请重新输入(按0退出):";
}
else
{
break;
}
}
if (!exist)
{
return;
}
else
{
int sign = 0;
int choose;
fp->cls();
changebookmenu();
while (1)
{
cout << "请输入您要进行的操作:";
cin >> choose;
switch (choose)
{
case 1:
cout << "请输入修改后的id号:";
cin >> id;
p->set_id(id);
cout << "修改成功!!\n";
break;
case 2:
cout << "请输入要修改后的图书名称:";
cin >> bookname;
p->set_bookname(bookname);
cout << "修改成功!!\n";
break;
case 3:
cout << "请输入要修改后的作者:";
cin >> author;
p->set_author(author);
cout << "修改成功!!\n";
break;
case 4:
cout << "请输入修改后的出版社:";
cin >> press;
p->set_press(press);
cout << "修改成功!!\n";
break;
case 5 :
cout << "请输入修改后的图书数量:";
while (cin >> amount)
{
if (amount <= 199 && amount > 0)
{
p->set_amount(amount);
break;
}
else
{
cout << "请输入0-199以内的图书数量:";
}
}
cout << "修改成功!!\n";
break;
case 6 :
if (p->get_flag() == 1)
{
cout << "是否将此书修改为不可借?(1确认,2返回):";
while (cin >> flag)
{
if (flag == 2)
{
break;
}
if (flag == 1)
{
p->set_flag(1);
p->save();
cout << "修改成功!!\n";
break;
}
else
{
cout << "请输入正确格式的借书标志!(1确认,2返回):";
}
}
}
else if (p->get_flag() == 0)
{
cout << "是否将此书修改为可借?(1确认,2返回):";
while (cin >> flag)
{
if (flag == 2)
{
break;
}
if (flag == 1)
{
p->set_flag(0);
p->save();
cout << "修改成功!!\n";
break;
}
else
{
cout << "请输入正确格式的借书标志!(1确认,2返回):";
}
}
}
break;
case 7:
sign = 1;
break;
default :
cout << "输入无效!!";
cin.clear();
break;
}
if (sign)
{
break;
}
}
}
}void Manger::DeleteBook(){ Book bp = bhead->get_next(); char bookname[20]; int flag = 0; bp->show_book(); cout << “请输入您要删除图书的名称(按0退出):”; while (cin >> bookname) { if (strcmp(bookname, “0”) == 0) { return; } while (bp) { if (bp->get_bookname() == bookname) { flag = 1; break; } bp = bp->get_next(); } if (flag == 0) { cout << “未查询到此书!\n” << “请重新输入(按0退出):”; bp = bhead->get_next(); } else { break; } } DeleteReaderBook(bookname); bp = bhead->get_next(); Book pp = bhead; while (bp) {// bp->next 可能是链表的最后一个 if (bp->get_bookname() == bookname) { if (bp->get_next() == NULL) { bhead->set_next(NULL); } else { pp->set_next(bp->get_next()); } } pp = pp->get_next(); bp = bp->get_next(); }
cout << "\n\n\n\n\n\n";
cout << "图书" << bookname << "删除成功!!\n";
cout << "页面即将跳转..";
Sleep(1500);
Book* p = new Book;
p->save();
}void Manger::DeleteReaderBook(char bookname){ Reader rp = rhead->get_next(); Reader* pp = new Reader; int flag = 0;
while (rp)
{
flag = 1;
for (int i = 0; i < rp->get_bookcnt(); i++)
{
if (strcmp(rp->get_booklist(rp, i), bookname) == 0)
{
flag = i;
break;
}
}
if (flag != 1)
{
for (int j = flag; j < rp->get_bookcnt() - 1; j++)
{
strcpy(rp->get_booklist(rp, j), rp->get_booklist(rp, j + 1));
}
int temp = rp->get_bookcnt();
temp--;
rp->set_bookcnt(temp);
}
rp = rp->get_next();
}
pp->save();
}void Manger::BrowseReader(){
cout << "账户\t\t" << "密码\t\t" << "密保\t\t" << "性别\t\t" << "姓名\t\t"
<< "学号\t\t" << "借书次数\n";
Reader* rp = rhead->get_next();
while (rp)
{
cout << rp->get_account(rp) << "\t\t" << rp->get_password(rp) << "\t\t" << rp->get_spassword(rp) << "\t\t"
<< rp->get_sex() << "\t\t" << rp->get_name() << "\t\t" << rp->get_number() << "\t\t" << rp->get_bookcnt() << endl;
rp = rp->get_next();
}
system("pause");
}void Manger::FindPassword(){ Manger mp = mhead->get_next(); char password[200]; char account[200]; char spassword[200]; int flag = 0; int sign = 0; cout << “请输入您的账户(按0退出):”; while (cin >> account) { if (strcmp(account, “0”) == 0) { return; } while (mp) { if (strcmp(mp->get_account(mp), account) == 0) { flag = 1; break; } mp = mp->get_next(); } if (flag) { break; } else { printf(“此账号不存在!请重新输入(按0退出):”); mp = mhead->get_next(); } } if (flag) { mp = mhead->get_next(); printf(“请输入您设置的密保(按0退出):”); while (cin >> spassword) { if (strcmp(spassword, “0”) == 0) { return; } while (mp) { if (strcmp(mp->get_spassword(mp), spassword) == 0) { sign = 1; break; } mp = mp->get_next(); } if (sign) { printf(“密保输入正确!\n”); printf(“您的密码为%s\n”, mp->get_password(mp)); system(“pause”); return; } else { printf(“——————-密保输入错误!请重新输入(按0退出):”); mp = mhead->get_next(); } } }}void Manger::ChangePassword(){ DBFile fp = new DBFile; Manger p = mhead->get_next(), mp = new Manger; int flag = 0; int sign = 0; char maccount[200]; char mpassword[200]; char mspassword[200]; cout << “请输入您的账户(按0退出):”; while (cin >> maccount) { if (strcmp(maccount, “0”) == 0) { return; } while (p) { if (strcmp(p->account, maccount) == 0) { flag = 1; break; } p = p->get_next(); } if (flag) { break; } else { cout << “此账号不存在!请重新输入(按0退出):”; p = mhead->get_next(); } } if (flag) { p = mhead->get_next(); cout << “请输入您设置的密保(按0退出):”; while (cin >> mspassword) { if (strcmp(mspassword, “0”) == 0) { return; } while (p) { if (strcmp(p->spassword, mspassword) == 0) { sign = 1; break; } p = p->get_next(); } if (sign) { cout << “请输入修改后的密码(按0退出):”; while (cin >> mpassword) { if (strcmp(mpassword, “0”) == 0) { return; } if (strlen(mpassword) <= 16) { break; } else { cout << “请输入长度为1到16位的密码(按0退出):”; } } strcpy_s(p->password, mpassword); cout << “密码修改成功!”; fp->usesave(p); system(“pause”); return; } else { cout << “密保输入错误!!请重新输入(按0退出):”; p = mhead->get_next(); } } }}
// 图书类void Book::creat()
{ ifstream f_book(“book.txt”, ios::in); int id; int amount; int flag; string bookname; string author; string press; while (f_book >> id && f_book >> flag && f_book >> amount && f_book >> bookname && f_book >> author && f_book >> press) { Book* p = new Book; p->id = id; p->flag = flag; p->amount = amount; p->bookname = bookname; p->author = author; p->press = press;
bend->set_next(p);
p->set_next(NULL);
bend = bend->get_next();
}
f_book.close();
}
void Book::save(){ Book* bp = bhead->get_next(); ofstream f_book(“book.txt”, ios::out); while (bp) { f_book << bp->id << “ “ << bp->flag << “ “ << bp->amount << “ “ << bp->bookname << “ “ << bp->author << “ “ << bp->press << endl; bp = bp->get_next(); } f_book.close();}
void Book::show_book(){ Book* bp = bhead->get_next(); cout << “id号\t\t” << “是否可借\t\t” << “数量\t\t” << “书名\t\t” << “作者\t\t” << “出版社\n”; while (bp) { cout << bp->get_id() << “\t\t” << bp->get_flag() << “\t\t\t” << bp->get_amount() << “\t\t” << bp->get_bookname() << “\t\t” << bp->get_author() << “\t\t” << bp->get_press() << “\n”; bp = bp->get_next(); }}int main(){ mhead = new Manger; mend = new Manger; mhead->set_next(NULL); mend = mhead;
rhead = new Reader; _rend = new Reader; rhead->set_next(NULL); _rend = rhead;
bhead = new Book; bend = new Book; bhead->set_next(NULL); bend = bhead;
Reader* rp = new Reader; rp->creat();
Manger* mp = new Manger; mp->creat();
Book* bp = new Book; bp->creat();
DBFile* dbp = new DBFile;
system("color B");
dbp->_main();
delete dbp;
return 0;
}`
相关推荐
© 2020 asciim码
人生就是一场修行