C/C++實(shí)現(xiàn)個人收支系統(tǒng)的示例代碼
昨天朋友委托我做一個基于C++的課程小設(shè)計(jì),題目如下:
設(shè)計(jì)一個簡單的個人收支管理系統(tǒng),至少包括如下功能:
1、逐筆輸入個人收入或支出的明細(xì),寫入到文件保存,可不斷進(jìn)行輸入和追加。
輸入的明細(xì)數(shù)據(jù)包括:收支明細(xì)類別編碼、發(fā)生日期、金額、備注。
1)為了簡化用戶的輸入,類別編碼由字母和數(shù)字構(gòu)成:“a”表示收入、“b”表示支
出,數(shù)字是大類下的編號。類別編碼及類別名稱的對應(yīng)由自己定義、組織在程序中
并輸出展示。比如 a1 表示收入類的生活費(fèi),b1 表示支出類的學(xué)習(xí),編號依次遞增,
類別的數(shù)量和名稱根據(jù)日常需要自擬。
例如:
收入類:a1‐生活費(fèi),a2‐獎學(xué)金,a3‐稿費(fèi)
支出類:b1‐學(xué)習(xí)用品,b2‐生活用品,b3‐游戲
2)用戶輸入收支明細(xì),具體的輸入格式如下(各數(shù)據(jù)用一個或多個連續(xù)空格分隔,
直接輸入回車表示輸入結(jié)束):
請逐筆輸入類別編碼、發(fā)生日期、金額、備注:
輸入收支明細(xì):a1 2020‐1‐26 2000.0 1 月生活費(fèi)
輸入收支明細(xì):b1 2020‐3‐9 52.5 買書
…
輸入收支明細(xì):b2 2020‐5‐9 78.00 購買臺燈
3)將輸入的明細(xì)數(shù)據(jù)寫入到一個文件中進(jìn)行保存,便于以后進(jìn)行追加和處理。
2、根據(jù)日常對個人收支管理的需要,完成匯總,進(jìn)行功能設(shè)計(jì)和編碼實(shí)現(xiàn)。需要
統(tǒng)計(jì)并輸出用戶所輸入月份各收支類別的匯總情況,輸出后,再次詢問用戶是否輸
出該月的各筆明細(xì),用戶回答是,則按明細(xì)類別的升序輸出;回答否,則不輸出。
輸入和輸出結(jié)果如下:
請輸入對收支類別數(shù)據(jù)進(jìn)行匯總的月份:2020‐3
2020 年 3 月收支類別數(shù)據(jù)的匯總
收入/支出 明細(xì)類別 金額
收入 生活費(fèi) 2000
…
支出 學(xué)習(xí)用品 200
…
2020 年 3 月的總收入為:1500,總支出為:1200
是否輸出該月的各筆明細(xì)(y 為輸出,其他為不輸出):y
2020 年 3 月收支類別數(shù)據(jù)的明細(xì)
類別 收入/支出 發(fā)生日期 金額 備注
生活費(fèi) 收入 2020‐03‐01 2000.0 3 月生活費(fèi)
學(xué)習(xí)用品 支出 2020‐03‐03 10.0 買鋼筆
…
自己敲了一遍,具體實(shí)現(xiàn)如下:
#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 <<"+ 個人收支管理系統(tǒng) +"<<endl;
cout <<"+ 1. 添加收支 +"<<endl;
cout <<"+ 2. 查找收支 +"<<endl;
cout <<"+ 3. 統(tǒng)計(jì)收支 +"<<endl;
cout <<"+ 4. 輸出文件 +"<<endl;
cout <<"+ 5. 結(jié)束程序 +"<<endl;
cout <<"+++++++++++++++++++++++++++++++++++++++++++++++++++++++++"<<endl;
}
int addPayment(Pay ioi[],int num)
{
char tempPayment[3];
cout <<"請逐筆輸入類別編碼、發(fā)生日期、金額、備注"<<endl;
cout <<"輸入收支明細(xì):";
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 <<"請輸入想要查找的目標(biāo)(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 <<"請輸入對收支類別數(shù)據(jù)進(jìn)行匯總的月份:";
scanf("%d-%d",&sumYear,&sumMonth);
printf("%d年%d月收支類別數(shù)據(jù)的匯總:\n",sumYear,sumMonth);
cout << "收支\t明細(xì)\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 <<"是否輸出各筆明細(xì):(是1否0):";
cin >>judge;
if(judge==1){
printf("%d年%d月收支類別數(shù)據(jù)的明細(xì):\n",sumYear,sumMonth);
cout <<"類別\t收入\t支出\t發(fā)生日期\t金額\t備注"<<endl;
for(i=0;i<num;i++){
if(ioi[i].payment[0] == 'a' &&ioi[i].payment[0] == '1')
cout <<"生活費(fèi) ";
if(ioi[i].payment[0] == 'a' &&ioi[i].payment[0] == '2')
cout <<"獎學(xué)金 ";
if(ioi[i].payment[0] == 'a' &&ioi[i].payment[0] == '3')
cout <<"稿費(fèi) ";
if(ioi[i].payment[0] == 'b' &&ioi[i].payment[0] == '1')
cout <<"學(xué)習(xí)用品 ";
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;
}
}
}
總結(jié)
到此這篇關(guān)于C/C++實(shí)現(xiàn)個人收支系統(tǒng)的示例代碼的文章就介紹到這了,更多相關(guān)c++ 個人收支系統(tǒng)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++使用easyX庫實(shí)現(xiàn)三星環(huán)繞效果流程詳解
EasyX是針對C/C++的圖形庫,可以幫助使用C/C++語言的程序員快速上手圖形和游戲編程。這篇文章主要介紹了C++使用easyX庫實(shí)現(xiàn)三星環(huán)繞效果,需要的可以參考一下2022-10-10
一起來學(xué)習(xí)C語言的字符串轉(zhuǎn)換函數(shù)
這篇文章主要為大家詳細(xì)介紹了C語言的字符串轉(zhuǎn)換函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-02-02
C語言詳細(xì)分析講解內(nèi)存管理malloc realloc free calloc函數(shù)的使用
C語言內(nèi)存管理相關(guān)的函數(shù)主要有realloc、calloc、malloc、free等,下面這篇文章主要給大家介紹了關(guān)于C語言內(nèi)存管理realloc、calloc、malloc、free函數(shù)的相關(guān)資料,需要的朋友可以參考下2022-05-05
C++中關(guān)于多態(tài)實(shí)現(xiàn)和使用方法
這篇文章主要介紹了C++中關(guān)于多態(tài)實(shí)現(xiàn)和使用方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07
C++之std::vector刪除元素的幾種方式及區(qū)別說明
這篇文章主要介紹了C++之std::vector刪除元素的幾種方式及區(qū)別說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08

