重学C++程序设计(五):第二周mooc的习题解答(北京大学,郭炜)
2021/6/8 20:27:50
本文主要是介绍重学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; }第四题:
太简单了,写个析构函数就可以了,在析构函数完成前,输出相关内容就可以了,一行代码我就不写出来了!
这篇关于重学C++程序设计(五):第二周mooc的习题解答(北京大学,郭炜)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享