C/C++:个人收支系统实现
作者:互联网
昨天朋友委托我做一个基于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;
}
}
}
标签:个人,明细,收支,2020,C++,ioi,类别,输入 来源: https://blog.csdn.net/Jimobbb/article/details/106728307