目录
前排提示:如果是某民大的课程设计作业,希望不要粘贴复制,我怕被老师抓到查重,qwq
一、功能要求及说明:
二、需求分析
三、概要设计
四、具体实现代码
五、功能测试
六、个人详细讲解视频
一、功能要求及说明:
(1)本系统应完成以下几方面的功能:
①新建账目——enter();
②载入——load( ) ;
③存盘--save()
④显示所有账目——displayAll( );
⑤按周显示账目 ——displayWeek( );
⑥按月显示账目——displayMonth( );
⑦将指定时间段内的账目按消费经额排序--SortByTime();
(2)设计要求:
1)每条账目至少包含: 收支类型,金额,用途,时间等
2)作为一个完整的系统,应具有友好的界面和较强的容错能力。
二、需求分析
1、新建账目并存储在文件中
通过编译器,创建一个账目,然后输入账目的基本信息,并将该新建的账目的信息保存到D盘下的account.txt文件中。
2、载入文件
将D盘下的account.txt账目文件中的账目信息载入到编译器中,以实现账目的展示、排序等操作。
3、对账目进行操作
先将账目载入到编译器中,通过选择菜单,可以进行显示所有账目、按周显示账目操作、按月显示账目操作、将指定时间段内的账目按消费额排序等操作
三、概要设计
1、设计一个操作菜单
将对账目进行新建、载入、存盘、操作账目等操作集成一个菜单界面,使得用户可以通过编译器进行对账目的操作。
2、设计时间类和账目类
设计一个时间类,能够将账单的时间展示出来,时间类包括账目的月份日期一年的第几周和详细的时分秒,时间类还需要包含getter和setter供操作者进行操作。
//时间类头文件
class Time {
private:
int hour;//时
int minute;//分
int second;//秒
int week;//第几周
int day;//日
int month;//月
public:
//构造函数
Time();
Time(int mon, int d, int w, int h, int m, int s);
//返回第几周
int getWeek();
//返回第几月
int getMonth();
//返回第几天
int getDay();
//输入时间
void enterTime();
//输出时间
void displayTime();
//将文件里的时间载入编译器
void loadTime();
//将一个时间数据写入文件中
void saveTime();
};
//账目类头文件
class Account {
private:
string form;//收支类型
double money;//金额
string usage;//用途
Time t;//记账时间
static int num;//账目个数
public:
//构造函数
Account();
Account(string f, double mo, string u, int mon, int d, int w, int h, int mi, int s);
//返回时间
Time getTime();
//返回账目金额
double getMoney();
//将文件中的一个账目数据载入编译器
void loadOne();
//将一个账目数据存入文件中
void saveOne();
static int getNum();
//输入一个账目数据
void enter();
//显示一个账目数据
void displayOne();
};
四、具体实现代码
#include
#include
#include
using namespace std;
ifstream infile;
ofstream outfile;
const int M = 100;//最多存放100个账目;
//时间类
class Time {
private:
int hour;//时
int minute;//分
int second;//秒
int week;//第几周
int day;//日
int month;//月
public:
Time() {}
Time(int mon, int d, int w, int h, int m, int s) {
hour = h;
minute = m;
second = s;
week = w;
day = d;
month = mon;
}
//返回第几周
int getWeek() {
return week;
}
//返回第几月
int getMonth() {
return month;
}
//返回第几天
int getDay() {
return day;
}
//输入时间
void enterTime() {
cin >> month >> day >> week >> second >> minute >> hour;
}
//输出时间
void displayTime() {
cout << setw(2) << setfill('0') << month << "月";
cout << setw(2) << setfill('0') << day << "日 ";
cout <<"第" << week << "周 ";
cout << setw(2) << setfill('0') << hour << ":";
cout << setw(2) << setfill('0') << minute << ":";
cout << setw(2) << setfill('0') << second;
}
//将文件里的时间载入编译器
void loadTime() {
string md, w, h;
infile >> md >> w >> h;
month = atoi(md.substr(5, 2).c_str());
day = atoi(md.substr(9, 2).c_str());
week = atoi(w.substr(2, 2).c_str());
hour = atoi(h.substr(0, 2).c_str());
minute = atoi(h.substr(3, 2).c_str());
second = atoi(h.substr(6, 2).c_str());
}
//将一个时间数据写入文件中
void saveTime() {
outfile << " 时间:";
outfile << setw(2) << setfill('0') << month << "月";
outfile << setw(2) << setfill('0') << day << "日 ";
outfile << "第" << week << "周 ";
outfile << setw(2) << setfill('0') << hour << ":";
outfile << setw(2) << setfill('0') << minute << ":";
outfile << setw(2) << setfill('0') << second ;
}
};
//账目类
class Account {
private:
string form;//收支类型
double money;//金额
string usage;//用途
Time t;//记账时间
static int num;//账目个数
public:
//无参构造函数
Account() {}
//有参构造函数
Account(string f, double mo, string u, int mon, int d, int w, int h, int mi, int s) :t(mon, d, w, h, mi, s) {
form = f;
money = mo;
usage = u;
num++;
}
//返回时间
Time getTime() {
return t;
}
//返回账目金额
double getMoney() {
return money;
}
//将文件中的一个账目数据载入编译器
void loadOne() {
string f,m,u,md,w,h;
infile >> f >> m >> u;
form = f.substr(9, 6);
money = atof(m.substr(5, 4).c_str());
usage = u.substr(5, 6);
t.loadTime();
num++;
}
//将一个账目数据存入文件中
void saveOne() {
outfile << "n收支类型:" << form ;
outfile << " 金额:" << money;
outfile << " 用途:" << usage ;
t.saveTime();
}
static int getNum() {
return num;
}
//输入一个账目数据
void enter() {
cout << "收支类型:";
cin >> form;
cout << "金额:";
cin >> money;
cout << "用途:";
cin >> usage;
cout << "时间(xx月xx日 第x周 hh:mm:ss):";
t.enterTime();
num++;
}
//显示一个账目数据
void displayOne() {
cout << "收支类型:" << form << " 金额:" << money;
cout << " 用途:" << usage << " 时间:";
t.displayTime();
cout << endl;
}
};
//静态成员num初始化
int Account::num = 0;
//主函数
//载入,将账目载入到编译器中
void load(Account a[]) {
int i = 0;
infile.open("D:\account.txt");
if (!infile) {
cout << "act.txt cat't open." << endl;
exit(0);
}
while (!infile.eof()) {
a[i].loadOne();
i++;
}
infile.close();
}
//存盘,将账目存入account.txt中
void save(Account a[]) {
outfile.open("D:\account.txt");
if (!outfile) {
cout << "act.txt cat't open." << endl;
exit(0);
}
for (int i = 0; i < Account::getNum(); i++) {
a[i].saveOne();
}
outfile.close();
}
//显示所有账目
void displayAll(Account a[]) {
for (int i = 0; i < Account::getNum(); i++) {
a[i].displayOne();
}
}
//按周显示账目
void displayWeek(Account a[],int n) {
for (int i = 0; i < Account::getNum(); i++) {
if (a[i].getTime().getWeek() == n) {
a[i].displayOne();
}
}
}
//按月显示账目
void displayMonth(Account a[],int n) {
for (int i = 0; i < Account::getNum(); i++) {
if (a[i].getTime().getMonth() == n) {
a[i].displayOne();
}
}
}
//将指定时间段内的账目按消费额从小到大排序(指定月份与日期),并展示排序后的账目
void SortByTime(Account a[],int beginM,int beginD,int endM,int endD) {
Account b[M];
Account temp;
int j = 0;
//得到指定时间段的账目
for (int i = 0; i < Account::getNum(); i++) {
if (a[i].getTime().getMonth() >= beginM && a[i].getTime().getMonth() <= endM && a[i].getTime().getDay() >= beginD && a[i].getTime().getDay() <= endD) {
b[j] = a[i];
j++;
}
}
//将该时间段的账目进行排序
for (int i = 1; i <= j-1; i++) {
for (int k = 1; k <= j - i; k++) {
if (b[k-1].getMoney() > b[k].getMoney()) {
temp = b[k - 1];
b[k - 1] = b[k];
b[k] = temp;
}
}
}
//展示排序后的账目
cout << "指定时间段的账目从小到大排序后:n";
for (int i = 0; i < j; i++) {
b[i].displayOne();
}
}
void showMenu() {
cout << "===============主菜单==============n";
cout << " 0.退出系统n";
cout << " 1.新建账目n";
cout << " 2.载入账目n";
cout << " 3.存盘n";
cout << " 4.显示所有账目n";
cout << " 5.按周显示账目n";
cout << " 6.按月显示账目n";
cout << "7.指定时间段内的账目按消费金额排序n";
cout << "===================================n";
}
int main() {
Account a[M];
int c;
int n;
int bm, bd, em, ed;
while (true) {
showMenu();
cin >> c;
switch (c)
{
case 0:return 0;
case 1:
a[Account::getNum()].enter();
cout << "********新建成功!********n";
break;
case 2:
load(a);
cout << "********载入成功!********n";
break;
case 3:
save(a);
cout << "********存盘成功!********n";
break;
case 4:
cout << "********2022年账目********n";
displayAll(a);
break;
case 5:
cout << "请输入要显示第几周的账目:";
cin >> n;
displayWeek(a, n);
break;
case 6:
cout << "请输入要显示第几月的账目:";
cin >> n;
displayMonth(a, n);
break;
case 7:
cout << "请输入排序时间段的开始时间和结束时间(xx月xx日至xx月到xx日):";
cin >> bm >> bd >> em >> ed;
SortByTime(a, bm, bd, em, ed);
break;
default:
break;
}
}
}
五、功能测试
1、载入账目和新建账目功能测试
2、存盘功能测试
3、显示所有账目功能测试
4、按周显示账目功能测试
5、按月显示账目功能测试
6、指定时间段按消费额从小到大排序账目功能测试
六、个人详细讲解视频
c++期末编程作业--个人财务经理
https://www.bilibili.com/video/BV1wa411x7ky?share_source=copy_web



