20、lchosen()中编译不通过
3.2.2解决方案:将letter换成字符串数组char letter[20]来接收用户输入,并用strlen()函数获得letter长度。
3.3调试三
3.3.1问题描述:添加新单词后,原有单词全部消失
3.3.2解决方案:调用函数out.open("words.txt",ios::app),用增补方式打开文件
3.4调试四
3.4.1问题描述:人人对抗时输入欲猜单词的隐藏,将大写改为小写
3.4.2解决方案:根据字符的ASCII码约束字母的范围,数值之间的关系改为小写:
if((ch>=‘A’)&&(ch<=‘Z’)){
ch=ch
21、32;
str[j++]=ch;
cout<<"*";
}
四、课题2目标
4.1 程序功能简介
个人财政支出管理程序,将个人财务的目标及当前存款,支出保存下来,可以随时更新,查看,比较盈余与目标的差距。
4.2 课程设计要求
1)将收支的数据与相应的函数封装到类中,并改写程序,是程序结构化。
2)增加保存每笔收入的记录,并对每笔记录增加日期录入,按日期的顺序保存、查看记录。将所有记录放入一个文件中,每次运行程序时首先打开这个文件,程序完毕时将更新的记录放回文件中。
3)完善程序,补充类中数据成员盈余的计算和输出,要求每笔输入和支出都要重新统计当前情况下的
22、盈余数目。
4)增加程序监控功能,当输入时间发生错误时,要求重新输入正确的时间,当结余的数目为负数,输出信息,警告已经超支!
4.3 评定难易级别
A级
五、课题2具体实现
5.1程序总体方案
5.1.1开发平台
Windows 7
Microsoft Visual c++ 6.0
5.1.2程序结构
程序结构:
class CFinance{
int nYear,nMonth,nDay; //定义年、月、日
double dlI
23、ncome,dlOutput; //定义收入、支出数目
double dlBalance; //定义结余情况
char szPurpose[20]; //定义用途、目的
double dlGap; //据目标的差额
public: //公有成员
CFinance();
CFinance(int,int,int);
24、 //根据日期生成结点,查找用
int Compare(CFinance &); //比较日期的大小,大于返回1,小于返回-1,等于返回0
void Show(); //输出记录
void SetFinance(int,int,int,double,double,char *); //对象赋值
double ShowPur(); //返回目标
void Calcul
25、ate(double dlBal); //计算结点的盈余情况
double GetBalance(); //返回结点的盈余情况,计算下一结点用
void ModifyData(); //修改结点数据记录
void SetVal(int &,int &,int &,double &,double &,char *); //实现结点数据的输入/输出
bool IsDateEqual(int,int,int); //判断日期是否存在
void S
26、howWithoutBalance(); //输出除收支情况以外的记录
int GetDate(); //取时间,排序用
};
class CNode{
CFinance *pData; //指向数据类的指针
CNode *pNext; //指向链表的下一个结点的指针
public:
CNode(); //结点构造函数
CNode(CNode &node);
27、 //用于拷贝的构造函数
void InputData(CFinance *pdata); //输入数据
void ShowNode(); //输出结点数据
CFinance *GetData(); //返回数据
friend class CList; //定义链表类为友元类
};
class Clist //定义链表类
{
protected:
CNode *phead; //链表头结点指针
public:
28、
Clist(){phead=0;} //链表类的构造函数
~Clist(){deletelist();} //链表类的析构函数
void AddNode(CNode *); //在首部添加结点
void DeleteNode(CNode *); //删除一个指定的结点
CNode *Lookup(CFinance &);//查找一个指定的结点,返回该结点的指针
void Showlist(); //打印整个链表
void Showlistdeposit(); //打印整个链表的收入情况
void Showlistw
29、ithdraw(); //打印整个链表的支出情况
void deletelist(); //删除整个链表
CNode *GetlistHead(){return phead;} //返回链表的首结点
CNode *GetlistNextNode(CNode *p); //返回指定的结点的下一个结点
void Insert(CNode *p); //插入排序
CNode *GetlastNode(CNode *phead); //返回最后一个结点
void Calculatebalance(); //计算链表的赢余情况
30、
void Savefile(); //保存文件
void OpenFile(); //打开文件
void Modify(CNode *); //修改链表的记录
void CalculatedlGap(); //计算整个链表与目标的差额
};Void main();
5.2 所做改进
5.2.1改进一
5.2.1.1改进方案
去掉类CFinance静态变量成员dlPurpose,避免在修改目标时引起对象之间dlPurpose的混乱,而把dlPurpose放到全局中。我们认为dlPurpose应该是一个全程的目标,而并不
31、是说每次收入和支出都有一个目标,而且这样在修改的时候可以方便很多。
5.2.1.2 具体实现
static double dlPurpose=0.0;
class CFinance{
int nYear,nMonth,nDay;
double dlIncome,dlOutput;
double dlBalance;
char szPurpose[20];
double dlGap;
public:
……
};
5.2.2改进二
5.2.2.1 改进方案
用for语句和continue语句替换掉goto语句。
5.2.2.2 具体实现
32、
for(;;)
{
cout<<"\t************************\n";
cout<<" 欢迎使用个人财政管理系统 \n";
cout<<" 请选择以下功能 \n";
cout<<" *1.输入收入记录 *\n";
cout<<" *2.输入支出记录 *\n";
cout<<" *3.查看收入记录 *\n";
cout<<" *4.查看支出记录 *\
33、n";
cout<<" *5.查看收支平衡状况 *\n";
cout<<" *6.根据日期查找记录 *\n";
cout<<" *7.根据日期修改记录 *\n";
cout<<" *8.根据日期删除记录 *\n";
cout<<" *9.输出现阶段财政目标 *\n";
cout<<" *0.退出 *\n\n";
cout<<"\t*****************************
34、\n";
cout<<"\n";
cout<<"请输入选项的序号:";
cin>>select;
switch(select)
{
case '1':
{
system("cls");
p=new CFinance();
Deposit(p);
pn=new CNode;
pn->InputData(p);
list.Insert(pn);
list.CalculatedlGap();
p->calculatedlgap(
35、);
list.Calculatebalance();
list.Savefile();
continue; //返回主菜单
}
case '2':
{
system("cls");
p=new CFinance();
Withdraw(p);
pn=new CNode;
pn->InputData(p);
list.Insert(pn);
list.CalculatedlGap();
p->calcu
36、latedlgap();
list.Calculatebalance();
list.Savefile();
continue; //返回主菜单
}
case '3':
{
system("cls");
list.Showlistdeposit();
system("pause");
system("cls");
continue; //返回主菜单
}
case '4':
{
system("cl
37、s");
list.Showlistwithdraw();
system("pause");
system("cls");
continue; //返回主菜单
}
case '5':
{
system("cls");
list.CalculatedlGap();
list.Showlist();
list.Calculatebalance();
system("pause");system("cls");
continue;
38、 //返回主菜单
}
case '6':
{
system("cls");
int a,b,c;
CNode *pp;
cout<<"输入你要寻找的日期"<>a>>b>>c;
CFinance t(a,b,c);
pp=list.Lookup(t);
if(pp)
{
pp->ShowNode();
}
else
{
cout<<"没有记录"<39、se");system("cls");
continue; //返回主菜单
}
case '7':
{
system("cls");
int a,b,c;
cout<<"请输入你要修改记录的日期";
cin>>a>>b>>c;
CFinance *pcf;
pcf=new CFinance(a,b,c);
CNode *pcn;
pcn=new CNode;
pcn->InputData(pcf);
list.Modi
40、fy(pcn);//修改结点
list.CalculatedlGap();
pcf->calculatedlgap();
list.Calculatebalance();
list.Savefile();
system("pause");system("cls");
continue; //返回主菜单
}
case '8':
{
system("cls");
int a,
41、b,c;
cout<<"请输入要删除的日期:";
cin>>a>>b>>c;
CNode *pcn;
CFinance *pt;
pt=new CFinance(a,b,c); //输入一个日期
pcn=new CNode;//产生新的动态的结点
pcn->InputData(pt);
list.Calculatebalance();
list.DeleteNode(pcn); //删除结点
list.Savefile();
system("paus
42、e");system("cls");
continue; //返回主菜单
}
case '9':
{
system("cls");
cout<<"现阶段财政目标为"<43、ist.Savefile();
exit(0);
}
default:
{
cout<<"输入有误,请重新输入:\n\n";
continue; //返回主菜单
}
}
}
5.2.3改进三
5.2.2.1 改进方案
对于原来没有顺序的账目,本程序可以对其进行按时间升序排序
5.2.2.2 具体实现
void Clist::Insert(CNode *p) //按日期的升序排链表,若后一个始终大于等于前一个则不做改变,仅将指针后移,若前一个大于后一个,则
44、把两者交换
{CNode *p1;
CNode *p2;
if(phead==0)
{
phead=p;
p->pnext=0;
else{
if((p->pData)->Compare(*(phead->pData))<0)
{
p->pnext=phead;
phead=p;
}
else{p2=p1=phead;
while((p2->pnext)&&(p->pData->Compare(*(p2->pData)))>=0)
{
p1=p2;
p2=p2->pnext;
}
if((p->pData->Compare(*(p2->pDa
45、ta)))>0)
{
p2->pnext=p;
p->pnext=0;
}
else
{
p->pnext=p2;
p1->pnext=p;
}
}
}
}六、课题2调试报告
大体完成后,发现会存在一些很多零碎的小问题,好在之后都一一解决了,完成了这次课程设计、
七、 分工介绍
独立完成。
八、总体小结
这次选的课题是良好组的题目.
总体上而说,第一个课题—猜单词游戏相对简单,而第二个课题——收支管理系统相对要难一些。但两个程序的主要创建思路是一样的。主要是根据课程设计的要求查书上的知识点,将之后所
46、学的输入输出流以及模板的知识加入到程序里。在已经提供的程序代码的基础上,经过自己的修改和添加,完成整个程序的正常运行。
在遇到不会的问题的时候,会寻求掌握的比较牢固的同学的帮助。在课程设计的过程中,让我认识到应该巩固自己的c++基础知识,将理论和实践学会有机的联系和统一。
附录:
猜单词源代码:#include
#include
#include
#include //文件流
#include //使用随机函数用
#include