C++记账簿
2024-01-09 12:02:04
头文件
account_item.h
#pragma once
#include "common.h"
struct AccountItem
{
string itemType;
int amount;
string detail;
};
// 操控记账簿
void loadDataFromFile(vector<AccountItem>& items);
void accounting(vector<AccountItem>& items);
void query(const vector<AccountItem>& items);
void income(vector<AccountItem>& items);
void expand(vector<AccountItem>& items);
void insertIntoFile(const AccountItem& item);
void queryItems(const vector<AccountItem>& items);
void queryItems(const vector<AccountItem>& items, const string itemType);
void printItem(const AccountItem& item);
common.h
#pragma once
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
#define INCOME "收入"
#define EXPAND "支出"
#define FILENAME "D:\\AccountBook.txt"
// 显示菜单
void showMainMenu();
void showAccountingMenu();
void showQueryMenu();
// 合法性校验
char readMenuSelection(int options);
char readQuitConfirm();
int readAmount();
C++源码
account.cpp
#include "common.h"
#include "account_item.h"
int main() {
vector<AccountItem> items;
loadDataFromFile(items);
bool quit = false;
while (!quit)
{
showMainMenu();
char key = readMenuSelection(3);
switch (key)
{
case '1':
showAccountingMenu();
accounting(items);
break;
case '2':
showQueryMenu();
query(items);
break;
case '3':
cout << "\n确认退出? (Y/N): ";
if (readQuitConfirm() == 'Y')
quit = true;
break;
default:
break;
}
cout << "\n";
}
}
menus.cpp
#include "common.h"
void showMainMenu() {
system("cls");
cout << "\n";
cout << "================== 欢迎使用记账簿 ====================" << endl;
cout << "| |" << endl;
cout << "|=============== 1 记 账 ==============|" << endl;
cout << "|=============== 2 查 询 ==============|" << endl;
cout << "|=============== 3 退 出 ==============|" << endl;
cout << "|____________________________________________________|" << endl;
cout << "\n请选择(1-3):";
}
void showAccountingMenu() {
system("cls");
cout << "\n";
cout << "================== 选择记账种类 =====================" << endl;
cout << "| |" << endl;
cout << "|=============== 1 收 入 ==============|" << endl;
cout << "|=============== 2 支 出 ==============|" << endl;
cout << "|=============== 3 返回主菜单 ==============|" << endl;
cout << "|___________________________________________________|" << endl;
cout << "\n请选择(1-3):";
}
void showQueryMenu() {
system("cls");
cout << "\n";
cout << "================== 先择查询条件 =====================" << endl;
cout << "| |" << endl;
cout << "|=============== 1 统计所以账目 ==============|" << endl;
cout << "|=============== 2 统 计 收 入 ==============|" << endl;
cout << "|=============== 3 统 计 支 出 ==============|" << endl;
cout << "|=============== 4 返回主菜单 ==============|" << endl;
cout << "|___________________________________________________|" << endl;
cout << "\n请选择(1-4):";
}
operations.cpp
#include "common.h"
#include "account_item.h"
// ------------------------------- 0 载入 -----------------------------------
void loadDataFromFile(vector<AccountItem>& items) {
// 逐行读取每一条账目,包装成AccountItem
ifstream input(FILENAME);
AccountItem item;
while (input >> item.itemType >> item.amount >> item.detail) {
items.push_back(item);
}
input.close();
}
// ------------------------------- 1 记账 -----------------------------------
void accounting(vector<AccountItem>& items) {
char key = readMenuSelection(3);
switch (key)
{
case '1': //收入
income(items);
break;
case '2': //支出
expand(items);
break;
case '3': //返回主菜单
break;
default:
break;
}
cout << "\n";
}
void income(vector<AccountItem>& items) {
AccountItem item;
item.itemType = INCOME;
cout << "\n本次收入金额:";
item.amount = readAmount();
cout << "\n备注:";
getline(cin, item.detail);
//添加到vector容器中
items.push_back(item);
//写入文件做持久化保存
insertIntoFile(item);
cout << "\n--------------------------记账成功!---------------------------\n" << endl;
cout << "\n请按回车建返回主菜单..." << endl;
//cin.get();
string line;
getline(cin, line);
}
void insertIntoFile(const AccountItem& item) {
// 创建一个ofstream对象,以追加方式写入
ofstream output(FILENAME, ios::out | ios::app);
output << item.itemType << "\t" << item.amount << "\t" ;
output << item.detail << endl;
output.close();
}
void expand(vector<AccountItem>& items) {
AccountItem item;
item.itemType = EXPAND;
cout << "\n本次收入金额:";
item.amount = -readAmount();
cout << "\n备注:";
getline(cin, item.detail);
//添加到vector容器中
items.push_back(item);
//写入文件做持久化保存
insertIntoFile(item);
cout << "\n--------------------------记账成功!---------------------------\n" << endl;
cout << "\n请按回车建返回主菜单..." << endl;
//cin.get();
string line;
getline(cin, line);
}
// ------------------------------- 2 查询 -----------------------------------
void query(const vector<AccountItem>& items) {
char key = readMenuSelection(4);
switch (key)
{
case '1': //查询所有账目,并统计总收支
queryItems(items);
break;
case '2': //查询所有收入,并统计总收入
queryItems(items, INCOME);
break;
case '3': //查询所有支出,并统计总支出
queryItems(items, EXPAND);
break;
case '4': //返回主菜单
break;
default:
break;
}
cout << "\n";
}
void queryItems(const vector<AccountItem>& items) {
cout << "------------------------------ 查询结果 ------------------------------" << endl;
cout << "\n类型\t\t金额\t\t备注\n" << endl;
// 遍历账目
int total = 0;
for (auto item : items) {
printItem(item);
total += item.amount;
}
// 打印总收支
cout << "==========================================================================\n";
cout << "总收支:" << total << endl;
cout << "\n请按回车建返回主菜单..." << endl;
string line;
getline(cin, line);
}
void printItem(const AccountItem& item) {
cout << item.itemType << "\t\t" << item.amount << "\t\t" << item.detail << endl;
}
void queryItems(const vector<AccountItem>& items,const string itemType) {
cout << "------------------------------ 查询结果 ------------------------------" << endl;
cout << "\n类型\t\t金额\t\t备注\n" << endl;
// 遍历账目
int total = 0;
for (auto item : items) {
if (item.itemType != itemType)
continue;
printItem(item);
total += item.amount;
}
// 打印总收支
cout << "==========================================================================\n";
cout << ((itemType == INCOME) ? "总收入:" :"总支出:" )<< total << endl;
cout << "\n请按回车建返回主菜单..." << endl;
string line;
getline(cin, line);
}
read_input.cpp
#include "common.h"
// 读取键盘输入的菜单选项,进行合法性校验
char readMenuSelection(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 << "输入错误,请重新输入(Y/N):";
else
break;
}
return toupper(str[0]);
}
int readAmount() {
int amount;
string str;
while (true) {
getline(cin, str);
// 字符串int
try {
amount = stoi(str);
break;
}
catch (invalid_argument e) {
cout << "输入错误,请正确输入数字:";
}
}
return amount;
}
文章来源:https://blog.csdn.net/m0_46426259/article/details/135473792
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!