♻️ 资源大小2.21MB➡️资源下载https://download.csdn.net/download/s1t16/87430282校园卡管理项目设计一、实验目的设计一个校园卡管理系统包含以下核心功能查看卡主和校园卡信息充值消费查余查询个人消费记录充值记录实验环境本实验可基于 Visual Studio Code 等平台开发参考主流的编码规范如 Google CStyle二、Guide中文版 2.1 编程语言和开发工具编程语言 ANSI C/C 开发工具 Visual Studio Code、Dev C2.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; dequeChargeRecord* charge_record; dequeConsumeRecord* consume_record; dequeWaterRecord* 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 amount0); 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(tempPassword) { 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//退出系统关闭程序实验结果4.12 设计心得通过分析需求和设计层次我设计了一个能满足需求的校园卡管理系统还增加了热水账户功能使校园卡同时具备热水卡的功能。设计了一些模块来确保学号、卡号的唯一性设计了充值或消费时超出限额时的提醒功能。同时针对客户输入无效选项时设置了提醒。此项目中的校园卡类、学生类、记录类采用的是堆空间存储并且在程序使用完毕时释放。但仍有不足的地方如采用指针数组的方法来存储每张校园卡的地址卡号为数组下标。这种方法虽然确保了卡号的唯一性可对于用户来说输入卡号 41 和 0041 效果是一样的。而这并不能很好的确保卡号的规范。学生类也存在这个问题。设置校园卡密码时虽规定 6 位密码且仅能使用字母、数字、下划线但由于采用了 string 类来存储密码因此不能保证密码的规范性。充值记录类能显示充值记录但充值记录没有校园卡余额充值或热水账户充值的说明。