本项目模拟网吧计费管理系统,基于C语言实现.主要运用C语言文件、单链表、结构体基本操作
主要功能:
1.添加卡信息
2.查询卡信息
3.上机登陆操作
4.下机操作
5.卡充值操作
6.卡退费操作
7.查询统计
8.注销卡
9.退出
下面介绍各文件及其具体功能
IDE: codeblocks
main.cpp
#include
#include "menu.h"
int main()
{
outputmenu();//程序入口
return 0;
}
menu.cpp
#include
#include
#include
#include"menu.h"
#include"card_service.h"
#include"card_file.h"
#include"service.h"
#include"billing_service.h"
#include"time.h"
Card *card = initial();
//与用户交互界面
void outputmenu() {
do {
int choice;
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("请输入0-8数字来进行选择\n");
scanf("%d", &choice);
switch (choice) {
case 0: {
exit(0);
break;
}
case 1: {
system("cls");
add();
system("pause");
break;
}
case 2: {
system("cls");
query();
system("pause");
break;
}
case 3: {
system("cls");
login();
system("pause");
break;
}
case 4: {
system("cls");
Settle();
system("pause");
break;
}
case 5: {
system("cls");
addMoney();
system("pause");
break;
}
case 6: {
system("cls");
reFundMoney();
system("pause");
break;
}
case 7: {
system("cls");
inQuirystat();
system("pause");
break;
}
case 8: {
system("cls");
del();
system("pause");
break;
}
default: {
system("cls");
printf("请输入正确的1-8数字\n");
break;
}
}
} while(1);
}
/*
增加卡片信息
*/
void add() {
card=readCard();
//先从文件中读取卡的链表
printf("请输入您要添加的卡号<长度1-18>:\n");
char name[50];
scanf("%s", name);
while (strlen(name) > 18||queryCard(card,name)!=NULL) {
if(strlen(name)>18) printf("卡号大于18位 重新输入:\n");
else printf("卡号已存在 重新输入:\n");
scanf("%s",name);
}
char pwd[50];
printf("请输入密码<长度1-8>:\n");
scanf("%s", pwd);
while (strlen(pwd) > 8||strlen(pwd)<1) {
printf("密码超过8位,请重新输入密码<长度1-8>:\n");
scanf("%s", pwd);
}
float balance;
printf("请输入开卡金额<人民币>:\n");
scanf("%f", &balance);
printf("添加卡的信息如下:\n");
printf("卡号\t密码\t状态\t金额\n");
printf("%s\t%s\t0\t%.1f\n", name, pwd, balance);
//卡信息存入卡文件中
addCard(card,name, pwd, balance);
}
/*
查询卡片信息
*/
void query() {
card=readCard();
//先从文件中读取卡的链表
printf("请输入需要查询的卡号<长度1-18>:\n");
char name[50];
scanf("%s", name);
while (strlen(name) > 18 || queryCard(card,name) == NULL) {
printf("卡号超过18位或不存在该卡号对应卡 :\n");
scanf("%s",name);
}
//调用card_service.cpp文件查询函数
Card *t = queryCard(card,name);
printf("请输入需要查询的卡号密码<长度1-8位>:\n");
char pas[20];
scanf("%s",pas);
if(strcmp(pas,t->aPwd)==0);
else
{
printf("您输入的密码错误 查询失败!\n");
return;
}
printf("查询卡的信息如下:\n");
printf("卡号\t状态\t余额\t累计使用\t使用次数\t上次使用时间\n");
struct tm *p = localtime(&t->tLast);
printf("%s\t%d\t%.1f\t%.1f\t\t%d\t", t->aName, t->nStatus,t->fBalance,t->fTotalUse,t->nUseCount);
printf("%4d-", p->tm_year + 1900);
printf("%02d-", p->tm_mon + 1);
printf("%02d ", p->tm_mday);
printf("%02d:%02d:%02d\n", p->tm_hour, p->tm_min, p->tm_sec);
}
void login()
{
int t = 0;
//先从文件中读取卡的链表
card = readCard();
printf("请输入上机卡号<长度为1~18> \n");
char nam[50];
scanf("%s", nam);
printf("请输入上机密码 \n" );
char pas[20];
scanf("%s", pas);
if (strlen(nam) > 18)
{
printf("卡号超过18位 重新输入\n");
}
Card *car;
car = queryCard(card, nam);
if (car != NULL && strcmp(car->aPwd, pas) == 0)
{
printf("您输入的卡号密码正确 正在为您验证卡信息\n");
}
if (car == NULL)
{
printf("不存在该卡\n");
t = 1;
return;
}
if (car->nStatus == 1)
{
printf("该卡正在上机\n");
t = 1;
}
if (car->nStatus == 2)
{
printf("该卡已注销\n");
t = 1;
}
if (car->nStatus == 3)
{
printf("该卡已失效\n");
t = 1;
}
if (car->fBalance <= 0)
{
printf("该卡余额小于0\n");
t = 1;
}
if (t != 1)
{
int k = 1;
doLogon(car, k);
}
else
{
printf("上机失败\n");
return;
}
}
/*
下机操作
*/
void Settle()
{
card=readCard();
//从文件中读取文件中卡信息
char name[50];
printf("请输入您要下机的卡号\n");
scanf("%s",name);
if(strlen(name)>18)
{
printf("卡号大于18位 查询失败\n");
return;
}
Card *card2;
//调用card_service.cpp文件 卡查询函数
card2=queryCard(card,name);
if(card2==NULL)
{
printf("不存在该卡 下机失败!\n");
return;
}
printf("请输入您要下机卡号的密码\n");
char pas[20];
scanf("%s",pas);
if(strcmp(card2->aPwd,pas)==0)
{
printf("您输入的卡号密码正确 正在为您验证卡信息\n");
}
else
{
printf("您输入的卡号密码错误 下机失败!\n");
return;
}
if(card2->nStatus!=1)
{
printf("您要下机的卡号目前不在上机 下机失败!\n");
return;
}
//卡号密码正确 调用billing_service.cpp下机操作函数
doSettle(card2);
return;
}
/*
充值操作
*/
void addMoney()
{
card=readCard();
//从文件中读取文件中卡信息
char name[50];
printf("请输入您要充值的卡号\n");
scanf("%s",name);
if(strlen(name)>18)
{
printf("您输入卡号大于18位 充值失败!\n");
return;
}
if(queryCard(card,name)==NULL)
{
printf("不存在该卡号对应卡片 充值失败!\n");
return;
}
printf("请输入您要充值卡号的密码\n");
char pas[20];
scanf("%s",pas);
Card *card2;
card2=(Card*)malloc(sizeof(Card));
//调用card_service.cpp文件 卡查询函数
card2=queryCard(card,name);
if(strcmp(card2->aPwd,pas)!=0)
{
printf("您输入卡号密码错误 充值失败! \n");
return;
}
printf("请输入充值金额\n");
float money;
scanf("%f",&money);
//卡号密码正确 调用service.cpp充值操作函数
int ye=doaddMoney(card2,money);
if(ye==1)
{ printf("------充值信息如下------\n");
printf("卡号\t充值金额 余额\n");
printf("%s\t%.1f\t %.1f\n",card2->aName,money,card2->fBalance);
return;
}
else
{
printf("充值失败\n");
return;
}
}
/*
退费操作
*/
void reFundMoney()
{
card=readCard();
//从文件中读取文件中卡信息
char name[50];
printf("请输入您要退款的卡号\n");
scanf("%s",name);
if(strlen(name)>18)
{
printf("您输入卡号大于18位 退费失败!\n");
return;
}
if(queryCard(card,name)==NULL)
{
printf("不存在该卡号对应卡片 退费失败!\n");
return;
}
printf("请输入您要退费卡号的密码\n");
char pas[20];
scanf("%s",pas);
Card *card2;
card2=(Card*)malloc(sizeof(Card));
card2=queryCard(card,name);
if(strcmp(card2->aPwd,pas)!=0)
{
printf("您输入卡号密码错误 退费失败! \n");
return;
}
//卡号密码正确 调用service.cpp下机操作函数
int ye=dofeFundMoney(card2);
if(ye==1)
{ printf("------退费信息如下------\n");
printf("卡号\t退费金额 余额\n");
printf("%s\t%.1f\t %.1f",card2->aName,card2->fBalance,0);
}
else
{
printf("该卡已失效或正在上机 退费失败!\n");
return;
}
}
/*
查询统计操作
*/
void inQuirystat()
{
Card *card=readCard();
//从文件中读取文件中卡信息
printf("1.查询某卡消费记录\n");
printf("2.统计总营业额\n");
printf("输入您的选择:\n");
int choice;
scanf("%d",&choice);
switch(choice){
case 1:
{
printf("请您输入要查询的卡号\n");
char name[50];
scanf("%s",name);
if(strlen(name)>18)
{
printf("您输入卡号大于18位 退费失败!\n");
return;
}
if(queryCard(card,name)==NULL)
{
printf("不存在该卡号对应卡片 退费失败!\n");
return;
}
printf("请输入您要退费卡号的密码\n");
char pas[20];
scanf("%s",pas);
Card *card2;
card2=(Card*)malloc(sizeof(Card));
card2=queryCard(card,name);
if(strcmp(card2->aPwd,pas)!=0)
{
printf("您输入卡号密码错误 退费失败! \n");
return;
}
//卡号密码正确 调用billing_service.cpp查询该卡消费总额操作函数
float Total=inQuiryMon(card2);
printf("该卡消费总金额为\n");
printf("%.1f\n",Total);
break;
}
case 2:
{
//卡号密码正确 调用billing_service.cpp查询总营业额操作函数
float TotalMon=inQuiryTo();
printf("总营业额为\n");
printf("%.1f\n",TotalMon);
break;
}
default:
{
printf("输入选择错误 查询统计失败!\n");
return;
}
}
}
/*
删除操作
*/
void del()
{ card=readCard();
int t=0;
char name[50];
printf("请输入您要注销的卡号\n");
scanf("%s",name);
char pas[20];
printf("请输入您要主要的卡号的密码\n");
scanf("%s",pas);
Card *card2;
card2=(Card*)malloc(sizeof(Card));
while(card!=NULL)
{
if(queryCard(card,name)!=NULL)
{
card2=queryCard(card,name);
printf("找到对应卡号密码 正在查询卡信息\n");
}
else
{ card=card->next;
continue;
}
if(card->nStatus==1)
{
printf("该卡正在使用 不可注销");
break;
}
if(card->nStatus==2)
{
printf("该卡已注销");
break;
}
t=1;
break;
}
if(t==1)
{ //调用card_service.cpp注销卡片操作函数
int ye=delCard(card2);
if(ye==1)
{
printf("卡号\t退还金额\n");
printf("%s\t%.1f",card2->aName,card2->fBalance);
printf("\n");
printf("注销成功\n");
}
else
{
printf("注销失败\n");
}
}
}
card_service.cpp
#include
#include
#include
#include "card_service.h"
#include "card_file.h"
#include "time.h"
/*
增加卡信息操作函数
*/
void addCard(Card *card,char no[],char pwd[],float balance) {
Card *t;
t = (Card*)malloc(sizeof(Card));
strcpy(t->aName, no);
strcpy(t->aPwd, pwd);
t->nStatus = 0;
t->fTotalUse = 0;
t->fBalance = balance;
t->nUseCount = 0;
t->nDel = 0;
t->next = card->next;
card->next = t;
saveCard(t);
}
/*
卡信息链表初始化操作
*/
Card* initial() {
Card *card;
card= (Card*)malloc(sizeof(Card));
card->next = NULL;
return card;
}
/*
查询卡片操作
*/
Card* queryCard(Card *card,char no[]) {
while(card!=NULL)
{
if(strcmp(card->aName,no)==0)
{
return card;
}
card=card->next;
}
return NULL;
}
/*
上机操作
*/
void showchange(Card *card,int k)
{ printf("----上机成功----\n");
printf("卡号\t余额\t上机时间\n");
time_t t=time(NULL);
struct tm *p = localtime(&t);
printf("%s\t%.1f\t%4d-%02d-%02d %02d:%02d:%02d\n",
card->aName,card->fBalance,p->tm_year + 1900, p->tm_mon + 1, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec);
//向用户展示信息。
//更新链表中的卡信息
Card *card2=initial();
card2=readCard();
while(card2!=NULL)
{
if(strcmp(card2->aName,card->aName)==0)
{
card2->nStatus=1;//表示正在上机
card2->tLast=t;//更新上一次上机时间
}
card2=card2->next;
}
//更新文件中的卡信息
int c=1;
//c=1代表从文件中改变为成上机状态
//调用card_file.cpp文件中更新文件卡信息操作
updateCard(card,c);
}
/*
删除卡片
*/
int delCard(Card *card2)
{
int k=5;
//k=5代表从文件中改变为注销状态
//调用card_file.cpp文件中注销卡信息操作
if(updateCard(card2,k)==1)
return 1;
else
return 0;
}
card_file.cpp
#include
#include
#include
#include "card_service.h"
#include "time.h"
time_t ToTime(char s[]) {
time_t t;
struct tm tm1;
int year, mon, day, hour, min, sec;
tm1.tm_year = (s[0] - '0') * 1000 + (s[1] - '0') * 100 + (s[2] - '0') * 10 + s[3] - '0' - 1900;
tm1.tm_mon = (s[4] - '0') * 10 + s[5] - '0' - 1;
tm1.tm_mday = (s[6] - '0') * 10 + s[7] - '0';
tm1.tm_hour = (s[9] - '0') * 10 + s[10] - '0';
tm1.tm_min = (s[12] - '0') * 10 + s[13] - '0';
tm1.tm_sec = (s[15] - '0') * 10 + s[16] - '0';
t = mktime(&tm1);
return t;
}//通过此方法返回time_t类型变量
/*
向文件中添加卡操作函数
*/
void saveCard(Card *card) {
FILE *file;
time_t t = time(NULL);
struct tm *p = localtime(&t);
if ((file = fopen("D:\\计费管理系统3\\计费管理系统4\\card.txt", "a")) != NULL) {
fprintf(file, "%s\t%s\t%d\t%4d%02d%02d-%02d:%02d:%02d\t%4d%02d%02d-%02d:%02d:%02d\t%.1f\t%4d%02d%02d-%02d:%02d:%02d\t%d\t%.1f\t%d\n",
card->aName, card->aPwd, card->nStatus, p->tm_year + 1900, p->tm_mon + 1, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec,
p->tm_year + 1901, p->tm_mon + 1, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec, card->fTotalUse,
p->tm_year + 1900, p->tm_mon + 1, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec, card->nUseCount, card->fBalance, card->nDel);
}
else printf("文件打开失败!\n");
fclose(file);
}
/*
由文件中读卡信息函数
*/
Card* readCard() {
Card *card = initial();
//获得链表起点
FILE *file;
file = fopen("D:\\计费管理系统3\\计费管理系统4\\card.txt", "a");
fclose(file);
//读文件时必须先建立一文件 否则报错
char time_start[50],time_end[50],time_last[50];
if ((file = fopen("D:\\计费管理系统3\\计费管理系统4\\card.txt", "r")) != NULL) {
while (!feof(file)) {
Card *t;
t = (Card*)malloc(sizeof(Card));
if(fscanf(file, "%s %s %d %s %s %f %s %d %f %d",
t->aName, t->aPwd, &t->nStatus, time_start, time_end,
&t->fTotalUse, time_last, &t->nUseCount, &t->fBalance, &t->nDel)==EOF) break;
t->tStart = ToTime(time_start);
t->tEnd = ToTime(time_end);
t->tLast = ToTime(time_last);
t->next = card->next;
card->next = t;
}
}
else {
printf("文件读取失败!");
}
fclose(file);
return card;
}
/*
进行文件中卡信息改变函数
由传入k的不同判断改变情况(1代表进行上机 2代表进行下机 3.代表进行充值。。)
*/
int updateCard(Card *card,int k)
{
FILE *f1,*f2;
time_t t2 = time(NULL);
struct tm *p = localtime(&t2);
time_t t_start, t_end, t_last;
char time_start[50], time_end[50], time_last[50];
Card *t=(Card*)malloc(sizeof(Card));
f2 = fopen("D:\\计费管理系统3\\计费管理系统4\\card2.txt", "a"); //如果文件不存在则创建一个 写的方式将新信息写入card2.txt
if ((f1 = fopen("D:\\计费管理系统3\\计费管理系统4\\card.txt", "r+")) != NULL)//只读的方式
{
while (fscanf(f1, "%s %s %d %s %s %f %s %d %f %d",
t->aName, t->aPwd, &t->nStatus, time_start, time_end,
&t->fTotalUse, time_last, &t->nUseCount, &t->fBalance, &t->nDel) != EOF)
{
if (strcmp(card->aName, t->aName) == 0) {
if(k==1)//上机
{
fprintf(f2, "%s\t%s\t%d\t%s\t%s\t%.1f\t%4d%02d%02d-%02d:%02d:%02d\t%d\t%.1f\t%d\n",
card->aName, card->aPwd, 1, time_start, time_end, card->fTotalUse,
p->tm_year + 1900, p->tm_mon + 1, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec, card->nUseCount+1, card->fBalance, 0);
continue;
}
if(k==2)//下机
{
fprintf(f2, "%s\t%s\t%d\t%s\t%s\t%.1f\t%4d%02d%02d-%02d:%02d:%02d\t%d\t%.1f\t%d\n",
card->aName, card->aPwd, 0, time_start, time_end, card->fTotalUse,
p->tm_year + 1900, p->tm_mon + 1, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec, card->nUseCount,card->fBalance, 0);
continue;
}
if(k==2)//下机
{
fprintf(f2, "%s\t%s\t%d\t%s\t%s\t%.1f\t%4d%02d%02d-%02d:%02d:%02d\t%d\t%.1f\t%d\n",
card->aName, card->aPwd, 0, time_start, time_end, card->fTotalUse,
p->tm_year + 1900, p->tm_mon + 1, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec, card->nUseCount,card->fBalance, 0);
continue;
}
if(k==3)//充值
{
fprintf(f2, "%s\t%s\t%d\t%s\t%s\t%.1f\t%4d%02d%02d-%02d:%02d:%02d\t%d\t%.1f\t%d\n",
card->aName, card->aPwd, card->nStatus, time_start, time_end, card->fTotalUse,
p->tm_year + 1900, p->tm_mon + 1, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec, card->nUseCount,card->fBalance, 0);
continue;
}
if(k==4)//退费
{
fprintf(f2, "%s\t%s\t%d\t%s\t%s\t%.1f\t%4d%02d%02d-%02d:%02d:%02d\t%d\t%.1f\t%d\n",
card->aName, card->aPwd, 2, time_start, time_end, card->fTotalUse,
p->tm_year + 1900, p->tm_mon + 1, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec, card->nUseCount,card->fBalance, 1);
continue;
}
if(k==5)//删除卡片
{
fprintf(f2, "%s\t%s\t%d\t%s\t%s\t%.1f\t%4d%02d%02d-%02d:%02d:%02d\t%d\t%.1f\t%d\n",
card->aName, card->aPwd, 2, time_start, time_end, card->fTotalUse,
p->tm_year + 1900, p->tm_mon + 1, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec, card->nUseCount, card->fBalance, 1);
continue;
}
fprintf(f2, "%s\t%s\t%d\t%s\t%s\t%.1f\t%s\t%d\t%.1f\t%d\n",
t->aName, t->aPwd, t->nStatus, time_start, time_end, t->fTotalUse,
time_last, t->nUseCount, t->fBalance, t->nDel);
}
//f2所关联的文件中就是更新后的信息。
else fprintf(f2, "%s\t%s\t%d\t%s\t%s\t%.1f\t%s\t%d\t%.1f\t%d\n",
t->aName, t->aPwd, t->nStatus, time_start, time_end, t->fTotalUse,
time_last, t->nUseCount, t->fBalance, t->nDel);
}
else
{
printf("文件打开失败");
return 0;
}
fclose(f1);
fclose(f2);
f1 = fopen("D:\\计费管理系统3\\计费管理系统4\\card2.txt", "r+"); //读card2.txt
f2 = fopen("D:\\计费管理系统3\\计费管理系统4\\card.txt", "w"); //写card.txt
while (fscanf(f1, "%s %s %d %s %s %f %s %d %f %d",
t->aName, t->aPwd, &t->nStatus, time_start, time_end,
&t->fTotalUse, time_last, &t->nUseCount, &t->fBalance, &t->nDel) != EOF)
{
fprintf(f2, "%s\t%s\t%d\t%s\t%s\t%.1f\t%s\t%d\t%.1f\t%d\n",
t->aName, t->aPwd, t->nStatus, time_start, time_end, t->fTotalUse,
time_last, t->nUseCount, t->fBalance, t->nDel);
}
fclose(f1);
fclose(f2);
return 1;
}
card_servic.h
#ifndef CARD_SERVICE_H_INCLUDED
#define CARD_SERVICE_H_INCLUDED
typedef struct Card {
char aName[18]; //卡号
char aPwd[8]; //密码
int nStatus; //卡状态(0-未上机;1-正在上机;2-已注销;3-失效)
time_t tStart; //开卡时间
time_t tEnd; //卡的截止时间
float fTotalUse; //累计金额
time_t tLast; //最后使用时间
int nUseCount; //使用次数
float fBalance; //余额
int nDel; //删除标识 0-未删除,1-删除
struct Card* next; //指向下一个卡的指针
}Card;
void addCard(Card *card,char no[],char pwd[],float balance);
Card* initial();
Card* queryCard(Card *card,char no[]);
void showchange(Card *card,int k);
int delCard(Card *card);
#endif // CARD_SERVICE_H_INCLUDED
service.cpp
#include
#include
#include
#include "card_file.h"
#include "card_service.h"
#include "time.h"
/*
用于上机 充值 退费
*/
void doLogon(Card *card,int k)//上机
{ int m=1;
showchange(card,m);
}
int doaddMoney(Card *card,float money)//充值
{
int m=3;
card->fBalance=card->fBalance+money;//改变该卡余额
//调用card_file.cpp文件中更新卡信息函数
int ye=updateCard(card,3);
if(ye==1)
return 1;
else
return 0;
}
int dofeFundMoney(Card *card)//退费
{
int m=4;
if(card->nStatus==2||card->nStatus==1)
return 0;
//调用card_file.cpp文件中更新卡信息函数
int ye=updateCard(card,4);
if(ye==1)
return 1;
else
return 0;
}
card_file.h
#ifndef CARD_FILE_H_INCLUDED
#define CARD_FILE_H_INCLUDED
#include "card_service.h"
void saveCard(Card *card);
Card* readCard();
int updateCard(Card *card,int k);
#endif // CARD_FILE_H_INCLUDED
service.h
#ifndef SERVICE_H_INCLUDED
#define SERVICE_H_INCLUDED
void doLogon(Card* card,int k);
int doaddMoney(Card *card,float money);
int dofeFundMoney(Card *card2);
#endif // SERVICE_H_INCLUDED
billing_service.cpp
#include
#include
#include
#include "card_service.h"
#include "card_file.h"
#include "time.h"
#include "billing_service.h"
#define UNIT 1 //最小收费单元15分钟
#define CHARGE 0.5 //每个收费单元收费0.5元
/*
消费信息存入二进制文件*
*/
Billing* saveBilling(Card *card,time_t t,int hour,int min)
{
time_t Start1=card->tLast;
struct tm *Start=localtime(&Start1);
/*
通过上机时间与下机时间计算消费金额
*/
int hour1=Start->tm_hour;
int minute1=Start->tm_min;
int Beforetime=hour1*60+minute1;
int Endtime=hour*60+min;
float fAmount=((Endtime-Beforetime)*1.0/UNIT)*CHARGE*1.0;
float fBalance=card->fBalance;
if(fBalance<fAmount)
{
return NULL;
}
/*
消费信息存入用于存放卡消费信息文件中
*/
FILE *file;
Billing *bill;
bill = (Billing*)malloc(sizeof(Billing));
strcpy(bill->aCardName,card->aName);
bill->tStart=Start1;
bill->tEnd=t;
bill->Amount=fAmount;
bill->fBalance=(card->fBalance)-fAmount;
if((file=fopen("D:\\计费管理系统3\\计费管理系统4\\billing.ams","ab"))!=NULL)
{
if(fwrite(bill,sizeof(struct Billing),1,file)!=0);
}
else
{
printf("下机信息写入失败!");
return NULL;
}
fclose(file);
return bill;
}
/*
读取消费信息链表函数
*/
Billing *initial2()
{
Billing *Info;
Info= (Billing*)malloc(sizeof(Billing));
Info->next = NULL;
return Info;
}
Billing *readInfo()
{
Billing *Info=(Billing*)malloc(sizeof(Billing));
Info->next=NULL;
FILE *file;
file = fopen("D:\\计费管理系统3\\计费管理系统4\\billing.ams", "ab");
fclose(file);
int num=0;
if((file=fopen("D:\\计费管理系统3\\计费管理系统4\\billing.ams","rb"))!=NULL)
{
while(!feof(file)){
Billing *bill;
bill=(Billing*)malloc(sizeof(Billing));
if(fread(bill,sizeof(struct Billing),1,file)!=0);
else
{
break;
}
bill->next=Info->next;
Info->next=bill;
}
}
else
{
printf("文件读取失败");
}
fclose(file);
return Info;
}
/*
下机操作
*/
void doSettle(Card *card)
{
time_t t=time(NULL);
struct tm *p = localtime(&t);
int hour=p->tm_hour;
int min=p->tm_min;
/*
将下机信息保存到二进制文件中
用于功能7:查询统计
打印下机信息 改变卡文件中卡信息
*/
Billing *bill=(Billing*)malloc(sizeof(Billing));
bill=saveBilling(card,t,hour,min);
printf("-----下机信息如下-----\n");
printf("卡号\t消费\t余额\t下机时间\n");
printf("%s\t%.1f\t%.1f\t%4d%02d%02d-%02d:%02d\n",
bill->aCardName,bill->Amount,bill->fBalance,
p->tm_year+1900,p->tm_mon+1,p->tm_mday,hour,min);
card->fBalance=card->fBalance-bill->Amount;
card->fTotalUse=card->fTotalUse+bill->Amount;
card->tLast=t;
int k=updateCard(card,2);
return;
}
/*
查询总营业额
*/
float inQuiryTo()
{
float Sum=0;
/*
读取消费信息 获得总营业额
*/
Billing *Info=(Billing*)malloc(sizeof(Billing));
Info=readInfo();
while(Info!=NULL)
{
Sum+=Info->Amount;
Info=Info->next;
}
return Sum;
}
/*
查询某卡消费金额
*/
float inQuiryMon(Card *card)
{
float Sum=0;
/*
读取消费信息 卡号比较 获得该卡消费金额
*/
Billing *Info=(Billing*)malloc(sizeof(Billing));
Info=readInfo();
while(Info!=NULL)
{
if(strcmp(Info->aCardName,card->aName)==0)
{
Sum+=Info->Amount;
}
Info=Info->next;
}
return Sum;
}
biling_service.h
#ifndef BILLING_SERVICE_H_INCLUDED
#define BILLING_SERVICE_H_INCLUDED
typedef struct Billing
{
char aCardName[18];//卡号
time_t tStart;//上机时间
time_t tEnd;//下机时间
float Amount;//消费金额
float fBalance;//余额
struct Billing *next;
}Billing;
void doSettle(Card *card);
Billing* initial2();
Billing* readInfo();
Billing* saveBilling(Card *card,time_t t,int hour,int min);
float inQuiryTo();
float inQuiryMon(Card *card);
#endif // BILLING_SERVICE_H_INCLUDED
menu.h
#ifndef MENU_H_INCLUDED
#define MENU_H_INCLUDED
void outputmenu();
void add();
void query();
void login();
void Settle();
void addMoney();
void reFundMoney();
void inQuirystat();
void del();
#endif // MENU_H_INCLUDED
未完全使用老师提供的三层结构:(每个方法首先调用card_file中卡信息文件读取函数 获取卡信息链表 方便判断)
添加卡片操作:menu.cpp调用add函数(文件中不存在该卡片)->card_service.cpp中addCard函数->card_file.cpp中saveCard函数(写入文件) 展示卡片信息
查询卡片操作:menu.cpp调用query函数(文件中存在该卡片)->card_service.cpp中queryCard函数->展示卡片信息
上机操作:menu.cpp调用login函数(文件中存在该卡片且未在上机 删除 注销状态)->
card_service.cpp中showchange函数->card_file.cpp中updateCard函数->更新文件中卡信息 展示上机信息
删除卡片操作:menu.cpp调用del函数(文件中存在该卡片且未在上机 删除 注销状态)->card_service.cpp中delCard函数->card_file.cpp中updateCard函数->更新文件中卡信息 展示卡片信息
因涉及到消费情况 故调用billing_service.cpp 中函数
下机操作: menu.cpp调用Settle函数(文件中存在该卡片文件中存在该卡片)->billing_service.cpp中doSettle函数 将消费信息保存至二进制文件中->更新文件中消费信息展示下机信息
查询统计操作: menu.cpp中inQuirystat函数(提示用户操作选择)
充值退费调用service.cpp中函数
充值操作:menu.cpp调用addMoney函数->调用service.cpp中addMoney函数->调用card_file.cpp中updateCard函数->更文件中卡信息
退费操作:menu.cpp调用reFundMoney函数->调用service中dofeFundMoney函数->调用card_file.cpp中updateCard函数->更文件中卡信息
程序已基本调试完成,但仍存在冗余部分。整体难度适中,主要是文件操作 链表操作要熟悉,这让我明白了基础的重要性。日后应认真完成每一次实验,对于计算机专业的学生,编码能力与思考能力才是最重要的。