资源描述
C++程序设计
练习题
学院: 计算机学院
专业班级: 物联网1002
学号:0121010340705
姓名: 徐 远 志
第八章
1.下面是一个类的测试程序,试设计出能是用如下测试程序的类.
Int main()
{
Test x;
x.initx(30,20);
x.printx();
return 0;
}
解:
#include <iostream>
using namespace std;
class Test //类的开始
{
public:
void initx(int i,int j);
void printx();
private:
int x,y;
};
void Test::initx(int i,int j)
{
x=i;
y=j;
}
void Test::printx()
{
cout<<x<<"*"<<y<<"="<<x*y<<endl;
} //类的结束
int main() //测试函数
{
Test x;
x.initx(30,20);
x.printx();
return 0;
}
得到的测试结果:
4.定义并实现一个矩形类Crectangle。该类包含了下列成员函数。
Crectangle(): 累的构造函数,根据需要可以定义多个构造函数
SetTop(),SetLeft(): 设置矩形的左上角坐标
SetLength(),SetWidth(): 设置矩形的长和宽
Perimeter(): 求矩形的周长
Area(): 求矩形的面积
GetWidth(): 返回矩形的宽度
Getlength(): 返回矩形的长度
IsSquare(): 判断矩形是否为正方形
Move(): 将矩形从一个位置移动到另一个位置
Size(): 改变矩形的大小
Where(): 返回矩形的左上角的坐标
PrintRectangle(): 输出矩形的四个顶点的坐标
数据成员
int top,left;
int length,width;
解:
#include <iostream>
using namespace std;
class Crectangle //类的开始
{
int top,left;
int length,width;
public:
Crectangle(int t=0,int l=0,int len=1,int w=1)
{
top=t;left=l;
if (len>0) length=len;
else length=0;
if (w>0) width=w;
else width=0;
}
void SetTop(int t)
{
top=t;
}
void SetLeft(int l)
{
left=l;
}
void SetLength(int len)
{
length=len;
}
void SetWidth(int w)
{
width=w;
}
int Perimeter()
{
return 2*(width+length);
}
int Area()
{
return width*length;
}
int GetWidth()
{
return width;
}
int GetLength()
{
return length;
}
int IsSquare()
{
if(width==length)
{
cout<<"该矩形是正方形"<<endl;
return 1;
}
else
{
cout<<"该矩形不是正方形"<<endl;
return 0;
}
}
void Move(int x,int y)
{
left+=x;
top+=y;
}
void Size(int l,int w)
{
length=l;
width=w;
}
void PrintRectangle()
{
cout<<"左上方的点为:("<<left<<","<<top<<")"<<endl;
cout<<"右上方的点为:("<<left+length<<","<<top<<")"<<endl;
cout<<"左下方的点为:("<<left<<","<<top+width<<")"<<endl;
cout<<"右下方的点为:("<<left+length<<","<<top+width<<")"<<endl;
}
}; //类的结束
int main()
{
Crectangle a(1,1,5,5);
a.PrintRectangle();
a.SetTop(2);
a.SetLeft(3);
a.SetLength(4);
a.SetWidth(5);
a.IsSquare();
cout<<"周长为:"<<a.Perimeter()<<endl;
cout<<"面积为:"<<a.Area()<<endl;
a.PrintRectangle();
cout<<"用getwidth等函数得到的值为:"<<endl;
cout<<" 长为:"<<a.GetLength<<endl;
cout<<" 宽为:"<<a.GetWidth<<endl;
return 0;
}
得到的测试结果:
6.某次歌手大赛中,有JudgeNum个评委给选手打分,参加比赛的选手有PlayerNum
名,现为比赛积分编写一个CompetitionResult类,类的定义如下:
(定义略)
(1) 写出所有的成员函数和实现代码。
(2) 编写main()函数对该类进行测试。在函数体中,定义了一个competitionResult类的对象数组r[PlauerNum],他的每个元素记录了每个选手的所有信息,个评委的打分通过键盘的输入,在屏幕上应有提示信息进行交互式操作,比赛结果按选手得分从高到底排列输出。
解:
(1)CompetitionResult::CompetitionResult()
{
num=0; strcpy(name,"");
for(int i=0;i<JudgeNum;i++)
score[i]=0.0;
average=0;
}
CompetitionResult::CompetitionResult(short n,char*ps)
{
num=n;strcpy(name,ps);
for(int i=0;i<JudgeNum;i++)
score[i]=0.0;
average=0;
}
float CompetitionResult::MaxScore()
{ int max=score[0];
for(int i=0;i<JudgeNum;i++)
if(max<score[i]) max=score[i];
return max;
}
float CompetitionResult::MinScore()
{ int min=score[0];
for(int i=0;i<JudgeNum;i++)
if(min>score[i]) min=score[i];
return min;
}
void CompetitionResult::SetAvg()
{ int i;float sum=0.0;
for(i=0;i<JudgeNum;i++)
sum+=score[i];
sum=sum-MaxScore()-MinScore();
average=sum/(JudgeNum-2);
}
float CompetitionResult::GetAvg()
{ return average;
}
short CompetitionResult::GetNo(int i) {return num;}
void CompetitionResult::SetNo(int i) {num=i;}
char CompetitionResult::* GetName() {return name ;}
float CompetitionResult::GetScore(int j) {return score[j];}
void CompetitionResult::Setscore(int k,float av) { score[k]=av; }
void Sort(CompetitionResult *pr,int n)
{
int i,j ,k;
CompetitionResult temp;
for(i=0;i<n-1;i++)
{
k=i;
for(j=i+1;j<n;j++)
if((pr[j].average)>(pr[k].average))
k=j;
if(k!=j)
{
temp=pr[i];
pr[i]=pr[k];
pr[k]=temp;
}
}
}
(2)
int main()
{
CompetitionResult player[PlayerNum]={CompetitionResult(1,"one"),
CompetitionResult(2,"two"),CompetitionResult(3,"there"),
CompetitionResult(4,"four"),CompetitionResult(5,"five"),
CompetitionResult(6,"six"),CompetitionResult(7,"seven"),
CompetitionResult(8,"eight"),CompetitionResult(9,"nine"),
CompetitionResult(10,"ten")};
float a;
for(int i=0;i<PlayerNum;i++)
{
cout<<"请评委给第"<<i+1<<"个选手打分:"<<endl;
for(int j=0;j<JudgeNum;j++)
{ cin>>a;
player[i].Setscore(j,a);
}
player[i].SetAvg();
cout<<endl;
}
Sort(player,PlayerNum);
cout<<" 最后的得分情况为: "<<endl;
for (int j=0;j<PlayerNum;j++)
{cout<<j+1<<" ";
cout<<setw(6)<<player[j].GetAvg();
cout<<" "<<player[j].GetName()<<endl;
}
return 0;
}
程序运行的结果为:
第九章
1. 在下面的程序中,派生类Derived 的成员函数sets()能否访问基类base中得变量a和b?为什么?如果在基类base中将数据成员a和b定义为私有成员,下面的程序能否通过编译?为什么?
#include <iostream>
using namespace std;
class Base {
public:
void set(int i,int j) {a=i;b=j;}
void show() {cout<<"a="<<a<<",b="<<b<<endl;}
protected:
int a,b;
};
class Derived:public Base {
public:
void sets() {s=a*b;}
void shows() {cout<<"s="<<s<<endl;}
private:
int s;
};
int main() {
Derived obj;
obj.set(2,3);
obj.show();
obj.sets();
obj.shows();
return 0;
}
解:可以访问a和b;因为a,b为保护成员,经公有继承,成为派生类中得保护成员,所以派生类Derived 的成员函数sets()能访问基类base中得变量a和b。
如果定义为私有,则不能通过编译。因为派生类中的成员函数不能访问基类中得私有成员
2.声明一个图形基类Shape,在它的基础上派生出矩形类Rectangle和圆形类Circle,它们都有计算面积的和周长、输出图形信息的成员函数,再在Rectangle类的基础上派生方形类Square。编写程序和各类的定义和实现,以及类的使用。
解:
#include <iostream>
using namespace std;
class Shape {
public:
double getArea(){}
double getPerimeter() {}
};
class Rectangle:public Shape {
protected:
double height;
double width;
public:
Rectangle() {}
Rectangle(double a,double b)
{
height=a;
width=b;
}
double getArea()
{ return height*width;
}
double getPerimeter()
{ return 2*(height+width);
}
};
class Circle:public Shape{
public:
Circle(double x):r(x){}
double getPerimeter()
{
return 2*3.1416*r;
}
double getArea()
{
return r*r*3.1416;
}
private:
double r;
};
class Square:public Rectangle
{
public:
Square(double x)
{
height=x;
width=x;
}
};
int main()
{
Rectangle a1(2.2,3.2);
Circle a2(4.2);
Square a3(5.3);
cout<<"Area="<<a1.getArea()<<endl;
cout<<"Perimeter="<<a1.getPerimeter()<<endl;
cout<<"Area="<<a2.getArea()<<endl;
cout<<"Perimeter="<<a2.getPerimeter()<<endl;
cout<<"Area="<<a3.getArea()<<endl;
cout<<"Perimeter="<<a3.getPerimeter()<<endl;
return 0;
}
5.某销售公司有销售经理和销售员工,月工资的计算办法为:销售激励的底薪为4000元,并将销售额的2/1000做提成,销售员工无底薪,只提取5/1000为工资。
编写程序:
(1) 定义一个积累Employee,它包含三个数据成员number,name和salary,以及编号和姓名的构造函数。
(2) 有Employee类派生Salesman类。Salesman类包含两个新数据成员commrate和sales,还包括了用于输入销售额并计算销售员工工资的成员函数pay()和用于输出打印的print()。
(3) 由Salesman派生Salemanager,Salesmmanage类包含新数据成员monthlypay,以及用于输入销售额并计算销售经理工资的成员函数pay()和用于输出的print()。
(4) 编写main()函数中测试所设计的类结构。
解:
(1)class Employee
{
public:
Employee(long num,char *n)
{
number=num;
strcpy(name,n);
}
protected:
long number;
char name[20];
double salary;
};
(2)class Salesman:public Employee
{
public:
Salesman(long num,char *n,float c=0.005):Employee(num,n)
{ commrate=c;}
void pay()
{
cout<<"ÇëÊäÈë"<<name<<"±¾ÔÂÍê³ÉµÄÏúÊÛ¶î:";
cin>>sales;
salary=commrate*sales;
}
void print(){
cout<<name<<"µÄ¹¤×ÊΪ£º"<<salary<<endl;
}
protected:
float commrate;
double sales;
};
(3)
class Salesmanager:public Salesman
{
public:
Salesmanager(long num,char *n,float c=0.002,double m=4000):Salesman(num,n,c){
monthlypay=m;}
void pay(){
cout<<"ÇëÊäÈë"<<name<<"±¾ÔÂÍê³ÉµÄÏúÊ۶";
cin>>sales;
salary=monthlypay+commrate*sales;
}
void print(){
cout<<name<<"µÄ¹¤×ÊΪ£º"<<salary<<endl;
}
private:
double monthlypay;
};
(4) int main()
{
Salesman s1(1234,"ÀîÈð");
Salesmanager s2(1357,"ÎÄÇ¿");
s1.pay();
s1.print();
s2.pay();
s2.print();
return 0;
}
第十章
1.定义一个辅助类Complex,重载运算符+、-、*、/使之能用于复数的加减乘除运算。运算符重载函数为Complex类的成员函数。编写程序,分别求出两个复数之和、差、积、商。
解:
#include <iostream>
using namespace std;
class Complex
{
public:
Complex(double r=0.0,double i=0.0) {real=r;imag=i;}
Complex operator + (Complex);
friend Complex operator - (Complex,Complex);
Complex operator * (Complex);
friend Complex operator / (Complex,Complex);
void display();
private:
double real,imag;
};
Complex Complex::operator + (Complex c)
{
return Complex(real+c.real,imag+c.imag);
}
Complex operator - (Complex c1,Complex c2)
{
return Complex(c1.real-c2.real,c1.imag-c2.imag);
}
Complex Complex::operator * (Complex c)
{
return Complex(real*c.real-imag+c.imag,imag*c.imag+real*c.real);
}
Complex operator / (Complex c1,Complex c2)
{
double r,i;
r=(c1.real*c2.real+c1.imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag);
i=(c1.imag*c2.real-c1.real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag);
return(r,i);
}
void Complex::display()
{
cout<<"("<<real<<","<<imag<<")"<<endl;
}
int main()
{
Complex c1(7.1,8.4),c2(1.4,5),c3;
cout<<"c1="; c1.display();
cout<<"c2="; c2.display();
c3=c1+c2;
cout<<"c1+c2=";c3.display();
c3=c1-c2;
cout<<"c1-c2=";c3.display();
c3=c1*c2;
cout<<"c1*c2=";c3.display();
c3=c1/c2;
cout<<"c1/c2=";c3.display();
return 0;
}
2.定义一个日期类Date,包括年,月,日等私有数据成员。要求为所定义的Date类设计如下重载运算符函数:
Date operator+(int days); 返回一日起加天数days后得到的日期
Date operator-(int days); 返回一日起减天数days后得到的日期
Int operator-(Date &b); 返回两日期相差的天数
解:
#include <iostream>
using namespace std;
int day_tab[12]={31,28,31,30,31,30,31,31,30,31,30,31};
class Date
{
public:
Date() {}
Date(int y,int m,int d) {year=y;mon=m;day=d;}
void setday(int d) {day=d;}
void setmon(int m) {mon=m;}
void setyear(int y) {year=y;}
int getday() {return day;}
int getmon() {return mon;}
int getyear() {return year;}
Date operator + (int days)
{
static Date date;
int number=dton(*this);
number-=days;
date=ntod(number);
return date;
}
Date operator - (int days)
{
static Date date;
int number=dton(*this);
number-=days;
date=ntod(number);
return date;
}
int operator - (Date &b)
{
int days=dton(*this)-dton(b)-1;
return days;
}
void disp()
{cout<<year<<"."<<mon<<"."<<day<<endl;
}
private:
int year,mon,day;
int leap(int);
int dton(Date &);
Date ntod(int);
};
int Date::leap(int year)
{
if(year%4==0&&year&100!=0||year%400==0)
return 1;
else return 0;
}
int Date::dton(Date &d)
{
int y,m,days=0;
for(y=1;y<=d.year;y++)
if(leap(y))
days+=366;
else
days+=365;
day_tab[1]=leap(d.year)?29:28;
for(m=0;m<d.mon-1;m++)
days+=day_tab[m];
days+=d.day;
return days;
}
Date Date::ntod(int n)
{
int y=1,m=1,d,rest=n,days_year;
while(1)
{
days_year=leap(y)?366:365;
if(rest<days_year)
break;
else
rest-=days_year;
y++;
}
y--;
day_tab[1]=leap(y)?29:28;
while(1)
{
if(rest>day_tab[m-1])
rest-=day_tab[m-1];
else
break;
m++;
}
d=rest;
return Date(y,m,d);
}
int main()
{
Date now(2011,12,22),Nationday(1949,10,1);
cout<<"now:";now.disp();
cout<<"Nationday:";Nationday.disp();
cout<<"Ïà²îÌìÊý:"<<(now-Nationday)<<endl;
Date d1=now+365,d2=now-365;
cout<<"now+365:";d1.disp();
cout<<"now-365:";d2.disp();
return 0;
}
3.编写一个程序尖酸正方体圆柱体的表面积和体积。要求抽象出一个公共的基类Body,吧他当做抽象类,在该类中定义表面积和体积的纯虚函数。抽象类中定义一个数据成员data,他可以作为求的半径,正方形的边长,或者圆柱体的地面半径。在三个类中都有计算白面积和体积的函数的具体实现。
解:
#include <iostream>
using namespace std;
class Body
{
protected:
double data;
public:
Body(double data)
{
Body::data=data;
}
virtual double s()=0;
virtual double v()=0;
};
class Cube:public Body
{
public:
Cube(double data):Body(data){};
double s()
{return data*data*6;
}
double v()
{return data*data*data;
}
};
class Sphere:public Body
{
public:
Sphere(double r):Body(r){};
double s()
{
return data*data*3.1416*4;
}
double v()
{
return 4*data*data*data/3;
}
};
class Cylinder:public Body
{
double height;
public:
Cylinder(double r,double height): Body(r){Cylinder::height=height;}
double s()
{
return (2*3.1416*data*data+2*data*3.1416*height);
}
double v()
{
return data*data*3.1416*height;
}
};
int main()
{
Body *p;
Cube obj1(5);
Sphere obj2(5);
Cylinder obj3(5,5);
p=&obj1;
cout<<"正方体的表面积:"<<p->s()<<endl;
cout<<"正方体的体积:"<<p->v()<<endl;
p=&obj2;
cout<<"球的表面积:"<<p->s()<<endl;
cout<<"球的体积:"<<p->v()<<endl;
p=&obj3;
cout<<"球的表面积:"<<p->s()<<endl;
cout<<"球的体积:"<<p->v()<<endl;
return 0;
}
第十一章
1. 已知
Void Sort(int a[],int size);
Void Sort(double a[],int size);
是一个函数模板的两个例子,起功能是将数组a中得前size个元素按从小到大的顺序依次排列。是设计函数模板。
解:#include <iostream>
using namespace std;
template<class T>
void Sort(T set[],int n)
{
int i,j;
T temp;
for (i=1;i<n;i++)
for(j=n-1;j>i;j--)
if(set[j-1]>set[j])
{
temp=set[j-1];
set[j-1]=set[j];
set[j]=temp;
}
}
int main()
{
int a[]={4,5,8,9,3};
double b[]={3,5,6.7,2,5.2,9.2,10.3};
Sort(a,6);
Sort(b,6);
for(int i=0;i<6;i++)
cout<<a[i]<<" ";
cout<<endl;
for(i=0;i<6;i++)
cout<<b[i]<<" ";
cout<<endl;
return 0;
}
2. 设有如下声明
class Test
{public:
Void SetData1(int val) {data1=val;}
Void SetData2(doule val) {data2=val;}
int GetData1(){ return data1;}
double GetData2() {return data2;}
private:
int data1;
double data2;
}
试将此类声明为类模板的声明,使得数据成员data1和data2可以使任何类型
#include <iostream>
#include <string>
using namespace std;
template <class T1,class T2>
class Test
{
public:
void SetData1(T1 val) {data1=val;}
void SetData2(T2 val) {data2=val;}
T1 GetData1() { return data1;}
T2 GetData2() {return data2;}
private:
int data1;
double data2;
};
int main()
{
Test<int,double> t1;
t1.SetData1(10);
t1.SetData2(5.4);
cout<<t1.GetData1()<<" "<<t1.GetData2()<<endl;
Test<char ,string> t2;
t2.SetData1('a');
t2.SetData2("China");
cout<<t2.GetData1()<<" "<<t2.GetData2()<<endl;
return 0;
}
3栈是一种重要的数据结构,它是一种只允许在彪的一端进行插入或删除操作的线性表。表中允许进行插入、删除操作的一端称为栈顶。表的令一端称为栈底。下面是一个整形栈类的定义:
Const int MaxSize=100;
Class Istack
{
Public:
Istack();
void Push(int &n);
void pop();
int GetTop();
bool Empty();
int size();
boid ClearStack();
~Istack();
Private:
Int elem[MaxSize];
Int top;
}
编写一个栈的类模板,以便为任何类型的对象提供栈结构的数据操作。
解:
#include <iostream>
#include <string>
using namespace std;
const int
展开阅读全文