- C語言程序設計實驗指導與習題精解
- 劉鋰 楊井榮 宋容主編
- 11字
- 2020-08-21 13:20:23
第一部分 C實驗上機指導
實驗1 C程序運行環境及基本操作
一、實驗目的及要求
(1)熟悉并掌握在Visual C++ 6.0環境中編輯、編譯、連接、運行C語言程序的一般步驟。重點掌握C程序源文件、目標文件、可執行文件的建立和保存。
(2)進一步熟悉和掌握C語言源程序的基本結構及書寫規則。
(3)初步熟悉各運算符的運算規則及使用。
二、實驗內容及指導
【實驗1-1】在Visual C++ 6.0(后文在不引起歧義的情況下簡稱VC++)環境中編輯并運行以下程序lab1-1.C。
#include <stdio.h> void main() { printf("Hello C!\n"); }
本題指導
(1)本實驗目的是練習并熟悉在VC++環境中新建、保存源程序及進行編譯、連接、運行的一般步驟。這里以英文版Visual C++ 6.0軟件為例來說明。
(2)本實驗操作步驟如下:
①在Windows中運行VC++,進入集成開發環境。
②新建源程序。在 VC++主窗口中運行“File”(“文件”)菜單上的“New”(“新建”)命令,如圖1-1所示。

圖1-1 VC++窗口中的“File”菜單
屏幕上彈出“New”對話框,單擊此對話框上方的“Files”選項卡,選擇“C++ Source File”項(即“C++源程序”),然后在“File”下的文本框中輸入要新建的源程序文件名lab1-1.C,如圖1-2所示,單擊“OK”按鈕。

圖1-2 VC++窗口中的“New”對話框
單擊“OK”按鈕后回到Visual C++主窗口,可以看到VC++主窗口的標題欄顯示出了源程序的文件名。
在主窗口的程序編輯窗口中輸入源程序lab1-1.C的代碼,如圖1-3所示。

圖1-3 “lab1-1.C”程序編輯窗口
③保存源程序。輸入完源程序之后,應執行“File”菜單中的“Save”(“保存”)或“Save as”(“另存為”)命令,保存程序(如果沒有執行這一步操作,則執行下一步編譯操作時,系統會自動提示是否保存源程序)。
④編譯源程序。執行“Build”(“創建”)菜單的“Compile”(“編譯”)命令,如圖1-4所示。

圖1-4 VC++窗口中的“Build”菜單
此時彈出如圖1-5所示的對話框,詢問是否要建立一個默認的工程工作區。單擊“是”按鈕,開始編譯該文件。

圖1-5 VC++對話框
編譯過程中,如果源程序有錯,則在 VC++主窗口下方的編譯輸出窗口的“Build”選項卡中顯示出錯誤,程序員須改正錯誤,編譯改正才能完成。如果沒有錯,編譯輸出窗口就會顯示生成的.OBJ文件名,并顯示如下信息:
lab1-1.OBJ - 0 error(s), 0 warning(s)
⑤連接。編譯無誤生成OBJ文件后,就可執行“Build”菜單下的“Build lab1-1.exe”(“創建lab1-1.exe”)命令或按“F7”鍵,對被編譯后的目標文件進行連接,如圖1-6所示。

圖1-6 VC++“Build”菜單下的連接(創建)命令
如果連接過程中發現錯誤,則會在編譯輸出窗口的“Build”選項卡中顯示出連接錯誤的信息,出現錯誤時,修改源程序后再編譯、連接,直到連接沒有錯誤為止。
編譯連接成功時,在編譯輸出窗口中就會顯示如下信息:
lab1-1.exe - 0 error(s), 0 warning(s)
表明沒有錯誤和警告信息,創建了可執行文件lab1-1.exe。
⑥運行程序。連接生成EXE文件后,就可執行“Build”菜單下的“Execute”(“執行”)命令或按“Ctrl”+“F5”鍵(如圖1-7所示),來運行程序lab1-1.exe。程序執行時將彈出一個DOS窗口并輸出以下內容:
Hello C! Press any key to continue(按任意鍵繼續)

圖1-7 VC++“Build”菜單下的Execute命令
按任意鍵后,輸出結果窗口將關閉,回到源程序編輯窗口。
【實驗1-2】分析以下程序的運行結果,并上機驗證。
#define M 6 #include "stdio.h" void main() { char c='k'; int a,b; int i=1,j=2,k=3; a=b=8; printf("%d,%d\n ",++a,b--); printf("%d,%d\n",'a'+5<c,1<M<j); printf("%d,%d\n",i+j+k==-2*j,k==j==i+5); }
本題指導
本題雖只有短短幾行,卻涵蓋了宏定義、頭文件包含、變量定義及初始化、賦值運算、自增/減運算、算術運算、關系運算及不同類型數據間的混合運算等多個內容,值得仔細分析和體會。
(1)注意自增運算符“++”和自減運算符“- -”放在變量前面與后面時運算順序的區別(放在前面是先自增/自減,然后取變量的值;放在后面則是先取變量的值,后進行自增/自減運算)。
(2)程序第一行是一個無參數的宏定義,在較早的C軟件版本中稱為符號常量定義。
(3)注意語句“a=b=8;”的執行過程。該語句相當于“a=(b=8);”,先執行右邊括號內的賦值操作,括號內表達式的值為8,再給變量a賦值。
(4)注意表達式1<M<j 的運算過程。不能理解為數學上的兩個不等式,而是相當于(1<M)<j,整個是一個關系不等式,括號內也是一個關系表達式。求值時先求括號內表達式的值,由于1<M為真,因此整個表達式相當于1<j,該關系表達式也為真,因此整個表達式的值為1。
(5)根據算術運算符和關系運算符的優先級,最后一行中的兩個表達式分別相當于(i+j+k)==(-2*j)和(k==j)==(i+5),讀者不難求出其值。
【實驗1-3】分析以下程序的運行結果,并上機驗證。
#include <stdio.h> void main() { int x, y, z; x=y=z=0; ++x||++y&&++z; printf("x=%d,y=%d,z=%d\n",x,y,z); x=y=z=0; ++x&&++y||++z; printf("x=%d,y=%d,z=%d\n",x,y,z); x=y=z=-1; ++x&&++y||++z; x=y=z=2; printf("%d,%d,%d\n",!x*!y, !!!x, x==5&&y&&(z=8)); }
本題指導
本題主要讓讀者加深對邏輯運算符及邏輯表達式求解過程的理解。
(1)“||”運算符左邊表達式的值為真(非0)時,不再計算右邊的表達式。
(2)“&&”運算符左邊表達式的值為假(0)時,不再計算右邊的表達式。
【實驗1-4】運行以下程序,分析各表達式輸出的結果。
#include<stdio.h> void main() {int a,b,c,i,j; printf("%d\n",5%3*2/6-!5); printf("%d\n",5>=2+1-(3<5)); i=2; j=4; printf("%d\n",++i-j--); printf("%d\n",i+=i*=j); printf("%d\n",i=3/2*(j=3-2)); a=1; b=2; c=3; printf("%d\n",!a&&b++); printf("%d\n",a||b+2&&a*b); printf("%d\n",++a,b=10,a+5); printf("%d\n",a+=b%=a+b); printf("a=%d,b=%d,c=%d\n",a,b,c); printf("%d\n",a>b?a:c>b?c:b); }
本題指導
本題涉及算術、邏輯、符合賦值、條件運算、逗號等多重運算符和表達式。
(1)在分析表達式的運算過程及結果時,需注意掌握并分析以下幾個方面:
①表達式中各種運算符的功能和對操作數類型的要求;
②根據各運算符的優先級和結合性,正確分析運算的先后次序;
③根據各運算符的功能、操作數類型、運算過程中的類型轉換,確定運算結果的值及類型。
(2)逗號表達式求解時,會順序執行每一個表達式,整個表達式的值為最后一個表達式的值。
(3)對于賦值和復合賦值運算,需注意以下兩點:
①復合賦值運算的過程是,首先根據賦值運算符前的運算符,復合賦值運算符左邊的變量和復合賦值運算符右邊的表達式進行相應的運算,然后將該運算結果賦值給復合賦值運算符左邊的變量。例如,表達式“x+=y+1”等于“x=x+(y+1)”。
②對于賦值和復合賦值表達式,其結果類型為賦值和復合賦值運算符左邊變量的類型。
【實驗1-5】按下面要求運行程序 lab1-5.C,分析并觀察運行結果。理解字符的輸入與輸出,對結果進行合理的解釋。
#include <stdio.h> void main() {int a,b,c; char x,y,z; scanf(“a=%d,b=%d”,&a,&b); scanf(“%c%c%c”,&x,&y,&z); c=a+b; printf(“%d+%d=%d”,a,b,c); printf(“%c%c%c”,x,y,z); }
本題指導
本題主要是練習字符數據的輸入輸出,并通過練習了解getchar、putchar、scanf和prtinf等函數在處理字符數據時的用法。
(1)利用scanf和prtinf函數實現外設和內存的數據交互,實現數據的標準輸入輸出。
(2)利用getchar和putchar函數可以實現一個字符數據的輸入輸出。調用putchar函數的時候,直接把待輸出的字符常量或者字符變量放到參數的圓括號內,例如輸出字符'a';那么可以寫成putchar('a');,每調用一次該函數,可以輸出一個字符。調用getchar函數的時候,直接從鍵盤輸入一個字符賦值給該函數左側的變量。輸入輸出一個字符時,可以用 scanf 和prtinf函數,也可以用getchar和putchar函數。
【實驗1-6】分析以下程序的輸出結果并上機驗證。
#include<stdio.h> void main() {short int a=32767,b=a+1; char c1=97,c2='b'; unsigned int d=54321; unsigned long e=1234567; float f=1.56789,g=-345.48; double m=12.67323,n=123.456789; printf("%d,%d\n",a,b); printf("%#o,%#lx\n",d,e); putchar(c1); printf("%c %c\n",c1,c2); printf("%+6f,%+5.4f\n",f,g); printf("m=%lf,n=%e\n",m,n); }
本題指導
本題主要是練習調用庫函數prtinf來輸出各種類型的數據。
(1)關于printf函數的幾點說明:
①printf函數的一般格式為:
printf(格式控制串,輸出列表);
其中,格式控制串是用雙引號引起來的字符串,也稱轉換控制字符串;輸出列表是需要輸出的一些數據項列表,數據項可以是變量或任何表達式。
②格式控制串中的字符分為兩類,一類是普通的ASCII碼字符(包括轉義字符),這些字符在輸出時將原樣輸出到屏幕;另一類是以百分號(%)和其他字符組成的格式控制符,如果輸出正常的話,在輸出時格式控制符將被輸出列表中相應位置上數據項的值替代。例如,在
printf("x=%d,y=%d,x+y=%d\n",x,y,x+y);
中,格式控制串中的字符'x'、'y'、'+'、'='、'\n'等都是普通ASCII碼字符,而%d是格式控制符。
③在printf函數中,格式說明符與輸出項從左到右在類型上必須一一對應匹配。如不匹配,將導致數據不能正確輸出,但此時C系統不報錯。另外,格式說明符與輸出項的個數一般應該相同,如果格式說明的個數少于輸出項的個數,多余的輸出項不予輸出;如果格式說明的個數多于輸出項的個數,則對于多余的格式將輸出不定的值。
有關printf函數更詳細的用法,請參考理論教材或其他資料。
(2)在給變量進行初始化或賦值時,一定要注意變量所表示的數的范圍。如本例中整數32767加1后輸出為-32768。
【實驗1-7】輸入并運行下面的程序。為使變量 a、b、x、y、c1、c2的值分別為3、7、3.2、2.4、'a'、'b',運行程序時正確的數據輸入形式是什么?
#include<stdio.h> void main() { int a,b; float x,y; char c1,c2; scanf("a=%d b=%d",&a,&b); scanf("x=%f y=%f",&x,&y); scanf("c1=%c c2=%c",&c1,&c2); printf("a=%d,b=%d,x=%f,y=%f,c1=%c,c2=%c\n",a,b,x,y,c1,c2); }
本題指導
(1)本題進一步練習scanf函數及其對應的鍵盤輸入格式。
scanf函數的一般形式可寫為:
scanf(格式控制串,輸入項地址列表);
其中格式控制串中的字符分為兩類,一類是普通的ASCII碼字符(包括部分轉義字符如'\n'、'\t'等),這些字符在程序運行時必須從鍵盤原樣輸入;另一類是以百分號(%)和其他字符組成的格式控制符,輸入時格式控制符位置上應輸入對應類型的數據值常量。輸入項地址列表是變量或數組元素的地址。
(2)說明:如果要獲得以上的數據,正確的輸入應該是(“└┘”表示空格符):
a=3└┘b=7x=3.2└┘y=2.4c1=a└┘c2=b↙
由于輸入時scanf函數若遇到回車鍵將視為輸入結束,因此,如果在輸入完“a=3└┘b=7”后直接回車,則后面的幾個變量則無法正確接收數據。
(3)由于scanf函數的格式控制串中,普通ASCII碼字符(包括部分轉義字符如'\n'、'\t'等)應原樣輸入,為了避免輸入時出錯或過于煩瑣,在格式控制串中應盡量少使用不必要的普通字符。
三、思考與練習
(1)C語言程序的書寫需要注意哪些方面?
提示:最基本的方面包括兩方面。一是保證程序書寫的正確性;二是要有良好的書寫風格(如格式清晰、添加必要的注釋等),以便自己和他人容易閱讀。
(2)通過查閱本書附錄Ⅱ或其他資料,熟悉編譯、連接過程中常用提示信息的含義。
提示:正確理解這些提示信息,便于查找及改正源程序中的錯誤和其他錯誤。有經驗的程序員會非常注意這些提示信息。
(3)分析下面程序的運行結果,并上機驗證。
#include<stdio.h> void main() { int a,b,i,j; a=b=i=j=10; a+=i++; b-=++j; printf("a=%d,b=%d,i=%d,j=%d\n",a,b,i,j); }
(4)在printf函數中,如果輸出項列表與格式符的數目不匹配,會有怎樣的輸出結果?同樣地,如果是在 scanf 函數中出現了輸入項地址列表與格式符不相匹配的情況,又會對輸入造成怎樣的影響?試編寫程序驗證。
- Android Jetpack開發:原理解析與應用實戰
- JavaScript修煉之道
- 小創客玩轉圖形化編程
- Learning ArcGIS Pro 2
- Learning Informatica PowerCenter 10.x(Second Edition)
- 信息安全技術
- Multithreading in C# 5.0 Cookbook
- CoffeeScript Application Development Cookbook
- Learning Modular Java Programming
- 分布式數據庫HBase案例教程
- Python數據科學實踐指南
- Java Web動態網站開發(第2版·微課版)
- Microsoft Dynamics GP 2013 Cookbook
- ASP.NET Core and Angular 2
- VC++ 2008專題應用程序開發實例精講