《C++ Primer Plus(第六版)》(20)(第十一章 使用类 编程题答案1)
来源:互联网 发布:js includes 编辑:程序博客网 时间:2024/06/03 22:58
这章主要讲重载运算符,友元函数和类型转换。
1.话说题目说的程序清单11.5,应该是错了吧,应该是11.15吧。
第一题就困了我好久,怎么都访问不了私有成员,一开始以为是哪里写错了,对着书敲代码都不行。
后来又觉得会不会友元的重载运算符太复杂,就自己写个简单的友元函数,发现也不行。
在main函数里面调用发现可以变得过,但是链接的时候才发现居然链接不上。
这个时候才想到我使用了using namespace xxx。但是对于类外的函数,是链接不上的,还是需要加上namespace。
原来的代码:
Test.h
//// Test.h// HelloWorld//// Created by feiyin001 on 16/12/21.// Copyright (c) 2016年 FableGame. All rights reserved.//#ifndef _Test_H_#define _Test_H_#include <iostream>namespace FableGame{ class Vector { public: enum Mode{ RECT, POL }; private: double x; double y; double mag;//长度 double ang;//弧度 Mode mode; void set_mag(); void set_ang(); void set_x(); void set_y(); public: Vector(); Vector(double n1, double n2, Mode form = RECT); void reset(double n1, double n2, Mode form = RECT); ~Vector(); double xval() const { return x; } double yval() const { return y; } double magval() const { return mag; } double angval() const { return ang; } void polar_mode(); void rect_mode(); Vector operator+(const Vector& b) const; Vector operator-(const Vector& b) const; Vector operator-() const; Vector operator*(double n) const; friend Vector operator*(double n, const Vector& a); friend std::ostream& operator<<(std::ostream& os, const Vector& v); };}#endifTest.cpp
//// Test.cpp// HelloWorld//// Created by feiyin001 on 16/12/21.// Copyright (c) 2016年 FableGame. All rights reserved.//#include "Test.h"#include <iostream>#include <cmath>using namespace FableGame;const double Rad_to_deg = 45.0 / atan(1.0);void Vector::set_mag(){ mag = sqrt(x*x + y*y);}void Vector::set_ang(){ if (x == 0.0 && y == 0.0) { ang = 0.0; } else { ang = atan2(y, x); }}void Vector::set_x(){ x = mag * cos(ang);}void Vector::set_y(){ y = mag * sin(ang);}Vector::Vector(){ x = y = mag = ang = 0.0; mode = RECT;}Vector::Vector(double n1, double n2, Mode form /*= RECT*/){ reset(n1, n2, form);}void Vector::reset(double n1, double n2, Mode form /*= RECT*/){ mode = form; if (form == RECT) { x = n1; y = n2; set_mag(); set_ang(); } else if (form == POL) { mag = n1; ang = n2 / Rad_to_deg; set_x(); set_y(); } else { std::cout << "Incorrect 3rd grgument to Vector() -- "; std::cout << "vector set to 0\n"; x = y = mag = ang = 0.0; mode = RECT; }}Vector::~Vector(){ }void Vector::polar_mode(){ mode = POL;}void Vector::rect_mode(){ mode = RECT;}Vector Vector::operator+(const Vector& b) const{ return Vector(x + b.x, y + b.y);}Vector Vector::operator-(const Vector& b) const{ return Vector(x - b.x, y - b.y);}Vector Vector::operator-() const{ return Vector(-x, -y);}Vector Vector::operator*(double n) const{ return Vector(n*x, n*y);}Vector FableGame::operator*(double n, const Vector& a){ return a * n;}std::ostream& FableGame::operator<<(std::ostream& os, const Vector& v){ if (v.mode == Vector::RECT) { os << "(x,y) = (" << v.x << ", " << v.y << ")"; } else if (v.mode == Vector::POL) { os << "(m,a) = (" << v.mag << ", " << v.ang * Rad_to_deg << ")"; } else { os << "Vector object mode is invalid"; } return os;}main.cpp
//// main.cpp// HelloWorld//// Created by feiyin001 on 16/12/21.// Copyright (c) 2016年 FableGame. All rights reserved.//#include <iostream>#include <cstdlib>#include <ctime>#include "Test.h"using namespace std;using namespace FableGame;int main(){ srand(time_t(0));//设置随机数种子 double direction;//方向 Vector step;//新的一步 Vector result(0,0);//当前位置 int steps = 0;//步数 double target;//目标距离 double dstep;//每一步的距离 cout << "Enter target distance (q to quit): "; while (cin >> target) { cout << "Enter step length: "; if (!(cin>> dstep)) { break; } while(result.magval() < target) { //离起点的距离还没达到目标距离,就要继续执行 direction = rand() % 360;//随机一个方向,角度 step.reset(dstep, direction, Vector::POL);//当前的一步 result = result + step;//当前的实际位置 steps++;//计数 } cout << "After " << steps << " steps, the subject has the following location:\n"; cout << result <<endl; result.polar_mode(); cout << " or\n" << result << endl; cout << "Average outward distance per step = " << result.magval()/steps << endl; steps = 0; result.reset(0, 0); cout << "Enter target distance (q to quit): "; } cout << "Bye!\n"; cin.clear(); while (cin.get() != '\n') { continue; } return 0;}回家用xcode再写一次,发现怎么都链接不了,最后发现在xcode里面手动改文件名导致识别不了文件的。
再看看更改后的:
只改main.cpp就行了
//// main.cpp// HelloWorld//// Created by feiyin001 on 16/12/21.// Copyright (c) 2016年 FableGame. All rights reserved.//#include <iostream>#include <cstdlib>#include <ctime>#include "Test.h"#include <fstream>using namespace std;using namespace FableGame;int main(){ ofstream of;//声明一个输出的对象 of.open("/Users/feiyin001/Documents/myTest.txt");//打开文件 srand(time_t(0));//设置随机数种子 double direction;//方向 Vector step;//新的一步 Vector result(0,0);//当前位置 int steps = 0;//步数 double target;//目标距离 double dstep;//每一步的距离 cout << "Enter target distance (q to quit): "; while (cin >> target) { cout << "Enter step length: "; if (!(cin>> dstep)) { break; } of << "Target Distance: " << target <<", Step Size: " << dstep<<endl; of << 0 << ": " << result << endl; while(result.magval() < target) { //离起点的距离还没达到目标距离,就要继续执行 direction = rand() % 360;//随机一个方向,角度 step.reset(dstep, direction, Vector::POL);//当前的一步 result = result + step;//当前的实际位置 steps++;//计数 of << steps << ": " << result << endl; } of << "After " << steps << " steps, the subject has the following location:\n"; of << result <<endl; result.polar_mode(); of << " or\n" << result << endl; of << "Average outward distance per step = " << result.magval()/steps << endl; steps = 0; result.reset(0, 0); cout << "Enter target distance (q to quit): "; } cout << "Bye!\n"; cin.clear(); while (cin.get() != '\n') { continue; } of.close(); return 0;}顺便看看结果吧:
Target Distance: 100, Step Size: 20
0: (x,y) = (0, 0)
1: (x,y) = (17.3205, -10)
2: (x,y) = (29.9069, 5.54292)
3: (x,y) = (28.1638, 25.4668)
4: (x,y) = (15.8506, 9.7066)
5: (x,y) = (6.15438, -7.7858)
6: (x,y) = (21.6973, -20.3722)
7: (x,y) = (41.3935, -16.8992)
8: (x,y) = (25.4207, -28.9355)
9: (x,y) = (41.181, -16.6223)
10: (x,y) = (30.8802, 0.521035)
11: (x,y) = (48.8561, -8.24639)
12: (x,y) = (45.3831, -27.9425)
13: (x,y) = (46.7782, -7.99126)
14: (x,y) = (62.9586, 3.76444)
15: (x,y) = (62.9586, 23.7644)
16: (x,y) = (62.2606, 3.77663)
17: (x,y) = (52.5644, 21.269)
18: (x,y) = (68.9474, 9.79749)
19: (x,y) = (87.2184, 17.9322)
20: (x,y) = (98.9741, 34.1126)
After 20 steps, the subject has the following location:
(x,y) = (98.9741, 34.1126)
or
(m,a) = (104.688, 19.0171)
Average outward distance per step = 5.23439
2.为了尽量保持原形,随时还原,我还是尽量用注释吧。
Test.h
//// Test.h// HelloWorld//// Created by feiyin001 on 16/12/21.// Copyright (c) 2016年 FableGame. All rights reserved.//#ifndef _Test_H_#define _Test_H_#include <iostream>namespace FableGame{ class Vector { public: enum Mode{ RECT, POL }; private: double x; double y; //double mag;//长度 //double ang;//弧度 Mode mode; //void set_mag(); //void set_ang(); void set_x(double mag, double ang); void set_y(double mag, double ang); public: Vector(); Vector(double n1, double n2, Mode form = RECT); void reset(double n1, double n2, Mode form = RECT); ~Vector(); double xval() const { return x; } double yval() const { return y; } double magval() const; double angval() const; void polar_mode(); void rect_mode(); Vector operator+(const Vector& b) const; Vector operator-(const Vector& b) const; Vector operator-() const; Vector operator*(double n) const; friend Vector operator*(double n, const Vector& a); friend std::ostream& operator<<(std::ostream& os, const Vector& v); };}#endifTest.cpp
//// Test.cpp// HelloWorld//// Created by feiyin001 on 16/12/21.// Copyright (c) 2016年 FableGame. All rights reserved.//#include "Test.h"#include <iostream>#include <cmath>using namespace FableGame;const double Rad_to_deg = 45.0 / atan(1.0);//void Vector::set_mag()//{// mag = sqrt(x*x + y*y);//}////void Vector::set_ang()//{// if (x == 0.0 && y == 0.0)// {// ang = 0.0;// }// else// {// ang = atan2(y, x);// }//}double Vector::angval() const{ double ang; if (x == 0.0 && y == 0.0) { ang = 0.0; } else { ang = atan2(y, x); } return ang;}double Vector::magval() const{ double mag = sqrt(x*x + y*y); return mag;}void Vector::set_x(double mag, double ang){ x = mag * cos(ang);}void Vector::set_y(double mag, double ang){ y = mag * sin(ang);}Vector::Vector(){ //x = y = mag = ang = 0.0; x = y = 0; mode = RECT;}Vector::Vector(double n1, double n2, Mode form /*= RECT*/){ reset(n1, n2, form);}void Vector::reset(double n1, double n2, Mode form /*= RECT*/){ mode = form; if (form == RECT) { x = n1; y = n2; //set_mag(); //set_ang(); } else if (form == POL) { double mag = n1; double ang = n2 / Rad_to_deg; set_x(mag, ang); set_y(mag, ang); } else { std::cout << "Incorrect 3rd grgument to Vector() -- "; std::cout << "vector set to 0\n"; //x = y = mag = ang = 0.0; x = y = 0; mode = RECT; }}Vector::~Vector(){ }void Vector::polar_mode(){ mode = POL;}void Vector::rect_mode(){ mode = RECT;}Vector Vector::operator+(const Vector& b) const{ return Vector(x + b.x, y + b.y);}Vector Vector::operator-(const Vector& b) const{ return Vector(x - b.x, y - b.y);}Vector Vector::operator-() const{ return Vector(-x, -y);}Vector Vector::operator*(double n) const{ return Vector(n*x, n*y);}Vector FableGame::operator*(double n, const Vector& a){ return a * n;}std::ostream& FableGame::operator<<(std::ostream& os, const Vector& v){ if (v.mode == Vector::RECT) { os << "(x,y) = (" << v.x << ", " << v.y << ")"; } else if (v.mode == Vector::POL) { os << "(m,a) = (" << v.magval() << ", " << v.angval() * Rad_to_deg << ")"; } else { os << "Vector object mode is invalid"; } return os;}
3.保留了文件输出,不改回来了。
//// main.cpp// HelloWorld//// Created by feiyin001 on 16/12/21.// Copyright (c) 2016年 FableGame. All rights reserved.//#include <iostream>#include <cstdlib>#include <ctime>#include "Test.h"#include <fstream>using namespace std;using namespace FableGame;int main(){ ofstream of;//声明一个输出的对象 of.open("/Users/feiyin001/Documents/myTest.txt");//打开文件 srand(time_t(0));//设置随机数种子 double direction;//方向 Vector step;//新的一步 Vector result(0,0);//当前位置 int steps = 0;//步数 double target;//目标距离 double dstep;//每一步的距离 cout << "Enter target distance (q to quit): "; while (cin >> target) { cout << "Enter step length: "; if (!(cin>> dstep)) { break; } of << "Target Distance: " << target <<", Step Size: " << dstep<<endl; int num = 0;//测试次数 cout << "Enter Test Times: ";//输入测试次数 if (!(cin>> num) || num < 0) { break; } int maxSteps = 0; int minSteps = 0; int totalSteps = 0; for (int i = 0; i < num; ++i) { of << 0 << ": " << result << endl; while(result.magval() < target) { //离起点的距离还没达到目标距离,就要继续执行 direction = rand() % 360;//随机一个方向,角度 step.reset(dstep, direction, Vector::POL);//当前的一步 result = result + step;//当前的实际位置 steps++;//计数 of << steps << ": " << result << endl; } of << "After " << steps << " steps, the subject has the following location:\n"; of << result <<endl; result.polar_mode(); of << " or\n" << result << endl; of << "Average outward distance per step = " << result.magval()/steps << endl; if (i == 0) { totalSteps = minSteps = maxSteps = steps; } else{ totalSteps += steps; if (minSteps > steps) { minSteps = steps; } if (maxSteps < steps) { maxSteps = steps; } } steps = 0; result.reset(0, 0); } of << "Test Times: " << num << " average steps: "<< totalSteps / num << endl; of << "max steps: " << maxSteps << " min steps: " << minSteps << endl; cout << "Enter target distance (q to quit): "; } cout << "Bye!\n"; cin.clear(); while (cin.get() != '\n') { continue; } of.close(); return 0;}
- 《C++ Primer Plus(第六版)》(20)(第十一章 使用类 编程题答案1)
- 《C++ Primer Plus(第六版)》(21)(第十一章 使用类 编程题答案2)
- C ++ Primer Plus 第六版 第十一章编程练习答案
- 《C++ Primer Plus(第六版)》(19)(第十一章 使用类 复习题答案)
- C++Primer Plus(第六版) 第十一章 第七题
- 【学习C++】C++ Primer Plus (第六版)第十一章编程练习1-7
- C++ Primer Plus第六版 第十一章 编程练习答案
- C Primer Plus(第六版)第六章编程练习答案。
- C Primer Plus(第6版)第六章答案
- 《C++ Primer Plus(第六版)》(27)(第十三章 类继承 编程题答案)
- C Primer Plus (第六版)中文版 第十章 编程练习答案
- C Primer Plus (第六版)中文版 第七章 编程练习答案
- C++primer plus第六版课后编程题答案8.3(正解)
- C++primer plus第六版课后编程题答案8.7(补)
- C++primer plus第六版课后编程题答案10.8(来个高手教教我)
- C++primer plus第六版课后编程题答案14.3(仅供参考)
- 《C Primer Plus》第六版 第十一章编程练习
- 《C++ Primer Plus(第六版)》(18)(第十一章 使用类 笔记)
- SVM算法推导
- 很实用的linux的搜索命令
- 文章标题
- Objective-C 内存管理
- 前端面试题第四套
- 《C++ Primer Plus(第六版)》(20)(第十一章 使用类 编程题答案1)
- 文件操作
- asp使用JMAIL发送SMTP邮件超过10条就失败原因查询
- POJ-3278 Catch the cow(BFS)
- 推荐一个好用的正则表达式在线生成工具
- Bootstrap源码解读(第一弹:排版)
- TabLayout的基本使用
- Android--下载zip压缩文件并解压
- SUMO应用工具:JTRROUTER