(一)系统的功能构成图
(二)系统的功能说明
| 序号 | 模块 | 功能 | 说明 |
| 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 | 退出 | 超级管理员和管理员退出系统 | |
(三)系统的实现技术要求
- 必须使用链表描述系统的数据结构,使用文件保存数据。
- 要求每一项功能的实现必须以函数调用的形式完成。
#define _CRT_SECURE_NO_DEPRECATE #pragma warning(disable:4996) #include#include #include #include #include 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 注销3 struct 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 卡管理系统nn 2 计费标准管理nn 3 上下机nn 4 充值退费nn 5 管理员系统nn 6 查询消费记录nn 7 注销账号并登录其它账号nn 8 退出系统n "); printf("n 请选择要进入的系统:"); scanf("%d", &m); printf("nn--------------**************----------------"); 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; else p2->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 请选择进入的页面nn"); printf(" 1 添加卡nn 2 查询卡nn 3 注销和恢复卡nn 4 删除卡nn 5 退出卡管理系统n "); printf("n 请选择:"); scanf("%d", &c); printf("n n------------------<<<<<<<<------------------ nn"); 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恭喜您成功添加卡!nn"); printf("---------------------------------------------n"); fclose(fp); } else { printf("请重新注册nn"); 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("下机"); else printf("上机中"); printf("n已返回卡管理系统!nn"); printf("---------------------------------------------n"); } else { printf("无法查到此卡nn"); 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; else return 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("已经成功变为注销卡nn"); printf("---------------------------------------------n"); } else if (a == 1) { int h; printf("请选择恢复身份,0普通人,1管理员(注意,若登陆身份为管理员则无法将卡恢复为管理员): "); scanf("%d", &h); if (h == 1) { if (z.type == 1) { printf("操作无效nn"); printf("---------------------------------------------n"); return; } } d.type = h; fwrite(&d, sizeof(struct people), 1, fp); fclose(fp); printf("已经成功恢复!nn"); printf("---------------------------------------------n"); return; } else { printf("操作无效!nn"); printf("---------------------------------------------n"); return; } } else { printf("找不到此卡!nn"); 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--------------<<<<<<<<<<----------------nn"); printf(" 1 增加管理员nn 2 修改管理员nn 3 删除管理员nn 4 退出nn 请选择要进入的系统:"); 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成功添加卡!nn"); fclose(fp); return; } else { printf("n请重新注册!nn"); 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修改成功!nn"); } else { printf("n未找到此卡号!nn"); 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("无法删除超级管理员!nn"); return; } if (c == 0) { printf("对不起,没有找到这张卡!nn"); return; } if (p1->type == im.type) { printf("管理员无法删除管理员!nn"); } 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("已成功删除此卡号!nn"); return; } } void cost(struct people d)//充值退费系统 { int c; if (d.type == 0 || d.jur.c == 0) { printf("你无权限进入n"); return; } while (1) { printf("n--------------<<<<<<<<<<----------------nn"); printf(" 1 充值nn 2 退费nn 3 退出nn 请选择要进入的系统:"); scanf("%d", &c); printf("nn--------------<<<<<<<<<<----------------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("充值成功,当前账户余额%.2fnn", d.money); return; } else { fclose(fp); printf("无法查询到此卡nn"); 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("这张卡当前余额%.2fn", d.money); try1:printf("请输入要退费的金额: "); scanf("%f", &h); if (d.money < h) { printf("您的余额不足,请重新输入!nn"); goto try1; } d.money = d.money - h; fwrite(&d, sizeof(struct people), 1, fp); fclose(fp); printf("退费成功,当前账户余额%.2fnn", d.money); return; } else { fclose(fp); printf("无法查询到此卡nn"); 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--------------<<<<<<<<<<----------------nn"); printf(" 1 增加nn 2 查询nn 3 删除nn 4 修改nn 5 退出nn 请选择要进入的系统:"); 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); else printf("输入了重复的时间!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; else p2->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("已成功删除!nn"); 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); } else printf("未找到此小时数!nn"); } 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("已修改成功!nn"); fseek(fp, -sizeof(struct standerd), 1); d.time = time, d.money = money; fwrite(&d, sizeof(struct standerd), 1, fp); fclose(fp); return; } } printf("未能找到!nn"); fclose(fp); return; } void updown(struct people d)//上下机系统 { if (d.type == 3 || d.jur.c == 0) { printf("此卡已注销或无权限访问,无法上下机,请寻找管理员恢复"); return; } int c; while (3) { printf("n--------------<<<<<<<<<<----------------nn"); printf(" 1 上机nn 2 下机nn 3 退出nn 请选择要进入的系统:"); scanf("%d", &c); printf("nn--------------<<<<<<<<<<----------------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("上机成功!nn"); read(&p3); while (p3 != NULL) { if (p3->card = p.card) { d = *p3; u = 1; break; } p3 = p3->next; } if (u == 0) { printf("未能找到此卡!nn"); } if (d.state == 1) { printf("无法重复上机,此卡已经在上机状态!nn"); 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("无法找到此卡!nn"); 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("下机成功!nn"); read(&p3); while (p3 != NULL) { if (p3->card == p.card) { d = *p3; u = 1; break; } p3 = p3->next; } if (u == 0) { printf("未能找到此卡!nn"); } if (d.state == 0) { printf("此卡已在下机状态!nn"); 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("无法找到此卡!nn"); 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; else f = 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("您的余额不足,请先充值再下机nn"); 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("您的余额不足,请先充值再下机!nn"); 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--------------<<<<<<<<<<----------------nn"); printf(" 1 查询某张卡的消费记录nn 2 查找一段时间内的总金额nn 3 查找某一年的总金额nn 4 退出nn 请选择要进入的系统:"); 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元nn", p1->cost); c = 1; } p1 = p1->next; } if (c == 0) { printf("未查询到此卡的相关消费记录nn"); } } 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; else p2->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月的总营业额为%.2fnn", 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; else p2->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; } }



