注册 登录
编程论坛 C++ Builder

c++高手!帮帮我

弓虽人 发布于 2008-11-30 01:07, 1029 次点击
请哪位大虾帮忙解决一下谢谢了
很急!!!


题目如下:

Visual C++个人财政支出管理
这是具体的要求


课程设计要求
(1)将收支的数据与相应的函数封装到类中,并改写主程序,使程序结构化。
(2)增加保存每笔收支的记录,并对每笔收支记录增加日期录入,按日期的顺序保存、查看记录。将所有记录放如一个文件中,每次运行程序时打开这个文件,程序运行完毕时将更新的记录放回文件中。
(3)完善程序,补充类中数据成员盈余(dlBalance)的计算和输出,要求每笔收入和支出都要重新统计当前情况下的盈余数目。
(4)增加程序监控功能,当输入时间发生错误(如月份超过12等),要求重新输入正确的时间;当结余的数目为负数时,输出信息,警告已经超支!

程序设计思想
1)类的封装
原程序的结构比较简单,只保留了每次更新操作的最后结果,达不到财务帐册要求。若要详细记录下每笔收支的款项、原因的,最好还是采用链表的形式保存数据,且可以根据实际需要动态开辟存储空间,因此推荐使用链表的结构来改写程序。
以下是参考的类的结构:
class CFinance //财务数据类
{
private:
int nYear,nMonth,nDay; //年月日
double dlIncome,dlOutput; //收入、支出数目
double dlBalance; //结余
char szPurpose[20]; //用途、目的
static doubledlPurpose; //目标
double dlGap; //据目标的差额
public:
CFinance(){dlIncome=dlOutput=dlBalance=0.0;}
CFinance(int,int,int); //根据日期生成结点,查找用
int Compare(CFinance &); //比较日期,大于返回1,小于返回-1,等于返回0
void Show(); //输出记录
void SetFinance(int,int,int,double,double,char * ); //对象赋值
void GetPurpose(double purs); //赋值目标
double ShowPur(){return dlPurpose;} //返回目标
void Calculate(double dlBal); //计算结点的赢余情况
double GetBalance(){return dlBalance;} //返回结点的赢余情况,计算下一结点用
void ModifyData(); //修改结点记录
};
double CFinance::dlPurpose=0.0;
class CNode //定义结点类
{
private:
CFinance * pData; //用于指向数据类的指针
CNode * pNext; //指向链表下一个结点的指针
public:
CNode(){pData=o;pNext=0;} //结点构造函数
CNode(CNode &node); //用于拷贝的构造函数
void InputData(CFinance * pdata){pData=pdata;} //输入数据
void ShowNode(){pData->Show();}
CFinance * GetData(){return pData;}
friend class CList; //定义链表类为友元类
};
class CList //定义链表类
{
protected:
CNode * pHead; //链表头结点指针
public:
CList(){pHead=0;}
~CList(){DeleteList();}
void AddNode(CNode * pnode); //在首部添加结点
CNode * DeleteNode(CNode * ); //删除一个指定的结点,返回该结点的指针
CNode * LookUp(CFinance &); /*查找一个指定的数据,返回该数据所在结点在链表中的指针,若未找到返回0*/
void ShowList(); //打印整个链表
void DeleteList(); //删除整个链表
CNode * GetListHead(){return pHead;} //返回链表首结点
CNode * GetListNextNode(CNode *); //返回链表指定结点的下一个结点
void Insert(CNode * ); //插入排序
CNode * GetLastNode(); //返回最后一个结点,看看最后的赢余有无赤字
};


2)main函数结构
程序主题采用菜单选项的形式,输入相应的菜单选项后程序可以反复运行。在程序一开始运行时首先将财务数据文件读入链表,然后询问是否改动目标款项,若改动了目标款项,结点中数据部分中“据目标的差额”都须重新计算,在程序退出时将链表中的数据再写回财务数据文件。
主菜单
1.输入收入记录
2.输入支出记录
3.查看收入记录
4.查看支出记录
5.查看收支平衡情况
6.根据日期查找记录
7.根据日期修改记录
8.根据日期删除记录
0.退出系统

3)设计要点
(1)为使用户界面更加友好,避免输入数据类型错误导致的程序无效循环,在输入数据时进行判断,对非法输入予以提示
(2)每次增加结点或修改结点时,都要将所有结点中数据的赢余部分重新计算,因为输入的时间是不定的,有可能输入过去时间的帐目,这时该时间后的赢余都会发生变化,建议单独设计一个函数,以链表的引用作为参数,从链表的首结点开始,依次将整个链表的数据重新计算,在增加或修改结点完成后调用该函数即可。
(3)在输出整个链表的数据后,应计算链表最后一个结点的赢余,若出现赤字(负数)则输出信息,提醒用户注意。


关键原代码注解(5_4.cpp)
/*第4题 个人财政支出管理--源代码及关键源代码注解如下:*/
/*The Code from web site :www.technocode.*/
#include <iostream.h>
#include <fstream.h>
#include <conio.h>
#include <iomanip.h>

void Deposit();
void Withdraw();
void ViewTotal();
void SetGoal(); //Declaring all my functions
void depositDisplay();
void mainDisplay();
void withdrawDisplay();
void setgoalDisplay();
void viewtotalDisplay();

int main(){
char select;
//clrscr(); // if add ?
mainDisplay();//Title that displays heading with background color.
cout<<"\n\n\t<1> Deposit"<<endl;
cout<<"\n\t<2> Withdraw"<<endl;
cout<<"\n\t<3> View Total"<<endl;
cout<<"\n\t<4> Set Goal"<<endl;
cout<<"\n\t<0> Exit"<<endl;
cout<<"\n\n\tEnter selection: ";
cin>>select;
if(select == '1'){Deposit();}else{
if(select == '2'){Withdraw();}else{
if(select == '3'){ViewTotal();}else{
if(select == '4'){SetGoal();}else{
if(select == '0')
{
//exit(1);
goto mm1;
}
else{
main();
}
}}}}
mm1: return 0;
}

void Deposit() //存款
{//Depositing amounts into program
double dAmt = 0;
char ans;
double num = 0;
//Gets any amount that is in the Deposit file to add later on.
ifstream get("Deposit.txt"); //打开存款文件
get>>num; //将原文件内容取出
get.close();
depositDisplay();//My splash display screen.
cout<<"\n\n\tEnter deposit amount: $";
cin>>dAmt; //输入欲存的钱数
//Checks if amount entered is no a negative # or 0 and then continues
if(dAmt <= 0){
cout<<"\n\n\n\n\n"<<endl;
//textcolor(RED); //if add ?
cprintf(" That was an invalid amount..");
//textcolor(LIGHTGRAY); //if add ?
getch();
main();
}else{
cout<<"\n\n\tAmount entered <"<<dAmt<<">."<<endl;
cout<<"\n\tContinue with deposit <y/n>: ";
cin>>ans;

if(ans == 'y' || 'Y'){
dAmt = dAmt + num;//更新的存款数额
ofstream save("Deposit.txt");
save<<dAmt<<endl;
save.close();
//clrscr();
cout<<"\n\n\n\n\n"<<endl;
//textcolor(LIGHTBLUE); //changes color of text //if add ?
cprintf(" Your deposit was successful...");
//textcolor(LIGHTGRAY); //if add ?
getch();
main();
}else{
main();
}
main();
}

}

void Withdraw() //取款
{
double wAmt = 0;
char ans;
double num = 0;

ifstream get("Withdraw.txt"); //打开取款文件
get>>num; //取文件内容
get.close();
withdrawDisplay();
cout<<"\n\n\tEnter withdraw amount: $";
cin>>wAmt; //输入要取的款项
if(wAmt <= 0){
cout<<"\n\n\n\n\n"<<endl;
//textcolor(RED) //if add ?
cprintf(" That was an invalid amount..");
//textcolor(LIGHTGRAY); //if add ?
getch();
main();
}else{
cout<<"\n\n\tAmount entered <"<<wAmt<<">."<<endl;
cout<<"\n\tContinue with withdrawal <y/n>: ";
cin>>ans;

if(ans == 'y' || 'Y'){
wAmt = wAmt + num; //支出的总额
ofstream save("Withdraw.txt");
save<<wAmt<<endl;
save.close();
//clrscr();//if add ?
cout<<"\n\n\n\n\n"<<endl;
//textcolor(LIGHTBLUE);//if add ?
cprintf(" Your withdrawal was successful...");
//textcolor(LIGHTGRAY);//if add ?
getch();
main();
}else{
main();
}
main();
}
}

void SetGoal() //存款目标
{
double setAmt = 0;
setgoalDisplay();
cout<<"\n\n\tSet Goal amount: ";
cin>>setAmt;
ofstream set("Goal.txt");
set<<setAmt<<endl;
set.close();
//clrscr(); //if add ?
cout<<"\n\n\n\n\n"<<endl;
//textcolor(LIGHTBLUE);//if add ?
cprintf(" Goal amount was set...");
//textcolor(LIGHTGRAY);//if add ?
getch();
main();
}

void ViewTotal() //总体情况
{
double dAmt = 0;
double wAmt = 0;
double gAmt = 0;
double balance = 0;
double newbalance = 0;
ifstream getDeposit("Deposit.txt");
getDeposit>>dAmt; //存款
getDeposit.close();
ifstream getWithdraw("Withdraw.txt");
getWithdraw>>wAmt; //支出
getWithdraw.close();
ifstream getGoal("Goal.txt");
getGoal>>gAmt; //目标
getGoal.close();
//Withdrawal amount is minus from Deposit amount and put into balance.
balance = dAmt - wAmt; //赢余
viewtotalDisplay();
cout<<"\n\n"<<endl;
//textcolor(LIGHTBLUE);//if add ?
cprintf(" Total Amounts");
cout<<""<<endl;
cprintf(" =============");
//textcolor(BLUE);//if add ?
//textbackground(WHITE);//if add ?
cout<<"\n\n"<<endl;
cprintf("Deposit Total Withdraw Total Balance Total ");
//textbackground(BLACK);//if add ?
//textcolor(LIGHTGRAY);//if add ?
cout<<"\n"<<endl;
cout<<setw(15)<<dAmt<<setw(25)<<wAmt<<setw(20)<<balance<<endl;;
//setw(15) sets the margins between the text.
newbalance = gAmt - balance; //据目标的差距
cout<<"\n\n\n"<<endl;
//textcolor(LIGHTBLUE);//if add ?
cprintf(" Total Balance");
cout<<""<<endl;
cprintf(" =============");
//textcolor(BLUE);//if add ?
//textbackground(WHITE);//if add ?
cout<<"\n\n"<<endl;
cprintf("Set Goal Total Balance Total Balance Left ");
//textcolor(LIGHTGRAY);
cout<<"\n"<<endl;
cout<<setw(15)<<gAmt<<setw(25)<<balance<<setw(23)<<newbalance<<endl;
//textbackground(BLACK);
getch();
main();
}
//================These are all my color displays for my headings===========

void depositDisplay(){

//clrscr();
//textbackground(BLUE);
cprintf("DEPOSIT ");
//textbackground(BLACK);
}

void mainDisplay(){

//clrscr();
//textbackground(BLUE);
cprintf("Money Manager ");
//textbackground(BLACK);
}

void withdrawDisplay(){

cprintf("WITHDRAW ");
}


void setgoalDisplay(){

cprintf("SET GOAL ");
}


void viewtotalDisplay()
{

cprintf("VIEW TOTALS ");
}
0 回复
1