C++记账簿,完整代码


## 这个是头文件,里面包含所有函数声明
#pragma once
#include <stdio.h>
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
#define FILENAME "D:\\jizhang\\AccountBook.txt"
#define INCOME "收入"
#define EXPAND "支出"

struct AccountItem
{
	string name;
	int money;
	string beizhu;
};

void loadDataFromFile(vector<AccountItem>&);
void showMainMenu();
void showAccountingMenu();
void showQueryMenu();
char readMenuSelect(int);
char readQuitConfirm();
void accounting(vector<AccountItem>&);
void insertIntoFile(const AccountItem& item);
void expand(vector<AccountItem>& items);
int readAccount();
void income(vector<AccountItem>& items);


void query(const vector<AccountItem>&);
void queryItems(const vector<AccountItem>& items);
void printfItem(const AccountItem& item);
void queryItems(const vector<AccountItem>& items, const string itemtype);

这个是函数定义CPP

#include "haha.h"

void loadDataFromFile(vector<AccountItem>& items)
{
	//读取文件中的帐目数据
	ifstream input(FILENAME);
	AccountItem item;
	/*
	* ifstream input("aaa.txt")
	* 逐词读取 string word while(input>>word)
	* 逐行读取 string line while(getline(input,line))
	* 逐字符读取 char ch; while(input.get(ch))
	*/
	
	while (input >> item.name >>item.money >>item.beizhu )
	{
		items.push_back(item);
	}
	input.close();
}
void showMainMenu()
{
	system("cls");
	cout << "-----------------------------------------------" << endl;
	cout << "|================欢迎使用记账本==================|" << endl;
	cout << "1记,2查,3退" << endl;
	cout << "\n请选择(1-3): ";
}//主菜单
void showAccountingMenu()
{
	//system("cls");
	cout << "-----------------------------------------------" << endl;
	cout << "|================选择记账种类==================|" << endl;
	cout << "1收,2支,3返回主菜单" << endl;
	cout << "\n请选择(1-3): ";
}//记账菜单
void showQueryMenu()
{
	cout << "-----------------------------------------------" << endl;
	cout << "|================选择查询条件==================|" << endl;
	cout << "1-统计所有,2-统计收入,3-统计支出,4-返回主菜单" << endl;
	cout << "\n请选择(1-4): ";
}//查询菜单
char readMenuSelect(int options)
{
	string str;

	while (true)
	{
		getline(cin, str);
		if (str.size() != 1 || str[0] - '0' <= 0 || str[0] - '0' > options)
		{
			cout << "输入错误,请重新输入:";
		}
		else
			break;
	}
	return str[0];
}
char readQuitConfirm()
{
	string str;

	while (true)
	{
		getline(cin, str);
		if (str.size() != 1 || toupper(str[0]) !='Y'&&toupper(str[0])!='N')
		{
			cout << "输入错误,请重新输入:";
		}
		else
			break;
	}
	return toupper(str[0]);
}
void accounting(vector<AccountItem>&items)
{
	char key = readMenuSelect(3);
	switch (key)
	{
	case '1':		//1--收入
		income(items);
		break; 
	case '2':		//2--支出
		expand(items); 
		break;
	//case '3':		//3--返回主菜单
	//	break;
	default:
		break;
	}
	cout << endl;
}
void income(vector<AccountItem>& items)
{
	AccountItem item;
	item.name = INCOME;
	cout << "\n本次收入金额为:";
	item.money = readAccount();

	cout << "\n备注:";
	getline(cin, item.beizhu);
	items.push_back(item);
	//将帐目信息写入文件中永久保存
	insertIntoFile(item);
	//显示成功信息
	cout << "--------------------录入成功------------------\n" << endl;
	cout << "\n请按回车键返回主菜单" << endl;
	string line;
	getline(cin, line);
}
void expand(vector<AccountItem>& items)
{
	AccountItem item;
	item.name = EXPAND;
	cout << "\n本次支出金额为:";
	item.money = -readAccount();//这里读取用户输入的数字前面加个-号就是负数了

	cout << "\n备注:"; 
	getline(cin, item.beizhu);
	items.push_back(item);
	//将帐目信息写入文件中永久保存
	insertIntoFile(item);
	//显示成功信息
	cout << "--------------------录入成功------------------\n" << endl;
	cout << "\n请按回车键返回主菜单" << endl;
	string line;
	getline(cin, line);
} 
void insertIntoFile(const AccountItem& item)
{
	ofstream output(FILENAME, ios::out | ios::app);
	output << item.name <<"\t\t" << item.money <<"\t\t" << item.beizhu << endl;

}
int readAccount()
{
	int amount;
	string str;
	while (true)
	{
		getline(cin, str);
		try
		{
			amount = stoi(str);//stoi意思为str转为int,还可以stod
			break;
		}
		catch (invalid_argument e)
		{
			cout << "输入有误,请重新输入:";
		}
	}
	return amount;
}
//-----------------------查询功能------------------------
void query(const vector<AccountItem>&items)
{
	char key = readMenuSelect(4);
	switch (key)
	{
	case '1':		//1--查询所有帐目
		queryItems(items);
		break;
	case '2':		//2--查询总收入
		queryItems(items,INCOME);
		break;
	case '3':		//3--查询总支出
		queryItems(items,EXPAND);
		break;
	default:
		break;
	}
	cout << endl;
}

void queryItems(const vector<AccountItem>& items)
{
	cout << "------------查询结果--------------" << endl;
	cout << "\t类型\t\t金额\t\t备注\n" << endl;
	//遍历所有帐目
	int total = 0;
	for (auto item : items)
	{
		printfItem(item);
		total += item.money;
	}
	//输出总信息
	cout << "===========================\n" << endl;
	cout << "总收支:" << total << endl;
	cout << "\n请按回车键返回主菜单:" << endl;
	string line;
	getline(cin, line);
}

void queryItems(const vector<AccountItem>& items,const string itemtype)
{
	cout << "------------查询结果--------------" << endl;
	cout << "\t类型\t\t金额\t\t备注\n" << endl;
	//遍历所有帐目,统计总收入或支出
	int total = 0;
	for (auto item : items)
	{
		if (item.name != itemtype)
			continue;
		printfItem(item);
		total += item.money;

	}
	//输出总信息
	cout << "===========================\n" << endl;
	cout << ((itemtype==INCOME)?"总收入:":"总支出:") << total << endl;
	cout << "\n请按回车键返回主菜单:" << endl;
	string line;
	getline(cin, line);
}
void printfItem(const AccountItem& item)
{
	cout << item.name << "\t" << item.money << "\t" << item.beizhu << endl;
}

这个是主程序

#include "haha.h"
int main()
{
	vector<AccountItem> items;
	loadDataFromFile(items);
	bool quit = true;
	while (quit)
	{
		showMainMenu();
		char key = readMenuSelect(3);
		switch (key)
		{
		case '1':		//1--记账
			showAccountingMenu();
			accounting(items);
			break;
		case '2':		//2--查询
			showQueryMenu();
			query(items);
			break;
		case '3':		//3--退出
			cout << "您确定要退出吗?Y/N: ";
			if (readQuitConfirm() == 'Y')
			{
				quit = false;
			}
			break;
		default:
			break;
		}
		cout << endl;
	}
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值