计费管理系统

武汉理工大学程序设计综合实验作业,没有完全按照要求的文件来写,仅供参考。

目录

菜单说明

大致思路说明 

 代码实现

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;
				}
				else {
					printf("卡密码错误\n");
					t = 2;

				}
				break;

			}

			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;
				}
				else {
					printf("卡密码错误\n");
					t = 2;

				}
				break;
			}

			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;
				}
				else {
					printf("卡密码错误\n");
					t = 2;

				}
				break;
			}

			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;
				}
				else {
					printf("卡密码错误\n");
					t = 2;

				}
				break;
			}

			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;
				}
				else {
					printf("管理员密码错误\n");
					t = 2;

				}
				break;

			}

			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;
				}
				else {
					printf("管理员密码错误\n");
					t = 2;

				}
				break;

			}

			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;
							
						}
						else {
							printf("卡密码错误\n");
							e = 2;
						}
						break;
					}
					cardlist = cur;
					cur = cur->next;

				}
				if (e == 1)
				{
					//删除卡节点
					cardlist->next = cur->next;///
					free(cur);
					cur = NULL;
					printf("删除成功\n");
				}
				else if (e == 0)
				{
					printf("无该卡信息\n");
				}
				cardlist = head;

			}

		}
		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;
			}
			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;
				}
				else {
					printf("管理员密码错误\n");
					t = 2;

				}
				break;

			}

			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;
}
#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

--------------------------------------------------------------------------------------------------------------------------------

以上代码仅供参考(因为感觉写的有点挫,但功能实现是没问题的) 

  • 10
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值