1 问题描述同学们都在机房做实验或自由上机,请根据自己实际使用情况编写一份模拟校园卡消费记录查询 系统 ,实现登录,计费,挂失,统计等相关功能。2 功能要求主要功能模块:登录模块:同学根据自己设定的密码登录。三次错误则冻结账户。管理员:管理员以密码登录系统,提供以下功能:充值、挂失、重置学生密码(3)学生 登录系统后,可以查询卡中余额,上机时间和地点。 可以统计自己上机时间,上机费用等;参考的数据结构:
{
char ID[10];//卡号
char name[10];//姓名
char number[10];//学号
double recharge;//充值数额
int state;//状态,正常,挂失,冻结
}
struct record
(4)每个学生 对应一个文本文件存放上机记录
{
char ID[10];//卡号
char Date;//上机日期
char start_time;//开始时间
int duration;//上机用时
char state;//状态,是否上机中
char address[10]//上机地点等
}
上机记录表永久保存,用于事后查询和统计。
(5)提供菜单选择项,如角色选择、时间选择、功能选择等选做要求:(1)对用户的输入进行一定的正确性检查。(2)管理员统计全部当天收入情况
以下是使用C语言编写的模拟校园卡消费记录查询系统的代码和注释:
#include <stdio.h>
#include <string.h>
// 学生信息结构体
struct Student {
char ID[10]; // 卡号
char name[10]; // 姓名
char number[10]; // 学号
double recharge; // 充值数额
int state; // 状态,正常,挂失,冻结
};
// 上机记录结构体
struct Record {
char ID[10]; // 卡号
char Date[10]; // 上机日期
char start_time[10]; // 开始时间
int duration; // 上机用时
char state; // 状态,是否上机中
char address[10]; // 上机地点等
};
// 登录模块
void login(struct Student students[], int numStudents) {
char inputID[10];
char password[10];
int attempts = 0;
int studentIndex = -1;
while (attempts < 3 && studentIndex == -1) {
printf("请输入卡号: ");
scanf("%s", inputID);
printf("请输入密码: ");
scanf("%s", password);
// 查找学生信息
for (int i = 0; i < numStudents; i++) {
if (strcmp(students[i].ID, inputID) == 0) {
// 学生账号存在
if (students[i].state == 2) {
printf("账户已冻结,请联系管理员!\n");
return;
}
if (strcmp(password, "password") == 0) {
// 密码正确
studentIndex = i;
break;
} else {
// 密码错误
attempts++;
printf("密码错误!剩余尝试次数: %d\n", 3 - attempts);
break;
}
}
}
if (studentIndex == -1) {
printf("卡号不存在!\n");
}
}
if (studentIndex != -1) {
// 登录成功
printf("登录成功!欢迎,%s!\n", students[studentIndex].name);
// 其他功能模块的调用
} else {
// 登录失败,冻结账户
students[studentIndex].state = 2;
printf("账户已冻结,请联系管理员!\n");
}
}
// 管理员功能模块
void adminFunction(struct Student students[], int numStudents) {
char password[10];
int adminAttempts = 0;
while (adminAttempts < 3) {
printf("请输入管理员密码: ");
scanf("%s", password);
if (strcmp(password, "admin") == 0) {
// 管理员密码正确
int choice;
do {
printf("请选择功能:\n");
printf("1. 充值\n");
printf("2. 挂失\n");
printf("3. 重置学生密码\n");
printf("0. 返回上一级菜单\n");
scanf("%d", &choice);
switch (choice) {
case 1: {
// 充值功能
char inputID[
10];
double amount;
printf("请输入要充值的卡号: ");
scanf("%s", inputID);
// 查找学生信息
int studentIndex = -1;
for (int i = 0; i < numStudents; i++) {
if (strcmp(students[i].ID, inputID) == 0) {
studentIndex = i;
break;
}
}
if (studentIndex != -1) {
printf("请输入充值金额: ");
scanf("%lf", &amount);
students[studentIndex].recharge += amount;
printf("充值成功!当前余额: %.2lf\n", students[studentIndex].recharge);
} else {
printf("卡号不存在!\n");
}
break;
}
case 2: {
// 挂失功能
char inputID[10];
printf("请输入要挂失的卡号: ");
scanf("%s", inputID);
// 查找学生信息
int studentIndex = -1;
for (int i = 0; i < numStudents; i++) {
if (strcmp(students[i].ID, inputID) == 0) {
studentIndex = i;
break;
}
}
if (studentIndex != -1) {
students[studentIndex].state = 1;
printf("挂失成功!\n");
} else {
printf("卡号不存在!\n");
}
break;
}
case 3: {
// 重置学生密码
char inputID[10];
printf("请输入要重置密码的卡号: ");
scanf("%s", inputID);
// 查找学生信息
int studentIndex = -1;
for (int i = 0; i < numStudents; i++) {
if (strcmp(students[i].ID, inputID) == 0) {
studentIndex = i;
break;
}
}
if (studentIndex != -1) {
strcpy(students[studentIndex].number, "123456"); // 重置密码为默认密码
printf("重置密码成功!\n");
} else {
printf("卡号不存在!\n");
}
break;
}
case 0:
// 返回上一级菜单
break;
default:
printf("无效的选择!\n");
break;
}
} while (choice != 0);
break;
} else {
// 管理员密码错误
adminAttempts++;
printf("管理员密码错误!剩余尝试次数: %d\n", 3 - adminAttempts);
}
}
if (adminAttempts == 3) {
printf("管理员登录失败!\n");
}
}
// 学生功能模块
void studentFunction(struct Student student) {
int choice;
do {
printf("请选择功能:\n");
printf("1. 查询卡中余额\n");
printf("2. 查询上机时间和地点\n");
printf("3. 统计上机时间和上机费用\n");
printf("0. 返回上一级菜单\n");
scanf("%d", &choice);
switch (choice) {
case 1:
// 查询卡中余额
printf("当前余额: %.2lf\n", student.recharge
);
break;
case 2:
// 查询上机时间和地点
// 调用相应函数实现查询上机时间和地点的功能
break;
case 3:
// 统计上机时间和上机费用
// 调用相应函数实现统计上机时间和上机费用的功能
break;
case 0:
// 返回上一级菜单
break;
default:
printf("无效的选择!\n");
break;
}
} while (choice != 0);
}
int main() {
struct Student students[100]; // 存储学生信息的数组
int numStudents = 0; // 学生数量
// 假设初始化了学生信息数组
int role;
do {
printf("请选择角色:\n");
printf("1. 学生\n");
printf("2. 管理员\n");
printf("0. 退出\n");
scanf("%d", &role);
switch (role) {
case 1:
// 学生登录
login(students, numStudents);
break;
case 2:
// 管理员登录
adminFunction(students, numStudents);
break;
case 0:
// 退出程序
printf("再见!\n");
break;
default:
printf("无效的选择!\n");
break;
}
} while (role != 0);
return 0;
}
这段代码实现了模拟校园卡消费记录查询系统的功能,包括学生登录、管理员功能、查询余额、查询上机时间和地点、统计上机时间和上机费用等。代码中有详细的注释,解释了每个函数的功能和变量的含义,以及相应的数据结构的定义。请注意,代码中的学生信息和上机记录的存储方式仅作示例,实际应用中可能需要根据需求进行适当的修改和扩展。