c++程序报告.docx
《c++程序报告.docx》由会员分享,可在线阅读,更多相关《c++程序报告.docx(13页珍藏版)》请在冰豆网上搜索。
c++程序报告
福建农林大学计算机与信息学院实验报告
系:
计算机科学与技术专业:
计算机科学与技术年级:
09级
姓名:
池建松学号:
091150013实验室号__510__计算机号89
实验时间:
指导教师签字:
成绩:
实验七运算符重载
一、实验目的
●掌握运用成员函数、友元函数实现运算符重载的方法
●掌握重载运算符函数的调用方法
二、实验内容和原理
内容:
1.设计一个日期类date,其中包含年、月、日等数据成员。
要求实现日期的基本运算,如一日期加上天数、或减去天数后的日期,两个日期之间相差的天数。
提示:
在date类中实现如下运算符重载函数:
dateoperator+(intdays);
dateoperator-(intdays);
intoperator–(date&d);
2.设计一个描述矩阵的类,运用运算符重载实现矩阵的和、差、积等运算。
原理:
习题一,1.定义一个日期类,该类包含数据成员年月日以及设置日期起和输出日期的函数,还有用来计算某年某月的总天数以及重载运算符函数。
2.在类的外部实现类内的函数成员3.在主函数中定义类的对象,实现操作。
习题二,1.定义一个矩阵类,该类包含数据要输入行列数的矩阵成员以及指针类的成员,再定义一个构造函数用来给二维数组开辟空间,还有设置矩阵输出矩阵和一些重载运算符的函数2.在类的外部实现成员函数的操作3.在主函数中实现矩阵的加减乘操作。
三、实验环境
Microsoftvisualstudio2010
四、算法及实验步骤
习题一、
1.启动Microsoftvisualstudio2010开发环境
2.编写如下代码:
#include
usingnamespacestd;
classdate
{
intyear,day,month;
public:
voidgetdate();
voidsetdate(inty,intm,intd);
dateoperator+(intdays);
dateoperator-(intdays);
intsum(int,int);
intoperator-(date&d);
};
intdate:
:
operator-(date&d)
{doublen=0;
if(year>d.year)
while((year!
=d.year||month!
=d.month||day!
=d.day))
{d=d+1;n++;}//求和运算符重载,小的日期加上一天,天数加上一天
elseif(yearwhile((year!
=d.year||month!
=d.month||day!
=d.day))
{d=d-1;n++;}//大的日期减去一天,天数加上一天
elseif(year==d.year)
{if(month>d.month)
while((month!
=d.month||day!
=d.day))
{d=d+1;
n++;}
elseif(monthwhile((month!
=d.month||day!
=d.day))
{d=d-1;
n++;}
}
elseif((year==d.year)&&(month==month))
{if(day>d.day)
while(day!
=d.day)
{d=d+1;n++;}
elseif(day{while(day!
=d.day)
{d=d-1;n++;}
}
}returnn;
}
intdate:
:
sum(intyear,intmonth)//计算某年某月的总天数
{if(month==2)
{if((year%4==0)&&(year%100!
=0)||(year%400==0))
return29;elsereturn28;}
elseif((month==1)||(month==3)||(month==5)||(month==7)||(month==8)||(month==10)||(month==12))
return31;
elsereturn30;}
datedate:
:
operator+(intdays)
{intm;
day=day+days;m=sum(year,month);
while(day>m)
{
day-=m;
month++;
m=sum(year,month);
while(month>12)
{year++;
month=1;
m=sum(year,month);}
}
return*this;
}
datedate:
:
operator-(intdays)
{
intm;
day=day-days;
while(day<=0)
{month--;
if(month==0)
{month=12;year--;
m=sum(year,month);}
elsem=sum(year,month);
day+=m;
}
return*this;
}
voiddate:
:
getdate()
{cout<voiddate:
:
setdate(inty,intm,intd)
{year=y;month=m;day=d;}
voidmain()
{inth,y,m,d,n;
dateA,B,C,D;
cout<<"请输入第一个日期(请注意输入是否有误):
";
cin>>y>>m>>d;
A.setdate(y,m,d);
A.getdate();
cout<<"请输入要加上的天数:
";
cin>>h;
A=A+h;
cout<<"加上天数后的日期为";
A.getdate();
cout<<"请输入第二个日期(请注意输入是否有误):
";
cin>>y>>m>>d;
B.setdate(y,m,d);
B.getdate();
cout<<"请输入要减去的天数:
";
cin>>h;
B=B-h;
cout<<"减去天数后的日期为:
";
B.getdate();
cout<<"请输入第三个日期(请注意输入是否有误:
)";
cin>>y>>m>>d;
C.setdate(y,m,d);
C.getdate();
cout<<"请输入第四个日期(请注意输入是否有误):
";
cin>>y>>m>>d;
D.setdate(y,m,d);
D.getdate();
n=C-D;
cout<<"第三个日期和第四个日期相差"<system("pause");
}
习题二、
1.启动Microsoftvisualstudio2010开发环境
2.编写如下代码:
#include
usingnamespacestd;
classarray
{intn,m,**p;
public:
array(int,int);
friendarrayoperator+(array&a,array&b);
friendarrayoperator-(array&a,array&b);
friendarrayoperator*(array&a,array&b);
array&operator=(array&r);
intgetn(){returnn;}
intgetm(){returnm;}
int**getp(){returnp;}
voidsetarray();
voidshowarray();
};
voidarray:
:
setarray()
{inti,j;
for(i=0;ifor(j=0;j{cout<<"a["<
cin>>*(*(p+i)+j);}
}
voidarray:
:
showarray()
{inti,j;
for(i=0;i{cout<for(intj=0;jcout<<""<<*(*(p+i)+j)<<"";
}
cout<}
array:
:
array(inta,intb)
{n=a;m=b;
p=newint*[n];
for(inti=0;ip[i]=newint[m];
}
arrayoperator+(array&a,array&b)
{arraytemp(a.getn(),a.getm());
for(inti=0;ifor(intj=0;j*(*(temp.getp()+i)+j)=*(*(a.getp()+i)+j)+*(*(b.getp()+i)+j);
returntemp;
}
arrayoperator-(array&a,array&b)
{arraytemp(a.getn(),a.getm());
for(inti=0;ifor(intj=0;j*(*(temp.getp()+i)+j)=*(*(a.getp()+i)+j)-*(*(b.getp()+i)+j);
returntemp;
}
arrayoperator*(array&a,array&b)
{arraytemp(a.getn(),b.getn());
for(inti=0;ifor(intj=0;j*(*(temp.getp()+i)+j)=0;
for(inti=0;ifor(intj=0;jfor(intt=0;t*(*(temp.getp()+i)+j)=*(*(temp.getp()+i)+j)+*(*(a.getp()+i)+t)**(*(b.getp()+t)+j);
returntemp;
}
array&array:
:
operator=(array&r)
{if(this!
=&r)
{inti,j;
for(i=0;idelete[]p[i];
delete[]p;
p=newint*[n];
for(i=0;ip[i]=newint[m];
for(i=0;ifor(j=0;j*(*(p+i)+j)=*(*(r.getp()+i)+j);
}
return*this;
}
voidmain()
{intn,m;
cout<<"请输入矩阵的行数和列数:
";
cin>>n>>m;
arraya1(n,m),a2(n,m),a3(n,m);
cout<<"第一个矩阵为"<a1.setarray();
cout<a2.setarray();
a3=a1+a2;
cout<cout<<"相加后的矩阵为"<a3.showarray();
cout<cout<<"相减后的矩阵为:
"<a3=a1-a2;
a3.showarray();
cout<a3=a1*a2;
cout<<"相乘后的矩阵为:
"<a3.showarray();
system("pause");
}
五、调试过程
习题一:
1.出现函数成员无法访问现象。
2.闰年的算法错误。
以及计算加上(减去)天数后的日期和两个日期只差的算法错误导致输出结果一直出错。
3.在判断某年某月的天数的函数中,算法错误,分析结果为每月都为29天
4.在主函数中未输出所要输出的值。
5.在计算相差天数的函数中,当循环计算天数的值时,没有把当天日期加上一天。
6.if,while语句括号匹配错误。
以及函数值未返回。
习题二:
1.开辟二维数组空间错误,使编译器无法继续运行。
如p=newint*[n];没有在数组n的前面加上指针。
2.在用类的对象访问数据成员时出现无法访问现象,需要用一个返回私有成员的函数来实现。
3.在设置矩阵的时候cout<<"a["<
4.未重载赋值运算符
5.在计算矩阵相乘时,未给临时矩阵赋值为0。
还有计算矩阵相乘的算法错误。
6.在重载赋值运算符时,申明错误以及函数内部操作错误,空间释放错误,赋值错误。
六、实验结果
习题一:
习题二、
七、总结
1.在习题一中,遇到了许多难以解决的算法,在分析题目的时候,总要考虑许多可能的情况,这些情况要是都编写出来时很困难的。
当然在我的习题代码一中,还存在许多未能解决的问题,比如是否要考虑在输入日期的时候出错,如输入一个数据20001330,此时不存在13月份的情况。
所以如果不加判断,我就在主函数中提示要注意是否出错。
在习题二中,在以上代码中如果另外输入两个行数和列数不相同的情况下,需要第一个矩阵的列数要等于第二个矩阵的行数,在以上代码中也未做判断。
2.了解到编程重要的是一个算法和一个语法,这两个首先要先掌握好,比如习题一,该题是算法的难度会大于语法,而在习题二中算法和语法都很难,多以要想编好程序,要多做实验,多操作,算法要多练,语法要掌握,特别是有关指针方面的内容,开辟空间,释放空间等。
3.在实际编程过程中,其实还有许多错误的地方,在studio2010这个编程软件中,在编的过程中它会提示语法上的错误,当是算法上的错误或者空间分配上的错误或者其他地方的错误它不会显示出来,但是在编译的时候,错误的地方它也会提示。
所以代码每编一步就会注意到自己错误的地方,记住这些容易错的地方减少下次的失误。
4.在编一道程序之前,首先要想好题目问的是什么,要求是什么,要先把整个思路理清,从前几次的实验中发现当看完一道题目后还不清楚自己需要编这么样的代码以至于没有把思路理清。
又或者是知道程序运行的结果却很难从开头下手。
好比说习题二这道,知道要计算矩阵的和差积,但是却不知道如何将这些数据连接起来。
还有比如说习题一中知道要重载运算符,定义完之后却不知道函数内容要如何编写。
我想可能是刚接触新的题目,如果程序编多了我想应该可以知道如何更好的解决这一类的问题的。