WHUT C语言计费(网吧)管理系统

计费管理系统

本项目模拟网吧计费管理系统,基于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函数(提示用户操作选择)

  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

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

你可能感兴趣的:(c语言)