【C++进阶】 遵循TDD原则,实现平面向量类(Vec2D)

目录

  • 1、明确要实现的类的方法以及成员函数
  • 2、假设已经编写Vec2D,根据要求,写出测试代码
  • 3、编写平面向量类Vec2D,并进行测试
  • 4、完整代码
  • 5、最终结果

1、明确要实现的类的方法以及成员函数

考虑到效率问题,我们一般将函数的参数设置为引用类型。
函数参数类型设置为引用类型的一个重要目的是避免对象拷贝的开销。

在这里插入图片描述

2、假设已经编写Vec2D,根据要求,写出测试代码

遵循TDD的原则:

本部分要展示的内容如下:
假定平面向量类Vec2D已经编写完
在main函数中测试Vec2D中的各种函数.

在源文件中写入测试代码:

include <iostream>using std::cout;
using std::endl;int main()
{//创建向量对象Vec2D v1{ 3,5 }, v2{ 4,6 };//向量转为字符串cout << "v1 = " << v1.toString() << endl;cout << "v2 = " << v2.toString() << endl;//向量加法: 向量 + 向量 ,向量 + 数Vec2D v3 = v1.add(v2);Vec2D v4 = v3.add(10.0);cout << "v2 = " << v3.toString() << endl;cout << "v3 = " << v4.toString() << endl;//向量减法,向量点积,向量数乘Vec2D v5 = v2.subtract(v1);double v6 = v2.dot(v1);					//两个向量的点积是一个数Vec2D v7 = v3.multiply(2.1);cout << "v2 - v1 = " << v5.toString() << endl;cout << "v2 * v1 = " << v6 << endl;cout << "v3 * 2.1 = " << v7.toString() << endl;//向量求负值Vec2D v8 = v2.negative();cout << "-v2 = " << v8.toString() << endl;//向量自增/自减cout << " ++v8 = " << v8.increase().toString() << endl;cout << " --v2 = " << v2.decrease().toString() << endl;//读取或者修改向量元素cout << "v1.x_ = " << v1.at(0) << endl;cout << "v1.y_ = " << v1.at(1) << endl;//向量的长度magnitude 和角度directioncout << "v1.magnitude = " << v1.magnitude() << endl;cout << "v1.direction = " << v1.direction() << endl;//比较两个向量cout << "v1 compare v2 :" << v1.compareTo(v2) << endl;return 0;
}

由于Vec2D类还没有进行编写,这个测试程序显然是无法运行通过的。

3、编写平面向量类Vec2D,并进行测试

1、添加类
这里使用VS2019中的类向导来添加类:视图 -> 类视图 -> 选择项目,右键 -> 类向导 -> 添加类
在这里插入图片描述
2、添加类成员变量:
返回类向导 - >成员变量-> 添加自定义
添加x_,y_,类型均未double,均为private.
在这里插入图片描述
3、添加方法,注意这里的同名重载函数是不可以添加的,需要后面手动添加
在这里插入图片描述
举个例子:
在这里插入图片描述

4、补充需要重载的函数以及遗漏的函数

add这里还有另外一个重载函数,与数值相加,同理subtract也有重载函数。

//cpp
//与数值相加
Vec2D Vec2D::add(double num)
{// TODO: 在此处添加实现代码.return Vec2D();
}
//h//与数值相加Vec2D add(double num);

补充遗漏的头文件

#include <iostream>
#include <string>
#include <cmath>
#include <exception>

5、完善每个成员函数的具体内容,并且对格式稍作修改

4、完整代码

Vec2D.h

#pragma once
#include <iostream>
#include <string>
#include <cmath>
#include <exception>
class Vec2D
{
private:double x_;double y_;
public:Vec2D();Vec2D(double , double );~Vec2D();// 将向量转换为字符串表达形式std::string toString();// 向量加法Vec2D add(Vec2D secondVec2D);//与数值相加Vec2D add(double num);// 读取或修改向量元素double& at(const int index);// 向量减法Vec2D subtract(Vec2D secondVec2D);//与数值相减Vec2D subtract(double num);// 向量点积double dot(Vec2D secondVec2D);// 向量数乘Vec2D multiply(double multiplier);// 向量求负值Vec2D negative();// 向量自增1Vec2D& increase();// 向量自减1Vec2D& decrease();// 求向量的范数(长度)double magnitude();// 求Vec2D与x+轴的夹角double direction();// 比较两个向量的长度。如果firstVec2D小于secondVec2D,返回-1,若大于则返回1,若相等则返回0int compareTo(Vec2D secondVec2D);
};

Vec2D.cpp

#include "Vec2D.h"
Vec2D::Vec2D() {x_ = 0.0;y_ = 0.0;
}Vec2D::Vec2D(double x, double y) {x_ = x;y_ = y;
}Vec2D::~Vec2D() {}// 将向量转换为字符串表达形式
std::string Vec2D::toString()
{// TODO: 在此处添加实现代码.return std::string("(" + std::to_string(x_) + ", "+ std::to_string(y_) + ")");
}// 向量加法
Vec2D Vec2D::add(Vec2D secondVec2D)
{// TODO: 在此处添加实现代码.return Vec2D(x_ + secondVec2D.x_ , y_ + secondVec2D.y_);
}
//与数值相加
Vec2D Vec2D::add(double num)
{// TODO: 在此处添加实现代码.return Vec2D(this->x_ + num , this->y_ + num);
}// 向量减法
Vec2D Vec2D::subtract(Vec2D secondVec2D)
{// TODO: 在此处添加实现代码.return Vec2D(x_ - secondVec2D.x_ , y_ - secondVec2D.y_);
}
// 向量减数
Vec2D Vec2D::subtract(double num)
{// TODO: 在此处添加实现代码.return Vec2D(this->x_ - num , this->y_ - num);
}// 向量点积
double Vec2D::dot(Vec2D secondVec2D)
{// TODO: 在此处添加实现代码.return (x_ * secondVec2D.x_ + y_ * secondVec2D.y_);
}// 向量数乘
Vec2D Vec2D::multiply(double multiplier)
{// TODO: 在此处添加实现代码.return Vec2D(x_ * multiplier ,y_ * multiplier);
}// 向量求负值
Vec2D Vec2D::negative()
{// TODO: 在此处添加实现代码.return Vec2D( -x_ , -y_);
}// 向量自增1
Vec2D& Vec2D::increase()
{x_++;y_++;// TODO: 在此处添加实现代码.return (*this);
}// 向量自减1
Vec2D& Vec2D::decrease()
{x_--;y_--;// TODO: 在此处添加实现代码.return (*this);
}// 求向量的范数(长度)
double Vec2D::magnitude()
{// TODO: 在此处添加实现代码.return sqrt(x_ * x_ + y_ * y_);
}// 求Vec2D与x+轴的夹角
double Vec2D::direction()
{// TODO: 在此处添加实现代码.return atan(y_ / x_);
}// 比较两个向量的长度。如果firstVec2D小于secondVec2D,返回-1,若大于则返回1,若相等则返回0
int Vec2D::compareTo(Vec2D secondVec2D)
{// TODO: 在此处添加实现代码.double m1 = this->magnitude();double m2 = secondVec2D.magnitude();if(abs(m1 - m2) < 1e-10)return 0;elsereturn (m1 > m2 ? 1 : -1);
}// 读取或修改向量元素
double& Vec2D::at(const int index)
{if( 0 == index)return x_;else if(1 == index)return y_;//使用异常处理的方式,抛出异常,并且打印携带信息elsethrow std::out_of_range("at() only accept 1 or 2 as parameter");// TODO: 在此处添加实现代码.// TODO: 在此处插入 return 语句
}

main.cpp

#include <iostream>
#include "Vec2D.h"
using std::cout;
using std::endl;int main()
{//创建向量对象Vec2D v1{ 3,5 }, v2{ 4,6 };//向量转为字符串cout << "v1 = " << v1.toString() << endl;cout << "v2 = " << v2.toString() << endl;//向量加法: 向量 + 向量 ,向量 + 数Vec2D v3 = v1.add(v2);Vec2D v4 = v3.add(10.0);cout << "v2 = " << v3.toString() << endl;cout << "v3 = " << v4.toString() << endl;//向量减法,向量点积,向量数乘Vec2D v5 = v2.subtract(v1);double v6 = v2.dot(v1);					//两个向量的点积是一个数Vec2D v7 = v3.multiply(2.1);cout << "v2 - v1 = " << v5.toString() << endl;cout << "v2 * v1 = " << v6 << endl;cout << "v3 * 2.1 = " << v7.toString() << endl;//向量求负值Vec2D v8 = v2.negative();cout << "-v2 = " << v8.toString() << endl;//向量自增/自减cout << " ++v8 = " << v8.increase().toString() << endl;cout << " --v2 = " << v2.decrease().toString() << endl;//读取或者修改向量元素cout << "v1.x_ = " << v1.at(0) << endl;cout << "v1.y_ = " << v1.at(1) << endl;//向量的长度magnitude 和角度directioncout << "v1.magnitude = " << v1.magnitude() << endl;cout << "v1.direction = " << v1.direction() << endl;//比较两个向量cout << "v1 compare v2 :" << v1.compareTo(v2) << endl;return 0;
}

5、最终结果

v1 = (3.000000, 5.000000)
v2 = (4.000000, 6.000000)
v2 = (7.000000, 11.000000)
v3 = (17.000000, 21.000000)
v2 - v1 = (1.000000, 1.000000)
v2 * v1 = 42
v3 * 2.1 = (14.700000, 23.100000)
-v2 = (-4.000000, -6.000000)
++v8 = (-3.000000, -5.000000)
–v2 = (3.000000, 5.000000)
v1.x_ = 3
v1.y_ = 5
v1.magnitude = 5.83095
v1.direction = 1.03038
v1 compare v2 :0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/377579.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Keilc的中断号计算方法

中断号码 (中断向量-3)/8转载于:https://www.cnblogs.com/yuqilihualuo/p/3423634.html

md5模式 签名_MD的完整形式是什么?

md5模式 签名医师&#xff1a;医学博士/常务董事 (MD: Doctor of Medicine / Managing Director) 1)医学博士&#xff1a;医学博士 (1) MD: Doctor of Medicine) MD is an abbreviation of a Doctor of Medicine degree. In the field of Medicine, it is the main academic de…

八、卷积层

一、Conv2d torch.nn.Conv2d官网文档 torch.nn.Conv2d(in_channels, out_channels, kernel_size, stride1, padding0, dilation1, groups1, biasTrue, padding_modezeros, deviceNone, dtypeNone) 参数解释官网详情说明in_channels输入的通道数&#xff0c;如果是彩色照片通道…

HTMl5结构元素:header

页眉header 页眉将是页面加载的第一个元素&#xff0c;包含了站点的标题、logo、网站导航等。<header> <div class"container_16"> <div class"logo"> <h1><a href"index.html"><strong>Real</st…

【C++grammar】左值、右值和将亡值

目录C03的左值和右值C11的左值和右值将亡值在C03中就有相关的概念 C03的左值和右值 通俗的理解&#xff1a; (1) 能放在等号左边的是lvalue (2) 只能放在等号右边的是rvalue (3) lvalue可以作为rvalue使用 对于第三点可以举个例子&#xff1a; int x ; x 6; //x是左值&#…

scala字符串的拉链操作_在Scala中对字符串进行操作

scala字符串的拉链操作Scala字符串操作 (Scala strings operation) A string is a very important datatype in Scala. This is why there are a lot of operations that can be done on the string object. Since the regular operations like addition, subtraction is not v…

九、池化层

一、Pooling layers Pooling layers官网文档 MaxPool最大池化层下采样 MaxUnpool最大池化层上采样 AvgPool最大池化层平均采样 例如&#xff1a;池化核为(3,3)&#xff0c;输入图像为(5,5)&#xff0c;步长为1&#xff0c;不加边 最大池化就是选出在池化核为单位图像中的最大…

[分享]SharePoint移动设备解决方案

老外写的一个PPT&#xff0c;讲SharePoint在移动领域的应用&#xff0c;2012年最新的&#xff0c;有iPad哟。/Files/zhaojunqi/SharePoint2010andMobileDevices.pdf 转载于:https://www.cnblogs.com/zhaojunqi/archive/2012/04/12/2444712.html

十、非线性激活函数

一、ReLU torch.nn.ReLU(inplaceFalse)官网提供的API 其中inplace表示是否在对原始数据进行替换 由函数图可以看出&#xff0c;负数通过ReLU之后会变成0&#xff0c;正数则不发生变化 例如&#xff1a;input -1&#xff0c;若inplace True&#xff0c;表示对原始输入数据进…

最短公共子序列_最短公共超序列

最短公共子序列Problem statement: 问题陈述&#xff1a; Given two strings, you have to find the shortest common super sequence between them and print the length of the super sequence. 给定两个字符串&#xff0c;您必须找到它们之间最短的公共超级序列&#xff0c…

单调栈 leetcode整理(二)

目录为什么单调栈的时间复杂度是O(n)496. 下一个更大元素 I方法一&#xff1a;暴力方法二:单调栈哈希表739. 每日温度单调栈模版解优化503. 下一个更大元素 II单调栈循环遍历为什么单调栈的时间复杂度是O(n) 尽管for 循环里面还有while 循环&#xff0c;但是里面的while最多执…

Android中引入第三方Jar包的方法(java.lang.NoClassDefFoundError解决办法)

ZZ&#xff1a;http://www.blogjava.net/anchor110/articles/355699.html1、在工程下新建lib文件夹&#xff0c;将需要的第三方包拷贝进来。2、将引用的第三方包&#xff0c;添加进工作的build path。3、&#xff08;关键的一步&#xff09;将lib设为源文件夹。如果不设置&…

QTP自传之web常用对象

随着科技的进步&#xff0c;“下载-安装-运行”这经典的三步曲已离我们远去。web应用的高速发展&#xff0c;改变了我们的思维和生活习惯&#xff0c;同时也使web方面的自动化测试越来越重要。今天&#xff0c;介绍一下我对web对象的识别&#xff0c;为以后的对象库编程打下基础…

leetcode中使用c++需要注意的点以及各类容器的初始化、常用成员函数

目录1、传引用2、vector使用初始化方法常用成员函数3、字符串string初始化方法常用成员函数4、哈希表 unordered_map初始化常用成员函数示例&#xff1a;计数器5、哈希集合 unordered_set初始化常用成员函数6、队列 queue初始化成员函数7、栈stack初始化常用成员函数7、emplace…

Linq list 排序,Dictionary 排序

C# 对List成员排序的简单方法 http://blog.csdn.net/wanzhuan2010/article/details/6205884 LINQ之路系列博客导航 http://www.cnblogs.com/lifepoem/archive/2011/12/16/2288017.html 用一句Linq把一个集合的属性值根据条件改了&#xff0c;其他值不变 list去重 list.Where((x…

javascript Ajax 同步请求与异步请求的问题

先来看以下代码&#xff1a; var flagtrue; var index0; $.ajax({url: "http://www.baidu.com/",success: function(data){flagfalse;} }); while(flag){index; } alert(index); 请问最后alert的index的结果是多少&#xff1f; 可能有人会说0呗。实际上却没那么简单…

定义类的Python示例

The task to define a class in Python. 在Python中定义类的任务。 Here, we are defining a class named Number with an attribute num, initializing it with a value 123, then creating two objects N1 and N2 and finally, printing the objects memory locations and a…

十一、线性层

一、Linear Layers torch.nn.Linear(in_features, out_features, biasTrue, deviceNone, dtypeNone) 以VGG神经网络为例&#xff0c;Linear Layers可以将特征图的大小进行变换由(1,1,4096)转换为(1,1,1000) 二、torch.nn.Linear实战 将CIFAR-10数据集中的测试集二维图像[6…

easyui plugin——etreegrid:CRUD Treegrid

昨天写了一个koeasyui的同样的实现&#xff0c;感觉写的太乱&#xff0c;用起来十分麻烦&#xff0c;于是今天照着edatagrid&#xff0c;写了一个etreegrid&#xff0c;这样再用ko绑定就方便多了。 使用很简单,$(tableId).etreegrid({idField:parentIdField:,treeField:,saveUr…

expr

expr在linux中 是一个功能非常强大的命令。通过学习做一个小小的总结。 1、计算字符串的长度。我们可以用awk中的length(s)进行计算。我们 也可以用echo中的echo ${#string}进行计算&#xff0c;当然也可以expr中的expr length $string 求出字符串的长度。举 例[rootlocalhost …