个人收支管理C++

个人收支管理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);
}

运行结果:
在这里插入图片描述
我这里还有个人收支管理的课设报告,如果需要的话,请扣我哦!!!

  • 22
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值