【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.pswp.cn/news/377579.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/377579.shtml
英文地址,請注明出處:http://en.pswp.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 …