C++课堂练习Word格式文档下载.docx
《C++课堂练习Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《C++课堂练习Word格式文档下载.docx(41页珍藏版)》请在冰点文库上搜索。
![C++课堂练习Word格式文档下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/7/4d112cc7-42f4-4d8e-9764-81959d280fc5/4d112cc7-42f4-4d8e-9764-81959d280fc51.gif)
voidmain()
{
intcost;
doubleprice,d;
cost;
if(cost>
5000)
d=0.8;
switch(cost/1000)
case0:
d=1.0;
break;
case1:
d=0.95;
case2:
d=0.9;
case3:
case4:
d=0.85;
price=cost*d;
price<
}
4从键盘输入一个三角形的3条边长,编写一个求三角形面积的函数(通过海仑公式求面积),并将结果显示。
cmath>
doublearea(inta,intb,intc);
inta,b,c;
a>
b>
c;
Area:
area(a,b,c)<
doublearea(inta,intb,intc)
doubles,area;
s=(a+b+c)/2.0;
area=sqrt(s*(s-a)*(s-b)*(s-c));
returnarea;
5输入的整数按逆序输出,要求分别用递归算法和非递归算法实现。
如:
输入:
12345,输出:
54321
voidprint(inta);
voidprint1(inta);
intn;
n;
print(n);
print1(n);
voidprint(inta)//非递归
while(a>
0)
a%10<
"
;
a=a/10;
voidprint1(inta)//递归
if(a>
print1(a/10);
}
6请将P77的例3-12改写成指针传递的函数调用方式
stdafx.h>
voidSwap(int*a,int*b);
intx(5),y(10);
x="
x<
y="
y<
Swap(&
x,&
y);
voidSwap(int*a,int*b)
intt;
t=*a;
*a=*b;
*b=t;
7编写2个同名函数,分别求三角形面积和矩形面积(通过各自的边长),使用重载的方式分别调用并显示结果。
doublearea(inta,intb,intc,intd);
inta,b,c,d;
c>
d;
TriangleArea:
SquareArea:
area(a,b,c,d)<
doublearea(inta,intb,intc,intd)
doublearea;
if(a==b)
if(a==c)
area=a*d;
else
area=a*c;
else
area=a*b;
returnarea;
8编写程序,实现两个字符串的交换。
(请分别用三种参数传递方式实现)
例如:
char*ap="
hello"
char*bp="
howareyou?
交换的结果使得ap和bp指向的内容分别为:
ap:
bp:
voidswap(char*x,char*y)
voidswap(char**x,char**y)
voidswap(char*&
x,char*&
y)
string.h>
{
chartemp[20];
strcpy(temp,x);
strcpy(x,y);
strcpy(y,temp);
}
voidmain()
charap[20]="
charbp[20]="
ap<
bp<
swap(ap,bp);
============================
voidswp(char**x,char**y)
char*temp;
temp=*x;
*x=*y;
*y=temp;
char*ap="
char*bp="
swp(&
ap,&
bp);
===========================
y)//引用作为参数
temp=x;
x=y;
y=temp;
swapap,bp"
9下面是一个类的测试程序,设计出能使用如下测试程序的类。
Testa;
a.init(68,50);
a.print();
其执行结果为:
测试结果:
68-50=18
classTest
intx,y;
public:
voidinit(int,int);
voidprint();
};
voidTest:
:
init(inti,intj)
{x=i;
y=j;
print()
{cout<
-"
="
x-y<
10写出以下程序的执行结果
classSample
Sample(){x=y=0;
Sample(inta,intb){x=a;
y=b;
~Sample()
{
if(x==y)
cout<
x=y"
else
x!
=y"
voiddisp()
y="
Samples1(2,3);
s1.disp();
11设计一个立方体类Box,它能计算并输出立方体的体积和表面积。
分析:
Box类包含三个私有数据成员a(立方体边长)、volume(体积)和area(表面积),另有两个构造函数以及seta()(设置立方体边长)、getvolume()(计算体积)、getarea()(计算表面积)和disp()(输出结果)。
classBox
floata;
floatvolume;
floatarea;
Box(){}
Box(floatr){a=r;
voidseta(floatr){a=r;
voidgetvolume(){volume=a*a*a;
voidgetarea(){area=6*a*a;
{cout<
体积:
volume<
表面积:
area<
}
Boxobj1(4.5),obj2;
obj2.seta(6.4);
obj1.getvolume();
obj1.getarea();
obj1=>
obj1.disp();
obj2.getvolume();
obj2.getarea();
obj2=>
obj2.disp();
12写出以下程序的执行结果
Sample(inti,intj){x=i;
voidcopy(Sample&
s);
voidsetxy(inti,intj){x=i;
voidprint(){cout<
voidSample:
copy(Sample&
s)
x=s.x;
y=s.y;
voidfunc(Samples1,Sample&
s2)
s1.setxy(10,20);
s2.setxy(30,40);
Samplep(1,2),q;
q.copy(p);
func(p,q);
p.print();
q.print();
13编写一个程序,设计一个点类Point,求两个点之间的距离。
可以设计一个普通函数distance(Point&
p1,Point&
p2),用于计算p1和p2点之间的距离。
math.h>
classPoint
Point(inti,intj){x=i;
intgetx(){returnx;
intgety(){returny;
("
'
)"
floatdistance(Point&
p2)//对象引用作为参数
floatd;
d=sqrt((p1.getx()-p2.getx())*(p1.getx()-p2.getx())+(p1.gety()-p2.gety())*(p1.gety()-p2.gety()));
returnd;
Pointp1(2,2),p2(5,5);
p1.disp();
与"
p2.disp();
之间距离="
distance(p1,p2)<
14创建一个职工类employee,该类能表示姓名、街道地址、市、省和邮政编码。
该类中有构造函数、changstreet()、display()函数构造函数初始化每个成员,changstreet()函数能改变职工的地址信息,display()函数把完整的职工信息打印出来。
其中的数据成员是保护的,函数是公共的。
classemployee
protected:
charname[10];
//姓名
charstreet[20];
//街道地址
charcity[10];
//市
charprov[10];
//省
charpost[7];
//邮政编码
intno;
//记录序号
employee(char[],char[],char[],char[],char[],int);
voidchangestreet(charn[]);
voiddisplay();
employee:
employee(charn[],chars[],charc[],charp1[],charp2[],intnum)
strcpy(name,n);
strcpy(street,s);
strcpy(city,c);
strcpy(prov,p1);
strcpy(post,p2);
no=num;
voidemployee:
changestreet(charn[])
strcpy(street,n);
display()
输出记录"
no<
姓名:
name<
街道地址:
street<
市:
city<
省:
prov<
邮政编码"
post<
employeeobj1("
王华"
"
中华路15号"
武汉市"
湖北省"
430070"
1);
employeeobj2("
杨丽"
天津路30号"
南京市"
江苏市"
210020"
2);
obj1.display();
obj2.display();
15分析以下程序的执行结果
staticintsum;
Sample(intx){n=x;
voidadd(){sum+=n;
n="
n<
sum="
sum<
本题说明静态数据成员的使用方法。
在类中定义了一个静态数据成员sum,在main()之前给它赋初值0,然后在main()中定义了三个对象,并执行各自的add()和disp()方法。
所以输出为:
n=2,sum=2
n=3,sum=5
n=5,sum=10
注意:
静态数据成员脱离具体的对象独立存在,其存储单元不是任何对象存储空间的一部分,但逻辑上所有对象都共享这一存储单元,对静态数据成员的任何操作都会访问这一存储单元,从而影响这一存储单元的所有对象。
intSample:
sum=0;
//静态数据成员赋初值
Samplea
(2),b(3),c(5);
a.add();
a.disp();
b.add();
b.disp();
c.add();
c.disp();
16分析以下程序执行的结果
intA;
staticintB;
Sample(inta){A=a,B+=a;
staticvoidfunc(Samples);
func(Samples)
A="
s.A<
B="
B<
B=0;
Samples1
(2),s2(5);
Sample:
func(s1);
func(s2);
本题说明了静态成员函数的使用方法。
其中的数据成员B是静态数据成员,求B之值是在构造函数中进行的。
A=2,B=7
A=5,B=7
静态成员函数与静态数据成员一样,也不是对象成员。
静态成员函数的调用不同于普通的成员函数。
在静态成员函数的实现中,引用类的非静态数据成员是通过对象进行的,如本题中s.A,引用类的静态数据成员是直接进行的,如本题中的B。
17分析以下程序的输出结果
intx;
Sample(inta)
x=a;
constructingobject:
voidfunc(intn)
{staticSampleobj(n);
func
(1);
func(10);
本题说明静态对象构造函数的调用情况,由于在func()函数中定义的对象obj是静态对象,故只被构造一次,所以输出为:
counstructingobject:
x=1
静态对象和静态变量一样,只被构造一次。
块作用域的静态变量,在首次进入到定义该静态对象的函数时,构造该静态对象,以后进入该函数时不再构造静态对象。
18编写一个程序,输入N个学生数据,包括学号、姓名、成绩,要求输出这些学生数据并计算平均分。
设计一个学生类Stud,除了包括no(学号)、name(姓名)和deg(成绩)数据成员外,有两个静态变量sum和num,分别存放总分和人数,另有两个普通成员函数setdata()和disp(),分别用于给数据成员赋值和输出数据成员的值,另有一个静态成员函数avg(),它用于计算平均分。
classStud
intdeg;
staticintnum;
voidsetdata(intn,charna[],intd)
no=n;
deg=d;
strcpy(name,na);
sum+=d;
num++;
staticdoubleavg()
{returnsum/num;
deg<
intStud:
num=0;
Studs1;
Studs2;
Studs3;
intn,d;
charna[10];
输入学号姓名成绩:
n>
na>
s1.setdata(n,na,d);
cout<
s2.setdata(n,na,d);
s3.setdata(n,na,d);
输出数据:
学号姓名成绩"
s2.disp();
s3.disp();
平均分="
Stud:
avg();