武汉理工大学程序设计综合实验作业,没有完全按照要求的文件来写,仅供参考。
目录
菜单说明
大致思路说明
代码实现
func.h 用于存放各种功能函数的声明
tool.h 用于存放相关工具函数的声明
func.c 用于存放各种功能函数的定义
tool.c 用于存放相关工具函数的定义
main.c 程序实现的整体结构,main函数
select.c 存放各种需要switch-case的函数
card.txt 卡信息文本文件
manager.txt 管理员信息文本文件
菜单说明
大致思路说明
查询统计只统计了总共的数据和所有的卡,没有按天统计。
权限管理是对管理员的添加,删除,查找,修改权限。
所有的文本文件博主只创建了两个,一个是卡信息,一个是管理员信息。没有创建类似消费信息的文件。
使用链表储存卡信息,使用顺序表储存管理员信息
只在程序开始时将文本文件内容读取到链表和顺序表储存,在程序结束后,将信息重新输入到文本文件。各种操作函数内部没有涉及到对文件的处理
代码实现
func.h 用于存放各种功能函数的声明
#pragma once
#include<stdio.h>
#include<time.h>
#include<string.h>
#include<stdlib.h>
#include<assert.h>
void Outputmenu(void);
void Select(int a);//菜单选择
int Add(); //添加卡
void Search(); //查询卡
void Logout();//注销卡
void On(); //上机
void Off(); //下机
void Recharge(); //充值
void Refund(); //退费
void Addup(); //查询统计
void Manage(); //权限管理
void Str(); //计费标准管理
int exitApp();//退出
void Mmenu();//权限管理菜单
void Mselect(int a);//权限菜单选择
void Madd();//添加管理员
void Mlogout();//删除管理员
void Stlevel();//管理权限
void Msearch();//管理员列表显示
//初始化管理员顺序表
void initSLAdm();
//检查管理员容量
void SLAdmCheckCapacity();
//销毁管理员顺序表
void DestroySLAdm();
void Cmenu();//计费标准菜单
void Cselect(int a);//计费标准菜单选择
int initCardlist();//初始化链表
void releaseCardlist();//释放链表节点
void Fetchdate();//将文件内容存放到链表中
void Fetchmanager();//将管理员信息存放到数组中
void Savemanager();//将管理员信息保存到文件中
void initSta();//初始化计费标准
//计费信息
typedef struct Fee{
char aCardname[20];//卡号
time_t tStart;//上机时间
time_t tEnd;//下机时间
double fAmount;//消费金额
int nStatus;//卡状态
int nDel;//删除标志
}Fee;
//卡信息
typedef struct Card {
char aName[19];//卡号
char aPwd[9];//密码
int nStatus;//卡状态
time_t tStart;//开卡时间
time_t tEnd;//截止时间
double Totaluse;//累计使用金额
double Balance;//余额
time_t tLast;//最后使用时间
int Usecount;//使用次数
int nDel;//删除标志
time_t tOn;//最近上机时间
}Card;
typedef struct Cardnode {
Card date;
struct Cardnode* next;
}Cardnode,*lpCardnode;
//管理员信息
typedef struct Administrator {
char Name[9];//姓名
char Pwd[9];//密码
int privilge;//权限等级
int del;//删除标志
}Adm;
//定义管理员顺序表
typedef struct SLAdministrator {
Adm* arr;
int size;//有效数据个数
int capacity;//容量
}SLA;
//计费标准管理
typedef struct Standard {
int unit;//最小计费单元
double charge;//每个计费单元的收费
int ratetype;//收费类别
double night;//包夜费用
double day;//包天费用
int del;//删除标志
}Sta;
void doOn(char* name, char* pwd);//进行上机
void doOff(char* name, char* pwd);//进行下机
void doRecharge(char* name, char* pwd);//进行充值
void doRefund(char* name, char* pwd);//进行退费
void doLogout(char* name, char* pwd);//进行删除卡
void doMlogout(char*name, char*pwd);//进行删除管理员
void doStlevel(char* name, char* pwd);//进行设置管理员权限
tool.h 用于存放相关工具函数的声明
#pragma once
#include<time.h>
//将time_t转换为字符串 年月日时分
void Timetostring(time_t t, char* pBuf);
//将字符串转化为时间戳
time_t Stringtotime(char* timeStr);
func.c 用于存放各种功能函数的定义
#define _CRT_SECURE_NO_WARNINGS 1
#include"func.h"
#include"tool.h"
#define NAMD_MAX 100
Card card;
Fee fee;
Sta sta;
SLA sla;//管理员顺序表
//Adm adm[NAMD_MAX];//管理员全局变量
//int nadm = 0;//管理员人数
lpCardnode cardlist=NULL;
lpCardnode head = NULL; //
//默认初始计费标准
void initSta()
{
sta.charge = 1;
sta.unit = 1;
sta.del = 0;
sta.ratetype = 0;
sta.night = 50;
sta.day = 200;
}
//初始化链表
int initCardlist()
{
//lpCardnode head = NULL;
head = (lpCardnode)malloc(sizeof(Cardnode));
if (head == NULL)
{
perror("head");
return 0;
}
else {
head->next = NULL;
cardlist = head;
return 1;
}
}
//初始化管理员顺序表
void initSLAdm()
{
sla.arr = (Adm*)malloc(sizeof(Adm) * 4);
if (sla.arr == NULL)
{
perror("realloc fail");
exit(1);
}
sla.capacity = 4;
sla.size = 0;
}
//检查管理员容量
void SLAdmCheckCapacity()
{
if (sla.capacity == sla.size)
{
Adm* p = (Adm*)realloc(sla.arr, sla.capacity * 2 * sizeof(Adm));
if (p == NULL) {
perror("adm realloc fail");
exit(1);
}
else {
sla.arr = p;
sla.capacity *= 2;
}
}
}
//将管理员信息存放到数组中
void Fetchmanager()
{
//打开文件
FILE* pf = fopen("manager.txt", "r");
assert(pf);
//存放信息
char info[50];
char p[3] = "#";
while (fgets(info, 50, pf) != NULL)
{
SLAdmCheckCapacity();
strcpy(sla.arr[sla.size].Name, strtok(info, p));
strcpy(sla.arr[sla.size].Pwd, strtok(NULL, p));
sla.arr[sla.size].privilge = atoi(strtok(NULL, p));
sla.arr[sla.size].del = atoi(strtok(NULL, p));
sla.size++;
}
//关闭文件
fclose(pf);
pf = NULL;
}
//将管理员信息保存到文件中
void Savemanager()
{
//打开文件
FILE* pf = fopen("manager.txt", "w");
assert(pf);
//保存信息
int i;
for (i = 0; i < sla.size; i++)
{
fprintf(pf, "%s##%s##%d##%d\n", sla.arr[i].Name, sla.arr[i].Pwd, sla.arr[i].privilge, sla.arr[i].del);
}
//关闭文件
fclose(pf);
pf = NULL;
}
//将文件内容存放到链表中
void Fetchdate()
{
//打开文件
FILE* pf = fopen("card.txt", "r");
assert(pf);
//存放信息
if (cardlist != NULL)
{
lpCardnode cur[100];
int i = 0;
//cur[0] = (lpCardnode)malloc(sizeof(Cardnode));
assert(cur);
char time1[20];
char time2[20];
char time3[20];
//卡号##密码##状态##开卡时间##截止时间##累积金额##最后使用时间##使用次数##当前余额##删除标识
//cur->date.aName, cur->date.aPwd, & cur->date.nStatus, time1, time2, & cur->date.Totaluse, time3, & cur->date.Usecount, cur->date.Balance, & cur->date.nDel
char info[100];
char p[5] = "#.";
while(fgets(info,100,pf))
{
cur[i] = (lpCardnode)malloc(sizeof(Cardnode));
//解析文件信息
strcpy(cur[i]->date.aName, strtok(info, p));
strcpy(cur[i]->date.aPwd, strtok(NULL, p));
cur[i]->date.nStatus = atoi(strtok(NULL, p));
strcpy(time1, strtok(NULL, p));
strcpy(time2, strtok(NULL, p));
cur[i]->date.Totaluse = atoi(strtok(NULL, p));
cur[i]->date.Totaluse += atoi(strtok(NULL, p)) * 0.1;
strcpy(time3, strtok(NULL, p));
cur[i]->date.Usecount = atoi(strtok(NULL, p));
cur[i]->date.Balance = atoi(strtok(NULL, p));
cur[i]->date.Balance += atoi(strtok(NULL, p)) * 0.1;
cur[i]->date.nDel = atoi(strtok(NULL, p));
cur[i]->date.tStart = Stringtotime(time1);
cur[i]->date.tEnd = Stringtotime(time2);
cur[i]->date.tLast = Stringtotime(time3);
cardlist->next = cur[i];
cardlist = cardlist->next;
i++;
}
cardlist->next = NULL;
cardlist = head;
}
//关闭文件
fclose(pf);
pf = NULL;
}
//释放链表节点
void releaseCardlist()
{
lpCardnode cur;
if (head != NULL)
{
while (head->next != NULL)
{
cur = head;
head = head->next;
free(cur);
cur = NULL;
}
free(head);
head = NULL;
}
}
//销毁顺序表
void DestroySLAdm()
{
free(sla.arr);
sla.arr = NULL;
sla.capacity = sla.size = 0;
}
//添加卡
int Add()
{
printf("-----------添加卡----------\n");
lpCardnode cur = NULL;
assert(cardlist);
//initCardlist();
cur = (lpCardnode)malloc(sizeof(Cardnode));
if (cur == NULL)
{
printf("添加失败\n");
return 1;
}
else {
//将数据添加到链表中
char name[30] = { 0 }, pwd[30] = { 0 };
int t = 1;
do {
t = 1;
printf("请输入卡号(8~18):");
scanf("%s", name);
if (strlen(name) > 18 || strlen(name) < 8)
{
printf("卡号格式不对,请重新输入\n");
t = 0;
}
} while (t == 0);
strcpy(card.aName, name);
do {
t = 1;
printf("请输入密码(1~8):");
scanf("%s", pwd);
if (strlen(pwd) > 8)
{
printf("密码格式不对,请重新输入\n");
t = 0;
}
} while (t == 0);
strcpy(card.aPwd, pwd);
printf("请输入开卡金额:");
scanf("%lf", &card.Balance);
card.nStatus = 0;
card.Totaluse = 0;
card.Usecount = 0;
card.nDel = 0;
card.tStart = card.tLast = time(NULL);
card.tEnd = card.tStart + 360 * 24 * 60 * 60;
printf("添加成功\n");
printf("-----------卡信息------------\n");
printf("卡号\t\t密码\t\t卡状态\t余额\n");
printf("%s\t%s\t\t%d\t%.1f\n", card.aName, card.aPwd, card.nStatus, card.Balance);
cur->date = card;
cur->next = NULL;
//遍历链表找到最后一个节点
while (cardlist->next != NULL)
{
cardlist = cardlist->next;
}
cardlist->next = cur;
cardlist = head;
printf("添加成功\n");
return 0;
}
}
//查询卡
void Search()
{
lpCardnode cur = NULL;
if (cardlist != NULL)
{
char arr[20]={0}, aTime[20];
int t=0;
printf("-----------查询卡------------\n");
printf("请输入你要查询的卡号:");
scanf("%s", arr);
cur = cardlist->next;
while (cur != NULL)
{
if(strstr(cur->date.aName , arr)!=NULL)
//if (strcmp(arr, cur->date.aName) == 0)
{
Timetostring(cur->date.tLast, aTime);
if(t==0)
{
printf("已查到,信息如下\n");
printf("卡号\t\t状态\t余额\t累计使用金额\t使用次数\t上次使用时间\n");
}
printf("%s\t%d\t%.1f\t%.1f\t\t%d\t\t%s\n", cur->date.aName, cur->date.nStatus, cur->date.Balance, cur->date.Totaluse, cur->date.Usecount, aTime);
printf("\n");
t = 1;
}
cur = cur->next;
}
if (t == 0)
{
printf("未查询到您的卡号\n");
}
}
}
//上机
void On()
{
char name[20] = { 0 };
char pwd[8] = { 0 };
//接收卡号和密码
printf("请输入卡号(8~18):");
scanf("%s", name);
printf("请输入密码(1~8):");
scanf("%s", pwd);
//进行上机
doOn(name, pwd);
}
//进行上机功能
void doOn(char* name, char* pwd)
{
assert(name);
assert(pwd);
lpCardnode cur = NULL;
if (cardlist != NULL)
{
cur = cardlist->next;
int t = 0;
while (cur != NULL)
{
if (strcmp(cur->date.aName, name) == 0)//判断卡号密码是否正确
{
if (strcmp(cur->date.aPwd, pwd) == 0)
{
t = 1;
break;
}
else {
printf("密码错误\n");
}
t = 2;
}
cur = cur->next;
}
if (t == 1)
{
if (cur->date.nStatus == 1)
{
printf("该卡已上机\n");
}
else if (cur->date.Balance <= 0)
{
printf("余额不足,上机失败\n");
}else
{
cur->date.tOn = time(NULL);
fee.nStatus = 1;
strcpy(fee.aCardname, card.aName);
//更新卡信息
cur->date.Usecount++;
cur->date.nStatus = 1;
//显示上机卡信息
char aTime[20];
Timetostring(cur->date.tOn, aTime);
printf("----------已上机------------\n");
printf("卡号\t\t状态\t余额\t使用次数\t上机时间\n");
printf("%s\t%d\t%.1lf\t%d\t\t%s\n", cur->date.aName, cur->date.nStatus, cur->date.Balance, cur->date.Usecount, aTime);
}
}
else if(t==0){
printf("无该卡信息\n");
}
}
}
//下机
void Off()
{
char name[20] = { 0 };
char pwd[8] = { 0 };
//接收卡号和密码
printf("请输入卡号(8~18):");
scanf("%s", name);
printf("请输入密码(1~8):");
scanf("%s", pwd);
//进行下机
doOff(name, pwd);
}
//进行下机
void doOff(char* name, char* pwd)
{
assert(name);
assert(pwd);
lpCardnode cur = NULL;
if (cardlist != NULL)
{
cur = cardlist->next;
int t = 0;
while (cur != NULL)
{
if (strcmp(cur->date.aName, name) == 0)//判断卡号密码是否正确
{
if (strcmp(cur->date.aPwd, pwd) == 0)
{
t = 1;
break;
}
else {
printf("密码错误\n");
}
t = 2;
}
cur = cur->next;
}
if (t == 1)
{
if (cur->date.nStatus == 0)
{
printf("该卡已下机,请勿重复下机\n");
}else
{
cur->date.tLast = fee.tEnd = time(NULL);
fee.nStatus = 0;
//计算费用
if (sta.ratetype == 0)
{
fee.fAmount = (fee.tEnd - cur->date.tOn)*1.0 / (sta.unit * 60) * sta.charge;
}
else if (sta.ratetype == 1)
{
fee.fAmount = sta.night;
}
else {
fee.fAmount = sta.day;
}
strcpy(fee.aCardname, card.aName);
//更新卡信息
cur->date.nStatus = 0;
cur->date.Balance -= fee.fAmount;
cur->date.Totaluse += fee.fAmount;
//显示下机信息
char aTime[20];
Timetostring(fee.tEnd, aTime);
printf("----------已下机------------\n");
printf("卡号\t\t状态\t消费金额\t余额\t使用次数\t下机时间\n");
printf("%s\t%d\t%.1lf\t\t%.1lf\t%d\t\t%s\n", cur->date.aName, cur->date.nStatus, fee.fAmount, cur->date.Balance, cur->date.Usecount, aTime);
}
}
else if (t == 0)
{
printf("无该卡信息\n");
}
}
}
//充值
void Recharge()
{
char name[20] = { 0 };
char pwd[8] = { 0 };
printf("-------------充值---------------\n");
//接收卡号和密码
printf("请输入卡号(8~18):");
scanf("%s", name);
printf("请输入密码(1~8):");
scanf("%s", pwd);
//进行充值
doRecharge(name,pwd);
}
//进行充值
void doRecharge(char* name, char* pwd)
{
assert(name);
assert(pwd);
lpCardnode cur = NULL;
double money=0;
if (cardlist != NULL)
{
cur = cardlist->next;
int t = 0;
while (cur != NULL)
{
if (strcmp(cur->date.aName, name) == 0)//判断卡号密码是否正确
{
if (strcmp(cur->date.aPwd, pwd) == 0)
{
t = 1;
break;
}
else {
printf("密码错误\n");
}
t = 2;
}
cur = cur->next;
}
if (t == 1)
{
printf("请输入你要充值的金额:");
scanf("%lf", &money);
//更新卡信息
cur->date.Balance += money;
//显示充值信息
char aTime[20];
time_t Time = time(NULL);
Timetostring(Time, aTime);
printf("-----------充值成功------------\n");
printf("卡号\t\t状态\t充值金额\t余额\t使用次数\t充值时间\n");
printf("%s\t%d\t%.1lf\t\t%.1lf\t%d\t\t%s\n", cur->date.aName, cur->date.nStatus, money, cur->date.Balance, cur->date.Usecount, aTime);
}
else if (t == 0)
{
printf("无该卡信息\n");
}
}
}
//退费
void Refund()
{
char name[20] = { 0 };
char pwd[8] = { 0 };
printf("-------------退费---------------\n");
//接收卡号和密码
printf("请输入卡号(8~18):");
scanf("%s", name);
printf("请输入密码(1~8):");
scanf("%s", pwd);
//进行退费
doRefund(name, pwd);
}
//进行退费
void doRefund(char* name, char* pwd)
{
assert(name);
assert(pwd);
lpCardnode cur = NULL;
double money = 0;
if (cardlist != NULL)
{
cur = cardlist->next;
int t = 0;
while (cur != NULL)
{
if (strcmp(cur->date.aName, name) == 0)//判断卡号密码是否正确
{
if (strcmp(cur->date.aPwd, pwd) == 0)
{
t = 1;
break;
}
else {
printf("密码错误\n");
}
t = 2;
}
cur = cur->next;
}
if (t == 1)
{
printf("请输入你要退费的金额:");
scanf("%lf", &money);
if (money > cur->date.Balance)
{
printf("退费金额不足,已为您退掉所有余额\n");
money = cur->date.Balance;
}
//更新卡信息
cur->date.Balance -= money;
//显示充值信息
char aTime[20];
time_t Time = time(NULL);
Timetostring(Time, aTime);
printf("-----------退费成功------------\n");
printf("卡号\t\t状态\t退费金额\t余额\t使用次数\t退费时间\n");
printf("%s\t%d\t%.1lf\t\t%.1lf\t%d\t\t%s\n", cur->date.aName, cur->date.nStatus, money, cur->date.Balance, cur->date.Usecount, aTime);
}
else if (t == 0)
{
printf("无该卡信息\n");
}
}
}
//查询统计
void Addup()
{
if (sla.size == 0)
{
printf("请先添加管理员\n");
}
else {
//验证管理员
char mname[9] = {0};
char mpwd[9] = {0};
printf("------------验证管理员-------------\n");
//收集管理员信息
printf("请输入管理员昵称:");
scanf("%s", mname);
printf("请输入管理员密码:");
scanf("%s", mpwd);
//判断管理员身份
int i = 0;
int t = 0;
while (i < sla.size)
{
if (strcmp(sla.arr[i].Name, mname) == 0)//判断卡号密码是否正确
{
if (strcmp(sla.arr[i].Pwd, mpwd) == 0)
{
t = 1;
break;
}
else {
printf("密码错误\n");
}
t = 2;
}
i++;
}
if (t == 1 && sla.arr->privilge > 0)
{
lpCardnode cur = NULL;
double sum = 0;
int fre = 0;//总平台使用次数
int num = 0;//卡个数
if (cardlist != NULL)
{
cur = cardlist->next;
printf("-----------各卡信息------------\n");
printf("卡号\t\t状态\t累计使用金额\t余额\t使用次数\t截止时间\n");
while (cur != NULL)
{
sum += cur->date.Totaluse;
fre += cur->date.Usecount;
num++;
//显示各卡信息
char aTime[20];
Timetostring(cur->date.tEnd, aTime);
printf("%s\t%d\t%.1lf\t\t%.1lf\t%d\t\t%s\n", cur->date.aName, cur->date.nStatus, cur->date.Totaluse, cur->date.Balance, cur->date.Usecount,aTime);
cur = cur->next;
}
//统计信息
printf("------------统计-------------\n");
printf("总卡数\t总平台使用次数\t总营业额\n");
printf("%d\t%d\t\t%.1lf\n", num, fre, sum);
}
}
else if (t == 1 && sla.arr->privilge == 0)
{
printf("该管理员权限不足,需要一级管理员进行操作\n");
}
else if (t == 0)
{
printf("无该管理员信息\n");
}
}
}
//注销卡
void Logout()
{
if (sla.size == 0)
{
printf("请先添加管理员\n");
}
else {
char name[20] = { 0 };
char pwd[8] = { 0 };
//接收卡号和密码
printf("请输入卡号(8~18):");
scanf("%s", name);
printf("请输入密码(1~8):");
scanf("%s", pwd);
//进行删除
doLogout(name, pwd);
}
}
//进行删除卡
void doLogout(char* name, char* pwd)
{
assert(name);
assert(pwd);
//验证管理员
char mname[9] = {0};
char mpwd[9] = {0};
printf("------------验证管理员-------------\n");
//收集管理员信息
printf("请输入管理员昵称:");
scanf("%s", mname);
printf("请输入管理员密码:");
scanf("%s", mpwd);
//判断管理员身份
int i = 0;
int t = 0;
while (i < sla.size)
{
if (strcmp(sla.arr->Name, mname) == 0)//判断卡号密码是否正确
{
if (strcmp(sla.arr->Pwd, mpwd) == 0)
{
t = 1;
break;
}
else {
printf("密码错误\n");
}
t = 2;
}
i++;
}
if (t == 1 && sla.arr->privilge > 1)
{
lpCardnode cur = NULL;
double money = 0;
if (cardlist != NULL)
{
cur = cardlist->next;
int e = 0;
while (cur != NULL)
{
if (strcmp(cur->date.aName, name) == 0)//判断卡号密码是否正确
{
if (strcmp(cur->date.aPwd, pwd) == 0)
{
e = 1;
break;
}
else {
printf("密码错误\n");
}
e = 2;
}
cardlist = cur;
cur = cur->next;
}
if (e == 1)
{
//删除卡节点
cardlist->next = cur->next;///
free(cur);
cur = NULL;
cardlist = head;
printf("删除成功\n");
}
else if (e == 0)
{
printf("无该卡信息\n");
}
}
}
else if (t == 1 && sla.arr->privilge <= 1)
{
printf("该管理员权限不足,需要二级管理员进行操作\n");
}
else if (t == 0)
{
printf("无该管理员信息\n");
}
}
//退出
int exitApp()
{
//打开文件
FILE* pf = fopen("card.txt", "w");
if (pf == NULL)
{
perror("card.txt");
return 1;
}
//将信息输入文件
lpCardnode cur = NULL;
double sum = 0;
int fre = 0;//总平台使用次数
int num = 0;//卡个数
if (cardlist != NULL)
{
//fprintf(pf,"卡号\t\t密码\t状态\t总消费金额\t余额\t使用次数\t截止时间\n");
cur = cardlist->next;
while (cur != NULL)
{
char aTime1[20];
char aTime2[20];
char aTime3[20];
//重置卡信息
if (cur->date.nStatus == 1)
{
cur->date.tLast = fee.tEnd = time(NULL);
fee.nStatus = 0;
//计算费用
if (sta.ratetype == 0)
{
fee.fAmount = (fee.tEnd - cur->date.tOn)*1.0 / (sta.unit * 60) * sta.charge;
}
else if (sta.ratetype == 1)
{
fee.fAmount = sta.night;
}
else {
fee.fAmount = sta.day;
}
strcpy(fee.aCardname, card.aName);
//更新卡信息
cur->date.nStatus = 0;
cur->date.Balance -= fee.fAmount;
cur->date.Totaluse += fee.fAmount;
}
Timetostring(cur->date.tEnd, aTime1);//截止时间
Timetostring(cur->date.tStart, aTime2);//开卡时间
Timetostring(cur->date.tLast, aTime3);//最后使用时间
//卡号##密码##状态##开卡时间##截止时间##累积金额##最后使用时间##使用次数##当前余额##删除标识
fprintf(pf, "%s##%s##%d##%s##%s##%.1lf##%s##%d##%.1lf##%d\n", cur->date.aName,cur->date.aPwd, cur->date.nStatus,aTime2, aTime1, cur->date.Totaluse, aTime3, cur->date.Usecount, cur->date.Balance,cur->date.nDel);
cur = cur->next;
}
}
//关闭文件
fclose(pf);
pf = NULL;
//保存管理员信息
Savemanager();
//释放链表所有节点
releaseCardlist();
//销毁顺序表
DestroySLAdm();
return 0;
}
//权限管理
void Manage()
{
int a;
printf("------------权限管理-------------\n");
do {
Mmenu();//权限管理菜单
scanf("%d", &a);
Mselect(a);
} while (a != 0);
printf("已退出权限管理\n");
}
//添加管理员
void Madd()
{
printf("------------添加管理员-------------\n");
//printf("注:管理员人数不超过%d人!(包括已删除人员)\n", NAMD_MAX);
//if (nadm >= NAMD_MAX)
//{
// printf("管理员人数超限!\n");
//}
//else {
SLAdmCheckCapacity();
char name[9] = { 0 }, pwd[9] = { 0 };
int t = 1;
do {
t = 1;
printf("请输入昵称(1~8):");
scanf("%s", name);
if (strlen(name) > 8)
{
printf("昵称格式不对,请重新输入\n");
t = 0;
}
} while (t == 0);
strcpy(sla.arr[sla.size].Name, name);
do {
t = 1;
printf("请输入密码(1~8):");
scanf("%s", pwd);
if (strlen(pwd) > 8)
{
printf("密码格式不对,请重新输入\n");
t = 0;
}
} while (t == 0);
strcpy(sla.arr[sla.size].Pwd, pwd);
printf("请输入管理员权限等级(0级无权限,1级可以查询统计,2级可以注销卡,更改计费标准):");
scanf("%d", &sla.arr[sla.size].privilge);
sla.arr[sla.size].del = 0;
sla.size++;
/*nadm++;*/
//}
}
//删除管理员
void Mlogout()
{
char name[9];
char pwd[9];
printf("------------删除管理员-------------\n");
//比对管理员信息
printf("请输入要删除的管理员昵称:");
scanf("%s", name);
printf("请输入要删除的管理员密码:");
scanf("%s", pwd);
//删除管理员
doMlogout(name, pwd);
}
//进行删除管理员
void doMlogout(char* name, char* pwd)
{
assert(name);
assert(pwd);
int i = 0;
int t = 0;
while (i<sla.size)
{
if (strcmp(sla.arr[i].Name, name) == 0)//判断卡号密码是否正确
{
if (strcmp(sla.arr[i].Pwd, pwd) == 0)
{
t = 1;
break;
}
else {
printf("密码错误\n");
}
t = 2;
}
i++;
}
if (t == 1)
{
sla.arr[i].del = 1;
printf("已完成删除\n");
}
else if (t == 0)
{
printf("无该管理员信息\n");
}
}
//设置管理权限
void Stlevel()
{
char name[9];
char pwd[9];
printf("------------设置管理员权限-------------\n");
//比对管理员信息
printf("请输入管理员昵称:");
scanf("%s", name);
printf("请输入管理员密码:");
scanf("%s", pwd);
//设置
doStlevel(name,pwd);
}
//进行设置管理员权限
void doStlevel(char* name, char* pwd)
{
assert(name);
assert(pwd);
int i = 0;
int t = 0;
while (i < sla.size)
{
if (strcmp(sla.arr[i].Name, name) == 0)//判断卡号密码是否正确
{
if (strcmp(sla.arr[i].Pwd, pwd) == 0)
{
t = 1;
break;
}
else {
printf("密码错误\n");
}
t = 2;
}
i++;
}
if (t == 1)
{
printf("当前%s管理员等级为%d,您要将其改为:", sla.arr[i].Name,sla.arr[i].privilge);
scanf("%d", &sla.arr[i].privilge);
printf("修改成功\n");
}
else if (t == 0)
{
printf("无该人员信息\n");
}
}
//管理员列表
void Msearch()
{
printf("------------管理员列表-------------\n");
if (sla.size == 0)
{
printf("暂无管理员\n");
}
else {
int i;
for (i = 0; i < sla.size; i++)
{
printf("昵称\t权限等级\t删除标志\n");
printf("%s\t%d\t\t%d\n", sla.arr[i].Name, sla.arr[i].privilge, sla.arr[i].del);
}
}
}
//计费标准管理
void Str()
{
printf("---------------------------------------\n");
printf("最小计费单元: %d分钟\n", sta.unit);
printf("每个计费单元的收费: %.1lf元\n", sta.charge);
printf("收费类别: %d (0-普通收费,1-包夜,2-包天)\n", sta.ratetype);
printf("包夜收费: %.1lf元\n", sta.night);
printf("包天收费: %.1lf元\n", sta.day);
printf("---------------------------------------\n");
if (sla.size == 0)
{
printf("暂无管理员,管理员可修改\n");
}
else {
//验证管理员
char mname[9] = { 0 };
char mpwd[9] = { 0 };
printf("------------验证管理员-------------\n");
//收集管理员信息
printf("请输入管理员昵称:");
scanf("%s", mname);
printf("请输入管理员密码:");
scanf("%s", mpwd);
//判断管理员身份
int i = 0;
int t = 0;
while (i < sla.size)
{
if (strcmp(sla.arr[i].Name, mname) == 0)//判断卡号密码是否正确
{
if (strcmp(sla.arr[i].Pwd, mpwd) == 0)
{
t = 1;
break;
}
else {
printf("密码错误\n");
}
t = 2;
}
i++;
}
if (t == 1 && sla.arr[i].privilge > 1)
{
int a;
do {
Cmenu();
scanf("%d", &a);
Cselect(a);
} while (a != 0);
printf("已退出计费标准管理\n");
}
else if (t == 1 && sla.arr[i].privilge <= 1)
{
printf("该管理员权限不足,需要二级管理员进行操作\n");
}
else if (t == 0)
{
printf("无该管理员信息\n");
}
}
}
tool.c 用于存放相关工具函数的定义
#define _CRT_SECURE_NO_WARNINGS 1
#include"func.h"
//将时间戳转化为字符串
void Timetostring(time_t t, char* pBuf)
{
struct tm* p;
p = localtime(&t);
strftime(pBuf, 20, "%Y-%m-%d %H:%M", p);
}
//将字符串转化为时间戳
time_t Stringtotime(char* timeStr) {
assert(timeStr);
struct tm time = {0};
struct tm* timeinfo=&time;
/*assert(timeinfo);*/
time_t timeStamp;
int year;
int hour;
int mon;
sscanf(timeStr, "%d-%d-%d %d:%d", &year, &mon, &timeinfo->tm_mday, &hour, &timeinfo->tm_min);
timeinfo->tm_year = year-1900;
timeinfo->tm_hour = hour;
timeinfo->tm_mon = mon-1;
timeStamp = mktime(timeinfo);
return timeStamp;
}
main.c 程序实现的整体结构,main函数
#define _CRT_SECURE_NO_WARNINGS 1
//#include"test.h"
#include<stdio.h>
int main()
{
int a;
printf("欢迎进入计费管理系统!\n");
initSta();//初始化计费标准
initCardlist();//初始化链表
initSLAdm();//初始化顺序表
Fetchdate();//将文件中的内容读取到链表中
Fetchmanager();//将管理员文件中的内容保存到数组中
do {
Outputmenu();
scanf("%d", &a);
Select(a);
} while (a != 0);
printf("已退出\n");
return 0;
}
menu.c 存放各种输出菜单的函数
#define _CRT_SECURE_NO_WARNINGS 1
#include"func.h"
void Outputmenu(void)
{
printf("************ 菜单 *************\n");
printf("1.添加卡\n");
printf("2.查询卡\n");
printf("3.注销卡\n");
printf("4.上机\n");
printf("5.下机\n");
printf("6.充值\n");
printf("7.退费\n");
printf("8.查询统计\n");
printf("9.权限管理\n");//添加,删除管理员
printf("10.计费标准管理\n");
printf("0.退出\n");
printf("请选择菜单项编号0~10\n");
}
//权限管理菜单
void Mmenu()
{
printf("********** 权限管理菜单 ***********\n");
printf("1.添加管理员\n");
printf("2.删除管理员\n");
printf("3.设置管理权限\n");
printf("4.查询管理员\n");
printf("0.退出\n");
printf("请选择菜单项编号0~4\n");
}
//计费标准菜单
void Cmenu(){
printf("*********** 计费标准菜单 **********\n");
printf("1.修改最小计费单元\n");
printf("2.修改每个计费单元的收费\n");
printf("3.修改收费类别\n");
printf("4.修改包夜收费\n");
printf("5.修改包天收费\n");
printf("0.退出\n");
printf("请选择菜单项编号0~5\n");
}
select.c 存放各种需要switch-case的函数
#define _CRT_SECURE_NO_WARNINGS 1
#include"func.h"
extern Sta sta;
void Select(int a)
{
switch (a)
{
case 1:Add(); break;
case 2:Search(); break;
case 3:Logout(); break;
case 4:On(); break;
case 5:Off(); break;
case 6:Recharge(); break;//充值
case 7:Refund(); break;//退费
case 8:Addup(); break;//查询统计
case 9:Manage(); break;//权限管理
case 10:Str(); break;//计费标准管理
case 0:exitApp(); break;
default:
printf("输入错误,请重新输入\n");
break;
}
}
void Mselect(int a)
{
switch (a)
{
case 1:Madd(); break;//添加管理员
case 2:Mlogout(); break;//删除管理员
case 3:Stlevel(); break;//设置管理权限
case 4:Msearch(); break;//查询管理员列表
case 0:break;
default:
printf("输入错误,请重新输入\n");
break;
}
}
void Cselect(int a)
{
switch (a)
{
case 1:
printf("当前最小计费单元为:%d分钟\n", sta.unit);
printf("您要将其改为:");
scanf("%d", &sta.unit);
printf("修改成功\n");
break;
case 2:
printf("当前每个计费单元的收费为:%.1lf\n", sta.charge);
printf("您要将其改为:");
scanf("%lf", &sta.charge);
printf("修改成功\n");
break;
case 3:
printf("当前收费类别为:%d (0-普通收费,1-包夜,2-包天)\n", sta.ratetype);
printf("您要将其改为:");
scanf("%d", &sta.ratetype);
printf("修改成功\n");
break;
case 4:
printf("当前包夜收费为:%.1lf\n", sta.night);
printf("您要将其改为:");
scanf("%lf", &sta.night);
printf("修改成功\n");
break;
case 5:
printf("当前包天收费为:%.1lf\n", sta.day);
printf("您要将其改为:");
scanf("%lf", &sta.day);
printf("修改成功\n");
break;
case 0: break;
default:printf("输入错误,请重新输入\n");
break;
}
}
card.txt 卡信息文本文件
类似存储:
11111111##1111##0##2024-04-04 00:24##2025-03-30 00:24##2.6##2024-04-04 20:50##5##108.4##0
manager.txt 管理员信息文本文件
类似存储:
aa##aa##2##0
bb##bb##1##0
--------------------------------------------------------------------------------------------------------------------------------
以上代码仅供参考(因为感觉写的有点挫,但功能实现是没问题的)