驗證三角形

2023/01/05 更新紀錄:

  1. 更正進階題 isTriangle 拼字錯誤(感謝 Josh 來信詢問!)。
  2. 部分宣告從 let 改用 const

題目來源: Alpha Camp 學期一作業
學期一終於結束了,完成了課程決定挑戰選修的期末考來驗收學習成效, JavaScript 題目一如既往地燒腦有挑戰性,從前老愛跟數讀死槓的我超開心呀!! 寫出來爆有成就感啊!!

解題工具

  1. if statement
  2. prompt() 可以接受使用者的輸入,但回傳值為字串。
  3. Number() 可以將輸入的參數轉換為數值。如果參數沒辦法被轉換成數字,則它會回傳 NaN 。

基本題

題目要求

  1. 請使用者分別輸入三角形的3個邊長
  2. 幫助使用者確認「給定的三個邊長組成的三角形,是等邊、等腰還是不等邊三角形」

解題過程

大致流程為:

  1. 請使用者分別輸入三角形的3個邊長。
  2. 判斷三角形是否成立?
  3. 如果三角形成立,則判斷三角形種類。
  4. 輸出結果。

流程虛擬碼
依照上述流程,可以將虛擬碼依照思考邏輯寫出來,方便後續編寫程式碼。

1
2
3
4
5
6
7
8
9
使用者輸入三角形邊長
IF 三角形成立(兩邊和需大於第三邊 && 兩邊差需小於第三邊)
IF 三邊等長
輸出:此為正三角形
ELSE IF 其中兩邊等長
輸出:此為等腰三角形
ELSE
輸出:此為不等邊三角形
ELSE 輸出:三角形不成立
1
2
3
4
// 請使用者輸入三角形邊長
const a = Number(prompt('請輸入第一條三角形邊長 (a)'))
const b = Number(prompt('請輸入第二條三角形邊長 (b)'))
const c = Number(prompt('請輸入第三條三角形邊長 (c)'))

接著要判斷三角形是否成立及三角形種類。
因為直接把條件全部寫進 if/else 判斷式會發現,整個判斷流程的程式碼非常冗長、不易閱讀,所以我先把判斷條件寫成 boolean 。後面整個 if/else 判斷式只要 boolean 為 True 即可。(為了變數名稱還特別跑去查英文 😅)

1
2
3
4
5
6
7
// 三角形成立規則
const isTriangle = (a + b > c) && (b + c > a) && (a + c > b) // 兩邊和需大於第三邊
&& (a - b < c) && (b - c < a) && (a - c < b) // 兩邊差需小於第三邊

// 三角形種類條件
const isEquilateralTriangle = (a === b) && (b === c) // 正三角形
const isIsoscelesTriangle = (a === b) || (b === c) || (a === c) // 等腰三角形

判斷開始
接下來只要將判斷式依照虛擬碼寫出來即可。

1
2
3
4
5
6
7
8
9
10
11
12
// 判斷開始
if (isTriangle) {
if (isEquilateralTriangle) {
console.log(`三邊長為(${a}, ${b}, ${c}),此為"正三角形"`)
} else if (isIsoscelesTriangle) {
console.log(`三邊長為(${a}, ${b}, ${c}),此為"等腰三角形"`)
} else {
console.log(`三邊長為(${a}, ${b}, ${c}),此為"不等邊三角形"`)
}
} else {
console.log(`三邊長為(${a}, ${b}, ${c}),三角形不成立!!`)
}


進階題

題目要求

  1. 在三邊之和小於等於 20 的情況下,找出所有的等腰三角形(不含正三角形)組合。
  2. 輸出結果及等腰三角形數量

解題過程

大致流程為:

  1. 迴圈產出三角形邊長(其中兩邊等長)
  2. 判斷三角形成立
  3. 排除三邊之和大於20或正三角形
  4. 輸出結果

先寫出虛擬碼

1
2
3
4
5
6
7
8
9
10
11
12
宣告找到等腰三角形起始組數為0

for 迴圈產出等腰邊長(1 <= a <= 9)
for 迴圈產出第3邊長(1 <= c <= 9)
宣告條件變數(三角形成立 && 三邊之和大於20,並排除正三角形)
if 條件成立
輸出等腰三角形邊長
找到等腰三角形組數 +1
else 跳過
跳出迴圈
跳出迴圈
輸出找到等腰三角形的總組數

接著設定條件: 三角形成立、三邊之和大於20,並排除正三角形。

1
2
3
const isTriangle = (a + a > c) && (a + c > a) && (a + c > a)  // 兩邊和小於第三邊
&& (a - a < c) && (a - c < a) && (a - c < a) // 兩邊差大於第三邊
const isIsoscelesTriangle = (a + a + c <= 20) && (a !== c) // 三邊之和大於20,並排除正三角形

寫出 for 迴圈及判斷式

  1. 因為等腰三角形 (a === b) ,所以不另外設變數 b ,直接以 a 取代。
  2. 讓 a 、 c 從小往大迭代,避免重複情況發生。
  3. 迭代產出三邊長 (a, a, c) 後進入條件判斷。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 找到等腰三角形起始組數為0
let count = 0

// 迴圈開始
for (let a = 1; a <= 9 ; a++) {
for (let c = 1; c <= 9 ; c++) {
// 設置條件
const isTriangle = (a + a > c) && (a + c > a) && (a + c > a) // 兩邊和小於第三邊
&& (a - a < c) && (a - c < a) && (a - c < a) // 兩邊差大於第三邊
const isIsoscelesTriangle = (a + a + c <= 20) && (a !== c) // 三邊之和大於20,並排除正三角形

// 判斷開始
if (isTriangle && isIsoscelesTriangle) {
console.log(`發現等腰三角形,三邊長分別為 (${a}, ${a}, ${c}) `)
count++
}
}
}

console.log(`共找到${count}組等腰三角形!`)

文章內容如有錯誤,歡迎留言討論!


本 Blog 上的所有文章除特别聲明外,均採用 CC BY-SA 4.0 協議 ,轉載請註明出處!