计费管理系统

本项目模拟网吧计费管理系统,基于C语言实现.主要运用C语言文件、单链表、结构体基本操作
主要功能:
1.添加卡信息
2.查询卡信息
3.上机登陆操作
4.下机操作
5.卡充值操作
6.卡退费操作
7.查询统计
8.注销卡
9.退出
下面介绍各文件及其具体功能
IDE: codeblocks
main.cpp

#include <string.h>
#include "menu.h"
int main()
{outputmenu();//程序入口return 0;
}

menu.cpp

#include <stdio.h>
#include<stdlib.h>
#include <string.h>
#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("请输入上机密码<c长度为1~8> \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 <stdio.h>
#include<stdlib.h>
#include <string.h>
#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;elsereturn 0;
}

card_file.cpp

#include <stdio.h>
#include<stdlib.h>
#include <string.h>
#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.txtif ((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.txtf2 = fopen("D:\\计费管理系统3\\计费管理系统4\\card.txt", "w");  //写card.txtwhile (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 <stdio.h>
#include<stdlib.h>
#include <string.h>
#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;elsereturn 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;elsereturn 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 <stdio.h>
#include<stdlib.h>
#include <string.h>
#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函数(提示用户操作选择)

  1. 统计总营业额:->调用billing_service.cpp中inQuiryTo函数->readInfo函数从二进制文件中读取消费信息->inQuiryTo函数计算总消费信息并返回
  2. 查询某卡消费记录:->调用billing_service.cpp中inQuiryMon函数->readInfo函数从二进制文件中读取消费信息->inQuiryMon函数读取消费信息 卡号比较 获得该卡消费金额

充值退费调用service.cpp中函数
充值操作:menu.cpp调用addMoney函数->调用service.cpp中addMoney函数->调用card_file.cpp中updateCard函数->更文件中卡信息

退费操作:menu.cpp调用reFundMoney函数->调用service中dofeFundMoney函数->调用card_file.cpp中updateCard函数->更文件中卡信息

Thoughts

程序已基本调试完成,但仍存在冗余部分。整体难度适中,主要是文件操作 链表操作要熟悉,这让我明白了基础的重要性。日后应认真完成每一次实验,对于计算机专业的学生,编码能力与思考能力才是最重要的。

WHUT C语言计费(网吧)管理系统相关推荐

  1. C语言 网吧管理系统 链表项目设计

    文章目录 C语言 & 网吧管理系统 总起. 功能以及代码排版要求 7. 系统 7.1 主函数设计~ 7.2 开启系统后登录 7.2.1 输入 7.2.2 初始化+导入 7.2.3 遍历链表~ ...

  2. 网吧管理系统C语言作业,C语言课程设计-网吧管理系统.doc

    C语言课程设计-网吧管理系统 <通信工程专业C语言课程设计> 报 告 专 业: 通信工程 班 级: 0802 姓 名: 赵 松 指导教师: 丁 雄 二00九 年 十二 月 二十五 日 目 ...

  3. c语言-网吧管理系统

    #include <stdio.h> #include <conio.h>//getch #include <windows.h>//Sleep屏幕暂停 #incl ...

  4. java如何实现计费软件_基于jsp的网吧自动计费收费管理系统-JavaEE实现网吧自动计费收费管理系统 - java项目源码...

    基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的网吧自动计费收费管理系统, 该项目可用各类java课程设计大作业中, 网吧自动计费收费管理系统的系统架构分为前后台 ...

  5. javawebJAVAJSP网吧计费管理系统(JSP网吧管理系统)JSP网吧收费管理系统JSP网吧自动计费管理系统

    javawebJAVAJSP网吧计费管理系统(JSP网吧管理系统)JSP网吧收费管理系统JSP网吧自动计费管理系统 protected void doGet(HttpServletRequest re ...

  6. 网吧管理系统------C语言课设

    网吧管理系统------C语言课设 1.课程设计报告的要求 2.实现管理员注册和登录模块的代码 3.实现管理员对用户的管理功能及简介如下,包括上下机,余额积分加减等功能. 4.主函数 5.存在的不足 ...

  7. 毕业设计C语言网吧管理系统,毕业设计网吧管理系统.doc

    毕业设计网吧管理系统.doc 本科生毕业论文(设计) 题目: 网吧管理系统――服务器子系统 学 院 数学与计算机学院 学科门类 理 科 专 业 信息与计算科学 学 号 024092553 姓 名 陈绍 ...

  8. 基于C/C++语言的停车场管理系统编程课程设计超详细

    详细代码讨论加我QQ:1271370903 程序设计课程实践 基于C语言的停车管理系统编程设计 1.课程目的 本程序旨在训练学生的C语言基本编程能力,通过串联C语言输入输出.循环语句.子函数设计.数组 ...

  9. 【c项目】网吧管理系统的设计和实现

    文章目录 前言 一.设计任务 二.程序设计与实现 1.数据描述 2.功能模块设计 三.UI设计效果 5.项目到目前为止存在的不足及改正措施: 四.代码实现(记得添加一个Account library. ...

最新文章

  1. SpringBoot (七) :SpringBoot 整合dubbo
  2. Python 实现 PD 文字识别、提取并写入 CSV 文件脚本分享
  3. python怎么重启内核_解决jupyter运行pyqt代码内核重启的问题
  4. 从数据库中存取二进制数据并显示
  5. php判断几维数组的方法,php如何判断数组是几维
  6. QT:MainWindow初始化列表解释
  7. [实战] 用数人云,部署弹性 ELK 集群就五步 1
  8. boot spring 解析csv_spring-boot-starter-thymeleaf 避坑指南
  9. hibernate中save、update、saveOrUpdate的区别
  10. 为vsftpd添加虚拟用户的脚本
  11. arcgis api for flex 开发入门(七)Geometry service 的使用
  12. 敏捷开发免费管理工具——火星人预览(四)
  13. 基于java-GUI高校科研成果管理系统
  14. AutoCAD Electrical(ACE)的基本操作——新建项目、绘制电气原理图、线路标号
  15. excel表格怎么关闭函数计算机,excel表格的数据如何去掉公式-如何取消Excel表格里面的函数公式...
  16. SAMA5D3X-EK 嵌入式linux内核编译启动及通过nfs通过网络启动文件系统及文件系统镜像的制作
  17. win7如何开启无线网卡服务器,大神教你win7无线网卡怎么设置wifi
  18. 对于目标检测中mAP@0.5的理解
  19. 3D建模软件大总结,你都知道哪些?
  20. Java 11已经不再完全免费,不要陷入Oracle的Java 11陷阱

热门文章

  1. android h5和原生方法调用,Android原生与H5通信
  2. 计算机ps2定义,软件硬件界面接口定义 bt656 硬件接口定义
  3. vba 批量生成条形图代码
  4. 公有云 私有云及架构
  5. JavaScript百炼成仙 1.18 函数七重关之一 (函数定义)
  6. Hack the box靶机 October
  7. Java模拟项目开发(快递柜)
  8. 苹果怎么开启开发者模式
  9. 解决VScode调试C++文件名不能出现中文的情况
  10. vue-seamless-scroll数据量少时,暂停滚动,继续滚动