c 课程设计个人财政支出管理南京理工大学谢记超Word文档格式.docx
《c 课程设计个人财政支出管理南京理工大学谢记超Word文档格式.docx》由会员分享,可在线阅读,更多相关《c 课程设计个人财政支出管理南京理工大学谢记超Word文档格式.docx(25页珍藏版)》请在冰豆网上搜索。
"
您的财政已超支!
endl;
}
}累积计算的实现别看代码不长绝非易事。
6.主界面的美化,还是花了不少心思的!
四、程序中尚存在的不足
1.根据日期修改记录只实现了金额的修改,而日期和用途的修改未实现。
2.入日期时用cin>
>
a>
b>
C;
;
获取时间,在Dos屏幕中输入201285100而入的的100会被下一次cin>
d;
获得(即被当做收入获得)如何在取得相应数据后清空为取得的数据?
cin.ignorecin.synccin.ignore都不行。
3.入与支出的用途在Dos屏幕中只能输入英文,不能输入汉语,如果这个程序用
MFC编程来编写效果会更好!
4.操作未实现,有时候运行次数过多就会在评上留下很多东西,DOS屏幕会显乱。
五、程序演示截图
#include<
iostream.h>
#include<
string.h>
stdlib.h>
fstream.h>
boolIsDateRight(int,int,int);
//函数原形说明
staticdoubledlPurpose=0.0;
//全局静态变量,目标classCFinance//数据类
intnYear,nMonth,nDay;
doubledlIncome,dlOutput;
doubledlBalance;
charszPurpose[20];
doubledlGap;
public:
CFinance();
//缺省构造函数
CFinance(int,int,int);
//为日期赋值的构造函数intCompare(CFinance&
);
//比较日期大小的函数
voidShow();
//展示该笔收支情况,包括盈余状
况
voidSetFinance(int,int,int,double,double,char*);
//为所有成员变量赋初值的函数
voidCalculate(doubledlBal);
//累计计算总收入的函数doubleGetBalance();
voidModifyData();
//修改数据的函数
voidSetVal(int&
int&
double&
char*);
//获得各成员值的函数
boolIsDateEqual(int,int,int);
////判断日期是否存在
voidShowWithoutBalance();
//展示该笔收支情况,不包括盈余情况
};
CFinance:
CFinance()//缺省构造函数
dlIncome=0.0;
dlOutput=0.0;
dlBalance=0.0;
CFinance(intyear,intmonth,intday)//为日期赋值的构造函数
nYear=year;
nMonth=month;
nDay=day;
dlIncome=dlOutput=0.0;
intCFinance:
Compare(CFinance&
finance)//比较日期的大小(大于取1,小于取-1,相等取0)
if(nYear>
finance.nYear)return1;
if(nYear<
finance.nYear)return-1;
if(nYear==finance.nYear)
if(nMonth>
finance.nMonth)return1;
if(nMonth<
finance.nMonth)return-1;
if(nMonth==finance.nMonth)
if(nDay>
finance.nDay)return1;
if(nDay<
finance.nDay)return-1;
if(nDay==finance.nDay)return0;
voidCFinance:
Show()//展示该笔收支情况,包括盈余状况
cout<
日期:
nYear<
"
nMonth<
nDay<
收入:
dlIncome<
支出:
dlOutput<
用途:
szPurpose<
余额:
dlBalance<
目标:
dlPurpose<
SetFinance(intyear,intmonth,intday,doubleincome,doubleoutput,char
*purpose)
{//为所有成员变量赋初值的函数
dlIncome=income;
dlOutput=output;
strcpy(szPurpose,purpose);
Calculate(doubledlBal)//累计计算总收入的函数
dlBalance=dlBal+dlIncome-dlOutput;
doubleCFinance:
GetBalance()
returndlBalance;
ModifyData()//修改数据函数
doubletemp;
if(dlIncome>
0)//若dlIncome>
0,修改收入数据;
否则修改支出数据
输入修改后的收入:
;
cin>
temp;
if(temp>
else
修改成功!
dlIncome=temp;
输入有误,修改失败!
输入修改后的支出:
dlOutput=temp;
输入有误,修改失败!
SetVal(int&
year,int&
month,int&
day,double&
income,double&
output,char*purpose)
{//获得各成员值的函数
year=nYear;
month=nMonth;
day=nDay;
income=dlIncome;
output=dlOutput;
strcpy(purpose,szPurpose);
boolCFinance:
IsDateEqual(intyear,intmonth,intday)//判断日期是否存在
if(nYear==year&
&
nMonth==month&
nDay==day)
returntrue;
returnfalse;
ShowWithoutBalance()//展示该笔收支情况,不包括盈余情况
支出"
用途:
目标:
classCNode//结点类
CFinance*pData;
//用于指向数据的指针,相当于节点中存放数据的部分
CNode*pNext;
//用于指向下一节点的指针public:
CNode();
//默认构造函数
CNode(CNode&
node);
//拷贝构造函数
voidInputData(CFinance*pdata);
//将数据的地址赋值给数据指针pData的函
数
voidShowNode();
//输出本节点所指向的数据
CFinance*GetData();
//获得该节点所指向的数据的地址friendclassCList;
//把CList定义为友员函数
CNode:
CNode()//默认构造函数
pData=0;
pNext=0;
node)//拷贝构造函数
pData=node.pData;
pNext=node.pNext;
voidCNode:
InputData(CFinance*pdata)//将数据的地址赋值给数据指针pData的函数
pData=pdata;
ShowNode()//输出本节点所指向的数据
pData->
Show();
CFinance*CNode:
GetData()//获得该节点所指向的数据的地址
returnpData;
classCList//链表类
protected:
CNode*pHead;
//定义一个CNode的头指针
CList();
//构造函数
~CList();
//析构函数
voidAddNode(CNode*pnode);
//增加结点
voidDeleteNode(CNode*);
//删除制定结点
CNode*LookUp(CFinance&
//根据日期查找指定数据,并返回该数据所在结点指针
voidShowList();
//输出链表中的数据
voidDeleteList();
//删除链表中的数据CNode*GetListHead();
//获得链表头指针
CNode*GetListNextNode(CNode*);
//返回指定结点的下一结点指针voidInsert(CNode*);
//据日期升序插入结点
CNode*GetLastNode();
//返回尾部的头指针
voidCalBalance();
//逐个结点计算盈余
CList:
CList()//构造函数
pHead=0;
~CList()//析构函数
DeleteList();
voidCList:
AddNode(CNode*pnode)//增加结点
if(pHead==0)//头指针为空
pHead=pnode;
pHead->
pNext=0;
GetLastNode()->
pNext=pnode;
pnode->
DeleteNode(CNode*pnode)//删除制定结点
if(!
pHead)//头指针为空,即还未建立链表
删除结点错误:
链表不存在!
exit
(1);
if(pnode==pHead&
pNext==0)//只有一个节点时删除节点
deletepHead->
pData;
deletepHead;
pHead=0;
elseif(pnode==pHead)//链表中有多个结点,要删除的结点是头结点
CNode*p=pnode->
pNext;
deletepHead->
pHead=p;
else//链表中有多个结点,要删除的结点是其他节点
CNode*p=pHead;
while(p&
p->
pNext!
=pnode)
p=p->
p)
结点不存在!
CNode*q=pnode->
deletepnode->
deletepnode;
p->
pNext=q;
CNode*CList:
LookUp(CFinance&
finance)//根据日期查找指定数据,并返回该数据所在结点指针
if(pHead==0)return0;
CNode*pn=pHead;
while(pn)
if(pn->
Compare(finance)==0)returnpn;
pn=pn->
return0;
ShowList()//输出链表中的数据
pHead)
链表为空"
return;
while(p)
ShowNode();
p=p->
DeleteList()//删除链表中的数据
if(pHead==0)return;
CNode*p,*q;
p=pHead;
while(p)
deletep->
q=p;
deleteq;
GetListHead()//获得链表头指针
returnpHead;
GetListNextNode(CNode*pnode)//9
returnpnode->
Insert(CNode*pnode)//按日期的升序插入结点
CNode*p,*q;
if(pHead==0)
pHead->
if(pHead->
Compare(*(pnode->
pData))==1)
pnode->
pNext=pHead;
pHead=pnode;
return;
p=pHead;
while(p&
pData))==-1)
q=p;
q->
pNext=p;
GetLastNode()//返回尾部结点的指针(该程序未用到,用于扩展功能)
while(p->
pNext)
returnp;
CalBalance()//逐个结点计算盈余
pHead)return;
doubletemp=0;
CNode*p=pHead;
Calculate(temp);
temp=p->
GetBalance();
classCRecord//处理记录类
CListlist;
//把CList的对象list作为CRecord的子对象
voidReadFromFile();
//从文本文档读取数据
voidSaveToFile();
//把数据写进文本文档
voidInputIncomeRecord();
//增加收入数据
voidInputOutputRecord();
//增加支出数据
voidViewIncomeRecord();
//展示全部收入记录
voidViewOutputRecord();
//展示全部支出记录
voidViewBalance();
//展示全部收入与支出记录,显示盈余情况,实现超支预警
voidLookUpRecord();
//根据日期寻找记录
voidEditRecord();
//根据日期修改记录
voidDeleteRecord();
//根据日期删除记录
voidsetgoal(double);
//设置存储目标
setgoal(doublegoal)//设置存储目标
{dlPurpose=goal;
ReadFromFile()//从文本文档读取数据
{ifstreaminfile1("
目标dlPurpose.txt"
if(!
infile1)
文件读取失败!
exit
(1);
infile1>
dlPurpose;
ifstreaminfile("
收支记录finance.txt"
infile)
intyear,month,day;
doubleincome,output;
charpurpose[20];
while(infile>
year>
month>
day>
income>
output>
purpose)
CFinance*pfinance=newCFinance;
pfinance->
SetFinance(year,month,day,income,output,purpose);
CNode*pnode=newCNode;
InputData(pfinance);
list.AddNode(pnode);
list.CalBalance();
SaveToFile()//把数据写进文本文档
{ofstreamoutfile1("
outfile1)
文件写入失败!
outfile1<
ofstreamoutfile("
outfile)
CNode*p=list.GetListHead();
SetVal(year,month,day,income,output,purpose);
outfile<
year<
month<
day<
income<
output<
purpose<
p=list.GetListNextNode(p);
InputIncomeRecord()//增加收入数据
doubleincome;
请输入日期:
(例如:
2012229)"
day;
while(!
IsDateRight(year,month,day))
日期不正确!
请重新输入:
请输入收入金额:
income;
请输入来源:
purpose;
SetFinance(year,month,day,income,0,purpose);
list.Insert