## 这个是头文件,里面包含所有函数声明
#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;
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()
{
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':
income(items);
break;
case '2':
expand(items);
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);
break;
}
catch (invalid_argument e)
{
cout << "输入有误,请重新输入:";
}
}
return amount;
}
void query(const vector<AccountItem>&items)
{
char key = readMenuSelect(4);
switch (key)
{
case '1':
queryItems(items);
break;
case '2':
queryItems(items,INCOME);
break;
case '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':
showAccountingMenu();
accounting(items);
break;
case '2':
showQueryMenu();
query(items);
break;
case '3':
cout << "您确定要退出吗?Y/N: ";
if (readQuitConfirm() == 'Y')
{
quit = false;
}
break;
default:
break;
}
cout << endl;
}
return 0;
}