个人收支管理C++(程序设计基础课程设计)
运行软件:C-free5.0
#include <cstdio> //输入输出数据库
#include <stdlib.h> //函数库
#include <string.h> //字符串函数库
#include <iostream> //预处理命令
using namespace std;
struct data //结构组
{
int n;//n:顺序号
int y,m,d;//y:年,m:月,d:日
char zy[100];//摘要
float money,rmoney;//金额、余额
char biz[5];//币种
int x;//x:收支类型
}p[100];
int k=1;
int check1(int y,int m,int d)//检测日期合法性【check( )是自定义函数】
{
int a[12]={31,28,31,30,31,30,31,31,30,31,30,31};
if(y>0)
{
if(m>0&&m<13)
{
if(d>0&&d<=a[m-1])
return 1;//判断正确
if((((y%4==0)&&(y%100!=0))||(y%400==0))&&(m==2)&&(d==29))//闰年二月
return 1;
}
}
return 0;
}
int check2(int y1,int m1,int d1,int y2,int m2,int d2)//检测日期的先后顺序是否正确
{
if(y2>y1) return 1;
if(y2==y1&&m2>m1) return 1;
if(y2==y1&&m2==m1&&d2>d1) return 1;
if(y2==y1&&m2==m1&&d2==d1) return 1;
else
return 0;
}
int check3(int y1,int m1,int d1,int y2,int m2,int d2)//查找符合要求的日期
{
int i,k=0;
for(i=0;i<100;i++)
{
if((check2(y1,m1,d1,p[i].y,p[i].m,p[i].d))&&(check2(y2,m2,d2,p[i].y,p[i].m,p[i].d)))
k=k+1;
}
if(k=1)
return 1;
else
return 0;
}
int income(struct data p[])//收入
{
int i;char q[100];
for(i=k-1;;i++)
{
do{
cout<<"请输入日期(eg:2018 07 12):"<<endl;
cin>>p[i].y>>p[i].m>>p[i].d;
}
while (!check1(p[i].y,p[i].m,p[i].d));
fflush(stdin);//清空输入缓冲区,通常为了确保不影响后面的数据读取
cout<<"请输入摘要:"<<endl;
gets(p[i].zy);//标准输入设备读字符串函数
if(strlen(p[i].zy)==0)//当p[i].zy的字符长度为0时
strcpy (p[i].zy,"无");//把”无“赋给p[i].zy
fflush(stdin);
cout<<"请输入金额:"<<endl;
cin>>p[i].money;
fflush(stdin);
cout<<"请输入币种(默认RMB):"<<endl;
gets(p[i].biz);
if(strlen(p[i].biz)==0)
strcpy(p[i].biz,"RMB");
p[i].x=1;
p[i].rmoney=p[i-1].rmoney+p[i].money;
p[i].n=k;
k=k+1;
cout<<"请输入Enter键继续;"<<endl;
fflush(stdin);
gets(q);//把从键盘接收一个字符串,并放到数组q中
return 0;
}
}
int expend(struct data p[])//支出
{
int i;
char q[100];
for(i=k-1;;i++)
{
do{
cout<<"请输入日期(eg:2018 07 10);"<<endl;
cin>>p[i].y>>p[i].m>>p[i].d;
}
while(!check1(p[i].y,p[i].m,p[i].d));
fflush(stdin);
cout<<"请输入摘要:"<<endl;
gets(p[i].zy);
if(strlen(p[i].zy)==0)
strcpy(p[i].zy,"无");
fflush(stdin);
cout<<"请输入金额:"<<endl;
cin>>p[i].money;
fflush(stdin);
cout<<"请输入币种(默认RMB):"<<endl;
gets(p[i].biz);
if(strlen(p[i].biz)==0)
strcpy(p[i].biz,"RMB");
p[i].x=0;
p[i].rmoney=p[i-1].rmoney+p[i].money;
p[i].n=k;
k=k+1;
cout<<"请输入Enter键继续:"<<endl;
fflush(stdin);
gets(q);
return 0;
}
}
int list(struct data p[])//明细表
{
char q[100];
int i,y1,m1,d1,y2,m2,d2;
do{
cout<<"请输入时注意日期的先后顺序!!! "<<endl;
do{
cout<<"请输入起始时间(eg:2018 07 10):"<<endl;
cin>>y1>>m1>>d1;
}
while(!check1(y1,m1,d1));
do{
cout<<"请输入截止时间:"<<endl;
cin>>y2>>m2>>d2;
}
while(!check1(y2,m2,d2));
}
while(!check2(y1,m1,d1,y2,m2,d2));
if(check3(y1,m1,d1,y2,m2,d2)==0)
{
cout<<"此时间内没有收支记录!"<<endl;
}
else{
cout<<"顺序号*****日期*****摘要**金额**余额**币种**标志"<<endl;
for(i=0;i<k;i++)
cout<<" "<<p[i].n<<" "<<p[i].y<<" "<<p[i].m<<" "<<p[i].d<<" "<<p[i].zy<<" "<<p[i].money<<" "<<p[i].rmoney<<" "<<p[i].biz<<" "<<p[i].x<<endl;
cout<<"注意:标志1为收入,标志0为支出!"<<endl;
}
cout<<"请按Enter键继续!"<<endl;
fflush(stdin);
gets(q);
return 0;
}
int destat(struct data p[])//查询与统计
{
int y,m,z,i;//z:选择查询方式
char q[100];
float sum1=0,sum2=0,rmoney;
cout<<"请选择查询方式: "<<endl;
cout<<"1、查询年份: "<<endl;
cout<<"2、查询月份: "<<endl;
cin>>z;
if(z==1)
{
cout<<"请输入要查询的年份:"<<endl;
cin>>y;
for(i=0;i<100;i++)
{
if((y==p[i].y)&&(p[i].x==1))
sum1=sum1+p[i].rmoney;//sum1:总收入
if((y==p[i].y)&&(p[i].x==0))
sum2=sum2+p[i].money;//sum2:总支出
}
}
if(z==2)
{
cout<<"请输入年份:"<<endl;
cin>>y;
do{
cout<<"请输入月份:"<<endl;
cin>>m;
}
while(m<1||m>12);
for(i=0;i<100;i++)
{
if((p[i].y==y)&&(p[i].x==1)&&(p[i].m==m))
sum1=sum1+p[i].rmoney;
if((p[i].y==y)&&(p[i].x==0)&&(p[i].m==m))
sum2=sum2+p[i].money;
}
}
rmoney=sum1-sum2;
cout<<"总收入: "<<sum1<<endl;
cout<<"总支出: "<<sum2<<endl;
cout<<"余额: "<<rmoney<<endl;
cout<<"请按Enter继续:"<<endl;
fflush(stdin);
gets(q);
return 0;
}
void write(struct data p[]) //写入文件
{
int i;
FILE *fp;//创建一个文件指针
char q[20],t[100];
if(k-1==0)
cout<<"请先输入数据!!!"<<endl;
else
{
cout<<"请输入文件名:"<<endl;
fflush(stdin);
gets(q);
if(strlen(q)==0)
{
strcpy(q,"record.dat");
cout<<"已保存为默认文件data.dat"<<endl;
}
fp=fopen(q,"w");//w:新建一个文本文件,已存在的文件被删除,只允许写
for(i=0;i<k;i++)
{
fwrite(&p[i],sizeof(struct data),1,fp);
}
cout<<"记录已存储! "<<endl;
}
cout<<" 请按Enter键继续:"<<endl;
fflush(stdin);
gets(t);
}
void read(struct data p[])//读取文件
{
FILE *fp;
char q[20],t[100];
k=0;
cout<<"请输入文件名:"<<endl;
fflush(stdin);
gets(q);
if(strlen(q)==0)
{
strcpy(q,"record.dat");
cout<<"已打开默认文件data.dat"<<endl;
}
if((fp=fopen(q,"rb"))==NULL)//rb:打开一个二进制文件,文件必须存在,只允许读
cout<<"文件不存在! "<<endl;
else
{
fp=fopen(q,"r");//r:打开一个文本文件,文件必须存在,只允许读
while(!feof(fp))
{
fread(&p[k++],sizeof(struct data),1,fp);//&p[k++]:指针地址;1:要读一个数据项;fp:文件指针
}
fclose(fp);
k=k-1;
cout<<"文件已读取! ";
}
cout<<" 请按Enter键继续:"<<endl;
fflush(stdin);
gets(t);
}
int main()
{
int n;
do
{
cout<<"++++++++++++++++++ "<<endl;
cout<<" 个人收支管理 "<<endl;
cout<<"1、收入 "<<endl;
cout<<"2、支出 "<<endl;
cout<<"3、明细表 "<<endl;
cout<<"4、查询与统计 "<<endl;
cout<<"5、写入文件 "<<endl;
cout<<"6、读取文件 "<<endl;
cout<<"0、退出系统 "<<endl;
cout<<"++++++++++++++++++ "<<endl;
cout<<"请输入你要进行的操作:"<<endl;
cin>>n;
switch(n)
{
case 1:income(p);system("cls");break;//system("cls"):清屏
case 2:expend(p);system("cls");break;
case 3:list(p);system("cls");break;
case 4:destat(p);system("cls");break;
case 5:write(p);system("cls");break;
case 6:read(p);system("cls");break;
}
}while(n!=0);
}
运行结果:
我这里还有个人收支管理的课设报告,如果需要的话,请扣我哦!!!