湖州师范学院2020 C++程序设计 期末考试
湖州师范学院2020—2021学年第 1 学期
《C++程序设计》期末考试试卷(A卷)
得分 | 一、 读程序,写答案 (每空2分,共30分) |
1. (6空)
#include <iostream>
using namespace std;
class CSample {
int x;
public:
CSample()
{
cout << "C1" << endl;
}
CSample(int n )
{
x = n;
cout << "C2,x=" << x << endl;
}
};
int main()
{
CSample array1;
CSample array2[3] = {3, 7};
CSample array3[2] = {22};
return 0;
}
2. (5空)
#include <iostream>
using namespace std;
class Sample {
public:
int v;
Sample()
{
v = 0;
};
Sample(int n): v(n) { };
Sample(const Sample &x)
{
v = 1 + x.v;
}
};
Sample PrintAndDouble(Sample o)
{
cout << o.v << endl;
o.v = o.v * 3;
return o;
}
int main()
{
Sample a(4);
cout << a.v << endl;
Sample b = a;
cout << b.v << endl;
Sample c = PrintAndDouble(b);
cout << c.v << endl;
Sample d;
d = a;
cout << d.v << endl;;
return 0;
}
3. (4空)
#include <iostream>
using namespace std;
class C {
private:
int x;
double y;
public:
C()
{
x = 0;
y = 0;
}
void ask(int);
void ask(double);
void ask(int, double);
void ask();
};
void C::ask(int a)
{
x = a;
}
void C::ask(double b)
{
y = b;
}
void C::ask(int a, double b)
{
x = a;
y = b;
}
void C::ask()
{
cout << "x=" << x << ",y=" << y << endl;
}
int main()
{
C c;
c.ask();
c.ask(6, 8.2);
c.ask();
c.ask(3);
c.ask();
c.ask(9.2);
c.ask();
}
得分 | 二、 类和对象程序设计(20分) |
现在需要录入一批学生的成绩(学号,成绩)。其中学号是正整数,并且录入时,后录入学生的学号会比前面的学号大;成绩分两等,通过(Pass,录入时用1代表),不通过(Fail,录入时用0代表)。
由于很多学号都是相邻的,并且学号相邻的学生成绩常常相同。所以在录入时,适当地加了速。如果当前学生的学号比前面的学号大1,且成绩与前面的成绩相同,则只输入0即可。
要求:完成Student类定义,使得以下程序能够按要求运行。
#include <iostream>
using namespace std;
/* Student类定义 */
int main() {
const int size = 100;
int i, N, no, score;
Student *st[size];
cin >> N;
for (i = 0; i < N; i++) {
cin >> no;
if (no > 0) {
cin >> score;
st[i] = new Student(no, score);
} else
st[i] = new Student(*st[i - 1]);
}
cout << Student::count << " Students" << endl;
for (i = 0; i < N; i++)
st[i]->display();
for (i = 0; i < N; i++)
delete st[i];
return 0;
}
输入样例: 5 3 0 0 7 1 0 12 1 | 输出样例: 5 Students 3 Fail 4 Fail 7 Pass 8 Pass 12 Pass |
得分 | 三、类模板程序设计(20分) |
实现一个类模板,它可以接受一组数据,能对数据排序,也能输出数组的内容。每行输入的第一个数字为0,1,2或3:为0时表示输入结束; 为1时表示将输入整数,为2时表示将输入有一位小数的浮点数,为3时表示输入字符。如果第一个数字非0,则接下来将输入一个正整数,表示即将输入的数据的数量。从每行第三个输入开始,依次输入指定类型的数据。
类模板:template <class T> class MyArray
裁判测试程序样例:
#include <iostream>
using namespace std;
/* 你的代码将放到这里 */
template<class T> MyArray<T>::~MyArray() {
delete[] data;
}
template<class T> bool MyArray<T>::check() {
int i;
for (i = 0; i < size - 1; i++)
if (data[i] > data[i + 1]) {
cout << "ERROR!" << endl;
return false;
}
return true;
}
int main( ) {
MyArray<int> *pI;
MyArray<float> *pF;
MyArray<char> *pC;
int ty, size;
cin >> ty;
while (ty > 0) {
cin >> size;
switch (ty) {
case 1:
pI = new MyArray<int>(size);
pI->sort();
pI->check();
pI->display();
delete pI;
break;
case 2:
pF = new MyArray<float>(size);
pF->sort();
pF->check();
pF->display();
delete pF;
break;
case 3:
pC = new MyArray<char>(size);
pC->sort();
pC->check();
pC->display();
delete pC;
break;
}
cin >> ty;
}
return 0;
}
输入样例: 1 3 2 3 1 2 4 1.5 2.6 3.7 0.5 3 2 A a 0 | 输出样例: 1 2 3 0.5 1.5 2.6 3.7 A a |
得分 | 四、 继承和多态程序设计 (30分)
|
学期结束,班主任决定表彰一批学生,已知该班学生数在6至50人之间,有三类学生:普通生,特招运动员,学科专长生,其中学科专长生不超过5人。主函数根据输入的信息,相应建立GroupA, GroupB, GroupC类对象。
1. GroupA类是普通生,有2门课程的成绩(均为不超过100的非负整数);
2. GroupB类是特招运动员,有2门课程的成绩(均为不超过100的非负整数),1次运动会的表现分,表现分有:A、B、C、D共4等。
3. GroupC类是学科专长生,有5门课程的成绩(均为不超过100的非负整数)。
表彰人员至少符合以下3个条件中的一个:
1. 2门课程平均分在普通生和特招运动员中,名列第一者。
a. 该平均分称为获奖线。
b. 存在成绩并列时,则全部表彰,例如某次考试有2人并列第1,则他们全部表彰。
2. 5门课程平均分达到或超过获奖线90%的学科专长生,给予表彰。
3. 2门课程平均分达到或超过获奖线70%的特招运动员,如果其运动会表现分为A,给予表彰。
输入格式:每个测试用例占一行,第一项为类型,1为普通生,2为特招运动员,3为学科专长生, 输入0表示输入的结束。第二项是学号,第三项是姓名。对于普通生来说,共输入5项,第4、5项是课程成绩。对于特招运动员来说,共输入6项,第4、5项是课程成绩,第6项是运动会表现。对于学科专长生来说,共输入8项,第4、5、6、7、8项是课程成绩。
输出时,打印要表彰的学生的学号和姓名。(输出顺序与要表彰学生的输入前后次序一致)。构造函数要用初始化列表。
函数接口定义:以Student为基类,构建GroupA, GroupB和GroupC三个类
裁判测试程序样例:
#include <iostream>
#include <string>
using namespace std;
/* 你的代码将放到这里 */
int main() {
const int Size = 50;
string num, name;
int i, ty, s1, s2, s3, s4, s5;
char gs;
Student *pS[Size];
int count = 0;
for (i = 0; i < Size; i++) {
cin >> ty;
if (ty == 0)
break;
cin >> num >> name >> s1 >> s2;
switch (ty) {
case 1:
pS[count++] = new GroupA(num, name, s1, s2);
break;
case 2:
cin >> gs;
pS[count++] = new GroupB(num, name, s1, s2, gs);
break;
case 3:
cin >> s3 >> s4 >> s5;
pS[count++] = new GroupC(num, name, s1, s2, s3, s4, s5);
break;
}
}
for (i = 0; i < count; i++) {
pS[i]->display();
delete pS[i];
}
return 0;
}
输入样例: 1 001 AAAA 96 80 2 009 BBB 82 75 A 1 007 CC 100 99 3 012 CCCC 97 95 90 99 93 1 003 DDD 62 50 1 022 ABCE 78 92 2 010 FFF 45 40 A 3 019 AAA 93 97 94 82 80 0 | 输出样例: 009 BBB 007 CC 012 CCCC
|
湖州师范学院2020—2021学年第 1 学期
《C++程序设计》期末考试试卷(B卷)
得分 | 一、 读程序,写答案 (每空2分,共30分) |
1.(7空)
#include <iostream>
using namespace std;
class B {
public:
B()
{
cout << ++b << endl;
}
~B()
{
cout << --b << endl;
}
static int Getb()
{
return b;
}
private:
static int b;
};
int B::b = 100;
int main()
{
B b1, b2, b3;
cout << B::Getb() << endl;
return 0;
}
2.(4空)
#include <iostream>
using namespace std;
class A {
public :
virtual ~A()
{
cout << "Destruct 1" << endl;
}
};
class B: public A {
public:
virtual ~B()
{
cout << "Destruct 2" << endl;
}
};
class C: public B {
public:
~C()
{
cout << "Destruct 3" << endl;
}
};
int main()
{
A *pa = new C;
delete pa;
A a;
return 0;
}
3.(4空)
#include <iostream>
using namespace std;
class A {
public:
A( ) { }
virtual void func()
{
cout << "A::func" << endl;
}
virtual void fund( )
{
cout << "A::fund" << endl;
}
void fun()
{
cout << "A::fun" << endl;
}
};
class B: public A {
public:
B ( )
{
func( ) ;
}
void fun( )
{
func( ) ;
}
};
class C : public B {
public :
C( ) { }
void func( )
{
cout << "C::func" << endl;
}
void fund()
{
cout << "C::fund" << endl;
}
};
int main()
{
A *pa = new B();
pa->fun();
B *pb = new C();
pb->fun();
return 0;
}
得分 | 二、 类和对象程序设计(20分) |
定义一个Point类,代表平面上的一个点,其横坐标和纵坐标分别用x和y表示,设计Point类的成员函数,实现并测试这个类。 主函数中输入两个点的坐标,计算并输出了两点间的距离。请根据主函数实现Point类。
裁判测试程序样例:
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
//你的代码将被嵌在这里
int main() {
Point p1, p2;
double x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
p1.setX(x1);
p1.setY(y1);
p2.setX(x2);
p2.setY(y2);
double x = p1.getX() - p2.getX();
double y = p1.getY() - p2.getY();
double len = sqrt(x * x + y * y);
cout << fixed << setprecision(2) << len << endl;
return 0;
}
输入样例: 0 0 3 3 | 输出样例: 4.24 |
得分 | 三、 继承和多态程序设计(20分)
|
完成两个类,一个类Animal,表示动物类,有一个成员表示年龄。一个类Dog,继承自Animal,有一个新的数据成员表示颜色,合理设计这两个类,使得测试程序可以运行并得到正确的结果。
/* 你的代码将被嵌在这里 */
int main() {
Animal ani(5);
cout << "age of ani:" << ani.getAge() << endl;
Dog dog(5, "black");
cout << "infor of dog:" << endl;
dog.showInfor();
}
输入样例: 无 | 输出样例: age of ani:5 infor of dog: age:5 color:black |
得分 | 四、类模板程序设计(30分) |
复数类Complex有两个数据成员:a和b, 分别代表复数的实部和虚部,并有若干构造函数和一个重载-(减号,用于计算两个复数的距离)的成员函数。 要求设计一个函数模板。
template < class T > double dist(T a, T b)
对int,float,Complex或者其他类型的数据,返回两个数据的间距。以上类名和函数模板的形式,均须按照题目要求,不得修改。
输入格式:
每一行为一个操作,每行的第一个数字为元素类型,1为整型元素,2为浮点型元素,3为Complex类型,若为整型元素,接着输入两个整型数据,若为浮点型元素,接着输入两个浮点型数据,若为Complex型元素,输入两个Complex型数据(a1 b1 a2 b2),输入0时标志输入结束。
输出格式:
对每个输入,每行输出一个间距值。
输入样例: 1 2 5 3 2 4 5 9 2 2.2 9.9 0 | 输出样例: 3 5.83095 7.7 |