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

C語言程式流程圖 (N-S 圖) 繪製指南:文件打開邏輯的結構化圖解與代碼實現

     編輯:C 語言問答

什麼是 N-S 圖 (結構化流程圖 / 箱圖)?

  • 由 Isaac Nassi 和 Ben Shneiderman 1973 年提出。
  • 使用嵌套矩形框表示三種基本控制結構:**順序、選擇 (分支)、循環**。
  • **無箭頭、無 GOTO、強制結構化** — — 直接對應結構化程式設計邏輯,比傳統流程圖更適合現代代碼設計與文檔。

三種基本結構圖形符號

結構圖形描述對應 C 語言構造
順序上下堆疊的矩形框語句 1; 語句 2; ...
選擇 (分支)主框分為左右/上下子框,條件寫在分界線上
`if-else`:雙分支
`if`:單分支 (另一側空)
`if (cond) { ... } else { ... }`
`switch (expr) { case ... }`
循環主框頂部標註循環條件,主體在下方
`while`:頂部判斷
`do-while`:底部判斷 (N-S 圖通常統一頂部判斷,註明類型)
`for`:初始化/條件/迭代在頂部標註
`while (cond) { ... }`
`do { ... } while (cond);`
`for (init; cond; iter) { ... }`

案例:文件打開與處理邏輯 N-S 圖設計

需求描述

  1. 嘗試以唯讀模式打開文件 `"data.txt"`。
  2. 若文件不存在,則以寫入模式創建並寫入初始數據。
  3. 若打開/創建成功,讀取文件內容並處理 (如計算行數)。
  4. 最後關閉文件,返回處理結果。

N-S 圖文字表示 (可用繪圖工具畫出)


┌─────────────────────────────────────────────────────┐
│  函數: process_file()                                │
├─────────────────────────────────────────────────────┤
│  [順序] FILE *fp = NULL; int line_count = 0;        │
├─────────────────────────────────────────────────────┤
│  [選擇] fp = fopen("data.txt", "r")                  │
│  ┌─────────────────────┬─────────────────────────┐   │
│  │  是 (fp != NULL)    │  否 (fp == NULL)        │   │
│  ├─────────────────────┼─────────────────────────┤   │
│  │  [順序]             │  [順序]                 │   │
│  │  // 唯讀打開成功    │  fp = fopen("data.txt", │   │
│  │                     │           "w")          │   │
│  │                     │  [選擇] fp != NULL       │   │
│  │                     │  ┌──────┬──────┐        │   │
│  │                     │  │ 是   │ 否   │        │   │
│  │                     │  ├──────┼──────┤        │   │
│  │                     │  │寫入初│ 返回 │        │   │
│  │                     │  │始數據│ 錯誤 │        │   │
│  │                     │  │      │ 碼   │        │   │
│  │                     │  └──────┴──────┘        │   │
│  └─────────────────────┴─────────────────────────┘   │
├─────────────────────────────────────────────────────┤
│  [選擇] fp != NULL (統一入口)                         │
│  ┌─────────────────────┬─────────────────────────┐   │
│  │  是                 │  否                     │   │
│  ├─────────────────────┼─────────────────────────┤   │
│  │  [循環] while       │  [順序] return -1;      │   │
│  │  (fgets(buf,...))   │  // 打開/創建失敗       │   │
│  │  ┌───────────────┐  │                         │   │
│  │  │ [順序]        │  │                         │   │
│  │  │ line_count++  │  │                         │   │
│  │  │ // 其他處理   │  │                         │   │
│  │  └───────────────┘  │                         │   │
│  └─────────────────────┴─────────────────────────┘   │
├─────────────────────────────────────────────────────┤
│  [順序] fclose(fp);                                   │
├─────────────────────────────────────────────────────┤
│  [順序] return line_count;                            │
└─────────────────────────────────────────────────────┘

對應 C 代碼實現


#include 
#include 
#include 

/* 返回文件行數,失敗返回 -1 */
int process_file(void) {
    FILE *fp = NULL;
    int line_count = 0;
    char buffer[1024];

    /* 1. 嘗試唯讀打開 */
    fp = fopen("data.txt", "r");

    /* 2. 若不存在,創建並寫入初始數據 */
    if (fp == NULL) {
        fp = fopen("data.txt", "w");
        if (fp == NULL) {
            perror("Failed to create data.txt");
            return -1; // 創建失敗
        }
        /* 寫入初始數據 (示例) */
        fprintf(fp, "Initial line 1\n");
        fprintf(fp, "Initial line 2\n");
        fprintf(fp, "Initial line 3\n");
        /* 刷新緩衝區確保寫入磁盤,以便後續讀取 */
        fflush(fp);
        /* 重新定位到文件開頭以便讀取 */
        rewind(fp);
    }

    /* 3. 讀取並處理 (計算行數) */
    while (fgets(buffer, sizeof(buffer), fp) != NULL) {
        line_count++;
        /* 這裡可添加其他處理邏輯:解析、過濾、統計等 */
    }

    /* 4. 檢查讀取錯誤 (非 EOF) */
    if (ferror(fp)) {
        perror("Error reading file");
        fclose(fp);
        return -1;
    }

    /* 5. 關閉文件 */
    fclose(fp);

    return line_count;
}

int main(void) {
    int lines = process_file();
    if (lines >= 0) {
        printf("File processed successfully. Line count: %d\n", lines);
    } else {
        printf("File processing failed.\n");
    }
    return 0;
}

N-S 圖繪製工具推薦

  • 在線/輕量:ProcessOn、draw.io、PlantText (PlantUML)。
  • 專業/桌面:Microsoft Visio、EdrawMax、StarUML、Visual Paradigm。
  • 代碼生成:部分 IDE (如 Visual Studio 類圖) 可反向生成,但 N-S 圖較少直接支援,PlantUML 可用 `skinparam` 自定義樣式模擬。

N-S 圖 vs 傳統流程圖 vs 程式碼

維度N-S 圖傳統流程圖程式碼
結構化強制✅ 天然結構化❌ 允許任意跳轉✅ 語法強制
可讀性 (高層邏輯)✅ 極佳,一眼看到巢狀結構⚠️ 箭頭交叉難閱讀✅ 細節最豐富
繪製/維護成本⚠️ 手繪難,工具支援少✅ 工具豐富✅ 即代碼本身
適用階段設計階段/文檔/教學/審查舊系統遷移/簡單流程實現/維護/除錯

總結

  • N-S 圖以嵌套矩形框強制表達順序/選擇/循環三大結構,是結構化程式設計的視覺化語言。
  • 文件打開邏輯包含巢狀選擇 (打開失敗→創建→創建失敗處理) 和循環讀取,N-S 圖能清晰展示層級關係。
  • 實際開發中,**代碼即最佳文檔**。N-S 圖適合架構設計評審、複雜演算法文檔、教學示範、舊代碼重構理解等場景。
  • 掌握從 N-S 圖直接轉寫結構化代碼的能力,是從「寫代碼」進階到「設計程式」的關鍵技能。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved