📄 a.c
字号:
#include<stdio.h>
#include<string.h>
struct notebook
{
struct date//日期
{
int y;
int m;
int d;
}date;
int mon; //金额
int info;//摘要 等于0 表示支出 , 等于1表示收入
int res; //余额
char cur[3];//币种
};
struct notebook data[100];
int numdata;
int i;
void get()
{
struct notebook t;
wm: printf("输入日期(YYYY:MM:DD): ");
scanf("%d:%d:%d",&t.date.y,&t.date.m,&t.date.d);
fflush(stdin); //清空输入缓冲区
if((t.date.m>12)|(t.date.m<1)|(t.date.d>31)|(t.date.d<1))goto wm;
printf("输入金额:");
scanf("%d",&t.mon);
fflush(stdin);
printf("输入币种:");
gets(t.cur);
if(strlen(t.cur)==0) strcpy(t.cur,"RMB"); //如果输入字符为空则赋默认值 RMB
t.info=1;
if(numdata>0){t.res =data[numdata-1].res+t.mon;} //在前一次剩余金额的基础上设置这一次的剩余金额
else{t.res =t.mon;} //没有数据则把剩余金额设置等于刚加入的金额
data[numdata]=t;
numdata++;
}
void use() //use函数原理与get类似,唯一不同的一个是加钱一个是减钱
{
struct notebook t;
ww: printf("输入日期(YYYY:MM:DD): ");
scanf("%d:%d:%d",&t.date.y,&t.date.m,&t.date.d);
fflush(stdin);
if((t.date.m>12)|(t.date.m<1)|(t.date.d>31)|(t.date.d<1))goto ww; //判断月在1~12,日在1~30之间
printf("输入金额:");
scanf("%d",&t.mon);
fflush(stdin);
printf("输入币种:");
gets(t.cur);
if(strlen(t.cur)==0) strcpy(t.cur,"RMB");
t.info=0;
if(numdata>0){t.res =data[numdata-1].res-t.mon;}
else{t.res =-t.mon;}
data[numdata]=t;
numdata++;
}
void stat()
{
int a,b,allrec,alluse;
allrec=0; //累计,所有收入
alluse=0; //累计,所有支出
if(numdata==0)
printf("没有数据\n");
else
{
printf("1:统计某一年\n2.统计某年某一个月\n输入项目编号:");
scanf("%d",&a);
switch(a)
{
case 1:{
printf("输入年:");
scanf("%d",&a);
for(i=0;i<numdata;i++)
{
if(data[i].date.y==a)
{
if(data[i].info==1)allrec+=data[i].mon; //摘要为1表示收入,否则是支出
else alluse+=data[i].mon;
}
}
printf(" 总收入:%d 总支出:%d",allrec,alluse);
}break;
case 2:{
printf("输入年:");
scanf("%d",&a);
printf("输入月:");
scanf("%d",&b);
for(i=0;i<numdata;i++)
{
if((data[i].date.y==a)&(data[i].date.m==b))
{
if(data[i].info==0)allrec+=data[i].mon;
else alluse+=data[i].mon;
}
}
printf(" 总收入:%d 总支出:%d",allrec,alluse);
}break;
}
}
}
void showall()
{
struct notebook t;
if(numdata==0)
printf("没有数据\n");
else
{
wk: printf("输入起始日期(YYYY:MM:DD):");
scanf("%d:%d:%d",&t.date.y,&t.date.m,&t.date.d);
fflush(stdin);
if((t.date.m>12)|(t.date.m<1)|(t.date.d>31)|(t.date.d<1))goto wk;
printf("-----------------------------------------------------------------------");
printf("\n顺序号 日期 摘要 金额 余额 币种\n");
for(i=0;i<numdata;i++)
{
if((data[i].date.y>t.date.y)|
((data[i].date.y==t.date.y)&(data[i].date.m>t.date.m))|
((data[i].date.y==t.date.y)&(data[i].date.m==t.date.m)&(data[i].date.d>=t.date.d)))
{printf("%4d %4d:%2d:%2d %d %8d %8d %s\n",i+1,data[i].date.y,data[i].date.m,data[i].date.d,data[i].info,data[i].mon,data[i].res,data[i].cur);}
}
printf("-----------------------------------------------------------------------\n");
}
}
void write()
{
FILE *f;
char fn[10];
printf("输入文件名:");
scanf("%s",fn);
f=fopen(fn,"wb");
for(i=0;i<numdata;i++)
{
fwrite(&data[i],sizeof(struct notebook),1,f);
}
}
void read()
{
FILE *f;
char fn[10];
numdata=0;
printf("输入文件名:");
scanf("%s",fn);
f=fopen(fn,"rb");
while(!feof(f))
{
fread(&data[numdata++],sizeof(struct notebook),1,f);
}
fclose(f);
}
int main()
{
int a;
numdata=0;
ww: printf("\n 个人收支管理\n 1. 收入\n 2. 支出\n 3. 明细表\n 4. 统计\n 5. 写入文件\n 6. 读取文件\n 0. 退出\n");
printf("请输入选项编号:");
scanf("%d",&a);
switch(a){
case 1:get();break; //收入
case 2:use();break; //支出
case 3:showall();break; //明细表
case 4:stat();break; //统计
case 5:write();break; //写入文件
case 6:read();break; //读取文件
case 0:return 0;break; //退出
default:printf(" 编号无效\n\n");
}
goto ww;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -