我看了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;
}
第四题:
太简单了,写个析构函数就可以了,在析构函数完成前,输出相关内容就可以了,一行代码我就不写出来了!