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