| 導購 | 订阅 | 在线投稿
分享
 
 
 

Turbo C 程序設計初步

2008-06-01 02:07:27  編輯來源:互聯網  简体版  手機版  移動版  評論  字體: ||

本節主要介紹Turbo C程序設計的基本步驟及如何編譯、調試和運行源程序。並給出Turbo C的常用編輯命令。最後介紹Turbo C編譯、連接和運行時的常見錯誤。 一、Turbo C程序設計基本步驟 程序設計方法包括三個基本步驟:

第一步: 分析問題。

第二步: 畫出程序的基本輪廓。

第三步: 實現該程序。

3a. 編寫程序

3b. 測試和調試程序

3c. 提供數據打印結果

下面, 我們來說明每一步的具體細節。

第一步: 分析問題

在這一步, 你必須:

a. 作爲解決問題的一種方法, 確定要産生的數據(輸出)。 作爲這一子步的一部分, 你應定義表示輸出的變量。

b. 確定需産生輸出的數據(稱爲輸入), 作爲這一子步的一部分, 你應定義表示輸入的變量。

c. 研制一種算法, 從有限步的輸入中獲取輸出。 這種算法定義爲結構化的順序操作, 以便在有限步內解決問題。就數字問題而言, 這種算法包括獲取輸出的計算, 但對非數字問題來說, 這種算法包括許多文本和圖象處理操作。

第二步: 畫出程序的基本輪廓

在這一步, 你要用一些句子(僞代碼)來畫出程序的基本輪廓。每個句子對應一個簡單的程序操作。對一個簡單的程序來說, 通過列出程序順序執行的動作,便可直接産生僞代碼。然而, 對複雜一些的程序來說, 則需要將大致過程有條理地進行組織。對此, 應使用自上而下的設計方法。

當使用自上而下的設計方法時, 你要把程序分割成幾段來完成。列出每段要實現的任務, 程序的輪廓也就有了, 這稱之爲主模塊。當一項任務列在主模塊時,僅用其名加以標識, 並未指出該任務將如何完成。這方面的內容留給程序設計的下一階段來討論。將程序分爲幾項任務只是對程序的初步設計。整個程序設計歸結爲下圖所示的流程圖1.。

┏━━━━━━━━━━━━━━━┓

┃ 主模塊 ┃

┏━━━━━━━┓ ┃ 輸入數據 ┃

┃ 主模塊 ┃ ┃ 計算購房所需的金額 ┃

┃ ┃ ┃ 計算裝修所需的金額 ┃

┃ 任務1 ┃ ┃ 計算總金額 ┃

┃ 任務2 ┃ ┃ 輸出計算結果 ┃

┃ 任務3 ┃ ┃ ┃

┃ 任務4 ┃ ┗━━━━━━━┳━━━━━━━┛

┃ ┃ ┏━━━━━┳━━━━━╋━━━━┳━━━━━┓

┃ ┃ ┏━━┻━┓┏━━┻━┓┏━━┻━┓┏━┻━┓┏━━┻━┓

┗━━━━━━━┛ ┃輸入數據┃┃購房額..┃┃裝修額..┃┃總額..┃┃輸出結果┃

┗━━━━┛┗━━━━┛┗━━━━┛┗━━━┛┗━━━━┛

圖1. 程序初步設計 圖2. 第二級程序設計

假如把主模塊的每項任務擴展成一個模塊, 並根據子任務進行定義的話, 那麽, 程序設計就更爲具體了(見圖2.)。這些模塊稱爲主模塊的子模塊。程序中許多子模塊之間的關系可象圖2.中那樣歸結爲一張圖。這種圖稱爲結構圖。

要畫出模塊的輪廓, 你可不考慮細節。假如這樣的話, 你必須使用子模塊,將各個模塊求精, 達到第三級設計。繼續這一過程, 直至說明程序的全部細節。

這一級一級的設計過程稱爲逐步求精法。在編寫程序之前, 對你的程序進行逐步求精, 對你來說, 是很好的程序設計實踐, 會使你養成良好的設計習慣。

我們則才描述了程序設計中自上而下的設計方法。實際上就是說, 我們設計程序是從程序的"頂部"開始一直考慮到程序的"底部"。

第三步: 實現該程序

程序設計的最後一步是編寫源碼程序。 在這一步, 把模塊的僞代碼翻譯成Turbo C語句。

對于源程序, 你應包含注釋方式的文件編制, 以描述程序各個部分做何種工作。此外, 源程序還應包含調試程序段, 以測試程序的運行情況, 並答應查找編程錯誤。一旦程序運行情況良好, 可去掉調試程序段, 然而, 文件編制應做爲源程序的固定部分保留下來, 便于你或其他人維護和修改。

二、源程序的輸入、編譯和運行

C語言是一種中級語言, 用戶用C語言編寫的程序稱爲源程序, 存放用C 語言所寫源程序文件名字最後的兩個字符一般必須爲".c"。計算機硬件不能直接執行源程序, 必須將源程序翻譯成二進制目標程序。翻譯工作是由一個程序完成的,這個程序稱爲編譯程序, 翻譯的過程稱爲編譯, 編譯的結果稱爲目標程序, 存放目標程序文件名字緊後的字符一般爲".OBJ"或".O"。程序翻譯成目標程序後, 便可進行連接。"連接"的目的是使程序變成在計算機上可以執行的最終形式。在這一階段, 從系統程序庫來的程序要與目標程序連接, 連接的結果稱爲執行程序,存放執行程序文件名字一般以".EXE"結尾。

在Turbo C集成開發環境中建立一個新程序通常有以下幾個步驟:

(1). 在編輯器中編寫源文件。

(2). 生成可執行文件。

在DOS提示符下鍵入TC, 即可進入Turbo C了。進入主TC屏後, 按F3鍵, 即可在隨之出現的框中輸入文件名, 文件名可以帶".C"也可以不帶( 此時系統會自動加上)。輸入文件名後, 按回車, 即可將文件調入, 假如文件不存在, 就建立一個新文件(也可用下面例子中的方法輸入文件名)。系統隨之進入編輯狀態。就可以輸入或修改源程序了, 源程序輸入或修改完畢以後, 按Ctrl+F9(同時按下Ctrl鍵和F9鍵), 則立即進行編譯、連接和執行, 這三項工作是連續完成的。

下面我們試著建立一個Turbo C名爲"HELLO.C"的源程序(因程序很小, 這裏就不畫出該程序的輪廓圖了):

1. 操作步驟:

(1). 將系統置于DOS提示符下:

(2). 鍵入命令:

tc hello.c

使系統進入Turbo C集成開發環境, 並建立一個名爲HELLO.C的文件。這時, 系統進入Turbo C編輯環境。

(3). 通過鍵盤輸入程序, 例如:

main()

{

printf("Hello, world\n");

}

則程序進入計算機存貯器。

2. 程序存盤

爲防止意外事故丟失程序, 最好將輸入的程序存貯到磁盤中。在編輯窗口下,可直接按F2鍵或按F10鍵, 再按F鍵進入File菜單項, 再按S或W鍵將文件存盤。存盤時屏幕最底行會顯示:

"saving edit file"

3. 編譯一個程序

對源程序進行編譯有兩種方法: (1). 直接按Alt+F9即可。(2). 按F10 鍵返回主菜單, 選擇Compile項, 屏幕顯示Compile 下拉菜單, 從下拉菜單中選擇Compile to .OBJ項, 按回車鍵。

進入編譯狀態後, 屏幕會出現一個編譯窗口, 幾秒鍾後, 屏幕顯示一閃爍信息:

SUCcess: press any key

表示編譯成功。此時可按任意鍵, 編譯窗口消失, 光標返回主菜單。假如編譯時産生警告Warning或出錯Error信息, 這些具體錯誤信息會顯示在屏幕下部的信息窗中, 必須糾正這些錯誤。對源程序進行修改, 重新進行編譯。

4. 運行程序

源程序經編譯無誤後, 可以投入運行。具體操作如下:

(1). 假如當前還在編輯狀態, 可按Alt+R, 再選擇RUN項即可。

(2). 按Ctrl+F9。

程序投入運行時, 屏幕會出現一個連接窗口, 顯示Turbo C 正在連接和程序所需的庫函數。連接完畢後, 會出現屏幕忽然一閃, 後又回到TC主屏幕, 發生了什麽? 讓我們按Alt+F5看看, 此時屏幕被清除, 在頂部顯示"Hello, world"字樣。再按任意鍵, 即可又回到TC主屏幕。

5. 列磁盤文件目錄

現在請按Alt+X退出Turbo C, 返回DOS提示符, 鍵入dir hello.*, 回車, 則屏幕顯示:

HELLO C 42 1-09-93 10:18

HELLO OBJ 221 1-09-93 10:22

HELLO EXE 4486 1-09-93 10:25

...

第一個文件HELLO.C是源文件文本, 在DOS提示符下鍵入TYPE HELLO.C命令,可在屏幕上顯示該文件的內容。可看到該程序只有42個字節。

第二個文件HELLO.OBJ是Turbo C編擇程序産生的二進制機器指令(目標碼),假如用DOS命令TYPE顯示該文件, 屏幕可能會出現混亂的信息。

第三個文件HELLO.EXE是Turbo C連接程序産生的實際可執行文件。在DOS 提示符下鍵入HELLO並按回車, 屏幕將顯示"Hello, world"。

Turbo C 常用的編輯命令

Turbo C編輯程序大約有50條命令, 用以移動光標, 按頁查看正文, 查找並替換字符串等。如下表所示。

表1. Turbo C編輯程序命令

━━━┳━━━━━━━━━┳━━━━━━━━━━━━━

類別 ┃ 功能 ┃ 默認鍵

━━━╋━━━━━━━━━╋━━━━━━━━━━━━━

┃ 字符左 ┃ Ctrl+S或Left

基 ┃ 字符右 ┃ Ctrl+D或Right

本 ┃ 字左 ┃ Ctrl+A

光 ┃ 字右 ┃ Ctrl+F

標 ┃ 上行 ┃ Ctrl+E或Up

移 ┃ 下行 ┃ Ctrl+X或Down

動 ┃ 上滾 ┃ Ctrl+W

命 ┃ 下滾 ┃ Ctrl+Z

令 ┃ 上一頁 ┃ Ctrl+R或PgUp

┃ 下一頁 ┃ Ctrl+C或PgDn

━━━╋━━━━━━━━━╋━━━━━━━━━━━━━

快 ┃ 行頭 ┃ Ctrl+QS或Home

速 ┃ 行尾 ┃ Ctrl+QD或End

光 ┃ 窗口頭 ┃ Ctrl+QE

標 ┃ 窗口底 ┃ Ctrl+QX

移 ┃ 文件頭 ┃ Ctrl+QR

動 ┃ 文件尾 ┃ Ctrl+QC

命 ┃ 塊頭 ┃ Ctrl+QB

令 ┃ 塊尾 ┃ Ctrl+QK

┃ 上次光標位置 ┃ Ctrl+QP

━━━╋━━━━━━━━━╋━━━━━━━━━━━━━

輸 ┃ 插入模式 ┃ Ctrl+V或Ins

入 ┃ 插入行 ┃ Ctrl+N

與 ┃ 刪除行 ┃ Ctrl+Y

刪 ┃ 刪除至行尾 ┃ Ctrl+QY

除 ┃ 刪除光標左邊字符┃ Ctrl+H或Backspace

命 ┃ 刪除光標處字符 ┃ Ctrl+G或Del

令 ┃ 刪除光標右邊字符┃ Ctrl+T

━━━╋━━━━━━━━━╋━━━━━━━━━━━━━

┃ 標記塊首 ┃ Ctrl+KB

┃ 標記塊尾 ┃ Ctrl+KK

┃ 標記單個字 ┃ Ctrl+KT

塊 ┃ 複制塊 ┃ Ctrl+KC

命 ┃ 刪除塊 ┃ Ctrl+KY

令 ┃ 塊取消 ┃ Ctrl+KH

┃ 塊移動 ┃ Ctrl+KV

┃ 讀塊 ┃ Ctrl+KR

┃ 寫塊 ┃ Ctrl+KW

━━━╋━━━━━━━━━╋━━━━━━━━━━━━━

┃ 異常結束操作 ┃ Ctrl+U或Ctrl+Break

┃ 制表 ┃ Ctrl+L或Tab

其 ┃ 自動縮進 ┃ Ctrl+OI

┃ 定界符配對 ┃ Ctrl+Q[或Ctrl+Q]

它 ┃ 查找 ┃ Ctrl+QF

┃ 查找並替換 ┃ Ctrl+QA

┃ 查找標記 ┃ Ctrl+QN

┃ 退出編輯 ┃ Ctrl+KQ

━━━┻━━━━━━━━━┻━━━━━━━━━━━━━

Turbo C 程序的調試

一個程序設計好了以後, 通常會有一些錯誤, 查找和修改程序中的錯誤是令人頭痛的事。Turbo C集成開發環境提供了一調試裝置, 使得這一個工作輕易了許多, 程序調試達到了編譯和運行級。

一、TC消息窗口

使用TC最好的理由之一是它答應用戶修改語法錯誤(編譯時) 和評估編譯器給出的警告。TC將編譯器和連接器發出的消息收集到一緩沖區中, 然後在消息窗口中顯示, 這樣在訪問源代碼的同時, 還能一下看到這些消息。

現將上面的HELLO.C制造一點語法錯誤, 將第一行包含語句的#去掉, 再去掉第五行printf語句中的後引號。現在程序看上去是這樣的:

include

main()

{

printf("Hello, world\n);

}

按CTRL+F9重新編譯之。編譯窗口將顯示有多少錯誤和警告: 應爲兩個錯誤, 0個警告。

當看見編譯窗口中的Press anykey提示時, 按空格鍵, 消息窗口馬上被激活,亮條出現在第一個錯誤或警告上, 這時編輯窗口中也會有一亮條--- 它標志著編譯器給出的錯誤或警告在源代碼中的相應位置。

這時可用光標鍵將消息窗口中的亮條上下移動, 注重到編輯窗口中的亮條也隨著跟蹤源代碼中錯誤發生的位置。假如將亮條置于"compile"上, 則編輯器顯示文件的最後位置。

假如消息窗口太長看不見, 可用左、右光標水平滾動消息, 爲了一次能夠多看點信息, 可按F5放大消息窗口。放大後, 編輯窗口不可見了, 因此不進行錯誤跟蹤。現在, 保持分屏模式。

爲了改正錯誤, 將消息窗口中的亮條置于第一個錯誤消息上, 回車, 光標移到編輯窗口中錯誤産生處, 注重, 編輯器狀態給出所選消息( 這在放大模式下是有用的)改正之。(將第一行拿走的#重新寫上)。

當不只一個錯誤時, 可用兩種方法來修改下一錯誤。

第一種方法和前面一樣, 按F6回到消息窗口選擇想修改的下一條消息。

第二種方法不用回到消息窗口, 只要按Alt+F8, 編譯器就會將光標移至消息窗口中列的下一個錯誤。按Alt+F7可移至前一個錯誤。

這兩種方法各有長短, 視情況而定。有時源代碼中一個愚蠢的錯誤把編譯弄糊塗了, 産生好多消息, 這時選擇修改第一條消息就使得其余的一些錯誤消息沒有什麽意義了, 這種情況發生時, 使用方法一會方便些, 一修改完第一個錯誤之後回到消息窗口, 再滾動到下一個有意義的消息上, 選擇之。在別的情況下, 按Alt+F8會方便得多。

記住, Alt+F7和Alt+F8是熱鍵, TC中無論何時均起作用。因此在消息窗口中按Alt+F8得到的不是當前亮行消息, 而是下一個消息(按Enter選擇當前消息)。

但假如沒別的編譯消息, Alt+F8就不起作用了。

注: 可以如此法選擇連接消息, 但它們不跟蹤源文件。在修改語法錯誤的過程當中, 經常需要增加、刪除正文, 編輯器是記住的, 依然能正確定位錯誤位置。

沒有必要記住行號和增加、刪除的正文行。

二、Turbo C集成調試器

一旦修改好語法錯誤之後程序編譯就沒什麽問題了, 但還是可能不按要求運行, 因爲可能有邏輯錯誤(運行錯誤)。這種錯誤跟蹤就無助于發現錯誤位置了。

TC有一個集成調試器可以跟蹤運行錯誤。通過調試器可以運行, 在斷點處暫停,檢查變量的值, 甚至可以改變之, 以看程序會有什麽反應。

Turbo C集成調試器是源程序級的調試器, 即用同你編寫程序一樣的" 語言"來控制調試器。例如, 爲了顯示數組中的一個元素的值, 可告訴調試器顯示這樣的表達式的值:

Ctrl+F4 Debug/Eavluate 計算表達式, 答應修改變量的值。

Debug/Find Function 查找函數定義, 顯示在編輯窗口中。 僅在調試時才有效。

Ctrl+F3 Debug/Call Stack 顯示調用棧, 可顯示任何函數的當前執行位置, 其方法是在調用棧中選擇相應的函數名。僅在調試時有效。

Debug/Source Debugging 控制是否答應調試: 置爲On時, 集成調試器和單獨調試器均可用 ; 置爲

Standalone時, 只能用單獨調試器調試, 雖然還能在TC中運行; 置爲None時, 在.EXE文件不置調試信息,兩種調試均不能調試。

Ctrl+F4 Break/Watch/Add Watch 增加一監視表達式。

Break/Watch/Delete Watch 刪除一監視表達式。

Break/Watch/Edit 編輯一監視表達式。

Break/Watch/Remove All 刪除所有監視表達式。

Watches

Ctrl+F8 Break/Watch/Toggle 設置或清除光標所在行的斷點。

Breakpoint

Break/Watch/Clear 刪除程序中所有斷點。

Breakpoint

Break/Watch/Next 顯示下一斷點

Breakpoint

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

表3. 調試器菜單命令及其熱鍵

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

熱鍵 菜單命令 功能

───────────────────────────────────

F5 在整屏和分屏之間放大縮小活動窗口。

Alt+F5 將顯示轉到用戶屏, 擊任意鍵返回。

F6 在編輯窗口與監視窗口或消息窗口間

切換。

Alt+F6 若編輯窗口是活動的, 轉到最近一次

裝入編輯器的文件; 若下面窗口是活

動的, 則在監視窗口和消息窗口間切換。

Ctrl+F9 Run/Run 調試運行或不調試運行程序, 必要時

編譯、連接源文件, 若編譯、 連接時

Debug/Source Debuging和O/C/C/OBJ

Debug Information爲On, 則運行程序

到斷點或程序末尾。

Project/Remove Messages 刪除消息窗口中的內容。

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

判定程序是否出錯或者爲什麽出錯是編程中最有挑戰意義的一方面。這裏建義你進行預防性設計, 具體做法爲:

(1). 將代碼寫清楚點, 應作適當縮進, 使用文字說明和描述性的變量名。

(2). 代碼應簡單, 把精力放在簡單語句中的複雜表達式, 而不是一些複雜語句。Turbo C的代碼優化機制將大大提高代碼的效率, 而且調試、閱讀、 修改起來輕易。

(3). 盡量用目的簡單、好定義的函數構建程序。 這會便于編制調試程序和分析結果, 而且閱讀、修改起來也要輕易一些。

(4). 應盡量減少各個函數要求的數據和改變數據的元素個數。 這也會便于編制測試程序和分析結果; 同樣便于閱讀、修改程序。並且還限制了出錯函數可能造成的巨大混亂的牽涉面, 便得能在一個調試節中多運行函數幾次。

(5). 要留心編寫程序中的公共函數, 或者說在其它程序中可再用的函數。

編寫、調試一個一般性的函數通常要比編寫、調試兩個或更多的非凡函數要輕易。

Turbo C編譯、連接和運行時的常見錯誤

一、編譯時的常見錯誤

1. 數據類型錯誤。此類錯誤是初學者編程時的常見現象, 下面是一些要引起注重的錯誤:

(1) 所有變量和常量必須要加以說明。

(2) 變量只能賦給相同類型的數據。

(3) 對scanf()語句, 用戶可能輸入錯誤類型的數據項, 這將導致運行時出錯, 並報出錯信息。爲避免這樣的錯誤出現, 你就提示用戶輸入正確類型的數據。

(4) 在執行算術運算時要注重:

a. 根據語法規則書寫雙精度數字。要寫0.5, 而不是寫.5; 要寫1.0,而不是1。盡管C語言會自動地把整型轉換成雙精度型, 但書寫雙精度型是個好習慣。讓C語言爲你做強行轉換這是一種效率不高的程序

設計風格。 這有可能導致轉換産生錯誤。

b. 不要用0除。這是一個災難性的錯誤, 它會導致程序失敗, 不管C語言的什麽版本, 都是如此, 執行除法運算要非凡小心。

c. 確保所有的雙精度數(包括那些程序輸入用的雙精度數) 是在實數範圍之內。

d. 所有整數必須在整數答應的範圍內。這適用于所有計算結果, 包括中間結果。

2. 將函數後面的";"忘掉。此時錯誤提示色棒將停在該語句下的一行, 並顯示:

Statement missing ; in function <函數名>

3. 給宏指令如#include, #define等語句尾加了";"號。

4. "{"和"}"、"("和")"、"/*"和"*/"不匹配。 引時色棒將位于錯誤所在的行, 並提示出有關丟掉括號的信息。

5. 沒有用#include指令說明頭文件, 錯誤信息提示有關該函數所使用的參數未定義。

6. 使用了Turbo C保留要害字作爲標識符, 此時將提示定義了太多數據類型。

7. 將定義變量語句放在了執行語句後面。此時會提示語法錯誤。

8. 使用了未定義的變量, 此時屏幕顯示:

Undefined symbol '<變量名>' in function <函數名>

9. 警告錯誤太多。忽略這些警告錯誤並不影響程序的執行和結果。 編譯時當警告錯誤數目大于某一規定值時(缺省爲100)便退出編譯器, 這時應改變集成開發環境Options/Compiler/Errors中的有關警告錯誤檢查開關爲off。

10. 將關系符"=="誤用作賦值號"="。此時屏幕顯示:

Lvalue required in function <函數名>

二、連接時的常見錯誤

1. 將Turbo C庫函數名寫錯。這種情況下在連接時將會認爲此函數是用戶自定義函數。此時屏幕顯示:

Undefined symbol '<函數名>' in <程序名>

2. 多個文件連接時, 沒有在"Project/Project name中指定項目文件 (.PRJ文件), 此時出現找不到函數的錯誤。

3. 子函數在說明和定義時類型不一致。

4. 程序調用的子函數沒有定義。

三、運行時的常見錯誤

1. 路徑名錯誤。在MS-DOS中, 斜杠(\)表示一個目錄名; 而在Turbo C 中斜杠是個某個字符串的一個轉義字符, 這樣, 在用Turbo C 字符串給出一個路徑名時應考慮"\"的轉義的作用。例如, 有這樣一條語句:

file=fopen("c:\new\tbc.dat", "rb");

目的是打開C盤中NEW目錄中的TBC.DAT文件, 但做不到。這裏"\"後面緊接的分別"n"及"t", "\n"及"\t"將被分別編譯爲換行及tab字符, DOS將認爲它是不正確的文件名而拒絕接受, 因爲文件名中不能和換行或tab字符。正確的寫法應爲:

file=fopen("c:\\new\\tbc.dat", "rb");

2. 格式化輸入輸出時, 規定的類型與變量本身的類型不一致。例如:

float l;

printf("%c", l);

3. scanf()函數中將變量地址寫成變量。例如:

int l;

scanf("%d", l);

4. 循環語句中, 循環控制變量在每次循環未進行修改, 使循環成爲無限循環。

5. switch語句中沒有使用break語句。

6. 將賦值號"="誤用作關系符"=="。

7. 多層條件語句的if和else不配對。

8. 用動態內存分配函數malloc()或calloc()分配的內存區使用完之後, 未用free()函數釋放, 會導致函數前幾次調用正常, 而後面調用時發生死機現象,不能返回操作系統。其原因是因爲沒用空間可供分配, 而占用了操作系統在內存中的某些空間。

9. 使用了動態分配內存不成功的指針, 造成系統破壞。

10. 在對文件操作時, 沒有在使用完及時關閉打開的文件。

 本節主要介紹Turbo C程序設計的基本步驟及如何編譯、調試和運行源程序。並給出Turbo C的常用編輯命令。最後介紹Turbo C編譯、連接和運行時的常見錯誤。  一、Turbo C程序設計基本步驟  程序設計方法包括三個基本步驟:  第一步: 分析問題。   第二步: 畫出程序的基本輪廓。   第三步: 實現該程序。   3a. 編寫程序   3b. 測試和調試程序   3c. 提供數據打印結果   下面, 我們來說明每一步的具體細節。   第一步: 分析問題   在這一步, 你必須:   a. 作爲解決問題的一種方法, 確定要産生的數據(輸出)。 作爲這一子步的一部分, 你應定義表示輸出的變量。   b. 確定需産生輸出的數據(稱爲輸入), 作爲這一子步的一部分, 你應定義表示輸入的變量。   c. 研制一種算法, 從有限步的輸入中獲取輸出。 這種算法定義爲結構化的順序操作, 以便在有限步內解決問題。就數字問題而言, 這種算法包括獲取輸出的計算, 但對非數字問題來說, 這種算法包括許多文本和圖象處理操作。   第二步: 畫出程序的基本輪廓   在這一步, 你要用一些句子(僞代碼)來畫出程序的基本輪廓。每個句子對應一個簡單的程序操作。對一個簡單的程序來說, 通過列出程序順序執行的動作,便可直接産生僞代碼。然而, 對複雜一些的程序來說, 則需要將大致過程有條理地進行組織。對此, 應使用自上而下的設計方法。   當使用自上而下的設計方法時, 你要把程序分割成幾段來完成。列出每段要實現的任務, 程序的輪廓也就有了, 這稱之爲主模塊。當一項任務列在主模塊時,僅用其名加以標識, 並未指出該任務將如何完成。這方面的內容留給程序設計的下一階段來討論。將程序分爲幾項任務只是對程序的初步設計。整個程序設計歸結爲下圖所示的流程圖1.。   ┏━━━━━━━━━━━━━━━┓   ┃ 主模塊 ┃   ┏━━━━━━━┓ ┃ 輸入數據 ┃   ┃ 主模塊 ┃ ┃ 計算購房所需的金額 ┃   ┃ ┃ ┃ 計算裝修所需的金額 ┃   ┃ 任務1 ┃ ┃ 計算總金額 ┃   ┃ 任務2 ┃ ┃ 輸出計算結果 ┃   ┃ 任務3 ┃ ┃ ┃   ┃ 任務4 ┃ ┗━━━━━━━┳━━━━━━━┛   ┃ ┃ ┏━━━━━┳━━━━━╋━━━━┳━━━━━┓   ┃ ┃ ┏━━┻━┓┏━━┻━┓┏━━┻━┓┏━┻━┓┏━━┻━┓   ┗━━━━━━━┛ ┃輸入數據┃┃購房額..┃┃裝修額..┃┃總額..┃┃輸出結果┃   ┗━━━━┛┗━━━━┛┗━━━━┛┗━━━┛┗━━━━┛   圖1. 程序初步設計 圖2. 第二級程序設計   假如把主模塊的每項任務擴展成一個模塊, 並根據子任務進行定義的話, 那麽, 程序設計就更爲具體了(見圖2.)。這些模塊稱爲主模塊的子模塊。程序中許多子模塊之間的關系可象圖2.中那樣歸結爲一張圖。這種圖稱爲結構圖。   要畫出模塊的輪廓, 你可不考慮細節。假如這樣的話, 你必須使用子模塊,將各個模塊求精, 達到第三級設計。繼續這一過程, 直至說明程序的全部細節。   這一級一級的設計過程稱爲逐步求精法。在編寫程序之前, 對你的程序進行逐步求精, 對你來說, 是很好的程序設計實踐, 會使你養成良好的設計習慣。   我們則才描述了程序設計中自上而下的設計方法。實際上就是說, 我們設計程序是從程序的"頂部"開始一直考慮到程序的"底部"。   第三步: 實現該程序   程序設計的最後一步是編寫源碼程序。 在這一步, 把模塊的僞代碼翻譯成Turbo C語句。   對于源程序, 你應包含注釋方式的文件編制, 以描述程序各個部分做何種工作。此外, 源程序還應包含調試程序段, 以測試程序的運行情況, 並答應查找編程錯誤。一旦程序運行情況良好, 可去掉調試程序段, 然而, 文件編制應做爲源程序的固定部分保留下來, 便于你或其他人維護和修改。   二、源程序的輸入、編譯和運行   C語言是一種中級語言, 用戶用C語言編寫的程序稱爲源程序, 存放用C 語言所寫源程序文件名字最後的兩個字符一般必須爲".c"。計算機硬件不能直接執行源程序, 必須將源程序翻譯成二進制目標程序。翻譯工作是由一個程序完成的,這個程序稱爲編譯程序, 翻譯的過程稱爲編譯, 編譯的結果稱爲目標程序, 存放目標程序文件名字緊後的字符一般爲".OBJ"或".O"。程序翻譯成目標程序後, 便可進行連接。"連接"的目的是使程序變成在計算機上可以執行的最終形式。在這一階段, 從系統程序庫來的程序要與目標程序連接, 連接的結果稱爲執行程序,存放執行程序文件名字一般以".EXE"結尾。   在Turbo C集成開發環境中建立一個新程序通常有以下幾個步驟:   (1). 在編輯器中編寫源文件。   (2). 生成可執行文件。   在DOS提示符下鍵入TC, 即可進入Turbo C了。進入主TC屏後, 按F3鍵, 即可在隨之出現的框中輸入文件名, 文件名可以帶".C"也可以不帶( 此時系統會自動加上)。輸入文件名後, 按回車, 即可將文件調入, 假如文件不存在, 就建立一個新文件(也可用下面例子中的方法輸入文件名)。系統隨之進入編輯狀態。就可以輸入或修改源程序了, 源程序輸入或修改完畢以後, 按Ctrl+F9(同時按下Ctrl鍵和F9鍵), 則立即進行編譯、連接和執行, 這三項工作是連續完成的。   下面我們試著建立一個Turbo C名爲"HELLO.C"的源程序(因程序很小, 這裏就不畫出該程序的輪廓圖了):   1. 操作步驟:   (1). 將系統置于DOS提示符下:   (2). 鍵入命令:   tc hello.c   使系統進入Turbo C集成開發環境, 並建立一個名爲HELLO.C的文件。這時, 系統進入Turbo C編輯環境。   (3). 通過鍵盤輸入程序, 例如:   main()   {   printf("Hello, world\n");   }   則程序進入計算機存貯器。   2. 程序存盤   爲防止意外事故丟失程序, 最好將輸入的程序存貯到磁盤中。在編輯窗口下,可直接按F2鍵或按F10鍵, 再按F鍵進入File菜單項, 再按S或W鍵將文件存盤。存盤時屏幕最底行會顯示:   "saving edit file"   3. 編譯一個程序   對源程序進行編譯有兩種方法: (1). 直接按Alt+F9即可。(2). 按F10 鍵返回主菜單, 選擇Compile項, 屏幕顯示Compile 下拉菜單, 從下拉菜單中選擇Compile to .OBJ項, 按回車鍵。   進入編譯狀態後, 屏幕會出現一個編譯窗口, 幾秒鍾後, 屏幕顯示一閃爍信息:   SUCcess: press any key   表示編譯成功。此時可按任意鍵, 編譯窗口消失, 光標返回主菜單。假如編譯時産生警告Warning或出錯Error信息, 這些具體錯誤信息會顯示在屏幕下部的信息窗中, 必須糾正這些錯誤。對源程序進行修改, 重新進行編譯。   4. 運行程序   源程序經編譯無誤後, 可以投入運行。具體操作如下:   (1). 假如當前還在編輯狀態, 可按Alt+R, 再選擇RUN項即可。   (2). 按Ctrl+F9。   程序投入運行時, 屏幕會出現一個連接窗口, 顯示Turbo C 正在連接和程序所需的庫函數。連接完畢後, 會出現屏幕忽然一閃, 後又回到TC主屏幕, 發生了什麽? 讓我們按Alt+F5看看, 此時屏幕被清除, 在頂部顯示"Hello, world"字樣。再按任意鍵, 即可又回到TC主屏幕。   5. 列磁盤文件目錄   現在請按Alt+X退出Turbo C, 返回DOS提示符, 鍵入dir hello.*, 回車, 則屏幕顯示:   HELLO C 42 1-09-93 10:18   HELLO OBJ 221 1-09-93 10:22   HELLO EXE 4486 1-09-93 10:25   ...   第一個文件HELLO.C是源文件文本, 在DOS提示符下鍵入TYPE HELLO.C命令,可在屏幕上顯示該文件的內容。可看到該程序只有42個字節。   第二個文件HELLO.OBJ是Turbo C編擇程序産生的二進制機器指令(目標碼),假如用DOS命令TYPE顯示該文件, 屏幕可能會出現混亂的信息。   第三個文件HELLO.EXE是Turbo C連接程序産生的實際可執行文件。在DOS 提示符下鍵入HELLO並按回車, 屏幕將顯示"Hello, world"。   Turbo C 常用的編輯命令   Turbo C編輯程序大約有50條命令, 用以移動光標, 按頁查看正文, 查找並替換字符串等。如下表所示。   表1. Turbo C編輯程序命令   ━━━┳━━━━━━━━━┳━━━━━━━━━━━━━   類別 ┃ 功能 ┃ 默認鍵   ━━━╋━━━━━━━━━╋━━━━━━━━━━━━━   ┃ 字符左 ┃ Ctrl+S或Left   基 ┃ 字符右 ┃ Ctrl+D或Right   本 ┃ 字左 ┃ Ctrl+A   光 ┃ 字右 ┃ Ctrl+F   標 ┃ 上行 ┃ Ctrl+E或Up   移 ┃ 下行 ┃ Ctrl+X或Down   動 ┃ 上滾 ┃ Ctrl+W   命 ┃ 下滾 ┃ Ctrl+Z   令 ┃ 上一頁 ┃ Ctrl+R或PgUp   ┃ 下一頁 ┃ Ctrl+C或PgDn   ━━━╋━━━━━━━━━╋━━━━━━━━━━━━━   快 ┃ 行頭 ┃ Ctrl+QS或Home   速 ┃ 行尾 ┃ Ctrl+QD或End   光 ┃ 窗口頭 ┃ Ctrl+QE   標 ┃ 窗口底 ┃ Ctrl+QX   移 ┃ 文件頭 ┃ Ctrl+QR   動 ┃ 文件尾 ┃ Ctrl+QC   命 ┃ 塊頭 ┃ Ctrl+QB   令 ┃ 塊尾 ┃ Ctrl+QK   ┃ 上次光標位置 ┃ Ctrl+QP   ━━━╋━━━━━━━━━╋━━━━━━━━━━━━━   輸 ┃ 插入模式 ┃ Ctrl+V或Ins   入 ┃ 插入行 ┃ Ctrl+N   與 ┃ 刪除行 ┃ Ctrl+Y   刪 ┃ 刪除至行尾 ┃ Ctrl+QY   除 ┃ 刪除光標左邊字符┃ Ctrl+H或Backspace   命 ┃ 刪除光標處字符 ┃ Ctrl+G或Del   令 ┃ 刪除光標右邊字符┃ Ctrl+T   ━━━╋━━━━━━━━━╋━━━━━━━━━━━━━   ┃ 標記塊首 ┃ Ctrl+KB   ┃ 標記塊尾 ┃ Ctrl+KK   ┃ 標記單個字 ┃ Ctrl+KT   塊 ┃ 複制塊 ┃ Ctrl+KC   命 ┃ 刪除塊 ┃ Ctrl+KY   令 ┃ 塊取消 ┃ Ctrl+KH   ┃ 塊移動 ┃ Ctrl+KV   ┃ 讀塊 ┃ Ctrl+KR   ┃ 寫塊 ┃ Ctrl+KW   ━━━╋━━━━━━━━━╋━━━━━━━━━━━━━   ┃ 異常結束操作 ┃ Ctrl+U或Ctrl+Break   ┃ 制表 ┃ Ctrl+L或Tab   其 ┃ 自動縮進 ┃ Ctrl+OI   ┃ 定界符配對 ┃ Ctrl+Q[或Ctrl+Q]   它 ┃ 查找 ┃ Ctrl+QF   ┃ 查找並替換 ┃ Ctrl+QA   ┃ 查找標記 ┃ Ctrl+QN   ┃ 退出編輯 ┃ Ctrl+KQ   ━━━┻━━━━━━━━━┻━━━━━━━━━━━━━   Turbo C 程序的調試   一個程序設計好了以後, 通常會有一些錯誤, 查找和修改程序中的錯誤是令人頭痛的事。Turbo C集成開發環境提供了一調試裝置, 使得這一個工作輕易了許多, 程序調試達到了編譯和運行級。   一、TC消息窗口   使用TC最好的理由之一是它答應用戶修改語法錯誤(編譯時) 和評估編譯器給出的警告。TC將編譯器和連接器發出的消息收集到一緩沖區中, 然後在消息窗口中顯示, 這樣在訪問源代碼的同時, 還能一下看到這些消息。   現將上面的HELLO.C制造一點語法錯誤, 將第一行包含語句的#去掉, 再去掉第五行printf語句中的後引號。現在程序看上去是這樣的:   include   main()   {   printf("Hello, world\n);   }   按CTRL+F9重新編譯之。編譯窗口將顯示有多少錯誤和警告: 應爲兩個錯誤, 0個警告。   當看見編譯窗口中的Press anykey提示時, 按空格鍵, 消息窗口馬上被激活,亮條出現在第一個錯誤或警告上, 這時編輯窗口中也會有一亮條--- 它標志著編譯器給出的錯誤或警告在源代碼中的相應位置。   這時可用光標鍵將消息窗口中的亮條上下移動, 注重到編輯窗口中的亮條也隨著跟蹤源代碼中錯誤發生的位置。假如將亮條置于"compile"上, 則編輯器顯示文件的最後位置。   假如消息窗口太長看不見, 可用左、右光標水平滾動消息, 爲了一次能夠多看點信息, 可按F5放大消息窗口。放大後, 編輯窗口不可見了, 因此不進行錯誤跟蹤。現在, 保持分屏模式。   爲了改正錯誤, 將消息窗口中的亮條置于第一個錯誤消息上, 回車, 光標移到編輯窗口中錯誤産生處, 注重, 編輯器狀態給出所選消息( 這在放大模式下是有用的)改正之。(將第一行拿走的#重新寫上)。   當不只一個錯誤時, 可用兩種方法來修改下一錯誤。   第一種方法和前面一樣, 按F6回到消息窗口選擇想修改的下一條消息。   第二種方法不用回到消息窗口, 只要按Alt+F8, 編譯器就會將光標移至消息窗口中列的下一個錯誤。按Alt+F7可移至前一個錯誤。   這兩種方法各有長短, 視情況而定。有時源代碼中一個愚蠢的錯誤把編譯弄糊塗了, 産生好多消息, 這時選擇修改第一條消息就使得其余的一些錯誤消息沒有什麽意義了, 這種情況發生時, 使用方法一會方便些, 一修改完第一個錯誤之後回到消息窗口, 再滾動到下一個有意義的消息上, 選擇之。在別的情況下, 按Alt+F8會方便得多。   記住, Alt+F7和Alt+F8是熱鍵, TC中無論何時均起作用。因此在消息窗口中按Alt+F8得到的不是當前亮行消息, 而是下一個消息(按Enter選擇當前消息)。   但假如沒別的編譯消息, Alt+F8就不起作用了。   注: 可以如此法選擇連接消息, 但它們不跟蹤源文件。在修改語法錯誤的過程當中, 經常需要增加、刪除正文, 編輯器是記住的, 依然能正確定位錯誤位置。   沒有必要記住行號和增加、刪除的正文行。   二、Turbo C集成調試器   一旦修改好語法錯誤之後程序編譯就沒什麽問題了, 但還是可能不按要求運行, 因爲可能有邏輯錯誤(運行錯誤)。這種錯誤跟蹤就無助于發現錯誤位置了。   TC有一個集成調試器可以跟蹤運行錯誤。通過調試器可以運行, 在斷點處暫停,檢查變量的值, 甚至可以改變之, 以看程序會有什麽反應。   Turbo C集成調試器是源程序級的調試器, 即用同你編寫程序一樣的" 語言"來控制調試器。例如, 爲了顯示數組中的一個元素的值, 可告訴調試器顯示這樣的表達式的值:   Ctrl+F4 Debug/Eavluate 計算表達式, 答應修改變量的值。   Debug/Find Function 查找函數定義, 顯示在編輯窗口中。 僅在調試時才有效。   Ctrl+F3 Debug/Call Stack 顯示調用棧, 可顯示任何函數的當前執行位置, 其方法是在調用棧中選擇相應的函數名。僅在調試時有效。   Debug/Source Debugging 控制是否答應調試: 置爲On時, 集成調試器和單獨調試器均可用 ; 置爲   Standalone時, 只能用單獨調試器調試, 雖然還能在TC中運行; 置爲None時, 在.EXE文件不置調試信息,兩種調試均不能調試。   Ctrl+F4 Break/Watch/Add Watch 增加一監視表達式。   Break/Watch/Delete Watch 刪除一監視表達式。   Break/Watch/Edit 編輯一監視表達式。   Break/Watch/Remove All 刪除所有監視表達式。   Watches   Ctrl+F8 Break/Watch/Toggle 設置或清除光標所在行的斷點。   Breakpoint   Break/Watch/Clear 刪除程序中所有斷點。   Breakpoint   Break/Watch/Next 顯示下一斷點   Breakpoint   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━      表3. 調試器菜單命令及其熱鍵   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━   熱鍵 菜單命令 功能   ───────────────────────────────────   F5 在整屏和分屏之間放大縮小活動窗口。   Alt+F5 將顯示轉到用戶屏, 擊任意鍵返回。   F6 在編輯窗口與監視窗口或消息窗口間   切換。   Alt+F6 若編輯窗口是活動的, 轉到最近一次   裝入編輯器的文件; 若下面窗口是活   動的, 則在監視窗口和消息窗口間切換。   Ctrl+F9 Run/Run 調試運行或不調試運行程序, 必要時   編譯、連接源文件, 若編譯、 連接時   Debug/Source Debuging和O/C/C/OBJ   Debug Information爲On, 則運行程序   到斷點或程序末尾。   Project/Remove Messages 刪除消息窗口中的內容。   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━   判定程序是否出錯或者爲什麽出錯是編程中最有挑戰意義的一方面。這裏建義你進行預防性設計, 具體做法爲:   (1). 將代碼寫清楚點, 應作適當縮進, 使用文字說明和描述性的變量名。   (2). 代碼應簡單, 把精力放在簡單語句中的複雜表達式, 而不是一些複雜語句。Turbo C的代碼優化機制將大大提高代碼的效率, 而且調試、閱讀、 修改起來輕易。   (3). 盡量用目的簡單、好定義的函數構建程序。 這會便于編制調試程序和分析結果, 而且閱讀、修改起來也要輕易一些。   (4). 應盡量減少各個函數要求的數據和改變數據的元素個數。 這也會便于編制測試程序和分析結果; 同樣便于閱讀、修改程序。並且還限制了出錯函數可能造成的巨大混亂的牽涉面, 便得能在一個調試節中多運行函數幾次。   (5). 要留心編寫程序中的公共函數, 或者說在其它程序中可再用的函數。   編寫、調試一個一般性的函數通常要比編寫、調試兩個或更多的非凡函數要輕易。   Turbo C編譯、連接和運行時的常見錯誤   一、編譯時的常見錯誤   1. 數據類型錯誤。此類錯誤是初學者編程時的常見現象, 下面是一些要引起注重的錯誤:   (1) 所有變量和常量必須要加以說明。   (2) 變量只能賦給相同類型的數據。   (3) 對scanf()語句, 用戶可能輸入錯誤類型的數據項, 這將導致運行時出錯, 並報出錯信息。爲避免這樣的錯誤出現, 你就提示用戶輸入正確類型的數據。   (4) 在執行算術運算時要注重:   a. 根據語法規則書寫雙精度數字。要寫0.5, 而不是寫.5; 要寫1.0,而不是1。盡管C語言會自動地把整型轉換成雙精度型, 但書寫雙精度型是個好習慣。讓C語言爲你做強行轉換這是一種效率不高的程序   設計風格。 這有可能導致轉換産生錯誤。   b. 不要用0除。這是一個災難性的錯誤, 它會導致程序失敗, 不管C語言的什麽版本, 都是如此, 執行除法運算要非凡小心。   c. 確保所有的雙精度數(包括那些程序輸入用的雙精度數) 是在實數範圍之內。   d. 所有整數必須在整數答應的範圍內。這適用于所有計算結果, 包括中間結果。   2. 將函數後面的";"忘掉。此時錯誤提示色棒將停在該語句下的一行, 並顯示:   Statement missing ; in function <函數名>   3. 給宏指令如#include, #define等語句尾加了";"號。   4. "{"和"}"、"("和")"、"/*"和"*/"不匹配。 引時色棒將位于錯誤所在的行, 並提示出有關丟掉括號的信息。   5. 沒有用#include指令說明頭文件, 錯誤信息提示有關該函數所使用的參數未定義。   6. 使用了Turbo C保留要害字作爲標識符, 此時將提示定義了太多數據類型。   7. 將定義變量語句放在了執行語句後面。此時會提示語法錯誤。   8. 使用了未定義的變量, 此時屏幕顯示:   Undefined symbol '<變量名>' in function <函數名>   9. 警告錯誤太多。忽略這些警告錯誤並不影響程序的執行和結果。 編譯時當警告錯誤數目大于某一規定值時(缺省爲100)便退出編譯器, 這時應改變集成開發環境Options/Compiler/Errors中的有關警告錯誤檢查開關爲off。   10. 將關系符"=="誤用作賦值號"="。此時屏幕顯示:   Lvalue required in function <函數名>   二、連接時的常見錯誤   1. 將Turbo C庫函數名寫錯。這種情況下在連接時將會認爲此函數是用戶自定義函數。此時屏幕顯示:   Undefined symbol '<函數名>' in <程序名>   2. 多個文件連接時, 沒有在"Project/Project name中指定項目文件 (.PRJ文件), 此時出現找不到函數的錯誤。   3. 子函數在說明和定義時類型不一致。   4. 程序調用的子函數沒有定義。   三、運行時的常見錯誤   1. 路徑名錯誤。在MS-DOS中, 斜杠(\)表示一個目錄名; 而在Turbo C 中斜杠是個某個字符串的一個轉義字符, 這樣, 在用Turbo C 字符串給出一個路徑名時應考慮"\"的轉義的作用。例如, 有這樣一條語句:   file=fopen("c:\new\tbc.dat", "rb");   目的是打開C盤中NEW目錄中的TBC.DAT文件, 但做不到。這裏"\"後面緊接的分別"n"及"t", "\n"及"\t"將被分別編譯爲換行及tab字符, DOS將認爲它是不正確的文件名而拒絕接受, 因爲文件名中不能和換行或tab字符。正確的寫法應爲:   file=fopen("c:\\new\\tbc.dat", "rb");   2. 格式化輸入輸出時, 規定的類型與變量本身的類型不一致。例如:   float l;   printf("%c", l);   3. scanf()函數中將變量地址寫成變量。例如:   int l;   scanf("%d", l);   4. 循環語句中, 循環控制變量在每次循環未進行修改, 使循環成爲無限循環。   5. switch語句中沒有使用break語句。   6. 將賦值號"="誤用作關系符"=="。   7. 多層條件語句的if和else不配對。   8. 用動態內存分配函數malloc()或calloc()分配的內存區使用完之後, 未用free()函數釋放, 會導致函數前幾次調用正常, 而後面調用時發生死機現象,不能返回操作系統。其原因是因爲沒用空間可供分配, 而占用了操作系統在內存中的某些空間。   9. 使用了動態分配內存不成功的指針, 造成系統破壞。   10. 在對文件操作時, 沒有在使用完及時關閉打開的文件。
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
王朝網路微信公眾號
微信掃碼關註本站公眾號 wangchaonetcn
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有