一、 功能需求说明(必须采用结构体和动态链表实现)
- 消费记录存在文件fee.txt中,格式如下:每一条记录包括一个消费的交易日期、入账日期、交易额、交易后余额、交易类型、交易次数、交易地点。
- 查询搜索功能
(1)用户能够查询自己的一卡通固定时段消费情况:可以按月、学期、学年查询
(2)用户可以自定义一个时间段进行查询自己的消费情况
(3)用户可以按交易金额查找消费记录
(4)管理员可查询任一用户的消费记录,可按照固定时段、自定义时段、金额方式、已删除记录查询 - 排序功能:按消费记录的交易日期、金额、次数中一个进行(升序或降序)排序。
- 数据录入:管理员能录入某个用户的一卡通消费情况,可以一次完成若干条记录的输入。
- 显示功能:可进行全部消费记录的显示,也可按照查询结果进行显示
- 数据变更:管理员可以更改或删除用户的某条消费记录,但删除的信息要保存在另外一个文件fee_undel.dat
- 统计功能:(1)用户可统计自己在一个自定义时间段里的消费总金额情况 (2)管理员可统计各个用户在一个自定义时间段里的消费总金额情况
- 用户和管理员的权限要分开。
(另外我自己加了一个登录功能,需要提前在外部设置好用户账户密码文件usercode.txt和管理员账户密码文件managercode.txt)
需要下载代码直接拉到最底端。
二、函数实现
1. 函数声明
/*函数声明*/
int welcome();//权限选择
void del();//删除功能
void print(node*head);//打印链表内容
node*createlink(int b,char N[20]);//从文件中读取数据存入链表
void check(int b);//查询功能
void gengxin();//更新功能
void input();//录入功能
void inquire(int b);//查询功能
int manager();//管理员界面
int user();//用户界面
void outlink(node*head);//输出链表到屏幕和文件fee.txt,更改信息后的保存功能
int rank();//排序功能的菜单
void Rank_check(int b);//排序功能
int renew();//更新功能的菜单
void tongji();//统计功能
int login(int a,char N[20]); //登录功能
2.全局变量和结构体等声明
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>#define NUL '\0'
/*结构体*/
typedef struct node {
char name[20];//用户
int year;//交易日期
int month;
int day;
long inDay;//入账日期
float money;//交易额
float moneyLeft;//交易后余额
long num;//交易次数
char type[50];//交易类型
char address[50];//交易地点
struct node *next;
}node;
node *h=NULL;
node *f=NULL;
node *z=NULL;
int n=0;
typedef struct code{
char name[20];
char password[20];
}code;
3. 主函数
/*主调函数*/
int main()
{
system("title 一卡通综合信息管理系统V1.0 —— 刘欣羽制作");//设置标题
welcome();
system("pause");
return 0;
}
4.权限选择(登录菜单)
/*权限选择*/
int welcome()
{
int a;
A:system("cls");
printf(" 登录页\n");
printf(" ————————————————————\n");
printf("**************************************************\n");
printf("请选择你的身份: 1---用户 2---管理员 3---退出\n");
printf("**************************************************\n");
printf(" ————————————————————\n");
scanf("%d",&a);
switch(a)
{
case 1:user();goto A;
case 2:manager();goto A;
case 3:break;
default:printf("error\n");goto A;
}
return 0;
}
5.用户界面
int user()//用户权限
{
int a;
char N[20];
printf("请输入用户名:\n");
fflush(stdin);
scanf("%s",&N);
a=login(1,N);//若不需要登录功能此处代码需要修改,需要将登录函数一部分代码移到此处
if(a==0)goto B;
h=createlink(1,N);
if(h==NULL)
{
printf("无记录\n");
goto B;
}
A:system("cls");
printf(" ————————————————————\n");
printf("***********************************************\n");
printf(" 1---查询 2---排序 3---统计 4---退出登录\n");
printf("***********************************************\n");
printf(" ————————————————————\n");
scanf("%d",&a);
switch(a)
{
case 1:inquire(2);goto A;
case 2:rank();goto A;
case 3:tongji();goto A;
case 4:print(h);system("pause");break;
default:printf("error\n");goto A;
}
free(h);
B:return 0;
}
6.管理员界面
int manager()//管理员权限
{
int a;
char M[20];
printf("请输入用户名:\n");
fflush(stdin);
scanf("%s",&M);
a=login(1,M);//若不需要登录功能此处代码需要修改,需要将登录函数一部分代码移到此处
if(a==0)goto B;
char N[20]="manager";
h=createlink(1,N);
A:system("cls");
printf(" ————————————————————————————\n");
printf("********************************************************************\n");
printf("1---查询 2---排序 3---统计 4---录入 5---更新 6---退出登录 \n");
printf("********************************************************************\n");
printf(" ————————————————————————————\n");
scanf("%d",&a);
switch(a)
{
case 1:inquire(1);goto A;
case 2:rank();goto A;
case 3:tongji();goto A;
case 4:input();goto A;
case 5:renew();goto A;
case 6:print(h);system("pause");break;
default:printf("error\n");goto A;
}
free(h);
B:return 0;
}
7.查询功能
void inquire(int b)
{
int a;
A:system("cls");
if (b==1)
{
a=5;
printf(" ——————————————————————————————————————————————\n");
printf("*************************************************************************************************************\n");
printf(" 1---按固定时段查询 2---按日期区间段查询 3---按交易金额查询 4---已删除记录查询 6---返回\n");
printf("*************************************************************************************************************\n");
printf(" ——————————————————————————————————————————————\n"