学生消费记录管理系统(C语言 结构体, 链表)

自己在寒假练手的小项目 

本系统要实现的功能:

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)))
      {
  • 7
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值