官术网_书友最值得收藏!

2.2 C語言的開發(fā)環(huán)境

編寫一個程序后,如何運行該程序?如第1章所述,一個 C 語言的程序必須經(jīng)過編譯鏈接后才能運行。如何輸入、編譯以及鏈接一個程序?任何文本編輯器都可以用來編輯 C 語言的程序,編譯是由編譯器完成的,鏈接是由鏈接器完成的。每個步驟都可以通過一個命令完成。但通常有一些軟件可以將這些步驟組合在一起,在這個軟件中完成從程序編寫到程序運行的所有過程。這種軟件被稱為集成開發(fā)環(huán)境。

在 Windows 平臺上的主流開發(fā)環(huán)境是微軟的 Visual Studio。Visual Studio 意為“可視化工作室”,簡稱為 VS。它包括 VB、VC、VF、數(shù)據(jù)庫 ODBC 等開發(fā)工具,其中的 VC 是 C 語言和 C++語言的開發(fā)工具。本書采用 VS2010作為開發(fā)環(huán)境,所有的程序都在 VS2010中調(diào)試通過,其他的開發(fā)環(huán)境的使用也都是大同小異。

2.2.1 VS2010的安裝

選定了一個 VS 版本后,就可以進行安裝了。VS 系列的安裝過程與微軟的其他軟件類似,插入安裝盤后一般會自動進入安裝界面。如果沒有進入,可在安裝盤上雙擊 autorun.exe 或setup.exe。安裝界面如圖2-2所示。選擇“安裝Microsoft Visual Studio 2010”,剩下的過程就是連續(xù)單擊“下一步”按鈕直到操作完成。

圖2-2 VS2010安裝界面

在安裝過程中有一個選項:全部安裝或選擇安裝。如果只是作為學習 C 語言的工具,可以選擇只安裝VC++。

2.2.2 程序輸入

程序輸入

VS2010中被開發(fā)的軟件稱為一個“解決方案”,每個解決方案包含若干個“項目”。每個項目最終會形成一個可執(zhí)行文件,每個項目又可以包含若干個源程序。因此要輸入程序必須先創(chuàng)建一個“解決方案”,在此解決方案下再創(chuàng)建一個項目,將源文件添加到這個項目下面。

VS2010可以同時建立一個解決方案和方案中的第一個項目,也可以先建立方案再添加項目。

1.創(chuàng)建解決方案和項目

進入 VS2010,首先出現(xiàn)如圖2-3所示的界面。VS2010的界面與微軟的其他軟件界面一致。最上面的是菜單條,每個菜單項都可通過下拉顯示子菜單。菜單條下面是工具欄,包括常用的工具,最下面是信息交互界面。

圖2-3 VS2010開始頁

創(chuàng)建解決方案、項目可以直接在起始頁上選擇新建項目,也可以通過選擇菜單項“文件→新建→項目”。選擇新建項目后,屏幕上出現(xiàn)如圖2-4所示的界面。

圖2-4 新建項目界面

圖2-4的屏幕中間顯示了已安裝的模板,選擇“Win32”項目。在屏幕的下方出現(xiàn)了3個輸入框:名稱、位置、解決方案名稱。輸入項目名稱和解決方案名稱,如 proj1。位置是該項目的信息在磁盤上的存放目錄,可以用默認值,也可以修改。該項目的所有文件都會存儲在這個目錄下,屏幕右下方有兩個復選框,將第一個復選框“為解決方案創(chuàng)建目錄”打鉤。項目創(chuàng)建成功后,會自動生成相應的目錄。輸入結(jié)束后單擊“確定”按鈕,顯示如圖2-5所示的界面。

圖2-5 創(chuàng)建項目時的提示信息

在圖2-5中單擊“下一步”按鈕,出現(xiàn)如圖2-6所示的界面。

圖2-6 應用程序設置界面

在圖2-6的界面中選擇“空項目”復選框,應用程序類型選擇“控制臺應用程序”,單擊“完成”按鈕,項目被成功創(chuàng)建。在 D 盤的根目錄下將會出現(xiàn)一個名稱為“prog1”的目錄。項目創(chuàng)建成功后,出現(xiàn)如圖2-7所示的界面。

圖2-7 項目創(chuàng)建成功界面

2.添加源文件

項目創(chuàng)建成功后,圖2-7的左邊會顯示當前項目“proj1”,此時可以添加該項目中的源文件。選擇菜單中的“項目-添加新項”,會出現(xiàn)如圖2-8所示的界面。在右邊的選項中選擇“C++文件”,在屏幕底部的輸入框中輸入源文件名,如 prog1.c。注意,文件名的后綴必須是“.c”。單擊“添加”按鈕,進入程序輸入界面,如圖2-9所示。此時在目錄 D:\prog1\prog1生成了一個 prog1.c 的文件。在圖2-9右上方可輸入需要的源程序。

圖2-8 創(chuàng)建源文件界面

圖2-9 程序輸入界面

2.2.3 編譯鏈接

編譯鏈接是由菜單項“生成”完成。該菜單項下面有很多子菜單項目,常用的有“生成解決方案”、“生成 xx”和“編譯”。其中 xx 是當前正在工作的項目名稱。“生成解決方案”是編譯鏈接該解決方案下的所有項目,生成可執(zhí)行文件。“生成 xx”只對當前正在工作的項目中的文件進行編譯鏈接,生成可執(zhí)行文件。“編譯”只對代碼進行編譯而不執(zhí)行鏈接,不生成可執(zhí)行文件。

選擇了“生成解決方案”或“生成 xx”后,會出現(xiàn)如圖2-10所示的界面。界面的下方是編譯鏈接信息。如果編譯鏈接中發(fā)現(xiàn)錯誤,會在此顯示相應的錯誤信息,程序員可以根據(jù)提示信息修改程序中的錯誤。

圖2-10 編譯鏈接界面

圖2-10的屏幕下方出現(xiàn)了一系列出錯信息。用鼠標單擊出錯信息,會在顯示源程序部分左邊的灰色豎條上出現(xiàn)一個小小的橫杠。橫杠對應的行就是該錯誤所在的行。單擊如圖2-10所示中第一個出錯信息,橫杠出現(xiàn)在“scanf("%lf %lf %lf", &a, &b, &c);”這一行。根據(jù)出錯信息得知,其中有一個變量沒有定義。檢查變量定義部分,發(fā)現(xiàn)沒有變量b的定義。此時可以修改程序。加上了變量b的定義后,再次編譯鏈接,得到如圖2-11所示的界面,表示編譯鏈接成功。

圖2-11 編譯鏈接成功界面

編譯鏈接成功后,將會在項目對應目錄下的 debug子目錄下看到一個可執(zhí)行文件。對應于前面的過程,該文件名為prog1.exe,這就是項目的可執(zhí)行文件名。

在學習程序設計時,程序都比較簡單。一般一個解決方案只有一個項目,一個項目只有一個源文件,因此可直接選擇“生成解決方案”。

2.2.4 程序的運行

如果編譯鏈接過程沒有出現(xiàn)錯誤,則會生成可執(zhí)行文件。可以在 VS2010中運行該程序,也可以在Windows或DOS環(huán)境中運行。

1.在VS2010中運行

運行這個程序可以選擇菜單項“調(diào)試”,然后選擇“開始執(zhí)行(不調(diào)試)”。屏幕上會出現(xiàn)一個窗口,顯示執(zhí)行的過程,如圖2-12所示。

運行時,首先顯示一個提示信息

請輸入方程的3個系數(shù):

在本次運行時,用戶輸入了

1 -3 2

然后程序輸出了該方程的兩個根

x1=2.000000   x2=1.000000

圖2-12 程序運行過程

2.在Windows下運行

在 Windows 中,首先打開可執(zhí)行文件所在的文件夾,雙擊生成的可執(zhí)行文件名。運行界面與圖2-12完全相同。但是運行結(jié)束后,窗口自動消失,以致用戶無法看到計算結(jié)果。有多種方法可以解決這個問題,第一種解決方法是在輸出了方程的根后再接收一個輸入,如輸入一個數(shù)字。那么在輸出了方程的根后,程序在等待輸入,運行窗口還在,用戶可以看到計算結(jié)果。當用戶隨便輸入了一個數(shù)字后,程序結(jié)束,窗口消失。這個程序如代碼清單2-2所示。

代碼清單2-2 求解一元二次方程(避免自動退出方案一)

/ * 文件名: 2-2.c

  用標準公式求解一元二次方程 (避免自動退出) */

#include <stdio.h>

#include <math.h>

int main()

{

  double a, b, c, x1, x2, dlt;

  printf("請輸入方程的3個系數(shù):");

  scanf("%lf %lf %lf", &a, &b, &c);

  dlt=b * b - 4 * a * c;

  x1=(-b + sqrt(dlt))/2/a;

  x2=(-b - sqrt(dlt))/2/a;

  printf("x1=%f x2=%f\n", x1, x2);

  scanf("%lf ", &a);

  return 0;

}

第二種解決方法是用操作系統(tǒng)的命令pause使運行暫停。在C語言程序中調(diào)用操作系統(tǒng)的命令可使用

system("命令名");

用這種方法實現(xiàn)的程序見代碼清單2-3。

代碼清單2-3 求解一元二次方程(避免自動退出方案二)

/ * 文件名: 2-3.c

  用標準公式求解一元二次方程 (避免自動退出) */

#include <stdio.h>

#include <math.h>

int main()

{

  double a, b, c, x1, x2, dlt;

  printf("請輸入方程的3個系數(shù):");

  scanf("%lf %lf %lf", &a, &b, &c);

  dlt=b * b - 4 * a * c;

  x1=(-b + sqrt(dlt))/2/a;

  x2=(-b - sqrt(dlt))/2/a;

  printf("x1=%f x2=%f\n", x1, x2);

  system("pause ");

  return 0;

}

運行過程與圖2-12完全相同。顯示了 x1和 x2后,程序暫停,再按任意鍵,程序繼續(xù)執(zhí)行,窗口消失。

3.在DOS環(huán)境中運行

在DOS界面中執(zhí)行程序可以直接輸入可執(zhí)行文件名,代碼清單2-3的執(zhí)行過程,如圖2-13所示。

圖2-13 DOS界面下的程序運行過程

進入 DOS 界面后,首先切換到可執(zhí)行文件所在的目錄 D:\prog1\debug\prog1。在此目錄下有一個名為 prog1.exe 的文件,這就是代碼清單2-3生成的可執(zhí)行文件。輸入文件名 prog1進入執(zhí)行狀態(tài),運行過程與圖2-12完全相同。運行結(jié)束后,界面上又出現(xiàn)了命令輸入的提示符。

2.2.5 程序的調(diào)試

程序的調(diào)試

如果程序運行結(jié)果不是正確的結(jié)果或者程序運行異常終止,則表明程序沒有正確完成任務。可能是算法設計有問題,也有可能是有一些特殊的情況沒有考慮。在程序設計中,這種情況被稱為程序有 bug,即邏輯錯誤。糾正這些錯誤的過程稱為程序調(diào)試,英文為debug。

如何找出這些錯誤并改正?最簡單的方法是單步執(zhí)行。單步執(zhí)行就是每執(zhí)行一個語句后都會暫停,程序員可以檢查程序中的某些變量是否符合預期的結(jié)果。如果變量值正確,則繼續(xù)往下執(zhí)行一個語句。否則分析剛執(zhí)行的那條語句為什么沒有得到正確的結(jié)果,對此語句進行改正。例如對代碼清單2-3的程序進行單步跟蹤,每一步及變量的值如圖2-14所示。

圖2-14 代碼清單2-3中執(zhí)行了每一個語句后變量的情況

如果程序很短,單步執(zhí)行足以勝任。但如果程序很長,則會花費太多的時間,此時可以用設置斷點的方法。將程序按邏輯分成若干段,每段后設置一個斷點。運行到斷點時程序會暫停,程序員可以檢查程序中的某些變量是否符合預期的結(jié)果。如果與預期結(jié)果一致,則繼續(xù)運行到下一斷點。否則對上一段程序進行單步調(diào)試或設置更密集的斷點。例如對代碼清單2-3,可以在計算dlt 的這一行設置一個斷點。程序運行到這一行時,先檢查變量 a、b、c 的值是否與輸入的值一致。如果不是,則需要檢查 scanf 語句是否有問題。如果正確,可以選擇單步執(zhí)行,繼續(xù)執(zhí)行一個語句,然后檢查變量 dlt 的值。如果 dlt 的值正確,再繼續(xù)單步執(zhí)行,檢查變量 x1的值。就這樣一直持續(xù)到程序結(jié)束。

集成環(huán)境一般都支持這類調(diào)試。VS2010中的調(diào)試是由菜單項“調(diào)試”實現(xiàn)。該菜單項的下拉菜單中提供了單步測試、設置斷點等功能。如果需要單步調(diào)試,可以選擇“逐語句”或“逐過程”,也可以通過快捷鍵 F11。按一下 F11鍵執(zhí)行一個語句。如果需要設置斷點,可以單擊代碼區(qū)中需要暫停代碼左邊的灰色豎條。在豎條中會出現(xiàn)一個紅點,如圖2-15所示。

圖2-15 斷點設置

圖2-15中設置了兩個斷點。此時可以在菜單項“調(diào)試”中選擇開始“開始調(diào)試”,也可以通過按快捷鍵 F5開始調(diào)試。選擇了開始調(diào)試后,程序執(zhí)行到第一個斷點暫停。暫停后可以選擇單步調(diào)試(按快捷鍵 F11),也可以選擇繼續(xù)運行(按快捷鍵 F5)。如果選擇繼續(xù)運行,則會在下一個斷點暫停。如果后面沒有斷點,則將會執(zhí)行到程序結(jié)束,每次暫停時都會顯示程序中的變量值,如圖2-16所示。

圖2-16中屏幕的右上方是正在運行的程序。下方右邊是系統(tǒng)運行程序時做了哪些工作。讀者暫且可以忽略它們。程序的左下方是關注的重點,在下方選擇“局部變量”,左下方就會顯示程序中的變量值。圖2-16是執(zhí)行到第一個斷點時的情況,這時所有變量的值都是隨機數(shù)。

圖2-16 調(diào)試窗口

主站蜘蛛池模板: 洪江市| 于田县| 灵璧县| 同江市| 荔波县| 阿克苏市| 新安县| 尼玛县| 沧源| 弋阳县| 江安县| 雷山县| 东城区| 宣恩县| 乳山市| 宁远县| 永寿县| 铁岭县| 明水县| 蚌埠市| 克什克腾旗| 隆德县| 呼图壁县| 华池县| 昭苏县| 涪陵区| 清徐县| 志丹县| 田东县| 外汇| 左贡县| 微山县| 平武县| 彭泽县| 平昌县| 民县| 新竹市| 同江市| 石阡县| 斗六市| 泰宁县|