zl程序教程

您现在的位置是:首页 >  后端

当前栏目

基于C++实现(控制台)校园卡管理系统【100010752】

C++管理系统 实现 基于 控制台
2023-09-11 14:17:49 时间

校园卡管理项目设计

一、实验目的

设计一个校园卡管理系统,包含以下核心功能:

查看卡主和校园卡信息

充值

消费

查余

查询个人消费记录

充值记录

实验环境

本实验可基于 Visual Studio Code 等平台开发,参考主流的编码规范,如 Google C++Style

二、Guide(中文版) 2.1 编程语言和开发工具

编程语言: ANSI C/C++ 开发工具: Visual Studio Code、Dev C++

2.1 编码规范

要求遵循良好的程序设计风格来设计和编写程序。基本编码规范:

标识符的命名要到达顾名思义的程度;

关键代码提供清晰、准确的注释;

程序版面要求:

不同功能块用空行分隔;

一般一个语句一行;

语句缩进整齐、层次分明。 3.实验内容

# include <cstdlib>
# include <cstring>
# include <deque>
# include <iomanip>
# include <iostream>
# include <string>
# include "Student.cpp"
# include "Student.hpp"
# include "Card.cpp"
# include "Card.hpp"
#define MAX 10000
using namespace std;
void ManagerFunction();
void StudentFunction();
Student *students[MAX] = {NULL};
Card *cards[MAX] = {NULL};
int main()
 {
int select;
do 
{
 cout << "欢迎使用校园卡管理系统!请选择您的身份(输入序号): 
     " << endl;
cout << "1:校园卡管理员" << endl;
cout << "2: 学生用户" << endl;
cout << "3: 退出系统" << endl;
cin >> select;
switch (select)
{
case 1:
ManagerFunction();
break;
case 2:
StudentFunction();
break;
case 3:
break;
default:
cout << "抱歉,该身份无效!" << endl;
break;
    }
cout << endl;
    } while (select!=3);
cout << endl;
cout << "已退出系统!" << endl;
    for (int i = 0; i < MAX; i++) {
    if(students[i]!=NULL)
        delete students[i];
    if(cards[i]!=NULL)
        delete cards[i];
}
return 0;
}

根据校园卡或管理员身份设计功能,其中校园卡管理员的权利包括:

void ManagerFunction()
{   void CreateStudent();
    void CreateCard();
    void Transfer();
    void DeleteCard();
    void DeleteStudent();
    ……
}

学生类的权利包括:

void Check();
void Activate();
void Charge();
void ChargeCard();
void ChargeWater();
void Consume();
void Loss();
……

分析与设计简要描述程序设计的过程,包括设计思路,设计要点及特色;程序的不足与改进等。要求画出程序的简单流程图。

三、需求分析:

校园卡管理员

导入学生信息:向系统中导入学生信息(名字、学院、年级、班级、专业、学号)

给在校生绑定校园卡(卡号,余额、充值记录、消费记录、校园卡状态、水控服务)

转移校园卡内的金额:学生本人申请办理新卡时,可将原账户的余额转移到新卡中

注销校园卡:校园卡一经注销后无法使用。丢失校园卡后要重新办理的学生,需将原来绑定的校园卡注销后再办理新卡。

删除学生信息:当学生毕业或退学,管理员可将系统中的学生信息删除。

学生用户

查看校园卡信息(卡号,余额、充值记录、消费记录、校园卡状态、水控服务)

激活校园卡:设置密码

充值校园卡:校园卡充值限额为 100~500 元

消费:学生可到食堂超市(第一饭堂、第二饭堂、第三饭堂、第四饭堂、行政楼餐厅、清真食堂、教育超市、快乐多超市)进行消费。可通过热水账户的金额使用热水(洗澡)。

挂失与解挂:校园卡丢失后,学生可进行挂失,挂失后的校园卡无法使用。若校园卡被找回,可进行解挂,解挂后校园卡可以继续使用。

四,系统功能图

4.2 流程图

类结构设计

4.3 学生类

class Student {
    const string Name;
    int ID,Department, Major, Grade, Class;
    Card *card;
    5.
public:
    Student(string Name_, int ID_,int Department_, int Major_, int G rade_, int Class_);
    void setCard(Card *);
    void Check();
    void Activate();
    void Charge();
    void ChargeCard();
    void ChargeWater();
    void Consume();
    void Loss();
    16.
    string getName()const {
        return Name;
    }
    int getID()const {
        return ID;
    }
    int getDepartment()const {
        return Department;
    }
    int getMajor()const {
        return Major;
    }
    int getGrade()const {
        return Grade;
    }
    int getClass()const {
        return Class;
    }
    23.
    24.    Card *getCard() const {
        return card;
    }
    25.
};

校园卡类

class Card{
const int Number;
string Password;
double Value, WaterAccount;
state State;
Student *student;
deque<ChargeRecord*> charge_record;
deque<ConsumeRecord*> consume_record;
deque<WaterRecord*> water_record;
public:
Card(int Num, Student *);
bool isChecked();
void add(double amount);
void minus(double amount);
void addWater(double amount);
void minusWater(double amount);
void setState(state);
void setPassword(string);
void recordCharge(ChargeRecord *);
void recordConsume(ConsumeRecord *);
void recordWater(WaterRecord *);
void printCharge() const;
void printConsume() const;
void printWater() const;
int getNum()const { return Number; }
double getValue()const { return Value; }
double getWaterAccount()const { return WaterAccount; }
int getState()const { return State; }
};

记录类及其派生出的充值记录类、消费记录类、热水使用记录类

class Record{
int Month, Day, Hour, Minute, Second;
double Amount;
public:
Record(double amount=0);
void set(double amount) { Amount = amount; }
void Print_Record()const;
};
class ChargeRecord:public Record{
int Method;
public:
ChargeRecord(double amount );
void Print_ChargeRecord() const;
};
class ConsumeRecord:public Record{
int Place;
public:
ConsumeRecord(double amount);
void Print_ConsumeRecord() const;
};
class WaterRecord:public Record{
int Time;
public:
WaterRecord(int );
void Print_WaterRecord() const;
};

类关系图:

细节设计

int select;
do     {
    …         cout << "3: 退出" << endl;
    cin >> select;
    switch (select)
    {
    case …         case 3:
        break;
    default:
        cout << "抱歉,该身份无效!" << endl;
        break;
    }
    cout << endl;
} while (select!=3);

每一次选择都保证选项有效,且只有用户选择退出时才退出。

cout << "\n 请输入学生学号:" << endl;
cin >> ID;
while (ID < 0 || ID >= MAX)
{
cout << "\n 学号格式错误!请输入正确的学号:" << endl;
cin >> ID;
}
if (students[ID] != NULL)
{
cout << "\n 该学生信息已存在!请重新输入:" << endl;
return;
}
cout << "\n 请输入转出账户卡号:" << endl;
cin >> from;
while (from < 0 || from >= MAX)
{
cout << "\n 卡号格式有误!请重新输入:" << endl;
cin >> from;
}
while (cards[from] == NULL)
{
cout << "\n 该账户不存在!请重新输入:" << endl;
cin >> from;
}

每次输入学号或卡号都会检查学号和卡号的正确性,若学号或卡号的格式正确,将会判断该学生信息或校园卡是否存在系统中。

…
case 2:if(students[ID]->getCard()->getState()==LOST){
cout << endl;
cout << "此卡处于挂失状态无法充值!" << endl;
}
else
students[ID]->Charge();
break;
case 3:if(students[ID]->getCard()->getState()==LOST){
cout << endl;
cout << "此卡处于挂失状态无法进行消费!" << endl;
}
else
students[ID]->Consume();
break;

当校园卡处于挂失状态时无法进行充值和消费。

4.
if (students[ID]->getCard()->getState() == OFF)
{
    cout << "您的校园卡尚未激活,是否激活校园卡?\n输入1激活,输入0退出:" << endl;
    cin >> select;
    if (select)             students[ID]->Activate();
    else             return;
}

… case 4:if (students[ID]->getCard()->isChecked())
students[ID]->Loss();
…

若学生要激活校园卡、挂失或解挂,将要验证密码。

bool Card::isChecked() {
    string temp;
    for (int i = 9; i >= 0; i--) {
        cout << endl;
        cout << "请输入校园卡密码:" << endl;
        cin >> temp;
        if(temp==Password) {
            cout << "密码正确!" << endl;
            return true;
        }
        else             cout << "密码错误!还剩 " << i << " 次机会" << endl;
    }
    cout << "机会已用完!验证失败。" << endl;
    return false;
}

验证密码共有 10 次机会,若密码正确则返回 true,若 10 次输入都密码错误将返回 false,同时提示验证失败。

…
case 1:
cout << endl;
cout << "当前余额为:" << card->getValue() << " 元" << endl;
cout << "请输入消费金额:" << endl;
in >> amount;
if(amount > card->getValue())
cout << "校园卡余额不足!" << endl;
else{
card->minus(amount);
card->recordConsume(new ConsumeRecord(amount));
cout << endl;
cout << "成功消费 " << amount << " 元!" << endl;
cout << "当前余额:" << card->getValue() << " 元" << endl;
}
break;
Record::Record(double amount):Amount(amount){
cout << "\n 请输入日期(月、日,用空格隔开):" << endl;
cin >> Month >> Day;
cout << "\n 请输入当前时间(时、分、秒,用空格隔开):" << endl;
cin >> Hour >> Minute >> Second;
}
ChargeRecord::ChargeRecord(double amount):Record(amount){
cout << endl;
cout << "请选择支付方式:" << endl;
for (int i = 0; i < 3;i++){
cout << i + 1 << ":" << method[i] << endl;
}
cin >> Method;
cout << endl;
cout << "成功充值 " << amount << " 元!" << endl;
}

学生每次进行充值、消费、使用热水都会进行记录,记录金额、日期(月、日)、时间(时、分、秒)、支付方式或消费地点等信息。

实验结果样例说明:

1 1 //新生入学,校园卡管理员为新生录入学生信息 0123

//学号 张三 //姓名 1

//选择院系,数据科学与计算机学院 1

//选择专业,计算机系 2019

//年级,即入学年份 3

//班级 2

//绑定校园卡,卡号随机且具有唯一性 0123 6

//退出 2

//登入学生系统 0123

//输入学号 1

//激活校园卡 000000

//输入初始密码 123456

//输入新密码 2

//充值校园卡 1

//余额充值 600

//输入充值金额,大于限额(500 元)时提示充值失败 100

//输入正确金额,充值成功 12 25

//输入充值的日期(月、日) 12 12 12

//时间(时、分、秒) 1 //选择支付方式。生成充值记录。 3

//退出 3 //消费 1

//饭堂超市消费 101

//消费金额大于余额时,消费失败 1

//重新选择饭堂超市消费 10

//输入消费金额 12 25

//输入信息生成消费记录 12 12 13 1 3

//退出 1

//查询 3

//查看充值记录 4

//查看消费记录 6

/退出查询 5

//退出学生系统 3

//退出系统,关闭程序

实验结果:

♻️ 资源

在这里插入图片描述

大小: 2.21MB
➡️ 资源下载:https://download.csdn.net/download/s1t16/87430282
注:如当前文章或代码侵犯了您的权益,请私信作者删除!