武汉理工大学计费系统(网管系统)(复制即用)

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代表的是是存储数据的文本文档,如下图:

 接下来你可以自己在任何磁盘新建一个文件夹存储数据,当然也可以像我一样(不用修改代码),如果创建了一个新的文件夹,作出相应改变即可。

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值