需要下载代码直接拉到最底端。
/*函数声明*/
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]); //登录功能
#include
#include
#include
#include #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;
/*主调函数*/
int main()
{
system("title 一卡通综合信息管理系统V1.0 —— 刘欣羽制作");//设置标题
welcome();
system("pause");
return 0;
}
/*权限选择*/
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;
}
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;
}
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;
}
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");
fflush(stdin);
scanf("%d",&a);
switch(a)
{
case 1:check(1); goto A;
case 2:check(2); goto A;
case 3:check(3); goto A;
case 4:check(4); goto A;
case 5:break;
default:printf("error");
}
}
if (b==2)
{
a=4;
printf(" ——————————————————————————————————————————————\n");
printf("*************************************************************************************************************\n");
printf(" 1---按固定时段查询 2---按日期区间段查询 3---按交易金额查询 4---返回 \n");
printf("*************************************************************************************************************\n");
printf(" ——————————————————————————————————————————————\n");
fflush(stdin);
scanf("%d",&a);
switch(a)
{
case 1:check(1); goto A;
case 2:check(2); goto A;
case 3:check(3); goto A;
case 4:break;
default:printf("error");
}
}
}
int rank() //排序功能界面
{
int a;
A:system("cls");
printf(" ————————————————————————————————————————\n");
printf("*************************************************************************************\n");
printf("请选择排序方式 1---按金额排序 2---按交易日期排序 3---按交易次数排序 4---返回\n");
printf("*************************************************************************************\n");
printf(" ————————————————————————————————————————\n");
scanf("%d",&a);
switch(a)
{
case 1: Rank_check(1);break;
case 2: Rank_check(2);break;
case 3: Rank_check(3);break;
case 4: goto B;
default: printf("error\n");
}
goto A;
B:return 0;
}
int renew()
{
int a;
A:system("cls");
printf(" ——————————————————————\n");
printf("****************************************************\n");
printf(" 请选择 1---修改信息 2---删除信息 3---返回 \n");
printf("****************************************************\n");
printf(" ——————————————————————\n");
scanf("%d",&a);
switch(a)
{
case 1:gengxin();break;
case 2:del();break;
case 3:goto B;
default:printf("error\n");
}
goto A;
B:return 0;
}
node *createlink(int b,char N[20])
{
node *head;
head=(node*)malloc(sizeof(node));
node *p;
node *q1;
p=q1=head;
FILE *r;
char M[20]="manager";
if(b==1)
{
r= fopen("fee.txt","r");
}
if(b==2)
{
r= fopen("fee_del.txt","r");
}
if(r==NULL)
{
printf("打开文件失败!");
free(head);
return NULL;
}
if(strcmp(M,N)==0)
{
while(fscanf(r,"%s %d %d %d %ld %f %f %s %ld %s",&q1->name,&q1->year,&q1->month,&q1->day,&q1->inDay,&q1->money,&q1->moneyLeft,&q1->type,&q1->num,&q1->address)!=EOF)
{
p=q1;
q1= (node*)malloc(sizeof(node));
p->next=q1;
}
}
else
{
while(fscanf(r,"%s %d %d %d %ld %f %f %s %ld %s",&q1->name,&q1->year,&q1->month,&q1->day,&q1->inDay,&q1->money,&q1->moneyLeft,&q1->type,&q1->num,&q1->address)!=EOF)
{
if(strcmp(q1->name,N)==0)
{
p=q1;
q1= (node*)malloc(sizeof(node));
p->next=q1;
}
}
if(strcmp(p->name,N)!=0)
{
p=NULL;
q1=NULL;
free(head);
head=(node*)malloc(sizeof(node));
strcpy(head->name,"无记录");
head->year=0000;
head->month=00;
head->day=00;
head->inDay=00000000;
head->money=0.00;
head->moneyLeft=0.00;
head->num=0;
strcpy(head->type,"无");
strcpy(head->address,"无");
head->next=NULL;
return head;
}
}
fclose(r);
p->next=NULL;
return head;
}
void outlink(node *head)
{
node *q1;
q1=head;
FILE *w;
w =fopen("fee.txt","w");
if(w==NULL)
{
printf("打开文件失败!");
return;
}
while(q1)
{
//输出链表节点数据到文件fee.txt
fprintf(w,"%s %d %d %d %ld %f %f %s %ld %s\n",q1->name,q1->year,q1->month,q1->day,q1->inDay,q1->money,q1->moneyLeft,q1->type,q1->num,q1->address);
q1=q1->next;
}
printf("\n");
fprintf(w,"\n");
fclose(w);
return;
}
void check(int b)
{
system("cls");
node*pt,*q;
pt=(node*)malloc(sizeof(node));
q=pt;
pt->next=h;
if (b==1)//按固定日期查询
{
int y,m,d;
printf("请输入您想要查询的时间 例如:2018 1 3\n");
scanf("%d %d %d\n",&y,&m,&d);
while(pt->next!=NULL)
{
if (((pt->next->year)==y)&&((pt->next->month)==m)&&((pt->next->day)==d))
{
n=1;
f=pt->next;
printf("姓名:%s 交易日期:%d年%d月%d日 入账日期:%ld 交易额:%f 交易后余额:%f 交易类型:%s 交易次数:%ld 交易地点:%s\n",f->name,y,m,d,f->inDay,f->money,f->moneyLeft,f->type,f->num,f->address);
z=pt;
}
pt=pt->next;
}
}
if (b==2)//按日期区间段查询
{
int y1,y2,m1,m2,d1,d2;
printf("请输入您想要查询的时间段 例如:2018 1 12 2018 3 20\n");
scanf("%d %d %d %d %d %d\n",&y1,&m1,&d1,&y2,&m2,&d2);
while(pt->next!=NULL)
{
if ((((pt->next->year)==y1)&&(m1<=(pt->next->month))&&(d1<=(pt->next->day)))||(((pt->next->year)==y2)&&((pt->next->month)<=m2)&&((pt->next->day)<=d2)))
{
n=1;
f=pt->next;
printf("姓名:%s 交易日期:%d年%d月%d日 入账日期:%ld 交易额:%f 交易后余额:%f 交易类型:%s 交易次数:%ld 交易地点:%s\n",f->name,f->year,f->month,f->day,f->inDay,f->money,f->moneyLeft,f->type,f->num,f->address);
z=pt;
}
pt=pt->next;
}
}
if (b==3)//按交易金额查询
{
float m;
printf("请输入您想要查询的金额\n");
scanf("%f",&m);
while(pt->next!=NULL)
{
if ((int)(pt->next->money*10)==(int)(m*10))
{
n=1;
f=pt->next;
printf("姓名:%s 交易日期:%d年%d月%d日 入账日期:%ld 交易额:%f 交易后余额:%f 交易类型:%s 交易次数:%ld 交易地点:%s\n",f->name,f->year,f->month,f->day,f->inDay,f->money,f->moneyLeft,f->type,f->num,f->address);
z=pt;
}
pt=pt->next;
}
}
if(b==4)//查询已删除记录
{
n=1;
node*pt,*p;
char N[20]="manager";
pt=createlink(2,N);
p=pt;
while(pt!=NULL)
{
printf("姓名:%s 交易日期:%d年%d月%d日 入账日期:%ld 交易额:%f 交易后余额:%f 交易类型:%s 交易次数:%ld 交易地点:%s\n",pt->name,pt->year,pt->month,pt->day,pt->inDay,pt->money,pt->moneyLeft,pt->type,pt->num,pt->address);
pt=pt->next;
}
free(p);
}
if (n==0)
{
f=NULL;
z=NULL;
printf("无相关记录\n");
}
n=0;
if(z==q)z=NULL;
q->next=NULL;
free(q);
system("pause");
}
void Rank_check(int b)
{
int xu;
printf("请选择排序方式:1---升序 2---降序\n");
scanf("%d",&xu);
node *pt;
pt=h;
node *p1,*p2,temp,*p;
if (b==1)//按金额排序
{
if (xu==1)//升序
{
for (p1=pt;p1!=NULL;p1=p1->next)
for (p2=p1->next;p2!=NULL;p2=p2->next)
{
if ((p1->money)>(p2->money))
{
temp=*p1;
*p1=*p2;
*p2=temp;
p=p1->next;
p1->next=p2->next;
p2->next=p;
}
}
}
else if (xu==2)//降序
{
for (p1=pt;p1!=NULL;p1=p1->next)
for (p2=p1->next;p2!=NULL;p2=p2->next)
{
if ((p1->money)<(p2->money))
{
temp=*p1;
*p1=*p2;
*p2=temp;
p=p1->next;
p1->next=p2->next;
p2->next=p;
}
}
}
while(pt!=NULL)
{
n=1;
printf("姓名:%s 交易日期:%d年%d月%d日 入账日期:%ld 交易额:%f 交易后余额:%f 交易类型:%s 交易次数:%ld 交易地点:%s\n",pt->name,pt->year,pt->month,pt->day,pt->inDay,pt->money,pt->moneyLeft,pt->type,pt->num,pt->address);
pt=pt->next;
}
}
else if (b==2)//按交易日期排序
{
if (xu==1)//升序
{
for (p1=pt;p1!=NULL;p1=p1->next)
for (p2=p1->next;p2!=NULL;p2=p2->next)
{
if ((p1->inDay)>(p2->inDay))
{
temp=*p1;
*p1=*p2;
*p2=temp;
p=p1->next;
p1->next=p2->next;
p2->next=p;
}
}
}
else if (xu==2)//降序
{
for (p1=pt;p1!=NULL;p1=p1->next)
for (p2=p1->next;p2!=NULL;p2=p2->next)
{
if ((p1->inDay)<(p2->inDay))
{
temp=*p1;
*p1=*p2;
*p2=temp;
p=p1->next;
p1->next=p2->next;
p2->next=p;
}
}
}
while(pt!=NULL)
{
n=1;
printf("姓名:%s 交易日期:%d年%d月%d日 入账日期:%ld 交易额:%f 交易后余额:%f 交易类型:%s 交易次数:%ld 交易地点:%s\n",pt->name,pt->year,pt->month,pt->day,pt->inDay,pt->money,pt->moneyLeft,pt->type,pt->num,pt->address);
pt=pt->next;
}
}
else if (b==3)//按交易次数排序
{
if (xu==1)//升序
{
for (p1=pt;p1!=NULL;p1=p1->next)
for (p2=p1->next;p2!=NULL;p2=p2->next)
{
if ((p1->num)>(p2->num))
{
temp=*p1;
*p1=*p2;
*p2=temp;
p=p1->next;
p1->next=p2->next;
p2->next=p;
}
}
}
else if (xu==2)//降序
{
for (p1=pt;p1!=NULL;p1=p1->next)
for (p2=p1->next;p2!=NULL;p2=p2->next)
{
if ((p1->num)<(p2->num))
{
temp=*p1;
*p1=*p2;
*p2=temp;
p=p1->next;
p1->next=p2->next;
p2->next=p;
}
}
}
while(pt!=NULL)
{
n=1;
printf("姓名:%s 交易日期:%d年%d月%d日 入账日期:%ld 交易额:%f 交易后余额:%f 交易类型:%s 交易次数:%ld 交易地点:%s\n",pt->name,pt->year,pt->month,pt->day,pt->inDay,pt->money,pt->moneyLeft,pt->type,pt->num,pt->address);
pt=pt->next;
}
}
if (n==0)
{
printf("error\n");
}
system("pause");
}
void tongji()
{
node *pt;
pt=h;
int y1,y2,m1,m2,d1,d2;
float total=0;
printf("请输入您想要查询的时间段 例如:2018 1 12 2018 3 20\n");
scanf("%d %d %d %d %d %d\n",&y1,&m1,&d1,&y2,&m2,&d2);
while(pt!=NULL)
{
if ((((pt->year)==y1)&&(m1<=(pt->month))&&(d1<=(pt->day)))||(((pt->year)==y2)&&((pt->month)<=m2)&&((pt->day)<=d2)))
{
n=1;
total=total+(pt->money);
}
pt=pt->next;
}
printf("该段时间的交易总额为: %f\n",total);
if (n==0)
{
printf("没有相关的交易记录\n");
}
system("pause");
}
/*录入功能*/ //头插法
void input()
{
node*p,*q;
p=h;
do{
q=(node*)malloc(sizeof(node));
system("cls");
printf("是否继续录入 Y/N\n");
if(getchar()=='N') break;
printf("请输入:姓名, 交易日期,入账日期,交易额,交易后余额,交易类型,交易次数,交易地点\n");
printf("例如:刘欣羽 2018 3 12 20180312 3.1 35.15 POS 819 GDUTD2F118\n");
scanf("%s %d %d %d %ld %f %f %s %ld %s\n",&q->name,&q->year,&q->month,&q->day,&q->inDay,&q->money,&q->moneyLeft,&q->type,&q->num,&q->address);
printf("是否录入 Y/N\n");
if(getchar()=='N') break;
q->next=p;
p=q;
}while(1);
h=p;
free(q);
outlink(h);
system("pause");
}
/*更新功能*/ //不足:日期相同只取一次
void gengxin()
{
int a;
node*temp;
char ch;
printf("是否需要展示所有记录?Y/N \n");
fflush(stdin);
if(getchar()=='Y')
print(h);
printf("通过查询锁定需要修改的信息位置\n");
system("pause");
A:inquire(2);
temp=f;
if(temp==NULL)
{
printf("查询失败\n");
goto B;
}
printf("姓名:%s 交易日期:%d年%d月%d日 入账日期:%ld 交易额:%f 交易后余额:%f 交易类型:%s 交易次数:%ld 交易地点:%s\n",temp->name,temp->year,temp->month,temp->day,temp->inDay,temp->money,temp->moneyLeft,temp->type,temp->num,temp->address);
printf("是否要修改该信息 Y/N\n");
fflush(stdin);
if (getchar()=='Y')
{
getchar();
printf("请选择您想要修改的信息:0---姓名 1---交易日期 2---入账日期 3---交易额 4---交易后余额 5---交易类型 6---交易次数 7---交易地点\n");
fflush(stdin);
scanf("%d",&a);
getchar();
switch(a)
{
case 0:printf("请输入您想要修改的姓名:例:刘欣羽\n");scanf("%s",&temp->name);break;
case 1:printf("请输入您想要修改的交易日期:例:2018 2 4\n");scanf("%d %d %d",&temp->year,&temp->month,&temp->day);break;
case 2:printf("请输入您想要修改的入账日期:例:20180204\n");scanf("%ld",&temp->inDay);break;
case 3:printf("请输入您想要修改的交易额:例:2.3\n");scanf("%f",&temp->money);break;
case 4:printf("请输入您想要修改的交易后余额:例:45.2\n");scanf("%f",&temp->moneyLeft);break;
case 5:printf("请输入您想要修改的交易类型: 例:POS\n");scanf("%s",&temp->type);break;
case 6:printf("请输入您想要修改的交易次数:例:233\n");scanf("%ld",&temp->num);break;
case 7:printf("请输入您想要修改的交易地点:例:GDUTC3F588\n");scanf("%s",&temp->address);break;
default:printf("error\n");
}
printf("更新完成\n");
printf("姓名:%s 交易日期:%d年%d月%d日 入账日期:%ld 交易额:%f 交易后余额:%f 交易类型:%s 交易次数:%ld 交易地点:%s\n",temp->name,temp->year,temp->month,temp->day,temp->inDay,temp->money,temp->moneyLeft,temp->type,temp->num,temp->address);
}
printf("是否要继续更新 Y/N \n");
fflush(stdin);
if(getchar()=='Y')goto A;
B:outlink(h);
system("pause");
}
void del()
{
int a;
node*temp,*q;
char ch;
printf("是否需要展示所有记录?Y/N \n");
fflush(stdin);
if(getchar()=='Y')
print(h);
printf("通过查询锁定需要删除的信息位置\n");
system("pause");
FILE*w;
w=fopen("fee_del.txt","at");
if(w==NULL)
{
printf("打开文件失败!");
goto B;
}
A:inquire(2);
temp=f;
if(temp==NULL)
{
printf("查询失败\n");
return;
}
q=z;
printf("姓名:%s 交易日期:%d年%d月%d日 入账日期:%ld 交易额:%f 交易后余额:%f 交易类型:%s 交易次数:%ld 交易地点:%s\n",temp->name,temp->year,temp->month,temp->day,temp->inDay,temp->money,temp->moneyLeft,temp->type,temp->num,temp->address);
printf("是否要删除该条信息 Y/N\n");
fflush(stdin);
if (getchar()=='Y')
{
fprintf(w,"%s %d %d %d %ld %f %f %s %ld %s\n",temp->name,temp->year,temp->month,temp->day,temp->inDay,temp->money,temp->moneyLeft,temp->type,temp->num,temp->address);
}
if(temp==h)
{
h=h->next;
temp->next=NULL;
free(temp);
}
else
{
q->next=temp->next;
temp->next=NULL;
free(temp);
}
printf("删除成功\n");
printf("是否继续执行删除操作 Y/N\n");
fflush(stdin);
if (getchar()=='Y')goto A;
printf("\n");
B:fprintf(w,"\n");
fclose(w);
outlink(h);
system("pause");
}
void print(node*head)
{
node*pt;
pt=head;
while(pt!=NULL)
{
printf("姓名:%s 交易日期:%d年%d月%d日 入账日期:%ld 交易额:%f 交易后余额:%f 交易类型:%s 交易次数:%ld 交易地点:%s\n",pt->name,pt->year,pt->month,pt->day,pt->inDay,pt->money,pt->moneyLeft,pt->type,pt->num,pt->address);
pt=pt->next;
}
}
/*登录功能*/
int login(int a,char N[20])
{
FILE*r;
char UserName[20];
char UserPassword[20];
char C[20];
long long int number,number1;
printf("请输入学号/工作人员号:\n");
fflush(stdin);
scanf("%lld",&number);
printf("请输入密码:\n");
fflush(stdin);
scanf("%s",&C);
if(a==1)//user
{
r=fopen("usercode.txt","r+");
}
else//manager
{
r=fopen("managercode.txt","r+");
}
while(fscanf(r,"%s %lld %s\n",&UserName,&number1,&UserPassword)!=EOF)
{
if((strcmp(UserName,N)==0)&&(strcmp(UserPassword,C)==0)&&(number==number1))
{
fclose(r);
printf("登录成功!\n");
system("pause");
return 1;
}
}
fclose(r);
printf("登录失败!\n");
system("pause");
return 0;
}
用户登录后只能看到自己的记录,管理员可以看到所有用户的记录。(部分界面如下)
https://download.csdn.net/download/weixin_45849757/12446467