个人财政收入支出

更新时间:2024-04-30 09:22:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

宜春学院数学与计算机科学学院

课程设计说明书

课 程 名 称: 数据结构 课 程 代 码:

题 目: 个人财政收入支出管理 年级/专业/班: 12软件工程 学 生 姓 名: 学 号: 指 导 教 师: 开 题 时 间: 年 月 日 完 成 时 间: 年 月 日

第 1 页 共 28 页

目 录

摘 要.................................................................................................................................... 3 一、引 言.............................................................................................................................. 4

1.1 课题背景................................4

1.2 课题意义................................4

二、设计目的与任务.............................................................................................................. 4

2.1 设计目的.............................5 2.2 设计任务.............................5

三、设计方案.......................................................................................................................... 5

3.1 问题的描述................................6

3.2 需求分析..................................6 3.3 总体结构..................................6 3.4 界面模块......。..........................6

四、结 论............................................................................................................................ 15 五、致 谢............................................................................................................................ 13 六、参考文献........................................................................................................................ 13

代码

第 2 页 共 28 页

摘 要

本次课程设计在 Windows 平台上,以VC++为开发工具,分析设计了 “个人财务管理系统”。

如今计算机已走进千家万户,传统的在纸上记录收入支出的方式已经过时,人们需要一种可以在计算机记录自己收入支出信息的软件,可是市场上的财务管理软件大多数十面向企业,或是有专门用途,面向普通用户的个人财务管理系统很难找到,在者免费的软件更是少之又少,为了满足普通用户的需求,特开发此软件。

本系统功能简单,只适合对个人财务管理要求不高的用户,可以完成收入支出金钱及物品的记录与查询操纵,但这些对普通用户还说应该够了,本系统操作简单,用户无需记录复杂的命令,打开主机面就可以很容易看出系统的功能,在者,本软件为免费产品,对于不愿花很多钱购买软件的用户来说是个很好的选择,本软件无需很高的硬件配置,一般的配置均可运行,占用系统资源少。

关键词:个人资金、收入、支出、输出、收支平衡

课程设计

---个人财政收入支出系统

一、引 言

1.1 课题背景

当今社会越来越着朝着信息化和数字化法发展,计算机的应用领域使我们的生活越来越

方便和快捷,可以说我们的每个人生活都离不开计算机的帮助了。越来越多的个人应用软件成为了人们重要的助手,也在潜移默化的改变着我们的生活。

随着市场经济的发展,我国居民对理财有着越来越高的要求。理财,是每个家庭和个人所必须面对的问题。现在,关于企业的会计制度逐渐完善,而且针对企业的财务软件系统也在飞速发展,但针对个人或家庭的财务系统目前还是一段空白。

第 3 页 共 28 页

实际生活中经常要对个人的各项财务收支进行管理,本课题的目的就是利用计算机对各项财务进行电子化的管理,使我们的理财更加方便和理性化,提升我们生活的质量和品位。

1.2 课题意义

我们经常看到企业的一些财务报表,这些报表主要是关注企业的资产负债表和损益表。

简单的说,前者是反映这个企业有多少钱,是存量;后者,反映了企业在一定时间能赚到多少钱,是流量。

其实,对一个人或者家庭的财务情况,也是关注这两个方面。关注家里存多少钱,关注今年赚了多少钱,花了多少,借出什么等等。

要做到这些需要对大量的数据做存储和计算,工作是相当的复杂繁琐和枯燥的,因而这些问题容易被人忽略。我们纵然可以为生活中的每一笔花销记账,但是对这样大量的数据做分类处理确实是一个会令大多数人头疼的问题,如果有一个个人理财的软件理财的软件对我们的日常财务进行那样的繁琐的数据处理和计算工作,相信可以让我们理财的效率大大提高。这样一个软件不但可以方便我们的生活,更可以使我们对自己的财务状况有一个清楚的了解。

与此同时,这样的一个软件开发和制作也是对我们大学学到各种知识进行的一次综合运用的一个好机会,是对我大学学习的一个检验和实践。

二、设计目的与任务 2.1 设计目的

本次设计既是对书本知识的运用同时也是对实际问题的研究。利用《数据结构》课程的相关知识完成一个具有一定难度的综合设计题目,利用C/C++语言进行程序设计,并规范地完成课程设计报告。通过课程设计,巩固和加深对线性表、栈、队列、字符串、数、图、查找、排序等理论知识的理解;会使用数据结构的基本操作来解决一些生活中的实际问题,提高利用计算机分析解决综合性实际问题的基本能力。

2.1 设计的任务

1)将收支的数据与相应的函数封装到类中,并写程序,使程序结构化。

2)增加保存每笔收入的记录,并对每笔记录增加日期录入,按日期的顺序保存、查看记

第 4 页 共 28 页

录。

3)完成数据成员盈余的计算和输出,要求每笔输入和支出都要重新统计当前情况下的盈余数目。

三、设计方案

3.1 问题的描述

设计个人财政收支情况系统,要求设计出收入、支出、查询、删除等。

3.2 需求分析

1)可添加收入各方面信息,要求输入信息的完整性高 2)可对收入各方面信息修改、删除 3)可根据日期查找收入信息

4)可添加支出各方面信息,要求输入信息的完整性高 5)可对支出各方面信息修改、删除 6)可查询收支平衡情况 7)可根据日期查询支出信息

3.3 总体结构

金个支收人出入资主面界情收况入数保据存显示资金信息情支况出

3.4 界面模块

日期查找收支信息查看收支平衡退出

第 5 页 共 28 页

3.4.1 主界面模块

开始 选择1

输入日期 输入收入金额 添加成功 输入收入来源

3.4.2 选择输入收入记录模块 \\

输入日期 2 选择开始

添加成功 输入支出金额 输入支出来源

第 6 页 共 28 页

3.4.5选择输入支出信息模块

3.4.6查看收入记录

3.4.7查看支出记录

3.4.8 查看收支平衡情况

第 7 页 共 28 页

3.4.9 根据日期修改记录

四、结 论

随着计算机软硬件的不断发展,导航系统在客户需求中的应用已成必然。

本系统在开发中也是严格按照物品库存管理的实际情况进行开发的,在开发中,查阅了很多相关的算法资料,巩固了数据结构、C语言和C++方面的知识,同时也学习了新的算法知识。最重要的是在开发过程中,通过不断地学习,不断提高自己编程能力和实际应用能力,还有助于改善自己的逻辑思维能力,这对自己以后对软件的开发提供很大的帮助。另外通过此次课程的设计使我认识到对知识的掌握不全面,即在学习专业知识的同时还需要再加强其他方面知识的学习,因为软件的开发有时候涉及到其他方面的知识,只有了解了其他方面的知识才能收集资料,然后用于软件开发。

这门课程是对我们大学生的编程能力的一次巨大考验。在完成过程中大家都表现出了无穷的兴趣。在设计的过程中找到了学习的乐趣。刚开始设计这程序的时候,我们都是很难着手。不过在同学的帮助下慢慢的解决了一个个问题。既帮助了自己,也让同学关系得到了进步。

五、致谢

特此感谢老师以及同学的帮助

六、参考文献

[1]《数据结构》.管致锦.清华大学出版社

第 8 页 共 28 页

[2]《数据结构学习辅导与实验指导》.王红梅.清华大学出版社 [3]《C++程序设计》. 钱能. 清华大学出版社

[4]《C++程序设计试验指导》. 钱能. 清华大学出版社

附代码

/*个人财政支出管理*/

#include //输入/输出流的头文件 #include //字符串处理函数的头文件 #include //终止程序的执行的头文件 #include //对文件操作的头文件

bool IsDateRight(int,int,int); //函数原形说明,判断日期格式是否正确 static double dlPurpose=0.0; //定义目标,为静态全局变量 //定义财务数据类

class CFinance {

public: //公有成员 };

//为静态成员分配空间

//将数据初值置为0.0

CFinance::CFinance() {

dlIncome=0.0; dlOutput=0.0;

第 9 页 共 28 页

CFinance();

CFinance(int,int,int); //根据日期生成结点,查找用 int Compare(CFinance &); //比较日期的大小,大于返回1,小于返回-1,void Show(); //输出记录

void SetFinance(int,int,int,double,double,char *); //对象赋值 double ShowPur(); //返回目标

void Calculate(double dlBal); //计算结点的盈余情况

double GetBalance(); //返回结点的盈余情况,计算下一结点用 void ModifyData(); //修改结点数据记录

void SetVal(int &,int &,int &,double &,double &,char *); //实现结点数据的输入/输出 bool IsDateEqual(int,int,int); //判断日期是否存在 void ShowWithoutBalance(); //输出除收支情况以外的记录 int nYear,nMonth,nDay; //定义年、月、日 double dlIncome,dlOutput; //定义收入、支出数目 double dlBalance; //定义结余情况 char szPurpose[20]; //定义用途、目的 double dlGap; //据目标的差额

等于返回0

}

//根据日期生成结点,查找用

CFinance::CFinance(int year,int month,int day) { }

//比较日期的大小(大于返回1,小于返回-1,等于返回0) int CFinance::Compare(CFinance &finance) { }

//输出记录

void CFinance::Show() { }

//为对象赋值

void CFinance::SetFinance(int year,int month,int day,double income,double output,char *purpose) {

nYear=year; nMonth=month; nDay=day;

cout<<\日期:\\\收入:\支出:\用途:\收支情况:\目标:\

if(nYear>finance.nYear)return 1; if(nYear

if(nMonth>finance.nMonth)return 1; if(nMonth

if(nDay>finance.nDay)return 1; if(nDay

nYear=year; nMonth=month; nDay=day;

dlIncome=dlOutput=0.0; dlBalance=0.0; dlBalance=0.0;

第 10 页 共 28 页

}

void CFinance::Calculate(double dlBal) //计算结点的盈余情况 { }

double CFinance::GetBalance() //返回结点的盈余情况 { }

//修改结点数据记录

void CFinance::ModifyData() {

double temp;

if(dlIncome>0) //若dlIncome>0,修改收入数据;否则修改{ } else {

cout<<\输入修改后的支出:\cin>>temp; if(temp>0) { } else {

cout<<\修改成功!\dlOutput=temp;

cout<<\输入修改后的收入:\cin>>temp; if(temp>0) { } else { }

cout<<\修改失败!\cout<<\修改成功!\dlIncome=temp;

return dlBalance;

dlBalance=dlBal+dlIncome-dlOutput; dlIncome=income; dlOutput=output;

strcpy(szPurpose,purpose); //拷贝

支出数据

第 11 页 共 28 页

}

//实现结点数据的输入/输出

void CFinance::SetVal(int &year,int &month,int &day,double &income,double &output,char *purpose) { }

//判断日期是否存在

bool CFinance::IsDateEqual(int year,int month,int day) { }

//输出除收支情况以外的记录

void CFinance::ShowWithoutBalance() { }

//定义结点类

class CNode {

CFinance *pData; //指向数据类的指针

CNode *pNext; //指向链表的下一个结点的指针

cout<<\日期:\收入:\支出\用途:\目标:\

if(nYear==year&&nMonth==month&&nDay==day) { } else { }

return false; return true; year=nYear; month=nMonth; day=nDay; income=dlIncome; output=dlOutput;

strcpy(purpose,szPurpose); //拷贝 }

}

cout<<\,修改失败!\

public:

第 12 页 共 28 页

}; //赋初值 CNode::CNode() { }

//用于拷贝的构造函数 CNode::CNode(CNode &node) { }

//输入数据

void CNode::InputData(CFinance *pdata) { }

//输出结点数据

void CNode::ShowNode() { }

CFinance *CNode::GetData() //返回数据 { }

//定义链表类 class CList {

protected: //保护成员

return pData; pData->Show(); pData=pdata; pNext=0;

pData=node.pData; pNext=node.pNext; pData=0; pNext=0;

CNode(); //结点构造函数 CNode(CNode &node); //用于拷贝的构造函数 void InputData(CFinance *pdata); //输入数据 void ShowNode(); //输出结点数据 CFinance *GetData(); //返回数据

friend class CList; //定义链表类为友元类

第 13 页 共 28 页

}; //赋初值

CList::CList() { }

CList::~CList() { }

//在首部添加结点

void CList::AddNode(CNode *pnode) { }

//删除指定结点

void CList::DeleteNode(CNode *pnode)

if(pHead==0) { } else { }

GetLastNode()->pNext=pnode; pnode->pNext=0; pHead=pnode; pHead->pNext=0; DeleteList(); pHead=0;

CNode *pHead; //链表头结点指针 CList(); ~CList();

void DeleteNode(CNode *); //删除一个指定的结点,返回该结点的指针

CNode *LookUp(CFinance&); //查找一个指定的数据,返回该数据所在结点在链表中的void ShowList(); //打印整个链表 void DeleteList(); //删除整个链表 CNode *GetListHead(); //返回链表首结点

CNode *GetListNextNode(CNode *); //返回链表指定结点的下一个结点 void Insert(CNode *); //据日期插入结点

CNode *GetLastNode(); //返回最后一个结点,看看最后的盈余有无赤字

public:

void AddNode(CNode *pnode); //在首部添加结点

指针,若未找到返回0

void CalBalance(); //逐个结点计算盈余

第 14 页 共 28 页

{ }

//查找指定数据,并返回该数据所在结点指针

CNode *CList::LookUp(CFinance& finance) {

if(!pHead) { }

if(pnode==pHead&&pHead->pNext==0) { }

else if(pnode==pHead) { } else { }

CNode *p=pHead;

while(p&&p->pNext!=pnode) { } if(!p) { } else { }

CNode *q=pnode->pNext; delete pnode->pData; delete pnode; p->pNext=q;

cout<<\删除结点错误:结点不存在!\exit(1); p=p->pNext; CNode *p=pnode->pNext; delete pHead->pData; delete pHead; pHead=p;

delete pHead->pData; delete pHead; pHead=0;

cout<<\删除结点错误:链表不存在!\

exit(1); //终止程序的执行

第 15 页 共 28 页

if(pHead==0)return 0; CNode *pn=pHead; while(pn) { if(pn->pData->Compare(finance)==0)return pn; pn=pn->pNext;

} return 0;

}

//打印整个链表

void CList::ShowList() { if(!pHead) { cout<<\链表为空\ return;

}

CNode *p=pHead; while(p) { p->ShowNode(); p=p->pNext;

}

}

//删除整个链表

void CList::DeleteList() { if(pHead==0)return; CNode *p,*q; p=pHead; while(p) { delete p->pData; q=p; p=p->pNext; delete q; } pHead=0;

}

//返回链表首结点

CNode *CList::GetListHead()

第 16 页 共 28 页

{ }

//返回链表指定结点的下一个结点

CNode *CList::GetListNextNode(CNode *pnode) { }

//据日期插入结点,并按日期的升序排序

void CList::Insert(CNode *pnode) { }

//返回最后一个结点

CNode *CList::GetLastNode() {

if(!pHead) { }

CNode *p=pHead;

return 0; CNode *p,*q; if(pHead==0) { }

if(pHead->pData->Compare(*(pnode->pData))==1) { } p=pHead;

while(p&&p->pData->Compare(*(pnode->pData))==-1) { }

q->pNext=pnode; pnode->pNext=p;

q=p; p=p->pNext; pnode->pNext=pHead; pHead=pnode; return; pHead=pnode; pHead->pNext=0; return;

return pnode->pNext; return pHead;

第 17 页 共 28 页

}

//逐个结点计算盈余

void CList::CalBalance() { }

//定义处理记录类

class CRecord {

if(!pHead)return; double temp=0; CNode *p=pHead; while(p) { }

p->pData->Calculate(temp); temp=p->pData->GetBalance(); p=p->pNext; while(p->pNext) { } return p;

p=p->pNext;

CList list; //把CList的对象list作为CRecord的成员 void ReadFromFile(); //从文件中读取数据 void SaveToFile(); //把数据保存在文件中 void Deposit(); //输入收入数据 void Withdraw(); //输入支出数据 void ViewDepositRecord(); //查看收入记录 void ViewWithdrawRecord(); //查看支出记录

void ViewBalance(); //查看收支平衡情况 void LookUpRecord(); //根据日期查找记录 void DeleteRecord(); //根据日期删除记录 void setgoal(double); //设定目标

public:

void EditRecord(); //根据日期修改记录

}; //从文件中读取数据 void CRecord::ReadFromFile()

{ ifstream infile1(\将infile1对象与dlPurpose.txt文件相联系,即以后程序对infile1对象的操作均是对该文件的操作

if(!infile1) {

第 18 页 共 28 页

}

//把数据保存在文件中

void CRecord::SaveToFile() { ofstream outfile1(\

if(!outfile1) { }

ofstream outfile(\if(!outfile) { }

int year,month,day; double income,output; char purpose[20];

cout<<\文件写入失败!\exit(1);

cout<<\文件写入失败!\exit(1); }

infile1>>dlPurpose; //将文件dlPurpose.txt中的数据输入到已定义好的ifstream infile(\将infile对象与finance.txt文件相联系,即以后if(!infile) { }

int year,month,day; double income,output; char purpose[20];

while(infile>>year>>month>>day>>income>>output>>purpose) { }

CFinance *pfinance=new CFinance;

pfinance->SetFinance(year,month,day,income,output,purpose); CNode *pnode=new CNode; pnode->InputData(pfinance); list.AddNode(pnode);

cout<<\文件读取失败!\exit(1);

cout<<\文件读取失败!\

exit(1); //终止程序的执行

变量dlPurpose中

程序对infile对象的操作均是对该文件的操作

list.CalBalance();

outfile1<

第 19 页 共 28 页

CNode *p=list.GetListHead(); while(p) { p->GetData()->SetVal(year,month,day,income,output,purpose); //实outfile<

p=list.GetListNextNode(p);

}

}

//输入收入数据

void CRecord::Deposit() { int year,month,day; double income; char purpose[20]; cout<<\请输入日期:\ cin>>year>>month>>day;

while(!IsDateRight(year,month,day)) { cout<<\日期不正确!请重新输入:\ cin>>year>>month>>day; }

cout<<\请输入收入金额:\ cin>>income;

cout<<\请输入收入来源:\ cin>>purpose;

CFinance *pfinance=new CFinance;

pfinance->SetFinance(year,month,day,income,0,purpose); // CNode *pnode=new CNode; pnode->InputData(pfinance); list.Insert(pnode); cout<<\添加成功!\ list.CalBalance();

}

//输入支出数据

void CRecord::Withdraw() { int year,month,day; double output; char purpose[20];

cout<<\请输入日期:\

cin>>year>>month>>day; 第 20 页 共 28 页

对象赋值

while(!IsDateRight(year,month,day)) { cout<<\日期不正确!请重新输入:\ cin>>year>>month>>day;

}

cout<<\请输入支出金额:\ cin>>output;

cout<<\请输入支出用途:\ cin>>purpose;

CFinance *pfinance=new CFinance;

pfinance->SetFinance(year,month,day,0,output,purpose); CNode *pnode=new CNode; pnode->InputData(pfinance); list.Insert(pnode); cout<<\添加成功!\ list.CalBalance();

}

//查看收入记录

void CRecord::ViewDepositRecord() { if(list.GetListHead()==0)return; CNode *p=list.GetListHead(); int year,month,day; double income,output; char purpose[20]; while(p)

{ p->GetData()->SetVal(year,month,day,income,output,purpose); //据的输入/输出

if(income>0) {

cout<<\日期:\

cout<<\收入:\ cout<<\用途:\ }

p=list.GetListNextNode(p);

}

}

//查看支出记录

void CRecord::ViewWithdrawRecord() {

if(list.GetListHead()==0)return; 第 21 页 共 28 页

实现结点数

CNode *p=list.GetListHead(); int year,month,day; double income,output; char purpose[20]; while(p) {

p->GetData()->SetVal(year,month,day,income,output,purpose); //实现结点数if(output>0) {

cout<<\日期:\

据的输入/输出

cout<<\支出:\ cout<<\用途:\ }

//查看收支平衡情况

void CRecord::ViewBalance() { }

//根据日期查找记录

void CRecord::LookUpRecord() {

if(!list.GetListHead()) { }

int year,month,day; short mark=0; cout<<\请输入日期:\cin>>year>>month>>day;

while(!IsDateRight(year,month,day)) {

cout<<\日期不正确!请重新输入:\cin>>year>>month>>day; cout<<\当前没有记录!\return; list.ShowList();

if(list.GetLastNode()->GetData()->GetBalance()<0) { }

cout<<\警告,已经超支!!!\ }

}

p=list.GetListNextNode(p);

第 22 页 共 28 页

}

//根据日期修改记录 void CRecord::EditRecord() {

if(!list.GetListHead()) { }

int year,month,day; short mark=0,edited=0; cout<<\请输入日期:\cin>>year>>month>>day;

while(!IsDateRight(year,month,day)) { }

CNode *p=list.GetListHead(); while(p) {

if(p->GetData()->IsDateEqual(year,month,day)) {

mark=1; char edit; do {

p->GetData()->ShowWithoutBalance();

cout<<\日期不正确!请重新输入:\cin>>year>>month>>day; cout<<\当前没有记录!\return; }

CNode *p=list.GetListHead(); while(p) { } if(!mark) { }

cout<<\无当天记录!\

if(p->GetData()->IsDateEqual(year,month,day)) { }

p=list.GetListNextNode(p);

p->GetData()->ShowWithoutBalance(); mark=1;

第 23 页 共 28 页

}

//根据日期删除记录

void CRecord::DeleteRecord() {

if(!list.GetListHead()) { }

int year,month,day; short mark=0,deleted=0;; cout<<\请输入日期:\cin>>year>>month>>day;

while(!IsDateRight(year,month,day)) { }

CNode *p=list.GetListHead();

while(p) {

cout<<\日期不正确!请重新输入:\cin>>year>>month>>day; cout<<\当前没有记录!\return; } if(!mark) { }

if(edited) { }

list.CalBalance(); cout<<\无当天记录!\ }

p=list.GetListNextNode(p);

cout<<\修改?(Y/N)\

cin>>edit;

if(edit=='N'||edit=='n')break; else { }

p->GetData()->ModifyData(); edited=1; break;

}while(edit!='Y'&&edit!='y'&&edit!='N'&&edit!='n');

第 24 页 共 28 页

}

//设定目标

void CRecord::setgoal(double goal) {dlPurpose=goal;}

//判断日期是否正确

bool IsDateRight(int year,int month,int day) {

if(p->GetData()->IsDateEqual(year,month,day)) } if(!mark) { } else { }

list.CalBalance(); cout<<\无当天记录!\{ }

CNode *q=p;

p=list.GetListNextNode(p); if(deleted) { }

list.DeleteNode(q); deleted=0; mark=1; char del; do {

p->GetData()->ShowWithoutBalance(); cout<<\删除?(Y/N)\cin>>del;

if(del=='N'||del=='n')break; else { }

deleted=1;

cout<<\删除成功!\break;

}while(del!='Y'&&del!='y'&&del!='N'&&del!='n');

第 25 页 共 28 页

}

//主函数,菜单形式

void main() {

CRecord Record; Record.ReadFromFile(); int end=0; double goal; while(end==0) {

cout<<\个人财政支出管理:\cout<<\输入支出记录\cout<<\查看收入记录\cout<<\查看支出记录\cout<<\查看收支平衡情况\cout<<\根据日期查找记录\if(year<1970||year>2050)return false; if(month<0||month>12)return false;

int DaysInMonth; switch(month) { case 1: case 3: case 5: case 7: case 8: case 10:

case 12:DaysInMonth=31;break; case 4: case 6: case 9:

case 11:DaysInMonth=30;break; case 2: }

if(day<0||day>DaysInMonth)return false; return true;

{ }

if(year%4==0&&year@0!=0)DaysInMonth=29; else DaysInMonth=28; break;

cout<<\输入收入记录\

第 26 页 共 28 页

}

}

cout<<\根据日期修改记录\cout<<\根据日期删除记录\cout<<\退出系统\cout<<\请选择以上程序:\char num; cin>>num; switch(num) {

case '1':Record.Deposit();break; case '2':Record.Withdraw();break;

case '3':Record.ViewDepositRecord();break; case '4':Record.ViewWithdrawRecord();break; case '5':Record.ViewBalance();break; case '6':Record.LookUpRecord();break; case '7':Record.EditRecord();break; case '8':Record.DeleteRecord();break; case '0': }

Record.SaveToFile(); break;

end=1;

default:break;

第 27 页 共 28 页

课程设计任务书及成绩评定

设计名称:_个人财政收入支出系统 _ 完 成 者: 代萍 1.设计的目的与要求:

2.设计进度及完成情况

3.成绩评定:

设计成绩: (教师填写) 指导老师: (签字)

二00 年 月 日

第 28 页 共 28 页

本文来源:https://www.bwwdw.com/article/3mng.html

Top