(一)系统的功能构成图

(二)系统的功能说明

序号

模块

功能

说明

1

卡管理

添加卡

输入卡号、密码、开卡金额等卡信息,将卡信息保存到data文件夹的card.txt文件中

2

查询卡

根据输入的卡号,查询卡号相同的卡信息,并以表格形式显示在控制台中

3

注销卡

根据输入的卡号、密码,将对应卡的状态改为注销,注销卡不能进行上机

4

计费标准管理

新增计费标准

输入计费标准的信息,将输入的计费标准保存到data文件夹的rate.txt文件中

5

查询计费标准

根据上机时间,查询对应的计费标准

6

删除计费标准

从计费标准文件data文件夹的rate.txt文件中,删除一条计费标准

7

修改计费标准

修改一条计费标准

8

计费管理

上机

根据输入的卡号、密码,判断该卡能否上机,如果能上机,则保存计费信息

9

下机

根据输入下机卡的卡号,进行下机结算操作

10

费用管理

充值

给一条已经存在的卡进行充值。

11

退费

将卡中余额返回给用户

12

查询统计

查询消费记录

查询一张卡在一段时间内的消费记录

13

统计总营业额

统计一段时间内,总营业额

14

统计月营业额

统计一年中,每个月上机次数、总营业额,将统计结果保存到文本文件中,并以列表形式显示在控制台中。

15

权限管理

添加管理员

超级管理员添加一个管理员信息

16

删除管理员

超级管理员删除一个管理员信息

17

配置权限

添加管理员时,配置管理员的权限

18

系统

登录

超级管理员和管理员登录系统

19

退出

超级管理员和管理员退出系统

(三)系统的实现技术要求

  1. 必须使用链表描述系统的数据结构,使用文件保存数据。
  2. 要求每一项功能的实现必须以函数调用的形式完成。
#define _CRT_SECURE_NO_DEPRECATE
#pragma warning(disable:4996)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#include<time.h>
struct monthtime
{int year;int month;float cost;struct monthtime* next;
}monthtime;
struct standerd
{int time;float money;struct standerd* next;
}standerd;              //计费标准结构体
struct people           //每个人的结构体
{int card;          //卡号char passward[20];  //密码float money;        //金额int type;           //普通人 0 管理员 1,超管 2  注销3struct jur            //权限设置{int a, b, c, d, e;   //a计费标准管理,b计费管理,c费用管理,d查询统计,e权限管理.}jur;int state;               //显示现在卡是否上机 1在线 0不在线struct people* next;    //连接struct up               //上机记录时间{int year;int month;int day;int hour;int minute;int second;}up;struct down              //下机记录时间{int year;int month;int day;int hour;int minute;int second;}down;unsigned int time;     //记录秒数,方便计算float cost;
}people;
void Cardmanagement(struct people* head, struct people d);//卡管理系统
void cardadd(struct people* head);//添加卡的操作
void cardfind();//查询卡操作
void cardcancellation(struct people* head, struct people z);//卡号注销和重启
void freightbasis(struct people d);//计费管理标准系统
void addbasis();//增加操作
void findbasis();//查询
void delbasis();//删除
void revisionbasis();//修改
void updown(struct people d);//上下机系统
void upcomputer();//上机操作
void downcomputer();//下机操作
void cost(struct people d);//充值退费系统
void Recharge();//充值账号
void Refund();//退钱
void Authoritymanagement(struct people* head, struct people d);//配置管理员权限
void resetsuper();//重置设置超管
void superresgis();//超管权限注册
void judgemoney();//用来查消费记录和总额
void moneycost();//查询某张卡的消费记录
void findtimemoney();//统计总营业额
void findtimemoney();//查找一段时间的总金额(只支持年份和月份)
void findyear();//查询某一年的上机次数和当月总金额
void addadministrators(struct people* head);//注册一个新的管理员并配置权限
void delcard(struct people im);//删除管理员
struct people signin(struct people* head);//登录系统
void read(struct people** head);//读取card的所有链表
void type(struct people d);//身份判断系统
int cardfind1(struct people d, struct people* head);//判断是否与已有卡重复,若是返回1
void changeministrators();//修改权限
void readbasis(struct standerd** head);//读取rate里面的内容
void writebasis(struct standerd* head);//将链表的内容写入
void rangebasis(struct standerd** head, struct standerd d);//将要增加排序后放入链表
void judgebasis();
void readmoney(struct people** head);
void moneymanagement(struct people d);
void addmonthtime(struct people d);//读取money的列表
void addmonthtime(struct people d);//每次下机都写入文件中
void readmonthtime(struct monthtime** head);//读取文件
void judgemonth();//判断month.txt是否存在int main(void)
{   struct people* head, im;    //head为头结点,im为当前登录账户的所有信息int m, d = 0;              //m主菜单用来进二级系统的判断,d退出系统判断superresgis();judgebasis();judgemoney();judgemonth();
logoff:read(&head);im = signin(head);if (im.type == 4)           //判断密码或账户是否错误,错误直接退出{return 0;}printf("%d账号登录此系统,您的身份是", im.card);type(im);while (1)                    //主菜单{printf("\n----------------**************----------------");printf("\n        请输入你要进入的系统!\n");printf("\n   1        卡管理系统\n\n   2       计费标准管理\n\n   3          上下机\n\n   4         充值退费\n\n   5        管理员系统\n\n   6       查询消费记录\n\n   7     注销账号并登录其它账号\n\n   8          退出系统\n    ");printf("\n         请选择要进入的系统:");scanf("%d", &m);printf("\n\n--------------**************----------------");switch (m){case 1:Cardmanagement(head, im); break;case 2:freightbasis(im); break;case 3:updown(im); break;case 4:cost(im); break;case 5:Authoritymanagement(head, im); break;case 6:moneymanagement(im); break;case 7:goto logoff;case 8: d = 1; break;}if (d == 1)break;}
}
void resetsuper()               //重置设置超管
{FILE* fp;char a;struct people d;if ((fp = fopen("judge.txt", "r")) != NULL){fclose(fp);return;}fp = fopen("judge.txt", "w+");a = '0';fputc(a, fp);fclose(fp);
}
void superresgis()//超管权限注册
{FILE* fp;char a;struct people d;resetsuper();//重置超管fp = fopen("judge.txt", "r+");a = fgetc(fp);if (a == '1'){fclose(fp);return;}rewind(fp);a = '1';fputc(a, fp);fclose(fp);fp = fopen("card.txt", "wb+");printf("          **********您已进入超级管理员注册系统!***********    \n");printf("*                                                                *\n");printf("\n*  请输入需要注册的卡号:                                        *\n");scanf("%d", &d.card);printf("\n*  请输入您的密码(密码不得超过20位):                          *\n");scanf("%s", &d.passward);printf("\n*  卡内拥有金额为:                                              *\n");scanf("%f", &d.money);//scanf("%d%s%d", &d.card, &d.passward, &d.money);d.type = 2;d.jur.a = 1, d.jur.b = 1, d.jur.c = 1, d.jur.d = 1, d.jur.e = 1;d.next = NULL;d.state = 0;fwrite(&d, sizeof(struct people), 1, fp);printf("\n*  恭喜您已经成功注册超管,拥有所有权限!                         *\n");fclose(fp);return;
}
struct people signin(struct people* head)//登录系统
{int c = 0;printf("\n----------------------------------------- \n     ");
try1:printf("\n请输入您的卡号:");struct people d;scanf("%d", &d.card);struct people* p1, * p2;p1 = head;while (p1 != NULL){if (p1->card == d.card){p2 = p1;c = 1;break;}p1 = p1->next;if (p1->card < 0)break;}if (c == 1){try2:printf("\n请输入密码:");scanf("%s", d.passward);if (strcmp(p2->passward, d.passward) == 0)//返回此账户的所有信息{d = *p2;printf("\n欢迎");return d;}else{printf("密码错误,请重新输入\n");goto try2;}//此处未来需要做一个重新输入密码系统}else{printf("未查询到此卡号,请重新检查\n");//未来做退出和重新输入printf("\n--------------------------------------- \n     ");goto try1;return d;}
}
void read(struct people** head)//读取card的所有链表
{FILE* fp, * fp1;fp = fopen("card.txt", "rb");int i;struct people* p1, * p2;for (i = 1;; i++){if (feof(fp))break;if ((p1 = (struct people*)malloc(sizeof(struct people))) == NULL){printf("不能成功分配储存区块!\n");}fread(p1, sizeof(struct people), 1, fp);if (i == 1)*head = p1;elsep2->next = p1;p2 = p1;p1->next = NULL;}fclose(fp);
}
void type(struct people d)//身份判断系统
{if (d.type == 0){printf("普通用户!\n");}if (d.type == 1){printf("管理员!\n");}if (d.type == 2){printf("超级管理员!\n");}if (d.type == 3){printf("注销卡\n");}
}
void Cardmanagement(struct people* head, struct people d)//卡管理系统
{int c, z = 0;if (d.type == 0 || d.jur.a == 0){printf("您没有权限进入卡管理系统");return;}while (1)//卡管理系统页面{printf("\n              \n------------------<<<<<<<<------------------   \n");printf("\n                 请选择进入的页面\n\n");printf("        1            添加卡\n\n        2            查询卡\n\n        3         注销和恢复卡\n\n        4            删除卡\n\n        5        退出卡管理系统\n       ");printf("\n                    请选择:");scanf("%d", &c);printf("\n              \n------------------<<<<<<<<------------------    \n\n");switch (c){case 1:cardadd(head); break;case 2:cardfind(); break;case 3:cardcancellation(head, d); break;case 4:delcard(d); break;case 5:z = 1; break;}if (z == 1)break;}
}
void cardadd(struct people* head)//添加卡的操作
{FILE* fp;struct people d, f;int z = 0;//判断是否注册
try1:printf("---------------------------------------------\n");printf("\n是否要退出卡增加系统,是请按1,不是按0: ");//防止点错了scanf("%d", &z);if (z == 1)return;printf("\n输入添加的卡号(卡号需要大于0),密码,存储金额: ");int c = 0;//判断是否重复scanf("%d%s%f", &d.card, &d.passward, &d.money);c = cardfind1(d, head);if (c == 1){printf("\n卡号重复,请换号码\n");goto try1;}printf("\n请再次输入一遍密码:");scanf("%s", f.passward);if (strcmp(d.passward, f.passward) == 0){d.type = 0, d.next = NULL, d.jur.c = 1, d.jur.d = 1, d.jur.e = 1, d.state = 0;fp = fopen("card.txt", "ab");fwrite(&d, sizeof(struct people), 1, fp);printf("\n恭喜您成功添加卡!\n\n");printf("---------------------------------------------\n");fclose(fp);}else{printf("请重新注册\n\n");printf("---------------------------------------------\n");goto try1;}
}
void cardfind()
{int c = 0;struct people* head1;read(&head1);printf("---------------------------------------------\n");printf("\n请输入您的卡号: ");struct people d;scanf("%d", &d.card);struct people* p1, * p2;p1 = head1;while (p1 != NULL){if (p1->card == d.card){p2 = p1;c = 1;break;}p1 = p1->next;if (p1->card <= 0)break;}if (c == 1){d = *p2;printf("已查询到此卡\n");printf("此卡账号为%d,剩余金额为%.2f,权限为", p2->card, p2->money);type(d);printf("状态为");if (d.state == 0)printf("下机");elseprintf("上机中");printf("\n已返回卡管理系统!\n\n");printf("---------------------------------------------\n");}else{printf("无法查到此卡\n\n");printf("---------------------------------------------\n");}
}
int cardfind1(struct people d, struct people* head)//判断是否与已有卡重复,若是返回1
{int c = 0;struct people* p1, * p2;p1 = head;while (p1 != NULL){if (p1->card == d.card){p2 = p1;c = 1;break;}p1 = p1->next;if (p1->card < 0)break;}if (c == 1)return 1;elsereturn 0;
}
void cardcancellation(struct people* head, struct people z)//卡号注销和重启
{FILE* fp;fp = fopen("card.txt", "r+");int a;//用来判断注销或重启int c = 0;//判断有没有这张卡printf("---------------------------------------------\n");printf("\n请输入您需要操作的卡号: ");struct people d, e;//e用来储存要更改的文件项目scanf("%d", &d.card);while (!feof(fp)){fread(&e, sizeof(struct people), 1, fp);if (e.card == d.card){d = e;fseek(fp, -sizeof(struct people), 1);c = 1;break;}}if (c == 1){printf("请输入操作 0为注销卡,1为恢复卡:");scanf("%d", &a);if (a == 0){printf("注意,此操作也会把管理员和超级管理员给注销\n");d.type = 3;fwrite(&d, sizeof(struct people), 1, fp);fclose(fp);printf("已经成功变为注销卡\n\n");printf("---------------------------------------------\n");}else if (a == 1){int h;printf("请选择恢复身份,0普通人,1管理员(注意,若登陆身份为管理员则无法将卡恢复为管理员): ");scanf("%d", &h);if (h == 1){if (z.type == 1){printf("操作无效\n\n");printf("---------------------------------------------\n");return;}}d.type = h;fwrite(&d, sizeof(struct people), 1, fp);fclose(fp);printf("已经成功恢复!\n\n");printf("---------------------------------------------\n");return;}else{printf("操作无效!\n\n");printf("---------------------------------------------\n");return;}}else{printf("找不到此卡!\n\n");printf("---------------------------------------------\n");return;}
}
void Authoritymanagement(struct people* head, struct people d)//配置管理员权限
{int c;if (d.type != 2 || d.jur.a == 0){printf("您没有权限进入此系统\n");return;}while (1){printf("\n--------------<<<<<<<<<<----------------\n\n");printf("       1          增加管理员\n\n       2          修改管理员\n\n       3          删除管理员\n\n       4          退出\n\n       请选择要进入的系统:");scanf("%d", &c);printf("\n--------------<<<<<<<<<<----------------\n");switch (c){case 1:addadministrators(head); break;case 2:changeministrators(); break;case 3:delcard(d); break;case 4:return;}}
}
void addadministrators(struct people* head)//注册一个新的管理员并配置权限
{FILE* fp;struct people d, f;int z = 0;
try1:printf("\n---------------------------------------------\n");printf("\n输入添加的卡号(卡号需要大于0),密码,存储金额:");int c = 0;//判断是否重复scanf("%d%s%d", &d.card, &d.passward, &d.money);c = cardfind1(d, head);if (c == 1){printf("卡号重复,请换号码\n");goto try1;}printf("\n请再次输入一遍密码:");scanf("%s", f.passward);if (strcmp(d.passward, f.passward) == 0){int a[5];printf("\n配置管理员权限(1为允许,0为不允许)\n");printf("\n管理员权限为:卡管理系统,计费标准管理系统,计费管理系统,费用系统,查询统计\n");printf("\n请输入(输入0或1设置是否配置该权限):");scanf("%d%d%d%d%d", &a[0], &a[1], &a[2], &a[3], &a[4]);d.jur.a = a[0], d.jur.b = a[1], d.jur.c = a[2], d.jur.d = a[3], d.jur.e = a[4], d.type = 1, d.state = 0;fp = fopen("card.txt", "ab");fwrite(&d, sizeof(struct people), 1, fp);printf("\n成功添加卡!\n\n");fclose(fp);return;}else{printf("\n请重新注册!\n\n");goto try1;}
}
void changeministrators()//修改权限
{FILE* fp;fp = fopen("card.txt", "r+");int a[5];//更改权限int c = 0;//判断有没有这张卡printf("\n---------------------------------------------\n");printf("\n请输入您需要操作的卡号:");struct people d, e;//e用来储存要更改的文件项目scanf("%d", &d.card);while (!feof(fp)){fread(&e, sizeof(struct people), 1, fp);if (e.card == d.card){d = e;fseek(fp, -sizeof(struct people), 1);c = 1;break;}}if (d.type != 1){printf("\n这不是管理员账户,无法更改\n");return;}if (c == 1){printf("\n配置管理员权限(1为允许,0为不允许)\n");printf("\n权限包括:卡管理系统,计费标准管理系统,计费管理系统,费用系统,查询统计,\n");printf("\n请输入(输入0或1设置是否配置该权限):");scanf("%d%d%d%d%d", &a[0], &a[1], &a[2], &a[3], &a[4]);d.jur.a = a[0], d.jur.b = a[1], d.jur.c = a[2], d.jur.d = a[3], d.jur.e = a[4];fwrite(&d, sizeof(struct people), 1, fp);fclose(fp);printf("\n修改成功!\n\n");}else{printf("\n未找到此卡号!\n\n");fclose(fp);}
}
void delcard(struct people im)
{FILE* fp;int c = 0, i = 1;//判断有无卡,判断是否是第一次struct people d, e, * p1, * p2, * head;read(&head);printf("\n请输入要删除的卡号: ");scanf("%d", &d.card);p1 = head;p2 = p1;while (p1->next != NULL){if (p1->card == d.card){c = 1;break;}if (i > 1)p2 = p1;p1 = p1->next;i++;if (p1->card <= 0)break;}if (p1 == p2){printf("无法删除超级管理员!\n\n");return;}if (c == 0){printf("对不起,没有找到这张卡!\n\n");return;}if (p1->type == im.type){printf("管理员无法删除管理员!\n\n");}else{p2->next = p1->next;p1->next = NULL;p1 = head;fp = fopen("card.txt", "wb+");while (p1->card > 0)//写入文件{d = *p1;fwrite(&d, sizeof(struct people), 1, fp);p1 = p1->next;}fclose(fp);printf("已成功删除此卡号!\n\n");return;}
}
void cost(struct people d)//充值退费系统
{int c;if (d.type == 0 || d.jur.c == 0){printf("你无权限进入\n");return;}while (1){printf("\n--------------<<<<<<<<<<----------------\n\n");printf("       1          充值\n\n       2          退费\n\n       3          退出\n\n           请选择要进入的系统:");scanf("%d", &c);printf("\n\n--------------<<<<<<<<<<----------------\n");switch (c){case 1:Recharge(); break;case 2:Refund(); break;case 3:return;}}
}
void Recharge()//充值账号
{FILE* fp;float c, h;struct people d, e;fp = fopen("card.txt", "rb+");printf("\n请输入要充值的卡号: ");scanf("%d", &d.card);while (!feof(fp)){fread(&e, sizeof(struct people), 1, fp);if (e.card == d.card){d = e;fseek(fp, -sizeof(struct people), 1);c = 1;break;}}if (c == 1){printf("请输入要充值的金额: ");scanf("%f", &h);d.money = d.money + h;fwrite(&d, sizeof(struct people), 1, fp);fclose(fp);printf("充值成功,当前账户余额%.2f\n\n", d.money);return;}else{fclose(fp);printf("无法查询到此卡\n\n");printf("\n--------------------------------------------\n");return;}
}
void Refund()//退钱
{FILE* fp;int c;float h;struct people d, e;fp = fopen("card.txt", "rb+");printf("\n请输入要退费的卡号: ");scanf("%d", &d.card);while (!feof(fp)){fread(&e, sizeof(struct people), 1, fp);if (e.card == d.card){d = e;fseek(fp, -sizeof(struct people), 1);c = 1;break;}}if (c == 1){printf("这张卡当前余额%.2f\n", d.money);try1:printf("请输入要退费的金额: ");scanf("%f", &h);if (d.money < h){printf("您的余额不足,请重新输入!\n\n");goto try1;}d.money = d.money - h;fwrite(&d, sizeof(struct people), 1, fp);fclose(fp);printf("退费成功,当前账户余额%.2f\n\n", d.money);return;}else{fclose(fp);printf("无法查询到此卡\n\n");return;}
}
void freightbasis(struct people d)//计费管理标准系统
{if (d.type == 0 || d.jur.b == 0 || d.type == 0){printf(",对不起,您没有权限进入此系统");return;}int c;while (1){printf("\n--------------<<<<<<<<<<----------------\n\n");printf("       1          增加\n\n       2          查询\n\n       3          删除\n\n       4          修改\n\n       5          退出\n\n       请选择要进入的系统:");scanf("%d", &c);printf("\n--------------<<<<<<<<<<----------------\n");switch (c){case 1:addbasis(); break;case 2:findbasis(); break;case 3:delbasis(); break;case 4:revisionbasis(); break;case 5:return; break;}}
}
void addbasis()//增加操作
{int c = 0;struct standerd d, * p1, * p2;printf("\n输入多少时间(小时)多少钱(元): ");scanf("%d%f", &d.time, &d.money);d.next = NULL;readbasis(&p1);p2 = p1;while (p2 != NULL){if (p2->time == d.time){c = 1;break;}p2 = p2->next;;}if (c == 0)rangebasis(&p1, d);elseprintf("输入了重复的时间!\n");
}
void readbasis(struct standerd** head)//读取rate里面的内容
{FILE* fp, * fp1;fp = fopen("rate.txt", "rb");int i;struct standerd* p1, * p2;for (i = 1;; i++){if (feof(fp))break;if ((p1 = (struct standerd*)malloc(sizeof(struct standerd))) == NULL){printf("不能成功分配储存区块!\n");}fread(p1, sizeof(struct standerd), 1, fp);if (p1->money < 0)return;if (i == 1)*head = p1;elsep2->next = p1;p2 = p1;p2->next = NULL;}fclose(fp);
}
void rangebasis(struct standerd** head, struct standerd d)//将要增加排序后放入链表
{struct standerd* p1, * p2, * p4;int c = 0;p1 = *head;if (p1 == NULL){p1 = &d;c = 1;}if (p1->next == NULL && d.time > p1->time){p1->next = &d;c = 1;}if (p1->next == NULL && d.time < p1->time){d.next = p1;*head = &d;c = 1;}while (c == 0){if (p1->next == NULL){p1->next = &d;d.next = NULL;break;}if (d.time > p1->time && d.time < p1->next->time){p2 = p1->next;p1->next = &d;d.next = p2;break;}p1 = p1->next;}writebasis(*head);printf("成功写入\n");
}
void writebasis(struct standerd* head)//将链表的内容写入
{FILE* fp;struct standerd d, * p1;p1 = head;fp = fopen("rate.txt", "wb+");while (p1 != NULL){d = *p1;fwrite(&d, sizeof(struct standerd), 1, fp);p1 = p1->next;}fclose(fp);return;
}
void findbasis()
{struct standerd* p1;readbasis(&p1);int c;for (c = 0;; c++){if (c != 0)printf("\n%d.上机%d小时需要花费%.2f人民币\n", c, p1->time, p1->money);p1 = p1->next;if (p1 == NULL)break;}return;
}
void delbasis()
{FILE* fp;struct standerd* head, * p1, * p2;readbasis(&head);p1 = p2 = head;printf("\n输入你要删除的计费标准(输入小时数):");int c, i = 1, g = 0;scanf("%d", &c);printf("已成功删除!\n\n");while (p1 != NULL){if (p1->time == c){p2->next = p1->next;p1->next = NULL;g = 1;break;}if (i != 1)p2 = p1;i++;p1 = p1->next;}if (g == 1){fp = fopen("rate.txt", "wb+");struct standerd d;p1 = head;while (p1 != NULL){fwrite(p1, sizeof(struct standerd), 1, fp);p1 = p1->next;}fclose(fp);}elseprintf("未找到此小时数!\n\n");
}
void revisionbasis()
{FILE* fp;struct standerd d;int r, time, money;printf("\n输入你要修改的计费标准(输入小时数): ");scanf("%d", &r);fp = fopen("rate.txt", "rb+");while (!feof(fp)){fread(&d, sizeof(struct standerd), 1, fp);if (d.time == r){printf("请输入要修改的时间以及金额:");scanf("%d%d", &time, &money);printf("已修改成功!\n\n");fseek(fp, -sizeof(struct standerd), 1);d.time = time, d.money = money;fwrite(&d, sizeof(struct standerd), 1, fp);fclose(fp);return;}}printf("未能找到!\n\n");fclose(fp);return;
}
void updown(struct people d)//上下机系统
{if (d.type == 3 || d.jur.c == 0){printf("此卡已注销或无权限访问,无法上下机,请寻找管理员恢复");return;}int c;while (3){printf("\n--------------<<<<<<<<<<----------------\n\n");printf("       1          上机\n\n       2          下机\n\n       3          退出\n\n           请选择要进入的系统:");scanf("%d", &c);printf("\n\n--------------<<<<<<<<<<----------------\n");switch (c){case 1:upcomputer(); break;case 2:downcomputer(); break;case 3:return; break;}}
}
void upcomputer()//上机操作
{int u = 0;struct people p, d, * p3;printf("\n输入上机的卡号:");scanf("%d", &p.card);printf("上机成功!\n\n");read(&p3);while (p3 != NULL){if (p3->card = p.card){d = *p3;u = 1;break;}p3 = p3->next;}if (u == 0){printf("未能找到此卡!\n\n");}if (d.state == 1){printf("无法重复上机,此卡已经在上机状态!\n\n");return;}FILE* fp;int h = 0;//判断是否找到struct people c;fp = fopen("card.txt", "rb+");while (!feof(fp)){fread(&c, sizeof(struct people), 1, fp);if (c.card == d.card){fseek(fp, -sizeof(struct people), 1);h = 1;break;}}if (h == 0){printf("无法找到此卡!\n\n");return;}struct tm info;time_t now = time(NULL);info = *localtime(&now);d.up.year = info.tm_year + 1900;d.up.month = info.tm_mon + 1;d.up.day = info.tm_mday;d.up.hour = info.tm_hour;d.up.minute = info.tm_min;d.up.second = info.tm_sec;d.time = now;d.state = 1;fwrite(&d, sizeof(struct people), 1, fp);fclose(fp);return;
}
void downcomputer()//按照上行计算,比如有1小时和3小时计费标准,上机2小时,则按照三小时的单价去计算
{int u = 0;struct people p, d, * p3;printf("\n输入下机的卡号: ");scanf("%d", &p.card);printf("下机成功!\n\n");read(&p3);while (p3 != NULL){if (p3->card == p.card){d = *p3;u = 1;break;}p3 = p3->next;}if (u == 0){printf("未能找到此卡!\n\n");}if (d.state == 0){printf("此卡已在下机状态!\n\n");return;}unsigned int s, e, h = 0, f, i;//s记录开始时间,e记录结束时间,h判断有没有找到卡,f最终的小时数float y, l, cost1;struct standerd t, * head, * p1, * p2;struct people c;FILE* fp, * fp1;fp = fopen("card.txt", "rb+");while (!feof(fp)){fread(&c, sizeof(struct people), 1, fp);if (c.card == d.card){fseek(fp, -sizeof(struct people), 1);h = 1;break;}}if (h == 0){printf("无法找到此卡!\n\n");return;}struct tm info;time_t now = time(NULL);info = *localtime(&now);d.down.year = info.tm_year + 1900;d.down.month = info.tm_mon + 1;d.down.day = info.tm_mday;d.down.hour = info.tm_hour;d.down.minute = info.tm_min;d.down.second = info.tm_sec;s = d.time;e = now;e = e - s;y = e;e = e / 3600;y = y / 3600;if (e == y)f = y;elsef = e + 1;readbasis(&head);p1 = head;for (i = 0;; i++){if (p1->next == NULL){l = p1->money / p1->time;cost1 = l * f;d.cost = cost1;if (d.money < cost1){printf("您的余额不足,请先充值再下机\n\n");return;}d.money = d.money - cost1;d.state = 0;d.next = NULL;addmonthtime(d);break;}if (p1->next->time >= f && p1->time < f){p1 = p1->next;l = p1->money / p1->time;//算出每小时单价cost1 = l * f;//算出花费数if (d.money < cost1){printf("您的余额不足,请先充值再下机!\n\n");return;}d.cost = cost1;//保存到结构体d.money = d.money - cost1;//扣费d.state = 0;//改变状态d.next = NULL;addmonthtime(d);break;}p1 = p1->next;}fwrite(&d, sizeof(people), 1, fp);fclose(fp);fp = fopen("money.txt", "ab+");fwrite(&d, sizeof(struct people), 1, fp);fclose(fp);}
void judgebasis()
{FILE* fp;struct standerd h;if ((fp = fopen("rate.txt", "r")) != NULL){fclose(fp);return;}h.money = 0, h.time = 0;fp = fopen("rate.txt", "wb+");fwrite(&h, sizeof(struct standerd), 1, fp);fclose(fp);
}
void judgemoney()//用来查消费记录和总额的
{FILE* fp;if ((fp = fopen("money.txt", "r")) != NULL){fclose(fp);return;}fp = fopen("money.txt", "w");fclose(fp);return;
}
void moneymanagement(struct people d)
{int c;if (d.type == 3 || d.jur.d == 0){printf("您没有权限进入此系统");return;}while (1){printf("\n--------------<<<<<<<<<<----------------\n\n");printf("       1          查询某张卡的消费记录\n\n       2          查找一段时间内的总金额\n\n       3          查找某一年的总金额\n\n       4          退出\n\n       请选择要进入的系统:");scanf("%d", &c);printf("\n--------------<<<<<<<<<<----------------\n");switch (c){case 1:moneycost(); break;case 2:findtimemoney(); break;case 3:findyear(); break;case 4:return; break;}}
}
void moneycost()//查询某张卡的消费记录
{struct people* p1, d;readmoney(&p1);printf("\n输入要查询的卡号: ");scanf("%d", &d.card);int c = 0;while (p1 != NULL){if (p1 == NULL)break;if (p1->card == d.card){printf("%d年%d月%d号%d时%d分%d秒开始一直到%d年%d月%d号%d时%d分%d秒下机\n", p1->up.year, p1->up.month, p1->up.day, p1->up.hour, p1->up.minute, p1->up.second, p1->down.year, p1->down.month, p1->down.day, p1->down.hour, p1->down.minute, p1->down.second);printf("共花费%.2f元\n\n", p1->cost);c = 1;}p1 = p1->next;}if (c == 0){printf("未查询到此卡的相关消费记录\n\n");}
}
void readmoney(struct people** head)//读取money的列表
{FILE* fp, * fp1;fp = fopen("money.txt", "rb");int i;struct people* p1, * p2;for (i = 1;; i++){if (feof(fp))break;if ((p1 = (struct people*)malloc(sizeof(struct people))) == NULL){printf("不能成功分配储存区块!\n");}fread(p1, sizeof(struct people), 1, fp);if (i == 1)*head = p1;elsep2->next = p1;p2 = p1;p1->next = NULL;}fclose(fp);
}
void findtimemoney()//查找一段时间的总金额(只支持年份和月份)
{struct monthtime* p1;int year, monthstart, monthend, i, monthjudge;float costall = 0;readmonthtime(&p1);printf("\n请输入年份和开始月份,结束月份: ");scanf("%d%d%d", &year, &monthstart, &monthend);while (1){if (p1->year == year){if (p1->month >= monthstart && p1->month <= monthend){monthjudge = p1->month;while (1){if (p1->next == NULL)break;if (p1->cost < 0)break;costall += p1->cost;if (p1->next->month != monthjudge)break;p1 = p1->next;}}}printf("从%d月到%d月的总营业额为%.2f\n\n", monthstart, monthend, costall);if (p1->next == NULL)break;p1 = p1->next;}
}
void addmonthtime(struct people d)//每次下机都写入文件中
{struct monthtime c;c.cost = d.cost;c.month = d.down.month;c.year = d.down.year;FILE* fp;fp = fopen("month.txt", "a+");fwrite(&c, sizeof(struct monthtime), 1, fp);fclose(fp);
}
void readmonthtime(struct monthtime** head)//读取文件
{FILE* fp;fp = fopen("month.txt", "rb");int i;struct monthtime* p1, * p2;for (i = 1;; i++){if (feof(fp))break;if ((p1 = (struct monthtime*)malloc(sizeof(struct monthtime))) == NULL){printf("不能成功分配储存区块!\n");}if ((fread(p1, sizeof(struct monthtime), 1, fp)) == 0)return;if (i == 1)*head = p1;elsep2->next = p1;p2 = p1;p2->next = NULL;}fclose(fp);
}
void judgemonth()//判断month.txt是否存在
{{FILE* fp;if ((fp = fopen("month.txt", "r")) != NULL){fclose(fp);return;}fp = fopen("month.txt", "w");fclose(fp);return;}
}
void findyear()//查询某一年的上机次数和当月总金额
{int year, i, monthjudge;float costall;struct monthtime* p1;readmonthtime(&p1);printf("\n请输入要查询的年份:");scanf("%d", &year);while (1){if (p1->year == year){if (1){monthjudge = p1->month;costall = 0;i = 0;printf("┌──────┐────────────────────┐─────────────────────┐\n");printf("│  %d月 │", monthjudge);while (1){if (p1->next == NULL)break;if (p1->cost < 0)break;costall += p1->cost;i++;if (p1->next->month != monthjudge)break;p1 = p1->next;}printf("  总营业额为%.2f   │   总上机次数为%d次   │\n", costall, i);printf("└──────└────────────────────└─────────────────────┘\n");}}if (p1->next == NULL)break;p1 = p1->next;}
}

大一C语言大作业_网吧收费管理系统相关推荐

  1. 大学C语言系统作业,c语言大作业_学生成绩管理系统v5.0.doc

    Word格式 完美整理 //成绩管理系统v1.0 #include #include #include #define N 30 #define M 6 typedef struct student ...

  2. 大一c语言大作业课题大全,昆明理工大学大一C语言大作业题目.doc

    昆明理工大学大一C语言大作业题目 综合性实践排序求平均值(包括将数拆散求最大最小值).函数ReadDat()随机产生100个存放到数组aa中00个jsSort()函数的功能是:进行降序排列.最后调用函 ...

  3. C语言大作业:旅游资讯管理系统

    C语言大作业:旅游资讯管理系统 题目: 一.主体功能点要求: 1.设计主菜单实现用户交互 a.添加旅游资讯记录 每条记录至少包含如下项:编号.日程安排.费用.点赞数.添加旅游资讯记录时,要求键盘输入对 ...

  4. C语言涉及数组的大作业,c语言大作业_基于数组的学生信息管理系统.doc

    . . word完美格式 <C语言程序设计实训1>报告 设 计 题 目: 基于数组的学生信息管理系统 学 院 名 称: 科学技术学院 专 业: 软件工程 班 级: 108班 姓 名: 大神 ...

  5. 昆明理工大学c语言设计大作业,昆明理工大学大一C语言大作业题目

    综合性实践学习选题 总体要求: 一般每题要求四个函数,输入函数可以从in.dat中读数据,也可用rand()函数自行产生,输出函数完成把结果输出到屏幕或文件的任务,核心处理函数完成题目规定的要求,ma ...

  6. 大一C语言大作业ip合法性,c语言实现判断ip地址是否合法

    满意答案 yinfeng86 2017.07.07 采纳率:53%    等级:10 已帮助:469人 #include int checkIP(const char* p) { int n[4]; ...

  7. C语言大作业之班费管理系统

    班费管理系统 前言: 开发环境:Visual Studio Community 2017: 1.储存班级收支的信息:2.增加班费信息:3.删除班费信息: 4.改变班费信息:5.查找班费信息:6.实现自 ...

  8. c语言大作业班费收支管理系统,求C++编写的程序用静态成员的方法实现对班费的管理...

    满意答案 rcgtr 2013.04.25 采纳率:51%    等级:12 已帮助:12431人 //student.cpp #include using namespace std; class ...

  9. 大一期末C语言大作业—结构体和链表框架

    有很多大一的小白兔,学习C语言,在期末会有大作业 类似学生管理系统,酒店管理系统,电话簿管理系统 这种xxx管理系统大都是要求使用结构体和链表 本着授之以渔不如授之以渔的思想 我现在给出结构体和链表的 ...

  10. 大一上学期C语言大作业—森林冰火人

    C语言大作业-森林冰火人 大作业简介 第三方库 界面图片切换 冰火娃动作图片切换 冰娃火娃的跑动 地面,墙壁,冰水,火水与毒液等的判断 代码实现 头文件 变量简介 结构体及数据初始化 冰火娃图片切换 ...

最新文章

  1. Oracle: 三、Oracle的隐藏事务与视图的创建
  2. pythonjam怎么运行_第二十四天 PYTHON学习
  3. WordPress 不同分类目录调用不同模板的方法
  4. asp删除mysql_asp php 清空access mysql mssql数据库的代码
  5. linux搭建SonarQube代码质量平台_Oracle 最新详细版本
  6. Windows Phone开发(11):常用控件(下) 转:http://blog.csdn.net/tcjiaan/article/details/7300085...
  7. golang语言中bytes包的常用函数,Reader和Buffer的使用
  8. 红帽子服务器怎么重装系统,红帽子RHCS套件安装与配置
  9. python美股财务数据曝光_python实现美股日k线数据获取
  10. Linux 下源代码阅读工具 —— vim + TagList + CTags
  11. 什么是NVMe?一篇文章理清它的前生今世
  12. 软件测试技术案例教程 李海生 cd 源码 source,软件测试技术案例教程
  13. windows批量ping脚本
  14. java数据类型简介
  15. Ubuntu下使用dex2jar
  16. Linux下设置MTU值到9000
  17. luckysheet报错
  18. VMware 虚拟器安装kali镜像
  19. linux下boost编译安装全过程脚本塈bzip2编译安装全过程脚本
  20. vue3使用setup代替created

热门文章

  1. 软件测试的类型有哪些?
  2. 将瀚高数据库表内数据导出Excel格式
  3. Shell脚本之正则表达式详解
  4. 鸿鹄系统和鸿蒙系统区别,荣耀智慧屏正式发布 鸿蒙系统+鸿鹄818芯片 售价3799元起...
  5. 基于并查集的六度分隔理论的验证与实现
  6. 行业观察:OA产品泛滥,如何慧眼如炬?
  7. python进行电子取证
  8. 开放PLM——Aras Innovator编程学习(一)简介
  9. 计算机如何格式化和重装系统,怎样格式化c盘重新安装系统_重装系统时如何格式化C盘...
  10. Ant 下载和配置过程