iT邦幫忙

2022 iThome 鐵人賽

DAY 3
0
自我挑戰組

C++30日挑戰之旅系列 第 3

DAY3 C++遇上數學運算的火花

  • 分享至 

  • xImage
  •  

題目:

輸入三角形3邊長,輸出三角形面積


解法:

#include<iostream>
#include<cmath>
using namespace std;

int main()
{
    float a, b, c;
    cin >> a >> b >> c;
    float s = (a + b + c) / 2;

    cout << sqrt(s * (s - a) * (s - b) * (s - c));//輸出結果
}

詳細解釋與介紹:

第一部分:

今天馬上就用到昨天教到的#include<要引入的標頭檔>來引入數學函式了!

#include<cmath>

在這個cmath標頭檔中,包含了許多常見的數學函式庫(詳細資料參見https://docs.microsoft.com/zh-tw/cpp/standard-library/cmath?view=msvc-170),而我們在這題當中要使用的,便是sqrt()的功能,也就是開根號!

第二部分: 主功能解析

在這題的題目中我們可以清楚地分為

input:三角形的三邊
output:三角形的面積

既然需要使用者輸入三個不同的邊長,那我們就得先定義三個變數,也就是這裡的a,b,c,因為題目沒有限制其"必為整數",故在此我們使用float浮點數的方式去定義三個變數

因為他們是同一種類的變數,所以我們可以將他們以逗號的方式區隔,寫在同一行內。這樣的寫法就不用再分開寫作三行(見下圖),就可以用一行達成三個變數的型態設置了!

//(a)
float a;
float b;
float c;

//(b)
float a, b, c;

//(a)和(b)是一樣的意思

在這裡我們也介紹一下在C++裡,我們表示"註解"(想給自己或專案的partner看的解釋,而不是寫給程式執行用的文字)的方式~ 在C++中,只要"單行文字"最前面有//要註解的文字或是在>=一行文字的前後具有/*要註解的文字*/,程式就會自動跳過該行或該段文字,且註解的顏色也會變得與程式碼不同

//這是單行註解

/*這是
多行註解*/

回到題目,我們使用cin輸入的方式(左右的順序代表使用者輸入的順序),若使用者輸入一個數字按下enter(或將三個數字以空格相鄰再按下enter),則該值就會依序帶入a,b,與c。同理,我們用寫在一起的方式代替分為三行書寫

//(a)
cin >> a >> b >> c;

//(b)
cin >> a;
cin >> b;
cin >> c;

//(a)和(b)是一樣的意思

我們由海龍公式
https://ithelp.ithome.com.tw/upload/images/20220904/20151593ldEXOdPIGu.png
得知我們需要一個s為(邊長總和)/2,並輸出結果。而這裡我們便可以在宣告變數的同時,給予其數學值float s = (a + b + c) / 2;,並以這個新的變數s方便我們輸出執行結果

(若是不令變數s便直接以cout的方式也可以達成,只是在運算符號多時很容易讓自己出錯,而分開的假設未知數也有助於我們在debug時更為容易知道在哪裡出錯!)

cout << sqrt(s * (s - a) * (s - b) * (s - c));//輸出結果

在輸出的部分,我們可以看到結果有許多括號包圍,而程式中也遵循著數學定理,有括號的部分會先運算,且先乘除後加減。但要注意,在程式的數學式裡只會有小括號()的存在!不論包了多少層運算也都一樣!因為中括號[]與大括號{}都分別代表著其他含意,所以不可以亂使用喔!最後我們使用到前面提到的sqrt()根號函式,最外圈的()就代表了根號函式所執行的範圍。這樣在按下執行後,就可以得到三角形的面積了~

當我分別輸入了邊長為10的正三角形,則得到面積為43.3013
https://ithelp.ithome.com.tw/upload/images/20220904/201515937JgkiQnaxB.png

大家回去也可以再自己用程式玩一玩其他的數學式子!那我們明天再見囉~

參考資料:

  1. https://zh.wikipedia.org/zh-tw/%E6%B5%B7%E4%BC%A6%E5%85%AC%E5%BC%8F

上一篇
DAY2 用HelloWorld窺探程式基本架構
下一篇
DAY4 時間轉換的方法與C++餘數介紹
系列文
C++30日挑戰之旅43
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言