《C語言程序設(shè)計項目化教程》課件第1章_第1頁
《C語言程序設(shè)計項目化教程》課件第1章_第2頁
《C語言程序設(shè)計項目化教程》課件第1章_第3頁
《C語言程序設(shè)計項目化教程》課件第1章_第4頁
《C語言程序設(shè)計項目化教程》課件第1章_第5頁
已閱讀5頁,還剩282頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

項目1簡單C語言程序設(shè)計1.1問題情境1.2問題分析1.3項目設(shè)計與實施1.4知識拓展1.5應(yīng)用實踐

學(xué)校或教育培訓(xùn)機(jī)構(gòu)在期末考試之后,要將學(xué)生考試成績等資料輸入計算機(jī),并按一定的要求計算成績及實現(xiàn)成績輸出,即設(shè)計一個學(xué)生成績管理系統(tǒng)。1.1問題情境

要完成學(xué)生成績的輸入/輸出及計算,首先,要設(shè)計學(xué)生成績的輸入/輸出功能,其次,系統(tǒng)還要實現(xiàn)對成績進(jìn)行求總分及求平均值等方面的計算。1.2問題分析在C語言中,數(shù)據(jù)的輸入/輸出及計算是通過C語言提供的標(biāo)準(zhǔn)庫函數(shù)來完成的。如,scanf()函數(shù)和printf()函數(shù)就屬于輸入/輸出類標(biāo)準(zhǔn)庫函數(shù),分別被稱為格式輸入和格式輸出函數(shù);又如,求算術(shù)平方根的sqrt()函數(shù)和求整數(shù)絕對值的abs()函數(shù)均屬于數(shù)學(xué)類標(biāo)準(zhǔn)庫函數(shù)。根據(jù)不同功能將函數(shù)按照不同類型存儲在不同的庫文件中,每一個庫文件又包含了功能相近的一類庫函數(shù)。如,“stdio.h”庫文件,稱為輸入/輸出類庫文件,包含了與輸入/輸出類有關(guān)的庫函數(shù);又如,“math.h”庫文件,稱為數(shù)學(xué)類庫文件,包含了與數(shù)學(xué)運算有關(guān)的函數(shù)。有關(guān)其他庫文件及包含的庫函數(shù)詳見附錄C。

按照本項目的任務(wù)要求,應(yīng)用scanf()函數(shù)實現(xiàn)數(shù)據(jù)的輸入,應(yīng)用printf()函數(shù)實現(xiàn)數(shù)據(jù)的輸出,應(yīng)用加、減、乘、除等算術(shù)運算實現(xiàn)求總分及求平均值等方面的計算。

C語言是一種面向過程的并且很靈活的程序設(shè)計語言,它給編程人員提供了許多程序設(shè)計技巧。C語言的語法源自ANSIC標(biāo)準(zhǔn)(ANSI:美國國家標(biāo)準(zhǔn)化協(xié)會)。掌握了C語言后,再學(xué)C++、VC++、Java等其他語言就比較容易了。1.3項目設(shè)計與實施通過本項目的學(xué)習(xí),初步認(rèn)識C語言,并理解C語言程序的基本結(jié)構(gòu)、語法規(guī)則及輸出語句printf()函數(shù)的使用,掌握C語言程序的編譯、連接與運行過程,學(xué)會在VisualC++6.0環(huán)境下運行C語言程序的基本操作。

【項目分析】

項目1的程序設(shè)計從設(shè)計思路上可以考慮兩種方法:第一種方法是只用一個主函數(shù)main()來完成任務(wù);第二種方法是用主函數(shù)main()和其他若干個自定義函數(shù)來完成任務(wù),其中,自定義函數(shù)是用戶根據(jù)任務(wù)的需要自己設(shè)計的又能完成相對獨立功能的C程序。

若任務(wù)中包含若干個功能相對獨立的任務(wù),在程序設(shè)計時,應(yīng)首先考慮第二種方法。第二種方法也稱為模塊化程序設(shè)計。

【項目實施】

下面分別給出兩種方法的程序設(shè)計及源程序代碼。

方法一:使用只有一個主函數(shù)main()的程序設(shè)計。

程序如下:

#include<stdio.h> //文件包含命令

voidmain() //主函數(shù)main()

{

intstu1,stu2,stu3;

floatsum,ave;

printf("請輸入3個學(xué)生的成績:");

scanf("%d%d%d",&stu1,&stu2,&stu3);

sum=stu1+stu2+stu3;

ave=sum/3;

printf("3個學(xué)生的個人成績?yōu)?");

printf("%d%d%d\n",stu1,stu2,stu3);

printf("3個學(xué)生的成績之和為:");

printf("sum=%f\n",sum);

printf("3個學(xué)生的平均成績?yōu)?");

printf("ave=%5.2f\n",ave);

}方法二:使用一個主函數(shù)main()和一個自定義函數(shù)fun()的程序設(shè)計,其中,函數(shù)fun()的功能是完成總成績的計算。

程序如下:

#include<stdio.h> //預(yù)處理命令或稱文件包含命令行

floatfun(intx,inty,intz) //一個自定義函數(shù)fun()

{

floatsum;

sum=x+y+z;

returnsum;

}

voidmain() //一個主函數(shù)main()

{

intstu1,stu2,stu3;

floatsum,ave;

printf("請輸入3個學(xué)生的成績:");

scanf("%d%d%d",&stu1,&stu2,&stu3);

sum=fun(stu1,stu2,stu3);

ave=sum/3;

printf("3個學(xué)生的個人成績?yōu)?");

printf("%d\t%d\t%d\n",stu1,stu2,stu3);

printf("3個學(xué)生的成績之和為:");

printf("sum=%d\n",sum);

printf("3個學(xué)生的平均成績?yōu)?");

printf("ave=%5.2f\n",ave);

}

方法一與方法二,其程序運行結(jié)果相同,如圖1-1所示。圖1-1程序運行結(jié)果

【項目總結(jié)】

本項目在程序設(shè)計上給出了兩種設(shè)計方法,其中,方法一采用只有一個主函數(shù)main()來完成任務(wù)的程序設(shè)計,方法二采用只有一個主函數(shù)main()和一個自定義函數(shù)fun()完成任務(wù)的程序設(shè)計。在方法選擇上,方法一主要用于任務(wù)中功能相對獨立且簡單的程序設(shè)計,方法二主要用于任務(wù)中功能較多且相對獨立的程序設(shè)計,即方法二用于具有較為復(fù)雜任務(wù)的程序設(shè)計。

【知識總結(jié)】

從上述簡單C程序設(shè)計可以看出,要完成學(xué)生成績管理程序設(shè)計,需具備以下知識結(jié)構(gòu):

(1)了解C語言的程序結(jié)構(gòu)及語法規(guī)則。

(2)掌握scanf()函數(shù)和printf()函數(shù)的用法。

(3)了解C語言的運行環(huán)境VC++6.0及操作步驟。

(4)了解一個主函數(shù)和若干個自定義函數(shù)的程序結(jié)構(gòu)及語法規(guī)則。

(5)懂得stu1、stu2、stu3、sum、ave等變量的含義及使用規(guī)則,即掌握C語言的數(shù)據(jù)類型。

(6)掌握算術(shù)運算符及運算規(guī)則,即掌握C語言的算術(shù)運算及表達(dá)式。1.3.1C語言程序的基本結(jié)構(gòu)

1.?C語言的發(fā)展

在C語言誕生以前,系統(tǒng)軟件(例如操作系統(tǒng))主要是用匯編語言編寫的。由于匯編語言程序依賴于計算機(jī)硬件,其可讀性和可移植性都很差,但一般的高級語言又難以實現(xiàn)對計算機(jī)硬件的直接操作(這正是匯編語言的優(yōu)勢),于是人們盼望有一種兼有匯編語言和高級語言特性的新語言。C語言就是在這種背景下應(yīng)運而生的。

C語言是貝爾實驗室于20世紀(jì)70年代初期研制出來的,并隨著UNIX操作系統(tǒng)的日益廣泛使用,迅速得到推廣。后來,C語言又被多次改進(jìn),并出現(xiàn)了多種版本。20世紀(jì)80年代初(1983年),美國國家標(biāo)準(zhǔn)化協(xié)會(ANSI)根據(jù)C語言問世以來各種版本對C語言的發(fā)展和擴(kuò)充,制定了ANSIC標(biāo)準(zhǔn)(1989年再次做了修訂)。本書以ANSIC標(biāo)準(zhǔn)來介紹。

目前,在微機(jī)上廣泛使用的C語言編譯系統(tǒng)有MicrosoftC(簡稱MSC)、TurboC(簡稱TC)、BorlandC(簡稱BC)等。雖然它們的基本部分都是相同的,但還是有一些差異,所以請讀者注意自己所使用的C編譯系統(tǒng)的特點和規(guī)定(可參閱相應(yīng)的手冊了解)。本書選定的上機(jī)環(huán)境是VC++6.0及TurboC2.0。

2.C語言程序的基本結(jié)構(gòu)及特點

C語言程序基本結(jié)構(gòu)有以下兩種表現(xiàn)形式:

(1)僅由一個main()函數(shù)(又稱主函數(shù))構(gòu)成,程序結(jié)構(gòu)如圖1-2(a)所示。

(2)由一個且只能有一個main()函數(shù)和若干個其他自定義函數(shù)組合而成,程序結(jié)構(gòu)如圖1-2(b)所示。其中,自定義函數(shù)由用戶自己設(shè)計。圖1-2C語言程序結(jié)構(gòu)圖結(jié)合上述學(xué)生成績管理C語言程序,可以看出C語言程序結(jié)構(gòu)有以下基本特點:

(1)

C語言程序是由函數(shù)(如main函數(shù))組成的,每一個函數(shù)完成相對獨立的功能。函數(shù)是C語言程序的基本模塊單元(或稱基本單位)。main是函數(shù)名,函數(shù)名后面的一對圓括號()是寫函數(shù)的參數(shù)的,參數(shù)可以有,也可以沒有(本程序沒有參數(shù)),但圓括號()不能省略。

(2)一個C語言程序的執(zhí)行總是從main()函數(shù)開始。主函數(shù)執(zhí)行完畢,程序執(zhí)行結(jié)束。

(3)

C語言編譯系統(tǒng)區(qū)分字母大小寫,C語言把大小寫字母視為兩個不同的字符,并規(guī)定每條語句或數(shù)據(jù)說明均以分號(

;

)結(jié)束,分號是語句不可缺少的組成部分。

(4)

C語言程序中所調(diào)用的函數(shù),既可以使用由系統(tǒng)提供的庫函數(shù),也可以由設(shè)計人員自己根據(jù)需要而設(shè)計。printf()函數(shù)是C語言編譯系統(tǒng)庫函數(shù)中的一個函數(shù),它的作用是在屏幕上按指定格式輸出指定的內(nèi)容。

(5)允許使用注釋。一個高質(zhì)量的程序,在其源程序中都應(yīng)加上必要的注釋,以增強(qiáng)程序的易讀性。C語言的注釋格式為

/*注釋內(nèi)容*/或//注釋內(nèi)容

說明:

(1)在源程序中,凡用“//”開頭后面是文字,或“/*”開頭“*/”結(jié)尾中間是文字,都是注釋內(nèi)容。

(2)“/*”和“*/”必須成對使用,且“/”和“*”以及“*”和“/”之間不能有空格,否則就出錯。

(3)注釋行的位置,可以單獨占一行,也可以跟在語句的后面。注釋行在程序中屬于非執(zhí)行語句。

(4)如果一行寫不下,可另起一行繼續(xù)寫。

(5)注釋中允許使用漢字。在非中文操作系統(tǒng)下,看到的是一串亂碼,但不影響程序運行。1.3.2文件包含

文件包含是C語言預(yù)處理程序的一項重要功能。其命令行的一般形式為

#include"文件名"或#include<文件名>

文件包含命令的功能是把所指定的文件內(nèi)容插入到該命令行位置并取代該命令行,從而把指定的文件內(nèi)容和當(dāng)前的源程序文件組合連成一個源文件。

在程序設(shè)計中,文件包含是很有用的。一個大的程序可以分為多個模塊,由多個程序員分別編程。有些公用的符號常量或宏定義等可單獨組成一個文件,在其他文件的開頭用包含命令包含該文件即可使用。利用此方式,可避免在每個文件開頭都去定義那些公用量,從而節(jié)省時間,并減少出錯。

如現(xiàn)有源文件VC1-1.h,內(nèi)容如下:

#definePprintf

#defineD"%d,"

#defineF"%f\n"

以下程序?qū)C1-1.h進(jìn)行包含使用。

/*程序功能:利用文件包含描述輸出控制的各種效果*/

#include"VC1-1.h"

main()

{inta=5,c=8;

floatb=3.8,d=9.7;

P(DF,a,b);

P(DF,c,d);

}

程序運行結(jié)果為

5,3.800000

8,9.700000說明:

(1)包含命令中的文件名可以用雙撇號括起來,也可以用尖括號括起來。例如:#include"stdio.h"

#include<stdio.h>。兩種形式的主要區(qū)別為:使用尖括號表示在包含該文件的目錄中去查找(包含文件目錄由用戶在設(shè)置環(huán)境時設(shè)置),而不在源文件目錄中去查找;使用雙撇號則表示首先在當(dāng)前的源文件目錄中查找,若未找到才到包含文件目錄中去查找。用戶編程時,可根據(jù)被包含文件所在的目錄來選擇某一種命令形式。

(2)一個include命令只能指定一個被包含文件,若有多個文件要包含,則需用多個include命令。

(3)文件包含允許嵌套,即在一個被包含的文件中又可以包含另一個文件。1.3.3格式化輸出函數(shù)printf()

程序運行中,有時候需要從外部設(shè)備(例如鍵盤)上得到一些原始數(shù)據(jù),程序計算結(jié)束后,通常要把計算結(jié)果發(fā)送到外部設(shè)備(例如顯示器)上,以便人們對結(jié)果進(jìn)行分析。我們把程序從外部設(shè)備上獲得數(shù)據(jù)的操作稱為“輸入”,而把程序發(fā)送數(shù)據(jù)到外部設(shè)備的操作稱為“輸出”。不像其他的高級語言,C語言沒有專門的輸入/輸出語句,輸入/輸出的操作是通過調(diào)用C語言的庫函數(shù)來實現(xiàn)的。printf()函數(shù)是最常用的輸出函數(shù),它的作用是向計算機(jī)系統(tǒng)默認(rèn)的輸出設(shè)備(一般指顯示器)輸出一個或多個任意指定類型的數(shù)據(jù)。調(diào)用printf()函數(shù)的一般格式為

printf("格式字符串",[輸出項表]);

其中,“格式字符串”是由控制輸出格式的字符組成的字符串;“輸出項表”是用逗號分隔的若干個表達(dá)式(注:方括號[]中的內(nèi)容可以省略,以下相同)。C語言系統(tǒng)將按照自右向左的順序,依次計算“輸出項表”中諸表達(dá)式的值,然后按照“格式字符串”中規(guī)定的格式輸出到顯示器上顯示。函數(shù)返回值為返回輸出數(shù)據(jù)的個數(shù)。例如:

printf("radius=%f\nlength=%7.2f,area=%7.2f\n",r,l,a);格式字符串也稱格式控制字符串或格式轉(zhuǎn)換字符串,其中可包含下列三種字符:

(1)格式指示符。例如

"%d"、"%lf"、"%7.2f"

等,這些字符串用來控制數(shù)據(jù)的輸出格式。

(2)轉(zhuǎn)義字符。這些字符通常用來控制光標(biāo)的位置。

(3)普通字符。除格式指示符和轉(zhuǎn)義字符之外的其他字符,這些字符輸出時按原樣輸出,例如上面例子中的

"radius="

等。輸出項表由若干個輸出項構(gòu)成,輸出項之間用逗號來分隔,每個輸出項既可以是常量、變量,也可以是表達(dá)式。有時候,調(diào)用printf()函數(shù)時,也可以沒有輸出項,在這種情況下,一般輸出一些提示信息,例如:

printf("Hello,world!\n");

1.格式指示符

格式指示符的一般形式為

%[修飾符]格式字符

1)格式字符

printf函數(shù)中常用的格式字符如表1-1所示。

表1-1printf函數(shù)中常用的格式字符續(xù)表2)長度修飾符

長度修飾符“l(fā)”或“L”加在

%

和格式字符之間。輸出長整型數(shù)據(jù)的時候,一定要加長度修飾符,否則,得不到正確的顯示結(jié)果。例如:

voidmain()

{

longx=65432;

printf("x=%ld\n",x);

printf("x=%d\n",x);

}

輸出結(jié)果為

x=65432(正確結(jié)果)

x=-104(錯誤結(jié)果)

3)寬度修飾和精度修飾

可以在

%

和格式字符之間加入形如“m.n”(m、n均為整數(shù))的修飾。其中:m為寬度修飾;n為精度修飾。寬度修飾用來指定數(shù)據(jù)的輸出寬度。精度修飾對不同的格式字符,作用不同:對于格式字符f,用來指定輸出小數(shù)位的位數(shù);對于格式字符e,用來指定輸出有

效數(shù)字的位數(shù);對于格式字符d,用來指定必須輸出的數(shù)字的個數(shù)。相關(guān)的例子如表1-2所示。

表1-2寬度修飾和精度修飾示例4)左對齊修飾

如果在指定寬度修飾時,指定寬度大于數(shù)據(jù)需要的實際寬度,則數(shù)據(jù)左邊補空格,補夠指定的寬度,這種對齊方式稱為“右對齊”,系統(tǒng)默認(rèn)的輸出為右對齊;當(dāng)然也可以在數(shù)據(jù)的右邊補空格來補夠指定的寬度,這種對齊方式稱為“左對齊”。指定左對齊的時候,使用左對齊修飾符“-”,例如語句:

printf("%-7.2f\n",1.23456);

輸出結(jié)果為

1.23□□□(右邊補3個空格)

2.使用說明

(1)

printf()函數(shù)可以輸出常量、變量和表達(dá)式的值。但格式控制字符串中的格式指示符,必須按從左到右的順序,與輸出項表中的每個數(shù)據(jù)一一對應(yīng),否則出錯。

(2)格式字符x、e、g可以用小寫字母,也可以用大寫字母。使用大寫字母時,輸出數(shù)據(jù)中包含的字母也大寫。除了x、e、g格式字符外,其他格式字符必須用小寫字母,例如,%f不能寫成%F。

(3)格式字符緊跟在%后面就作為格式字符,否則將作為普通字符使用(原樣輸出),例如,printf("c=%c,f=%f\n",c,f);中的c=

和f=,都是普通字符。

(4)輸出項表的執(zhí)行方向為自右向左。例如:定義

intm=1;

則執(zhí)行printf("%d,%d\n",++m,m,m++);語句后的輸出結(jié)果為

3,2

注意:結(jié)果不是2,2,也不是2,3,原因請讀者思考。1.3.4C程序編譯環(huán)境及運行方法

目前,常用的C語言編譯環(huán)境有TurboC和VisualC++。有關(guān)在TurboC環(huán)境下編輯、運行C語言程序的基本操作將在項目5中介紹。本節(jié)主要介紹如何在VisualC++6.0環(huán)境下編輯、運行C語言程序的基本操作。

1.啟動VisualC++6.0環(huán)境

方法:單擊“開始”|“程序”|“MicrosoftVisualC++6.0”命令,啟動VisualC++6.0。

2.編輯源程序文件

1)建立新工程項目

步驟如下:

(1)選擇“文件”|“新建”菜單命令,彈出“新建”對話框。

(2)選擇“工程”選項卡,單擊“Win32ConsoleApplication”選項,在“工程名稱”文本框中輸入項目名,如xm,在“位置”文本框中輸入或選擇項目所在位置,如G\xm,單擊“確定”按鈕,如圖1-3所示。圖1-3“新建”對話框之新建工程

(3)在彈出的“Win32ConsoleApplication-步驟1共1步”對話框中選中“一個空工程”單選按鈕,單擊“完成”按鈕,如圖1-4所示。

(4)系統(tǒng)顯示“新建工程信息”對話框,單擊“確定”按鈕,完成工程項目的創(chuàng)建,如圖1-5所示。圖1-4“Win32ConsoleApplication-步驟1共1步”對話框圖1-5“新建工程信息”對話框

2)建立新項目中的文件

步驟如下:

(1)選擇“文件”|“新建”菜單命令,彈出“新建”對話框。

(2)選擇“文件”選項卡,單擊“C++SourceFile”選項,在“文件名”文本框中輸入文件名,如xm1-1,單擊“確定”按鈕,如圖1-6所示。系統(tǒng)自動返回VisualC++6.0主窗口。圖1-6“新建”對話框之新建文件

(3)在顯示的文件編輯區(qū)窗口中輸入源程序文件,如圖1-7所示。編輯完源程序之后選擇“文件”|“保存”菜單命令,或者直接單擊工具欄中的 按鈕保存,或者按快捷鍵Ctrl

+

S進(jìn)行保存。在編輯程序的時候要及時進(jìn)行保存,防止程序意外丟失。圖1-7輸入源程序

3.編譯

方法一:選擇主窗口菜單欄中的“組建”菜單項;系統(tǒng)彈出下拉菜單,選擇“編譯[xm1-1.cpp]”菜單命令。

方法二:直接單擊工具欄中的編譯按鈕 ,或者按快捷鍵Ctrl

+

F7進(jìn)行編譯。

注意:在編譯過程中,系統(tǒng)如發(fā)現(xiàn)程序有語法錯誤,則會在輸出區(qū)窗口中顯示錯誤和警告,給出錯誤和警告的性質(zhì)、出現(xiàn)位置和錯誤的原因等。如果雙擊某條信息,編輯區(qū)窗口左側(cè)出現(xiàn)一個箭頭,指示錯誤的程序行。用戶可據(jù)此對源程序進(jìn)行相應(yīng)的修改,并重新編譯,直到通過為止。如圖1-8所示,這個程序在編譯的過程中出現(xiàn)一個錯誤,雙擊錯誤信息的時候會看到編輯區(qū)窗口左側(cè)出現(xiàn)一個箭頭。值得注意的是,如果當(dāng)前語句缺少分號,運行環(huán)境會將箭頭指向缺少分號語句的下一行。在輸出區(qū)窗口可以看到錯誤的原因是缺少分號,對程序重新進(jìn)行修改,直到?jīng)]有錯誤。圖1-8錯誤信息指示

4.連接

方法一:選擇主窗口菜單欄中的“組建”菜單項;系統(tǒng)彈出下拉菜單,選擇“組建[xm1-1.exe]”菜單命令。

方法二:直接單擊工具欄中的連接按鈕 ,或者按快捷鍵F7進(jìn)行連接。

如果在連接的過程中,系統(tǒng)發(fā)現(xiàn)錯誤,將會在輸出窗口顯示所有的錯誤和警告信息,處理的方法和編譯的過程一樣,繼續(xù)進(jìn)行修改直到?jīng)]有錯誤信息為止。

5.運行

方法一:選擇主窗口菜單欄中的“組建”菜單項;系統(tǒng)彈出下拉菜單,選擇“ 執(zhí)行[xm1-1.exe]”菜單命令。

方法二:直接單擊工具欄中的運行按鈕 ,或者按快捷鍵Ctrl

+

F5進(jìn)行運行。

運行之后會出現(xiàn)一個黑屏顯示結(jié)果,按任意鍵就會回到編輯窗口。

注意:編輯一個新的C語言程序時,首先要選擇主窗口菜單欄中的“文件”|“關(guān)閉工作空間”菜單命令,然后再按照上述1至5的操作步驟編輯C程序即可。1.3.5C語言語句

C語言程序是由函數(shù)構(gòu)成的,而函數(shù)又是由函數(shù)說明和函數(shù)體兩部分組成的,其中函數(shù)體是函數(shù)的核心。與其他高級語言一樣,C語言也是利用函數(shù)體中的可執(zhí)行語句向計算機(jī)系統(tǒng)發(fā)出操作命令的。

按照語句功能或構(gòu)成的不同,可將C語言語句分為如下五類。

1.控制語句

控制語句完成一定的控制功能。C語言有9條控制語句,又可細(xì)分為3種:

(1)選擇結(jié)構(gòu)控制語句,包括

if()…else…,switch()…

(2)循環(huán)結(jié)構(gòu)控制語句,包括

Do…while(),for()…,while()…,break,continue

(3)其他控制語句,包括

goto,return

2.函數(shù)調(diào)用語句

函數(shù)調(diào)用語句由一次函數(shù)調(diào)用加一個分號(語句結(jié)束標(biāo)志)構(gòu)成。例如:

printf("ThisisaCProgram.");

3.表達(dá)式語句

表達(dá)式語句由表達(dá)式后加一個分號構(gòu)成。

表達(dá)式能構(gòu)成語句,是C語言的一大特色,最典型的表達(dá)式語句是在賦值表達(dá)式后加一個分號構(gòu)成的賦值語句。例如,“num=5”是一個賦值表達(dá)式,而“num=5;”卻是一個賦值語句。

4.空語句

空語句僅由一個分號構(gòu)成。顯然,空語句什么操作也不執(zhí)行。

5.復(fù)合語句

復(fù)合語句由大括號括起來的一組(也可以是一條)語句構(gòu)成。例如:

main()

{

{

inta=1,b;

b=a*a-1;復(fù)合語句

printf("%d",b);

}/*注意:右括號后可以不要分號*/

}說明:

(1)在語法上復(fù)合語句和簡單語句相同,即簡單語句可以出現(xiàn)的地方,都可以使用復(fù)合語句。

(2)復(fù)合語句可以嵌套,即復(fù)合語句中也可包含一個或多個復(fù)合語句。1.3.6C語言函數(shù)結(jié)構(gòu)和語法規(guī)則

1.C語言函數(shù)的一般結(jié)構(gòu)

任何函數(shù)(包括主函數(shù)main())都是由函數(shù)說明和函數(shù)體兩部分組成的。其一般結(jié)構(gòu)

如下:

[函數(shù)類型]函數(shù)名([函數(shù)形式參數(shù)表])/*函數(shù)說明部分*/

{

[數(shù)據(jù)說明部分]

/*函數(shù)體部分*/

函數(shù)執(zhí)行部分

}

函數(shù)說明部分由函數(shù)類型(可缺省)、函數(shù)名和函數(shù)形式參數(shù)表(簡稱形參表)三部分組成。其中,函數(shù)形參表的一般格式為

([數(shù)據(jù)類型參數(shù)1,][數(shù)據(jù)類型參數(shù)2,]…[數(shù)據(jù)類型參數(shù)n])

例如:

floatfun(intx,inty,intz)如果函數(shù)不需要參數(shù),則可用(void)或()表示,但主函數(shù)main()例外。

函數(shù)體部分由函數(shù)說明部分以下的一對大括號“{}”內(nèi)的若干條語句構(gòu)成。函數(shù)體一般又由數(shù)據(jù)說明部分和函數(shù)執(zhí)行部分兩部分構(gòu)成。如果一個函數(shù)內(nèi)有多對大括號,則最外面的一對大括號是函數(shù)體的范圍。

1)數(shù)據(jù)說明部分

數(shù)據(jù)說明部分由變量定義、自定義函數(shù)聲明、外部變量說明等部分組成,其中變量定義是主要的。例如,在本任務(wù)的實施方法一中,main()函數(shù)體里的“intstu1,stu2,stu3;”語句,定義了3個整形變量stu1、stu2和stu3。

2)函數(shù)執(zhí)行部分

函數(shù)執(zhí)行部分一般由若干條可執(zhí)行語句構(gòu)成。例如,在本任務(wù)的實施方法二的main()函數(shù)體中,除變量定義語句“intstu1,stu2,stu3;”和“floatsum,ave;”外,其余語句構(gòu)成該函數(shù)可執(zhí)行語句部分。

2.?C語言函數(shù)的語法規(guī)則

C語言函數(shù)的語法規(guī)則一般可歸納為以下4條。

(1)函數(shù)體中的數(shù)據(jù)說明語句,必須位于可執(zhí)行語句之前。換句話說,數(shù)據(jù)說明語句不能與可執(zhí)行語句交織在一起。例如,下面程序中變量定義語句“intmax;”的位置是非法的:

#include<stdio.h> /*文件預(yù)處理*/

voidmain() /*主函數(shù)名*/

{

intx,y; /*定義2個整形變量x和y*/

x=2; /*將2賦值給變量x*/

y=9; /*將9賦值給變量y*/

intmax; /*變量定義出現(xiàn)在賦值語句“x=3;”和“y=6;”之后,屬非法!*/

if(x>y)max=x;

elsemax=y; /*如果x>y成立,則將x賦值給max,否則,將y賦值給max*/

printf("max=%d\n",max); /*在屏幕上輸出max的值*/

}如何改正請讀者思考。

(2)如果不需要,也可以缺省數(shù)據(jù)說明語句。例如,下面程序缺省說明語句。

#include<stdio.h>

voidmain()

{

printf("Happynewyear!");

}程序運行結(jié)果為

Happynewyear!

(3)程序行的書寫格式自由,既允許一行內(nèi)寫多條語句,也允許一條語句分寫在多行上,但所有語句都必須以分號“;”結(jié)束。如果某條語句很長,一般需要將其分寫在多行上。例如:

#include<stdio.h>

voidmain()

{

floata,b,c,ave; /*定義a、b、c、ave為實型*/

a=7;b=9;c=12; /*將第2、第3、第4三行合并成1行*/

ave=(a+b+c)/3; /*計算平均值*/

printf("a=%f,b=%f,c=%f,ave=%f\n",

a,b,c,ave); /*一條語句可分兩行書寫*/

}

(4)允許使用注釋。一個高質(zhì)量的程序,在其源程序中,都應(yīng)加上必要的注釋,以增強(qiáng)程序的易讀性。1.3.7C語言函數(shù)的定義與調(diào)用

在C語言中,從用戶使用的角度看,函數(shù)可分為庫函數(shù)和用戶自定義函數(shù)兩種。

C語言提供了極為豐富的庫函數(shù),如scanf()、printf()、getchar()等函數(shù)均屬于庫函數(shù)。這類函數(shù)是由系統(tǒng)提供并定義好的,不必用戶再去定義,用戶只需掌握函數(shù)的功能,并學(xué)會正確地調(diào)用這些函數(shù)即可。

盡管C語言的函數(shù)庫提供了眾多的庫函數(shù),但與實際應(yīng)用的需要相比,還是遠(yuǎn)遠(yuǎn)不夠的,因此,C語言允許用戶按需要定義和編寫自己的函數(shù)。對于用戶自定義函數(shù),不僅要在程序中定義函數(shù)本身,即定義函數(shù)功能,而且在主調(diào)函數(shù)中,還必須對被調(diào)用函數(shù)進(jìn)行聲明。下面將對用戶自定義函數(shù)進(jìn)行詳細(xì)說明。

1.?C語言函數(shù)定義的一般形式

1)無參函數(shù)定義的一般形式

類型名函數(shù)名(void)

{說明部分

執(zhí)行部分

}

無參函數(shù)即函數(shù)沒有參數(shù),因此,函數(shù)首部的“參數(shù)定義表”可以缺省(但括號不能缺省),也可以用“void”表示。

無參函數(shù)若無返回值,則其首部的類型標(biāo)識符也用“void”表示。

2)有參函數(shù)定義的一般形式

類型名函數(shù)名(類型名參數(shù)名1[,類型名參數(shù)名2…])

{說明部分

執(zhí)行部分

}

【例1.1】定義一個函數(shù),用于求兩個數(shù)中的較大數(shù)。

程序如下:

#include<stdio.h>

intmax(intn1,intn2); /*函數(shù)聲明語句*/

voidmain()

{

intnum,num1,num2;

printf("Inputtwointegernumbers:");

scanf("%d,%d",&num1,&num2);

num=max(num1,num2); /*調(diào)用max()函數(shù)*/

printf("max=%d\n",num);

getch(); /*使程序暫停,按任一鍵繼續(xù)*/

}

intmax(intn1,intn2) /*自定義max()函數(shù)*/

{

intt;

t=n1>n2?n1:n2;

return(t);

}

程序運行情況如下:

Inputtwointegernumbers:12,34↙(↙表示按回車鍵,下同)

max=34本例程序由main()和max()兩個函數(shù)構(gòu)成。max()函數(shù)的返回值是一個整型數(shù),max()函數(shù)帶兩個整型參數(shù),它們的具體值是由main()函數(shù)在調(diào)用時傳送過來的。在max()函數(shù)體中的return語句,把所求得的函數(shù)值t返回給main()函數(shù)。為了說明方便,通常將本例中的main()函數(shù)稱為主調(diào)函數(shù),而把max()函數(shù)稱為被調(diào)用函數(shù)。有參函數(shù)在其參數(shù)定義表中定義了所需的每一個參數(shù)的類型和名稱。每一個參數(shù)單獨定義,參數(shù)定義之間用逗號(

,

)隔開。如例1.1中的max()函數(shù)就是一個有參函數(shù),在函數(shù)首部定義了函數(shù)返回值的類型為int,函數(shù)名為max,參數(shù)n1和n2均為int類型;函數(shù)體中完成的功能為:選出n1和n2中較大的一個數(shù)作為函數(shù)值返回。

調(diào)用有參函數(shù)時,主調(diào)函數(shù)將賦予這些參數(shù)實際的值。為了與主調(diào)函數(shù)提供的實際參數(shù)區(qū)別開,將自定義函數(shù)首部參數(shù)定義表中所定義的參數(shù)稱為形式參數(shù),簡稱形參,而將主調(diào)函數(shù)提供的實際參數(shù)簡稱實參。有參函數(shù)若無返回值,則其首部的類型標(biāo)識符也用“void”表示。

說明:

(1)除main()函數(shù)外,函數(shù)名和形參名都是由用戶自己依據(jù)C語言規(guī)定命名的。主函數(shù)main()既可以放在自定義函數(shù)(如max()函數(shù))之前,也可以放在自定義函數(shù)之后。

(2)函數(shù)定義不允許嵌套。在C語言中,所有函數(shù)(包括主函數(shù)main())都是平行的。在一個函數(shù)的函數(shù)體內(nèi),不能再定義另一個函數(shù),即不能嵌套定義。例1.1體現(xiàn)了這一點。

(3)可以定義空函數(shù)。所謂空函數(shù)是指既無參數(shù)且函數(shù)體又為空的函數(shù)。其一般形式為

void函數(shù)名(void)

{}

例如:

voiddummy(void)

{}

就是定義了一個空函數(shù)dummy()。調(diào)用空函數(shù)時,什么操作也不做,沒有任何實際作用。通常,在程序設(shè)計中,將未編寫好的功能模塊暫時用一個空函數(shù)占一個位置,便于將來擴(kuò)充。

(4)在舊版本的C語言中,參數(shù)定義表允許放在函數(shù)首部的第二行單獨指定。例如,例1.1中的max()函數(shù)可寫成如下形式:

intmax()

intn1,n2;

{

intt;

t=n1>n2?n1:n2;

return(t);

}

在新標(biāo)準(zhǔn)的C語言版本中,不允許缺省參數(shù)定義表,請讀者在程序設(shè)計和閱讀其他參考書時注意。

(5)主函數(shù)main()的函數(shù)名main是系統(tǒng)定義的。main()函數(shù)若無參數(shù)也可以用“void”表示。main()函數(shù)無返回值,其類型也可以表示為“void”,即main()函數(shù)的首部可表示為voidmain(void)。

(6)當(dāng)一個C源程序由多個函數(shù)構(gòu)成時,必須有一個唯一的main()函數(shù)。main()函數(shù)在源程序中的位置可以任意,程序的執(zhí)行總是從main()函數(shù)開始,最終從main()函數(shù)結(jié)束。如例1.1中main()函數(shù)在max函數(shù)之前。C語言規(guī)定,main()函數(shù)也可以放在其他函數(shù)中間或之后。

2.函數(shù)的返回值與函數(shù)類型

函數(shù)的返回值就是調(diào)用函數(shù)求得的函數(shù)值。C語言中的函數(shù)兼有其他語言中的函數(shù)和過程兩種功能,從這個角度看,又可把函數(shù)分為有返回值函數(shù)和無返回值函數(shù)兩種。有返回值函數(shù)相當(dāng)于其他語言中的函數(shù),而無返回值函數(shù)相當(dāng)于其他語言中的過程。函數(shù)類型就是函數(shù)定義首部的類型名所定義的類型,即函數(shù)返回值的類型。

1)函數(shù)返回值與return語句

函數(shù)的返回值是通過函數(shù)中的return語句來獲得的。

return語句的格式如下:

return表達(dá)式;

或return(表達(dá)式);

或[return;]

return語句的功能:返回主調(diào)函數(shù),并將“表達(dá)式”的值帶回給主調(diào)函數(shù)。當(dāng)程序執(zhí)行到函數(shù)體的return語句時,程序的流程就返回到主調(diào)函數(shù)中調(diào)用該函數(shù)處,并將“表達(dá)式”的值作為函數(shù)值帶回到調(diào)用處。例如,例1.1中的max()函數(shù),其中的

“return(t);”語句的功能就是返回到main()函數(shù)的“num=max(num1,num2);”語句中,并將表達(dá)式“(t)”的值作為函數(shù)值賦給num變量。無參函數(shù)和有參函數(shù)都可以有返回值,有返回值的函數(shù)體中必須有return語句,并可根據(jù)需要有多個return語句。例如,例1.1中的max()函數(shù)可改寫為

intmax(intn1,intn2)

{

if(n1>n2)returnn1;

elsereturnn2;

}

其功能與例1.1中的max()完全一樣。無參函數(shù)和有參函數(shù)也都可以沒有返回值,無返回值函數(shù)的末尾可以有一個不帶表達(dá)式的return語句,或缺省return語句。

【例1.2】分別計算1~100的累加和與1~10的累乘積。

程序如下:

#include<stdio.h>

voidadd(intk)

{

inti,s=0;

for(i=1;i<=k;i++)s+=i;

printf("1+2+3+…+%d=%d\n",k,s);

return;

}

longfact(void)

{

inti;longp=1;

for(i=1;i<=10;i++)p*=i;

returnp;

}

voidmain()

{

intm=100;

add(m);

printf("10!=%ld\n",fact());

}程序運行結(jié)果如下:

1+2+3+…+100=5050

10!=3628800

例1.2中的add()函數(shù)有參數(shù)而無返回值,fact()函數(shù)無參數(shù)而有返回值。

2)函數(shù)類型

函數(shù)類型就是函數(shù)定義首部的類型名所定義的類型,也就是函數(shù)返回值的類型,因此,在定義函數(shù)時,無返回值函數(shù)的類型定義為void,有返回值函數(shù)的類型應(yīng)與return語句中返回值表達(dá)式的類型一致。

當(dāng)有返回值函數(shù)的類型定義與return語句中表達(dá)式的類型不一致時,則以函數(shù)類型定義為準(zhǔn),對于數(shù)值型數(shù)據(jù)能自動進(jìn)行類型轉(zhuǎn)換,否則,按出錯處理。

如果缺省函數(shù)類型定義,則系統(tǒng)一律按整型處理。例如,例1.1中的max()函數(shù)定義為int類型,其中的類型名int允許缺省。

【例1.3】求兩個實數(shù)中較大數(shù)的整數(shù)值。

程序如下:

#include<stdio.h>

voidmain()

{intmax(floatx,floaty);

floata,b;intc;

printf("Inputtwofloatnumbers:");

scanf("%f,%f",&a,&b);

c=max(a,b);

printf("max=%d\n",c);

}

intmax(floatx,floaty)

{

floatz;

z=x>y?x:y;

returnz;

}

程序運行情況如下:

Inputtwofloatnumbers:3.6,5.8↙

max=5該例中max()函數(shù)的定義缺省了類型名,系統(tǒng)默認(rèn)為int類型,return語句中的表達(dá)式z為float類型,其值5.8自動轉(zhuǎn)換為整數(shù)5返回給main()函數(shù)中的“c=max(a,b);”語句并賦給變量c。

3.對被調(diào)用函數(shù)的聲明和函數(shù)原型

1)對被調(diào)用函數(shù)的聲明

C程序中的一個函數(shù)要調(diào)用另一個函數(shù)必須具備以下兩個條件。

(1)被調(diào)用函數(shù)已經(jīng)存在。若是庫函數(shù),則系統(tǒng)已經(jīng)定義,否則需要用戶自己定義。

(2)在主調(diào)函數(shù)中對被調(diào)用函數(shù)先聲明,然后才能調(diào)用。

對被調(diào)用函數(shù)在調(diào)用前先聲明,與使用變量之前要先進(jìn)行變量定義是一樣的。其目的是使編譯系統(tǒng)知道被調(diào)用函數(shù)返回值的類型,以及函數(shù)參數(shù)的個數(shù)、類型和順序,便于調(diào)用時對主調(diào)函數(shù)提供的參數(shù)值的個數(shù)、類型及順序是否一致,函數(shù)值的類型是否正確等進(jìn)行對照檢查,保證調(diào)用的合法性。例如,例1.1主函數(shù)main()中的“intmax(intn1,intn2);”語句,例1.3主函數(shù)main()中的“intmax(floatx,floaty);”語句,都是對被調(diào)用函數(shù)的聲明。

2)函數(shù)原型

在ANSIC新標(biāo)準(zhǔn)中,采用函數(shù)原型方式,對被調(diào)用函數(shù)進(jìn)行聲明,其一般格式如下:

類型名函數(shù)名(類型名[,類型名…]);

類型名函數(shù)名(類型名參數(shù)名1[,類型名參數(shù)名2…]);

例如,例1.1和例1.3中對函數(shù)的聲明分別可寫成“intmax(int,int);”和“intmax(float,float);”形式。

其中,參數(shù)的“參數(shù)名”可以缺省,因為編譯系統(tǒng)并不檢查參數(shù)名,帶上參數(shù)名只是為了提高程序的可讀性??梢姡瘮?shù)原型與函數(shù)定義的首部是一致的,各參數(shù)的順序也必須與函數(shù)首部定義的一致,但函數(shù)聲明單獨作為一條說明語句,因此其末尾必須有分號(

;

)。

3)說明

(1)

C語言規(guī)定,在以下兩種情況下,可以省去對被調(diào)用函數(shù)的聲明。

①當(dāng)被調(diào)用函數(shù)的定義出現(xiàn)在主調(diào)函數(shù)之前時,可以缺省對被調(diào)用函數(shù)的聲明。因為先定義的函數(shù)先編譯,在編譯主調(diào)函數(shù)時,被調(diào)用函數(shù)已經(jīng)編譯,其函數(shù)首部已經(jīng)起到了聲明的作用,即編譯系統(tǒng)已經(jīng)知道了被調(diào)用函數(shù)的函數(shù)類型、參數(shù)個數(shù)、類型和順序,編譯系統(tǒng)可以據(jù)此檢查函數(shù)調(diào)用的合法性,而在主調(diào)函數(shù)中不必再聲明。例1.2就屬于這種情況。②如果在所有函數(shù)定義之前,在函數(shù)外部(例如源文件開始處)預(yù)先對各個被調(diào)用函數(shù)進(jìn)行了聲明,則在主調(diào)函數(shù)中可缺省對被調(diào)用函數(shù)的聲明。例如,例1.3可改為

#include<stdio.h>

intmax(float,float);

voidmain()

{

floata,b;intc;

printf("Inputtwofloatnumbers:");

scanf("%f,%f",&a,&b);

c=max(a,b);

printf("max=%d\n",c);

}

max(floatx,floaty)

{

floatz;

z=x>y?x:y;

returnz;

}

程序功能未發(fā)生任何變化。

(2)函數(shù)定義和函數(shù)聲明是兩個不同的概念。

函數(shù)定義是對函數(shù)功能的確立,包括定義函數(shù)值的類型、函數(shù)名、函數(shù)參數(shù)及其函數(shù)體等,它是一個完整的、獨立的函數(shù)單位。在一個程序中,一個函數(shù)只能被定義一次,而且是在其他任何函數(shù)之外進(jìn)行。

函數(shù)聲明(有的書上也稱為“說明”)則是把函數(shù)的名稱、函數(shù)值的類型、參數(shù)的個數(shù)、類型和順序通知編譯系統(tǒng),以便在調(diào)用該函數(shù)時系統(tǒng)對函數(shù)名稱正確與否、參數(shù)的類型、個數(shù)及順序是否一致等進(jìn)行對照檢查。在一個程序中,除上述可以缺省函數(shù)說明的情況外,所有主調(diào)函數(shù)都必須對被調(diào)用函數(shù)進(jìn)行聲明,而且一般是在主調(diào)函數(shù)的函數(shù)體內(nèi)進(jìn)行的。

(3)對庫函數(shù)的調(diào)用不需要聲明,但必須把該庫函數(shù)的頭文件用#include命令包含在源文件開始處。如下面程序所示。

【例1.4】根據(jù)三角形三個邊的長度求三角形的面積。

程序如下:

#include<stdio.h>

#include<math.h>/*調(diào)用sqrt()函數(shù)需要包含的頭文件*/

voidmain()

{

floata,b,c,s,area;

printf("Inputthreefloatnumbers:\n");

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

s=(a+b+c)/2;

area=sqrt(s*(s-a)*(s-b)*(s-c));

printf("area=%.2f\n",area);

}

程序運行情況如下:

Inputthreefloatnumbers:

3.0,4.0,5.0↙

area=6.00這是因為頭文件“math.h”中包含了所有數(shù)學(xué)函數(shù)的原型,將該文件的內(nèi)容包含到程序的開頭部分,相當(dāng)于對所有數(shù)學(xué)函數(shù)作了聲明。

4.函數(shù)的調(diào)用

1)函數(shù)調(diào)用的一般形式

C語言中,函數(shù)調(diào)用的一般形式為

函數(shù)名([實際參數(shù)表])

調(diào)用無參函數(shù)時,缺省實際參數(shù)表,但圓括號不能省略。實際參數(shù)表中的參數(shù)可以是常量、變量或表達(dá)式。如果實參不止一個,則相鄰實參之間用逗號(

,

)分隔。

實參的個數(shù)、類型和順序,應(yīng)該與被調(diào)用函數(shù)的形參所要求的個數(shù)、類型和順序一致,才能正確地進(jìn)行參數(shù)傳遞。

例如,例1.1中的函數(shù)調(diào)用“num=max(num1,num2);”,其實參個數(shù)、類型和順序,都與被調(diào)用函數(shù)max()的形參所要求的個數(shù)、類型和順序一致。

2)函數(shù)調(diào)用的方式

按函數(shù)在程序中出現(xiàn)的位置來分,有三種函數(shù)調(diào)用方式。

①函數(shù)表達(dá)式。函數(shù)作為表達(dá)式的一項,出現(xiàn)在主調(diào)函數(shù)的表達(dá)式中,以函數(shù)返回值參與表達(dá)式的運算。這種方式要求函數(shù)是有返回值的。

例如,例1.1中的“num=max(num1,num2);”是一個賦值表達(dá)式語句,把max()函數(shù)的返回值賦予變量num。

②函數(shù)語句。在函數(shù)表達(dá)式后加分號(;)構(gòu)成表達(dá)式語句。C語言中的函數(shù)可以只進(jìn)行某些操作而不返回函數(shù)值,這時的函數(shù)調(diào)用可作為一條獨立的語句,相當(dāng)于其他語言中的子程序。這種方式要求函數(shù)是無返回值的。

例如,前面用到的庫函數(shù)printf()、scanf()函數(shù)等都是函數(shù)語句。

③函數(shù)實參。一個函數(shù)調(diào)用作為另一個函數(shù)調(diào)用的實際參數(shù)出現(xiàn)。這種情況把被調(diào)用函數(shù)的返回值作為實參進(jìn)行傳送,因此要求被調(diào)用函數(shù)必須是有返回值的。這種調(diào)用方式其本質(zhì)與調(diào)用方式(1)相同。例如,例1.2中的“printf("10!=%ld\n",fact())”語句,把fact()函數(shù)調(diào)用的返回值作為printf()函數(shù)的實參來使用。其執(zhí)行過程是:先調(diào)用fact()函數(shù),然后將其返回值作為調(diào)用printf()函數(shù)的實參。

3)說明

(1)調(diào)用函數(shù)時,函數(shù)名必須與具有該功能的被調(diào)用函數(shù)名完全一致。

(2)實參在類型上按順序與形參必須一一對應(yīng)和匹配。如果類型不匹配,C編譯程序?qū)促x值兼容的規(guī)則進(jìn)行轉(zhuǎn)換。如果實參和形參的類型不賦值兼容,通常并不給出出錯信息,且程序仍然繼續(xù)執(zhí)行,只是得不到正確的結(jié)果。

(3)如果實參表中包括多個參數(shù),對實參的求值順序隨系統(tǒng)而異。有的系統(tǒng)按自左向右的順序求實參的值,有的系統(tǒng)則相反。TurboC和MSC是按自右向左的順序進(jìn)行的。

【例1.5】函數(shù)實參的求值順序。

程序如下:

#include<stdio.h>

voidmain()

{

inti=8;

printf("%d,%d,%d,%d\n",++i,--i,i++,i--);

}

這個程序在不同的編譯系統(tǒng)中(實參的求值順序不同)就會得到不同的結(jié)果。如果按照自右向左的順序求值,本例的運行結(jié)果為:8,7,8,8。

如果按照自左向右的順序求值,本例的運行結(jié)果為:9,8,8,8。

應(yīng)特別注意的是,無論是自左向右求值,還是自右向左求值,其輸出順序不變,即輸出順序總是和實參表中的順序相同。由于VC規(guī)定是自右向左求值,所以正確結(jié)果應(yīng)為:8,7,8,8。

在程序設(shè)計中應(yīng)避免這種運行結(jié)果隨編譯系統(tǒng)而異的程序,上述程序可改為如下兩種形式:形式一:

voidmain()

{

inti=8,a,b,c,d;

a=++i;b=--i;c=i++;d=i--;

printf("%d,%d,%d,%d\n",a,b,c,d);

}

程序運行結(jié)果如下:

9,8,8,9

形式二:

voidmain()

{

inti=8,a,b,c,d;

a=i--;b=i++;c=--i;d=++i;

printf("%d,%d,%d,%d\n",a,b,c,d);

}

程序運行結(jié)果如下:

8,7,7,8

上述兩個程序不論在哪種編譯系統(tǒng)上運行,其結(jié)果都是一樣的。

5.函數(shù)的參數(shù)傳遞

1)形參與實參的參數(shù)傳遞

函數(shù)的參數(shù)分為形參和實參兩種,作用是實現(xiàn)參數(shù)傳送。形參在被調(diào)用函數(shù)的首部定義,必然是變量形式,只能在該函數(shù)體內(nèi)使用。實參在主調(diào)函數(shù)的函數(shù)調(diào)用表達(dá)式中提供,可以是表達(dá)式形式,函數(shù)調(diào)用時,主調(diào)函數(shù)把實參的值復(fù)制一份,傳送給被調(diào)用函數(shù)的形參變量,從而實現(xiàn)主調(diào)函數(shù)向被調(diào)用函數(shù)的參數(shù)傳遞。

【例1.6】編寫程序,計算

的值。

程序如下:

#include<stdio.h>

longfact(intn)

{

inti;

longs=1;

for(i=1;i<=n;i++)s=s*i;

returns;

}

voidmain()

{

longs=0;

intk,n;

printf("Inputanumber:");

scanf("%d",&n);

for(k=1;k<=n;k++)s=s+fact(k);

printf("1!+2!+…+%d!=%ld\n",n,s);

}程序運行情況如下:

Inputanumber:10↙

1!+2!+…+10!=4037914

本例程序中定義了一個fact()函數(shù),計算n!

的值。main()函數(shù)通過for循環(huán)語句在循環(huán)體內(nèi)調(diào)用fact()函數(shù),并將實參k的值傳遞給形參變量n,對fact()函數(shù)的返回值求和,存入變量s中。

2)說明

(1)實參可以是常量、變量、表達(dá)式、函數(shù)等。無論實參是何種類型的量,在進(jìn)行函數(shù)調(diào)用時,它們都必須具有確定的值,以便把這些值傳送給形參。因此,應(yīng)預(yù)先用賦值、輸入等方法,使實參獲得確定的值。

(2)形參變量只有在被調(diào)用時,才分配存儲單元;調(diào)用結(jié)束時,即刻釋放所分配的存儲單元。因此,形參只有在該函數(shù)內(nèi)有效。調(diào)用結(jié)束,返回主調(diào)函數(shù)后,則不能再使用該形參變量。

(3)實參對形參的參數(shù)傳送是單向的值傳遞,即只能把實參的值傳送給形參,而不能把形參的值反向地傳送給實參。如下面程序所示。

voidswap(intx,inty)

{

intt;

t=x;x=y;y=t;}

main()

{

inta=10,b=20;

swap(a,b);

printf("a=%d,b=%d\n",a,b);

}程序運行結(jié)果如下:

a=10,b=20

上面程序中main()函數(shù)調(diào)用swap()函數(shù),并將實參a和b的值分別傳遞給形參x和y,在swap()函數(shù)中交換了x和y的值,main()函數(shù)中a和b的值并未發(fā)生變化。

(4)函數(shù)的參數(shù)傳遞分值傳遞和地址傳遞兩種方式,上面介紹的是值傳遞方式,關(guān)于地址傳遞方式將在后續(xù)內(nèi)容中詳細(xì)介紹。1.3.8數(shù)據(jù)類型與標(biāo)識符

1.數(shù)據(jù)類型

數(shù)據(jù)是程序的必要組成部分,也是程序處理的對象。在C語言程序設(shè)計時,不同類型的數(shù)據(jù)都必須遵守“先說明,后使用”的原則,即程序中所用到的任何一個變量和數(shù)據(jù)都必須先說明其數(shù)據(jù)類型,然后才能使用。

C語言提供有豐富的數(shù)據(jù)類型,其數(shù)據(jù)類型及其分類關(guān)系如圖1-9所示。圖1-9C語言數(shù)據(jù)類型及分類關(guān)系圖

C語言中的數(shù)據(jù),有常量數(shù)據(jù)和變量數(shù)據(jù)之分,它們分別屬于圖1-9中所列的這些類型。

2.標(biāo)識符

1)標(biāo)識符的概念

標(biāo)識符是給程序中的變量名、數(shù)組名、自定義類型名(結(jié)構(gòu)類型、共用類型和枚舉類型)、自定義函數(shù)、標(biāo)號和文件等所起的名字。簡單地說,標(biāo)識符是由系統(tǒng)指定或由程序設(shè)計者指定的名字。

2)標(biāo)識符的命名規(guī)則

(1)字符規(guī)則。標(biāo)識符以字母或下劃線開頭,只能是由字母、數(shù)字和下劃線組成的字符序列。

例如,下面的變量名都是合法的:

sum,average,student_1,name,sex,age,lotus123,_tatol。

下面的變量名都是不合法的:

a+b,234,exe-1,student2,$ab.c,a.b.c。

(2)長度規(guī)則。標(biāo)識符長度隨系統(tǒng)而異。在TCV2.0中,標(biāo)識符的有效長度為1~32個字符,缺省值為32。如果超長,則超長部分被舍棄。但無論哪個系統(tǒng),至少前8個字符有效。例如,由于student_name和student_number的前8個字符相同,有的系統(tǒng)認(rèn)為這兩個變量是相同的而不加以區(qū)別。

3)標(biāo)識符的分類

C語言中,標(biāo)識符可分為3類,即關(guān)鍵字標(biāo)識符、預(yù)定義標(biāo)識符和用戶自定義標(biāo)識符。

(1)關(guān)鍵字標(biāo)識符。

C語言中的關(guān)鍵字共有32個,它們已有專門的含義,不能用作其他標(biāo)識符。根據(jù)關(guān)鍵字的作用,可將其分為數(shù)據(jù)類型關(guān)鍵字、控制語句關(guān)鍵字、存儲類型關(guān)鍵字和其他關(guān)鍵字4類。①數(shù)據(jù)類型關(guān)鍵字(12個):char,double,enum,float,int,long,short,signed,struct,union,unsigned,void。

②控制語句關(guān)鍵字(12個):break,case,continue,default,do,else,for,goto,if,return,switch,while。

③存儲類型關(guān)鍵字(4個):auto,extern,register,static。

④其他關(guān)鍵字(4個):const,sizeof,typedef,volatile。

(2)預(yù)定義標(biāo)識符。

預(yù)定義標(biāo)識符是指C語言提供的庫函數(shù)名和預(yù)編譯處理命令等,如scanf、printf、include、define等。C語言允許將這些標(biāo)識符另作它用,但這些標(biāo)識符將失去系統(tǒng)所規(guī)定的原意。為了編程方便、可靠,防止誤解,建議用戶避免將這些標(biāo)識符另作它用。

(3)用戶自定義標(biāo)識符。

用戶在編程時,要給一些變量、函數(shù)、數(shù)組、文件等命名,將這類由用戶根據(jù)需要自己定義的標(biāo)識符稱為用戶自定義標(biāo)識符。如下列程序段中的i1和i2、max、score均為用戶自定義標(biāo)識符。

inti1,i2; (i1和i2為變量名)

floatmax(inta,intb) (max為函數(shù)名)

floatscore[20]; (score為數(shù)組名)

說明:

(1)

C語言中的標(biāo)識符區(qū)分英文字符的大小寫,即同一字母的大小寫,被認(rèn)為是兩個不同的字符。所以在使用標(biāo)識符時,務(wù)必注意大小寫。習(xí)慣上,變量名和函數(shù)名中的英文字母用小寫,以增加可讀性。

(2)給變量命名時,應(yīng)遵循“見名知意”這一基本原則。

所謂“見名知意”是指通過變量名就能知道變量值的含義。通常應(yīng)選擇能表示數(shù)據(jù)含義的英文單詞(或其縮寫)或漢語拼音字頭作變量名。例如,name/xm(姓名),sex/xb(性別),age/nl(年齡),salary/gz(工資)等。注意:見名知意、對齊與縮排和注釋等,并稱良好的源程序書寫風(fēng)格的“三大原則”。本書始終嚴(yán)格遵循這“三大原則”來處理所有的例題,也建議讀者一開始就要注意養(yǎng)成良好的程序書寫風(fēng)格。1.3.9常量與變量

1.常量

1)常量的概念

在程序運行過程中,其值不能被改變的量稱為常量。如5、3.14、'a',"abc123"

等。

2)常量的分類

根據(jù)常量的取值對象,C語言將常量分為以下5種類型:

(1)整型常量。如16、0、-3等。

(2)實型常量。如3.14159、-3.6等。

(3)字符常量。如

'A','5','#'

等。

(4)符號常量。如“#definePI3.14159”,PI為符號常量,其值為3.14159。

(5)字符串常量。如

"Abc","6estghj","45+35"

等。

常量的類型,可通過書寫形式來判別。

2.變量

1)變量的概念

在程序運行過程中,其值可以被改變的量稱為變量。如“floatx,y;”中的x與y。

2)變量的兩個要素

一個變量由兩個要素組成,即變量名和變量值。

(1)變量名。每個變量都必須有一個名字,即變量名。變量命名的規(guī)則是:以字母或下劃線開頭,只能是由字母、數(shù)字和下劃線組成的字符序列。其長度隨系統(tǒng)而異,在VC++中,有效長度為1~15個字符,在TCV2.0中,有效長度為1~32個字符。如果超長,則超長部分被舍棄。但無論哪個系統(tǒng),至少前8個字符有效。

(2)變量值。在程序運行過程中,變量值存儲在內(nèi)存中;不同類型的變量,占用的內(nèi)存單元(字節(jié))數(shù)不同。在程序中,通過變量名來引用變量的值。注意:C語言中的變量名區(qū)分字母大小寫,而且,給變量命名時,最好遵循“見名知意”這一基本原則,如num/xh(序號)/name/xm(姓名)、age/nl(年齡)。

3)變量的定義與初始化

在C語言中,要求對所有用到的變量,必須先定義后使用;在定義變量的同時,進(jìn)行賦初值的操作稱為變量初始化。

變量定義的一般格式為

[存儲類型]數(shù)據(jù)類型變量名1,變量名2,…;

例如:

inti,j,k; /*定義i,j,k為整型變量*/

longm,n; /*定義m,n為長整型變量*/

floatr,s,area; /*定義r,s,area為實型變量*/

charch1,ch2; /*定義ch1,ch2為字符型變量*/為提高源程序的可讀性,可在分隔符逗號“,”后面加一個空格。例如,將上述的變量定義語句“floatr,s,area;”改為“floatr,□s,□area;”。

注意:本書使用方框“□”符號作為空格的描述符,以下相同。

變量初始化的一般格式為

[存儲類型]數(shù)據(jù)類型變量名1[=初值1],變量名2[=初值2],…;

例如:

intn=10,m=20;

charch1='A',ch2;

floatr=2.5,s,area;/*該語句定義了r,s,area三個實型變量,同時初始化了

變量r*/1.3.10格式化輸入函數(shù)scanf()

scanf()函數(shù)的功能是從計算機(jī)默認(rèn)的輸入設(shè)備(一般指鍵盤)向計算機(jī)主機(jī)輸入數(shù)據(jù)。

scanf()函數(shù)的一般格式為

scanf("格式字符串",輸入變量地址表);

例如:

scanf("%d%f",&i,&x);

scanf()函數(shù)是格式化輸入函數(shù),它從鍵盤按照“格式字符串”中規(guī)定的格式讀取若干個數(shù)據(jù),按“輸入變量地址表”中變量的順序,依次存入對應(yīng)的變量。其函數(shù)返回值為讀取的數(shù)據(jù)個數(shù)。格式字符串與輸入項地址表的用法如下。

1.格式字符串

格式字符串可以包含三種類型的字符:格式指示符、空白字符(空格、跳格鍵(Tab鍵)、回車鍵)和非空白字符(又稱普通字符)。格式指示符用來指定數(shù)據(jù)的輸入格式;空白字符作為相鄰兩個輸入數(shù)據(jù)的缺省分隔符;非空白字符在輸入有效數(shù)據(jù)時,必須按原樣輸入。

2.輸入項地址表

輸入項地址表由若干個輸入項地址組成,相鄰兩個輸入項地址之間用逗號分開。輸入項地址表中的地址,可以是變量的地址,也可以是字符數(shù)組名或指針變量(詳見后續(xù)內(nèi)容介紹)。變量地址的表示方法為“&變量名”,其中“&”是地址運算符。

格式指示符的一般形式為

%[修飾符]格式字符

scanf函數(shù)中常用的格式字符如表1-3所示。

表1-3scanf函數(shù)中的常用格式字符

寬度修飾:寬度修飾用來指定輸入數(shù)據(jù)所占列數(shù),例如:

scanf("%3c%3c",&ch1,&ch2);

假設(shè)輸入“abcdefg”,則系統(tǒng)將讀取的“abc”中的“a”賦給變量ch1;將讀取的“def”中的“d”賦給變量ch2。

抑制修飾符:抑制修飾符“*”表示對應(yīng)的數(shù)據(jù)讀入后,不賦給相應(yīng)的變量,該變量由下一個格式指示符輸入,例如:

scanf("%2d%*2d%3d",&

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論