上海大学1516级C++试题DOCWord下载.docx
《上海大学1516级C++试题DOCWord下载.docx》由会员分享,可在线阅读,更多相关《上海大学1516级C++试题DOCWord下载.docx(15页珍藏版)》请在冰豆网上搜索。
"
{
size=strlen(②str);
x=size>
0?
newchar[size]:
NULL;
if(x==NULL)size=0;
for(inti=0;
i<
size;
i++)
x[i]=str[i];
}
String(constString&
s):
x(③NULL)
*this=s;
//直接利用深赋值运算符函数
virtual~String()
if(x!
=NULL)delete④[]x;
size=0;
String&
operator=(constString&
s)
if(this==⑤&
s)return*this;
=NULL)delete[]x;
size=s.size;
x=newchar[size];
x[i]=s.x[i];
return⑥*this;
⑦char&
operator[](intindex){returnx[index];
}
friendostream&
operator<
<
(ostream&
out,constString&
s.size;
out<
s.x[i];
return⑧out;
⑨friendistream&
operator>
>
(istream&
in,String&
stringstr;
in>
str;
//利用C++字符串
s=String(str.c_str());
//利用深赋值运算符
returnin;
friend⑩intCompare(constString&
s1,constString&
s2)
inti;
for(i=0;
s1.size&
&
s2.size&
s1.x[i]==s2.x[i];
;
if(i<
s2.size)
returns1.x[i]>
s2.x[i]?
1:
-1;
elseif(i<
i==s2.size)
return1;
elseif(i==s1.size&
return-1;
else
return0;
friendbooloperator<
(constString&
{returnCompare(s1,s2)<
0;
=(constString&
=0;
friendbooloperator>
{returnCompare(s1,s2)>
friendbooloperator==(constString&
{returnCompare(s1,s2)==0;
friendbooloperator!
{returnCompare(s1,s2)!
protected:
char*x;
intsize;
};
voiddisplay(constString&
char*str[]={"
小于"
"
等于"
大于"
cout<
\"
s1<
str[1+Compare(s1,s2)]
<
s2<
\t"
endl;
intmain()
{Strings1("
Helloworld!
),s2(s1);
运行结果
helloworld!
Helloworld"
display(s1,s2);
s2[0]='
h'
;
s2="
s1="
return0;
三、阅读程序写出运行结果(每行1分,共20分)
3.1(10分)本题所涉及的Time类,相关头文件和源程序文件如下。
//MyTime.h头文件
#ifndefMYTIME_H
#defineMYTIME_H
iomanip>
usingnamespacestd;
classTime
Time(inthour=0,intminute=0,intsecond=0);
Time&
operator++();
Timeoperator++(int);
friendTimeoperator+(constTime&
t,intn);
out,constTime&
t);
friendistream&
in,Time&
inth,m,s;
#endif
//MyTime.cpp源程序文件
#include"
MyTime.h"
Time:
:
Time(inthour,intminute,intsecond):
h(hour),m(minute),s(second)//构造函数
Time&
operator++()
s++;
if(s==60){s=0;
m++;
if(m==60){m=0;
h++;
if(h==24)h=0;
return*this;
TimeTime:
operator++(int)
Timetemp(*this);
++(*this);
returntemp;
Timeoperator+(constTime&
t,intn)
Timeresult(t);
intx=(t.h*60+t.m)*60+t.s+n;
while(x<
0)
x+=24*60*60;
x%=24*60*60;
result.s=x%60;
result.m=x/60%60;
result.h=x/3600;
returnresult;
ostream&
t)
out<
setfill('
0'
)<
setw
(2)<
t.h<
'
t.m<
t.s<
);
returnout;
istream&
charstr[200];
in.getline(str,200,'
t.h=atoi(str);
t.m=atoi(str);
in.getline(str,200);
t.s=atoi(str);
returnin;
运行结果(3.1)
23:
59:
51
52
50
22:
请输入时间:
59
00:
00
10:
20:
30
//main.cpp源程序文件(测试程序)
Timet0(23,59,50),t;
t=t0;
cout<
++t<
++t;
t<
++++t;
t++<
t++;
t++++;
t=t+(-3600);
请输入时间(hh:
mm:
ss):
cin>
t;
t+(10*60+20)*60+30<
3.2(10分)以下4小题所涉及的Test1类,相关头文件和源程序文件如下。
//test03.h头文件
#ifndefTEST03_H
#defineTEST03_H
classTest1
Test1(inta=0);
Test1(constTest1&
virtual~Test1();
Test1&
operator=(constTest1&
staticintNum();
staticintSum();
out,constTest1&
in,Test1&
staticintnum,sum;
intx;
voidShow();
//普通的C++函数声明
//Test03.cpp源程序文件
Test03.h"
intTest1:
num=0,Test1:
sum=0;
//静态数据成员定义及初始化
Test1:
Test1(inta):
x(a)//构造函数
num++;
sum+=x;
Test1(constTest1&
t):
x(t.x)//拷贝构造函数
~Test1()
num--;
sum-=x;
Test1&
t)//赋值运算符函数
sum+=t.x-x;
x=t.x;
Num(){returnnum;
Sum(){returnsum;
t.x;
inttemp;
in>
temp;
Test1:
sum+=temp-t.x;
t.x=temp;
voidShow()//普通的C++函数
cout<
Num="
Num()
<
\tSum="
Sum()<
//3.2.1测试程序之一
运行结果(3.2.1)
Num=0,Sum=0
Show();
//3.2.2测试程序之二
Test1x(100);
//创建一个全局对象
voidf(Test1t)
运行结果(3.2.2)
Num=1,Sum=100
Num=2,Sum=200
f(x);
//3.2.3测试程序之三
voidf(Test1&
运行结果(3.2.3)
Test1x(100);
//创建一个自动对象
//3.2.4测试程序之四
运行结果(3.2.4)
Num=4,Sum=60
Num=5,Sum=90
Test1x(10),y(20),a[2]={x,y}
Test1*p=newTest1;
*p=30;
deletep;
四、(40分)设计复数类。
要求运行时得到指定的输出结果。
①实现如下测试程序中用到的9个函数(每个函数3分。
无须定义拷贝构造函数、析构函数及赋值运算符函数);
②自选3个运算符,并实现运算符函数重载(每个函数3分。
注意复数不能比较大小);
③数据成员、类设计的其他部分(4分)。
【注意:
数学函数doubleatan2(doubley,doublex);
当x≠0时返回y/x的反正切值,当x=0时返回π/2或-π/2(正负号与y同号)】。
Complex.h"
Complexx(3,4),y(x),z;
//创建对象
x<
y<
z<
//输出复数
x.Abs()<
\t'
//计算复数的模长
z.Real()=z.Imag()=1;
//设置复数的实部、虚部
z.Angle()*180/M_PI<
//计算复数的角度
x+z<
//复数的算术运算:
+、*,迭代赋值*=
运行结果(4.1)
(3,4),(3,4),(0,0)
545
(4,5)(-1,7)(-7,24)
x*z<
(x*=x)<
//Complex.h
cmath>
classComplex
Complex(doublereal=0,doubleimag=0):
re(real),im(imag){}
double&
Real(){returnre;
Imag(){returnim;
doubleAngle()const{returnatan2(im,re);
doubleAbs()const{returnsqrt(re*re+im*im);
friendComplexoperator+(constComplex&
c1,constComplex&
c2)
Complexresult(c1);
result.re+=c2.re;
result.im+=c2.im;
returnresult;
friendComplexoperator*(constComplex&
Complexresult;
result.re=c1.re*c2.re-c1.im*c2.im;
result.im=c1.re*c2.im+c1.im*c2.re;
Complex&
operator*=(constComplex&
c)
doublex=re*c.re-im*c.im;
im=re*c.im+im*c.re;
re=x;
return*this;
out,constComplex&
out<
('
c.re<
c.im<
)'
returnout;
doublere,im;