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

本文介绍了作者使用C++实现的图书管理系统,重点在于利用C++的封装、继承和多态特性。系统包括登录器,密码加密,以及不同角色(用户、管理员)的登录。文章详细讲解了登录器的实现,包括无回显输入和退格功能,并展示了程序运行截图。此外,还概述了项目中的类结构,如信息节点类、链表基类、用户链表类等,以及它们在系统中的作用。
摘要由CSDN通过智能技术生成
  • 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.实现方法


注意点都在代码的注释中

代码如下:

include

using namespace std;

include<conio.h>

int main() {

char passward[20];

int i = 0, j, k;

char ch = ‘0’;

cout << “请输入您的密码:”;

j = 0; k = 1;

i = 0;

memset(passward, ‘\0’, 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 = ‘\0’;

i–;

}

else {

cout << “\b \b”;

passward[i - 1] = ‘\0’;

ch = ‘\0’;

i = i - 2;

}

}

}

i++;

}

cout << endl;

cout << “passward is : 123123” <<endl;

cout << "you put is " << passward << endl;

if (strcmp(passward, “123123”) == 0) {

cout << “密码正确” << endl;

}

else {

cout << “密码错误” << endl;

}

cout << endl;

return 0;

}

三、程序运行截图

==========================================================================

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() {//-----------------------------------------------------------------获取id

return 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值