自己在寒假练手的小项目
本系统要实现的功能:
1. 消费记录存在文件fee.txt中, 每一条记录包括一个消费的交易日期、入账日期、交易额、交易后余额
2. (1)用户能够查询自己的一卡通固定时段消费情况:可以按月、学期、学年查询 (2)用户可以自定义一个时间段进行查询自己的消费情况
(3)用户可以按交易金额查找消费记录
(4)管理员可查询任一用户的消费记录,可按照固定时段、自定义时段、金额方式、已删除记录查询
3. 排序功能:按消费记录的交易日期、金额、次数中一个进行(升序或降序)排序。
4. 数据录入:管理员能录入某个用户的一卡通消费情况,可以一次完成若干条记录的输入。
5. 显示功能:可进行全部消费记录的显示,也可按照查询结果进行显示
6. 数据变更:管理员可以更改或删除用户的某条消费记录,但删除的信息要保存在另外一个文件fee_undel.dat
7.统计功能:(1)用户可统计自己在一个自定义时间段里的消费总金额情况
(2)管理员可统计各个用户在一个自定义时间段里的消费总金额情况
8. 用户和管理员的权限要分开。
代码:
#include<stdio.h>
#include<stdlib.h>
#define LEN sizeof(struct Student)
int n=0; //用来判断是否有数据输出的
struct Student
{
long ID; //学号
char name[20]; //姓名
int year; //交易日期:年
int month; //交易日期:月
int day;//交易日期:天
long postingDate; //入账日期
int amount; //交易金额
int moneyLeft;//交易余额
struct Student *next;//创建链表的节点
};
//学生信息从 fee.txt 文件中读取
struct Student *creat(void) //定义函数 此函数返回一个指向链表头的指针 建立动态链表
{
FILE *fp;
if((fp = fopen("fee.txt","rb"))== NULL)
{
printf("无法打开此文件\n");
return ;
}
else printf("打开文件成功\n");
struct Student *head;
struct Student *p1,*p2;
head=p1=p2=(struct Student *)malloc(LEN); //开辟一个新单元
while((fscanf(fp,"%ld %s %d %d %d %ld %d %d",&p1->ID,p1->name,&p1->year,&p1->month,&p1->day,&p1->postingDate,&p1->amount,&p1->moneyLeft))!=EOF) //当文件未读取完
{
p1=(struct Student*)malloc(LEN);
p2->next=p1;
p2=p1;
}
// printf("文件录入成功\n");
p2->next=NULL;
if (head == NULL)
{
printf("读取失败!内存空间申请不足!\n");
return NULL;
}
fclose( fp ); //最后不要忘了关闭文件
return(head);
}
/*************************************************
Function :已删除记录查询
*************************************************/
struct Student *recreat(void) //定义函数 此函数返回一个指向链表头的指针 建立动态链表
{
FILE *fp;
if((fp = fopen("fee_undel.dat","rb"))== NULL)
{
printf("无法打开此文件\n");
return ;
}
else printf("打开文件成功\n");
struct Student *head;struct Student *p1,*p2;
head=p1=p2=(struct Student *)malloc(LEN); //开辟一个新单元
while((fscanf(fp,"%ld %s %d %d %d %ld %d %d ",&p1->ID,p1->name,&p1->year,&p1->month,&p1->day,&p1->postingDate,&p1->amount,&p1->moneyLeft))!=EOF) //当文件未读取完
{
p1=(struct Student*)malloc(LEN);
p2->next=p1;
p2=p1;
}
printf("文件录入成功\n");
p2->next=NULL;
if (head == NULL)
{
printf("读取失败!内存空间申请不足!\n");
return NULL;
}
fclose( fp ); //最后不要忘了关闭文件
return(head);
}
/***********************************************
Function : 查询
************************************************/
void check(int b) //通过用户输入的内容,链表查询
{
long num;
system("cls");
printf(" 请输入您的学号\n");
scanf("%ld",&num);
struct Student *pt;
pt=creat();
if(b==1) //按月份查询
{
int c;
printf(" 请输入您想要查询的月份\n");
scanf("%d",&c);
while(pt!=NULL)
{
if(pt->ID==num)
{
if((pt->month)==c)
{
n=1;
printf("学号:%10ld 姓名:%5s 交易日期:%d %d %d 交易金额:%d 交易余额%d \n",pt->ID,pt->name,pt->year,pt->month,pt->day,pt->amount,pt->moneyLeft);
}
}
pt=pt->next;
}
}
else if(b==2) //按学期查询
{
int d,y1,y2,m1,m2,ji;
printf(" 请输入您的级数,比如:2017\n");
scanf("%d",&ji);
getchar();
printf("请选择您要查询的学期 1——大一上,2——大一下,3——大二上,4——大二下,5——大二下,6——大三上,7——大三下\n\n8——大四上,9——大四下\n");
scanf("%d",&d);
switch (d)
{
case 1: y1=ji; y2=(ji+1); m1=9; m2=2;break;
case 2: y1=(ji+1); y2=(ji+1); m1=3; m2=8;break;
case 3: y1=(ji+1); y2=(ji+2); m1=9; m2=2;break;
case 4: y1=(ji+2); y2=(ji+2); m1=3; m2=8;break;
case 5: y1=(ji+2); y2=(ji+3); m1=9; m2=2;break;
case 6: y1=(ji+3); y2=(ji+3); m1=3; m2=8;break;
case 7: y1=(ji+3); y2=(ji+4); m1=9; m2=2;break;
case 8: y1=(ji+4); y2=(ji+4); m1=3; m2=8;break;
default: printf("data error");
}
while(pt!=NULL)
{
if(pt->ID==num)
{
if(((y1==(pt->year))&&m1<=(pt->month)<=12)||((y2==(pt->year))&&(1<=(pt->month)<=m2)))
{