1. 程式人生 > 程式設計 >C/C++實現個人收支系統的示例程式碼

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",sumMonth,sumIn,sumOut); 
	
	cout <<"是否輸出各筆明細:(是1否0):";
	cin >>judge;
	if(judge==1){
		printf("%d年%d月收支類別資料的明細:\n",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++ 個人收支系統內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!