欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

基于C++三大特性的图书管理系统【C++面向对象程序设计】

时间:2023-06-05
文章目录

前言一、简单回顾C++三大特性

1.封装2.继承3.多态 二、实现一个登录器将输入的密码隐层起来

1.前置知识

① getch() 无回显键入② b 退格 2.效果展示

① 密码加密② 登录成功③ 登录失败 3.实现方法 三、程序运行截图

1.主题设置2.主菜单3.用户操作界面4.管理员操作界面5.登录注册界面6.查阅图书 四、项目中包含的类及其作用

1.信息节点类2.链表基类3.用户链表类4.管理员链表类5.图书节点类6.图书链表类7.用户借记节点类8.用户借记链表类9.多态的实现10.其余全局增删改查函数 五、源代码及项目及项目结构

项目结构源代码 总结

关注冲哥不迷路!


前言

在步入大学的时候学的第一门面向对象的语言就是C++,一度被他的语法与设计模式所吸引,本篇博客将介绍一下博主在学习完C++基础语法的时候写的小项目,基于C++三大特性的图书管理系统,这次的小练习会对类的属性进行封装,使用继承与多态完成一个登录器登录不同的角色。


一、简单回顾C++三大特性 1.封装

在C++中类的封装完成的一个任务就是实现类的私有属性能够在外界访问在介绍C++基础语法的时候提到使用get方法获取私有属性,使用set方法对私有属性进行赋值。所以今天项目中依旧使用这种方法。

2.继承

本项目原理上不需要使用继承,但是为了实现多态,就使用上了继承.继承有助于我们对类进行扩展,更是实现多态的一个必要条件。

3.多态

顾名思义,就是一段代码实现不同的展示效果,通过基类的指针指向子类的对象调用被重写的重名函数,实现多种表现。

二、实现一个登录器将输入的密码隐层起来 1.前置知识 ① getch() 无回显键入

实现登录器首先要将输入的数据隐藏起来,然后再考虑使用*替换getch这个函数是一个不回显函数,当用户按下某个字符时,函数自动读取,无需按回车,有的C语言命令行程序会用到此函数做游戏但是这个函数并非标准函数,要注意移植性!

② b 退格

是ASCII表中的一个转义字符代表回退一格我们使用 b空格b 达到将想要删除的字符进行覆盖解释一下 b空格 覆盖的是原来的一个字符后面那个b是将新键入的 backspace 字符覆盖掉

2.效果展示 ① 密码加密 ② 登录成功 ③ 登录失败 3.实现方法

注意点都在代码的注释中

代码如下:

# includeusing namespace std;# includeint main() {char passward[20];int i = 0, j, k;char ch = '0';cout << "请输入您的密码:";j = 0; k = 1;i = 0;memset(passward, '', sizeof(passward));while (1) {ch = _getch();//最后输入回车没有将回车存入密码中,而是将他给吃掉了;if (ch == 13) {//13在ASCII表中代表回车break;}else {if (ch != 8) {//代表键入删除键if (i < 19) {//如果输入次数大于19就不再将从键盘读取的字符存进数组;passward[i] = ch;}cout << "*";}else {//其余任何键都将以*的形式打印if (i == 0) {//如果没有键入就删除是不行的,需要加以限定让i回到0;ch = '';i--;}else {cout << "b b";passward[i - 1] = '';ch = '';i = i - 2;}}}i++;}cout << endl;cout << "passward is : 123123" <

三、程序运行截图 1.主题设置 2.主菜单 3.用户操作界面 4.管理员操作界面 5.登录注册界面

用户与管理员公用,实现多态

6.查阅图书

这里图书的主键是书名与作者,只有书名与作者相同时才会触发查重机制查重机制会在新增图书时触发自动合并。


四、项目中包含的类及其作用

这里只讲函数的声明,具体的实现在源代码中

1.信息节点类

博主当时为了偷懒管理员与用户信息设置的是一个类作为节点,大家可以多实现几个类添加几个不同的属性,节点类主要包含节点类与属性类,用于存储信息,组成链表。

class UaAdate {//------------------用户与管理员的资料-----------------------------private:string id;string passward;string secproblem;string secanswer;UaAdate* next;public:UaAdate() {}UaAdate(string ID, string Passward, string Secproblem, string Secanswer) {id = ID;passward = Passward;secproblem = Secproblem;secanswer = Secanswer;}void setpassward(string passward) {//--------------------------------------------设置密码this->passward = passward;}void setnext(string id, string passward, string secproblem, string secanswer) {//设置下一节点next= new UaAdate(id,passward,secproblem,secanswer);next->next = NULL;}string getid() {//-----------------------------------------------------------------获取idreturn this->id;}string getpassward() {//-----------------------------------------------------------获取密码return this->passward;}string getsecproblem() {//--------------------------------------------------------获取密保问题return this->secproblem;}string getsecanswer() {//---------------------------------------------------------获取密保答案return this->secanswer;}UaAdate*& getnext() {//------------------------------------------------------------节点的指针域return next;}};

2.链表基类

链表基类的作用就是实现基类的指针指向子类的对象,实现多态主要的功能是对链表的增删改查。

class baselink {//----------------------节点功能类-----------------------public:virtual void addnode(string id, string passward, string secproblem, string secanswer)=0;virtual UaAdate* looklink(string id) = 0;virtual void savelink() = 0;virtual void printlink() = 0;virtual void delnode(string id) = 0;};

3.用户链表类

这里的用户类头结点使用的UaAdate,大家可以多实现几个数据类型,将用户数据类型设置的与管理员类型不一样。主要对链表基类中的接口进行实现

class Userlink :public baselink{//-----------------用户继承----------------------------private:UaAdate* Userhead;public://---------------------------------------------------从用户文件中获取信息Userlink() {}//------------------------------------------查找函数(给id查节点)UaAdate* looklink(string id) {}//---------------------------------------------删除某一节点void delnode(string id) {}//在末尾加上一个新的节点void addnode(string id, string passward, string secproblem, string secanswer) {}void printlink() {//----------------------------------------打印链表};

4.管理员链表类

与用户链表类很相似

class Admlink :public baselink {private:UaAdate* Admhead;public://------------------------------------------从文件中获取管理员信息Admlink() {}UaAdate* looklink(string id) {//查找函数}void savelink() {}void printlink() {}void addnode(string id, string passward, string secproblem, string secanswer) {}//---------------------------------------------删除某一节点}void delnode(string id) {};

5.图书节点类

对图书信息进行封装,用于组成链表中的节点

class bookdate {//--------------------------------------------------书类private:string name;string writer;int sum;string bookclass;bookdate* next;public:bookdate() {}bookdate(string name,string writer,int sum,string bookclass){this->name = name;this->writer = writer;this->sum = sum;this->bookclass = bookclass;}void setnext(string name,string writer,int sum,string bookclass) {this->next = new bookdate(name,writer,sum,bookclass);this->next->next = NULL;}void setsum(int sum) {this->sum = sum;}void setbookclass(string bookclass) {this->bookclass = bookclass;}bookdate*& getnext() {return next;}string getname() {return name;}string getwriter() {return writer;}int getsum() {return sum;}string getbookclass() {return bookclass;}};

6.图书链表类

对图书的增删改查

class booklink {//-----------------------------------------------书库存书的功能类private:bookdate* head;public:booklink() {//------------------------------------------初始化私有成员}bookdate*& gethead() {return head;}bookdate* looklink(string name, string writer) {//--------------查重---------}void savelink() {//--------------------------------------------------将新链表储存一下}void creatnode(string name,string writer,int sum,string bookclass) {//----------增书}void selectbook(string name,string writer) {//--------------------------查书}void rebuildbook(string name,string writer,int sum,string bookclass) {//-改书}void printlink() {//-----------------------------------------------打印链表}};

7.用户借记节点类

用户借书的时候,记录一下借阅的图书的数量,借书人的基本信息并对类中的信息进行封装,作为借记功能类的节点使用

class userbook {//------------------------------------------------用户借书登记信息private:string bookname;string bookwriter;int sum;string name;string phone;userbook* next;public:userbook() {next = NULL;}userbook(string bookname, string bookwriter, int sum, string name, string phone) {this->bookname = bookname;this->bookwriter = bookwriter;this->sum = sum;this->name=name;this->phone = phone;this->next = NULL;}void setnext(string bookname,string bookwriter,int sum,string name,string phone) {this->next = new userbook(bookname,bookwriter, sum, name, phone);}void setsum(int sum) {this->sum = sum;}userbook*& getnext() {return next;}string getbookname() {return bookname;}string getbookwriter() {return bookwriter;}int getbooksum() {return sum;}string getusername() {return name;}string getuserphone() {return phone;}};

8.用户借记链表类

用户借书的信息进行记录

class userbooklink {//-----------------------------------------------用户借书登记功能类private:userbook* head;public:userbooklink() {//-------------------------------------------------构造函数将文件里面的东西读出来}userbook* looklink(string bookname,string bookwriter,string name) {//有就返回,没有就返回空}void addonenode(string bookname, string bookwriter, int sum, string name, string phone) {}void savelink() {//--------------------------------存链表}void changesum(string bookname,string bookwriter,int sum,string name) {//修改书的数量};

9.多态的实现

这里实现多态主要在登录器处进行了实现,使用的一个登录器可以进行两种身份的登入。

int main() {baselink* p;Userlink U1;Admlink A1;booklink b;p = &A1;char n;bool k;mainHere:system("cls");mainMenu();n = Shield_4();if (n == '1' || n == '2') {if (n == '1') {p = &U1;}else if (n == '2') {p = &A1;string Admpassward;system("cls");cout << "请输入管理员密匙:";cin >> Admpassward;if (Admpassward != "芝麻开门") {cout << "密匙不匹配,您应该不是管理员";system("pause");goto mainHere;}}k=thisMenu(p);//登录菜单if (k == false) {goto mainHere;}else {if (p == &A1) {k=Admmeun();}else if (p == &U1) {k=Usermeun();}}if (k == false) {goto mainHere;}}else if (n == '3') {setColor();goto mainHere;}else if (n == '4') {exit(0);}return 0;}

10.其余全局增删改查函数

其余的全局增删改查函数均是定义以上类的对象然后根据需求,书写一些提示性语句,实现一定的用户体验。

五、源代码及项目及项目结构 项目结构

这里有4个文件,作用体现在了文件名上。


程序模式图

源代码

#include#include#include#include#includeusing namespace std;class baselink;bool regkey(baselink* p);//注册bool landkey(baselink* p, char n);//登录,修改密码,注销账户;bool lookpassward(baselink* p);//找回密码class UaAdate {//------------------用户与管理员的资料-----------------------------private:string id;string passward;string secproblem;string secanswer;UaAdate* next;public:UaAdate() {}UaAdate(string ID, string Passward, string Secproblem, string Secanswer) {id = ID;passward = Passward;secproblem = Secproblem;secanswer = Secanswer;}void setpassward(string passward) {//--------------------------------------------设置密码this->passward = passward;}void setnext(string id, string passward, string secproblem, string secanswer) {//设置下一节点next= new UaAdate(id,passward,secproblem,secanswer);next->next = NULL;}string getid() {//-----------------------------------------------------------------获取idreturn this->id;}string getpassward() {//-----------------------------------------------------------获取密码return this->passward;}string getsecproblem() {//--------------------------------------------------------获取密保问题return this->secproblem;}string getsecanswer() {//---------------------------------------------------------获取密保答案return this->secanswer;}UaAdate*& getnext() {//------------------------------------------------------------节点的指针域return next;}};class baselink {//----------------------节点功能类-----------------------public:virtual void addnode(string id, string passward, string secproblem, string secanswer)=0;virtual UaAdate* looklink(string id) = 0;virtual void savelink() = 0;virtual void printlink() = 0;virtual void delnode(string id) = 0;};class Userlink :public baselink{//-----------------用户继承----------------------------private:UaAdate* Userhead;public:Userlink() {//---------------------------------------------------从用户文件中获取信息Userhead = new UaAdate;ifstream infile;string id;string passward;string secproblem;string secanswer;UaAdate* p=Userhead,*q=NULL;//头节点不存东西infile.open("用户信息");while (infile >> id >> passward >> secproblem >> secanswer) {p->setnext(id, passward, secproblem, secanswer);p = p->getnext();}infile.close();}UaAdate* looklink(string id) {//------------------------------------------查找函数(给id查节点)int k = 1;UaAdate* p = Userhead;while (p->getnext() != NULL) {p = p->getnext();if (id == p->getid()) {k = 0;break;}}if (k == 0) {return p;}else {return NULL;}}void delnode(string id) {//---------------------------------------------删除某一节点UaAdate* p,*q=NULL,*t=NULL,*r=NULL;p = Userhead;while (p->getnext() != NULL) {p = p->getnext();cout << p->getid()<getnext()->getid()==id) {if (p->getnext()->getnext() == NULL) {q = p->getnext();p->getnext() = NULL;delete q;}else {p->getnext() = p->getnext()->getnext();break;}}}}void addnode(string id, string passward, string secproblem, string secanswer) {//在末尾加上一个新的节点UaAdate* p;p = Userhead;while (p->getnext() != NULL) {p = p->getnext();}p->setnext(id, passward, secproblem, secanswer);}void savelink() {//----------------------------------------将新链表储存一下ofstream outfile;outfile.open("用户信息");UaAdate* p;p = Userhead;while (p->getnext() != NULL) {p = p->getnext();outfile << p->getid() << " "<getpassward()<<" "<getsecproblem()<<" "<getsecanswer()<getnext() != NULL) {p = p->getnext();cout << p->getid() << " " << p->getpassward() << " " << p->getsecproblem() << " " << p->getsecanswer() << endl;}}};class Admlink :public baselink {//-----------------管理员继承----------------------------private:UaAdate* Admhead;public:Admlink() {//------------------------------------------从文件中获取管理员信息Admhead = new UaAdate;ifstream infile;string id;string passward;string secproblem;string secanswer;UaAdate* p = Admhead;//头节点不存东西infile.open("管理员信息");while (infile >> id >> passward >> secproblem >> secanswer) {p->setnext(id, passward, secproblem, secanswer);p = p->getnext();}}UaAdate* looklink(string id) {//查找函数int k = 1;UaAdate* p = Admhead->getnext();while (p->getnext() != NULL) {p = p->getnext();if (id == p->getid()) {k = 0;break;}}if (k == 0) {return p;}else {return NULL;}}void savelink() {ofstream outfile;outfile.open("管理员信息");UaAdate* p;p = Admhead;while (p->getnext() != NULL) {p = p->getnext();outfile << p->getid() << " " << p->getpassward() << " " << p->getsecproblem() << " " << p->getsecanswer() << endl;}outfile.close();}void printlink() {UaAdate* p;p = Admhead;while (p->getnext() != NULL) {p = p->getnext();cout << p->getid() << " " << p->getpassward() << " " << p->getsecproblem() << " " << p->getsecanswer() << endl;}}void addnode(string id, string passward, string secproblem, string secanswer) {UaAdate* p;p = Admhead;while (p->getnext() != NULL) {p = p->getnext();}p->setnext(id, passward, secproblem, secanswer);}void delnode(string id) {//---------------------------------------------删除某一节点UaAdate* p, * q = NULL;p =Admhead;while (p->getnext() != NULL) {p = p->getnext();cout << p->getid() << endl;if (p->getnext()->getid() == id) {if (p->getnext()->getnext() == NULL) {q = p->getnext();p->getnext() = NULL;delete q;}else {p->getnext() = p->getnext()->getnext();break;}}}}};class bookdate {//--------------------------------------------------书类private:string name;string writer;int sum;string bookclass;bookdate* next;public:bookdate() {}bookdate(string name,string writer,int sum,string bookclass){this->name = name;this->writer = writer;this->sum = sum;this->bookclass = bookclass;}void setnext(string name,string writer,int sum,string bookclass) {this->next = new bookdate(name,writer,sum,bookclass);this->next->next = NULL;}void setsum(int sum) {this->sum = sum;}void setbookclass(string bookclass) {this->bookclass = bookclass;}bookdate*& getnext() {return next;}string getname() {return name;}string getwriter() {return writer;}int getsum() {return sum;}string getbookclass() {return bookclass;}};class booklink {//-----------------------------------------------书库存书的功能类private:bookdate* head;public:booklink() {//------------------------------------------初始化私有成员head = new bookdate;head->getnext() = NULL;string name;string writer;int sum;string bookclass;ifstream infile;bookdate* p;;p = head;infile.open("图书信息");while (infile >> name >> writer >> sum >> bookclass) {p->setnext(name, writer, sum, bookclass);p = p->getnext();p->getnext() = NULL;}}bookdate*& gethead() {return head;}bookdate* looklink(string name, string writer) {//--------------查重---------bookdate* p;int k = 0;p = head;while (p->getnext() != NULL) {p = p->getnext();if (p->getname() == name && p->getwriter() == writer) {k = 1;return p;break;}}if (k == 0) {return NULL;}}void savelink() {//--------------------------------------------------将新链表储存一下bookdate* p;p = head;ofstream outfile;outfile.open("图书信息");while (p->getnext()!=NULL) {p = p->getnext();outfile << p->getname() << " " << p->getwriter() << " " << p->getsum() << " " << p->getbookclass() << endl;}outfile.close();}void creatnode(string name,string writer,int sum,string bookclass) {//----------增书bookdate* p;int k = 0;ifstream infile;p = head;while (p->getnext() != NULL) {p = p->getnext();if (p->getname() == name && p->getwriter() == writer) {p->setsum(sum + p->getsum());//书库中原来就有的话就将原来数量与现在的相加k = 1;break;}}if (k == 0) {//书库中没有的话就加在链表末尾p->setnext(name, writer, sum, bookclass);savelink();}else {savelink();}}void delonenode(string name,string writer) {//----------------------删除某一本书bookdate* p,*q=NULL;//记得测试尾节点p = head;while (p->getnext() != NULL) {if (p->getnext()->getname() == name && p->getnext()->getwriter() == writer) {if (p->getnext()->getnext() == NULL) {q = p->getnext();p->getnext() = NULL;delete q;break;}else {q = p->getnext();p->getnext() = p->getnext()->getnext();delete q;break;}}p = p->getnext();}savelink();}void selectbook(string name,string writer) {//--------------------------查书bookdate* p;p = head;while (p->getnext() != NULL) {p = p->getnext();if (p->getname() == name && p->getwriter() == writer) {cout << "您找的图书信息如下:" << endl;cout << "书名" << "t" << "作者" << "t" << "数量" << "t" << "类别" << endl;cout << p->getname() << "t" << p->getwriter() << "t" << p->getsum() << "t" << p->getbookclass();break;}}}void rebuildbook(string name,string writer,int sum,string bookclass) {//-改书bookdate* p;p = head;while (p->getnext() != NULL) {p = p->getnext();if (p->getname() == name && p->getwriter() == writer) {p->setsum(sum);p->setbookclass(bookclass);break;}}savelink();}void printlink() {//-----------------------------------------------打印链表bookdate* p;p = head;while (p->getnext() != NULL) {p = p->getnext();cout << p->getname() << " " << p->getwriter() <<" "<getsum()<<" "<getbookclass()<< endl;}}};class userbook {//------------------------------------------------用户借书登记信息private:string bookname;string bookwriter;int sum;string name;string phone;userbook* next;public:userbook() {next = NULL;}userbook(string bookname, string bookwriter, int sum, string name, string phone) {this->bookname = bookname;this->bookwriter = bookwriter;this->sum = sum;this->name=name;this->phone = phone;this->next = NULL;}void setnext(string bookname,string bookwriter,int sum,string name,string phone) {this->next = new userbook(bookname,bookwriter, sum, name, phone);}void setsum(int sum) {this->sum = sum;}userbook*& getnext() {return next;}string getbookname() {return bookname;}string getbookwriter() {return bookwriter;}int getbooksum() {return sum;}string getusername() {return name;}string getuserphone() {return phone;}};class userbooklink {//-----------------------------------------------用户借书登记功能类private:userbook* head;public:userbooklink() {//-------------------------------------------------构造函数将文件里面的东西读出来string bookname;string bookwriter;int sum=0;string name;string phone;head = new userbook;userbook* p=head;ifstream infile;infile.open("用户借书信息");while (infile >> bookname >> bookwriter >> sum >> name >> phone) {p->setnext(bookname, bookwriter, sum, name, phone);p = p->getnext();}infile.close();}userbook* looklink(string bookname,string bookwriter,string name) {//有就返回,没有就返回空userbook* p = head;int k = 0; //可以用来查重while (p->getnext() != NULL) {p = p->getnext();if (p->getbookname() == bookname && p->getbookwriter() == bookwriter && p->getusername() == name) {k = 1;return p;}}if (k == 0) {return NULL;}}void addonenode(string bookname, string bookwriter, int sum, string name, string phone) {userbook* p = head;while (p->getnext() != NULL) {p = p->getnext();}p->setnext(bookname, bookwriter, sum, name, phone);savelink();}void savelink() {//--------------------------------存链表userbook* p;p = head;ofstream outfile;outfile.open("用户借书信息");while (p->getnext() != NULL) {p = p->getnext();outfile << p->getbookname() << " " << p->getbookwriter() << " " << p->getbooksum() << " " << p->getusername() <<" "<getuserphone()<< endl;}outfile.close();}void changesum(string bookname,string bookwriter,int sum,string name) {//修改书的数量userbook* p = head;while (p->getnext() != NULL) {p = p->getnext();if (p->getbookname() == bookname && p->getbookwriter() == bookwriter && p->getusername() == name) {p->setsum(sum);break;}}savelink();}};//-------------------------------------全局函数区----------------------------------//用户与管理员bool landkey(baselink* p, char n) {//登录,修改密码,注销账户,均需要输入密码,所以公用登陆器函数,以n的不同加以区分;UaAdate * f = NULL;//用户与管理员的登陆器//1登录 4改密码 5注销string id;char passward[20];string secproblem;string secanswer;int i = 0, j, k;char ch = '0';cout << "请输入您的ID:";j = 0;k = 1;IDD:Here1:id = "";cin >> id;if (id.length() > 10) {if (j > 2) {system("cls");cout << "您多次操作失误,将要返回主菜单";return false;}cout << "您输入的ID不合规范,请重新输入:";j++;goto Here1;}f = p->looklink(id);if (f == NULL) {cout << "您输入的id不存在,请重新输入:";if (k == 4) {system("cls");cout << "您多次操作失误,将要返回主菜单";return false;}k++;goto IDD;}cout << "请输入您的密码:";j = 0;k = 1;PassWard:Here2:i = 0;memset(passward, '', sizeof(passward));while (1) {ch = _getch();//最后输入回车没有将回车存入密码中,而是将他给吃掉了;if (ch == 13) {break;}else {if (ch != 8) {if (i < 19) {//如果输入次数大于19就不再将从键盘读取的字符存进数组;passward[i] = ch;}cout << "*";}else {if (i == 0) {ch = '';i--;}else {cout << "b b";passward[i - 1] = '';ch = '';i = i - 2;}}}i++;}cout << endl;if (strlen(passward)> 19) {//当检测到密码有19个长度时就清理密码串,重新输入;cout << "您的密码不合规范,请重新输入:";//当小于等于18个长度时将跳过这个步骤;j++;if (j > 2) {system("cls");cout << "您多次操作失误,将要返回主菜单";return false;//密码输入不合规范三次}goto Here2;}if (passward!=f->getpassward()) {cout << "密码错误,请重新输入:";if (k == 4) {system("cls");cout << "您多次密码输入错误,将要返回主菜单" << endl;system("pause");return false;}k++;goto PassWard;}else {if (n == '1') {system("cls");cout << "登录成功!" << endl;system("date/t");system("time/t");return true;}else if (n == '4') {cout << "为了您的账户安全,请输入您的密保!" << endl;cout << "您的密保问题是:" << f->getsecproblem() << endl;cin >> secanswer;if (secanswer == f->getsecanswer()) {cout << "请输入您新的密码:";string newpassward;cin >> newpassward;f->setpassward(newpassward);p->savelink();system("cls");cout << "密码修改成功!";return true;}else {system("cls");cout << "您的证据不充分,修改失败!";return false;}}else if (n == '5') {cout << "您的密保问题是:" << f->getsecproblem() << endl;cout << "请输入您的密保答案:";cin >> secanswer;if (secanswer == f->getsecanswer()) {char t;cout << "您确定要将账号注销吗?" << endl << "1.确认 2.我再犹豫一下" << endl << "please you chose";while (1) { t = _getch();if (t == '1' || t == '2')break; }if (t == '1') {p->delnode(id);p->savelink();system("cls");cout << endl << "注销账号成功!";return true;}else if (t == '2') {system("cls");cout << endl << "您放弃了注销账号想要返回主菜单";return false;}}else {cout << "您的密保输入错误,注销账户失败!";return false;}}}}//注册账号bool regkey(baselink* p) {//用户与管理员的注册器UaAdate* f = NULL;string id;string passward;string secproblem;string secanswer;int j = 0, k = 1;cout << "请您输入您的ID这将这将作为您登陆的账号:";IDD:Here1:cin >> id;if (id.length() > 10) {cout << "您输入的ID不合规范,请重新输入:";if (j == 3) {cout << endl << "您多次操作失误,即将返回上一层" << endl;system("pause");return false;}j++;goto Here1;}else {f = p->looklink(id);if (f != NULL) {cout << "此id已存在,请重新输入!";if (k == 3) {cout << endl << "您多次操作失误,即将返回上一层" << endl;system("pause");return false;}k++;goto IDD;}}cout << "请输入您的密码:";Here2:cin >> passward;if (passward.length() > 18) {cout << "您输入的密码不合规范,请重新输入:";goto Here2;}cout << "设置您的密保(这将是您找回密码的重要依据):";cin >> secproblem;cout << "请输入您密保的答案:";cin >> secanswer;p->addnode(id, passward, secproblem, secanswer);//注册;p->savelink();cout << "注册成功!";return true;}//找回密码bool lookpassward(baselink* p) {//找回密码,不需要输入密码UaAdate * f = NULL;string id;string passward;;string secproblem;string secanswer;int i = 0, j, k;char ch = '0';cout << "请输入您的ID:";j = 0;k = 1;IDD:Here1:id = "";cin >> id;if (id.length() > 10) {if (j > 2) {cout << endl << "您多次操作失误,即将返回上一层" << endl;system("pause");return false;}cout << "您输入的ID不合规范,请重新输入:";j++;goto Here1;}f = p->looklink(id);if (f == NULL) {cout << "您输入的id不存在,请重新输入:";if (k == 4) {cout << endl << "您多次操作失误,即将返回上一层" << endl;system("pause");return false;}k++;goto IDD;}cout << "您的密保问题是:" << f->getsecproblem() << endl;;cout << "请输入您密保问题的答案:";cin >> secanswer;if (secanswer == f->getsecanswer()) {cout << "您的证据充分,您的账户信息如下:" << endl << "ID:" << f->getid() << endl << "密码:" << f->getpassward();return true;}else {cout << "您提供的证据不充分,密码找回失败";return false;}}//对书进行操作的函数void addbook() {booklink B;string name;string writer;string bookclass;int sum,i=0;cout << "请输入图书的名称:";cin >> name;cout << "请输入图书作者:";cin >> writer;cout << "请输入您要存的本数:";while (i < 3) {cin >> sum;if (sum <= 0){cout << "您输入的数量不合法请重新输入:";sum = 0;i++;if (i == 2) {cout << "您多次输入不合法,即将返回上一层" << endl;system("pause");return;}}else break;}i = 0;cout << "请输入您要存的书的种类(科学,文学,青春,爱情,恐怖):"<> bookclass;if (bookclass == "科学" || bookclass == "文学" || bookclass == "青春" || bookclass == "爱情" || bookclass == "恐怖") {break;}else {cout << "您输入的种类不合法请重新输入:";i++;if (i == 2) {cout << "您多次输入错误,即将返回上一层" << endl;system("pause");return;}}}cout << "您确定要将此图书存入书库吗?" << endl;cout << "1.确认无误 2.我不想存了" << endl;cout << "please your choose:";char n='0';while (1) {n = _getch();if (n == '1' || n == '2') {break;}}if (n == '1') {B.creatnode( name,writer,sum,bookclass);}else {return;}}void delbook() {//-----------------------删除某一本书booklink B;bookdate *p = NULL;string name;string writer;int i = 0;cout << "请输入您要下架的书名:";cin >> name;cout << "请输入您要下架图书的作者";cin >> writer;p=B.looklink(name, writer);if (p == NULL) {cout << "您所查找的书不在书库内,不需要下架!" << endl << "返回上一层";system("pause");return;}else{cout << "检测到书库中确实有此书信息如下:"<getname()<<"t" << p->getwriter()<<"t" << p->getsum()<<"t" << p->getbookclass()<> name;cout << "您要查找的结果如下(如果列表为空,则没有查到您要找的书):" << endl;cout << "书名" << "t" << "作者" << "t" << "数量" << "t" << "类别" << endl;while (p->getnext() != NULL) {p = p->getnext();if(p->getname()==name)cout << p->getname() << "t" << p->getwriter() << "t" << p->getsum() << "t" << p->getbookclass() << endl;}}else if (n == '2') {cout << "请输入您要查找的作者";cin >> writer;cout << "您要查找的结果如下(如果列表为空,则没有查到您要找的书):" << endl;cout << "书名" << "t" << "作者" << "t" << "数量" << "t" << "类别" << endl;while (p->getnext() != NULL) {p = p->getnext();if (p->getwriter()==writer)cout << p->getname() << "t" << p->getwriter() << "t" << p->getsum() << "t" << p->getbookclass() << endl;}}else if (n == '3') {cout << "请输入您要查找的书的类型:";while (i < 3) {cin >> bookclass;if (bookclass == "科学" || bookclass == "文学" || bookclass == "青春" || bookclass == "爱情" || bookclass == "恐怖")break;else {cout << "你输入的种类不合法,请重新输入:";i++;if (i == 2) {cout << "您多次输入不合法,即将返回主菜单" << endl;system("pause");return;}}}cout << "您要查找该类书的结果如下(如果列表为空,则没有查到您要找的书):" << endl;cout << "书名" << "t" << "作者" << "t" << "数量" << endl;while (p->getnext() != NULL) {p = p->getnext();if (p->getbookclass()==bookclass)cout << p->getname() << "t" << p->getwriter() << "t" << p->getsum()<< endl;}}}void rebuildbook() {//-------------------修改某一本书booklink B;string name;string writer;string bookclass;int sum, i = 0;bookdate* p;char n;//p = B.gethead();cout << "请输入您要修改的书名:";cin >> name;cout << "请输入您要修改书的作者:";cin >> writer;p = B.looklink(name,writer);if (p == NULL) {cout << "书库中没有找到该书,即将返回主菜单" << endl;system("pause");return;}else {system("cls");cout << "书库中找到了您所要修改的书,信息如下:"<getname() << "t" << p->getwriter() << "t" << p->getsum() << "t" << p->getbookclass() << endl;cout << "请输入您要修改的类型:" << endl;cout << "1.数量2.类型";while (1) {n = _getch();if (n == '1' || n == '2') {break;}}if (n == '1') {i = 0;cout<> sum;if (sum > 0) {break;}else {cout << "您输入的数量不合法请重新输入:";i++;sum = 0;if (i == 2) {cout << "您多次操作失误,将要返回主菜单" << endl;system("pause");return;}}}B.rebuildbook(p->getname(), p->getwriter(), sum, p->getbookclass());cout << "修改成功,即将返回主菜单" << endl;system("pause");return;}else if (n == '2') {i = 0;cout<> bookclass;if (bookclass == "科学" || bookclass == "文学" || bookclass == "青春" || bookclass == "爱情" || bookclass == "恐怖")break;else {cout << "您输入的类别不合法,请重新输入:";i++;if (i == 2) {cout << "您多次操作失误,即将返回主菜单!";system("pause");return;}}}B.rebuildbook(p->getname(),p->getwriter(),p->getsum(),bookclass);cout << "更改成功,即将返回主菜单!" << endl;system("pause");return;}}}void sortbook() {booklinkB;bookdate* p,*q,t;p = B.gethead();for (p=p->getnext();p->getnext() != NULL;p = p->getnext()) {for (q = p->getnext();q != NULL;q = q->getnext()) {if (p->getsum() < q->getsum()) {t = *p;*p = *q;*q = t;t.getnext() = p->getnext();p->getnext() = q->getnext();q->getnext() = t.getnext();}}}p = B.gethead();cout << "书库中书的信息如下:" << endl;cout << "名称" << "t" << "作者" << "t" << "数目" << "t" << "书的类别" << endl;while (p->getnext() != NULL) {p = p->getnext();cout << p->getname() << "t" << p->getwriter() << "t" << p->getsum() << "t" << p->getbookclass()<> bookname;cout << "请输入您想借阅的图书作者:";cin >> bookwriter;cout << "请输入您的姓名:";cin >> name;Bp=B.looklink(bookname,bookwriter);Up = U.looklink(bookname,bookwriter,name);if (Bp == NULL||Up!=NULL&&Up->getbooksum()>0) {if (Bp == NULL) {cout << "书库中没有找到您要借的书,即将返回上一层" << endl;system("pause");system("cls");}else if (Up != NULL&&Up->getbooksum()>0) {cout << "您之前借过该书但没有还,请您还了之后再来借书,即将返回上一层" << endl;system("pause");system("cls");}return;}else if (Bp != NULL && Up != NULL && Up->getbooksum() == 0) {cout << "系统检测到您之前借过书,但已归还,请输入您再借的本数:";while (i < 3) {cin >> sum;if (sum > 0 && sum <= Bp->getsum()) {break;}else {cout << "您输入的数量不合法,请重新输入:";i++;sum = 0;if (i == 2) {cout << "您操作失误次数太多,即将返回主菜单" << endl;system("pause");return;}}}B.rebuildbook(Bp->getname(), Bp->getwriter(), Bp->getsum() - sum, Bp->getbookclass());Up->setsum(sum);U.savelink();cout << "借书成功!" << endl;system("pause");system("cls");}else {cout << "书库中找到了您所要借阅的书,信息如下:" << endl;cout << "书名" << "t" << "作者" << "t" << "数量" << "t" << "类别" << endl;cout << Bp->getname() << "t" << Bp->getwriter() << "t" << Bp->getsum() << "t" << Bp->getbookclass() << endl;cout << "请输入您要借阅的数量:";while (i < 3) {cin >> sum;if (sum > 0&&sum<=Bp->getsum()) {break;}else {cout << "您输入的数量不合法,请重新输入:";i++;sum = 0;if (i == 2) {cout << "您操作失误次数太多,即将返回主菜单" << endl;system("pause");return;}}}cout << "为了便于联系,请您留下电话号码:";cin >> phone;cout << "您确定要借阅" << Bp->getname() << "书" << sum << "本吗?" << endl;cout << "1.确定借阅 2.我再犹豫一下" << endl;char n = '0';while (1) {n = _getch();if (n == '1' || n == '2') {break;}}if (n == '1') {//--------------------------------------------------------------B.rebuildbook(Bp->getname(),Bp->getwriter(), Bp->getsum()-sum, Bp->getbookclass());U.addonenode(bookname, bookwriter, sum, name, phone);cout << "借书成功!" << endl;system("pause");system("cls");return;}else {cout << "您放弃了借书,即将返回主菜单" << endl;system("pause");system("cls");return;}}}void brobook() {//---------------------------------------------------还书booklink B;bookdate* Bp = NULL;userbooklink U;userbook* Up = NULL;string bookname;string bookwriter;int sum = 0;string name;string phone;int i = 0;cout << "请输入您借的书名";cin >> bookname;cout << "请输入您借书的作者";cin >> bookwriter;cout << "请输入您的姓名:";cin >> name;Bp = B.looklink(bookname, bookwriter);Up = U.looklink(bookname, bookwriter, name);if (Up == NULL) {cout << "系统没有检测到您的借书记录,即将返回" << endl;system("pause");system("cls");return;}else {cout << "系统检测到您的借书记录,如下:" << endl;cout << "书名"<<"t"<<"作者"<<"t"<<"待还数量"<getbookname() << "t" << Up->getbookwriter() << "t" << Up->getbooksum() << endl;cout << "请输入您要还书的数量:";while (i < 3) {cin >> sum;if (sum > 0 && sum <= Up->getbooksum()) {break;}else {i++;if (i == 2) {cout << "您多次输入不合法,即将返回主菜单";system("pause");system("cls");return;}cout << "您输入的数量不合法,请重新输入:";sum = 0;}}U.changesum(bookname,bookwriter,Up->getbooksum()-sum,name);B.rebuildbook(Bp->getname(),Bp->getwriter(),Bp->getsum()+sum,Bp->getbookclass());cout << "还书成功!";system("pause");system("cls");return;}}//---------------------------------------------------菜单区char Shield_4() {char a;while (1) {a = _getch();if (a >= '1' && a <= '4') {break;}}return a;}char Shield_6() {char a;while (1) {a = _getch();if (a >= '1' && a <= '6') {break;}}return a;}bool Usermeun() {//用户主菜单char n;bool k;UserHere:system("cls");cout << "nnn";cout << "ttt *---------------------------------------------------------------*" << endl;cout << "ttt *---------------------------------------------------------------*" << endl;cout << "ttt *tttttttt *" << endl;cout << "ttt *ttt--欢迎光临--tttt *" << endl;cout << "ttt *tttttttt *" << endl;cout << "ttt *ttt1.我想借书tttt *" << endl;//借书时可以查看图书 cout << "ttt *tttttttt *" << endl;cout << "ttt *ttt2.我想还书tttt *" << endl;cout << "ttt *tttttttt *" << endl;cout << "ttt *ttt3.我想查找书tttt *" << endl;cout << "ttt *tttttttt *" << endl;cout << "ttt *ttt4.退出登录tttt *" << endl;cout << "ttt *tttttttt *" << endl;cout << "ttt *tttttttt *" << endl;cout << "ttt *tttttttt *" << endl;cout << "ttt *tttttttt *" << endl;cout << "ttt *---------------------------------------------------------------*" << endl;cout << "ttt *---------------------------------------------------------------*" << endl << endl;cout << "————————————————————————————————————————————————————————————";cout << "请输入您要进行操作对应的编号:";n = Shield_4();if (n == '1') {userlendbook();goto UserHere;}else if (n == '2') {brobook();goto UserHere;}else if (n == '3') {selectbook();system("pause");goto UserHere;}else if (n == '4') {return false;}}bool Admmeun() {//管理员主菜单char n;bool k;AdmHere:system("cls");cout << "nnn";cout << "ttt *---------------------------------------------------------------*" << endl;cout << "ttt *---------------------------------------------------------------*" << endl;cout << "ttt *tttttttt *" << endl;cout << "ttt *ttt--管理员我们又见面了--ttt *" << endl;cout << "ttt *tttttttt *" << endl;cout << "ttt *ttt1.图书入库tttt *" << endl;cout << "ttt *tttttttt *" << endl;cout << "ttt *ttt2.书库查书tttt *" << endl;//查看书库中是否有该图书 cout << "ttt *tttttttt *" << endl;cout << "ttt *ttt3.下架图书tttt *" << endl;//1.彻底下架(删除图书) 2.下架部分图书(修改图书数量) cout << "ttt *tttttttt *" << endl;cout << "ttt *ttt4.修改图书信息tttt *" << endl;//修改图书价格 cout << "ttt *tttttttt *" << endl;cout << "ttt *ttt5.查看书库中所有图书tttt *" << endl;cout << "ttt *tttttttt *" << endl;cout << "ttt *ttt6.退出登录tttt *" << endl;cout << "ttt *---------------------------------------------------------------*" << endl;cout << "ttt *---------------------------------------------------------------*" << endl << endl;cout << "————————————————————————————————————————————————————————————";cout << "请输入您要进行操作对应的编号:";n = Shield_6();if (n == '1') {//增addbook();system("pause");goto AdmHere;}else if (n == '2') {//查selectbook();system("pause");goto AdmHere;}else if (n == '3') {//删delbook();system("pause");goto AdmHere;}else if (n == '4') {//改rebuildbook();system("pause");goto AdmHere;}else if (n == '5') {//排序sortbook();system("pause");goto AdmHere;}else if (n == '6') {//回主菜单return false;}}bool thisMenu(baselink* p) {//登录界面char n;bool k;Here:system("cls");cout << "nnn";cout << "ttt *---------------------------------------------------------------*" << endl;cout << "ttt *---------------------------------------------------------------*" << endl;cout << "ttt *tttttttt *" << endl;cout << "ttt *ttt--欢迎光临--tttt *" << endl;cout << "ttt *tttttttt *" << endl;cout << "ttt *ttt1.登录ttttt *" << endl;cout << "ttt *tttttttt *" << endl;cout << "ttt *ttt2.注册ttttt *" << endl;cout << "ttt *tttttttt *" << endl;cout << "ttt *ttt3.找回密码tttt *" << endl;cout << "ttt *tttttttt *" << endl;cout << "ttt *ttt4.修改密码tttt *" << endl;cout << "ttt *tttttttt *" << endl;cout << "ttt *ttt5.注销账户tttt *" << endl;cout << "ttt *tttttttt *" << endl;cout << "ttt *ttt6.回主菜单tttt *" << endl;cout << "ttt *tttttttt *" << endl;cout << "ttt *tttttttt *" << endl;cout << "ttt *---------------------------------------------------------------*" << endl;cout << "ttt *---------------------------------------------------------------*" << endl << endl;cout << "————————————————————————————————————————————————————————————";cout << "请输入您要进行操作对应的编号:";n = Shield_6();if (n == '1') {//-----------------------登录k=landkey(p, '1');if (k == false) {system("pause");goto Here;}else {return true;}}else if (n == '2') {//------------------注册regkey(p);system("pause");goto Here;}else if (n == '3') {//------------------找回密码lookpassward(p);system("pause");goto Here;}else if (n == '4') {//------------------修改密码landkey(p, '4');system("pause");goto Here;}else if (n == '5') {//-------------------注销账户landkey(p, '5');system("pause");goto Here;}else if (n == '6') {//-------------------返回主菜单return false;}}void mainMenu() {//主菜单cout << "nnn";cout << "ttt *---------------------------------------------------------------*" << endl;cout << "ttt *---------------------------------------------------------------*" << endl;cout << "ttt *tttttttt *" << endl;cout << "ttt *ttt--图书管理系统--ttt *" << endl;cout << "ttt *tttttttt *" << endl;cout << "ttt *ttt1.我是用户tttt *" << endl;cout << "ttt *tttttttt *" << endl;cout << "ttt *ttt2.我是管理员tttt *" << endl;cout << "ttt *tttttttt *" << endl;cout << "ttt *ttt3.主题设置tttt *" << endl;cout << "ttt *tttttttt *" << endl;cout << "ttt *ttt4.退出ttttt *" << endl;cout << "ttt *tttttttt *" << endl;cout << "ttt *tttttttt *" << endl;cout << "ttt *tttttttt *" << endl;cout << "ttt *tttttttt *" << endl;cout << "ttt *---------------------------------------------------------------*" << endl;cout << "ttt *---------------------------------------------------------------*" << endl << endl;cout << "————————————————————————————————————————————————————————————";cout << "请输入您要进行操作对应的编号:";}//-------------------------------------------------------------辅助功能区void setColor() {//设置颜色char n, k;SetColor:system("cls");printf("1.蓝色系n2.绿色风格n3.红色风格n4.紫色风格n5.黄色系n6.还原出厂设置n剩余颜色还在开发中...n");printf("如果想要你自己独特的颜色请联系管理员n请输入您要换成主题的序号n");while (1) {n = _getch();if (n >= '1' && n <= '6') {break;}}if ('1' == n)system("color 9F");else if ('2' == n)system("color AE");else if ('3' == n)system("color CF");else if ('4' == n)system("color D3");else if ('5' == n)system("color E5");else if ('6' == n)system("color 07");cout << "设置成功!" << endl;printf("点击1返回主菜单n点击2重新设置主题n");while (1) {n = _getch();if (n == '1' || n == '2') {break;}}if (n == '1') {return;}else if (n == '2') {n = '0';goto SetColor;}}int main() {baselink* p;Userlink U1;Admlink A1;booklink b;p = &A1;char n;bool k;mainHere:system("cls");mainMenu();n = Shield_4();if (n == '1' || n == '2') {if (n == '1') {p = &U1;}else if (n == '2') {p = &A1;string Admpassward;system("cls");cout << "请输入管理员密匙:";cin >> Admpassward;if (Admpassward != "芝麻开门") {cout << "密匙不匹配,您应该不是管理员";system("pause");goto mainHere;}}k=thisMenu(p);//登录菜单if (k == false) {goto mainHere;}else {if (p == &A1) {k=Admmeun();}else if (p == &U1) {k=Usermeun();}}if (k == false) {goto mainHere;}}else if (n == '3') {setColor();goto mainHere;}else if (n == '4') {exit(0);}return 0;}


总结

本项目是在大一上学期学习C++的时候写的课程设计,由于写的仓促难免有些不足,如果大家哪里有疑问请评论区留言或者私信博主。项目中的菜单函数采用了多级嵌套难以理解,大家可以ctrl + 点击响应函数进行跳转理解。希望本博客对大家的求学之路有一定的帮助。如果觉着不错的话留下三连吧(^_−)☆


关注冲哥不迷路!

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。