调试及问题解决:
调试错误1:
在进行登记操作后,再查看所有信息时,发现登记的房间号是1,然而显示的却是2号房间登记过了!
解决方法:
问题的原因很明显是操作对象数组时数组的下标不一致;仔细查看后发现,输出信息时下标用i;二输入信息时用的却是i-1;所以为了统一不出错,外界的房间标号用1到10,若外界要操作i,内部数组的处理时下标统一用外界输入的i-1(内部处理数组标号是0到9)。
调试错误2:
退房结算时没有实现消费额的计算,仅仅是将房间的属性标注为空房!
解决方法:
对实现退房结算的那个函数进行修改,加入计算入住时间到退房时间之间的时间差为住房的时间;然后乘以单价就是要付的金额!
调试错误3:
程序不够优化!
在住房登记时,入住时间和退房时间需要自己输入!
解决方法:
加入一个函数GetCurrentDate();来实现自动获取系统日期!
同时在入住登记和退房结算的实现代码中修改自动加入入住时间的赋值!
二.字符串封装
总体设计
文件关系体系设计:
类设计:
基类:
CMyString
{
public:
CMyString();//无参数构造
CMyString(stringinput);//含参数构造
CMyString(CMyString&StrPara);//字符串类的复制拷贝构造函数
intoperator<(CMyString&StrPara);
//若参数小于对象,返回-1,反之1,相等0
string*GetPointer();//保存数组的指针
intGetLength();//返回数组的长度
boolIsEmpty();
//如果是空,返回true,否则返回false
voidEmpty();//置空
voidDisplay();//输出显示字符串
voidInsert(inti,char*p);//插入字符到第i个位置
voidoperator=(string&StrPara);
//string对象直接赋值
voidoperator=(CMyString&StrPara);
//CMyString对象直接赋值;
voidoperator=(charStrPara[]);//char[]直接赋值
CMyStringoperator+(CMyString&StrPara);
//字符串的链接
charoperator[](inti);//求第i个位置的字符
stringstr;//数据成员
string*strpointer;//保存数据的指针!
};
继承类:
classCColorString:
publicCMyString
{
public:
CColorString():
CMyString()//无参构造
CColorString(stringinput,stringcolorPara):
CMyString(input)
//含参构造
CColorString:
:
CColorString(CColorString&StrPara)//拷贝构造
voidDisplay1()//Display1()函数的重写
}
详细设计
功能实现
1.求字符串的长度:
使用类的成员stringstr自带的函数length();
关键代码:
returnstr.length();
2.判断串是否为空:
使用类的成员stringstr自带的函数empty();
关键代码:
returnstr.empty();
3.将串置空;
对类的成员str重新赋值为空
关键代码:
str="";
4.求字符串中的一个字符:
重载下标运算符[],同时使用string类的[]重载函数;
关键代码:
returnstr[i-1];
5.将一个字符加到字符串的适当位置:
使用string的自带函数
关键代码:
str.insert(i,p);//I是插入位置p是插入的字符
6.运用运算符重载,完成串的赋值与合并:
重载+和=运算符同时使用string自带的+和=运算符重载
关键代码
str+=StrPara.str;
str=StrPara;
7.完成两个字符串的比较:
重载<运算符同时使用string的>或<重载函数
关键代码:
return(pare(StrPara.str));
调试及问题解决:
调试问题1:
插入字符时,如果输入的插入位置超过了类对象的长度,发生越界异常,导致程序崩溃!
解决办法:
在接受插入的位置时,用if判断一下是否发生越界!
若越界,直接提示并不进行插入操作;否则进行插入操作!
调试问题2:
运行时直接查看所有信息,出现异常!
解决办法:
根据出现的错误的提示,然后调试,查看变量的值,系统给的错误是:
使用了未赋值的变量。
然后添加初始化函数,对对象数组初始化。
三、心得体会
这次课设花费时间两周,仅完成两个题目的完整设计!
从这词课设中,我深刻认识到平时的理论所学到实践时是相差那么远!
同时也积累了一定c++入门经验!
经过两个星期的实践学习,使我对C++语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,通过实践,我也发现我的好多不足之处,首先是自己在指法上还不行,经常按错字母,通过学习也有所改进;再有对C++语言的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对C++语言中经常出现的错误也不了解,通过实践,使我在这几个方面的认识有所提高。
通过实践的学习,我认到学好计算机要重视实践操作,不仅仅是学习C++语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。
通过分析、设计、编码、调试等各环节的训练,深刻理解、C++程序设计技术,掌握分析、解决实际问题的能力。
综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,逐步掌握软件开发的基本思想、方法和实现步骤,提高实际应用水平。
学会应用VsualC++环境编程,调试程序。
四、源码
旅馆管理系统:
//////////////////////////////////////////////////////////////////房间结构(Room.h)///////////////////////////////////////////////////
#include
#include
#include
usingnamespacestd;
structGuestInfo
{
intRoomID;
stringGuestName;
stringGuestIDCardNum;
intInDate;///入住日期
intOutDate;///退房日期
intAdvancePayment;
};
structRoom
{
intprice;
intRoomID;
charRoomType;
GuestInfoguestinfo;//客户信息
boolIsUsing;///入住情况
boolIsAble;
};
/////////////////////////////////////////////main.cpp///////////////////////////////////////
#include"Room.h"//客房信息和客户信息
voidMainSystem();
voidMain_System_Menu();//函数声明
///*******************************************/////相关操作函数
Roomroom[10];
voidfileread()//读文件
{
cout<<"\n\n正在配置管理系统...";
inti;
FILE*fp;
if((fp=fopen("Room.inf","rb"))==NULL)cout<<"打开文件失败!
\n";
elsecout<<"已经成功读取文件!
\n";
rewind(fp);
for(i=0;i<10;i++)
{
fread(&room[i],sizeof(Room),1,fp);
}
fclose(fp);
}
voidfilesave()//写文件
{
inti;
FILE*fp;
if((fp=fopen("Room.inf","wb+"))==NULL)cout<<"保存文件失败!
\n";
elsecout<<"已经成功保存文件!
\n";
rewind(fp);
for(i=0;i<10;i++)
{
fwrite(&room[i],sizeof(Room),1,fp);
}
fclose(fp);
}}
intGetDays(intmonth)//计算每月的天数
{
if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)return31;
elseif(month==4||month==6||month==9||month==11)return30;
elsereturn28;
}
intDaySum(intin,intout)//计算共住了多少天
{
intin_year=in/10000;//时间用整形保存!
分别获取年月日
intin_month=(in/100)%100;
intout_year=out/10000;
intout_month=(out/100)%100;
intsum=0;
if(in_year==out_year)//如果是同一年从入住月份+到退房的月份
{
if((in_year%4==0)&&(in_year%100!
=0)||(in_year%400==0))
sum+=1;
for(in_month;in_month}
else中间加整年的天数,同时判断是否是闰年以及是否要多加1天
{
for(in_month;in_month<=12;in_month++)sum+=GetDays(in_month);
for(;(in_year+1){if((in_year%4==0)&&(in_year%100!
=0)||(in_year%400==0))
sum+=366;
elsesum+=365;
}
for(intmo=1;mo}
sum-=(in%100);
sum+=(out%100);
returnsum;
}
intGetCurrentDate()//获取系统时间
{
intyear,month,day;
SYSTEMTIMEct;
GetLocalTime(&ct);//如果用GetSystemTime(&ct);那么获取的是格林尼治标准时间
year=ct.wYear;
month=ct.wMonth;
day=ct.wDay;
return(year*10000+month*10