C/C++实现个人收支系统的示例代码

来自:网络
时间:2020-11-01
阅读:
免费资源网 - https://freexyz.cn/

昨天朋友委托我做一个基于C++的课程小设计,题目如下:
设计一个简单的个人收支管理系统,至少包括如下功能:

1、逐笔输入个人收入或支出的明细,写入到文件保存,可不断进行输入和追加。
输入的明细数据包括:收支明细类别编码、发生日期、金额、备注。

1)为了简化用户的输入,类别编码由字母和数字构成:“a”表示收入、“b”表示支
出,数字是大类下的编号。类别编码及类别名称的对应由自己定义、组织在程序中
并输出展示。比如 a1 表示收入类的生活费,b1 表示支出类的学习,编号依次递增,
类别的数量和名称根据日常需要自拟。
例如:
收入类:a1‐生活费,a2‐奖学金,a3‐稿费
支出类:b1‐学习用品,b2‐生活用品,b3‐游戏

2)用户输入收支明细,具体的输入格式如下(各数据用一个或多个连续空格分隔,
直接输入回车表示输入结束):
请逐笔输入类别编码、发生日期、金额、备注:
输入收支明细:a1 2020‐1‐26 2000.0 1 月生活费
输入收支明细:b1 2020‐3‐9 52.5 买书

输入收支明细:b2 2020‐5‐9 78.00 购买台灯
3)将输入的明细数据写入到一个文件中进行保存,便于以后进行追加和处理。

2、根据日常对个人收支管理的需要,完成汇总,进行功能设计和编码实现。需要
统计并输出用户所输入月份各收支类别的汇总情况,输出后,再次询问用户是否输
出该月的各笔明细,用户回答是,则按明细类别的升序输出;回答否,则不输出。
输入和输出结果如下:

请输入对收支类别数据进行汇总的月份:2020‐3
2020 年 3 月收支类别数据的汇总
收入/支出 明细类别 金额
收入 生活费 2000

支出 学习用品 200

2020 年 3 月的总收入为:1500,总支出为:1200
是否输出该月的各笔明细(y 为输出,其他为不输出):y
2020 年 3 月收支类别数据的明细
类别 收入/支出 发生日期 金额 备注
生活费 收入 2020‐03‐01 2000.0 3 月生活费
学习用品 支出 2020‐03‐03 10.0 买钢笔

自己敲了一遍,具体实现如下:

#include <iostream>
#include <stdlib.h>
#include <string.h>
#define MAX_MARK 100

using namespace std;

struct Pay
{
	char payment[2];
	int inout;
	int year;
	int month;
	int day;
	int money;
	char mark[MAX_MARK];
}ioi;/*日期,收入/支出 金额 收入来源/支出目的*/


void displayMenu()
 {
  cout <<"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
  cout <<"+    个人收支管理系统      +"<<endl;
  cout <<"+     1. 添加收支       +"<<endl;
  cout <<"+     2. 查找收支       +"<<endl;
  cout <<"+     3. 统计收支       +"<<endl;
  cout <<"+     4. 输出文件       +"<<endl;
  cout <<"+     5. 结束程序       +"<<endl;
  cout <<"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
}

int addPayment(Pay ioi[],int num)
{
	char tempPayment[3];
	cout <<"请逐笔输入类别编码、发生日期、金额、备注"<<endl;
	cout <<"输入收支明细:";
	scanf("%s %d-%d-%d %d %s",ioi[num].payment,&ioi[num].year,&ioi[num].month,&ioi[num].day,&ioi[num].money,ioi[num].mark);
	if(ioi[num].payment[0]=='a'){
		ioi[num].inout = 1;
	}else{
		ioi[num].inout = 0;
	}
	num++;
	return num;
};

void findPayment(Pay ioi[],int num)
{
	int kind;
	int i;
	int flag=0;
	int tempMonth=0,tempYear=0;
	cout <<"请输入想要查找的目标(1为年月,2为类别):"<<endl;
	cin >> kind;
	if(kind == 1){
		cout << "请输入查找的年月(XXXX-XX):";
		scanf("%d-%d",&tempYear,&tempMonth);
		for(i=0;i<num;i++){
			if(ioi[i].year==tempYear && ioi[i].month== tempMonth){
				cout << "找到了!";
				if(ioi[i].inout == 1){
					cout <<"收入 ";
				}
				if(ioi[i].inout == 0){
					cout <<"支出 ";
				} 
				cout <<ioi[i].money;
				cout << '\t';
				cout <<ioi[i].mark<<endl;
			}
		}
	}
	char tempPayment[2];
	if(kind == 2){
		cout <<"请输入查找的类别:";
		cin >> tempPayment;
		for(i=0;i<num;i++){
			if(ioi[i].payment[0] == tempPayment[0] && ioi[i].payment[1] == tempPayment[1]){
				cout <<"找到了!";
				if(ioi[i].inout == 1){
					cout <<"收入 ";
				}
				if(ioi[i].inout == 0){
					cout <<"支出 ";
				} 
				cout <<ioi[i].money;
				cout << '\t';
				cout <<ioi[i].mark<<endl;
			}
		}
	}
};


void sumPayment(Pay ioi[],int num)
{
	int i;
	int sumYear=0;
	int sumMonth=0;
	int judge=0;
	cout <<"请输入对收支类别数据进行汇总的月份:";
	scanf("%d-%d",&sumYear,&sumMonth);
	printf("%d年%d月收支类别数据的汇总:\n",sumYear,sumMonth); 
	cout << "收支\t明细\t金额" <<endl;
	for(i=0;i<num;i++){
		if(ioi[i].year==sumYear && ioi[i].month==sumMonth){
			if(ioi[i].inout == 1){
				cout <<"收入 ";
			}
			if(ioi[i].inout == 0){
				cout <<"支出 ";
			}
			cout <<ioi[i].money;
			cout << '\t';
			cout <<ioi[i].mark<<endl;
		}
	}
	
	int sumIn=0,sumOut=0;
	for(i=0;i<num;i++){
		if(ioi[i].inout == 1){
			sumIn+= ioi[i].money;
		}
		if(ioi[i].inout == 0){
			sumOut+= ioi[i].money;
		}
	}
	printf("%d年%d月的总收入为:%d 总支出为:%d\n",sumYear,sumMonth,sumIn,sumOut); 
	
	cout <<"是否输出各笔明细:(是1否0):";
	cin >>judge;
	if(judge==1){
		printf("%d年%d月收支类别数据的明细:\n",sumYear,sumMonth); 
		cout <<"类别\t收入\t支出\t发生日期\t金额\t备注"<<endl;
		for(i=0;i<num;i++){
			if(ioi[i].payment[0] == 'a' &&ioi[i].payment[0] == '1')
					cout <<"生活费 ";
			if(ioi[i].payment[0] == 'a' &&ioi[i].payment[0] == '2')
					cout <<"奖学金 ";
			if(ioi[i].payment[0] == 'a' &&ioi[i].payment[0] == '3')
					cout <<"稿费 ";
			if(ioi[i].payment[0] == 'b' &&ioi[i].payment[0] == '1')
					cout <<"学习用品 ";
			if(ioi[i].payment[0] == 'b' &&ioi[i].payment[0] == '2')
					cout <<"生活用品 ";
			if(ioi[i].payment[0] == 'b' &&ioi[i].payment[0] == '3')
					cout <<"游戏 ";
		
			if(ioi[i].inout == 1){
				cout <<"收入\t";
			}
			if(ioi[i].inout == 0){
				cout <<"支出\t";
			}
			cout <<ioi[i].money;
			cout << '\t';
			cout <<ioi[i].mark<<endl;
		}
	}
};

void writeFile(Pay ioi[])
{
	FILE *fp=NULL;
	int i=0;

	fp=fopen("payment.txt","wb");

	if(fp==NULL)
	{
		cout <<"打开文件出错!"<<endl;
		exit(0);
	}
	fwrite(&ioi,sizeof(struct Pay),1,fp);
	cout <<"信息已保存到文payment.txt中"<<endl;
	fclose(fp);
};

void sortMoney(Pay ioi[],int length)	//冒泡排序 
{
	int i=0,j=0,k=0;
	Pay temp;
	for(i=0;i<length;i++){
		k=i;
		for(j=i+1;j<length;j++)
			if(ioi[j].money>ioi[k].money)
				k=j;
  temp=ioi[k];
  ioi[k]=ioi[i];
  ioi[i]=temp;
	}
}

int main()
{
	int allNum=0;
	int choice=0;
	struct Pay ioi[50];
 while(1)
 {
		displayMenu();
		cout<<"请选择您的操作(1,2,3,4,5)"<<endl;
  cin>>choice;
		switch(choice)
  {
			case 1:
				allNum = addPayment(ioi,allNum);
				break;
			case 2:
				findPayment(ioi,allNum);
				break;
			case 3:
				sortMoney(ioi,allNum);
				sumPayment(ioi,allNum);
				break;
			case 4:
				writeFile(ioi);
				break;
			case 5:
				exit(0);
				break;
			default:
				cout<<"输入不合法,重新输入"<<endl;
				break;
		}
	}
}

总结

免费资源网 - https://freexyz.cn/
返回顶部
顶部