順序結構是程式設計中最基礎、最直觀的結構——指令按編寫順序依次執行,無跳轉、無判斷。雖然簡單,但掌握好「輸入→計算→輸出」的標準流程、數學公式的程式碼轉換、庫函數的正確使用,是所有複雜程式的基石。本文通過兩個經典數學問題,演示完整的順序結構程式開發流程。
輸入三角形三邊長 a、b、c,計算面積。海倫公式:
s = (a + b + c) / 2(半周長)
area = √[s(s-a)(s-b)(s-c)]
- #include <stdio.h>
- #include <math.h>
- int main(void){
- float a,b,c,s,area;
- scanf("%f,%f,%f",&a,&b,&c);
- s=1.0/2*(a+b+c);
- area=sqrt(s*(s-a)*(s-b)*(s-c));
- printf("a=%7.2f,b=%7.2f,c=%7.2f,s=%7.2f\n",a,b,c,s);
- printf("area=%7.2f\n",area);
- return 0;
- }
| 程式碼 | 技術要點 | 說明 |
|---|---|---|
#include <math.h> | 數學庫引入 | 使用 sqrt() 開方函數必須包含,編譯時需連結數學庫(GCC 加 -lm) |
float a,b,c,s,area; | 變數宣告 | 單精度浮點數足夠,若需高精度可改 double |
scanf("%f,%f,%f",...) | 格式化輸入 | 逗號作分隔符,輸入時需對應輸入 3,4,5 |
s=1.0/2*(a+b+c) | 強制浮點運算 | 1.0/2 避免整數除法截斷,寫成 (a+b+c)/2.0 更直觀 |
sqrt(...) | 開方運算 | 參數必須非負,實際應用需先判斷能否構成三角形 |
%7.2f | 格式化輸出 | 寬度 7,小數 2 位,右對齊,適合表格化顯示 |
// 兩邊之和大於第三邊
if (a+b>c && a+c>b && b+c>a) {
s = (a+b+c)/2.0;
area = sqrt(s*(s-a)*(s-b)*(s-c));
printf("面積: %.2f\n", area);
} else {
printf("無法構成三角形!\n");
}
求解 ax² + bx + c = 0 的根,a、b、c 由鍵盤輸入,已知判別式 Δ = b² - 4ac > 0(兩個不相等實根)。
- #include <stdio.h>
- #include <math.h>
- int main(void){
- float a,b,c,disc,x1,x2,p,q;
- scanf("a=%f,b=%f,c=%f",&a,&b,&c);
- disc=b*b-4*a*c;
- p=-b/(2*a);
- q=sqrt(disc)/(2*a);
- x1=p+q; x2=p-q;
- printf("\nx1=%5.2f\nx2=%5.2f\n",x1,x2);
- return 0;
- }
原程式碼採用「分步計算」思路:
p = -b/(2a):對稱軸位置(兩根中點)q = √Δ/(2a):兩根到中點的距離x1 = p+q, x2 = p-q:對稱求根scanf("a=%f,b=%f,c=%f",...) 要求用戶輸入 a=1,b=2,c=1,體驗差。
題目雖假設 Δ > 0,但健壯程式應完整處理三種情況。
當 b² ≫ 4ac 時,-b ± √Δ 會發生災難性抵消。
- #include <stdio.h>
- #include <math.h>
- int main(void) {
- double a, b, c; // 用 double 提高精度
- printf("請輸入 a, b, c (空格分隔): ");
- if (scanf("%lf %lf %lf", &a, &b, &c) != 3) {
- printf("輸入格式錯誤\n");
- return 1;
- }
- if (fabs(a) < 1e-12) { // a 接近 0,退化為一次方程
- if (fabs(b) < 1e-12) printf("非方程\n");
- else printf("x = %.4f\n", -c/b);
- return 0;
- }
- double disc = b*b - 4*a*c;
- if (disc > 1e-12) { // 兩個不等實根
- double sqrt_disc = sqrt(disc);
- // 數值穩定寫法:避免大數減小數
- double q = -0.5 * (b + (b > 0 ? sqrt_disc : -sqrt_disc));
- printf("x1 = %.4f, x2 = %.4f\n", q/a, c/q);
- } else if (fabs(disc) <= 1e-12) { // 兩個相等實根
- printf("x1 = x2 = %.4f\n", -b/(2*a));
- } else { // 複數根
- double real = -b/(2*a);
- double imag = sqrt(-disc)/(2*a);
- printf("x1 = %.4f + %.4fi, x2 = %.4f - %.4fi\n", real, imag, real, imag);
- }
- return 0;
- }
stdio.h (I/O)、math.h (數學)、stdlib.h (工具)double,記憶體敏感才用 floatprintf("請輸入...") + 寬鬆的 scanf 格式scanf 返回值,處理非數字輸入return 0 成功,非 0 失敗順序結構看似簡單,但「三角形面積」與「一元二次方程」兩個案例揭示了實戰中必須面對的核心課題:數學模型到程式碼的精確映射、邊界條件的完整覆蓋、數值計算的穩定性、以及用戶體驗的細節打磨。掌握這些,才能寫出不只是「能跑」,而是「健壯、精確、專業」的 C 程式。