求各位帮我改改代码
查询:按月/年查询收/支情况,按所属类别进行统计查询;
设置支出警示线:可以修改该警示线,当月支出达到该警示线80%时提醒,当月支出超过该警示线时提醒。
这二个不知道怎么搞了
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>
#include<ctype.h>
#define N 200
struct fnacial //财务数据
{
int num;
int year;
int month;
int day;
char fname[25];
double amount;
}FNAC;struct fnacial pro[N];
typedef struct datasort //月度统计
{
int sorty;
int sortm;
double count;
struct datasort *next;
}DSORT,*DSORTP;DSORT dsort[N];
FILE *fp;
DSORTP head;
int datalong;
void mainlist();
void datalist();
void datain();//输入信息
void datamo();//信息修改
void datadel();//删除信息
void quelist();
void alldata();//查询所有信息
void tdata();//按年月查询
void sz();//按收支查询
void stalist();
double sta(int y,int m);//按月份或年份统计收支
void szsta();//收支统计
void sort();//排序
char shuru();//判断输入是否为数字
int readfile();//读取财务信息
void writefile(int x);//记录财务信息
void main()
{
datalong = readfile();
mainlist();
}
/*
主菜单,可选功能 数据处理、查询、统计
*/
void mainlist()
{
char input;
printf("\t\t\t\t个人财务系统\n\n");
printf("\t1.数据处理\n");
printf("\t2.数据查询\n");
printf("\t3.数据统计\n");
printf("\t4.退出\n");
printf("请输入选择:");
input = shuru();
switch(input)
{
case '1': datalist();break;
case '2': quelist();break;
case '3': stalist();break;
case '4': exit(0);break;
}
}
/*
数据处理菜单 功能数据录入、修改、删除
*/
void datalist()
{
char input;
system("cls");
printf("\t\t\t\t数据处理\n\n");
printf("\t1.数据录入\n");
printf("\t2.数据修改\n");
printf("\t3.数据删除\n");
printf("\t4.返回\n");
printf("请输入选择:");
input = shuru();
switch(input)
{
case '1': datain();mainlist();break;
case '2': datamo();mainlist();break;
case '3': datadel();mainlist();break;
case '4': mainlist();break;
}
}
/*
数据查询菜单 功能所有数据、按年月、按收支查询
*/
void quelist()
{
char input;
system("cls");
printf("\t\t\t\t数据查询\n\n");
printf("\t1.所有数据\n");
printf("\t2.按年月查询\n");
printf("\t3.按收入和支出查询\n");
printf("\t4.返回\n");
printf("请输入选择:");
input = shuru();
switch(input)
{
case '1': alldata();mainlist();break;
case '2': tdata();mainlist();break;
case '3': sz();mainlist();break;
case '4': mainlist();break;
}
}
/*
统计菜单 功能按时间、收支统计
*/
void stalist()
{
char input;
int y,m;
system("cls");
printf("\t\t\t\t收支统计\n\n");
printf("\t1.按时间统计\n");
printf("\t2.收支统计\n");
printf("\t3.排序\n");
printf("\t4.返回\n");
printf("请输入选择:");
input = shuru();
switch(input)
{
case '1':
{
printf("请输入年份");
scanf("%d",&y);
printf("请输入月份");
scanf("%d",&m);
printf("该月份金额为:%lf\n",sta(y,m));mainlist();break;
}
case '2': szsta();mainlist();break;
case '3': sort();mainlist();break;
case '4': mainlist();break;
}
}
/*
排序功能
*/
void sort()
{
int y1,m1,y2,m2,i;
DSORTP p,p1,p2,p3,p4;
printf("请输入要排序的时间区间:\n");
printf("年:");
scanf("%d",&y1);
printf("月:");
scanf("%d",&m1);
printf("年:");
scanf("%d",&y2);
printf("月:");
scanf("%d",&m2);
printf("\n");
printf("你输入的区间为:%d年%d日-%d年%d日\n",y1,m1,y2,m2);
head=NULL;
for(i=m1-1;i<=m2;i++)
{
p=(DSORTP)malloc(sizeof(DSORT));
p->sorty = y1;
p->sortm = i;
p->count = sta(y1,m1);
if(i==m1)
{
head = p;
p1=p;
}else
{
p1->next = p;
}
p1=p;
}
p1->next=NULL;
p4=p2 = head;
p3=head;
for(;p2->next;p2=p2->next)
{
if(p2!=head)
{
p4=p4->next;
}
for(;p3->next;p3=p3->next)
{
if(p2->count>p3->count)
{
p2->next = p3->next;
p4->next = p3;
}
}
}
do
{
printf("%-5d%-5d%ld\n",p2->sorty,p2->sortm,p2->count);
p2=p2->next;
} while(p2->next);
}
/*
按年月统计
*/
double sta(int y,int m)
{
int i;
double sum = 0;
for(i = 0;i < datalong;i++)
{
if(pro[i].year == y && pro[i].month == m)
{
sum +=pro[i].amount;
}
}
return sum;
}
/*
按收支统计
*/
void szsta()
{
char ch;
int i;
double sum=0;
printf("\t\t\t1.收入\n\t\t\t2.支出\n请选择:");
ch = shuru();
switch(ch)
{
case '1':
{
for(i = 0;i < datalong;i++)
{
if(!(strcmp(pro[i].fname,"收入")))
{
sum +=pro[i].amount;
}
}
printf("总收入金额:%lf\n",sum);
};break;
case '2':
{
for(i = 0;i < datalong;i++)
{
if(!(strcmp(pro[i].fname,"支出")))
{
sum +=pro[i].amount;
}
}
printf("总支出金额:%lf\n",sum);
};break;
}
}
/*
输出所有信息
*/
void alldata()
{
int i;
printf("编号\t 年\t月\t日\t收支信息\t金额\n");
for(i = 0;i < datalong;i++)
{
printf("%-10d%-9d%-5d%-5d%-15s%-5lf\n",pro[i].num,pro[i].year,pro[i].month,pro[i].day,pro[i].fname,pro
[i].amount);
}
}
/*
按年月搜索
*/
void tdata()
{
int y,m,i;
printf("请输入年份");
scanf("%d",&y);
printf("请输入月份");
scanf("%d",&m);
printf("编号\t 年\t月\t日\t收支信息\t金额\n");
for(i = 0;i < datalong;i++)
{
if(pro[i].year == y && pro[i].month == m)
{
printf("%-10d%-9d%-5d%-5d%-15s%-5lf\n",pro[i].num,pro[i].year,pro[i].month,pro[i].day,pro
[i].fname,pro[i].amount);
}
}
}
/*
按收支查询
*/
void sz()
{
char ch;
int i;
printf("\t\t\t1.收入\n\t\t\t2.支出\n请选择:");
ch = shuru();
switch(ch)
{
case '1':
{
printf("编号\t 年\t月\t日\t收支信息\t金额\n");
for(i = 0;i < datalong;i++)
{
if(!(strcmp(pro[i].fname,"收入")))
{
printf("%-10d%-9d%-5d%-5d%-15s%-5lf\n",pro[i].num,pro[i].year,pro
[i].month,pro[i].day,pro[i].fname,pro[i].amount);
}
}
};break;
case '2':
{
printf("编号\t 年\t月\t日\t收支信息\t金额\n");
for(i = 0;i < datalong;i++)
{
if(!(strcmp(pro[i].fname,"支出")))
{
printf("%-10d%-9d%-5d%-5d%-15s%-5lf\n",pro[i].num,pro[i].year,pro
[i].month,pro[i].day,pro[i].fname,pro[i].amount);
}
}
};break;
}
}
/*
数据录入
*/
void datain()
{
int i,word=1,x,k=0;
for(;datalong<N && word==1;datalong++)
{
printf("请输入编号:\n");
scanf("%d",&pro[datalong].num);
printf("请输入年:\n");
scanf("%d",&pro[datalong].year);
printf("请输入月:\n");
scanf("%d",&pro[datalong].month);
printf("请输入日:\n");
scanf("%d",&pro[datalong].day);
printf("请输入收支项目名称:\n");
scanf("%s",pro[datalong].fname);
printf("请输入收支金额:\n");
scanf("%lf",&pro[datalong].amount);
printf("要继续吗?\n1.是 2.退出\n");
scanf("%d",&word);
}
for(i = 0;i < datalong;i++)
{
printf("%-5d%-5d%-5d%-5d%-10s%-5lf\n",pro[i].num,pro[i].year,pro[i].month,pro[i].day,pro[i].fname,pro
[i].amount);
}
printf("\n新建的客房档案需要存档吗?\t1.是 2.否\n");
scanf("%d",&x);
writefile(x);
}
/*
数据修改
*/
void datamo()
{
int ch,i;
printf("请输入要修改的收支编号:\n");
scanf("%d",&ch);
for(i = 0;i < datalong;i ++)
{
if(pro[i].num == ch)
{
printf("请输入修改信息:\n");
printf("请输入编号:\n");
scanf("%d",&pro[i].num);
printf("请输入年:\n");
scanf("%d",&pro[i].year);
printf("请输入月:\n");
scanf("%d",&pro[i].month);
printf("请输入日:\n");
scanf("%d",&pro[i].day);
printf("请输入收支项目名称:\n");
scanf("%s",pro[i].fname);
printf("请输入收支金额:\n");
scanf("%lf",&pro[i].amount);
writefile(1);
}
}
}
/*
数据删除
*/
void datadel()
{
int ch,i;
printf("请输入要修改的收支编号:\n");
scanf("%d",&ch);
for(i = 0;i < datalong + 1;i ++)
{
if(pro[i].num == ch)
{
pro[i].num = pro[i+1].num;
pro[i].year = pro[i+1].year;
pro[i].month = pro[i+1].month;
pro[i].day = pro[i+1].day;
strcpy(pro[i].fname,pro[i+1].fname);
pro[i].amount = pro[i+1].amount;
datalong = datalong - 1;
writefile(1);
}
}
}
int readfile() //财务信息读取
{
int k = 0;
if((fp=fopen("data.txt","r"))==NULL)//读取客房信息
{
printf("初始化时未发现文件,已建立。\n");
if((fp=fopen("data.txt","w"))==NULL)
{
printf("初始化失败!将无法进行存储信息。请重新登录系统。\n");exit(0);
}
}
//注释部分调试的时候用 输出文件里的数据
do
{
fread(&pro[k],sizeof(FNAC),1,fp);
//printf("%-5d%-5d%-5d%-5d%-10s%-5lf\n",pro[k].num,pro[k].year,pro[k].month,pro[k].day,pro[k].fname,pro[k].amount);
k++;
}while(pro[k-1].num!=0);
//printf("%d",k-1);
return k-1;
fclose(fp);
}
void writefile(int x) //财务信息写入
{
int i = 0;
if((fp=fopen("data.txt","w"))==NULL)
{
printf("写文件失败!\n");exit(0);
}
if(x==1)
{
for(i=0;i<datalong;i++)
{
fwrite(&pro[i],sizeof(FNAC),1,fp);
}
printf("文件修改成功。\n");
fclose(fp);
}
else
;
}
char shuru()//判断输入的是否是数字
{
char x;
if(isdigit(x = getchar()))
{
printf("%c\n",x);
getchar();
return(x);
}
else
{
printf("%c\n",x);
printf("请输入数字!\n");
printf("请重新选择序号:");
shuru();
}
}