北京大学MOOC C++程序设计 程序设计与算法(三)第二周测验

以下四个题都很基础,是最近复习C++类和对象的知识做的,其中第三题考查了类型转换构造函数,第四题考查的析构函数,都非常简单。

让我感到棘手的是第一题中如何读入一个带有空格的字符串,最后解决方案是发现了cin.getline()函数。其次是要使用一个char c来存储用于分隔的逗号。eg:输入是mao mao,18,8092,80,80,80,80 你使用cin.getline(name,20,',');cin>>age>>id;是错的,因为age和id之间有逗号,我们应该用cin>>age>>c>>id;

第二题的难点在于理解复制构造函数的调用次数。

001:编程填空:学生信息处理程序

总时间限制: 

1000ms

内存限制: 

1024kB

// 在此处补充你的代码

描述

实现一个学生信息处理程序,计算一个学生的四年平均成绩。

要求实现一个代表学生的类,并且类中所有成员变量都是【私有的】。

补充下列程序中的 Student 类以实现上述功能。

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

class Student {
};

int main() {
	Student student;        // 定义类的对象
	student.input();        // 输入数据
	student.calculate();    // 计算平均成绩
	student.output();       // 输出数据
}

输入

输入数据为一行,包括:
姓名,年龄,学号,第一学年平均成绩,第二学年平均成绩,第三学年平均成绩,第四学年平均成绩。
其中姓名为由字母和空格组成的字符串(输入保证姓名不超过20个字符,并且空格不会出现在字符串两端),年龄、学号和学年平均成绩均为非负整数。信息之间用逗号隔开。

输出

输出一行数据,包括:
姓名,年龄,学号,四年平均成绩。
信息之间用逗号隔开。

样例输入

Tom Hanks,18,7817,80,80,90,70

样例输出

Tom Hanks,18,7817,80

提示

必须用类实现,其中所有成员变量都是私有的。
输出结果中,四年平均成绩不一定为整数。

解答:

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

class Student {
    private:
        char name[20];
        int age;
        int id;
        char c;
        float first,second,third,fouth;
        float average;
    public:
        void input()
        {
            cin.getline(name,20,',');
            cin>>age>>c>>id>>c;
            cin>>first>>c>>second>>c>>third>>c>>fouth;
        }
        void calculate()
        {
            average=(first+second+third+fouth)/4;
        }
        void output()
        {
            cout<

其中cin.getline此函数会一次读取多个字符(包括空白字符)。它以指定的地址为存放第一个读取的字符的位置,依次向后存放读取的字符,直到读满N-1个,或者遇到指定的结束符为止。若不指定结束符,则默认结束符为'\n'。其语法为:

cin.getline(字符指针(char*),字符个数N(int),结束符(char));

002:奇怪的类复制

总时间限制: 

1000ms

内存限制: 

65536kB

// 在此处补充你的代码

描述

程序填空,使其输出9 22 5

#include 
using namespace std;
class Sample {
public:
	int v;
};
void PrintAndDouble(Sample o)
{
	cout << o.v;
	cout << endl;
}
int main()
{
	Sample a(5);
	Sample b = a;
	PrintAndDouble(b);
	Sample c = 20;
	PrintAndDouble(c);
	Sample d;
	d = a;
	cout << d.v;
	return 0;
}

输入

输出

9
22
5

样例输入

None

样例输出

9
22
5

解答:

#include 
using namespace std;
class Sample {
public:
	int v;
	Sample()
	{
	    v = 0;
	}
	Sample(int x)
	{
	    v = x;
	}
    Sample(const Sample& s)
    {
        v = s.v + 2;
    }
};
void PrintAndDouble(Sample o)
{
	cout << o.v;
	cout << endl;
}
int main()
{
	Sample a(5);
	Sample b = a;
	PrintAndDouble(b);
	Sample c = 20;
	PrintAndDouble(c);
	Sample d;
	d = a;
	cout << d.v;
	return 0;
}

003:超简单的复数类

总时间限制: 

1000ms

内存限制: 

65536kB

// 在此处补充你的代码

描述

下面程序的输出是:

3+4i 
5+6i

请补足Complex类的成员函数。不能加成员变量。

#include 
#include 
#include 
using namespace std;
class Complex {
private:
    double r,i;
public:
    void Print() {
        cout << r << "+" << i << "i" << endl;
    }
};
int main() {
    Complex a;
    a = "3+4i"; a.Print();
    a = "5+6i"; a.Print();
    return 0;
}

输入

输出

3+4i
5+6i

样例输入

样例输出

3+4i
5+6i

解答: 

#include 
#include 
#include 
using namespace std;
class Complex {
private:
    double r,i;
public:
    void Print() {
        cout << r << "+" << i << "i" << endl;
    }
    Complex()
    {
        r = 0;
        i = 0;
    }
    Complex(char s[])
    {
        r = s[0]-'0';
        i = s[2]-'0';
    }
};
int main() {
    Complex a;
    a = "3+4i"; a.Print();
    a = "5+6i"; a.Print();
    return 0;
}

004:哪来的输出

总时间限制: 

1000ms

内存限制: 

65536kB

// 在此处补充你的代码

描述

程序填空,输出指定结果 

#include 
using namespace std;
class A {
	public:
		int i;
		A(int x) { i = x; }
};
int main()
{
	A a(1);
	A * pa = new A(2);
	delete pa;
	return 0;
}

输入

输出

2
1

样例输入

样例输出

2
1

解答: 

#include 
using namespace std;
class A {
	public:
		int i;
		A(int x) { i = x; }
		~A()
		{
		    cout<

 

你可能感兴趣的:(C++)