一、课题内容和要求
1、问题描述
本程序模拟根据上网清单、客户资料等生成客户上网账单的过程,该系统主要功能包括促销信息、待购信息的新增、删除、修改、查找等。所有数据都要利用文件系统保存,以备系统下次运行时使用。
2、功能要求
(1)文件管理和存储
- 用户资料文件,存放了用户名、用户帐号以及计费方式。
2) 上网记录文件,存放了所有用户的上网记录,内容包括用户帐号、上网起始时间和上网终止时间(格式:年月日小时分钟秒)。通常每个用户应有多条上网记录。
(2)功能需求 - 用户资料文件由程序设计人员预先从键盘上录入,用户资料文件中的数据记录 不得少于 15 条。
- 上网记录文件中的数据记录不得少于 150 条,首先录入一些上网记录信息,必 须有跨年、跨月份的上网记录。
- 用户资料文件及上网记录文件中的数据可随时增加或减少,程序不应进行限制 或限定。
- 对上网费用进行计算。首先由操作人员输入年份和月,然后由程序计算该月份 所有用户的上网费用并输出账单信息到指定文件夹
二、需求分析
上网计费系统的功能框架图如图所示。
(1)提供可操作的主菜单:输出菜单,用于显示以从文件中加载的总客户信息和若干个可选的功能选项。根据客户输入的选项来运行不同的功能,运行不同的函数。
(2)程序入口与菜单显示:构建mian()函数实现函数的入口,进入整个系统,调用菜单函数menu()进行显示并根据用户输入的选项调用相应的模块函数执行相应的内容。
(3)用户信息存储:用户信息不仅是用户ID等简单信息的存储以及增删查改,还涉及与用户相对应的用户卡,用户账户的信息存储与内容更新。本系统中通过构建用户结构体、用户卡结构体等的方式实现相关内容的存储,并且通过链式指针实现用户相关信息之间的调用与操作。
(4)上网时间获取与统计:通过getValue()函数调用库函数获取系统时间。后面被相应的获取年、月、日、时、分、秒函数调用,得到需要的时间戳信息。
(5)账户信息及更新:通过构建计算上机时长函数和计算费用函数,得到操作账户信息的基础信息,然后构建printbll()和calculateAllBill()函数进行用户账户信息的更新。
(6)具体程序实现,在后面的报告中都会涉及。
三、概要设计
1、主要存储结构
// 代码很烂,轻喷。注:仅供参考学习使用。
1. // 建立用户结构体
2. struct User {
3. char name[20];
4. char id[20];
5. int mode;
6. };
7. // 建立用户卡结构体
8. struct Record {
9. char id[20];
10. char start[20];
11. char end[20];
12. };
13. // 建立用户指针结构体
14. struct UserNode {
15. struct User user;
16. struct UserNode *next;
17. };
18. // 建立用户卡指针结构体
19. struct RecordNode {
20. struct Record record;
21. struct RecordNode *next;
22. };
23. // 建立用户卡,卡内信息结构体
24. struct UserBill {
25. char id[20];
26. char name[20];
27. float price;
28. struct UserBill *next;
29. };
四、源程序代码
// 代码很烂,轻喷。注:仅供参考学习使用。
//头文件
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
//全局变量定义
#define USER_FILE "user.txt"
#define RECORD_FILE "record.txt"
#define CONSOLE "CON"
// 建立用户结构体
struct User {
char name[20];
char id[20];
int mode;
};
// 建立用户卡结构体
struct Record {
char id[20];
char start[20];
char end[20];
};
// 建立用户指针结构体
struct UserNode {
struct User user;
struct UserNode *next;
};
// 建立用户卡指针结构体
struct RecordNode {
struct Record record;
struct RecordNode *next;
};
// 建立用户卡,卡内信息结构体
struct UserBill {
char id[20];
char name[20];
float price;
struct UserBill *next;
};
// 用户文件中获取信息构成结构体函数
struct UserNode* getUser() {
//输入重定向
freopen(USER_FILE, "r", stdin);
struct User user;
struct UserNode *head = (struct UserNode*)malloc(sizeof(struct UserNode));
struct UserNode *p = head;
//从文件读取数据
while (~scanf("%s%s%d", user.name, user.id, &user.mode)) {
struct UserNode *q = (struct UserNode*)malloc(sizeof(struct UserNode));
strcpy(q->user.name, user.name);
strcpy(q->user.id, user.id);
q->user.mode = user.mode;
p->next = q;
p = p->next;
}
p->next = NULL;
p = head->next;
// 回到标准输入
freopen("CON", "r", stdin);
return head;
}
// 构建添加用户函数
void addUser(char name[], char id[], int mode) {
// 文件指针
FILE* fp = fopen(USER_FILE, "a+");
// 输出到文件
fputs(name, fp);
fputs(" ", fp);
fputs(id, fp);
fputs(" ", fp);
char str[20];
itoa(mode, str, 10);
fputs(str, fp);
fputs("\n", fp);
// 关闭文件
fclose