版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
第1章緒論
第1章緒論1程序設(shè)計語言一般分為機(jī)器語言、匯編語言和高級語言三大類。1.機(jī)器語言對于計算機(jī)來說,一組機(jī)器指令就是程序,稱為機(jī)器語言程序。2.匯編語言為了便于理解與記憶,人們采用能幫助記憶的英文縮寫符號(稱為指令助記符)來代替機(jī)器語言指令代碼中的操作碼,用地址符號來代替地址碼。3.高級語言機(jī)器語言和匯編語言都是面向機(jī)器的語言,一般稱為低級語言。1程序設(shè)計語言的發(fā)展程序設(shè)計語言一般分為機(jī)器語言、匯編語言和高級2表1.1語言名稱適用范圍Basic教學(xué)和小型應(yīng)用程序的開發(fā)Fortran科學(xué)及工程計算程序的開發(fā)Pascal專業(yè)教學(xué)和應(yīng)用程序的開發(fā)C中、小型系統(tǒng)程序的開發(fā)COBOL商業(yè)與管理應(yīng)用程序的開發(fā)dBASE數(shù)據(jù)庫管理程序的開發(fā)FoxBASE數(shù)據(jù)庫管理程序的開發(fā)C++面向?qū)ο蟪绦虻拈_發(fā)LISP人工智能程序的開發(fā)PROLOG人工智能程序的開發(fā)Java面向?qū)ο蟪绦虻拈_發(fā)表1.1語言名稱適用范圍Basic教學(xué)和小3第2章C程序的基本組成
第2章C程序的基本組成42.1簡單的C語言程序2.2基本數(shù)據(jù)類型變量的定義與宏定義2.3數(shù)據(jù)的輸入與輸出2.4數(shù)據(jù)的處理2.5宏定義2.1簡單的C語言程序52.1簡單的C語言程序例2.1編寫一個C程序,其功能是顯示字符串“Howdoyoudo!”。其C程序如下:#include"stdio.h"main(){printf("Howdoyoudo!\n");}返回目錄2.1簡單的C語言程序例2.1編寫一個C程序,其功能6下面針對一般的C程序作幾點(diǎn)說明:(1)一個完整的C語言程序可以由多個函數(shù)組成,但必須包含一個且只能包含一個名為main的函數(shù)(主函數(shù))。程序總是從main函數(shù)開始執(zhí)行。(2)在一個C函數(shù)模塊中,由左右花括號{}括起來的部分是函數(shù)體,其中的語句系列實(shí)現(xiàn)函數(shù)的預(yù)定功能。(3)C程序中的每一個語句必須以“;”結(jié)束,但書寫格式是自由的。
(4)#include是編譯預(yù)處理命令,其作用是將雙引號或尖括號括起來的文件內(nèi)容讀到該命令的位置處。
(5)在C程序的任何位置處都可以用/*......*/作注釋,以提高程序的可讀性。下面針對一般的C程序作幾點(diǎn)說明:72.2基本數(shù)據(jù)類型變量的定義與宏定義2.2.1整型常量及其變量的定義1.整型常量在C語言中,有3種類型的整型常量:基本整型常量、長整型常量、無符號整型常量。
在C語言中,不管是哪種類型的整型常量,都可以用3種數(shù)制表示。(1)十進(jìn)制整型常量。(2)十六進(jìn)制整型常量。(3)八進(jìn)制整型常量。
2.整型變量的定義在C程序中,用于存放整型數(shù)據(jù)的變量稱為整型變量。返回目錄2.2基本數(shù)據(jù)類型變量的定義與宏定義2.2.1整型常8在C語言中,可以定義基本整型、長整型、短整型和無符號整型等4種類型的整型變量。它們的定義方式如下。(1)基本整型變量定義基本整型變量的形式如下:int變量表列;(2)長整型定義長整型變量的形式如下:long[int]變量表列;在C語言中,可以定義基本整型、長整型、短整型9(3)短整型定義短整型變量的形式如下:short[int]變量表列;(4)無符號整型定義無符號基本整型變量的形式如下:unsigned[int]變量表列;(3)短整型10①
一個類型說明語句可以同時定義多個同類型的變量,各變量之間用逗號“,”分隔。
②
用類型說明語句定義的變量只是說明了為這些變量分配了存儲空間,以便用于存放與之相同類型的數(shù)據(jù),在未對這些變量賦值前,這些變量中(即存儲空間中)的值是隨機(jī)的。
③C語言允許在定義變量的同時為變量賦初值。
④
在為整型變量初始化或賦值時,C編譯系統(tǒng)自動將被賦數(shù)據(jù)轉(zhuǎn)換成與相應(yīng)變量的類型一致。
⑤
由于各種整型變量所占的字節(jié)數(shù)有限,因此,它們所能存放的整數(shù)有一定的范圍。
①一個類型說明語句可以同時定義多個同類型的變量,各11
實(shí)型常量及其變量的定義1.實(shí)型(浮點(diǎn)型)常量(1)十進(jìn)制數(shù)形式(2)指數(shù)形式(科學(xué)記數(shù)法)2.實(shí)型變量的定義在C程序中,用于存放實(shí)型數(shù)據(jù)的變量稱為實(shí)型變量。在C語言中,實(shí)型變量有單精度與雙精度兩種。單精度float雙精度double
實(shí)型常量及其變量的定義12
字符型常量及其變量的定義1.字符型常量'\n'換行'\r'回車'\b'退格'\t'制表(橫向跳格)'\''單引號(單撇號)'\"'雙引號(雙撇號)'\ddd'1~3位八進(jìn)制數(shù)所代表的ASCII碼字符'\xhh'1~2位十六進(jìn)制數(shù)所代表的ASCII碼字符'\f'走紙換頁‘\\’反斜杠字符2.字符型變量的定義字符型變量的定義方式如下:char變量表列;字符型常量及其變量的定義132.3數(shù)據(jù)的輸入與輸出數(shù)據(jù)的輸入與輸出應(yīng)包括以下幾項:①輸入(出)的設(shè)備②輸入(出)的格式③輸入(出)的內(nèi)容返回目錄2.3數(shù)據(jù)的輸入與輸出數(shù)據(jù)的輸入與輸出應(yīng)包括以下幾項:返14
格式輸出函數(shù)格式輸出函數(shù)的一般形式如下:printf(*“格式控制”,輸出表);其中格式控制部分要用一對雙撇號括起來,它用于說明輸出項目所采用的格式。
格式輸出函數(shù)151.整型格式說明符(1)十進(jìn)制形式(2)八進(jìn)制形式(3)十六進(jìn)制形式1.整型格式說明符162.實(shí)型格式說明符如果以十進(jìn)制數(shù)形式輸出實(shí)型數(shù)據(jù),其格式說明符為%f或%m.nf如果以指數(shù)形式輸出實(shí)型數(shù)據(jù),其格式說明符為%e或%m.ne2.實(shí)型格式說明符173.字符型格式說明符字符型數(shù)據(jù)的格式說明符為%c或%mc(1)輸出表中各輸出項目之間要用“,”分隔。(2)格式控制中的各格式說明符與輸出表中的各輸出項目在個數(shù)、次序、類型等方面必須一一對應(yīng)。(3)格式控制中除格式說明符外的其他字符將按原樣輸出。(4)在輸出格式說明符中,如果帶有寬度說明,則在左邊沒有數(shù)字的位置上用空格填滿(即輸出的數(shù)字是右對齊)。但如果在寬度說明前加一個負(fù)號(-),則輸出為左對齊,即在右邊補(bǔ)空格。
3.字符型格式說明符18格式輸入函數(shù)格式輸入函數(shù)的一般形式如下:scanf(“格式控制”,內(nèi)存地址表);1.整型格式說明符(1)十進(jìn)制形式用于輸入十進(jìn)制形式的整型數(shù)據(jù)。(2)八進(jìn)制形式用于輸入八進(jìn)制形式的整型數(shù)據(jù)。(3)十六進(jìn)制形式用于輸入十六進(jìn)制形式的整型數(shù)據(jù)。格式輸入函數(shù)192.實(shí)型格式說明符用于輸入的單精度實(shí)型格式說明符為%f或%e用于輸入的雙精度實(shí)型格式說明符為%lf3.字符型格式說明符用于輸入的字符型格式說明符為%c或%mc2.實(shí)型格式說明符202.4數(shù)據(jù)的處理
賦值運(yùn)算賦值運(yùn)算符為“=”。賦值表達(dá)式為變量名=表達(dá)式(1)在C語言中,“=”為賦值運(yùn)算符,而不是等號;(2)賦值運(yùn)算符“=”左邊必須是變量名,不能是表達(dá)式;(3)賦值運(yùn)算符“=”兩端的類型不一致時,系統(tǒng)將自動進(jìn)行類型轉(zhuǎn)換。返回目錄2.4數(shù)據(jù)的處理賦值運(yùn)算返回目錄21
算術(shù)運(yùn)算在C語言中,基本的算術(shù)運(yùn)算符有以下幾個:+加法運(yùn)算符(雙目運(yùn)算符),或正值運(yùn)算符(單目運(yùn)算符)。如x+y,+x。-減法運(yùn)算符(雙目運(yùn)算符),或負(fù)值運(yùn)算符(單目運(yùn)算符)。如a-3,-x。*乘法運(yùn)算符(雙目運(yùn)算符)。如3*x。/除法運(yùn)算符(雙目運(yùn)算符)。如x/y。%模余運(yùn)算符(雙目運(yùn)算符)。只適用于整型數(shù)據(jù),如9%4的值為1,11%3的值為2等。算術(shù)運(yùn)算22
關(guān)系運(yùn)算在C語言中,基本的關(guān)系運(yùn)算符有以下6個:<小于<=小于或等于>大于>=大于或等于==等于!=不等于結(jié)果只有兩個:true或者false執(zhí)行intx=2,y=3;后表達(dá)式x=(y==3)的值是(1)關(guān)系運(yùn)算23
邏輯運(yùn)算在C語言中,邏輯常量只有兩種:值非零表示“真”,值為零表示“假”。其基本的邏輯運(yùn)算符有以下3個:&&(邏輯與)兩個量都為真時為真(1),否則為假(0)||(邏輯或)兩個量中只要有一個為真時為真(1),只有都為假時為假(0)!(邏輯非)一個量為真時為假(0),假時為真(1)
邏輯運(yùn)算24自增++與自減--運(yùn)算符增1運(yùn)算符“++”和減1運(yùn)算符“--”是兩個單目(只有一個運(yùn)算對象)運(yùn)算符,它們的運(yùn)算對象只能是整型或字符型變量。增1運(yùn)算符是將運(yùn)算對象的值增1;減1運(yùn)算符是將運(yùn)算對象的值減1。假設(shè)定義變量inta=5;intb;前綴自增b=++a;//a=6b=6后綴自增
b=a++;//a=6b=5自增++與自減--運(yùn)算符25sizeof運(yùn)算符sizeof運(yùn)算符有以下兩種用法:(1)用于求得表達(dá)式計算結(jié)果所占內(nèi)存的字節(jié)數(shù)。其一般形式為sizeof表達(dá)式(2)用于求得某種數(shù)據(jù)類型的量所占內(nèi)存的字節(jié)數(shù)。其一般形式為sizeof(類型名)sizeof運(yùn)算符26
逗號運(yùn)算符逗號“,”是C程序中常見的符號。
在C語言中,逗號除作為分隔符使用外,還可以作為運(yùn)算符來使用,稱為逗號運(yùn)算符。逗號表達(dá)式的一般形式為子表達(dá)式1,子表達(dá)式2,…,子表達(dá)式n逗號運(yùn)算符27在使用逗號運(yùn)算符(逗號表達(dá)式)時,要注意以下幾點(diǎn):(1)逗號運(yùn)算符是所有運(yùn)算符中級別最低的一種運(yùn)算符。
(2)一個逗號表達(dá)式又可以與另一個表達(dá)式(可以是逗號表達(dá)式,也可以不是逗號表達(dá)式)連接成新的逗號表達(dá)式。
(3)在許多情況下,使用逗號表達(dá)式的目的僅僅是為了得到各個子表達(dá)式的值,而并不一定要得到或使用整個逗號表達(dá)式的值。
在使用逗號運(yùn)算符(逗號表達(dá)式)時,要注意以282.5宏定義C語言中的宏定義有兩種形式:符號常量定義與帶參數(shù)的宏定義。
符號常量定義在C語言中,允許將程序中多處用到的“字符串”定義成一個符號常量。在C語言中定義符號常量的一般形式如下:#define符號常量名字符串返回目錄2.5宏定義C語言中的宏定義有兩種形式:符號29①
由于C語言中的所有變量名、函數(shù)名等都使用小寫字母,因此,符號常量名一般用大寫字母表示,以便與C語言中的保留關(guān)鍵字相區(qū)別。
②C編譯系統(tǒng)對定義的符號常量的處理只是進(jìn)行簡單的替換,不作任何語法檢查。
③#define是一個命令,而不是語句,因此在行末不能加“;”,并且應(yīng)獨(dú)立占一行。④#define命令一般應(yīng)出現(xiàn)在程序中函數(shù)的外面,其作用域范圍是從#define符號常量名字符串到#undef符號常量名(或文件末)①由于C語言中的所有變量名、函數(shù)名等都使用小寫字母30帶參數(shù)的宏定義帶參數(shù)的宏定義的一般形式為#define宏名(參數(shù)表)字符串其中字符串中應(yīng)包含在參數(shù)表中所指定的參數(shù),并且,當(dāng)參數(shù)表中的參數(shù)多于一個時,各參數(shù)之間要用逗號分隔。帶參數(shù)的宏定義31在使用帶參數(shù)的宏定義時,應(yīng)注意以下兩個問題。(1)在使用帶參數(shù)的宏定義時,一般應(yīng)將宏定義字符串中的參數(shù)都要用括號括起來,否則經(jīng)過宏展開后,可能會出現(xiàn)意想不到的錯誤。
(2)在使用帶參數(shù)的宏定義時,除了應(yīng)將宏定義字符串中的參數(shù)都要用括號括起來,還需要將整個字符串部分也要用括號括起來,否則經(jīng)過宏展開后,還會可能出現(xiàn)意想不到的錯誤。書寫一個求最大值的宏定義#defineMAX(a,b)((a>b)?(a),(b))在使用帶參數(shù)的宏定義時,應(yīng)注意以下兩個問題。32第3章選擇結(jié)構(gòu)第3章選擇結(jié)構(gòu)333.1語句與復(fù)合語句3.2if語句3.3if…else結(jié)構(gòu)3.4條件運(yùn)算符3.5switch結(jié)構(gòu)3.6程序舉例3.1語句與復(fù)合語句343.1語句與復(fù)合語句在C語言中,一個表達(dá)式后面跟隨一個分號就構(gòu)成了一個語句,這種語句稱為表達(dá)式語句。
在C語言中,分號(;)是表達(dá)式語句的終結(jié)符,而不是語句之間的分隔符,也就是說,分號是表達(dá)式語句的一個組成部分,只不過它位于表達(dá)式的后面。在一個函數(shù)體內(nèi)部,由左、右花括號括起來的語句稱為復(fù)合語句,它的一般形式為{說明部分;語句部分;}返回目錄3.1語句與復(fù)合語句返回目錄353.2if語句If語句的形式為if(表達(dá)式)
語句這種選擇結(jié)構(gòu)的流程圖如圖3.1所示。圖3.1if語句的流程圖返回目錄3.2if語句圖3.1if語句的流程圖返回目錄36下面對if語句作幾點(diǎn)說明:(1)if語句中的邏輯表達(dá)式(即條件)必須要用一對圓括號括起來。
(2)if語句后的語句可以是復(fù)合語句。
(3)一個if語句最后需要強(qiáng)調(diào)的是,在使用if語句時,一定要注意邏輯表達(dá)式的正確寫法,特別是在連續(xù)使用多個if語句時更要注意。
下面對if語句作幾點(diǎn)說明:373.3if…else結(jié)構(gòu)在C語言中,if…else結(jié)構(gòu)的語句形式為if(表達(dá)式)
語句1else語句2圖3.2if…else結(jié)構(gòu)的流程圖返回目錄3.3if…else結(jié)構(gòu)圖3.2if…else結(jié)構(gòu)的38下面對if…else結(jié)構(gòu)作以下幾點(diǎn)說明:(1)if…else結(jié)構(gòu)中的語句1與語句2都可以是復(fù)合語句。(2)在if…else結(jié)構(gòu)中,語句1與語句2都可以是空語句。
(3)在if…else結(jié)構(gòu)中,如果在else前面有多個if語句,則else與最近的if配對。
下面對if…else結(jié)構(gòu)作以下幾點(diǎn)說明:39(4)如果有多個if……else結(jié)構(gòu)嵌套如下:if(表達(dá)式1)語句1elseif(表達(dá)式2)語句2else…elseif(表達(dá)式n)語句nelse語句n+1則可簡寫成if(表達(dá)式1)語句1elseif(表達(dá)式2)語句2…elseif(表達(dá)式n)語句nelse語句n+1(4)如果有多個if……else結(jié)構(gòu)嵌套如下:40這種結(jié)構(gòu)又稱為if…elseif結(jié)構(gòu),其流程圖如圖3.3所示。圖3.3if…elseif結(jié)構(gòu)的流程圖這種結(jié)構(gòu)又稱為if…elseif結(jié)構(gòu),其流程圖如圖3.3所413.4條件運(yùn)算符在if…else結(jié)構(gòu)中,如果語句1與語句2都是單一的賦值語句,并且都是給同一個變量賦值,則可以用條件運(yùn)算符來進(jìn)行處理。下面對條件表達(dá)式作幾點(diǎn)說明:(1)條件運(yùn)算符優(yōu)先級要比賦值運(yùn)算符高。(2)條件運(yùn)算符的優(yōu)先級比關(guān)系運(yùn)算符與算術(shù)運(yùn)算符都要低,因此,條件表達(dá)式中的“表達(dá)式1”、“表達(dá)式2”與“表達(dá)式3”都不必用括號括起來。(3)條件運(yùn)算符的結(jié)合方向為“從右到左”。
返回目錄3.4條件運(yùn)算符在if…else結(jié)構(gòu)中,如果語句423.5switch結(jié)構(gòu)在C語言中提供了一個直接實(shí)現(xiàn)多路分支選擇的結(jié)構(gòu),稱為switch結(jié)構(gòu),其一般形式如下:switch(表達(dá)式){case常量表達(dá)式1:語句1case常量表達(dá)式2:語句2…case常量表達(dá)式n:語句ndefault:語句n+1}圖3.4switch結(jié)構(gòu)的流程圖
返回目錄3.5switch結(jié)構(gòu)在C語言中提供了一43下面對switch結(jié)構(gòu)作幾點(diǎn)說明:(1)switch結(jié)構(gòu)中的表達(dá)式、常量表達(dá)式1、…
、常量表達(dá)式n必須是整型或字符型。這是因為,在switch結(jié)構(gòu)中,其分支數(shù)一般是有限的,并且是離散的,因此,其表達(dá)式的值也應(yīng)是有限的,且是離散的。(2)同一個switch結(jié)構(gòu)中的常量表達(dá)式值必須互不相同,否則就會出現(xiàn)矛盾的現(xiàn)象,即對于“表達(dá)式”的同一個值對應(yīng)多種執(zhí)行方案,這是錯誤的。下面對switch結(jié)構(gòu)作幾點(diǎn)說明:44(3)在switch結(jié)構(gòu)中,case與default的順序可以任意,各case之間
的順序也可以任意。
(4)在執(zhí)行switch結(jié)構(gòu)時,當(dāng)執(zhí)行完某case后的語句后,將順序執(zhí)行后面case后的語句,直到遇break語句才退出整個switch結(jié)構(gòu)的執(zhí)行。
(5)在switch結(jié)構(gòu)中,如果沒有default且“表達(dá)式”值不等于任何case后常量表達(dá)式的值,則直接退出switch結(jié)構(gòu)而轉(zhuǎn)到其后的語句執(zhí)行。(3)在switch結(jié)構(gòu)中,case與default的453.6程序舉例例3.12計算獎金。當(dāng)企業(yè)利潤P等于或低于0.5萬元時,獎金為利潤的1%;當(dāng)0.5<P≤1萬元時,超過0.5萬元部分的獎金為利潤的1.5%,0.5萬元以下仍按1%計算;當(dāng)1<P≤2萬元時,1萬元以下部分仍按前面的方法計算,超過1萬元的部分其獎金按利潤的2%計算;當(dāng)2<P≤5萬元時,2萬元以下部分仍按前面的方法計算,超過2萬元部分的獎金按利潤的2.5%計算;當(dāng)5<P≤10萬元時,5萬元以下部分仍按前面的方法計算,超過5萬元部分的獎金按利潤的3%計算;當(dāng)P>10萬元時,10萬元以下部分仍按前面的方法計算,超過10萬元部分按3.5%計算。其中P由鍵盤輸入,計算并輸出相應(yīng)的獎金數(shù)W。返回目錄3.6程序舉例例3.12計算獎金。返回目錄46其流程圖如圖3.5所示。圖3.5例3.12中if…elseif結(jié)構(gòu)的流程圖其流程圖如圖3.5所示。圖3.5例3.12中if…els47根據(jù)圖3.5所示的流程圖,用if…elseif結(jié)構(gòu)寫出C程序如下:#include"stdio.h"main(){floatp,w;printf("inputp:");scanf("%f",&p);if(p<=0.0)w=0.0;elseif(p<=0.5)w=0.01*p;elseif(p<=1.0)w=0.005+0.015*(p-0.5);elseif(p<=2.0)w=0.0125+0.02*(p-1.0);elseif(p<=5.0)w=0.0325+0.025*(p-2.0);elseif(p<=10.0)w=0.1075+0.03*(p-5.0);elsew=0.2575+0.035*(p-10.0);printf("w=%f\n",w);}根據(jù)圖3.5所示的流程圖,用if…elseif結(jié)構(gòu)寫出C程48例3.14求解一元二次方程Ax2+Bx+C=0??梢缘玫角笠辉畏匠谈牧鞒虉D如圖3.8所示。圖3.8例3.14的流程圖例3.14求解一元二次方程Ax2+Bx+C=0??梢缘玫?9相應(yīng)的C程序如下:#include"stdio.h"#include"math.h"main(){doublea,b,c,d,x1,x2,p;printf("inputa,b,c:");scanf("%lf%lf%lf",&a,&b,&c);if(a==0.0){if(b==0.0)printf("ERR\n");elseprintf("X=%f\n",-c/b);}elseif(b==0.0){d=c/a;if(d<=0.0){printf("X1=%f\n",sqrt(-d));printf("X2=%f\n",-sqrt(-d));}
相應(yīng)的C程序如下:50else{printf("X1=+j%f\n",sqrt(d));printf("X2=-j%f\n",sqrt(d));}elseif(c==0.0){printf("X1=0.0\n");printf("X2=%f\n",-b/a);}
else51else{d=b*b-4*a*c;if(d>=0.0){d=sqrt(d);if(b>0.0)x1=(-b-d)/(2*a);elsex1=(-b+d)/(2*a);x2=c/(a*x1);printf("X1=%f\n",x1);printf("X2=%f\n",x2);}else52else{d=sqrt(-d)/(2*a);p=-b/(2*a);printf("X1=%f+j%f\n",p,d);printf("X2=%f-j%f\n",p,d);}}}else53第4章循環(huán)結(jié)構(gòu)第4章循環(huán)結(jié)構(gòu)544.1當(dāng)型循環(huán)與直到型循環(huán)4.2for循環(huán)4.3循環(huán)的嵌套與其他有關(guān)語句4.4程序舉例4.1當(dāng)型循環(huán)與直到型循環(huán)554.1當(dāng)型循環(huán)與直到型循環(huán)4.1.1當(dāng)型循環(huán)結(jié)構(gòu)當(dāng)型循環(huán)結(jié)構(gòu)的流程圖如圖4.1所示。while循環(huán)圖4.1當(dāng)型循環(huán)結(jié)構(gòu)流程圖返回目錄4.1當(dāng)型循環(huán)與直到型循環(huán)4.1.1當(dāng)型循環(huán)結(jié)構(gòu)圖456實(shí)現(xiàn)當(dāng)型循環(huán)結(jié)構(gòu)的C語句形式為while(表達(dá)式)循環(huán)體語句功能:當(dāng)表達(dá)式值≠0時,執(zhí)行循環(huán)體,執(zhí)行完后繼續(xù)判斷表達(dá)式值,只有當(dāng)表達(dá)式值=0時才退出循環(huán)。實(shí)現(xiàn)當(dāng)型循環(huán)結(jié)構(gòu)的C語句形式為57例4.2從鍵盤輸入各學(xué)生成績,并對90分以上(包括90分)的學(xué)生人數(shù)進(jìn)行計數(shù),直到輸入的成績?yōu)樨?fù)為止,最后輸出成績在90分以上的學(xué)生人數(shù)。
例4.2從鍵盤輸入各學(xué)生成績,并對90分以上58圖4.3例4.2的流程圖其流程圖如圖4.3所示。其中變量count為整型,用于對90分以上的學(xué)生人數(shù)進(jìn)行計數(shù)。圖4.3例4.2的流程圖其流程圖如圖4.59相應(yīng)的C程序如下:#include"stdio.h"main(){intcount;floatgrade;count=0;scanf("%f",&grade);while(grade>=0.0){if(grade>=90.0)count=count+1;scanf("%f",&grade);}printf("count=%d\n",count);}相應(yīng)的C程序如下:60直到型循環(huán)結(jié)構(gòu)直到型循環(huán)結(jié)構(gòu)的流程圖如圖4.4所示。do__while循環(huán)圖4.4直到型循環(huán)結(jié)構(gòu)流程圖直到型循環(huán)結(jié)構(gòu)圖4.4直到型循環(huán)結(jié)構(gòu)流程圖61
do_while循環(huán)的執(zhí)行過程是,首先執(zhí)行循環(huán)體,然后判斷條件(即計算邏輯表達(dá)式),如果條件滿足(即邏輯表達(dá)式值為真),則退出循環(huán)結(jié)構(gòu);如果條件不滿足(即邏輯表達(dá)式值為假),則繼續(xù)執(zhí)行循環(huán)體。實(shí)現(xiàn)直到型循環(huán)結(jié)構(gòu)的C語句形式為do循環(huán)體語句while(表達(dá)式);功能:先執(zhí)行循環(huán)體,然后判斷表達(dá)式值,若表達(dá)式值≠0,則再次執(zhí)行循環(huán)體,如此循環(huán),直到表達(dá)式值=0為止。do_while循環(huán)的執(zhí)行過程是,首先執(zhí)行循環(huán)62例4.3計算并輸出下列級數(shù)和:直到某項的絕對值小于為止。例4.3計算并輸出下列級數(shù)和:直到某項的絕對值小于63相應(yīng)的流程圖如圖4.5所示。其中f用于改變每一項的符號,因為這是一個各項符號相間的級數(shù)。圖4.5例4.3的流程圖相應(yīng)的流程圖如圖4.5所示。其中f用于改變每一64相應(yīng)的C程序如下:#include"stdio.h"main(){intk;doublesum,d,f;sum=1.0;k=1;f=1.0;do{k=k+1;f=-f;d=1.0/(k*(k+1));sum=sum+f*d;}while(d>=1.0e-4);printf("sum=%lf\n",sum);}相應(yīng)的C程序如下:65
當(dāng)型循環(huán)結(jié)構(gòu)與直到型循環(huán)結(jié)構(gòu)的區(qū)別與聯(lián)系當(dāng)型循環(huán)結(jié)構(gòu)與直到型循環(huán)結(jié)構(gòu)既有共同之處,又有區(qū)別。主要體現(xiàn)在以下幾個方面。(1)在while循環(huán)中,其循環(huán)體可以一次也不執(zhí)行(即執(zhí)行while循環(huán)結(jié)構(gòu)的一開始,其條件就不滿足)。
(2)不管是while循環(huán)結(jié)構(gòu)還是do—while循環(huán)結(jié)構(gòu),在循環(huán)體內(nèi)部必須要有能改變條件(即邏輯表達(dá)式值)的語句,否則將造成死循環(huán)。
(3)對于有些問題既可以用while循環(huán)結(jié)構(gòu)來處理,也可以用do—while循環(huán)結(jié)構(gòu)來處理。(4)不管是while循環(huán)結(jié)構(gòu)還是do—while循環(huán)結(jié)構(gòu),其循環(huán)體如果包含一個以上的語句,應(yīng)以復(fù)合語句形式出現(xiàn)。當(dāng)型循環(huán)結(jié)構(gòu)與直到型循環(huán)結(jié)構(gòu)的區(qū)別與聯(lián)系664.2for循環(huán)C語言提供的for循環(huán)屬于當(dāng)型循環(huán)結(jié)構(gòu),其一般形式為for(表達(dá)式1;表達(dá)式2;表達(dá)式3)循環(huán)體語句(組)它等價于下列的當(dāng)型循環(huán)結(jié)構(gòu):表達(dá)式1;while(表達(dá)式2){循環(huán)體語句表達(dá)式3;}返回目錄4.2for循環(huán)C語言提供的for循環(huán)屬于當(dāng)型循環(huán)結(jié)67下面對for循環(huán)語句作幾點(diǎn)說明:(1)在for語句中,三個表達(dá)式中的任何一個表達(dá)式均可省略,但其中的兩個“;”不能省略。
(2)下列兩個循環(huán)都是死循環(huán):for(表達(dá)式1;;表達(dá)式3)循環(huán)體與for(;;)循環(huán)體因為它們都沒有用于判斷循環(huán)是否結(jié)束的條件(即表達(dá)式2)。
(3)for循環(huán)本質(zhì)上也是當(dāng)型循環(huán)結(jié)構(gòu),只不過它對于事先可以確定循環(huán)次數(shù)的問題特別方便。
(4)在for循環(huán)中,循環(huán)體也可以是復(fù)合語句(即用一對花括號{}括起來的語句組)。下面對for循環(huán)語句作幾點(diǎn)說明:684.3循環(huán)的嵌套與其他有關(guān)語句
循環(huán)的嵌套所謂循環(huán)的嵌套是指一個循環(huán)體內(nèi)又包含了另一個完整的循環(huán)結(jié)構(gòu)。C語言允許循環(huán)結(jié)構(gòu)嵌套多層。循環(huán)的嵌套結(jié)構(gòu)又稱為多重循環(huán)。返回目錄4.3循環(huán)的嵌套與其他有關(guān)語句循環(huán)的嵌套返回目錄69例4.6計算并輸出10以內(nèi)(包括10)所有自然數(shù)的階乘值。即計算1!,2!,3!,4!,5!,6!,7!,8!,9!,10!。例4.6計算并輸出10以內(nèi)(包括10)所有自然70采用的方法是,對于10以內(nèi)的每一個自然數(shù)分別求它們的階乘值。其流程圖如圖4.7所示。顯然,這是一個二重循環(huán)結(jié)構(gòu)。圖4.7例4.6的流程圖采用的方法是,對于10以內(nèi)的每一個自然數(shù)分別求它們的71相應(yīng)的C程序如下:#include"stdio.h"main(){intn,k;doubles;for(n=1;n<=10;n=n+1){s=1.0; for(k=1;k<=n;k=k+1)s=s*k; printf("%2d!=%16.7f\n",n,s);}}相應(yīng)的C程序如下:72break
語句C語言中的break語句有以下兩個功能:(1)跳出switch結(jié)構(gòu);(2)退出當(dāng)前循環(huán)結(jié)構(gòu),包括while結(jié)構(gòu)、do…while結(jié)構(gòu)和for循環(huán)結(jié)構(gòu)。break語句73continue
語句continue語句的功能是結(jié)束本次循環(huán)的執(zhí)行,但不退出循環(huán)結(jié)構(gòu)。下面舉兩個例子來說明continue語句的使用。continue語句74例4.10輸出100~200之間所有能被7或9整除的自然數(shù)。相應(yīng)的C程序如下:#include"stdio.h"main(){intn;for(n=100;n<=200;n=n+1){if(n%7!=0)&&(n%9!=0))continue;/*結(jié)束本次循環(huán),繼續(xù)進(jìn)行下次循環(huán)*/printf("%d\n",n);}}例4.10輸出100~200之間所有能被7或9整除的自然75實(shí)際上,上述程序等價于#include"stdio.h"main(){intn;for(n=100;n<=200;n=n+1){if(n%7==0)||(n%9==0))printf("%d\n",n);}}實(shí)際上,上述程序等價于76第5章模塊設(shè)計第5章模塊設(shè)計775.1模塊的實(shí)現(xiàn)——函數(shù)5.2模塊間的參數(shù)傳遞5.3模塊的遞歸調(diào)用5.4程序舉例5.5編譯預(yù)處理5.1模塊的實(shí)現(xiàn)——函數(shù)785.1模塊的實(shí)現(xiàn)——函數(shù)5.1.1函數(shù)的概念在C語言中,函數(shù)分為以下兩種。(1)標(biāo)準(zhǔn)庫函數(shù)這種函數(shù)用戶不必定義,但可直接使用。例如scanf(),printf(),fabs(),sqrt(),exp(),sin(),cos()等都是C語言中常用的庫函數(shù)。(2)用戶自己定義的函數(shù)這種函數(shù)用以解決用戶的專門問題,一般由用戶自己編寫。返回目錄5.1模塊的實(shí)現(xiàn)——函數(shù)5.1.1函數(shù)的概念返回目錄79例5.1從鍵盤輸入兩個正整數(shù)m與n(m≥n),求的值(即求)。其C程序如下:#include"stdio.h"main()/*主函數(shù)*/{intm,n;intp();/*說明本函數(shù)中要調(diào)用的函數(shù)p()是整型*/scanf("%d,%d",&m,&n);if(m>=n)printf("%d\n",p(m)/p(m-n));elseprintf("m<n!\n");}
intp(k)/*計算階乘值的函數(shù)*/intk;{ints,i;s=1;for(i=1;i<=k;i=i+1)s=s*i;return(s);}例5.1從鍵盤輸入兩個正整數(shù)m與n(m≥n),80下面對函數(shù)作幾點(diǎn)說明:(1)一個完整的C程序可以由若干個函數(shù)組成,其中必須有一個且只能有一個主函數(shù)main()。
(2)一個完整C程序中的所有函數(shù)可以放在一個文件中,也可以放在多個文件中。
①
在編譯命令行中鍵入各個函數(shù)所在的文件名(各文件名之間用空格分隔)。
②
在主函數(shù)中用#include語句將各函數(shù)所在的文件包含進(jìn)來。
(3)C語言中的函數(shù)沒有從屬關(guān)系,各函數(shù)之間互相獨(dú)立,可以互相調(diào)用。
下面對函數(shù)作幾點(diǎn)說明:81
函數(shù)的定義在C語言中,函數(shù)定義的一般形式為類型標(biāo)識符函數(shù)名(形參表列)形參類型說明{說明部分語句部分}函數(shù)的定義82在定義C函數(shù)時要注意以下幾點(diǎn)。(1)函數(shù)類型標(biāo)識符同變量類型說明符,它表示返回的函數(shù)值類型。
(2)如果省略函數(shù)的類型標(biāo)識符,則默認(rèn)為是int型。
(3)C語言允許定義空函數(shù)。如dummy(){}在定義C函數(shù)時要注意以下幾點(diǎn)。83(4)函數(shù)中返回語句的形式為return(表達(dá)式);或return表達(dá)式;(5)如果“形參表列”中有多個形式參數(shù),則它們之間要用“,”分隔。(6)C語言允許在形參表中直接對形參的類型進(jìn)行說明。
(4)函數(shù)中返回語句的形式為84
函數(shù)的調(diào)用函數(shù)調(diào)用的一般形式為函數(shù)名(實(shí)參表列)(1)函數(shù)調(diào)用可以出現(xiàn)在表達(dá)式中(有函數(shù)值返回);也可以單獨(dú)作為一個語句(無函數(shù)值返回)。(2)實(shí)參表中的各實(shí)參可以是表達(dá)式,但它們的類型和個數(shù)應(yīng)與函數(shù)中的形參一一對應(yīng)。
(3)在調(diào)用函數(shù)中,通常要對被調(diào)用函數(shù)的返回值類型進(jìn)行說明(一般在調(diào)用函數(shù)的函數(shù)體中的說明部分),包括函數(shù)類型、函數(shù)名和一對圓括號。
函數(shù)的調(diào)用85例5.2下列程序的功能是計算輸出一個圓臺兩底面積之和。#include"stdio.h"main(){doubler1,r2;doubleq();printf("inputr1,r2:");scanf("%lf,%lf",&r1,&r2);printf("s=%f\n",q(r1,r2));}
doubleq(x,y)doublex,y;{doubles;s=3.1415926*(x*x+y*y);return(s);}例5.2下列程序的功能是計算輸出一個圓臺兩底面積之和。86但C語言規(guī)定,在以下幾種情況下可以不在調(diào)用函數(shù)中對被調(diào)用函數(shù)作類型說明:①
被調(diào)用函數(shù)為整型或字符型,自動按整型處理。
②
被調(diào)用函數(shù)的定義出現(xiàn)在調(diào)用函數(shù)之前。
③在調(diào)用函數(shù)之前已經(jīng)由別的函數(shù)(它可能也要調(diào)用該被調(diào)用函數(shù))對被調(diào)用函數(shù)作了類型說明。(4)C語言雖不允許嵌套定義函數(shù),但可以嵌套調(diào)用函數(shù)。
但C語言規(guī)定,在以下幾種情況下可以不在調(diào)用函875.2模塊間的參數(shù)傳遞
形參與實(shí)參的結(jié)合方式1.地址結(jié)合所謂地址結(jié)合,是指在一個模塊調(diào)用另一個模塊時,并不是將調(diào)用模塊中的實(shí)參值直接傳送給被調(diào)用模塊中的形參,而只是將存放實(shí)參的地址傳送給形參。
2.?dāng)?shù)值結(jié)合所謂數(shù)值結(jié)合,是指調(diào)用模塊中的實(shí)參地址與被調(diào)用模塊中的形參地址是互相獨(dú)立的,在一個模塊調(diào)用另一個模塊時,直接將實(shí)參值傳送給形參被存放在形參地址中。
返回目錄5.2模塊間的參數(shù)傳遞形參與實(shí)參的結(jié)合方式返回目錄88例5.3分析下列C程序:voidswap(x,y)intx,y;{intt;t=x;x=y(tǒng);y=t;return;}
#include"stdio.h"main(){intx,y;scanf("x=%d,y=%d",&x,&y);swap(x,y);printf("x=%d,y=%d\n",x,y);}例5.3分析下列C程序:89在這個程序中共有兩個函數(shù)。在主函數(shù)中分別為整型變量x與y輸入數(shù)據(jù),然后調(diào)用函數(shù)swap(x,y)。而函數(shù)swap(x,y)的功能是實(shí)現(xiàn)變量x值與y值的交換。但在實(shí)際運(yùn)行該程序時,如果從鍵盤輸入x=6,y=8
則輸出的結(jié)果為x=6,y=8即沒有達(dá)到交換的目的。這是因為在主函數(shù)中調(diào)用函數(shù)swap()時,只是將實(shí)參x和y的值分別傳遞給了swap()函數(shù)中的形參x和y,但由于主函數(shù)中的實(shí)參x和y與函數(shù)swap()中的形參x和y在計算機(jī)中的存儲地址是不同的,因此,在函數(shù)swap()中雖然交換了形參x與y的值,但實(shí)參x與y的值實(shí)際上沒有改變,即它們沒有被交換。
在這個程序中共有兩個函數(shù)。在主函數(shù)中分別為整型變量x90由此可以看出,在形參與實(shí)參為數(shù)值結(jié)合的情況下,實(shí)參與形參在計算機(jī)內(nèi)存中的存儲地址不是同一個,因此,即使在被調(diào)用函數(shù)中改變了形參值,調(diào)用函數(shù)中的實(shí)參值也是不會被改變的。
由此可以看出,在形參與實(shí)參為數(shù)值結(jié)合的情況下,實(shí)參與91局部變量與全局變量1.局部變量在函數(shù)內(nèi)部定義的變量稱為局部變量。函數(shù)內(nèi)部定義的變量只在該函數(shù)范圍內(nèi)有效,因此,不同函數(shù)中的局部變量可以重名,互不混淆。2.全局變量在函數(shù)外定義的變量稱為全局變量。局部變量與全局變量92除非十分必要,一般不提倡使用全局變量,其原因有以下幾點(diǎn):①由于全局變量屬于程序中的所有函數(shù),因此,在程序的執(zhí)行過程中,全局變量都需要占用存儲空間,即使實(shí)際正在執(zhí)行的函數(shù)中根本用不著這些全局變量,它們也要占用存儲空間。②在函數(shù)中使用全局變量后,要求在所有調(diào)用該函數(shù)的調(diào)用程序中都要使用這些全局變量,從而會降低函數(shù)的通用性。③在函數(shù)中使用全局變量后,使各函數(shù)模塊之間的互相影響比較大,從而使函數(shù)模塊的“內(nèi)聚性”差,而與其他模塊的“耦合性”強(qiáng)。④在函數(shù)中使用全局變量后,會降低程序的清晰性,可讀性差。除非十分必要,一般不提倡使用全局變量,其原因有以下93動態(tài)存儲變量與靜態(tài)存儲變量1.用戶程序的存儲分配一般來說,用戶程序在計算機(jī)中的存儲分配如圖5.1所示。圖5.1用戶程序在計算機(jī)中的存儲分配動態(tài)存儲變量與靜態(tài)存儲變量圖5.1用戶程序在計算機(jī)中的存94其中:
程序區(qū)用于存放程序;靜態(tài)存儲區(qū)是在程序開始執(zhí)行時就分配的固定存儲單元,如全局變量;動態(tài)存儲區(qū)是在函數(shù)調(diào)用過程中進(jìn)行動態(tài)分配的存儲單元,如函數(shù)形參、自動變量、函數(shù)調(diào)用時的現(xiàn)場保護(hù)和返回地址等。其中:952.變量的存儲類型①數(shù)據(jù)類型:如整型(int)、實(shí)型(float)、字符型(char)、雙精度型(double)等。②
數(shù)據(jù)的存儲類型:分為自動類型(auto)、靜態(tài)類型(static)、寄存器類型(register)、外部類型(extern)。
2.變量的存儲類型96例5.4計算并輸出1~5的階乘值。其C程序如下:intfac(n)intn;{staticintf=1;f=f*n;return(f);}
#include"stdio.h"main(){inti;for(i=1;i<=5;i=i+1)printf("%d!=%d\n",i,fac(i));}例5.4計算并輸出1~5的階乘值。其C程序如下:97下面對靜態(tài)存儲變量作幾點(diǎn)說明:①形參不能定義成靜態(tài)類型。②對局部靜態(tài)變量賦初值是在編譯時進(jìn)行的,在調(diào)用時不再賦初值;而對自動變量賦初值是在調(diào)用時進(jìn)行的,每次調(diào)用將重新賦初值。③定義局部靜態(tài)變量時若不賦初值,則在編譯時將自動賦初值0;但在定義自動變量時若不賦初值,則其初值為隨機(jī)值。④若無多大必要,盡量不用局部靜態(tài)變量。下面對靜態(tài)存儲變量作幾點(diǎn)說明:983.外部變量全局變量如果在文件開頭定義,則在整個文件范圍內(nèi)的所有函數(shù)都可以使用該變量。一般來說,全局變量有以下幾種用法:①
在同一文件中,為了使全局變量定義點(diǎn)之前的函數(shù)中也能使用該全局變量,則應(yīng)在函數(shù)中用extern加以說明。
②
使一個文件中的函數(shù)也能用另一個文件中的全局變量。
③
利用靜態(tài)外部變量,使全局變量只能被本文件中的函數(shù)引用。
3.外部變量99
內(nèi)部函數(shù)與外部函數(shù)在C語言中,函數(shù)可以分為內(nèi)部函數(shù)與外部函數(shù)。只能被本文件中其他函數(shù)調(diào)用的函數(shù)稱為內(nèi)部函數(shù),內(nèi)部函數(shù)又稱為靜態(tài)函數(shù)。定義內(nèi)部函數(shù)的形式如下:static類型標(biāo)識符函數(shù)名(形參表)定義外部函數(shù)的形式如下:[extern]類型標(biāo)識符函數(shù)名(形參表)內(nèi)部函數(shù)與外部函數(shù)1005.3模塊的遞歸調(diào)用人們在解決一些復(fù)雜問題時,為了降低問題的復(fù)雜程度(如問題的規(guī)模等),一般總是將問題逐層分解,最后歸結(jié)為一些最簡單的問題。
返回目錄5.3模塊的遞歸調(diào)用人們在解決一些復(fù)雜問題時,為101例5.5編寫一個C函數(shù),對于輸入的參數(shù)n,依次打印輸出自然數(shù)1到n。這是一個很簡單的問題,實(shí)際上不用遞歸就能解決,其C函數(shù)如下:#include"stdio.h"wrt(intn){intk;for(k=1;k<=n;k++)printf("%d\n",k);return;}例5.5編寫一個C函數(shù),對于輸入的參數(shù)n,依次102解決這個問題還可以用以下的遞歸函數(shù)來實(shí)現(xiàn):#include"stdio.h"wrt1(intn){if(n!=0){wrt1(n-1);
printf("%d\n",n);}return;}功能:對于輸入的參數(shù)n,依次打印輸出自然數(shù)1到n解決這個問題還可以用以下的遞歸函數(shù)來實(shí)現(xiàn):103自己調(diào)用自己的過程稱為遞歸調(diào)用過程。在C語言中,自己調(diào)用自己的函數(shù)稱為遞歸函數(shù)。遞歸分為直接遞歸與間接遞歸兩種。所謂直接遞歸,是指直接調(diào)用函數(shù)本身。
自己調(diào)用自己的過程稱為遞歸調(diào)用過程。在C語言中,自1045.4程序舉例例5.6編寫一個函數(shù),其功能是判斷給定的正整數(shù)是否是素數(shù),若是素數(shù)則返回函數(shù)值1,否則返回函數(shù)值0。其C函數(shù)如下:#include"math.h"sushu(intn){intk,i,flag;k=sqrt((double)n);i=2;flag=0;while((i<=k)&&(flag==0)){if(n%i==0)flag=1;i=i+1;}return(!flag);}返回目錄5.4程序舉例例5.6編寫一個函數(shù),其功能是105例5.8Hanoi塔問題。相傳古代印度有一座Bramah廟,廟中有三根插在黃銅板上的寶石柱,在其中的一根柱子上放了64個金盤子,大盤在下,小盤在上,稱為Hanoi塔。有一天,廟里的和尚們想把這些盤子從一根柱子上移到另一根柱子上,規(guī)定每次只允許移動一個盤子,并且,在移動過程中都不允許出現(xiàn)大盤子壓在小盤子上面的現(xiàn)象,但在移動盤子的過程中可以利用三根柱子中的任何一根。為了使問題具有普遍性,假設(shè)圓盤數(shù)為n,按直徑從小到大依次編號為1,2,…,n;三根柱子的名稱分別為X,Y,Z。開始時,n個圓盤按從大到小的順序(即下面放大圓盤,上面放小圓盤)放在X柱子上,現(xiàn)在要將X柱子上的n個圓盤移到Z柱子上,其移動的原則如上所述。這個問題稱為n階Hanoi塔問題。例5.8Hanoi塔問題。106可以寫出C程序如下:#include"stdio.h"main(){intn;charx='X',y='Y',z='Z';voidhanoi();printf("inputn=");scanf("%d",&n);hanoi(n,x,y,z);}
voidhanoi(n,x,y,z)intn;charx,y,z;{voidmove();可以寫出C程序如下:107if(n==1)move(x,n,z);else{hanoi(n-1,x,z,y);move(x,n,z);hanoi(n-1,y,x,z);}return;}
voidmove(x,n,z)intn;charx,z;{printf("%c(%d)---->%c\n",x,n,z);}if(n==1)move(x,n,z);1085.5編譯預(yù)處理編譯預(yù)處理功能是C語言的一個重要特點(diǎn)。所謂編譯預(yù)處理,是指C語言編譯系統(tǒng)首先對程序模塊中的編譯預(yù)處理命令進(jìn)行處理。C語言提供的編譯預(yù)處理命令主要有以下3種:(1)宏定義;(2)文件包含命令;(3)條件編譯命令。編譯預(yù)處理命令一般是在函數(shù)體的外面。正確使用編譯預(yù)處理命令,可以編寫出易于調(diào)試、易于移植的程序模塊。返回目錄5.5編譯預(yù)處理編譯預(yù)處理功能是C語言的一個重109
文件包含命令文件包含是指一個源文件可以將另一個指定的源文件包括進(jìn)來。文件包含命令的一般形式為#include〈文件名〉或#include"文件名"其功能是將指定文件中的全部內(nèi)容讀到該命令所在的位置后一起被編譯。文件包含命令110在使用文件包含命令時,要注意以下幾個問題:(1)當(dāng)#include命令指定的文件中的內(nèi)容改變時,包含這個文件的所有源文件都應(yīng)該重新進(jìn)行編譯處理;(2)一個#include命令只能指定一個被包含文件,如果需要包含多個文件,則要用多個#include命令實(shí)現(xiàn);(3)被包含的文件應(yīng)該是源文件,不能是經(jīng)編譯后的目標(biāo)文件;(4)文件包含可以嵌套使用,即被包含的文件中還可以使用#include命令;(5)由#include命令所指定的文件中可以有任何語言成分,因此,通??梢詫⒔?jīng)常使用的、具有公用性質(zhì)的符號常量、帶參數(shù)的宏定義以及外部變量等集中起來放在這種文件中,以盡量避免一些重復(fù)操作。在使用文件包含命令時,要注意以下幾個問題:111第6章數(shù)組第6章數(shù)組1126.1一維數(shù)組6.2二維數(shù)組6.3字符數(shù)組與字符串6.4數(shù)組作為函數(shù)參數(shù)6.5程序舉例6.1一維數(shù)組1136.1一維數(shù)組6.1.1一維數(shù)組的定義與引用定義一維數(shù)組的一般形式如下:類型說明符數(shù)組名[常量表達(dá)式];其中類型說明符是定義數(shù)組中各元素的數(shù)據(jù)類型,常量表達(dá)式是說明數(shù)組的大?。磾?shù)組中元素的個數(shù)。數(shù)組的說明與變量的說明一樣,其作用是為數(shù)組分配存儲空間。返回目錄6.1一維數(shù)組返回目錄114關(guān)于數(shù)組的說明要注意以下幾個問題:(1)數(shù)組名的命名規(guī)則與變量名相同。(2)說明數(shù)組大小的常量表達(dá)式必須為整型,并且用方括號括起來(不能用圓括號)。(3)說明數(shù)組大小的常量表達(dá)式中可以包含符號常量,但不能是變量。
關(guān)于數(shù)組的說明要注意以下幾個問題:115例6.1下面的程序說明了如何對數(shù)組定義和引用數(shù)組元素:#include"stdio.h"#defineN5main(){inti,a[N];for(i=0;i<N;i=i+1)a[i]=i;for(i=0;i<N;i=i+1)printf("%5d",a[i]);printf("\n");}例6.1下面的程序說明了如何對數(shù)組定義和引用數(shù)組元素:116在這個程序中,首先定義了一個長度為5的整型一維數(shù)組a,然后利用for循環(huán)對其中的每一個元素(a[0]~a[4])進(jìn)行賦值,最后利用for循環(huán)輸出這5個元素值。在C語言中,凡是一般簡單變量可以使用的地方都可以使用數(shù)組元素。在這個程序中,首先定義了一個長度為5的整型一維117
一維數(shù)組的初始化在C語言中,給數(shù)組元素提供數(shù)據(jù)的方法有以下3種。(1)利用賦值語句逐個對數(shù)組中的元素進(jìn)行賦值。(2)利用輸入函數(shù)逐個輸入數(shù)組中的各個元素。例如,#include"stdio.h"main(){inti,a[5];for(i=0;i<5;i=i+1)scanf("%d",&a[i]);}其中&a[i]表示取數(shù)組元素a[i]的地址。(3)初始化。
一維數(shù)組的初始化118下面對靜態(tài)一維數(shù)組的初始化作三點(diǎn)說明:(1)可以只給數(shù)組的前若干個元素賦初值,此時后面的元素均將自動賦以初值0。(2)在對全部元素賦初值時,說明語句中可以不指定數(shù)組長度,其長度默認(rèn)為與初值表中數(shù)據(jù)的個數(shù)相同。
(3)雖然標(biāo)準(zhǔn)C語言規(guī)定只能對“靜態(tài)存儲”的數(shù)組進(jìn)行初始化,即除了可以對外部(全局)數(shù)組進(jìn)行初始化外,還可以對用static說明的局部數(shù)組進(jìn)行初始化。
下面對靜態(tài)一維數(shù)組的初始化作三點(diǎn)說明:119例6.3分析下列程序的輸出結(jié)果:#include"stdio.h"main(){intk,x[5];staticinty[5];intz[5]={0,0,0};for(k=0;k<5;k++){printf("%5d%5d%5d",x[k],y[k],z[k]);printf("\n");}}例6.3分析下列程序的輸出結(jié)果:1206.2二維數(shù)組二維數(shù)組的定義與引用定義二維數(shù)組的一般形式如下:類型說明符
數(shù)組名[常量表達(dá)式1][常量表達(dá)式2];返回目錄6.2二維數(shù)組返回目錄121二維數(shù)組的初始化與一維數(shù)組一樣,也可以對靜態(tài)存儲的二維數(shù)組進(jìn)行初始化。在對二維數(shù)組進(jìn)行初始化時要注意以下幾點(diǎn)。(1)在分行給二維數(shù)組賦初值時,對于每一行都可以只對前幾個元素賦初值,后面未賦初值的元素系統(tǒng)將自動賦初值0;并且,還可以只對前幾行元素賦初值。(2)在給全部元素賦初值時,說明語句中可以省略第一維的長度說明。
(3)在分行賦初值時,也可以省略第一維的長度說明。
二維數(shù)組的初始化1226.3字符數(shù)組與字符串字符數(shù)組的定義與初始化定義字符數(shù)組的一般形式如下:char數(shù)組名[常量表達(dá)式];
一維字符數(shù)組char數(shù)組名[常量表達(dá)式1][常量表達(dá)式2];
二維字符數(shù)組(1)當(dāng)對字符數(shù)組中所有元素賦初值時,數(shù)組的長度說明可以省略。(2)可以只對前若干元素賦初值。
(3)雖然標(biāo)準(zhǔn)C語言規(guī)定只能對“靜態(tài)存儲”的字符數(shù)組進(jìn)行初始化,即除了可以對外部(全局)字符數(shù)組進(jìn)行初始化外,還可以對用static說明的局部字符數(shù)組進(jìn)行初始化。
返回目錄6.3字符數(shù)組與字符串返回目錄123字符串C語言規(guī)定,字符串常量(簡稱字符串)要用一對雙撇號括起來。在一個字符串常量中,最后還包括一個結(jié)束符‘\0’。
C語言允許用字符串常量對字符數(shù)組進(jìn)行初始化。字符串124字符數(shù)組與字符串的輸入與輸出1.輸入輸出一個字符(格式說明符為%c)在用于輸入時,輸入項為數(shù)組元素地址。在具體輸入時,各字符之間不要分隔,字符也不要用單撇號括起來。在用于輸出時,輸出項為數(shù)組元素。2.輸入輸出一個字符串(格式說明符為%s)在用格式說明符%s進(jìn)行輸入輸出時,其輸入輸出項均為數(shù)組名。但在輸入時,相鄰兩個字符串之間要用空格分隔,系統(tǒng)將自動地在字符串最后加結(jié)束符'\0'。
字符數(shù)組與字符串的輸入與輸出125字符串處理函數(shù)下面簡單介紹一些常用的字符串處理函數(shù)。(1)puts(字符數(shù)組名)功能:輸出一個字符串到終端。(2)gets(字符數(shù)組名)功能:從終端輸入一個字符串到字符數(shù)組,并返回字符數(shù)組的地址。(3)strcat(字符數(shù)組1,字符串2)功能:將字符串2連接到字符串1的后面,并返回字符串1的地址。字符串處理函數(shù)126(4)strcpy(字符數(shù)組1,字符串2)功能:字符串2拷貝到字符數(shù)組1中。(5)strcmp(字符串1,字符串2)功能:比較字符串。這個函數(shù)的返回值如下:若字符串1=字符串2,則返回值為0;若字符串1>字符串2,則返回值為正整數(shù);若字符串1<字符串2,則返回值為負(fù)整數(shù)。(4)strcpy(字符數(shù)組1,字符串2)127(6)strlen(字符串)功能:測試字符串長度。(7)大小寫轉(zhuǎn)換函數(shù)大小寫轉(zhuǎn)換函數(shù)有以下兩個:strlwr(字符串)將字符串中大寫字母轉(zhuǎn)換成小寫字母。strupr(字符串)將字符串中小寫字母轉(zhuǎn)換成大寫字母。(6)strlen(字符串)1286.4數(shù)組作為函數(shù)參數(shù)形參數(shù)組與實(shí)參數(shù)組的結(jié)合例6.8用選擇法對無序序列進(jìn)行排序。圖6.1選擇法排序流程圖返回目錄6.4數(shù)組作為函數(shù)參數(shù)圖6.1選擇法排序流程圖返回目129C程序如下:/*select.c*/select(b,n)intn,b[];{inti,j,k,d;for(i=0;i<=n-2;i=i+1){k=i;for(j=i+1;j<=n-1;j=j(luò)+1)if(b[j]<b[k])k=j(luò);if(k!=i){d=b[i];b[i]=b[k];b[k]=d;}}}
C程序如下:130/*ex.c*/#include"stdio.h"#include"select.c"main(){intk;staticints[10]={3,5,4,1,9,6,10,56,34,12};printf("\n");for(k=0;k<10;k=k+1)printf("%4d",s[k]));printf("\n");select(s,10);for(k=0;k<10;k=k+1)printf("%4d",s[k]));printf("\n");}/*ex.c*/131在C語言中,形參數(shù)組與實(shí)參數(shù)組之間的結(jié)合要注意以下幾點(diǎn):(1)調(diào)用函數(shù)與被調(diào)用函數(shù)中分別定義數(shù)組,其數(shù)組名可以不同,但類型必須一致。
(2)在C語言中,形參變量與實(shí)參之間的結(jié)合是采用數(shù)值結(jié)合的,因此,如果在被調(diào)用函數(shù)中改變了形參的值,是不會改變實(shí)參值的。
(3)實(shí)參數(shù)組與形參數(shù)組的大小可以一致也可以不一致,C編譯系統(tǒng)對形參數(shù)組的大小不作檢查,調(diào)用時只將實(shí)參數(shù)組的首地址傳給形參數(shù)組。
(4)雖然函數(shù)中的形參數(shù)組一般不指定大小,但為了控制形參數(shù)組的使用范圍,一般要在函數(shù)中另設(shè)一個傳送形參數(shù)組元素個數(shù)的形參變量,如函數(shù)select()中的形參n。在C語言中,形參數(shù)組與實(shí)參數(shù)組之間的結(jié)合要注意以下132二維數(shù)組作為函數(shù)參數(shù)二維數(shù)組作為函數(shù)參數(shù)與一維數(shù)組完全類似。
例6.9利用函數(shù)求兩個矩陣的乘積矩陣。在例6.4中說明了兩個矩陣相乘的方法。但在例6.4中,只能對固定的兩個矩陣進(jìn)行相乘,沒有通用性。在本例中,用函數(shù)matmul()來實(shí)現(xiàn)矩陣相乘,在主函數(shù)main()中再用具體的矩陣來調(diào)用它。二維數(shù)組作為函數(shù)參數(shù)133具體的C程序如下:#include"stdio.h"main(){inti,j,c[2][3];staticinta[2][4]={1,2,3,4,5,6,7,8};staticintb[4][3]={1,2,3,4,5,6,7,8,9,10,11,12};matmul(a,b,c,2,4,3);for(i=0;i<2;i=i+1){for(j=0;j<3;j=j(luò)+1)printf("%5d",c[i][j]);printf("\n");}printf("\n");}具體的C程序如下:134matmul(a,b,c,m,n,k)intm,n,k,a[2][4],b[4][3],c[2][3];{inti,j,t;for(i=0;i<m;i=i+1)for(j=0;j<k;j=j(luò)+1){c[i][j]=0;for(t=0;t<n;t=t+1)c[i][j]=c[i][j]+a[i][t]*b[t][j];}return;}matmul(a,b,c,m,n,k)1356.5程序舉例例6.10從鍵盤輸入年、月、日,計算并輸出該日是該年的第幾天。C程序如下:#include"stdio.h"main(){intyear,month,day,k,sum;staticintt[]={31,0,31,30,31,30,31,31,30,31,30,31};printf("inputyear,month,day:");scanf("%d,%d,%d",&year,&month,&day);if((year%4==0&&year%100!=0)||year%400==0)t[1]=29;elset[1]=28;sum=day;for(k=0;k<month-1;k=k+1)sum=sum+t[k];printf("Dyas=%d\n",sum);}返回目錄6.5程序舉例返回目錄136例6.12編寫一個對長度為n的線性表進(jìn)行冒泡排序的函數(shù)。冒泡排序的過程如下:從前到后掃描待排序序列,依次比較相鄰兩個項目的大小,若發(fā)現(xiàn)逆序就進(jìn)行交換,最后使最大者換到序列的最后;然后從后到前掃描剩下的序列,依次比較相鄰兩個項目的大小,若發(fā)現(xiàn)逆序就進(jìn)行交換,最后使最小者換到序列的最前面。對剩下的序列重復(fù)這個過程,直到剩下的序列為空為止。例6.12編寫一個對長度為n的線性表進(jìn)行冒泡排序137C函數(shù)如下:voidprbub(p,n)intn;doublep[];{intm,k,j,i;doubled;k=0;m=n-1;while(k<m={j=m-1;m=0;for(i=k;i<=j(luò);i++)if(p[i]>p[i+1]){d=p[i];p[i]=p[i+1];p[i+1]=d;m=i;}j=k+1;k=0;for(i=m;i>=j(luò);i--)if(p[i-1]>p[i]){d=p[i];p[i]=p[i-1];p[i-1]=d;k=i;}}return;}C函數(shù)如下:138第7章指針第7章指針1397.1指針的基本概念7.2指針變量7.3數(shù)組與指針7.4字符串與指針7.5指針數(shù)組與指向指針的指針7.6函數(shù)與指針7.7程序舉例7.1指針的基本概念1407.1指針的基本概念(1)直接存取所謂直接存取,是指在程序執(zhí)行過程中需要存取變量值時,直接存取變量所占內(nèi)存單元中的內(nèi)容。
(2)間接存取所謂間接存取,是指為了要存取一個變量值,首先從存放變量地址的指針變量中取得該變量的存儲地址,然后再從該地址中存取該變量值。
返回目錄7.1指針的基本概念返回目錄141在C語言中,用符號“*”表示“指向”,反映指針變量與它所指的變量之間的聯(lián)系
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年全頻道無線轉(zhuǎn)播器項目可行性研究報告
- 2025至2030年高速單針鎖式平縫機(jī)項目投資價值分析報告
- 2025至2030年捷達(dá)大燈開關(guān)項目投資價值分析報告
- 二零二五年度配電箱系統(tǒng)集成與優(yōu)化服務(wù)合同
- 建筑玻璃運(yùn)輸服務(wù)合同
- 二零二五年度貨車司機(jī)職業(yè)健康管理與保障服務(wù)合同2篇
- 房地產(chǎn)行業(yè)購房合同法律咨詢協(xié)議
- 房地產(chǎn)經(jīng)紀(jì)行業(yè)房源信息免責(zé)協(xié)議
- 2024年生物科技項目開發(fā)合作協(xié)議
- 投資組合的市場中性投資策略應(yīng)用與解析考核試卷
- 實(shí)驗室危險廢物處理廢液分類與收集
- 生活老師培訓(xùn)資料課件
- 2020年新概念英語第一冊lesson97-102單元檢測
- 腹主動脈瘤(護(hù)理業(yè)務(wù)學(xué)習(xí))
- 注射用醋酸亮丙瑞林微球
- 部編版語文五年級下冊 全冊教材分析
- 大學(xué)生就業(yè)指導(dǎo)PPT(第2版)全套完整教學(xué)課件
- 家具安裝工培訓(xùn)教案優(yōu)質(zhì)資料
- 湖南大一型抽水蓄能電站施工及質(zhì)量創(chuàng)優(yōu)匯報
- 耳穴療法治療失眠
- envi二次開發(fā)素材包-idl培訓(xùn)
評論
0/150
提交評論