重学C++程序设计(五):第二周mooc的习题解答(北京大学,郭炜)

第一题:学生信息处理程序

我看了csdn上很多解析、源码,真的,全是错的!他们的代码根本AC不了!因为他真的坑!要求输出的数,不说精确到多少位,而是有多少位就得输出多少位,我也不想多说了,看我的源码吧:

第一题解决方案:

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <sstream>
#include <cstdlib>
using namespace std;

class Student {
private:
	string name;
	double ans = 0.0;
	int age, id, s1, s2, s3, s4;
public:
	void input() {
		getline(cin, name, ',');
		scanf("%d,%d,%d,%d,%d,%d", &age, &id, &s1, &s2, &s3, &s4);
	}
	void calculate() {
		ans = (1.0 * s1 + s2 + s3 + s4) / 4.0;
	}
	void output() {
		double Temp = ans;
		int k = 0, num = int(ans);
		for (int i = 0; i < 16; ++i) {
			Temp *= 10;
			k++;
		}
		cout << name;
		printf(",%d,%d,", age, id);
		cout << num;
		int t = (int)Temp;
		while (0 == t % 10) {
			k--;
			t /= 10;
		}
		while (k--)
			num *= 10;
		t -= num;
		if (t)
			cout << '.' << t;
	}
};


int main() {
	Student student;        // 定义类的对象
	student.input();        // 输入数据
	student.calculate();    // 计算平均成绩
	student.output();       // 输出数据
	return 0;
}
第二题:奇怪的类复制

这个题我也要来分析一下:

首先不看解答,看需求!这里有两种输出方式,一种是利用公有属性,直接对象去访问,另一种是函数传参,利用函数去访问。直接对象访问,就是直接对对象的属性访问,而函数传参,传递的是对象,这个对象一开始是没有属性值的,但是也实例化了,所以需要一个空白的构造函数;然后这个对象传进来,是需要拷贝构造的,所以需要拷贝构造函数;然后看main函数测试代码的第一句,这是需要重载构造函数,加入一个int型参数才能实现,所以一共至少需要三个构造函数。

然后分析构造函数怎么写!
第一个b对象,需要输出 9;这个 9怎么来??a 的属性值是 5,还差4,那是不是直接在拷贝构造里加 4 呢?如果加 4,那在赋值 Sample b = a;这句话,就拷贝完成,b 的属性值就是 9 了,但是函数传参又要拷贝构造一次,所以又增加一次,那么参数 o 的属性值就是 14 了,这是不合要求的!所以我们的拷贝构造只能加 2;然后赋给 b,一次构造,传参 第二次构造!9 就出来了!
然后输出 22 怎么来呢?20先生成一个匿名对象,这个生成过程是系统生成的,当然也可用类型转换构造函数,但是这里不能写类型转换了,因为参数一致,不能构成重载,会报错!但是我们对象之间的赋值,还是可以用拷贝构造的,刚好之前的拷贝构造加 2 了,于是正好 22 就出来了!
最后那个5很简单,就不说了。

第二题的解决方案:

#include <iostream>
using namespace std;
class Sample {
public:
	int v;
	Sample(int n) {
		v = n;
	}

	Sample(const Sample& s) {
		v = s.v + 2;
	}

	Sample() {

	}
};
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;
}
第三题:超级简单的复数类

第三题的解决方案:

#include <iostream>
#include <cstring>
#include <cstdlib>
using namespace std;
class Complex {
private:
    double r,i;
public:
    void Print() {
        cout << r << "+" << i << "i" << endl;
    }
	Complex(char* str){
		int p = 0, q = 0;
		double rr = 0.0, ii = 0.0;
		while(str[p] != '+'){
			rr = rr * 10 + double(str[p] - '0');
			p++;
		}
		q = p + 1;
		while(str[q] != 'i'){
			ii = ii * 10 + double(str[q] - '0');
			q++;
		}
		r = rr, i = ii;
	} 
	Complex(){
		
	}
};
int main() {
    Complex a;
    a = "3+4i"; a.Print();
    a = "5+6i"; a.Print();
    return 0;
}
第四题:

太简单了,写个析构函数就可以了,在析构函数完成前,输出相关内容就可以了,一行代码我就不写出来了!

上一篇:snakemake教程-03额外特征


下一篇:SAP Spartacus Sample Data Extension