当前位置 : 主页 > 编程语言 > c语言 >

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

来源:互联网 收集:自由互联 发布时间:2021-05-10
昨天朋友委托我做一个基于C++的课程小设计,题目如下: 设计一个简单的个人收支管理系统,至少包括如下功能: 1、逐笔输入个人收入或支出的明细,写入到文件保存,可不断进行输

昨天朋友委托我做一个基于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;
		}
	}
}

总结

到此这篇关于C/C++实现个人收支系统的示例代码的文章就介绍到这了,更多相关c++ 个人收支系统内容请搜索自由互联以前的文章或继续浏览下面的相关文章希望大家以后多多支持自由互联!

网友评论