1.话不多说,先上代码
test.c
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
#include <stdlib.h>
#include<direct.h>
#include"menu.h"
#define danjia 0.100000 //单价0.1元每秒
//限制营业额统计的时间段
time_t stringToTime(char* pTime)
{
struct tm tml;
time_t time1;
scanf_s(pTime, "%d-%d-%d %d:%d", &tml.tm_year, &tml.tm_mon, &tml.tm_mday, &tml.tm_hour, &tml.tm_min);
tml.tm_year -= 1900; //年份为从1900年开始
tml.tm_mon -= 1; //月份为1^11
tml.tm_sec = 0;
tml.tm_isdst -= -1;
time1 = mktime(&tml);
//mktime()用来将参数tml 所指的tm 结构数据转换成从公元1970 年1 月1 日0 时0 分0 秒算起至今的UTC 时间所经过的秒数
return time1;
}
//上机结构体
struct Card
{
char aName[11]; // 卡号
char aPwd[8]; // 密码
int nStatus; // 卡状态(0-未上机;1-正在上机;2-已注销)
time_t tStart; // 开卡时间
time_t tEnd; // 卡的截止时间
float fTotalUse; // 累计金额
time_t tLast; // 最后使用时间
int nUseCount; // 使用次数
float fBalance; // 余额
int nDel; // 删除标识 0-未删除,1-删除
};
struct Node
{
struct Card data;
struct Node* next;
};
struct Node* list = NULL;
//创建表头:表头就是一个结构体变量
struct Node* creatHead() //在添加卡时起作用
{
//动态内存申请
struct Node* headNode = (struct Node*)malloc(sizeof(struct Node));
headNode->next = NULL;
return headNode;
}
//创造节点:为插入作准备
//把用户的数据变为结构体变量
struct Node* creatNode(struct Card data)
{
//动态内存申请
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data; //为新卡添加数据
newNode->next = NULL; //将下一张卡空间清理,便于添加
return newNode;
}
//插入
void insertNodeByHead(struct Node* headNode, struct Card data)
{
//必须先连接后断开
struct Node* newNode = creatNode(data);
newNode->next = headNode->next;
headNode->next = newNode;
}
//上机结构体
struct shangji
{
char aName[11]; // 卡号
time_t tStart; // 上机时间
float fBalance; // 余额
int zhuangtai; //结算状态:0-未结算;1-已结算
};
struct shang
{
struct shangji data;
struct shang* next;
};
struct shang* list2 = NULL;
//创建表头:表头就是一个结构体变量
struct shang* creatHeadshang()
{
//动态内存申请
struct shang* headshang = (struct shang*)malloc(sizeof(struct shang));
headshang->next = NULL;
return headshang;
}
//创造节点:为插入作准备
//把用户的数据变为结构体变量
struct shang* creatshang(struct shangji data)
{
//动态内存申请
struct shang* newshang = (struct shang*)malloc(sizeof(struct shang));
newshang->data = data;
newshang->next = NULL;
return newshang;
}
//插入
void insertshangByHead(struct shang* headshang, struct shangji data)
{
//必须先连接后断开
struct shang* newshang = creatshang(data);
newshang->next = headshang->next;
headshang->next = newshang;
}
//下机信息结构体
struct xiaji
{
char aName[11]; // 卡号
time_t tStart; // 上机时间
float fAmount; // 消费金额
time_t tEnd; // 下机时间
float fBalance; // 余额
int zhuangtai; //结算状态:0-未结算;1-已结算
};
struct xia
{
struct xiaji data;
struct xia* next;
};
struct xia* list3 = NULL;
//创建表头:表头就是一个结构体变量
//创造节点:为插入作准备
//把用户的数据变为结构体变量
struct xia* creatHeadxia()
{
//动态内存申请
struct xia* headxia = (struct xia*)malloc(sizeof(struct xia));
headxia->next = NULL;
return headxia;
}
struct xia* creatxia(struct xiaji data)
{
//动态内存申请
struct xia* newxia = (struct xia*)malloc(sizeof(struct xia));
newxia->data = data;
newxia->next = NULL;
return newxia;
}
void insertxiaByHead(struct xia* headxia, struct xiaji data)
{
//必须先连接后断开
struct xia* newxia = creatxia(data);
newxia->next = headxia->next;
headxia->next = newxia;
}
//充退费结构体
struct Money
{
char aName[11]; // 卡号
int nStatus; // 卡状态(0表示充值;1表示退费;)
time_t tTime; // 时间
float fMoney; // 充值退费金额
int nDel; // 删除标识 0-未删除,1-删除
};
struct chongtuifei
{
struct Money data;
struct chongtuifei* next;
};
struct chongtuifei* list4 = NULL;
//创建表头:表头就是一个结构体变量
struct chongtuifei* creatHeadchongtuifei()
{
//动态内存申请
struct chongtuifei* headchongtuifei = (struct chongtuifei*)malloc(sizeof(struct chongtuifei));
headchongtuifei->next = NULL;
return headchongtuifei;
}
struct chongtuifei* creatchongtuifei(struct Money data)
{
//动态内存申请
struct chongtuifei* newchongtuifei = (struct chongtuifei*)malloc(sizeof(struct chongtuifei));
newchongtuifei->data = data;
newchongtuifei->next = NULL;
return newchongtuifei;
}
void insertchongtuifeiByHead(struct chongtuifei* headchongtuifei, struct Money data)
{
//必须先连接后断开
struct chongtuifei* newchongtuifei = creatchongtuifei(data);
newchongtuifei->next = headchongtuifei->next;
headchongtuifei->next = newchongtuifei;
}
//指定位删除函数
void deleteNodeByData(struct Node* headNode, char* cardname)
{
struct Node* posLeftNode = headNode;
struct Node* posNode = headNode->next;
//卡名是字符串,要用字符串比较函数
while (posNode != NULL && strcmp(posNode->data.aName, cardname))
{
posLeftNode = posNode;
posNode = posLeftNode->next;
}
//讨论查找结果
if (posNode == NULL)
return;
else
{
posLeftNode->data = posNode->data;
free(posNode); //释放空间
posNode = NULL;
}
}
//查找卡信息函数
struct Node* searchByName(struct Node* headNode, char* CardaName)
{
struct Node* posNode = headNode->next;
while (posNode != NULL && strcmp(posNode->data.aName, CardaName))
{
posNode = posNode->next;
}
return posNode;
}
//time_t实际上是长整型,到未来的某一天,从一个时间点(一般是1970年1月1日0时0分0秒)到那时的秒数(即日历时间)
void timeToString(time_t t, char* pBuf)
{
struct tm* timeinfo;
timeinfo = localtime(&t);
//localtime函数:用于将时间戳(time_t 类型的值)转换为本地时间的日期和时间表示
//它返回一个指向 struct tm 结构体的指针,该结构体包含了年、月、日、时、分、秒等时间信息
strftime( pBuf, 20, "%Y-%m-%d %H:%M", timeinfo);
// 表示返回的时间字符串 要写入的字节的最大数量 格式字符串由零个或多个转换符和普通字符(除%) 输入时间
}
//统计一段时间的营业额
void tongji(struct xia* headxia)
{
char a[6];
struct xia* aMove = headxia->next;
float all = 0;
long long int kaishi;
long long int jiezhi;
char shangxian[21];
char xiaxian[21];
printf("请输入起始时间如2010-10-01 12:11\n");
gets_s(a, 6);
gets_s(shangxian, 20);
printf("请输入截至时间如2010-10-01 12:11\n");
gets_s(xiaxian, 20);
kaishi = stringToTime(shangxian);
jiezhi = stringToTime(xiaxian);
while (aMove != NULL)
{
if (aMove->data.tEnd <= jiezhi && aMove->data.tEnd >= kaishi)
{
//计算某个时间段营业额
all = all + aMove->data.fAmount;
}
else
{
}
aMove = aMove->next;
}
printf("营业额:%f\n", all);
}
//打印账单
void printflist3(struct xia* headxia)
{
struct xia* pMove = headxia->next;
int i = 0;
while (pMove != NULL)
{
char a[20];
char b[20];
timeToString(pMove->data.tStart, a);
timeToString(pMove->data.tEnd, b);
printf("卡号\t\t上机时间\t消费金额\t\t下机时间\t\t 余额\t\t状态\n");
printf("%s\t %s\t%f\t %s\t\t %f\t\t %d\n", pMove->data.aName, a, pMove->data.fAmount, b, pMove->data.fBalance, pMove->data.zhuangtai);
pMove = pMove->next;
}
}
//打印卡信息函数
void printList(struct Node* headNode)
{
struct Node* pMove = headNode->next;
int i = 0;
while (pMove != NULL)
{
char a[20];
char b[20];
char c[20];
timeToString(pMove->data.tStart, a);
timeToString(pMove->data.tEnd, b);
timeToString(pMove->data.tLast, c);
printf("\n");
printf("卡号\t\t密码\t 上机状态\t 余额\t\t\t累 计 金 额\t使用次数\t开 卡 时 间\t 上次使用时间\t 截至时间 删除标识符\n");
printf("%-12s\t%s\t %d\t\t%10f\t %15f\t %d\t\t%s %s %s %d\n", pMove->data.aName, pMove->data.aPwd,
pMove->data.nStatus, pMove->data.fBalance, pMove->data.fTotalUse, pMove->data.nUseCount, a, c, b, pMove->data.nDel);
i++;
pMove = pMove->next;
}
printf("\n");
printf("\n");
printf("卡的总个数:%d\n", i);
printf("\n");
printf("\n");
}
//存储数据函数
void saveInfoToFile(const char*fileName, struct Node* headNode)
{
FILE* fp = fopen("E:/CC/file/data/d.txt", "w");//创建一个文件指针并打开文间,'w'代表写入
struct Node* pMove = headNode->next;
while (pMove != NULL)
{
//存储数据,fprintf()函数用于在文件流上写入参数声明字符串
//通过fprintf()函数,我们可以将值写入或存储在字符串中
fprintf(fp, "%s\t%s\t%d\t%f\t%d\t%f\t%d\t%lld\t%lld\t\t%lld\n",
pMove->data.aName, pMove->data.aPwd, pMove->data.nStatus,
pMove->data.fBalance, pMove->data.nDel, pMove->data.fTotalUse,
pMove->data.nUseCount, pMove->data.tStart, pMove->data.tLast, pMove->data.tEnd);
pMove = pMove->next;
}
//关闭文件
fclose(fp);
}
//读取数据函数
void readInfoToFile(const char* fileName, struct Node* headNode)
{
FILE* fp = fopen("E:/CC/file/data/d.txt", "r");//以只读的方式打开文件
if (fp == NULL)
{
fp = fopen(fileName, "w+");//具有创建的方式打开文件可读可写
}
struct Card tempData;
//fscanf()函数从指定流stream中获取输入
while (fscanf(fp, "%s\t%s\t%d\t%f\t%d\t%f\t%d\t%lld\t%lld\t\t%lld\n",
tempData.aName, tempData.aPwd, &tempData.nStatus, &tempData.fBalance,
&tempData.nDel, &tempData.fTotalUse, &tempData.nUseCount, &tempData.tStart, &tempData.tLast, &tempData.tEnd) != EOF)
{
insertNodeByHead(list, tempData);
}
fclose(fp);
}
//存储上机数据函数
void saveshangjiFile(const char* fileName, struct shangji shang)
{
FILE* fp = fopen("E:/CC/file/data/d.txt", "a");//创建一个文件指针并打开文间
fprintf(fp, "%s\t\t%lld\t\t%f\t%d\n", shang.aName, shang.tStart, shang.fBalance, shang.zhuangtai);//存储数据
fclose(fp);
}
//读取上机数据函数
void readshangFile(const char* fileName, struct shang* headshang)
{
FILE* fp = fopen("E:/CC/file/data/d.txt", "r");//以读的方式打开文件
if (fp == NULL)
{
fp = fopen("E:/CC/file/data/d.txt", "w+");//具有创建的方式打开文件可读可写
}
struct shangji tempData;
while (fscanf(fp, "%s\t\t%lld\t\t%f\t%d\n",
tempData.aName, &tempData.tStart, &tempData.fBalance, &tempData.zhuangtai) != EOF)
{
insertshangByHead(list2, tempData);
}
fclose(fp);
}
//存储下机数据函数
void savexiajiFile(const char* fileName, struct xiaji xia)
{
FILE* fp = fopen("E:/CC/file/data/d.txt", "a");//创建一个文件指针并打开文间
fprintf(fp, "%s\t\t%lld\t\t%f\t\t%lld\t\t%f\t\t%d\n", xia.aName, xia.tStart, xia.fAmount, xia.tEnd, xia.fBalance, xia.zhuangtai);
fclose(fp);
}
//读取下机数据函数
void readxiaFile(const char* fileName, struct xia* headxia)
{
FILE* fp = fopen("E:/CC/file/data/d.txt", "r");//以读的方式打开文件
if (fp == NULL)
{
fp = fopen("E:/CC/file/data/d.txt", "w+");//具有创建的方式打开文件可读可写
}
struct xiaji tempData;
while (fscanf(fp, "%s\t\t%lld\t\t%f\t\t%lld\t\t%f\t\t%d\n", tempData.aName, &tempData.tStart, &tempData.fAmount, &tempData.tEnd, &tempData.fBalance, &tempData.zhuangtai) != EOF)
{
insertxiaByHead(list3, tempData);
}
fclose(fp);
}
void savechongtuifeiFile(const char* fileName, struct Money chongtuifei)
{
FILE* fp = fopen("E:/CC/file/data/d.txt", "a");//创建一个文件指针并打开文间
fprintf(fp, "%s\t%f\t%d\t%d\t%lld\n", chongtuifei.aName, chongtuifei.fMoney, chongtuifei.nDel, chongtuifei.nStatus, chongtuifei.tTime);
fclose(fp);
}
//存储充退费数据
void readchongtuifeiFile(const char* fileName, struct chongtuifei* headchongtuifei)
{
FILE* fp = fopen("E:/CC/file/data/d.txt", "r");//以读的方式打开文件
if (fp == NULL)
{
fp = fopen("E:/CC/file/data/d.txt", "w+");//具有创建的方式打开文件可读可写
}
struct Money tempData;
while (fscanf(fp, "%s\t%f\t%d\t%d\t%lld\n", tempData.aName, &tempData.fMoney, &tempData.nDel, &tempData.nStatus, &tempData.tTime) != EOF)
{
insertchongtuifeiByHead(list4, tempData);
}
fclose(fp);
}
void keyDown()
{
float chongzhijine; //充值金额
long long int alltime; //总耗时
int nSelection = -1;
struct Card tempCard; //产生一个临时变量
struct shangji tempshangji; //产生一个临时变量
struct xiaji tempxiaji; //产生一个临时变量
struct Money tempchongtuifei; //产生一个临时变量
struct Node* result = NULL; //产生一个临时变量
int flag = 1;
scanf_s("%d", &nSelection); //检查序号是否正确
if (nSelection > 11)
{
printf("输入的序号错误,请重新输入序号");
}
else
{
switch (nSelection)
{
case 1://添加卡
for (; flag == 1;)
{
flag = 0;
printf("请你输入卡号【1-18】:");
scanf_s("%s", tempCard.aName, 20);
printf("请你输入密码【1-8】:");
scanf_s("%s", tempCard.aPwd, 16);
printf("请你输入开卡金额(RMB):");
scanf_s("%f", &tempCard.fBalance);
tempCard.nStatus = 0;
tempCard.nDel = 0;
tempCard.nUseCount = 0;
tempCard.fTotalUse = 0;
int nNamesize = strlen(tempCard.aName);//检查卡号和密码是否符和要求
int naPwdsize = strlen(tempCard.aPwd);
result = searchByName(list, tempCard.aName);//连入链表查找卡号,判断卡号是否重复
if (result == NULL)
{
}
else
{
printf("该卡号已存在,请选择其它卡号,请重新添加\n");
flag = 1;
}
if (nNamesize > 18 || naPwdsize > 8)//规范卡号和密码
{
printf("卡号或密码不符合规范!请重新添加卡\n");
flag = 1;
}
}
//获取时间
tempCard.tStart = time(NULL);
tempCard.tLast = time(NULL);
tempCard.tEnd = tempCard.tStart + 31536000;
printf("卡号\t\t密码\t\t上机状态\t\t开卡金额\t\t累计金额\t\t使用次数\n");
printf("%-10s\t%-8s\t %d\t\t\t%f\t\t %f\t\t %d\n", tempCard.aName, tempCard.aPwd, tempCard.nStatus, tempCard.fBalance, tempCard.fTotalUse, tempCard.nUseCount);
insertNodeByHead(list, tempCard);//将卡信息连入链表
saveInfoToFile("Card.txt", list);
break;
case 2:
printf("请输人要查询的卡号【1-18】:");//查询卡信息
scanf_s("%s", tempCard.aName, 15);
result = searchByName(list, tempCard.aName);
if (result == NULL)
{
printf("未找到此卡,请重新查询\n");
}
else
{
if (result->data.nStatus == 2) { printf("该卡已注销\n"); }
else
{
char c[20];
timeToString(result->data.tLast, c);
printf("卡号\t上机状态\t 余额\t\t 删处标记\t 累计金额\t\t使用次数\t 上次使用时间\n");
printf("%s\t %d\t\t %f\t\t %d\t\t %f\t\t %d\t\t%s\n", result->data.aName, result->data.nStatus, result->data.fBalance, result->data.nDel, result->data.fTotalUse, result->data.nUseCount, c);
}
}
break;
case 3:
printf("上机\n");//上机
printf("请你输入卡号【1-18】:");
scanf_s("%s", tempCard.aName, 20);
printf("请你输入密码【1-8】:");
scanf_s("%s", tempCard.aPwd, 16);
result = searchByName(list, tempCard.aName);
if (result == NULL)
{
printf("卡号错误,请重新输入卡号\n");
}
else
{
if (result->data.nStatus == 2 || result->data.nStatus == 1) { printf("该卡已注销或该卡已上机,请重新操作\n"); }
else {
if (strcmp(result->data.aPwd, tempCard.aPwd) == 0)
{
if (result->data.fBalance <= 0) { printf("余额不足,请充值后再上机"); }
else
{
printf("上机成功\n");
tempCard.tLast = time(NULL);
tempshangji.tStart = tempCard.tLast;
tempshangji.fBalance = result->data.fBalance;
tempshangji.zhuangtai = 0;
int i;
for (i = 0; i < 11; i++)
tempshangji.aName[i] = '\0';
for (i = 0; tempCard.aName[i]; i++)
tempshangji.aName[i] = tempCard.aName[i];
result->data.tLast = tempCard.tLast;
result->data.nStatus = 1;
saveInfoToFile("Card.txt", list);
insertshangByHead(list2, tempshangji);//将卡信息连入链表
saveshangjiFile("shangji.txt", tempshangji);
char a[20];
timeToString(result->data.tStart, a);
printf("卡号\t上机时间\t\t余额\n");
printf("%s\t%s\t%f\n", tempshangji.aName, a, tempshangji.fBalance);
}
}
else
{
printf("密码错误 请重新输入账号密码\n");
}
}
}
break;
case 4:
printf("下机");//下机
printf("请你输入卡号【1-18】:");
scanf_s("%s", tempCard.aName, 20);
printf("请你输入密码【1-8】:");
scanf_s("%s", tempCard.aPwd, 16);
result = searchByName(list, tempCard.aName);
if (result == NULL)
{
printf("卡号错误,请重新输入卡号\n");
}
else
{
if (result->data.nStatus == 2 || result->data.nStatus == 0) { printf("该卡已注销或该卡未上机\n"); }
else {
if (strcmp(result->data.aPwd, tempCard.aPwd) == 0)
{
printf("下机成功\n");
tempxiaji.tStart = result->data.tLast;
tempCard.tLast = time(NULL);
tempxiaji.tEnd = tempCard.tLast;
tempCard.fBalance = result->data.fBalance;
alltime = (tempCard.tLast) - (result->data.tLast);//计算上机时长
result->data.fBalance = tempCard.fBalance - alltime * danjia;
result->data.tLast = tempCard.tLast;
tempCard.nUseCount = result->data.nUseCount;
result->data.nUseCount = tempCard.nUseCount + 1;
result->data.nStatus = 0;
result->data.fTotalUse = result->data.fTotalUse + alltime * danjia;
int i;
for (i = 0; i < 11; i++)
tempxiaji.aName[i] = '\0';
for (i = 0; tempCard.aName[i]; i++)
tempxiaji.aName[i] = tempCard.aName[i];
tempxiaji.fAmount = alltime * danjia;
tempxiaji.fBalance = result->data.fBalance;
tempxiaji.zhuangtai = 1;
saveInfoToFile("Card.txt", list);
insertxiaByHead(list3, tempxiaji);
savexiajiFile("xiaji.txt", tempxiaji);
char a[20];
char b[20];
timeToString(tempxiaji.tStart, a);
timeToString(tempxiaji.tEnd, b);
printf("卡号\t\t上机时间\t\t消费金额\t\t下机时间\t\t余额\t\t结算状态\n");
printf("%s\t %s\t\t%f\t\t%s\t%f\t %d\n", tempxiaji.aName, a, tempxiaji.fAmount, b, tempxiaji.fBalance, tempxiaji.zhuangtai);
}
else
{
printf("密码错误 请重新输入账号密码\n");
}
}
}
break;
case 5:
printf("充值");//充值
printf("请输人充值的卡号:");//查询卡卡号
scanf_s("%s", tempCard.aName, 15);
result = searchByName(list, tempCard.aName);
if (result == NULL)
{
printf("未找到此卡,请重新充值\n");
}
else
{
if (result->data.nStatus == 2) { printf("该卡已注销,无法充值\n"); }
else
{
int i;
printf("请你输入充值金额(RMB):");
scanf_s("%f", &chongzhijine);
result->data.fBalance = result->data.fBalance + chongzhijine;
saveInfoToFile("Card.txt", list);
printf("充值成功\n你的充值金额为:%f\n", chongzhijine);
tempchongtuifei.fMoney = chongzhijine;
for (i = 0; i < 11; i++)
tempchongtuifei.aName[i] = '\0';
for (i = 0; tempCard.aName[i]; i++)
tempchongtuifei.aName[i] = tempCard.aName[i];
tempchongtuifei.nDel = 0;
tempchongtuifei.nStatus = 0;
tempchongtuifei.tTime = time(NULL);
insertchongtuifeiByHead(list4, tempchongtuifei);
savechongtuifeiFile("chongtuifei.txt", tempchongtuifei);
}
}
break;
case 6:
printf("退费");//退费
printf("请你输入要退费的卡号【1-18】:");
scanf_s("%s", tempCard.aName, 20);
printf("请你输入密码【1-8】:");
scanf_s("%s", tempCard.aPwd, 16);
result = searchByName(list, tempCard.aName);
if (result == NULL)
{
printf("卡号错误,请重新输入卡号\n");
}
else
{
if (result->data.nStatus == 2 || result->data.nStatus == 1 || result->data.fBalance < 0)
{
printf("退费失败\n");
}
else
{
int i;
printf("退费成功\n");
printf("退费金额为:%f\n", result->data.fBalance);
tempchongtuifei.fMoney = result->data.fBalance;
for (i = 0; i < 11; i++)
tempchongtuifei.aName[i] = '\0';
for (i = 0; tempCard.aName[i]; i++)
tempchongtuifei.aName[i] = tempCard.aName[i];
tempchongtuifei.nDel = 0;
tempchongtuifei.nStatus = 1;
tempchongtuifei.tTime = time(NULL);
insertchongtuifeiByHead(list4, tempchongtuifei);
savechongtuifeiFile("chongtuifei.txt", tempchongtuifei);
result->data.fBalance = 0;
saveInfoToFile("Card.txt", list);
}
/*printf("请你输入退款金额\n");
scanf_s("%f",&tuifeijine);
if (result->data.fBalance < tuifeijine)
{
printf("余额不足,请重新退款\n");
}
else
{
result->data.fBalance = result->data.fBalance - tuifeijine;
saveInfoToFile("Card.txt", list);
printf("退款金额为:%lf\n余额为:%f",tuifeijine, result->data.fBalance);
}*/
}
break;
case 7:printf("注销卡");//注销卡
printf("请你输入要注销的卡号【1-18】:");
scanf_s("%s", tempCard.aName, 20);
printf("请你输入密码【1-8】:");
scanf_s("%s", tempCard.aPwd, 16);
result = searchByName(list, tempCard.aName);
if (result == NULL)
{
printf("卡号错误,请重新输入卡号\n");
}
else
{
if (result->data.nStatus == 1)
{
printf("注销失败\n");
}
else
{
int i;
result->data.nStatus = 2;
printf("退费%f:", result->data.fBalance);
tempchongtuifei.fMoney = result->data.fBalance;
tempchongtuifei.nStatus = 1;
for (i = 0; i < 11; i++)
tempchongtuifei.aName[i] = '\0';
for (i = 0; tempCard.aName[i]; i++)
tempchongtuifei.aName[i] = tempCard.aName[i];
result->data.fBalance = 0;
tempchongtuifei.nDel = 0;
tempchongtuifei.tTime = time(NULL);
insertchongtuifeiByHead(list4, tempchongtuifei);
savechongtuifeiFile("chongtuifei.txt", tempchongtuifei);
saveInfoToFile("Card.txt", list);
printf("注销卡成功\n");
}
}
break;
case 8:
printf("激活卡");//激活卡
printf("请你输入要激活的卡号【1-18】:");
scanf_s("%s", tempCard.aName, 20);
printf("请你输入密码【1-8】:");
scanf_s("%s", tempCard.aPwd, 16);
result = searchByName(list, tempCard.aName);
if (result == NULL)
{
printf("卡号错误,请重新输入卡号\n");
}
else
{
if (result->data.nStatus == 2)
{
result->data.nStatus = 0;
saveInfoToFile("Card.txt", list);
printf("激活卡成功\n");
}
else
{
printf("该卡并未注销,请输入已注销的卡的卡号");
}
}
break;
case 9:
printList(list);
break;//统计卡信息
case 10:
tongji(list3);
break;
case 0:
printf("退出\n");
printf("退出成功\n");
exit(0);//退出含数(关闭程序)
break;
case 11:
printflist3(list3);
break;
}
}
}
int main()
{
list = creatHead();
list2 = creatHeadshang();
list3 = creatHeadxia();
list4 = creatHeadchongtuifei();
readInfoToFile("Card.txt", list);
readshangFile("shangji.txt", list2);
readxiaFile("xiaji.txt", list3);
readchongtuifeiFile("chongtuifei.txt", list4);
while (1)
{
outputMenu();//打印菜单
keyDown();//进入功能含数
system("pause");
system("cls");//清屏函数可注释掉,便与了解该系统
}
system("pause");
return 0;
}
menu.h
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<time.h>
//菜单函数
void outputMenu()
{
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("--------0.退出-----------\n");
printf("--------9.统计卡信息-----\n");
printf("--------10.营业额--------\n");
printf("--------11.打印账单------\n");
printf("\n");
printf("\n");
printf("请输入菜单项号(0~11): ");
}
注意:需要自己动手的将数据存储在外部文件中
首先我们在test.c 的代码中可以找到一个"E:/CC/file/data/d.txt"的相对路径的文件名
不过这只是由我所在E盘创建的一个名为CC的文件夹,其二级子文件夹为file,file中的三级子文件夹是data,正如"E:/CC/file/data/d.txt"中表示的,/d代表的是是存储数据的文本文档,如下图:
接下来你可以自己在任何磁盘新建一个文件夹存储数据,当然也可以像我一样(不用修改代码),如果创建了一个新的文件夹,作出相应改变即可。