《c++》编程题试卷
第三章
#include < iostream.h >
#include < math.h >
void equation_1 (int a, int b, int c)
{
double x1, x2, temp;
temp = b*b - 4 * a * c;
x1 = (-b + sqrt(temp) ) / (2 * a * 1.0);
x2 = (-b - sqrt(temp) ) / (2 * a * 1.0);
cout<<"两个不相等的实根"<< endl;
cout<<"x1 = "<< x1<<", x2 = "<< x2<< endl;
}
void equation_2 (int a, int b, int c)
{
double x1, x2, temp;
temp = b*b - 4 * a * c;
x1 = (-b + sqrt(temp) ) / (2 * a * 1.0);
x2 = x1;
cout<<"两个相等的实根"<< endl;
cout<<"x1 = "<< x1<<", x2 = "<< x2<< endl;
}
void equation_3 (int a, int b, int c)
{
double temp, real1, real2, image1, image2;
temp = - (b*b - 4 * a * c);
real1 = -b / (2 * a *1.0);
real2 = real1;
image1 = sqrt(temp);
image2 = - image1;
cout<<"两个虚根"<< endl;
cout<<"x1 = "<< real1<<" + "<< image1<<"j"<< endl;
cout<<"x2 = "<< real2<<" + "<< image2<<"j"<< endl;
}
void main()
{
int a, b, c;
double temp;
cout<<"输入a,b,c的值"<< endl;
cin>>a>>b>>c;
cout<<"方程为:"<< a<<"x*x+"<< b<<"x+"<< c<<" = 0"<< endl;
temp = b*b - 4 * a * c;
if(temp > 0)
equation_1 (a, b, c);
if(temp == 0)
equation_2 (a, b, c);
if(temp < 0)
equation_3 (a, b, c);
}
#include < iostream >
using namespace std;
char up (char c)
{
if(c >= 97 && c <= 122)
return (c - 32) ;
else
return c;
}
void main()
{
int i;
char c[15] = {'A','v','e','t','E','T','%','&','4','Y','e','i','@','9','^'};
for(i = 0 ; i < 15 ; i++)
cout<< up(c[i])<<", ";
cout<< endl;
}
#include < iostream.h >
#include < math.h >
double power(double a, int b)
{
int i;
double result = 1.0;
for(i=0;i< b;i++)
result = result * a;
return result;
}
void main()
{
double r;
int n;
cout<<"r = ";
cin>>r;
cout<<"n = ";
cin>>n;
cout<< r<<"的"<< n<<"次幂是:"<< power(r,n)<< endl;}
#include < iostream >
using namespace std;
void print_triangle(char c, int n)
{
int i, j;
for(i=0; i< n; i++)
{
for(j=0; j<=i; j++)
{
cout<< c;
}
cout<< endl;
}
}
void main()
{
print_triangle('a',10);
}
#include < iostream >
#include < string >
using namespace std;
int strlen(char *str)
{
int len = 0;
while(str[len] != '\0')
{
len++;
}
return len;
}
void revers(char *b)
{
char c;
int j, len;
len=strlen(b);
j=len/2-1;
while(j>=0)
{
c=*(b+j);
*(b+j)=*(b+len-j-1);
*(b+len-j-1)=c;
j--;
}
b[len]='\0';
}
void main()
{
char str[]={"1234567890"};
cout<< str<<"----的长度:"<< strlen(str)<< endl;
cout<< str<< endl;//倒序前
revers(str);//
cout<< str<< endl;//倒序后
}
#include < iostream >
using namespace std;
template
void sort(T a, T b, T c)
{
T array[3],temp;
int i,j;
array[0] = a;
array[1] = b;
array[2] = c;
for(i=0;i<3;i++)
{
for(j=0;j<2;j++)
if(array[j]>array[j+1])
{
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
cout<< array[0]<< array[1]<< array[2]<< endl;
}
void main()
{
sort(5,1,9);
}
#include < iostream >
using namespace std;
template
T sum (T a[],int n)
{
int i;
T s=0;
for(i=0;i< n;i++)
s = s + a[i];
return s;
}
void main ()
{
int a[5]={1,2,3,4,5};
int s = sum(a,5);
cout<< s<< endl;
}
#include < iostream >
using namespace std;
template
T sum (T a[], int n)
{
int i;
T s=0;
for(i=0;i< n;i++)
s = s + a[i];
return s;
}
template //重载上面的模板
T sum (T a[], int n, T b[], int m)
{
return sum(a,n)+sum(b,m);
}
void main ()
{
int a[5]={1,2,3,4,5};
int b[10]={1,2,3,4,5,6,7,8,9,10};
int s1 = sum(a, 5);
int s2 = sum(b, 10);
int s3= sum(a, 5, b, 10);
cout<< s1<< endl;
cout<< s2<< endl;
cout<< s3<< endl;
}
第四章
#include
using namespace std;
class Point //点类
{
private:
int x, y;//私有成员变量,坐标
public :
Point()//无参数的构造方法,对xy初始化
{
x = 0;
y = 0;
}
Point(int a, int b) {
x = a;
y = b;
}
void setXY(int a, int b) {
x = a;
y = b;
}
int getX()//得到x的方法
{
return x;
}
int getY()//得到有的函数
{
return y;
}
};
class Rectangle //矩形类
{
private:
Point point1, point2, point3, point4;
public :
Rectangle();//类Point的无参构造函数已经对每个对象做初始化啦,这里不用对每个点多初始化了
Rectangle(Point one, Point two)
{
point1 = one;
point4 = two;
init();
}
Rectangle(int x1, int y1, int x2, int y2)
{
point1.setXY(x1, y1);
point4.setXY(x2, y2);
init();
}
void init()//给另外两个点做初始化的函数
{
point2.setXY(point4.getX(), point1.getY() );
point3.setXY(point1.getX(), point4.getY() );
}
void printPoint()//打印四个点的函数
{
cout<<"A:("<< point1.getX() <<","<< point1.getY() <<")"<< endl;
cout<<"B:("<< point2.getX() <<","<< point2.getY() <<")"<< endl;
cout<<"C:("<< point3.getX() <<","<< point3.getY() <<")"<< endl;
cout<<"D:("<< point4.getX() <<","<< point4.getY() <<")"<< endl;
}
int getArea()//计算面积的函数
{
int height, width, area;
height = point1.getY() - point3.getY();
width = point1.getX() - point2.getX();
area = height * width;
if(area > 0)
return area;
else
return -area;
}
};
void main()
{
Point p1(-15, 56), p2(89, -10);//定义两个点
Rectangle r1(p1, p2);//用两个点做参数,声明一个矩形对象r1
Rectangle r2(1, 5, 5, 1);//用两队左边,声明一个矩形对象r2
cout<<"矩形r1的4个定点坐标:"<< endl;
r1.printPoint();
cout<<"矩形r1的面积:"<< r1.getArea() << endl;
cout<<"\n矩形r2的4个定点坐标:"<< endl;
r2.printPoint();
cout<<"矩形r2的面积:"<< r2.getArea() << endl;
}
#include < iostream.h >
#include < math.h >
class Line
{
private:
int x1, y1, x2, y2;
public :
Line();
Line(int =0, int =0, int =0, int=0 );
void printPoint();
double getLength();
};
inline Line::Line(int a, int b, int c, int d)
{
x1 = a;
y1 = b;
x2 = c;
y2 = d;
}
inline void Line::printPoint()
{
cout<<"A:"<< x1 <<", "<< y1 << endl;
cout<<"B:"<< x2 <<", "<< y2 << endl;
}
inline double Line::getLength()
{
double length;
length = sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1) );
return length;
}
void main()
{
Line line(10,80,-10,12);
line.printPoint();
cout<< line.getLength() << endl;
}
第五章
#include < iostream >
using namespace std;
class Complex
{
private:
double real, image;
public :
Complex(){}
Complex(double a,double b)
{
real = a;
image = b;
}
void setRI(double a, double b)
{
real = a;
image = b;
}
double getReal()
{ return real;
}
double getImage()
{ return image;
}
void print(){
if(image>0)
cout<<"复数:"<< real <<" + "<< image <<"i"<< endl;
if(image<0)
cout<<"复数:"<< real <<" - "<< image <<"i"<< endl;
}
friend Complex add(Complex ,Complex);//声明友元函数
};
Complex add(Complex c1, Complex c2)//定义友元函数
{
Complex c3;
c3.real = c1.real + c2.real;//访问Complex类中的私有成员
c3.image = c1.image + c2.image;
return c3;
}
void main()
{
Complex c1(19, 0.864), c2, c3;
c2.setRI(90,125.012);
c3 = add(c1, c2);
cout<<"复数一:";c1.print();
cout<<"复数二:";c2.print();
cout<<"相加后:";c3.print();
}
#include < iostream >
using namespace std;
void main()
{
int i, n, temp=0;
cout<<"输入数组大小:";
cin>>n;
double *array = new double[n]; //用指针,动态申请数组大小
cout<<"给每个数组元素赋值:"<< endl;
for(i=0; i < n; i++)
{
cout<<"array["<< i <<"] = ";
cin>>temp;
*(array+i) = temp;//给数组元素赋值
}
cout<<"动态数组个元素的值如下:"<< endl;
for(i=0; i < n; i++)
{
cout<<"array["<< i <<"] = "<< array[i] << endl;//打印数组元素
}
delete [] array;//释放内存
}
#include < iostream >
using namespace std;
class Dog
{
private:
static int dogs;//静态数据成员,记录Dog的个体数目
public :
Dog(){}
void setDogs(int a)
{dogs = a;
}
static int getDogs(){
return dogs;
}
};
int Dog :: dogs = 25;//初始化静态数据成员
void main()
{
cout<<"未定义Dog类对象之前:x = "<< Dog::getDogs() << endl;; //x在产生对象之前即存在,输出25
Dog a, b;
cout<<"a中x:"<< a.getDogs() << endl;
cout<<"b中x:"<< b.getDogs() << endl;
a.setDogs(360);
cout<<"给对象a中的x设置值后:"<< endl;
cout<<"a中x:"<< a.getDogs() << endl;
cout<<"b中x:"<< b.getDogs() << endl;
}
第六章
#include < iostream >
using namespace std;
class Basic//基类
{
protected:
double r;
public :
Basic(){ r = 0; }
Basic(double a):r(a){}
};
class Circular : public Basic//从基类派生圆类
{
protected:
double area;
public :
Circular(double a)
{
r = a;
area = area = 3.1415926 * r * r;
}
double getArea()//返回圆面积
{
return area;
}
};
class Column : public Circular//从圆类派生圆柱类
{
protected:
double h;
double cubage;
public :
Column(double a, double b) : Circular(a){
h = b;
cubage = getArea() * h;
}
double getCubage()//返回圆柱体积函数{
return cubage;
}
};
void main()
{
Circular circular(45);
Column column(12, 10);
cout<<"圆的面积:"<< circular.getArea() << endl;
cout<<"圆柱的体积:"<< column.getCubage() << endl;
}
#include < iostream >
#include < cmath >
using namespace std;
class Point//点类
{
protected:
double x, y;
public :
Point(){}
Point(double a, double b)
{
x = a; y = b;
}
double getX()
{return x;}
double getY()
{return y;}
};
class Line
{
protected:
Point p1, p2;//Point对象做成员
double length, angle;
public:
Line(double a, double b, double c, double d):p1(a, b), p2(c, d)//用两对坐标初始化线段
{
init();
}
Line(Point a, Point b)//用两个点的对象初始化线段
{
p1 = a; p2 = b;
init();
}
void init()//计算线段长度,以及和x轴的夹角的度数
{
double x1 = p1.getX(), y1 = p1.getY();
double x2 = p2.getX(), y2 = p2.getY();
length = sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2));
angle = atan( (y2-y1) / (x2-x1) );
angle = angle *180/3.141592653;
}
void printXY()
{
cout<<"("<< p1.getX() <<","<< p1.getY() <<"); ("<< p2.getX() <<","<< p2.getY() <<")"<< endl;
}
void printLength()
{
cout<<"线段长度:"<< length << endl;
}
void printAngle()
{
cout<<"与x轴的夹角:"<< angle <<"°"<< endl;
}
};
class Rectangle : public Line
{
protected:
Line *line;
public:
Rectangle(double a, double b, double c, double d, double e, double f, double g, double h):Line(a,b,c,d)
{
line = new Line(e,f,g,h);
}
Rectangle(Point a, Point b, Point c, Point d) : Line(a, b)//4个点对象,初始化
{
line = new Line(c, d);
}
void printPoint()
{ cout<<"矩形4个顶点:\n";
printXY();
line->printXY();
}
};
void main()
{
Point p1(0, 0), p2(4, 3), p3(12, 89), p4(10, -50);
Line l1(0,0,4,3);
l1.printXY();
l1.printLength();
l1.printAngle();
Line l2(p1, p2);
l2.printXY();
l2.printLength();
l2.printAngle();
Rectangle r1(12,45,89,10,10,23,56,1);
r1.printPoint();
Rectangle r2(p1, p2, p3, p4);
r2.printPoint();
}
#include < iostream >
#include < cmath >
using namespace std;
class Point//点类
{
protected: int x, y;
public : Point(){}
};
class Circular : public Point//圆类,继承点类
{
protected:
double r, area;
public :
Circular(int a, int b)
{
x = a;
y = b;
r = sqrt( x * x + y * y );
area = 3.1415926 * r * r;
}
void printPoint()
{
cout<<"圆形直角坐标:("<< x <<", "<< y <<")"<< endl;
}
void printRadius()
{ cout<<"圆的半径:"<< r << endl;
}
void printArea(){
cout<<"圆的面积:"<< area << endl;
}
};
void main()
{
Circular c(10,25);
c.printPoint();
c.printRadius();
c.printArea();
}
#include < iostream >
#include < cmath >
using namespace std;
class Line//线段基类
{
protected:
double sizeA;
public :
Line()
{
cout<<"输入线段的长度:"<< endl;
cin>>sizeA;
}
Line(double a)
{
sizeA = a;
}
double getLength()
{
return sizeA;
}
};
class Triangle : public Line//三角形类
{
protected: double sizeB, sizeC;
public : Triangle()
{
cout<<"输入线段长度:"<< endl;
cin>>sizeB;
sizeC = sqrt( sizeB * sizeB + sizeA * sizeA );
}
void printSize()
{ cout<<"直角三角形,三条边分别为:";
cout<<"A: "<< sizeA << ", b: "<< sizeB << ", C: "<< sizeC << endl;
}
};
class Rectangle : public Triangle//矩形类
{
protected:
double sizeD;
public :
Rectangle()
{
sizeC = sizeA;
sizeD = sizeB;
}
void printSize()
{
cout<<"矩形,四条边分别为:";
cout<<"A: "<< sizeA << ", b: "<< sizeB << ", C: "<< sizeC << ", D: "<< sizeD << endl;
}
};
void main()
{
/* Line *l = new Line();
cout<<"线段长度为:"<< l->getLength() << endl;
*/
/*Triangle *t = new Triangle();
t->printSize();*/
Rectangle *r = new Rectangle();
r->printSize();
}
第七章
#include < iostream>
using namespace std;
template
class Point
{
protected:
T x, y;
public :
Point(T a, T b)
{
x = a;
y = b;
}
void show()
{
cout<<"x = "<< x <<", y = "<< y << endl;
}
};
template
class Rectangle : public Point
{
private:
T h, w;
public :
Rectangle(T a, T b, T c, T d) : Point(a, b)
{h = c;
w = d;
}
void show(){
cout<<"x = "<< x <<", y = "<< y <<"; h = "<< h <<", w = "<< w << endl;
}
};
void main()
{
Point a(3, 4);
Rectangle b(5.1, 6.2, 7.3, 8.4);
a.show();
b.show();
Point & ra = b;//子类对象 初始化父类的引用
ra.show();
Point * p = &b;//子类对象的地址,赋给指向父类的指针
p->show();
Rectangle * pb = &b;//子类指针pb
pb->show();
a = b; //派生类对象的属性值,更新父类对象的属性值
a.show();
}
#include < iostream>
using namespace std;
template class Point
{
public :
T x, y;
Point(T a=0, T b=0)
{
x = a;
y = b;
}
void show()
{
cout<<"x = "<< x <<", y = "<< y << endl;
}
};
template class Line_1 : public Point // 继承Point类模板, 的线段类模板
{
protected:
T x1, y1;
public :
Line_1(T a, T b, T c, T d) : Point(a, b)
{
x1 = c;
y1 = d;
}
Line_1(const Line_1 & );//复制构造函数
void show()
{
cout<<"("<< x <<", "<< y <<"); ("<< x1 <<", "<< y1 <<")"<< endl;
}
};
template Line_1 :: Line_1(const Line_1 & t) : Point(t.x, t.y)
{
x1 = t.x1;
y1 = t.y1;
}
template class Line_2 //包含point类模板,的线段类
{
protected:
Point p1, p2;
public :
Line_2(T a, T b, T c, T d)
{
p1.x = a;
p1.y = b;
p2.x = c;
p2.y = d;
}
Line_2(const Line_2 &);//复制构造函数
void show()
{
cout<<"("<< p1.x <<", "<< p1.y <<"); ("<< p2.x <<", "<< p2.y <<")"<< endl;
}
};
template Line_2 :: Line_2(const Line_2 & t)
{
p1 = t.p1;
p2 = t.p2;
}
void main()
{
Line_1 L1(1,2,3,4);
cout<<"L1 : ";L1.show();
Line_1 L2(L1); //用现有的对象,初始化新对象
cout<<"L2 : ";L2.show();
Line_2 J1(5,6,7,8);
cout<<"J1 : ";J1.show();
Line_2 J2(J1);
cout<<"J2 : ";J2.show();
}
#include < iostream >
#include < vector >
#include < algorithm >
using namespace std;
void main()
{
int a[] = {1,3,5,7,9,2,4,6,8,10};
sort(a, a+10);//先对数组进行升序排序
copy(a, a+10, ostream_iterator(cout," "));
cout<< endl;
vector pa(a, a+10); //再声明向量
pa.push_back(11);//向量尾部追加11
reverse_copy(pa.begin(), pa.end(), ostream_iterator(cout," "));//按降序输出向量的内容
cout<<"\ncapacity : "<< pa.capacity() << endl;//输出capacity()的内容
}
第九章
#include < iostream >
#include < string >
using namespace std;
class Student
{
private :
string name;
float score;
public :
Student(){}
Student(string n, float s)
{
name = n;
score = s;
}
string getName()
{
return name;
}
float getScore()
{
return score;
}
};
void main()
{
Student s1("liming", 98);
Student s2("sdfh", 90);
Student s3("vn.fy", 80);
Student s4("cnbtrt", 70);
Student s5("ryuety", 48);
cout.width(15); cout<< left <<"姓名"<< right <<"分数"<< endl;
cout.width(15); cout<< left << s1.getName() << right << s1.getScore() << endl;
cout.width(15); cout<< left << s2.getName() << right << s2.getScore() << endl;
cout.width(15); cout<< left << s3.getName() << right << s3.getScore() << endl;
cout.width(15); cout<< left << s4.getName() << right << s4.getScore() << endl;
cout.width(15); cout<< left << s5.getName() << right << s5.getScore() << endl;
}
#include < iostream>
#include < fstream >
using namespace std;
void main()
{
char *p = {"C++程序设计"};
ofstream myFile("Worl9_5_2.txt");
myFile<< p;
}
#include < iostream >
#include < fstream >
#include < cmath >
#include < vector >
#include < iomanip >
#include < string >
using namespace std;
class Triangle
{
double sizeA, sizeB, sizeC, area;
public:
Triangle(){}
void setArea()
{
double p = (sizeA + sizeB + sizeC) *0.5;
area = sqrt( p * (p - sizeA) * (p - sizeB) * (p - sizeC) );
}
void setSizeA(double a)
{
sizeA = a;
}
void setSizeB(double b)
{
sizeB = b;
}
void setSizeC(double c)
{
sizeC = c;
}
void set(vector &);
};
//***************************************
//* 成员函数:set
//* 参 数 :向量对象的引用
//* 返回值 :无
//* 功能 :为向量赋值并将向量存入文件
//***************************************
void Triangle :: set(vector & v )
{
Triangle t;
double a, b, c;
while(1)
{
cout<<"三角形,边A:";
cin>>a;
if(a == -1)//结束符为-1
{
ofstream writeFile;
char fileName[20];
cout<<"输入要保存到的文件名:";
cin>>fileName;
cout<<"保存到文件:"<< fileName << endl;
writeFile.open(fileName);
if(writeFile.fail())
{
cout<<"没有正确建立文件!"<< endl;
return;
}
for(int i=0; i< v.size(); i++)
writeFile<< v[i].sizeA <<" "<< v[i].sizeB <<" "<< v[i].sizeC <<" "<< v[i].area << endl;
writeFile.close();
cout<<"一共写入"<< v.size() <<"个三角形信息"<< endl;
return;
}
cout<<"三角形,边B:";
cin>> b;
cout<<"三角形,边C:";
cin>> c;
if( a>0 && b>0 && c>0 && a+b>c && a+c>b && b+c>a )
{
t.setSizeA(a);
t.setSizeB(b);
t.setSizeC(c);
t.setArea();
v.push_back(t);
}
else
cout<<"不能组成三角形,重新输入"<< endl;
}
}
void main()
{
vector tri;
Triangle triangle;
triangle.set(tri);
}
#include < iostream >
#include < fstream >
#include < cmath >
#include < vector>
#include < iomanip >
#include < string >
using namespace std;
class Triangle
{
double sizeA, sizeB, sizeC, area;
public:
Triangle(){}
void setArea()
{
double p = (sizeA + sizeB + sizeC) *0.5;
area = sqrt( p * (p - sizeA) * (p - sizeB) * (p - sizeC) );
}
void setSizeA(double a)
{
sizeA = a;
}
void setSizeB(double b)
{
sizeB = b;
}
void setSizeC(double c)
{
sizeC = c;
}
void set(vector &);
};
//***************************************
//* 成员函数:set
//* 参 数 :向量对象的引用
//* 返回值 :无
//* 功能 :为向量赋值并将向量存入文件
//***************************************
void Triangle :: set(vector & v )
{
Triangle t;
double a, b, c;
while(1)
{
cout<<"三角形,边A:";
cin>>a;
if(a == -1)//结束符为-1
{
ofstream writeFile;
char fileName[20];
cout<<"输入要保存到的文件名:";
cin>> fileName;
cout<<"保存到文件:"<< fileName << endl;
writeFile.open(fileName);
if(writeFile.fail())
{
cout<<"没有正确建立文件!"<< endl;
return;
}
for(int i=0; i< v.size(); i++)
writeFile<< v[i].sizeA <<" "<< v[i].sizeB <<" "<< v[i].sizeC <<" "<< v[i].area << endl;
writeFile.close();
cout<<"一共写入"<< v.size()<<"个三角形信息"<< endl;
return;
}
cout<<"三角形,边B:";
cin>>b;
cout<<"三角形,边C:";
cin>>c;
if( a>0 && b>0 && c>0 && a+b>c && a+c>b && b+c>a )
{
t.setSizeA(a);
t.setSizeB(b);
t.setSizeC(c);
t.setArea();
v.push_back(t);
}
else
cout<<"不能组成三角形,重新输入"<< endl;
}
}
void main()
{
vector tri;
Triangle triangle;
triangle.set(tri);
}
#include
#include
using namespace std;
void main()
{
ifstream txt1("TEST.txt");
ofstream txt2("TEST1.txt");
char c;
if(!txt1)
{
cout<<"文件打不开!"<< endl;
return;
}
if(!txt2)
{
cout<<"没有正确建立文件!"<< endl;
return;
}
while(1)
{
txt1>>c;
if(txt1.eof())
{
txt1.close;
return;
}
cout<< c;//打印字符
txt2<< c;//写文件TEST1.txt中
}
}
//需要关掉卡巴斯基
#include < iostream >
#include < fstream >
using namespace std;
void main()
{
char a[100];
ofstream writeFile("text.txt");
int i;
while(1)
{
cin>>a;
if(a[0] == '$')
return;
i = 0;
while(a[i] != '\0')
{
if( a[i]>=65 && a[i]<=90 )
a[i]=a[i] + 32;
i++;
}
writeFile<< a<<" ";
}
}
计算机等级考试二级C++模拟题及解析1上机部分
一、改错题
使用VC6打开考生文件夹下的工程kt6_1,此工程包含一个源程序文件kt6_1.cpp,但该程序运行有问题,请改正程序中的错误,使程序的输出结果如下:
Constructor2
Constructor1
i=0
i=10
Destructor
源程序文件kt6_1.cpp清单如下:
#include
classCSample
{
inti;
public:
CSample(){cout<<"Constructor1"<
CSample(intval){cout<<"Constructor2"<
~CSample(){cout<<"Destructor"<
voiddisp();
};
/**********found**********/
voiddisp()
{cout<<"i="<
voidmain()
{
CSample*a,b(10);
/**********found**********/
a->disp();
/**********found**********/
b->disp();
}
【参考答案】
(1)将void disp()
改为:void CSample::disp()
(2)将a->disp();
改为:a=new CSample; a->disp();
(3)将b->disp();
改为:b.disp();
【试题解析】
(1)主要考查类成员函数定义格式的熟练掌握,对于类体外函数的实现,应该使用作用域符"::",按照返回值类型 类名::函数名(参数列表)的形式进行说明;
(2)主要考查对动态存储分配的掌握,根据前面的定义,a是一个指针类型的变量,指向一个对象,但是并没有被初始化,此时a中的数据无任何意义,应该使用动态存储分配new生成一个新的对象,并将返回的指针赋值给a;
(3)主要考查对象指针与对象在调用成员函数时格式的不同,b是一个对象变量,使用b调用成员函数应该用"."运算符。
二、简单应用题
编写函数fun(),它的功能是利用以下所示的简单迭代方法求方程cos(x)-x=0的一个实根。
xn+1=cos(xn)
迭代步骤如下:
(1)取x1初值为0.0。
(2)x0=x1,把x1的值赋给x0。
(3)x1=cos(x0),求出一个新的x1。
(4)若x0-x1的绝对值小于0.000001,则执行步骤(5),否则执行步骤(2)。
(5)所求x1就是方程cos(x)-x=0的一个实根,做为函数值返回。
程序输出结果Root=0.739085。
注意:部分源程序已存在文件kt6_2.cpp中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
文件kt6_2的内容如下:
#include
#include
#include
floatfun()
{
}
voidmain()
{cout<<"Root="<
【参考答案】
float fun()
{
float x1=0.0,x0;
do
{ x0=x1;
x1=cos(x0);}
while(fabs(x0-x1)>=1e-6);
return x1;
}
【试题解析】
解答本题的关键之处在于看清题中所给的“迭代步骤”,同时要理解xn+1=cosxn通式的含义,要考虑到x1的初值为0.0。
三、综合应用题
使用VC6打开考生文件夹下的工程kt6_3,此工程包含一个源程序文件kt6_3.cpp,其中定义了用于表示考生的类Student,请按要求完成下列操作,将程序补充完整。
(1)定义私有数据成员code、english分别用于表示考生的编号、英语成绩、它们都是int型的数据。请在注释“//**1**”之后添加适当的语句。
(2)完成成员函数voidStudent::inputinformation()的定义,该函数用于用户输入一个考生对象的信息,输入格式如下所示:
输入编号:
英语成绩:
计算机成绩:
请在注释“//**2**”之后添加适当的语句。
(3)利用已实现的类Student的成员函数,完成函数voidfirstname(Student*A[],intnum)的定义,该函数根据考生信息A[],输出num个考生中总分最高者的编号及其相应的总分,在此不考虑总分相同的情况。请在注释“//**3**”之后添加适当的语句。
注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。
源程序文件kt6_3.cpp清单如下:
#include
classStudent
{//**1**
intcomputer;
inttotal;
public:
voidgetinformation();
voidcomputesum();
intgetcode();
intgettotalscore();
~Student();};
voidStudent::getinformation()
{//**2**
cout<<"英语成绩:";
cin>>english;
cout<<"计算机成绩:";
cin>>computer;}
voidStudent::computesum()
{total=english+computer;
cout<<"编号"<
intStudent::getcode()
{returncode;}
intStudent::gettotalscore()
{returntotal;}
voidfirstname(Student*A[],intnum)
{
//**3**
tempsum=(*A[0]).gettotalscore();
for(inti=1;i
{
if(((*A[i]).gettotalscore())>tempsum)
{tempcode=(*A[i]).getcode();
tempsum=(*A[i]).gettotalscore();}
}
cout<<"总分最高者--"<
}
voidmain()
{Student*A[3];
inti,n=3;
for(i=0;i
{A[i]=newStudent;
A[i]->getinformation();}
for(i=0;i
{A[i]->computesum();}
firstname(A,3);}
【参考答案】
(1)int code;
int english;
(2)cout<<"输入编号:";
cin>>code;
(3)int tempcode,tempsum;
tempcode=(*A[0]).getcode();
【试题解析】
本题是对C++程序设计的综合考查,其设计类的成员及成员函数的定义与调用,数据的输入输出,for循环语句,if条件判断语句等多个知识点,其中(3)中为指针数组的使用,指针数组是一组指针,每一个成员都按照指针的操作规则,但是整个访问规则仍然使用数组下标方式,如A[0]指的是第一个指针,而* A[0]是取出第一个指针指向的内容。
计算机等级考试二级C++模拟题及解析2上机部分
一、改错题
使用VC6打开考生文件夹下的工程kt7_1,此工程包含一个源程序文件kt7_1.cpp,但该程序运行有问题,请改正程序中的错误,使程序的输出结果如下:
Constructor1
Constructor1
Constructor1
Destructor
Constructor2
Destructor
x=0
x=5
Destructor
Destructor
源程序文件kt21_1.cpp清单如下:
#include
classB
{intx;
public:
B(){x=0;cout<<"Constructor1"<
B(inti){x=i;cout<<"Constructor2"<
~B(){cout<<"Destructor"<
/**********found**********/
~B(inti){cout<<<"BEDESTRUCTOR"<
voidprint(){cout<<"x="<<
voidmain()
{B*ptr;
ptr=newB[2];
/**********found**********/
ptr[0]=B(0);
ptr[1]=B(5);
/**********found**********/
for(inti=0;i<2;)
ptr[i].print();
delete[]ptr;}
【参考答案】
(1)将~B(int i){cout<<<" pDestructor?<< be>
(2)将ptr[0]=B(0);改为:ptr[0]=B();
(3)将for (int i=0;i<2;)改为:for(int i=0;i<2;i++)
B(inti){x=i;cout<<"Constructor2"<
~B(){cout<<"Destructor"<
/**********found**********/
~B(inti){cout<<<"BEDESTRUCTOR"<
voidprint(){cout<<"x="<<
voidmain()
{B*ptr;
ptr=newB[2];
/**********found**********/
ptr[0]=B(0);
ptr[1]=B(5);
/**********found**********/
for(inti=0;i<2;)
ptr[i].print();
delete[]ptr;}
【参考答案】
(1)将~B(int i){cout<<<" pDestructor?<< be>
(2)将ptr[0]=B(0);改为:ptr[0]=B();
(3)将for (int i=0;i<2;)改为:for(int i=0;i<2;i++)
【试题解析】
本题主要考查对文件相关操作的熟练程度。首先定义文件流类的变量,然后使用该对象的open方法打开一个文件,接着使用while循环和getch方法每次读入一个字符并统计字符个数,最后使用close方法关闭文件,返回i值。
二、简单应用题
编写一个函数intcharnum(charfn[10]),该函数以只读方式打开文件fn,,通过统计,返回文件中字符的个数,请使用while循环实现计数功能。
注意:部分源程序已存在文件kt7_2.cpp中。
请勿修改主函数main和其他函数中的任何内容,仅在函数charnum的花括号中填写若干语句。
文件kt7_2.cpp的内容如下:
#include
#include
#include
intcharnum(charfn[10]);
voidmain()
{intnum;
num=charnum("abc.txt");
cout<<"num="<<
intcharnum(charfn[10])
{
}
【参考答案】
int charnum(char fn[10])
{fstream file;
file.open(fn,ios::in);
if(!file)
{cout<<"abc.txt can'topen"<< p>
abort();}
char ch;
int i=0;
while(!file.eof())
{file.get(ch);
i++;}
file.close();
return i-1;}
【试题解析】
本题主要考查对文件相关操作的熟练程度。首先定义文件流类的变量,然后使用该对象的open方法打开一个文件,接着使用while循环和getch方法每次读入一个字符并统计字符个数,最后使用close方法关闭文件,返回i值。
三、综合应用题
使用VC6打开考生文件夹下的工程kt7_3,此工程包含一个源程序文件kt7_3.cpp,其中含有一个类Circle的定义,但该类的定义并不完整。请按要求完成下列操作,将类Circle的定义补充完整。
(1)为类Circle增加一个构造函数,该函数有一个参数,并在构造时将该参数值赋给成员radius。将该函数实现为一个非内联函数,并且使用参数列表的方式将类成员赋值。请在注释“//**1**”之后添加适当的语句。
(2)为类Circle增加一个成员函数print(),使得可以输出有关圆的信息,比如下列程序
Circlec;
c.SetRadius(5);
c.Print();
将输出:Thecirclehasradiusof5!
请在注释“//**2**”之后添加适当的语句。
(3)完成友元函数voidCompareR(Circle*c1,Circle*c2)的定义,在屏幕中输出c1与c2比较radius大小结果,要求使用if-else结构完成。请在注释“//**3**”之后添加适当的语句。
输出结果如下:
Thecirclehasradusof5!
Thecirclehasradiusof10!
c1< p>
注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。
源程序文件kt7_3.cpp清单如下:
#include
classCircle{
public:
Circle():radius(5){}
//**1**
voidSetRadius(intr){radius=r;}
intGetRadius(){returnradius;}
//**2**
friendvoidCompareR(Circle*c1,Circle*c2);
private:
intradius;};
voidCompareR(Circle*c1,Circle*c2)
{//**3**
cout<<"c1>c2"<
else
if((c1->GetRadius())==(c2->GetRadius()))
cout<<"c1=c2"<< p>
else
if((c1->GetRadius())<(c2->GetRadius()))
cout<<"c1<< p>
voidmain()
{Circlec1;
c1.SetRadius(5);
c1.Print();
Circlec2(10);
c2.Print();
CompareR(&c1,&c2);}
【参考答案】
(1)Circle(int rad):radius(rad){}
(2)void Print(){cout<<"The circlehas radius of "<<<"!\N";}< p>
(3)if((c1->GetRadius())>(c2->GetRadius()))
【试题解析】
本题考查成员函数的定义与实现,友元函数,if分支语句等知识点。友元函数的类体外的定义与一般函数一样,其中if-else的使用,else总是与其最近的那个if配对使用的,书写时最好使用缩进格式,将配对的if-else对齐,以免出错。
计算机等级考试二级C++模拟题及解析3上机部分
一、改错题
使用VC6打开考生文件夹下的工程kt8_1,此工程包含一个源程序文件kt8_1.cpp,但该程序运行有问题,请改正程序中的错误,使程序的输出结果如下:
f1functionofderive
f2functionofbase
f4functionofbase
源程序文件kt8_1.cpp清单如下:
#include
classbase
{ public:
/**********found**********/
voidf1(){cout<<"f1functionofbase"<< p>
virtualvoidf2(){cout<<"f2functionofbase"<
virtualvoidf3(){cout<<"f3functionofbase"<
voidf4(){cout<<"f4functionofbase"<<>
/**********found**********/
classderive::publicbase
{ voidf1(){cout<<"f1functionofderive"<
voidf2(intx){cout<<"f2functionofderive"<
voidf4(){cout<<"f4functionofderive"<<>
voidmain()
{ base*p;
deriveobj2;
/**********found**********/
p=obj2;
p->f1();
p->f2();
p->f4(); }
【参考答案】
(1)将void f1(){cout<<"f1 function of base"<< p>
改为:virtual void f1(){ cout<<"f1 functionof base"<< p>
(2)将classderive::public base
改为:class derive:public base
(3)将p=obj2;
改为:p=&obj2;
【试题解析】
(1)主要考查对虚函数的深刻理解,虚函数是动态联编的基础,也是实现多态性的重要方法,它可以根据不同的情况动态的选择执行哪一个函数。在派生类中实现虚函数应该满足与基类的同名函数完全相同,并且使用关键字virtual修饰,本题中由输出结果中的f1 function of derive可知,必须将基类base的成员函数f1()定义为虚函数;
(2)主要考查对派生类定义格式的掌握,应该使用“:”后面是继承列表,而“::”是作用域符;
(3)主要考查类对象的定义与使用,p是一个指针类型的变量,给它的赋值应该是一个地址,即使用取地址操作符&。
二、简单应用题
已知考生的记录由学号和学习成绩构成,N名考生的数据已存入a结构体数组中。请编写函数fun,该函数的功能是:找出成绩最低的考生记录,通过形参返回主函数(规定只有一个最低分)。已给予出函数的首部,请完成该函数。
注意:部分源程序已存在文件kt8_2.cpp中。
请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入所编写的若干语句。
文件kt8_2.cpp的内容如下:
#include
#include
#include
#defineN10
typedefstructss
{charnum[10];
ints;
}STU;
voidfun(STUa[],STU*s)
{
}
voidmain()
{STU
a[N]={{"A01",81},{"A02",89},{"A03",66},{"A04",87},{"A05",77},{"A06",90},{"A07",79},{"A08",61},{"A09",80},{"A10",71}},m;
fun(a,&m);
cout<<"*****Theoriginaldate*****"<< p>
cout<<"Thelowest:"<<<< p>
【参考答案】
fun(STU a[],STU *s)
{int i, min;
min=a[0].s;
for(i=0;i< p>
if(a[i].s< p>
{min=a[i].s;
*s=a[i];}}
【试题解析】
解题思路为:先假设第一个考生的成绩最优,通过循环找到最低成绩,并将最低成绩的考生记录传给指针s,带回主函数。
三、综合应用题
使用VC6打开考生文件夹下的工程kt8_3,此工程包含一个源程序文件kt8_3.cpp,该文件设计了用于输出乘法九九表的类。请认真阅读已有的代码,按要求完成下列操作,将程序补充完整。
(1)定义类Table的私有数据成员x和y,分别用于表示九九表中的两个乘数(x*y),它们都是int型的数据。请在注释“//**1**”之后添加适当的语句;
(2)完成类Table的成员函数print()的定义,该函数以"x*y=z"的格式打印出九九表中的一个乘法算式,请使用格式化输出函数printf实现,在注释“//**2**”之后添加适当的语句;
(3)完成类Table9的成员函数print()的定义,该函数调用基类Table的print()函数,将九九表输出到屏幕,请在注释“//**3**”之后添加适当的语句;
(4)补充主函数,在屏幕上输出九九表,以便测试所定义的类的正确性。请在注释“//**4**”之后添加适当的语句。
注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。
源程序文件kt8_3.cpp清单如下:
#include
#include
classTable
{//**1**
intz;
public:
voidprint(intx,inty,intz);};
voidTable::print(intx,inty,intz)
{//**2**}
classTable9:publicTable
{public:
voidprint();};
voidTable9::print()
{//**3**
intx,y,z;
for(i=1;i<10;i++)
{for(j=1;j< p>
{x=i;
y=j;
z=i*j;
Table::print(y,x,z);}
printf("\n");}}
main()
{//**4**
return0;}
【参考答案】
(1)int x;
int y;
(2)printf( "%d*%d=%d ",x,y,z);
if(z<10) printf(" ");
(3)int i,j;
(4)Table9 t_9;
t_9.print();
【试题解析】
主要考查将具体问题抽象为类,将类的定义补充完整,并进行类定义测试的能力。
计算机等级考试二级C++模拟题及解析4上机部分
一、改错题
使用VC6打开考生文件夹下的工程kt9_1,此工程包含一个源程序文件kt9_1.cpp,但该程序运行有问题,请改正程序中的错误,使程序的输出结果如下:
4,5
20
源程序文件清单如下:
#include
classA
{ protected:
intn,m;
public:
voidset(inta,intb){m=a;n=b;}
voidshow(){cout< /**********found**********/ } classB:publicA { ints; public: voidset(){s=m*n;} voidshows(){cout< voidmain() { Bb; /**********found**********/ b.set(); b.show(); b.set(); b.show(); } 【参考答案】 (1)在“}”后添加分号 (2)将b.set();改为:b.A::set(4,5); (3)将b.show();改为:b.shows(); 【试题解析】 (1)主要考查对类定义格式的掌握,类的结尾应该使用";"; (2)主要考查对基类与派生类函数调用关系的掌握,根据所要求的输出结果,应该调用的函数为类A的set,而不是类B自身的set函数,应该避免调用的二义性; (3)主要考查对继承与派生的理解,由所要求输出结果可知正确:b.shows()。 二、简单应用题 请编写一个函数intCalcDigital(char*str),该函数可返回字符串str中数字字符(即“0”-“9”这10个数字)的个数,如字符串"olympic2008"中数字字符的个数为4。请用if条件判断语句与for循环语句来实现该函数。 注意:部分源程序已存在文件中。 请勿修改主函数main和其他函数中的任何内容,仅在函数find的花括号中填写若干语句。 文件kt9_2.cpp的内容如下: #include #include intCalcDigital(char*str); voidmain() { char*str; str=newchar[255]; cout<<"输入字符串:"; cin>>str; intnum=CalcDigital(str); cout< intCalcDigital(char*str) { } 【参考答案】 int CalcDigital(char *str) { if(str==NULL) return 0; int num_of_digital=0; int len=strlen(str); if(str[i]<='9' && str[i]>='0') num_of_digital++; returnnum_of_digital; } 【试题解析】 本题考查对于if条件判断语句与for循环语句的熟练使用程度。注意判断条件(判断是否是数字是直接比较ASCII码)的使用。 3.综合应用题 使用VC6打开考生文件夹下的工程kt9_3,此工程包含一个源程序文件kt9_3.cpp,其中定义了Circle类与Money类,Circle类可对半径为r的圆进行周长与面积的计算,而Money类用于计算一圆形游泳池的造价。游泳池四周有原形过道,过道外围上栅栏,过道宽度为3米,根据键入的游泳池半径,每米栅栏价格及每平方米过道价格,即可计算出游泳池的造价。请按要求完成下列操作,将程序补充完整。 (1)定义符号常量PI(值为3.14159f)与WIDTH(值为3.00f),分别用于表示圆周率与过道的固定宽度。请在注释“//**1**”之后添加适当的语句。 (2)定义Circle类默认构造函数,把私有成员radius初始化为参数r的值。请在注释“//**2**”之后添加适当的语句; (3)完成Money类默认构造函数的定义,把私有成员FencePrice(每米栅栏的价格)、ConcretePrice(每平方米过道的价格)初始化为参数f,c的值。请在注释“//**3**”之后添加适当的语句。 (4)完成Money类成员函数floatMoney::TotalMoney(floatfencelen,floatconarea)的定义,根据参数fencelen(栅栏的长度)和conarea(过道的面积),返回栅栏与过道的总造价。请在注释“//**4**”之后添加适当的语句。 注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。 源程序文件kt9_3.cpp清单如下: #include //**1** classCircle { private: floatradius; public: //**2** floatArea(){returnPI*radius*radius;}}; classMoney { private: floatFencePrice; floatConcretePrice; public: Money(floatf,floatc); floatTotalMoney(floatfencelen,floatconarea);}; Money::Money(floatf,floatc) { //**3** } floatMoney::TotalMoney(floatfencelen,floatconarea) { //**4** } voidmain() { floatradius,fence,concrete; cout.setf(ios::fixed); cout.setf(ios::showpoint); cout.precision(2); cout<<"Entertheradiusofthepool:"; cin>>radius; cout<<"EntertheFencePrice:"; cin>>fence; cout<<"EntertheConcretePrice:"; cin>>concrete; CirclePool(radius); CirclePoolRim(radius+WIDTH); Moneymon(fence,concrete); floattotalmoney=mon.TotalMoney(PoolRim.Circumference(),(PoolRim.Area()-Pool.Area())); cout<<"ThetotalmoneyisRMB"< 【参考答案】 (1)const float PI= 3.14159f; constfloat WIDTH =3.00f; (2)Circle(floatr):radius(r){}; (3)FencePrice=f; ConcretePrice=c; (4)returnFencePrice*fencelen+ConcretePrice*conarea; 【试题解析】 本题考查对符号常量的定义及类的定义与实现等方面的内容,其中常类型的定义应使用const关键字。 计算机等级考试二级C++模拟题及解析5上机部分 一、改错题 使用VC6打开考生文件夹下的工程kt10_1,此工程包含一个源程序文件kt10_1.cpp,但该程序运行有问题,请改正程序中的错误,使程序的输出结果为: classBase classD1 classD2 classD3 finBase 源程序文件kt10_1.cpp清单如下: #include classBase { public: Base(){cout<<"classBase"< voidf(){cout<<"finBase"< classD1:virtualpublicBase { public: D1(){cout<<"classD1"< voidf(){cout<<"finD1"< /**********found**********/ classD2:publicBase { public: D2(){cout<<"classD2"< /**********found**********/ classD3::publicD1,publicD2 { public: D3(){cout<<"classD3"< voidmain() { D3d; /**********found**********/ d.f(); } 【参考答案】 (1)将class D2:public Base 改为:class D2:virtual public Base (2)将class D3::public D1,public D2 改为:class D3:public D1,public D2 (3)将d.f();改为:d.Base::f(); 【试题解析】 (1)主要考查对虚基类的理解,虚基类可以解决二义性的问题,其定义方式是在继承列表中使用virtual关键字,使用虚基类可以避免程序运行中对基类函数调用的不惟一; (2)主要考查对类的定义方法的掌握,“::”为作用域符,此处应该使用“:”,因为后面是继承列表; (3)主要考查对虚基类函数调用过程的理解,只有使用"::"限定才能访问基类函数,否则将会调用自身的函数,如果该类没有该函数的定义,则会自动调用其父类的该函数,所以必须使用“::”符号。 二、简单应用题 请编写一个函数inlinelongsum(intn),用递归函数完成运算:sum(n)=1*1+2*2+???+n*n,递归表达式为sum(n)=sum(n-1)+n2。 注意:部分源程序已存在文件kt10_2.cpp中。 请勿修改主函数main和其他函数中的任何内容,仅在函数sum的花括号中填写若干语句。 文件kt10_2.cpp的内容如下: #include inlinelongsum(intn) { } voidmain() { intn; cout<<"输入n:"; cin>>n; cout<<"结果为:"< 【参考答案】 inline long sum(int n) { if(n==1) return 1; else 【试题解析】 本题考查对递归函数掌握的熟练程度。递归的终止条件为n=1时,值为1。 三、综合应用题 使用VC6打开考生文件夹下的工程kt10_3,此工程包含一个源程序文件kt10_3.cpp,其中定义了用于表示雇员信息的CEmployee类与表示公司信息的Company类,但这两个类的定义并不完整。请按要求完成下列操作。 (1)定义Cemployee类的私有数据成员name(大小为50的字符数组)和pay(double型数据),分别用于记录雇员姓名和月薪。请在注释“//**1**”之后添加适当的语句。 (2)完成Company类默认构造函数的定义,该构造函数将n值赋值给私有成员num,并完成指针emp所指的n个Cemployee对象空间的申请,请在注释“//**2**”之后添加适当的语句。 (3)完成Company类成员函数voidCompany::add(intcode,charname[50],doublepay)的定义,该函数将某一雇员的编号code、姓名name及月薪pay输入到公司信息中。请在注释“//**3**”之后添加适当的语句。 (4)完成Company类成员函数voidCompany::print()的定义,使其以"_ispaid_RMBforonemonth"的格式输出公司内所有员工的月薪信息。请在注释“//**4**”之后添加适当的语句。 注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。 源程序清单如下: #include #include classCEmployee { public: voidputname(charn[50]){strcpy(name,n);} voidgetname(charn[50]){strcpy(n,name);} voidputpay(doubled){pay=d;} doublegetpay(){returnpay;} private: //**1** }; classCompany { private: CEmployee*emp; intnum; public: Company(intn); voidadd(intcode,charname[50],doublepay); voidprint(); }; Company::Company(intn) { //**2** } voidCompany::add(intcode,charname[50],doublepay) { //**3** } voidCompany::print() { //**4** for(inti=0;i { (emp+i)->getname(c); money=(emp+i)->getpay(); cout< "RMBforonemonth"< voidmain() { Companycom(2); com.add(0,"Jack",200); com.add(1,"Lee",300); com.print(); } 【参考答案】 (1)char name[50]; double pay; (2)num=n; emp=new CEmployee[num]; (3)(emp+code)->putname(name); (emp+code)->putpay(pay); (4)char c[50]; double money; 【试题解析】 本题考查类成员的定义、类成员函数的定义与调用、对象数组的使用。注意指针和动态申请空间new的使用方法。使用指针调用成员应该用"->"符号,new的返回值是指针类型的。 计算机等级考试二级C++模拟题及解析6上机部分 一、改错题 使用VC6打开考生文件夹下的工程kt11_1,此工程包含一个源程序文件kt11_1.cpp,但该程序运行有问题,请改正函数中的错误,使该程序的输出结果为: Valuesare:1,2and3 Pressanykeytocontinue 源程序文件kt11_1.cpp清单如下: #include classCommonBase { public: intx; }; /*****************found*****************/ classDeriveCommonA::publicCommonBase { public: inty; }; classDeriveCommonB:publicCommonBase { public: intz; }; /*****************found*****************/ classOverlapping:publicDeriveCommonA;publicDeriveCommonB { public: voidDisplay() {cout<<"Valuesare:"< intmain() { Overlappingov; /*****************found*****************/ ov.x=1; ov.y=2; ov.z=3; ov.Display(); return0; } (1)主要考查对派生类定义的理解,C++规定的继承格式是在类名的后面加冒号,之后是继承方式和继承类的名称,题目中错误的使用了作用域运算符; (2)主要考查多继承的定义,多继承的格式基本上和单继承相同,不过在多个基类之间应该使用逗号分开,题目中错误的使用了分号,分号在C++中是结束标志; (3)主要考查对派生类的对象访问的掌握,x是类CommonBase的成员,如果不加限制的访问就会产生二义性,编译程序不知道这个x是A类的,还是B类的,所以必须使用作用域限制符“::”,为了解决这个问题可以使用虚基类。 二、简单应用题 请编写函数fun(),该函数的功能是判断字符串是否为回文,若是则函数返回1,主函数中输出YES;否则返回0,主函数中输出NO。回文是指顺读和倒读都一样的字符串。 例如:字符串LEVEL是回文,而字符串123312就不是回文。 注意:部分源程序已存在文件kt11_2.cpp中。 请勿修改主函数main和其他函数中的任何内容,仅在函数fun的花括号中填写若干语句。 文件kt11_2.cpp的内容如下: #include #include #defineN80 intfun(char*str) { } voidmain() { chars[N]; cout<<"Enterastring:"< gets(s); cout<<"\n\n"; puts(s); if(fun(s)) cout<<"YES\n"; else cout<<"NO\n"; } 【参考答案】 int fun(char *str) { int i,n=0,fg=1; char *p=str; while(*p) { n++; p++; } for(i=0;i if(str[i]==str[n-1-i]) ; else { fg=0; break; } return fg; } 【试题解析】 本题的解题思路是:先利用循环中指针的移动来求得字符串的长度n,然后用一个for循环依次取得数组中的前半部分元素,用取得的前半部分内的元素逐个与后半部分内的对应位置的元素进行比较,如果相同,不做任何工作,接着取下一个元素,继续比较;如果不相同,可以判断该字符串肯定不是回文,就给标志变量fg赋值0(fg的初始值为1)。最终把fg作为函数的返回值返回(fg值为1表明是回文,fg值为0表明不是回文)。 三、综合应用题 使用VC6打开考生文件夹下的工程kt11_3。此工程包含一个kt11_3.cpp,其中定义了类queue,但该类的定义并不完整。请按要求完成下列操作,将程序补充完整。 (1)完成类queue的无参数的构造函数的定义,要求把数据成员bl和el都初始化为0,同时输出queueinitialized。请在注释“//**1**”之后添加适当的语句。 (2)完成类queue的成员函数qput(intj)的定义,它的功能是把新的元素加入队列,过程是先依据bl的值判断数组是否已经满了,如果是就输出queueisfull,否则bl自加一,并且把参数j的值存入bl指向的数组元素中,请在注释“//**2**”之后添加适当的语句。 (3)完成类queue的成员函数qget()的定义,它的功能是把队列开头的元素提取出队列,并返回该值,过程是先比较el和bl的值判断队列是否已空,如果是就输出queueisempty,否则el自加一,并且把el指向的数组元素返回,请在注释“//**3**”之后添加适当的语句。 程序输出结果如下: queueinitialized queueinitialized 3311 4422 注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。 源程序文件kt11_3.cpp清单如下: #include classqueue { intq[100]; intbl,el; public: queue(); voidqput(intj); intqget(); }; queue::queue() { //**1** } voidqueue::qput(intj) { //**2** { cout<<"queueisfull\n"; return; } bl++; q[bl]=j; } intqueue::qget() { //**3** { cout<<"queueisempty\n"; return0; } el++; returnq[el]; } voidmain() { queueaa,bb; aa.qput(11); bb.qput(22); bb.qput(44); cout< cout< } 【参考答案】 (1)bl=el=0; cout<<"queue initialized\n"; (2)if(bl==100) (3)if(el==bl) 【试题解析】 主要考查对于具体的一个队列类的掌握,对列是一种特殊的存储结构,应使用先进先出原则。题目中bl和el分别指向队列的开头和结尾,其中(2)是队列的标准插入操作,(3)是队列的标准的删除操作,注意它们的操作方式和先判断后操作的原则。 计算机等级考试二级C++模拟题及解析7上机部分 一、改错题 使用VC6打开考生文件夹下的工程kt12_1,此工程包含一个源程序文件kt12_1.cpp,但该程序运行有问题,请改正函数中的错误,使该程序的输出结果为: 100 源程序文件kt12_1.cpp清单如下: #include template classpair { Tvalue1,value2; public: pair(Tfirst,Tsecond) {value1=first;value2=second;} /*****************found*****************/ chargetmax(); }; /*****************found*****************/ Tpair { Tretval; /*****************found*****************/ retval=value1>value2??value1:value2; returnretval; } voidmain() { pair cout< 【参考答案】 (1)将char getmax();改为:T getmax (); (2)缺少模板的声明,应改为:template (3)将retval =value1>value2?? value1 : value2; 改为:retval= value1>value2? value1 : value2; 【试题解析】 (1)主要考查对模板使用的理解,该函数属于模板类定义的一部分,对于返回值类型,应该使用模板类名称T,这样编译的时候才能被接受; (2)主要考查是模板的使用,前面的模板类已经声明完成了,在类的外面定义类的成员函数时仍然需要使用模板的声明,这样在后面的函数定义体中才能使用模板类; (3)主要考查对“表达式1? 表达式2 :表达式3”语句的掌握,这个语句是一个复合语句,先计算第一个表达式,如果为真则整个式子值为表达式2的值,否则为表达式3的值,题目中错误的使用了两个问号。 二、简单应用题 请编写函数fun(),其功能是将s所指字符串中除了下标为奇数、同时ASCII值也为奇数的字符之外,其余的所有字符都删除。字符串中剩余的字符所形成的一个新的字符串放在t所指的数组中。 例如:s所指字符串中的内容为ABCDEFG12345,其中字符A的ASCII码值虽为奇数,但元素所在的下标为偶数,因此必需删除;字符1的ASCII码值为奇数,所在数组中的下标也为奇数,不删除,最后t所指的数组中的内容应是135。 请勿修改主函数main和其他函数中的任何内容,仅在函数su的花括号中填写若干语句。 文件kt12_2.cpp的内容如下: #include #include #include #include voidfun(char*s,chart[]) { } voidmain() { chars[100],t[100]; cout<<"PleaseenterstringS:"< gets(s); fun(s,t); puts(t); } 【参考答案】 void fun(char *s,char t[ ]) { int i,j=0,n; n=strlen(s); for(i=0;i if(i%2!=0&&s[i]%2!=0) { t[j]=s[i];j++;} t[j]='\0'; } 【试题解析】 本体的解题思路是要先搞清楚在字符参与数值运算时,用的是其ASCII码值来进行计算。其次是判断某数是奇数的方法,即判断该数与2的余数是否为0。 三、综合应用题 使用VC6打开考生文件夹下的工程kt12_3。此工程包含一个kt12_3.cpp,其中定义了类ARRAY,但类的定义并不完整。请按要求完成下列操作,将程序补充完整。 (1)完成类ARRAY的带一个参数的构造函数,参数i为int型,如果i不是正数则输出错误信息并退出,否则申请int型的大小为i的空间,然后把i赋值给类的数据成员num。请在注释“//**1**”之后添加适当的语句。 (2)完成类ARRAY的拷贝初始化构造函数,注意解决重复删除的问题,请在注释“//**2**”之后添加适当的语句。 (3)完成类ARRAY的重载的运算符函数[],参数i为int型,如果i超界则输出错误信息并退出,否则把下标为i的元素返回,请在注释“//**3**”之后添加适当的语句。 (4)完成类ARRAY的重载的运算符函数=,同样需要注意解决重复删除的问题,不能只是简单的赋值,请在注释“//**4**”之后添加适当的语句。 注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。 源程序文件kt12_3.cpp清单如下: #include #include classARRAY { private: int*p,num; public: ARRAY(){p=newint[10],num=10;} ARRAY(inti) { //**1** { cout<<"错误!数组长度应为正。\n"; exit(0); } p=newint[i]; num=i; } ARRAY(constARRAY&a); int&operator[](inti); ~ARRAY(){deletep;} ARRAY&operator=(constARRAY&a); friendARRAYoperator+(ARRAY&a,ARRAY&b); friendostream&operator<<(ostream&os,ARRAY&a); }; ARRAY::ARRAY(constARRAY&a) { //**2** for(inti=0;i p[i]=a.p[i]; } int&ARRAY::operator[](inti) { //**3** { cout<<"越界访问!"; exit(0); } returnp[i]; } ARRAY&ARRAY::operator=(constARRAY&a) { num=a.num; p=newint[num]; for(inti=0;i p[i]=a.p[i]; //**4** } ARRAYoperator+(ARRAY&a,ARRAY&b) { if(a.num!=b.num) { cout<<"数组长度不相同!"< exit(0); } ARRAYt(a.num); for(inti=0;i t.p[i]=a.p[i]+b.p[i]; returnt; } ostream&operator<<(ostream&os,ARRAY&a) { inti=0; for(;i { cout< if(!((i+1)%10))cout< returnos; } voidmain() { ARRAYa(3); a[0]=a[1]=a[2]=3; cout<<'a'<
ARRAYb(a); cout<<'b'<
ARRAYc(2); c=a+b+b; cout<<'c'< c=((b=(a+b))+c); cout<<'a'<
a[7]=3;
/**********found**********/
for(inti=0;i
floatCircumference(){return2*PI*radius;}
return n*n+sum(n-1); }
【试题解析】
aa.qput(33);