个中不足也请大佬指正
代码风格混乱,喔会努力的
有一点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;
}