WHUT C语言计费(网吧)管理系统
计费管理系统
本项目模拟网吧计费管理系统,基于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函数(提示用户操作选择)
- 统计总营业额:->调用billing_service.cpp中inQuiryTo函数->readInfo函数从二进制文件中读取消费信息->inQuiryTo函数计算总消费信息并返回
- 查询某卡消费记录:->调用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语言计费(网吧)管理系统相关推荐
- C语言 网吧管理系统 链表项目设计
文章目录 C语言 & 网吧管理系统 总起. 功能以及代码排版要求 7. 系统 7.1 主函数设计~ 7.2 开启系统后登录 7.2.1 输入 7.2.2 初始化+导入 7.2.3 遍历链表~ ...
- 网吧管理系统C语言作业,C语言课程设计-网吧管理系统.doc
C语言课程设计-网吧管理系统 <通信工程专业C语言课程设计> 报 告 专 业: 通信工程 班 级: 0802 姓 名: 赵 松 指导教师: 丁 雄 二00九 年 十二 月 二十五 日 目 ...
- c语言-网吧管理系统
#include <stdio.h> #include <conio.h>//getch #include <windows.h>//Sleep屏幕暂停 #incl ...
- java如何实现计费软件_基于jsp的网吧自动计费收费管理系统-JavaEE实现网吧自动计费收费管理系统 - java项目源码...
基于jsp+servlet+pojo+mysql实现一个javaee/javaweb的网吧自动计费收费管理系统, 该项目可用各类java课程设计大作业中, 网吧自动计费收费管理系统的系统架构分为前后台 ...
- javawebJAVAJSP网吧计费管理系统(JSP网吧管理系统)JSP网吧收费管理系统JSP网吧自动计费管理系统
javawebJAVAJSP网吧计费管理系统(JSP网吧管理系统)JSP网吧收费管理系统JSP网吧自动计费管理系统 protected void doGet(HttpServletRequest re ...
- 网吧管理系统------C语言课设
网吧管理系统------C语言课设 1.课程设计报告的要求 2.实现管理员注册和登录模块的代码 3.实现管理员对用户的管理功能及简介如下,包括上下机,余额积分加减等功能. 4.主函数 5.存在的不足 ...
- 毕业设计C语言网吧管理系统,毕业设计网吧管理系统.doc
毕业设计网吧管理系统.doc 本科生毕业论文(设计) 题目: 网吧管理系统――服务器子系统 学 院 数学与计算机学院 学科门类 理 科 专 业 信息与计算科学 学 号 024092553 姓 名 陈绍 ...
- 基于C/C++语言的停车场管理系统编程课程设计超详细
详细代码讨论加我QQ:1271370903 程序设计课程实践 基于C语言的停车管理系统编程设计 1.课程目的 本程序旨在训练学生的C语言基本编程能力,通过串联C语言输入输出.循环语句.子函数设计.数组 ...
- 【c项目】网吧管理系统的设计和实现
文章目录 前言 一.设计任务 二.程序设计与实现 1.数据描述 2.功能模块设计 三.UI设计效果 5.项目到目前为止存在的不足及改正措施: 四.代码实现(记得添加一个Account library. ...
最新文章
- SpringBoot (七) :SpringBoot 整合dubbo
- Python 实现 PD 文字识别、提取并写入 CSV 文件脚本分享
- python怎么重启内核_解决jupyter运行pyqt代码内核重启的问题
- 从数据库中存取二进制数据并显示
- php判断几维数组的方法,php如何判断数组是几维
- QT:MainWindow初始化列表解释
- [实战] 用数人云,部署弹性 ELK 集群就五步 1
- boot spring 解析csv_spring-boot-starter-thymeleaf 避坑指南
- hibernate中save、update、saveOrUpdate的区别
- 为vsftpd添加虚拟用户的脚本
- arcgis api for flex 开发入门(七)Geometry service 的使用
- 敏捷开发免费管理工具——火星人预览(四)
- 基于java-GUI高校科研成果管理系统
- AutoCAD Electrical(ACE)的基本操作——新建项目、绘制电气原理图、线路标号
- excel表格怎么关闭函数计算机,excel表格的数据如何去掉公式-如何取消Excel表格里面的函数公式...
- SAMA5D3X-EK 嵌入式linux内核编译启动及通过nfs通过网络启动文件系统及文件系统镜像的制作
- win7如何开启无线网卡服务器,大神教你win7无线网卡怎么设置wifi
- 对于目标检测中mAP@0.5的理解
- 3D建模软件大总结,你都知道哪些?
- Java 11已经不再完全免费,不要陷入Oracle的Java 11陷阱