c++案例

该代码示例展示了C++中如何使用类和继承实现身份验证系统,包括学生、教师和管理员的角色。通过文件读写验证用户身份,并实现了不同角色的操作菜单,如添加账号、查看信息等。同时,利用多态性处理不同类型的用户操作。
摘要由CSDN通过智能技术生成
#include <iostream>//标准的输入输出流
using namespace std;

int main()
{

    system("pause");
    return 0;
}
#include <iostream>//标准的输入输出流
using namespace std;

int main()
{
    char role;
    cout << "请选择" << endl;
    cout << "A:学生  B:老师  C:家长" << endl;
    
    while (true)
    {
        cin >> role;
        switch (role)
        {
        case 'A':
            break;
        case 'B':
            break;
        case'C':
            break;
        default:
            cout << "请重新选择" << endl;
            break;

        }
    }
    system("pause");
    return 0;
}
#pragma once//防止头文件重复包含
#include <iostream>
using namespace std;

class Identity//基类
{
public:

    virtual void operMenu() = 0;//纯虚函数

    string m_name;

    string m_pwd;

};
#pragma once
#include <iostream>

using namespace std;

#include "Identity.h"

//学生类
class Student :public Identity
{
public:
    //默认构造
    //有参构造
    virtual void operMenu() = 0;//?菜单界面?
    //学生学号
    //申请预约
    //。。。
};
#pragma once
#include <iostream>
using namespace std;

#include "Identity.h"

//学生类
class Student :public Identity
{
public:

    Student();
    Student(int id, string name, string pwd);
    virtual void operMenu();
    int m_id;
    
    void applyOrder();
    void showMyOrder();
    void cancelOrder();
    
};
#include "student.h"

Student::Student(){

}
Student::Student(int id, string name, string pwd) {

}
void Student::operMenu() {

}
void Student::applyOrder() {

}
void Student::showMyOrder() {

}
void Student::cancelOrder() {

}
#pragma once
#include <iostream>
using namespace std;

#include "Identity.h"

class Teacher :public Identity
{
public:
    Teacher();//默认构造函数
    Teacher(int empId,string name, string pwd);//有参构造
    int m_EmpId;            //职工号

    virtual void operMenu();//菜单
    void shoeAllOrder();//查看所有预约
    void validOrder();//审核预约

};
#include "teacher.h"

Teacher::Teacher() {

}
Teacher::Teacher(int empId, string name, string pwd) {

}
void Teacher::operMenu() {

}
void Teacher::shoeAllOrder() {

}
void Teacher::validOrder() {

}
#pragma once
#include <iostream>
using namespace std;

#include "Identity.h"

class Manger :public Identity
{
public:
    Manger();
    Manger(string name, string pwd);

    virtual void operMenu();//菜单
    void addPerson();
    void showPerson();
    void showComputer();
};
#include "manger.h"

Manger::Manger() {

}
Manger::Manger(string name, string pwd) {

}
void Manger::operMenu() {

}
void Manger::addPerson() {

}
void Manger::showPerson() {

}
void Manger::showComputer() {

}
#pragma once
//管理员文件
#define ADMIN_FILE "admin.txt"
//学生文件
#define STUDENT_FILE "student.txt"
//教师文件
#define TEACHER_FILE "teacher.txt"
//机房信息文件
#define COMPUTER_FILE "computer.txt"
//订单文件
#define ORDER_FILE "order.txt"
#include "globalFile.h"
#include <fstream>
#include <string>
#include "Identity.h"
//全局函数-登录函数
//传入的是-----操纵的文件名和身份类型
void LoginIn(string fileName, char role)
{
    //父类指针,用于指向子类对象
    Identity* person = NULL;

    //读文件
    ifstream ifs;
    ifs.open(fileName, ios::in);
    //判断文件是否存在
    if (!ifs.is_open())
    {
        cout << "文件不存在" << endl;
        ifs.close();
        return;
    }

    //准备用户信息
    int id = 0;
    string name;
    string pwd;

    //判断身份
    if (role == 'A')
    {
        cout << "输入学号:" << endl;
        cin >> id;
    }
    else if (role == 'B')
    {
        cout << "输入职工号:" << endl;
        cin >> id;
    }
    cout << "用户名:" << endl;
    cin >> name;
    cout << "密码:" << endl;
    cin >> pwd;

    if (role == 'A')
    {
        //学生身份验证
    }
    else if (role == 'B')
    {
        //教师身份验证
    }
    else if (role == 'C')
    {
        //管理员身份验证
    }
    cout << "验证失败" << endl;

    return;
}
        //学生身份验证
        int fId;//从文件中读取ID号
        string fName;
        string fPwd;
        while (ifs >> fId && ifs >> fName && ifs >> fPwd)
        {
            //比对
        }
#include "student.h"
#include "teacher.h"
#include "manger.h"
            //比对
            if (fId == id && fName == name && fPwd == pwd)
            {
                cout << "学生验证成功" << endl;
                person = new Student(id, name, pwd);
                //进入学生系统

                return;
            }
        //教师身份验证
        int fId;//从文件中读取ID号
        string fName;
        string fPwd;
        while (ifs >> fId && ifs >> fName && ifs >> fPwd)
        {
            //比对
            if (fId == id && fName == name && fPwd == pwd)
            {
                cout << "学生验证成功" << endl;
                person = new Student(id, name, pwd);
                //进入学生系统

                return;
            }
        }
        //管理员身份验证
        while (ifs >> fName && ifs >> fPwd)
        {
            //比对
            if (fName == name && fPwd == pwd)
            {
                cout << "管理员验证成功" << endl;
                person = new Manger(name, pwd);
                //进入管理系统

                return;
            }
        }

1、首先在管理员类【manger.cpp】里

//Manger类的构造函数,初始化管理员信息
//有参构造
Manger::Manger(string name, string pwd) { 
    //记录管理员自己的姓名和密码  
    this->m_name = name;
    this->m_pwd = pwd;
}

//添加账号,查看账号,查看机房,清空预约,注销登录
void Manger::operMenu() {
    cout << "欢迎管理员" << this->m_name << "登录!" << endl;
    cout << "1.添加账号" << endl;
    cout << "2.查看账号" << endl;
    cout << "3.查看机房" << endl;
    cout << "4.清空预约" << endl;
    cout << "0.注销登录" << endl;
}

2、在主函数里添加一个全局函数用父类的指针接收,用于进入子菜单

需要注意如果不提前声明这个函数,注意在调用的时候的先后顺序。

//全局函数-子菜单界面
void managerMenu(Identity*& manager)
{
    while (true)
    {
        //首先打开管理员子菜单
        manager->operMenu();

        Manger* man = (Manger*)manager;
        int select = 0;
        cin >> select;
        if (select == 1)
        {
            cout << "添加账号" << endl;
            man->addPerson();
        }
        else if (select == 2)
        {
            cout << "查看账号" << endl;
            man->showPerson();
        }
        else if (select == 3)
        {
            cout << "查看机房" << endl;
            man->showComputer();
        }
        else if (select == 3)
        {
            cout << "清空预约" << endl;
            man->clearFile();
        }
        else
        {
            delete manager;
            cout << "注销成功" << endl;
            return;
        }
    }
}

3【manger.cpp】继续完善

#include "globalFile.h"
#include <fstream>

void Manger::addPerson() {
    cout << "添加学生请按1,添加教师请按2" << endl;
    int select = 0;
    cin >> select;

    string filename;
    string tip;
    
    if (select==1)
    {
        filename = STUDENT_FILE;
        tip = "请输入学号";
    }
    else if (select == 2)
    {
        filename = TEACHER_FILE;
        tip = "请输入职工编号";
    }
    else
    {
        return;
    }

    ofstream ofs;
    ofs.open(filename, ios::out | ios::app);

    int id;
    string name;
    string pwd;
    cout << tip << endl;
    cin >> id;
    cout << "请输入姓名" << endl;
    cin >> name;
    cout << "请输入密码" << endl;
    cin >> pwd;

    ofs << id << " " << name << " " << pwd << " " << endl;
    cout << "添加成功" << endl;

    ofs.close();
}

4.去重操作。使用到了容器。在【manger.h】的类{ class Manger :public Identity }中添加

#include <vector>
#include "student.h"
#include "teacher.h"

    //初始化容器
    void initVector();

    //学生容器
    vector<Student>vStu;
    //教师容器
    vector<Teacher>vTea;

5.在【manger.cpp】里完善void initVector()初始化函数

//初始化容器
void Manger::initVector() {

    //清空容器
    vStu.clear();
    vTea.clear();

    //读取信息
    ifstream ifs;
    ifs.open(STUDENT_FILE, ios::in);//用ios冒号冒号in的方式打开
    if (!ifs.is_open())
    {
        cout << "学生文件读取失败" << endl;
        return;
    }
    Student s;
    while (ifs >> s.m_id && ifs >> s.m_name && ifs >> s.m_pwd)
    {
        vStu.push_back(s);
    }
    cout << "当前学生数量" << vStu.size() << endl;
    ifs.close();




    ifs.open(TEACHER_FILE, ios::in);//用ios冒号冒号in的方式打开
    if (!ifs.is_open())
    {
        cout << "教师文件读取失败" << endl;
        return;
    }
    Teacher t;
    while (ifs >> t.m_name && ifs >> t.m_pwd)
    {
        vTea.push_back(t);
    }
    cout << "当前教师数量" << vTea.size() << endl;
    ifs.close();
}

去重,检测是否有重复(类型,ID)返回bool,这个函数应该添加到

添加账号{void Manger::addPerson()}函数里面

    //检测是否有重
    bool checkRepeat(int type, int id);
bool Manger::checkRepeat(int type, int id) {    
    if (type == 2)
    {
        for (vector<Teacher>::iterator ti = vTea.begin(); ti != vTea.end(); ti++)
        {
            if (id == ti->m_EmpId)
            {
                return true;
            }
        }
    }
    else 
    {
        for (vector<Student>::iterator ti = vStu.begin(); ti != vStu.end(); ti++)
        {
            if (id == ti->m_id)
            {
                return true;
            }
        }
    }
    return false;
}

把cin >> id;换成如下检测代码

while (true)
    {
        cin >> id;
        bool ret = checkRepeat(select, id);
        if (ret)//为真有重复
        {
            cout << errortip << endl;
        }
        else
        {
            break;
        }
    }

对于容器---c++的STL面向对象(封装继承和多态),泛型编程

容器+算法+迭代器,,,仿函数

vector ,list , deque , set, map用来存放数据【数据结构】

sort, find, copy, for_each 等

迭代器类似于指针

遍历查看for_each(vStu.begin(), vStu.end(), printStudent);

#include <algorithm>

//打印信息
void printStudent(Student& s){
    cout << "学号:" << s.m_id << "\t姓名:" << s.m_name << endl;
}
void printTeacher(Teacher& t) {
    cout << "职工号:" << t.m_EmpId << "\t姓名:" << t.m_name << endl;
}
void Manger::showPerson() {
    cout << "查看所有学生请按1,查看所有老师请安2" << endl;
    int select = 0;
    cin >> select;

    if (select == 1)
    {
        cout << "学生信息如下:" << endl;
        for_each(vStu.begin(), vStu.end(), printStudent);
    }
    else
    {
        cout << "教师信息如下:" << endl;
        for_each(vTea.begin(), vTea.end(), printTeacher);
    }
    system("pause");
}

6.机房的类【computerROOM.h】头文件

#pragma once//防止重复命名
#include <iostream>//标准io流
using namespace std;//标准命名空间

class ComputerRoom
{
public:
    int m_ComID;
    int m_MaxNum;
};
//机房初始化
void Manger::initComputerROOM() {
    ifstream ifs;
    ifs.open(COMPUTER_FILE, ios::in);
    ComputerRoom com;//初始化一个机房的类
    while (ifs >> com.m_ComID && ifs >> com.m_MaxNum)
    {
        vCom.push_back(com);
    }
    ifs.close();
    cout << "-------------------机房的数量" << vCom.size() << endl;
}

void Manger::showComputer() {
    cout << "机房信息如下" << endl;

    int AllNum = 0;
    for (vector<ComputerRoom>::iterator ti = vCom.begin(); ti != vCom.end(); ti++)
    {
        cout << "机房编号=" << ti->m_ComID << ":机房最大容量=" << ti->m_MaxNum << endl;
        AllNum = AllNum + ti->m_MaxNum;
    }
    cout << "总机位=" << AllNum << endl;
}

7.学生子菜单

//全局函数-学生子菜单
void studentMenu(Identity*& student) {
    while (true)
    {
        student->operMenu();//调用学生子菜单
        Student* stu = (Student*)student;

        int select = 0;
        cin >> select;
        if (select == 1) {
            stu->applyOrder();//申请预约
        }
        else if (select == 2) {
            stu->showMyOrder();//查看个人预约
        }
        else if (select == 3) {
            stu->showAllOrder();//查看所有人预约
        }
        else if (select == 4) {
            stu->cancelOrder();
        }
        else
        {
            delete student;
            cout << "注销成功" << endl;
            return;
        }
    }
}

第一次了解c++的类

#include <iostream>

using namespace std;


//设计一个类 名称
//类的属性,行为(成员属性-变量,成员函数-方法)
class Circle
{
    //访问权限
    //保护权限:父类中的保护权限子类可以也使用
    //私有权限:子类也不可访问
public://公共权限

    //属性
    int r;//半径


    //行为
    double calculateZC()//计算圆的周长
    {
        return 2 * PI * r;
    }



protected://保护权限
    int d = 2 * r;


private://私有权限
    const double PI = 3.14;


};

int main()
{
    //实例化
    Circle Yuan;//通过圆类,创建一个具体对象
    cout << "圆的半径:";
    cin >> Yuan.r;//给这个对象赋值
    cout << Yuan.calculateZC() << endl;
    return 0;
}

一个完整的代码:用到了结构体,类(属性和动作)

#include <iostream>
#include "string"
using namespace std;

//定义一个结构
struct triple
{
    int l, h, w;
};


//立方体的类
class Cube
{
public:
    int m_id;
    //设置长
    void setLHW(int l, int h, int w,int id)
    {
        m_l= l;
        m_h =  h;
        m_w = w;
        m_id = id;
    }
    //获取长
    triple getLHW()
    {
        C.l = m_l;
        C.h = m_h;
        C.w = m_w;
        return C;
    }

    //获取体积
    int getV()
    {
        return m_l*m_h*m_w;
    }

    //获取面积
    int getS()
    {
        return 2 * m_l * m_h + 2 * m_h * m_w + 2 * m_l * m_w;
    }



    //利用成员函数判断是否是相同立方体
    bool isSameCube(Cube & c)
    {
        if (c.getLHW().l == m_l && c.getLHW().h == m_h && c.getLHW().w == m_w)
        {
            return true;
        }
        return false;
    }
private:
    int m_l, m_h, m_w;
    triple C;
};

//全局函数比较两者大小
void compare(Cube& c1, Cube& c2)
{
    if (c1.getV() > c2.getV()) { cout <<"第"<< c1.m_id << "个体积较大"; }
    else if (c1.getV() < c2.getV()) { cout << "第" << c2.m_id << "个体积较大"; }
    else 
    {
        cout << "一样大,并且";
        cout << "第" << c1.m_id << "个的面积是" << c1.getS();
        cout << "第" << c2.m_id << "个的面积是" << c2.getS();

    }
}

void main()
{
    Cube cube1;
    int l, h, w;
    cout << "长度=";
    cin >> l;
    cout << "高度=";
    cin >> h;
    cout << "宽度=";
    cin >> w;
    cube1.setLHW(l,h,w,1);
    cout << "体积="<<cube1.getV() << endl;
    cout << "面积=" << cube1.getS() << endl;

    cout << "下一个" << endl;
    Cube cube2;
    cout << "长度=";
    cin >> l;
    cout << "高度=";
    cin >> h;
    cout << "宽度=";
    cin >> w;
    cube2.setLHW(l, h, w,2);
    cout << "体积=" << cube2.getV() << endl;
    cout << "面积=" << cube2.getS() << endl;

    bool ret = cube2.isSameCube(cube1);
    cout << ret<<endl;

    //比较
    compare(cube1, cube2);

    return;
}

学习了类的析构函数和构造函数

#include <iostream>

using namespace std;


//设计一个类 名称
//类的属性,行为(成员属性-变量,成员函数-方法)
class Circle
{

    // 
    
    //访问权限,默认权限是私有权限。
    //保护权限:父类中的保护权限子类可以也使用
    //私有权限:子类也不可访问
public://公共权限

    //构造函数:没有返回值,自动调用,只调用一次
    Circle()
    {
        cout << "调用构造函数" << endl;
    }
    //析构函数:
    ~Circle()
    {
        cout << "调用析构函数" << endl;
    }


    //属性
    int r;//半径


    //行为
    double calculateZC()//计算圆的周长
    {
        return 2 * PI * r;
    }



protected://保护权限
    int d = 2 * r;


private://私有权限
    const double PI = 3.14;


};

void testXiGouFun()
{
    Circle circle;//局部变量,创建在栈区。
    //执行完后会自动释放
}

int main()
{
    //实例化
    Circle Yuan;//通过圆类,创建一个具体对象
    cout << "圆的半径:";
    cin >> Yuan.r;//给这个对象赋值
    cout << Yuan.calculateZC() << endl;


    //测试析构函数
    cout << "-----测试析构函数-----" << endl;
    testXiGouFun();
    return 0;
}

继承

//子类
//如何继承---public 加继承类的名称
//继承方式:公共继承【公共还是公共,保护还是保护,私有不能访问】,
//保护继承【除了私有内容不能访问,其他都变成了保护权限】,
//私有继承【除了私有内容不能访问,其他都变成了私有权限】
class ellipse :public Circle
{
public:
    double a = r;//你看!这就直接访问到父类的r了
    double b = 2 * r;

    double calculatS()
    {
        return a * b * PI;
    }
};

//更改父类 PI的访问权限
protected://保护权限
    const double PI = 3.14;
    
private://私有权限
    int d = 2 * r;

多态

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值