计费管理系统

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

目录

菜单说明

大致思路说明 

 代码实现

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/537907.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网站如果在日益变化的网络攻击中寻到一线生机

一、引言 在数字化浪潮席卷全球的今天&#xff0c;网络空间早已成为国家安全、经济发展和社会稳定的战略高地。然而&#xff0c;这片看似平静的虚拟世界&#xff0c;实则暗流涌动&#xff0c;网络攻击层出不穷&#xff0c;手段日益翻新&#xff0c;给网站的安全运营带来了前所…

蓝桥杯2022年第十三届省赛真题-最优清零方案 java

样例输入、输出&#xff1a; 输入1&#xff1a; 4 2 1 2 3 4输出1 6输入2&#xff1a; 4 2 1 2 3 4输出2 6解法&#xff1a; 滑动窗口解法如下。主要思路就是&#xff1a;用长度为k的滑动窗口&#xff0c;每遇到连续k个不为0的数&#xff0c;记录这k个数中的最小值为min&…

Nerf-Studio复现笔记

文章目录 1. Env2. Train3. Custom data3.1 Prepare3.2 Render and eval3.3 Results 4. Summary 1. Env The configuration process was smooth on Linux, but there are some problems with tiny_cuda_nn and colmap in Windows. // According to the installation document…

【MATLAB源码-第186期】matlab基于MLE算法的8天线阵列DOA估计仿真,对比粗估计、精确估计输出RMSE对比图。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 第一部分&#xff1a;基本概念与系统设置 方向到达估计&#xff08;Direction of Arrival, DOA&#xff09;是信号处理中一项重要的技术&#xff0c;主要用于确定信号的到达方向。这种技术在雷达、无线通信和声纳等领域中有…

Solana主网使用自定义的RPC进行转账

1、引言 如果用 browser 连接主网的 RPC server 会收到 error code 403 message 為 Access forbidden, contact your app developer or supportrpcpool.com. 错误&#xff0c;因为主网的 RPC server 会检查 HTTP Header 如果判断出來是 browser 就会报告 403 錯誤。 要解決这…

LabVIEW闭环步进电机运动系统设计及精度分析

LabVIEW闭环步进电机运动系统设计及精度分析 在自动化设备不断发展的当代&#xff0c;闭环步进电机以其高精度和可靠性成为了自动化设备的重要组成部分。以LabVIEW软件为核心&#xff0c;结合运动控制卡及驱动器模块&#xff0c;设计并实现了一个闭环步进电机的多轴运动控制系…

加盟馅饼多少钱合适,加盟哪个馅饼品牌最好?

加盟馅饼&#xff0c;成本是创业者首要考虑的问题。合适的加盟费用应该考虑到品牌知名度、培训支持、店面选址等因素。一般而言&#xff0c;加盟馅饼的费用在几万元至数十万元之间&#xff0c;具体费用因品牌而异。重要的是&#xff0c;加盟费用不应是唯一的考量因素&#xff0…

SpringBoot3 + Vue3 + Uniapp + uView + Elenment 实现动态二级分类以及二级分类的管理

SpringBoot3 Vue3 Uniapp uView Elenment 实现动态二级分类以及二级分类的管理 1. 效果展示1.1 前端显示效果1.2 后台管理一级分类1.3 后台管理二级分类 2. 后端代码2.1 GoodsCategoryController.java2.2.1 GoodsCategoryMapper.java2.2.2 GoodsCategorySonMapper.java2.3.…

Pytest精通指南(06)Fixture scope作用域详解

文章目录 前言Scope 作用域写在测试用例函数文件写在conftest.py文件作用域总结验证默认作用域验证执行顺序遵循验证类中的fixture作用域验证重名fixture作用域 前言 从前文中&#xff0c;我们已经知道固件&#xff08;fixture&#xff09;的概念、原理、作用域&#xff0c;并且…

【年度典型案例】扫码就能领补贴?通知社保在线速办?当心是钓鱼骗局!

随着我们生活的数字化程度越来越高&#xff0c;完成各种业务和服务变得前所未有的便捷。只需轻轻一点手机屏幕&#xff0c;我们办事儿变得飞快又方便。然而&#xff0c;正当我们享受这种数字化带来的便捷时&#xff0c;一些不法分子也在暗中伺机而动&#xff0c;利用各种手段制…

k8s知识

k8s是用于容器编排和管理的&#xff0c;docker或者ctr是k8s的运行时&#xff0c;k8s通过容器运行时来启动容器&#xff0c;容器启动需要镜像&#xff0c;镜像可以用docker构建&#xff0c;dockerfile就是用于自定义如何构建镜像&#xff0c;所以上面那套流水线就是先用dockerfi…

Java算法小练习——五道经典算法题

练习一&#xff1a;按照要求进行排序 定义数组并存储一些朋友对象&#xff0c;利用Arrays中sort方法进行排序 要求1&#xff1a;属性有姓名、年龄、身高。 要求2&#xff1a;按照年龄的大小进行排序&#xff0c;年龄一样&#xff0c;按身高排序&#xff0c;身高一样安姓名的字母…

策略为王股票软件源代码-----如何修改为自己软件05

上面是如何修改里面的图标和图片,,, 试用版下载: http://www.ninebulls.com/ 联系方式: support@ninebulls.com 常见问题: 1。源代码经编程后产生的目标文件执行后显示为试用版,这样是否正常?如何切换成专业版? 显示为评估版是正常的,注册后即切换成专业版。 Too…

【算法一则】做算法学数据结构 - 简化路径 - 【栈】

目录 题目栈代码题解 题目 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 ‘/’ 开头&#xff09;&#xff0c;请你将其转化为更加简洁的规范路径。 在 Unix 风格的文件系统中&#xff0c;一个点&#xff08;.&#xff09;表…

python使用ffmpeg分割视频为Hls分片文件/使用OpenSSL加密m3u8和TS文件

FFmpeg和OpenSSL是一个开源免费的软件&#xff0c;在官网上就能下载&#xff0c; FFmpage网址&#xff08;建议选择文件名full结尾的文件&#xff09;&#xff1a;Builds - CODEX FFMPEG gyan.dev OpenSSL网址&#xff08;建议选择win64的MSI文件&#xff09;&#xff1a;Win3…

vscode 中显示 pnpm : 无法加载文件 C:\Users\AppData\Roaming\npm\pnpm.ps1,因为在此系统上禁止运行脚本

vscode 中无法运行pnpm vscode中运行pnpm报错解决办法如下 vscode中运行pnpm报错 pnpm : 无法加载文件 C:\Users\AppData\Roaming\npm\pnpm.ps1&#xff0c;因为在此系统上禁止运行脚本 解决办法如下 1、用get-ExecutionPolicy命令在vscode终端查询状态 如果返回的是 Restr…

堆排序-升序和降序_TopK-N个数找找最大的前K个

一、堆排序 堆排序即利用堆的思想来进行排序&#xff0c;总共分为两个步骤:1.建堆 升序:建大堆 降序:建小堆 2.利用堆删除思想来进行排序 方法一&#xff1a;把数据拷贝进堆、把堆拷贝进数据 //弊端&#xff0c;1.需要先有一个堆 2.时间复杂度拷贝数据 void HeapSort(int* …

前端学习<四>JavaScript基础——18-数组之隐秘

之前学习的数据类型&#xff0c;只能存储一个值&#xff08;字符串也为一个值&#xff09;。如果我们想存储多个值&#xff0c;就可以使用数组。 数组简介 数组&#xff08;Array&#xff09;是属于内置对象&#xff0c;数组和普通对象的功能类似&#xff0c;都可以用来存储一…

一文了解HTTPS的加密原理

HTTPS是一种安全的网络通信协议&#xff0c;用于在互联网上提供端到端的加密通信&#xff0c;确保数据在客户端&#xff08;如Web浏览器&#xff09;与服务器之间传输时的机密性、完整性和身份验证。HTTPS的加密原理主要基于SSL/TLS协议&#xff0c;以下详细阐述其工作过程&…

C语言易错知识点(3):字符数组的修改、sscanf、sprintf

字符数组是一个很细节的语法&#xff0c;涉及很多知识点&#xff0c;这篇文章我主要分享一下如何理解字符数组&#xff0c;以及对应的sscanf、sprintf有什么用 1.字符数组的初始化以及内容修改易错点 字符数组的初始化方式有两种&#xff0c;一种是直接用字符串进行初始化&am…