this is a 计费管理系统

本文介绍了一个基于C++实现的计费管理系统,系统通过链表来管理卡片信息,支持添加卡、查询卡、上机、下机等功能。文章还提供了完整的源代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


个中不足也请大佬指正
代码风格混乱,喔会努力的
有一点bug 卡结构的累计金额在使用过程中未修改,请注意

数据结构:

typedef struct Card			//卡信息
{
	char aName[18];         // 卡号
	char aPwd[18];           // 密码
	int  nStatus;           // 卡状态(0-未上机;1-正在上机;2-已注销)
	time_t tStart;          // 开卡时间
	time_t tEnd;            // 卡的截止时间 
	float fTotalUse;        // 累计金额
	time_t tLast;           // 最后使用时间
	int nUseCount;          // 使用次数
	float fBalance;         // 余额
	int nDel;               // 删除标识 0-未删除,1-删除
	Card* next;
}Card,*pCard;

typedef struct Billing		//计费信息
{
	char *aCardName;    // 卡号
	time_t tStart;         // 上机时间
	time_t tEnd;           // 下机时间
	float fAmount;         // 消费金额
	int nStatus;           // 消费状态,0-未结算,1-已经结算
	int nDel;              // 删除标识,0-未删除,1-删除
	Billing*next;
}Billing,*pBilling;

typedef struct LogonInfo	//上机信息
{
	char *aCardName;    // 上机卡号
	time_t tLogon;         // 上机时间
	float fBalance;        // 上机时的卡余额
	LogonInfo *next;
}LogonInfo,*pLogonInfo;

typedef struct SettleInfo	//下机信息
{
	char *aCardName;   // 卡号
	time_t tStart;        // 上机时间
	time_t tEnd;          // 下机时间
	float fAmount;        // 消费金额
	float fBalance;       // 余额
	SettleInfo *next;
}SettleInfo,*pSettleInfo;

typedef struct MoneyInfo	//充值退费
{
	char *aCardName;  // 卡号
	float fMoney;        // 充值退费金额
	float fBalance;      // 余额
	MoneyInfo *next;
}MoneyInfo,*pMoneyInfo;

计费管理系统的主要功能:

添加卡

输入卡号、密码、初始充值金额。
若链表中存在相同卡号的信息,插入失败
否则做尾插插入链表

查询卡

输入卡号查询该卡的信息,包括卡号、余额、状态以及上次使用时间等。

上机

输入卡号密码进入上机状态,按照系统时间进行计时。

下机

输入卡号下机,按照计时长短扣费

充值退费

输入卡号密码,输出现有余额,输入要充值的金额,更新余额及营业额等。

查询统计

统计一段时间内的营业额、开卡信息、上下机信息以及每张卡的详细信息

注销卡

调整卡的状态。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
部分运行截图如上述
完整源码如下:

// management_system.cpp: 定义控制台应用程序的入口点。
//
#define _CRT_SECURE_NO_WARNINGS

#include "stdafx.h"
#include<iostream>
#include<string.h>
#include <time.h>   
#include <stdio.h>
#include<fstream>
#define max 50
using namespace std;
typedef struct Card			//卡信息
{
	char aName[18];         // 卡号
	char aPwd[18];           // 密码
	int  nStatus;           // 卡状态(0-未上机;1-正在上机;2-已注销)
	time_t tStart;          // 开卡时间
	time_t tEnd;            // 卡的截止时间 
	float fTotalUse;        // 累计金额
	time_t tLast;           // 最后使用时间
	int nUseCount;          // 使用次数
	float fBalance;         // 余额
	int nDel;               // 删除标识 0-未删除,1-删除
	Card* next;
}Card,*pCard;

typedef struct Billing		//计费信息
{
	char *aCardName;    // 卡号
	time_t tStart;         // 上机时间
	time_t tEnd;           // 下机时间
	float fAmount;         // 消费金额
	int nStatus;           // 消费状态,0-未结算,1-已经结算
	int nDel;              // 删除标识,0-未删除,1-删除
	Billing*next;
}Billing,*pBilling;

typedef struct LogonInfo	//上机信息
{
	char *aCardName;    // 上机卡号
	time_t tLogon;         // 上机时间
	float fBalance;        // 上机时的卡余额
	LogonInfo *next;
}LogonInfo,*pLogonInfo;

typedef struct SettleInfo	//下机信息
{
	char *aCardName;   // 卡号
	time_t tStart;        // 上机时间
	time_t tEnd;          // 下机时间
	float fAmount;        // 消费金额
	float fBalance;       // 余额
	SettleInfo *next;
}SettleInfo,*pSettleInfo;

typedef struct MoneyInfo	//充值退费
{
	char *aCardName;  // 卡号
	float fMoney;        // 充值退费金额
	float fBalance;      // 余额
	MoneyInfo *next;
}MoneyInfo,*pMoneyInfo;

int num = 0;//卡数
int num1 = 0;//计费
int num2 = 0;//上机
int num3 = 0;//下机
int num4 = 0;//充值退费
pCard headcard = (pCard)malloc(sizeof(Card));
pBilling headbilling = (pBilling)malloc(sizeof(Billing));//计费
pLogonInfo headlog = (pLogonInfo)malloc(sizeof(LogonInfo));//上机
pSettleInfo headset = (pSettleInfo)malloc(sizeof(SettleInfo));//下机
pMoneyInfo headmoney = (pMoneyInfo)malloc(sizeof(MoneyInfo));//充值退费
bool addlist(pCard temp)
{
	if (num == 0)
	{
		headcard = temp;
		headcard->next = NULL;
	}
	else
	{
		
		pCard p = headcard;
		while (p->next)
		{
			if (strcmp(p->aName, temp->aName) == 0)
			{
				cout << "该卡已存在" << endl;
				return false;
			}
			p = p->next;
		}
			
		p->next= temp;
		
	}
	cout << "添加的卡信息如下" << endl;
	cout << "卡号\t密码\t状态\t金额\t" << endl;
	cout << temp->aName << "	" << temp->aPwd << "	" << temp->nStatus << "	" << temp->fBalance << endl;
	return true;

}
void addCast(char chnum[18],char chpc[18],char chmoney[5])
{
	
	//cout << "---------添加卡----------" << endl;
	pCard temp_card = (pCard)malloc(sizeof(Card));
	/*cout << "请输入卡号<长度为1~18位>" << endl;
	string astring;
	do {
		char temp[max];
		cin >> temp;
		astring = temp;
		if (astring.length() == 0 || astring.length() > 18)cout << "请重新输入" << endl;
	} while (astring.length() == 0 || astring.length() > 18);*/
	strcpy_s(temp_card->aName, chnum/*astring.c_str()*/);
	/*cout << "请输入密码<长度为1~18位>" << endl;
	do {
		char temp[max];
		cin >> temp;
		astring = temp;
		if (astring.length() == 0 || astring.length() > 18)cout << "请重新输入" << endl;
	} while (astring.length() == 0 || astring.length() > 18);*/
	strcpy_s(temp_card->aPwd, chpc/*astring.c_str()*/);
	//cout << "请输入开卡金额" << endl;
	temp_card->fBalance = atof(chmoney);
	//cin >> temp_card->fBalance;
	temp_card->fTotalUse = atof(chmoney);
	temp_card->nDel = 0;
	temp_card->nStatus = 0;
	temp_card->nUseCount = 0;
	temp_card->tLast = time(NULL);
	temp_card->next = NULL;
	time(&temp_card->tStart);
	if (addlist(temp_card))
	{
		num++;
		pMoneyInfo p1 = headmoney;
		if (num4 == 0)
		{
			headmoney->aCardName = chnum;
			headmoney->fBalance = atof(chmoney);
			headmoney->fMoney = atof(chmoney);
			headmoney->next = NULL;
			num4++;
		}
		else
		{
			while (p1->next)
				p1 = p1->next;
			pMoneyInfo p2 = (pMoneyInfo)malloc(sizeof(MoneyInfo));
			p2->aCardName = chnum;
			p2->fBalance = atof(chmoney);
			p2->fMoney = atof(chmoney);
			p2->next = NULL;
			p1->next = p2;
			num4++;
		}
	}
	else
	{
		cout << "添加失败" << endl;
	}
}
void searchlist(char searchName[18])
{
	int flag = 0;
	pCard p = headcard;
	if(strcmp(p->aName,searchName)==0)
	{
		cout << "卡号\t状态\t余额\t累计使用\t上次使用时间" << endl;
		cout << p->aName << "	" << p->nStatus << "	" << p->fBalance << "	" << p->nUseCount << "	" <<ctime(&p->tLast) << endl;
		flag = 1;
	}
	while (p->next)
	{
		p = p->next;
		if (strcmp(p->aName, searchName) == 0)
		{
			cout << "卡号\t状态\t余额\t累计使用\t上次使用时间" << endl;
			cout << p->aName << "	" << p->nStatus << "	" << p->fBalance << "	" <<p->nUseCount<<"	"<< ctime(&p->tLast) << endl;
			flag = 1;
		}

	}
		
	if (flag == 0)cout << "没有该卡的信息" << endl;
}
void outputMenu()
{
	cout << "---计费管理系统菜单---" << endl;
	cout << "1.添加卡" << endl;
	cout << "2.查询卡" << endl;
	cout << "3.上机" << endl;
	cout << "4.下机" << endl;
	cout << "5.充值" << endl;
	cout << "6.退费" << endl;
	cout << "7.查询统计" << endl;
	cout << "8.注销卡" << endl;
	cout << "0.退出" << endl;

}
void logIn(char cardName[18], char passWord[18])
{
	if (num == 0)
	{
		cout << "暂无注册信息" << endl;
		return;
	}
	int flag = 0;
	pCard p = headcard;
	pBilling p1 = headbilling;
	pLogonInfo p2 = headlog;
	while (p)
	{
		if (strcmp(p->aName, cardName) == 0)
		{
			flag = 1;
			char temp;
			if (strcmp(p->aPwd, passWord) == 0)
			{
				cout << "登录成功!" << endl;
				if (p->nStatus == 1)
				{
					cout << "已在上机" << endl;
					break;
				}
				p->nStatus = 1;
				if (num1 == 0)
				{
					headbilling->aCardName = p->aName;
					headbilling->tStart = time(NULL);
					headbilling->nStatus = 0;
					headbilling->fAmount = 0;
					headbilling->nDel = 0;
					headbilling->next = NULL;

					
				}
				else
				{
					while (p1->next)
						p1 = p1->next;
					pBilling p21 = (pBilling)malloc(sizeof(Billing));
					p21->aCardName = p->aName;
					p21->tStart = time(NULL);
					p21->nStatus = 0;
					p21->fAmount = 0;
					p21->nDel = 0;
					p21->next = NULL;
					p1->next = p21;
				}
				
				if (num2 == 0)
				{
					headlog->aCardName = p->aName;
					headlog->fBalance = p->fBalance;
					headlog->tLogon = time(NULL);
					headlog->next = NULL;
				}
				else
				{
					while (p2->next)
						p2 = p2->next;
					pLogonInfo p22 = (pLogonInfo)malloc(sizeof(LogonInfo));
					p22->aCardName = p->aName;
					p22->fBalance = p->fBalance;
					p22->tLogon = p1->tStart;
					p22->next = NULL;
					p2->next = p22;
				}
				p->nUseCount++;
				num1++;
				num2++;
			}
			
			else
			{
				cout << "密码错误" << endl;
				
			}

			break;

		}
		else
			p = p->next;
	}
	if (flag == 0)cout << "没有该卡的信息" << endl;
}
void quitout(char cardName[18])
{
	pCard p = headcard;
	pBilling p1 = headbilling;
	pSettleInfo p2 = headset;
	while (p1)
	{
		if (strcmp(p1->aCardName, cardName) == 0&&p1->nStatus==0)
		{
			time_t suntime;
			suntime = time(NULL) - p1->tStart;
			p1->fAmount = suntime * 0.05;
			p1->tEnd = time(NULL);
			p1->nStatus = 1;
			break;
		}
		else
			p1 = p1->next;
	}
	while (p)
	{
		if (strcmp(p->aName, cardName) == 0)
		{
			p->fBalance -= p1->fAmount;
			p->nStatus = 0;
			break;
			//p->tLast = time(NULL);
		}
		else p = p->next;
	}
	if (num3 == 0)
	{
		headset->aCardName = cardName;
		headset->fAmount = p1->fAmount;
		headset->fBalance = p->fBalance;
		headset->tStart = p->tLast;
		headset->tEnd = time(NULL);
		headset->next = NULL;
		p->tLast = time(NULL);
	}
	else
	{
		while (p2->next)
			p2 = p2->next;	
		pSettleInfo p3 = (pSettleInfo)malloc(sizeof(SettleInfo));
		p3->aCardName = cardName;
		p3->fAmount = p1->fAmount;
		p3->fBalance = p->fBalance;
		p3->tStart = p->tLast;
		p3->tEnd = time(NULL);
		p3->next = NULL;
		p2->next = p3;
		p->tLast = time(NULL);
	}
	num3++;
	cout << "下机成功" << endl;
	cout << "卡号:" << p2->aCardName << " 消费金额" << p2->fAmount << " 余额:" << p2->fBalance << endl;
	cout << "上机时间" << ctime(&p2->tStart) << endl;
	cout << "下机时间" << ctime(&p2->tEnd) << endl;
}
void payfor(char cardName[18], char passWord[18])
{
	pCard p = headcard;
	pMoneyInfo p1 = headmoney;
	float temp;
	while (p)
	{	
		if (strcmp(p->aName, cardName) == 0&&strcmp(p->aPwd,passWord)==0)
		{
			cout << "余额为:" << p->fBalance << endl;
			cout << "请输入充值金额" << endl;
			cin >> temp;
			p->fBalance += temp;
			cout << "余额为" << p->fBalance<<endl;
			break;
		}
		else
			if(p->next)p = p->next;
	}
	while (p1->next)
		p1 = p1->next;
	pMoneyInfo p2 = (pMoneyInfo)malloc(sizeof(MoneyInfo));
	p2->aCardName = cardName;
	p2->fBalance = p->fBalance;
	
	p2->fMoney = temp;
	p2->next = NULL;
	p1->next = p2;
	num4++;
	
	
}
void rebackmoney(char cardName[18], char passWord[18])
{
	pCard p = headcard;
	pMoneyInfo p1 = headmoney;
	float temp;
	while (p)
	{
		if (strcmp(p->aName, cardName) == 0 && strcmp(p->aPwd, passWord) == 0)
		{
			cout << "卡的状况为:	卡号:" << p->aName << " 余额:" << p->fBalance << endl;
			cout << "请输入要退费的金额" << endl;
			cin >> temp;
			p->fBalance -= temp;
			cout << "目前的金额为:" << p->fBalance << endl;
			break;
		}
		else
			p = p->next;
	}
	if (num4 == 0)
	{
		p1->aCardName = cardName;
		p1->fBalance = p->fBalance;
		p1->fMoney = temp;
	}
	else
	{
		while (p1->next)
			p1 = p1->next;
		pMoneyInfo p2 = (pMoneyInfo)malloc(sizeof(MoneyInfo));
		p2->aCardName = cardName;
		p2->fBalance = p->fBalance;
		p2->fMoney = -temp;
		p2->next = NULL;
		p1->next = p2;
	}
	num4++;
}
void unsubscribe()
{
	char cardname[18];
	char password[18];

	cout << "请输入要注销的账号" << endl;
	cin >> cardname;
	cout << "请输入密码" << endl;
	cin >> password;
	pCard p = headcard;
	int flag = 0;
	while (p->next)
	{
		if (strcmp(p->aName, cardname) == 0)
		{
			flag = 1;
			if (strcmp(p->aPwd, password) == 0)
			{
				if(p->nStatus!=2)
					p->nStatus = 2;
				else
				{
					cout << "该账号已注销" << endl;
				}
			}
			else
			{
				cout << "密码错误" << endl;
				break;
			}
		}
		p = p->next;
	}
	if (flag == 0)
		cout << "账号不存在" << endl;
	
}
void searchall()
{
	cout << "查询统计	1.总营业额 2.开卡信息 3.详细信息 4.阶段营业额 其他.退出" << endl;
	int temp;
	cin >> temp;
	float sum = 0;
	pMoneyInfo p = headmoney;
	pCard p1 = headcard;
	pBilling p3 =headbilling;
	switch (temp)
	{
	case 1:	
		while (p)
		{
			sum += p->fMoney;
			p = p->next;
		}
		cout << "总营业额为" << sum << endl;
		break;
	case 2:
		while (p1)
		{
			cout << "卡号:" << p1->aName << "  开卡时间  " << ctime(&p1->tStart) << "  余额  " << p1->fBalance << "  使用总次数  " << p1->nUseCount << "  状态  " << p1->nStatus << "  累计金额  " << p1->fTotalUse << endl;
			p1 = p1->next;
		}
		break;
	case 3:
		cout << "请输入要查询的卡号" << endl;
		char cardname[18];
		cin >> cardname;
		while (p3)
		{
			if (strcmp(p3->aCardName, cardname) == 0)
			{
				if(p3->nStatus==1)
				cout << "上机时间" << ctime(&p3->tStart) << " 下机时间" << ctime(&p3->tEnd) << "消费金额" << p3->fAmount;
				else
				{
					cout << "上机时间" << ctime(&p3->tStart) << "尚未下机" << endl;
				}
			}
			p3 = p3->next;
		}
		break;
	case 4:
		int years;
		cout << "请输入要查询的年份" << endl;
		cin >> years;
		while (p1)
		{
			if (localtime(&p1->tStart)->tm_year+1900 == years)
			{
				p = headmoney;
				while (p)
				{
					if (strcmp(p->aCardName, p1->aName) == 0)
						sum += p->fMoney;
					p = p->next;
				}
			}
			p1 = p1->next;
		}
		cout << years << "年的总金额为" << sum << endl;
		break;
	default:break;
	}
}
int main()
{
	char sele_num = ' ';
	do {
		string a;
		outputMenu();
		cout << "请输入你的选择" << endl;
		char ch[20];
		cin >> ch;
		for (int i = 0; i < sizeof(ch); i++)
		{
			if (ch[i] == '\0')break;
			a += ch[i];
		}
		if (a.length() > 1)sele_num = '9';
		else sele_num = *ch;
		int numrow = 1;
		switch (sele_num)
		{
		case '1':
		{
			cout << "------------添加卡----------" << endl;
			FILE  *fp;
			char  ch1[18];
			char ch2[18];
			char ch3[5];
			char ch4[5];
			if ((fp = fopen("test1.txt", "w")) == NULL)
			{
				printf("cann't open file"); exit(0);
			}
			do {
				cout << "请输入卡号" << endl;
				cin >> ch1;
				fputs(ch1, fp);
				fputs("\n", fp);
				cout << "请输入密码" << endl;
				cin >> ch2;
				fputs(ch2, fp);
				fputs("\n", fp);
				cout << "请输入金额" << endl;
				cin >> ch3;
				fputs(ch3, fp);
				fputs("\n", fp);
				addCast(ch1, ch2, ch3);cout << "y/n?" << endl;
				cin >> ch4;
			} while (strcmp(ch4,"y")==0);
			fclose(fp);

			//addCast();
			break;
		}
		case '2':
		{
			cout << "-------------查询卡-----------" << endl;
			char temp[18];
			cout << "请输入查询的卡号" << endl;
			cin >> temp;
			searchlist(temp);
			break;
		}
		case '3':
		{
			
			cout << "------------上机----------" << endl;
			char ch1[18];
			char ch2[18];
			cout << "请输入卡号" << endl;
			cin >> ch1;
			cout << "请输入密码" << endl;
			cin >> ch2;
			logIn(ch1, ch2);
			break;
		}
		case '4':
		{
			cout << "------------下机----------" << endl;
			char ch1[18];
			cout << "请输入卡号" << endl;
			cin >> ch1;
			quitout(ch1);
			break;
		}
		case '5':
		{
			cout << "------------充值----------" << endl;
			char ch1[18];
			char ch2[18];
			cout << "请输入卡号" << endl;
			cin >> ch1;
			cout << "请输入密码" << endl;
			cin >> ch2;
			payfor(ch1, ch2);
			break;
		}
		case '6':
		{
			cout << "------------退费----------" << endl;
			char ch1[18];
			char ch2[18];
			cout << "请输入卡号" << endl;
			cin >> ch1;
			cout << "请输入密码" << endl;
			cin >> ch2;
			rebackmoney(ch1, ch2);
			break;
		}
		case '7':
		{
			cout << "------------查询统计----------" << endl;
			searchall();
			break;
		}
		case '8':
		{
			cout << "------------注销卡----------" << endl;
			unsubscribe();
			break;
		}
		case '0':
		{
			cout << "------------退出----------" << endl;
			cout << "---感谢使用本系统---" << endl;
			break;
		}

		default:
		{
			sele_num = '1';
			cout << "请输入给定的数字" << endl;
			break;

		}

		}

	} while (sele_num != '0');
		
		
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值