第 0 章 MS-DOS 與 TURBO C 簡介

本章的 目的 是 在介紹 MS-DOS 下的環境, 以便 使用 TURBO C 來編輯 C 程式、 編譯 C 程式 及 執行 C 程式等。

如果 TURBO C 是 安裝在 路徑 \TC 下,即在 autoexec.bat 檔案的 path 中含 C:\TC;C:\TC\BIN; 或在 DOS 下輸入 指令 path 結果含 C:\TC;C:\TC\BIN; 那麼 我們可在 任何路徑下 輸入 指令 tc 或 tc file.c 進入 TURBO C。

本 章 主 要 內 容 如 下 :

至第 1 章
回 C 程式主目錄


第 0.1 節 TURBO C 簡介

在安裝 (install) TURBO C 時會 自動 在 config.sys 檔案中 設定好 file = ... 及 buffer = ..., 在 autoexec.bat 檔案中 會 設定好 path 含 C:\TC;C:\TC\BIN;

TURBO C 是一 多功能 環境,可以 編寫、修改、執行 及 除錯 C 程式。 按 RUN (ctrl+F9) 即可 執行 該程式,同時 會產生 .exe 檔。

編寫一 C 程式 時,其 副檔名 必須 是 .c,例如 lab1.c。 在編寫時 最好 過幾分鐘 就 存檔 一次,以免 當機時 資料 全失, 無法 尋回 又須 重做。執行檔 的 檔名 不可 與 DOS 內建指令 相同, 例如 type、copy 等。

按 F1 可做 線上 查尋 編寫指令。 欲 標示 一區域 以作 抄 (copy)、除 (delete)、剪 (cut) 等用時, 先 移動 游標 至 起點,然後 按著 shift 鍵 不放, 再 按著 方向鍵 如 ←、 ↑、 ↓、 → 以 作調整,選好 之後 再放掉 shift 鍵。 欲 消除 標示區域, 可移 游標 至非游標區, 再按 shift 鍵不放,再按 著方向鍵即可。

以下 為 一些 TURBO C 常用的 指令:

F1線上查尋 
F2存檔 
F6跳進下一個視窗 
F9編譯程式成為 .obj 檔 
F10進入選項模式 
Ctrl+F9執行程式 
Ctrl+Ins抄 (copy)抄至剪貼板
Ctrl+Del除(delete) 
Shift+Del剪(cut)剪至剪貼板
Shift+Ins貼 (paste)從剪貼板抄至游標處
Alt+x離開 Turbo C 

儘可能 不讓 您的 磁片 感染 電腦病毒 (使用 有版權 軟體)。

回本章主目錄


第 0.2 節 PC 硬体結構 簡介

386,486 硬体結構 基本上 可分為 中央處理單元 (Central Processing Unit ─ CPU), 主記憶體 (RAM,ROM), 副記憶體 (硬碟 HDD,磁碟片 FLOPPY DISK, 光碟 CD ROM), 輸入/輸出 (鍵盤, 螢幕, 滑鼠, 光筆, 搖桿,列表機等)。

中央處理機 基本上 含 算術/邏輯 單元 (Arithmetic Logic Unit ─ ALU)、 控制 單元 (Control Unit) 和 暫存器 (Registers)。

目前的電腦 可稱為 馮諾曼 (John Von Neumann 1903-1957) 式 電腦, 馮諾曼 以 ─ 內儲程式 ─ 的方式, 即 將程式 與 資料 (data) 一齊 存進 主記憶體, 再 依序 執行 指令 及 存取 資料, 此法 大大改良電腦的 操作 與 計算 方式。

在 算術/邏輯 單元中, 對於 整數的 運算 與 浮點數的 運算 有 截然 不同的 表示方式 與 運算方式。 因此 在 設計程式時, 我們 必須 宣告 適當的 資料 型態 (不僅有 整數 及 浮點, 還有 其它種 資料 型態) 來 處理 問題。

回本章主目錄


第 0.3 節 MS-DOS 6.2 作業系統 (Operating System) 簡介

作業系統 是 在 提供 使用者 一個 便捷的 環境 來 使用電腦, 例如 copy file1 file2, 這 指令 是 將 第一個 檔案 file1 拷貝 成 第二個 檔案 file2。 使用者 不用 操心 檔案 file1 存在 磁片 那個地方、 占有 多少空間、 主記憶體 是否有 足夠 的空間、 磁片 是否有 足夠空間、 抄寫到 何處 等問題。 作業系統 都已經 幫 使用者 處理好了。 作業系統 可以 說是 使用者 與 計算機 之間的 一個 介面, 可讓 使用者 省下 很多 時間 與 精力。

第 0.3.1 節 MS-DOS 的 檔案 系統

MS-DOS 的 檔案 系統 是 樹狀 結構, 是一 多層狀 結構, 分 目錄 (directory) 與 檔案 (file)。 一個 目錄 底下 可含 多個 子目錄 與 多個 檔案。 根目錄 沒有 名字, 為 "\" , 其餘的 目錄 都有 名字。 我們 可 由下列 DOS 指令 建立 一新目錄 : C:>md drname
指令 中的 md 即 make directory, 其後 跟著 目錄名。 目錄名 與 檔案名 的 有效 字元數 是 8 個, 一般來說, 目錄名 不加 副檔名, 檔案 是 為了 分別 其性質 而 加上 副檔名。 譬如 C 程式 都有 副檔名 .c; Pascal 程式 都有 副檔名 .pas; 批次檔 都有 .bat 等。 副檔名 的 有效 字元數 是 3。

檔案 可由 應用軟体, 如 TURBO C, DBASE III, CLIPPER, 或 PE2 等 建立, 或 由 DOS 指令, 如 copy, 輸出 轉向 (指令 C:>dir *.* >out 會將 原本 顯示 在螢幕 的 資料 存到 檔案 out, 自動 建立 一新檔 out。)

在檔案的 樹狀 結構 中, 一個 目錄 可說是 樹的內點, 檔案 是 樹葉, 因此 會產生 路徑的 問題, 即 一個 檔案 是 存在 何處 --- 是在 那個 目錄 底下 的 那個 目錄 底下...。 舉例 來說:

          \ ┬ autoexec.bat
            ├ config.sys
            ├ dos ──┬── COMMAND.COM
            │         ├── IO.SYS (隱藏式檔案)
            │         ├── MSDOS.SYS (隱藏式檔案)
            │         └── himem.sys
            ├ tc  ──┬── README
            │         ├── README.COM
            │         ├── include ─┬ stdio.h
            │         │               ├ bios.h
            │         │               └ math.h
            │         └── bin ───┬ tc.exe
            │                          └ grep.com
            └ cpg ──┬── labs───┬ lab1.c
                       │               ├ lab2.c
                       │               └ lab3.c
                       ├── examples─┬ demo1.c
                       │               └ demo2.c
                       ├── test.c
		       └── test.exe					

根目錄 \ 底下 有 子目錄 dos、 tc 和 cpg, 還有 檔案 autoexec.bat 及 config.sys。 子目錄 tc 底下 有子目錄 include、 bin 還有 檔案 README.COM 及 README。 子目錄 cpg 底下 有 子目錄 labs 及 examples, 還有 檔案 test.c、 test.obj 及 test.exe。 目錄 labs 下有 檔案 lab1.c, lab2.c 及 lab3.c。

由上圖 可知 檔案 lab1.c 是在 路徑 C:\cpg\labs 下, 所以 檔案 lab1.c 的 全名 應是 C:\cpg\labs\lab1.c 。 我們 可利用 DOS 指令 cd (change directory) 來 移動 目前 目錄 所在處。 譬如 我們 現在 位於 根目錄 下,
欲至 include 目錄, 則 鍵入 C:\>cd \tc\include
若 想要 到 labs 去, 則 鍵入 C:\>cd \cpg\labs
想 去 上一層 cpg , 可 鍵入 C:\>cd ..
再 想去 examples, 可 鍵入 C:\>cd examples
再 想回 根目錄 , 可 鍵入 C:\>cd \
或 鍵入 C:\>cd ..\..

第 0.3.2 節 MS-DOS 指令

MS-DOS 指令 架構 為: 指令 [參數] [開關]

例如, c:\>dir *.c /p 是 將 目前 目錄 下的 所有 .c 檔 依 一頁 一頁 方式 列印 在 螢幕上, 其中

下列 為 一些 常用 DOS 指令:

指令例子說明
formatformat a:將 在 drive a: 的磁碟 格式化
 format a:/s格式化 磁碟 可做為 啟動用,含
COMMAND.COM,IO.SYS及MSDOS.SYS
cdcd \cpg\labs從 目前 的 目錄 到 目錄 \cpg\labs
mdmd games在目前的目錄下開一新目錄games
rdrd test從目前 的 目錄下 清除 目錄 test
clscls清除螢幕
copycopy file1 file2複製 檔案 file1 成 file2
deldel *.bak清除 所有 .bak 檔
dirdir *.c列出 所有 *.c 檔 於螢幕
 dir *.* /w 
 dir *.* /p/o 
pathpath列印 路徑 以知 設定 環境
renren file1 files將 file1 改名為 file2
typetype file將 file 列印 在 螢幕
 type file|more將 file 列印 在 螢幕 依頁 方式列印

第 0.3.3 節 MS-DOS 如何 執行 指令

MS-DOS 的 執行檔 有 3 種: .COM、 .EXE、 .BAT。 如果 在 目前的 目錄下 有 file.COM、 file.EXE 及 file.BAT 三個檔, 鍵入 file 後 DOS 是 執行 那個檔?

如果 file 是 內建 指令 則 執行 內建指令, 不然 就 執行 file.COM。 若 沒有 file.COM 則 執行 file.EXE, 否則 執行 file.BAT。

如果 file 不是 內建 指令, 又 目前 的 目錄下 沒有 file.COM、 file.EXE 及 file.BAT 三個檔, 則 DOS 依 環境變數 PATH 中 路徑的 順序 尋找 執行檔 file, 若有 則 再按 .COM、 .EXE 及 .BAT 的順序 尋找。 若 都沒有 則 列印 出 Bad command or file name。

當 PATH 中 含 C:\TC;C:\TC\BIN; 我們 可 在 任何 目錄下 鍵入 tc file.c 以 使用 TURBO C, 又 當一個 程式 編譯 成 一執行檔 .EXE 時, 須 注意 其 主檔名 不為 內建 指令。

第 0.3.4 節 MS-DOS 輸入 及 輸出 轉向

MS-DOS 有 3 個 基本 檔案 stdin, stdout 及 stderr。 由 鍵盤 輸入 的 是 stdin, 輸出 至 螢幕 的是 stdout。 從 鍵盤 輸入 可轉為 由 一般 檔案 輸入, 例如 執行 一 C 程式 lab1.exe 需 由 鍵盤 輸入資料,我們 可 先 將 資料 存在 一檔案 如 in.txt, 執行 lab1.exe 時, 鍵入 lab1 <in.txt 即可。

輸出 至 螢幕 可 轉為 輸出 至 一般 檔案, 例如 C:\>type file,我們可 在 螢幕 看到 檔案 file 的內容, 若 鍵入 指令 C:\>type file >out, 則 輸出 至 螢幕的 資料 全 存入 檔案 out, 螢幕 也 見不到 什麼, 若 鍵入 指令 C:\>type file >>out, 則 輸出 至 螢幕 的 資料 全 附加 在檔案 out 之後。

一個 執行檔 的 輸出 可 做 另一 執行檔 的 輸入, 例如 C:\>type file | moreC:>grep file 林 | sort >out等。

回本章主目錄


第 0.4 節 程式語言

程式語言 基本上 可 分為 四類: 機器語言、 組合語言、 高階語言 及 自然語言 (普通話)。 電腦 CPU 所能 執行的 語言 是 機器語言, 機器語言 是 由 一連串的 0 與 1 所構成。 機器語言 非常 不適合 人 去 編寫、 閱讀 及 修改, 所以 有 組合語言 發展 出來, 組合語言 較容易 編寫、 閱讀 及 修改, 但是 電腦 無法 直接 執行 組合語言, 因此 需要 組合編譯器 將 組合語言 翻譯 成 機器語言。 又 組合語言 與 普通話 差太多, 因此 有 高階語言 如 Fortran、 Cobol、 Pascal 及 C 等 發展 出來。 目前 電腦 的 普通話 程式語言 仍在 研究發展中, 尚未有 成品 可供 使用, 因此 我們 仍 須 學習 高階語言 如 C 或 低階語言 以 發展 應用軟體 或 其它。

一般而言, 程式語言 是 由 程式 敘述 所構成, 其 控制 流程 可分為: 連續性、 選擇性、 迴圈性、 跳躍性等。 對 C 程式語言 而言,
選擇性 敘述 有 if-else 敘述 及 switch 敘述;
迴圈性 敘述 有 while、 for 及 do-while 敘述;
跳躍性 敘述 有 break、 continue、 return、 goto 及 函數 呼叫 等。

C 程式語言 的 敘述 有 簡單敘述 及 複合敘述 兩類, 簡單敘述 是 以 分號 ";" 做 結束。 複合敘述 是 由 括號 {} 構成, 括號 內 可填上 0 個, 1 個 或 多個 簡單敘述。 簡單敘述 約有 下列 幾種:

  1. 指派 敘述
    • 其 語法 為 : 變數 = 運算式;
    • 其 語意 為 : 將 運算式 的 值 指派 給 變數。
    • 例如 : x = y*(x+1);
    • 說明 : 若 在 執行 此 敘述 前 變數 x 與 y 的 值 都是 2, 執行後 x 的 值 變為 6, y 的 值 不變。

  2. if 敘述
    • 其 語法 為 : if ( 運算式 ) 敘述;
    • 其 語意 為 : 若 運算式 的值 不為 0 則 執行 該敘述, 否則 跳過 該 敘述。
    • 例如 : if ( x % 5 == 0 ) { printf("\n"); x = 1; }
    • 說明 : 若 變數 x 的值 是 5 (可 解釋 為 每列印 5 個) 就 跳行。

  3. if-else 敘述
    • 其 語法 為 :
      
                          if ( 運算式 ) 敘述1;
      		    else 敘述2;
      
    • 其 語意 為 : 若 運算式 的 值 不為 0 則 執行 敘述 1, 否則 執行 敘述 2。
    • 例 : if (x%2==0) x=x/2; else x=3*x+1;
    • 說明 :
      (1) x 為 偶數 則 除 2, 不然 乘 3 加 1。
      (2) 此 敘述 亦可 改寫 成 x = (x%2==0) ? x/2 : 3*x+1;

  4. if-else-if 敘述
    • 其 語法 為 :
      
                          if (運算式1) 敘述1;
      		    else if (運算式2) 敘述2;
      		    ...
      		    else 敘述n;
      
    • 其 語意 為 : 若 運算式 1 的 值 不為 0 則 執行 敘述 1, 否則, 若 運算式 2 的 值 不為 0 則 執行 敘述 2 等, 若 以上 皆非 則 執行 敘述 n。
    • 例 :
      
                    if (total>=90) total=total*1.07;
      	      else if (total>=80) total=total*1.05;
      	      else if (total>=70) total=total*1.03;
      

  5. switch 敘述
    • 其 語法 為 :
      
                          switch ( 運算式 )
      		    {  case 常數1: 敘述1; break;
      		       case 常數2: 敘述2; break;
      		       ...
      		       default:    敘述n; break;
      		    }
      
    • 其 語意 為 : 若 運算式 的 值 為 常數 1 則 執行 敘述 1, 否則, 若 運算式 的 值 為常數 2 則 執行 敘述 2 等, 若 以上 皆非 則 執行 敘述 n。
    • 例 :
                 
                    switch (c)
      	      { case 'A' : total_A++; break;
      		case 'E' : total_E++; break;
      		case 'I' : total_I++; break;
      		case 'O' : total_O++; break;
      		case 'U' : total_U++; break;
      		default  : others++;
      	      }
      

  6. while 敘述
    • 其 語法 為 : while ( 運算式 ) 敘述;
    • 其 語意 為 : 若 運算式 的 值 不為 0, 則 執行 敘述, 並且 一直 執行 該 敘述 直到 運算式 的 值 為 0。
    • 例 :
      
                          while ( x > 1 )
      		    if ( x % 2 == 0 ) x /= 2;
      		    else x = 3 * x + 1;
      
    • 說明 : 當 x 大於 1 時, 若 x 為 偶數 則 繼續 除 2, 不然 乘 3 加 1, 一直 到 x 的值 變為 1。

  7. for 敘述
    • 其 語法 為 : for (運算式1; 運算式2; 運算式3) 敘述;
    • 其 語意 為 :
      
                          運算式1;
      		    while ( 運算式2 )
      		    {	  敘述;
      			  運算式3;
      		    }
      
    • 例 :
      
                    sum = 0;
      	      for ( i = 1 ; i <= n ; i++)
      		  sum += i*i;
      
    • 說明 : 求 1 至 n 的 平方和。

  8. do-while 敘述
    • 其 語法 為:
      
                            do
      			 敘述;
      		      while( 運算式 );
      
    • 其 語意 為 : 執行 敘述 , 一直 到 運算式 的值為 0。
    • 例 :
      
                    do
      		c = getchar();
      	      while (c == ' ');
      
    • 說明 : 將空白去掉。

回本章主目錄
至第 1 章
回 C 程式主目錄