首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言順序結構程式設計經典案例精講

     編輯:關於C語言

順序結構是程式設計中最基礎、最直觀的結構——指令按編寫順序依次執行,無跳轉、無判斷。雖然簡單,但掌握好「輸入→計算→輸出」的標準流程、數學公式的程式碼轉換、庫函數的正確使用,是所有複雜程式的基石。本文通過兩個經典數學問題,演示完整的順序結構程式開發流程。

案例一:三角形面積計算(海倫公式)

問題描述

輸入三角形三邊長 a、b、c,計算面積。海倫公式:

s = (a + b + c) / 2(半周長)

area = √[s(s-a)(s-b)(s-c)]

完整原始碼

  1. #include <stdio.h>
  2. #include <math.h>
  3. int main(void){
  4. float a,b,c,s,area;
  5. scanf("%f,%f,%f",&a,&b,&c);
  6. s=1.0/2*(a+b+c);
  7. area=sqrt(s*(s-a)*(s-b)*(s-c));
  8. printf("a=%7.2f,b=%7.2f,c=%7.2f,s=%7.2f\n",a,b,c,s);
  9. printf("area=%7.2f\n",area);
  10. return 0;
  11. }

關鍵技術點解析

程式碼技術要點說明
#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(兩個不相等實根)。

完整原始碼

  1. #include <stdio.h>
  2. #include <math.h>
  3. int main(void){
  4. float a,b,c,disc,x1,x2,p,q;
  5. scanf("a=%f,b=%f,c=%f",&a,&b,&c);
  6. disc=b*b-4*a*c;
  7. p=-b/(2*a);
  8. q=sqrt(disc)/(2*a);
  9. x1=p+q; x2=p-q;
  10. printf("\nx1=%5.2f\nx2=%5.2f\n",x1,x2);
  11. return 0;
  12. }

演算法優化分析

原程式碼採用「分步計算」思路:

  • p = -b/(2a):對稱軸位置(兩根中點)
  • q = √Δ/(2a):兩根到中點的距離
  • x1 = p+q, x2 = p-q:對稱求根

⚠️ 潛在問題與改進版

問題 1:輸入格式過於嚴格

scanf("a=%f,b=%f,c=%f",...) 要求用戶輸入 a=1,b=2,c=1,體驗差。

問題 2:未處理 Δ ≤ 0 情況

題目雖假設 Δ > 0,但健壯程式應完整處理三種情況。

問題 3:數值穩定性

當 b² ≫ 4ac 時,-b ± √Δ 會發生災難性抵消。

🏆 生產級改進版

  1. #include <stdio.h>
  2. #include <math.h>
  3. int main(void) {
  4. double a, b, c; // 用 double 提高精度
  5. printf("請輸入 a, b, c (空格分隔): ");
  6. if (scanf("%lf %lf %lf", &a, &b, &c) != 3) {
  7. printf("輸入格式錯誤\n");
  8. return 1;
  9. }
  10. if (fabs(a) < 1e-12) { // a 接近 0,退化為一次方程
  11. if (fabs(b) < 1e-12) printf("非方程\n");
  12. else printf("x = %.4f\n", -c/b);
  13. return 0;
  14. }
  15. double disc = b*b - 4*a*c;
  16. if (disc > 1e-12) { // 兩個不等實根
  17. double sqrt_disc = sqrt(disc);
  18. // 數值穩定寫法:避免大數減小數
  19. double q = -0.5 * (b + (b > 0 ? sqrt_disc : -sqrt_disc));
  20. printf("x1 = %.4f, x2 = %.4f\n", q/a, c/q);
  21. } else if (fabs(disc) <= 1e-12) { // 兩個相等實根
  22. printf("x1 = x2 = %.4f\n", -b/(2*a));
  23. } else { // 複數根
  24. double real = -b/(2*a);
  25. double imag = sqrt(-disc)/(2*a);
  26. printf("x1 = %.4f + %.4fi, x2 = %.4f - %.4fi\n", real, imag, real, imag);
  27. }
  28. return 0;
  29. }

順序結構程式設計核心清單

📋 開發檢查清單

  1. 引入正確頭文件:stdio.h (I/O)、math.h (數學)、stdlib.h (工具)
  2. 選擇合適資料型別:預設用 double,記憶體敏感才用 float
  3. 友善的輸入提示:printf("請輸入...") + 寬鬆的 scanf 格式
  4. 輸入驗證:檢查 scanf 返回值,處理非數字輸入
  5. 邊界條件處理:除零、開方負數、浮點數比較用 epsilon
  6. 數值穩定性:避免大數吃小數、災難性抵消
  7. 格式化輸出:根據需求控制精度、對齊、單位
  8. 錯誤回傳碼:return 0 成功,非 0 失敗

總結

順序結構看似簡單,但「三角形面積」與「一元二次方程」兩個案例揭示了實戰中必須面對的核心課題:數學模型到程式碼的精確映射、邊界條件的完整覆蓋、數值計算的穩定性、以及用戶體驗的細節打磨。掌握這些,才能寫出不只是「能跑」,而是「健壯、精確、專業」的 C 程式。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved