C語言程序設計課件版_第1頁
C語言程序設計課件版_第2頁
C語言程序設計課件版_第3頁
C語言程序設計課件版_第4頁
C語言程序設計課件版_第5頁
已閱讀5頁,還剩47頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

本文格式為Word版,下載可任意編輯——C語言程序設計課件版程序設計語言一般分為機器語言、匯編語言和高級語言三大類。

11.機器語言

對于計算機來說,一組機器指令就是程序,稱為機器語言程序。

22.匯編語言

為了便于理解與記憶,人們采用能幫助記憶的英文縮寫符號(稱為指令助記符)來代替機器語言指令代碼中的操作碼,用地址符號來代替地址碼。

33.高級語言

機器語言和匯編語言都是面向機器的語言,一般稱為低級語言。

例例2.1

編寫一個CC程序,其功能是顯示字符串Howdoyoudo!?。

其其CC程序如下:

#includequot;stdio.hquot;main(){{

printf(quot;Howdoyoudo!\\nquot;);}}下面針對一般的CC程序作幾點說明:

(11的)一個完整的CC語言程序可以由多個函數(shù)組成,但必需包含一個且只能包含一個名為nmain的函數(shù)(主函數(shù))。程序總是從nmain函數(shù)開始執(zhí)行。

(22)在一個CC函數(shù)模塊中,由左右花括號{}括起來的部分是函數(shù)體,其中的語句系列實現(xiàn)函數(shù)的預定功能。

(33)CC程序中的每一個語句必需以;?終止,但書寫格式是自由的。

(44)e#include是編譯預處理命令,其作用是將雙引號或尖括號括起來的文件內(nèi)容讀到該命令的位置處。

(55)在CC程序的任何位置處都可以用/**/作解釋,以提高程序的可讀性。

2.2.1

整型常量及其變量的定義11.整型常量

在在CC語言中,有33。

種類型的整型常量:基本整型常量、長整型常量、無符號整型常量。

在CC語言中,不管是哪種類型的整型常量,都可以用33種數(shù)制表示。

(11)十進制整型常量。

(22)十六進制整型常量。

(33)八進制整型常量。

22.整型變量的定義

在在CC程序中,用于存放整型數(shù)據(jù)的變量稱為整型變量。

在在CC語言中,可以定義基本整型、長整型、短整型和無符號整型等44種類型的整型變量。它們的定義方式如下。

(11)基本整型變量

定義基本整型變量的形式如下:

int

變量表列;(22)長整型

定義長整型變量的形式如下:

long

[int]

變量表列;

(33)短整型定義短整型變量的形式如下:

short

[int]

變量表列;(44)無符號整型定義無符號基本整型變量的形式如下:

unsigned

[int]

變量表列;

一個類型說明語句可以同時定義多個同類型的變量,各變量之間用逗號,?分隔。

用類型說明語句定義的變量只是說明白為這些變量分派了存儲空間,以便用于存放。

與之一致類型的數(shù)據(jù),在未對這些變量賦值前,這些變量中(即存儲空間中)的值是隨機的。

CC語言允許在定義變量的同時為變量賦初值。

在為整型變量初始化或賦值時,CC編譯系統(tǒng)自動將被賦數(shù)據(jù)轉(zhuǎn)換成與相應變量的類型一致。

由于各種整型變量所占的字節(jié)數(shù)有限,因此,它們所能存放的整數(shù)有一定的范圍。

實型常量及其變量的定義

11.實型(浮點型)常量(11)十進制數(shù)形式(22)指數(shù)形式(科學記數(shù)法)

22.實型變量的定義在在CC程序中,用于存放實型數(shù)據(jù)的變量稱為實型變量。

在在CC語言中,實型變量有單精度與雙精度兩種。

單精度

float

雙精度

double

字符型常量及其變量的定義

11.字符型常量"\\n"

換行"\\r"

回車"\\b"

退格"\\t"

制表(橫向跳格)

"\\""

單引號(單撇號)

"\\quot;"

雙引號(雙撇號)

"\\ddd"

1~33位八進制數(shù)所代表的IASCII碼字符"\\xhh"

1~22位十六進制數(shù)所代表的IASCII碼字符"\\f"

走紙換頁\\\\

反斜杠字符22.字符型變量的定義字符型變量的定義方式如下:

char

變量表列;

數(shù)據(jù)的輸入與輸出應包括以下幾項:

輸入(出)的設備②

輸入(出)的格式③

輸入(出)的內(nèi)容

格式輸出函數(shù)

格式輸出函數(shù)的一般形式如下:

printf(*格式控制?,輸出表));

其中格式控制部分要用一對雙撇號括起來,它用于說明輸出項目所采用的格式。

11.整型格式說明符(11)十進制形式

(22)八進制形式(33)十六進制形式

22.實型格式說明符

假使以十進制數(shù)形式輸出實型數(shù)據(jù),其格式說明符為

%f或

%m.nf假使以指數(shù)形式輸出實型數(shù)據(jù),其格式說明符為

%e或

%m.ne

33.字符型格式說明符

字符型數(shù)據(jù)的格式說明符為

%c或

%mc

(11)輸出表中各輸出項目之間要用,?分隔。

(22)格式控制中的各格式說明符與輸出表中的各輸出項目在個數(shù)、次序、類型等方面必須一一對應。

(33)格式控制中除格式說明符外的其他字符將按原樣輸出。

(44)在輸出格式說明符中,假使帶有寬度說明,則在左邊沒有數(shù)字的位置上用空格填滿(即輸出的數(shù)字是右對齊)。但假使在寬度說明前加一個負號(-),則輸出為左對齊,即在右邊補空格。

格式輸入函數(shù)

格式輸入函數(shù)的一般形式如下:

scanf(格式控制?,內(nèi)存地址表);

11.整型格式說明符(11)十進制形式

用于輸入十進制形式的整型數(shù)據(jù)。

(22)八進制形式用于輸入八進制形式的整型數(shù)據(jù)。

(33)十六進制形式用于輸入十六進制形式的整型數(shù)據(jù)。

22.實型格式說明符用于輸入的單精度實型格式說明符為

%f或

%e用于輸入的雙精度實型格式說明符為

%lf

33.字符型格式說明符用于輸入的字符型格式說明符為

%c或

%mc

賦值運算

賦值運算符為=?。賦值表達式為變量名=表達式(11)在CC語言中,=?為賦值運算符,而不是等號;(22)賦值運算符=?左邊必需是變量名,不能是表達式;(33)賦值運算符=?兩端的類型不一致時,系統(tǒng)將自動進行類型轉(zhuǎn)換。

算術運算

在CC語言中,基本的算術運算符有以下幾個:

加法運算符(雙目運算符),或正值運算符(單目運算符)。如xx+yy,+xx。

減法運算符(雙目運算符),或負值運算符(單目運算符)。如aa-33,-xx。

*

乘法運算符(雙目運算符)。如3*x。

/

除法運算符(雙目運算符)。如x/y。

%

模余運算符(雙目運算符)。只適用于整型數(shù)據(jù),如49%4的值為11,311%3的值為22等。

關系運算

在在CC語言中,基本的關系運算符有以下66個:

小于<=

小于或等于>

大于>=

大于或等于==

等于!!=

不等于

結(jié)果只有兩個:

true

或者

false

執(zhí)行intx=22,yy=33;后表達式xx=(yy==33)的值是(1)

規(guī)律運算

在在CC語言中,規(guī)律常量只有兩種:值非零表示真?,值為零表示假?。其基本的規(guī)律運算符有以下33個:

(規(guī)律與)

兩個量都為真時為真(11),否則為假(00)

||(規(guī)律或)

兩個量中只要有一個為真時為真(11),只有都為假時為假(00)

!(規(guī)律非)

一個量為真時為假(00),假時為真(11)

自增++與自減--運算符

增11運算符++?和減11運算符--?是兩個單目(只有一個運算對象)運算符,它們的運算對象只能是整型或字符型變量。

增增11運算符是將運算對象的值增11;減11運算符是將運算對象的值減11。

假設定義變量

inta=5;nintb;前綴自增

b=++a;//a=6b=6

后綴自增

b=

a++;//a=6b=5

fsizeof運算符

fsizeof運算符有以下兩種用法:

(11)用于求得表達式計算結(jié)果所占內(nèi)存的字節(jié)數(shù)。其一般形式為

sizeof

表達式(22)用于求得某種數(shù)據(jù)類型的量所占內(nèi)存的字節(jié)數(shù)。其一般形式為

sizeof(類型名)

逗號運算符

逗號,?是是CC程序中常見的符號。

在在CC語言中,逗號除作為分隔符使用外,還可以作為運算符來使用,稱為逗號運算符。

逗號表達式的一般形式為子表達式11,子表達式22,,子表達式nn

在使用逗號運算符(逗號表達式)時,要注意以下幾點:

(11)逗號運算符是所有運算符中級別最低的一種運算符。

(22)一個逗號表達式又可以與另一個表達式(可以是逗號表達式,也可以不是逗號表達式)連接成新的逗號表達式。

(33)在大量狀況下,使用逗號表達式的目的僅僅是為了得到各個子表達式的值,而并不一定要得到或使用整個逗號表達式的值。

CC語言中的宏定義有兩種形式:符號常量定義與帶參數(shù)的宏定義。

符號常量定義

在在CC語言中,允許將程序中多處用到的字符串?定義成一個符號常量。在CC語言中定義符號常量的一般形式如下:

#define

符號常量名

字符串

由于CC語言中的所有變量名、函數(shù)名等都使用小寫字母,因此,符號常量名一般用大寫字母表示,以便與CC語言中的保存關鍵字相區(qū)別。

CC編譯系統(tǒng)對定義的符號常量的處理只是進行簡單的替換,不作任何語法檢查。

#define是一個命令,而不是語句,因此在行末不能加;?,并且應獨立占一行。

#define命令一般應出現(xiàn)在程序中函數(shù)的外面,其作用域范圍是從#define

符號常量名

字符串到#undef

符號常量名((或文件末))

帶參數(shù)的宏定義

帶參數(shù)的宏定義的一般形式為

#define

宏名(參數(shù)表)

字符串

其中字符串中應包含在參數(shù)表中所指定的參數(shù),并且,當參數(shù)表中的參數(shù)多于一個時,各參數(shù)之間要用逗號分隔。

在使用帶參數(shù)的宏定義時,應注意以下兩個問題。

(11)在使用帶參數(shù)的宏定義時,一般應將宏定義字符串中的參數(shù)都要用括號括起來,否則經(jīng)過宏展開后,可能會出現(xiàn)意想不到的錯誤。

(22)在使用帶參數(shù)的宏定義時,除了應將宏定義字符串中的參數(shù)都要用括號括起來,還需。

要將整個字符串部分也要用括號括起來,否則經(jīng)過宏展開后,還會可能出現(xiàn)意想不到的錯誤。

書寫一個求最大值的宏定義#defineMAX(a,b)((agt;b)?(a),(b))

3.1

語句與復合語句

在在CC語言中,一個表達式后面跟隨一個分號就構(gòu)成了一個語句,這種語句稱為表達式語句。

在CC語言中,分號(;)是表達式語句的終結(jié)符,而不是語句之間的分隔符,也就是說,分號是表達式語句的一個組成部分,只不過它位于表達式的后面。

在一個函數(shù)體內(nèi)部,由左、右花括號括起來的語句稱為復合語句,它的一般形式為{{說明部分;語句部分;}}

3.2

if語

If語句的形式為

if

(表達式)

語句這種選擇結(jié)構(gòu)的流程圖如圖13.1所示。

下面對fif語句作幾點說明:

(11)fif語句中的規(guī)律表達式(即條件)必需要用一對圓括號括起來。

(22)fif語句后的語句可以是復合語句。

(33)一個fif語句

用最終需要強調(diào)的是,在使用fif語句時,一定要注意規(guī)律表達式的正確寫法,特別是在連續(xù)使用多個fif語句時更要注意。

e3.3

ifelse結(jié)構(gòu)

在在CC語言中,eifelse結(jié)構(gòu)的語句形式為

if

(表達式)

語句11

else

語句22

下面對eifelse結(jié)構(gòu)作以下幾點說明:

(11)eifelse結(jié)構(gòu)中的語句11與語句22都可以是復合語句。

(22)在fifeelse結(jié)構(gòu)中,語句11與語句22都可以是空語句。

(33)在fifeelse結(jié)構(gòu)中,假使在eelse前面有多個fif語句,則eelse與最近的fif配對。

(44)假使有多個eifelse結(jié)構(gòu)嵌套如下:

if

(表達式1)

語句11

else

if

(表達式22)

語句22

else

else

if

(表達式nn)

語句nn

else

語句nn+11則可簡寫成

if

(表達式11)

語句11

elseif

(表達式22)

語句22

else

if

(表達式nn)

語句nn

else

語句nn+11

在在eifelse結(jié)構(gòu)中,假使語句11與語句22都是單一的賦值語句,并且都是給同一個變量賦值,則可以用條件運算符來進行處理。

下面對條件表達式作幾點說明:

(11)條件運算符優(yōu)先級要比賦值運算符高。

(22)條件運算符的優(yōu)先級比關系運算符與算術運算符都要低,因此,條件表達式中的表

達式11?、表達式22?與表達式33?都不必用括號括起來。

(33)條件運算符的結(jié)合方向為從右到左?。

在在CC語言中提供了一個直接實現(xiàn)多路分支選擇的結(jié)構(gòu),稱為hswitch:

結(jié)構(gòu),其一般形式如下:

switch(表達式))

{

case

常量表達式1:

語句11

case

常量表達式2:

語句22

case

常量表達式n:

語句nn

default

:

語句nn+11

}}

下面對hswitch結(jié)構(gòu)作幾點說明:

(11)hswitch結(jié)構(gòu)中的表達式、常量表達式11、L、常量表達式nn必需是整型或字符型。這是由于,在hswitch結(jié)構(gòu)中,其分支數(shù)一般是有限的,并且是離散的,因此,其表達式的值也應是有限的,且是離散的。

(22)同一個hswitch結(jié)構(gòu)中的常量表達式值必需互不一致,否則就會出現(xiàn)矛盾的現(xiàn)象,即對于表達式?的同一個值對應多種執(zhí)行方案,這是錯誤的。

(33)在hswitch結(jié)構(gòu)中,case與

default的順序可以任意,各ecase之間

。

的順序也可以任意。

(44)在執(zhí)行hswitch結(jié)構(gòu)時,當執(zhí)行完某case后的語句后,將順序執(zhí)行后面case后的語句,直到遇

break語句才退出整個switch結(jié)構(gòu)的執(zhí)行。

(55)在hswitch結(jié)構(gòu)中,假使沒有default且表達式?值不等于任何case后常量表達式的值,則直接退出switch結(jié)構(gòu)而轉(zhuǎn)到其后的語句執(zhí)行。

例例3.12

計算獎金。

當企業(yè)利潤PP等于或低于50.5萬元時,獎金為利潤的1%;當0.5<PP11萬元時,超過過50.5萬元部分的獎金為利潤的1.5%,50.5萬元以下仍按1%計算;當11<PP22萬元時,11萬元以下部分仍按前面的方法計算,超過11萬元的部分其獎金按利潤的2%計算;當22<PP55萬元時,22萬元以下部分仍按前面的方法計算,超過22萬元部分的獎金按利潤的2.5%計算;當當55<PP010萬元時,55萬元以下部分仍按前面的方法計算,超過55萬元部分的獎金按利潤的的3%計算;當PP>010萬元時,010萬元以下部分仍按前面的方法計算,超過010萬元部分按3.5%計算。其中PP由鍵盤輸入,計算并輸出相應的獎金數(shù)W。

根據(jù)圖53.5所示的流程圖,用fifelseif結(jié)構(gòu)寫出CC程序如下:

#include

quot;stdio.hquot;main(){float

p,ww;

printf(quot;inputp:quot;);

scanf(quot;%fquot;,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);

else

w=0.2575+0.035*(p-10.0);

printf(quot;w=%f\\nquot;,w);}}例例3.14

求解一元二次方程Ax22+Bx+CC=00。

相應的CC程序如下:

#include

quot;stdio.hquot;#include

quot;math.hquot;main(){

double

a,bb,cc,dd,x1,x2,pp;

printf(quot;inputa,bb,c:quot;);

scanf(quot;%lf%lf%lfquot;,a,b,c);

if(a==00.0)

{if(b==0.0)

printf(quot;ERR\\nquot;);

else

printf(quot;X=%f\\nquot;,-c/b);

}}

elseif(b==0.0)

{d=c/a;

if(d<=0.0)

{printf(quot;X1=%f\\nquot;,sqrt(-d));

printf(quot;X2=%f\\nquot;,-sqrt(-d));

}}else

{printf(quot;X1=+j%f\\nquot;,sqrt(d));

printf(quot;X2=-j%f\\nquot;,sqrt(d));

}}

elseif(c==0.0)

{printf(quot;X1=0.0\\nquot;);

printf(quot;X2=%f\\nquot;,-b/a);

}}else

{d=b*b-4*a*c;

if(d>=0.0)

{d=sqrt(d);

if(b>0.0)x1=((-bb-d)/(2*a);

else

x1=((-bb+d)/(2*a);

x2=c/(a*x1);

printf(quot;X1=%f\\nquot;,x1);

printf(quot;X2=%f\\nquot;,x2);

}}else

{d=sqrt(-d)/(2*a);

pp=-b/(2*a);

printf(quot;X1=%f+j%f\\nquot;,pp,)d);

printf(quot;X22=%f-j%f\\nquot;,pp,)d);

}}

}}}}

4.1.1

當型循環(huán)結(jié)構(gòu)當型循環(huán)結(jié)構(gòu)的流程圖如圖14.1所示。

ewhile循環(huán)

實現(xiàn)當型循環(huán)結(jié)構(gòu)的CC語句形式為

while

(表達式)

循環(huán)體語句

功能:當表達式值00時,執(zhí)行循環(huán)體,執(zhí)行完后繼續(xù)判斷表達式值,只有當表達式值=00時才退出循環(huán)。

例例4.2

從鍵盤輸入各學生成績,并對090分以上(包括090分)的學生人數(shù)進行計數(shù),直到輸入的成績?yōu)樨摓橹?,最終輸出成績在090分以上的學生人數(shù)。

其流程圖如圖34.3所示。其中變量tcount為整型,用于對090分以上的學生人數(shù)進行計數(shù)。

相應的CC程序如下:

#include

quot;stdio.hquot;main(){int

count;

float

grade;

count=00;

scanf(quot;%fquot;,grade);

while(grade>=0.0)

{if(grade>=90.0)

count=count+11;

scanf(quot;%fquot;,grade);

}}

printf(quot;count=%d\\nquot;,count);}}

直到型循環(huán)結(jié)構(gòu)

直到型循環(huán)結(jié)構(gòu)的流程圖如圖44.4所示。

do__while循環(huán)

edo_while循環(huán)的執(zhí)行過程是,首先執(zhí)行循環(huán)體,然后判斷條件(即計算規(guī)律表達式),假使條件滿足(即規(guī)律表達式值為真),則退出循環(huán)結(jié)構(gòu);假使條件不滿足(即規(guī)律表達式值為假),則繼續(xù)執(zhí)行循環(huán)體。

實現(xiàn)直到型循環(huán)結(jié)構(gòu)的CC語句形式為do

循環(huán)體語句

while(表達式);

功能:先執(zhí)行循環(huán)體,然后判斷表達式值,若表達式值00,則再次執(zhí)行循環(huán)體,如此循環(huán),直到表達式值=00為止。

例例4.3

計算并輸出以下級數(shù)和:

直到某項的絕對值小于

為止相應的流程圖如圖54.5所示。其中ff用于改變每一項的符號,由于這是一個各項符號相間的級數(shù)。

相應的CC程序如下:

#include

quot;stdio.hquot;main(){int

k;

double

sum,dd,ff;

sum=1.0;

kk=11;ff=1.0;

do

{k=kk+11;ff=-ff;dd=1.0/(k*(k+1));sum=sum+f*d;

}}

whiled(d>=1.0e-)4);

printf(quot;sum=%lf\\nquot;,sum);}}

當型循環(huán)結(jié)構(gòu)與直到型循環(huán)結(jié)構(gòu)的區(qū)別與聯(lián)系

當型循環(huán)結(jié)構(gòu)與直到型循環(huán)結(jié)構(gòu)既有共同之處,又有區(qū)別。主要表達在以下幾個方面。

(11)在ewhile循環(huán)中,其循環(huán)體可以一次也不執(zhí)行(即執(zhí)行ewhile循環(huán)結(jié)構(gòu)的一開始,其條件就不滿足)。

(22)不管是ewhile循環(huán)結(jié)構(gòu)還是doewhile循環(huán)結(jié)構(gòu),在循環(huán)體內(nèi)部必需要有能改變條件((即規(guī)律表達式值))的語句,否則將造成死循環(huán)。

(33)對于有些問題既可以用ewhile循環(huán)結(jié)構(gòu)來處理,也可以用doewhile循環(huán)結(jié)構(gòu)來處理。

(44)不管是ewhile循環(huán)結(jié)構(gòu)還是doewhile循環(huán)結(jié)構(gòu),其循環(huán)體假使包含一個以上的語句,應以復合語句形式出現(xiàn)。

CC語言提供的rfor循環(huán)屬于當型循環(huán)結(jié)構(gòu),其一般形式為

for(表達式11;表達式22;表達式33)

循環(huán)體語句(組)

它等價于以下的當型循環(huán)結(jié)構(gòu):

表達式11;while(表達式22)

{

循環(huán)體語句

表達式33;

}}

下面對rfor循環(huán)語句作幾點說明:

(11在)在rfor語句中,三個表達式中的任何一個表達式均可省略,但其中的兩個;?不能省略。

(22)以下兩個循環(huán)都是死循環(huán):

for(表達式11;;表達式3)

循環(huán)體與

for(;;)

循環(huán)體

式由于它們都沒有用于判斷循環(huán)是否終止的條件(即表達式22)。

(33)rfor循環(huán)本質(zhì)上也是當型循環(huán)結(jié)構(gòu),只不過它對于事先可以確定循環(huán)次數(shù)的問題特別便利。

(44)在rfor循環(huán)中,循環(huán)體也可以是復合語句(即用一對花括號{}。

括起來的語句組)。

循環(huán)的嵌套

所謂循環(huán)的嵌套是指一個循環(huán)體內(nèi)又包含了另一個完整的循環(huán)結(jié)構(gòu)。CC語言允許循環(huán)結(jié)構(gòu)嵌套多層。循環(huán)的嵌套結(jié)構(gòu)又稱為多重循環(huán)。

例例4.6

計算并輸出010以內(nèi)((包括10)所有自然數(shù)的階乘值。即計算!1!,!2!,!3!,!4!,!5!,!6!,!7!,!8!,!9!,10!。

采用的方法是,對于010以內(nèi)的每一個自然數(shù)分別求它們的階乘值。其流程圖如圖74.7所示。顯然,這是一個二重循環(huán)結(jié)構(gòu)。

相應的CC程序如下:

#include

quot;stdio.hquot;main(){int

n,kk;

double

s;

for(n=11;

nn<=10;

nn=nn+)1)

{s=1.0;

for(k=11;

kk<=nn;

kk=kk+1)

s=s*k;

printf(quot;%2d!=%16.7f\\nquot;,nn,)s);

}}}}break語句

CC語言中的kbreak語句有以下兩個功能:

(11)跳出

switch結(jié)構(gòu);(22)退出當前循環(huán)結(jié)構(gòu),包括

while結(jié)構(gòu)、

dowhile結(jié)構(gòu)和rfor循環(huán)結(jié)構(gòu)。

continue語句

econtinue語句的功能是終止本次循環(huán)的執(zhí)行,但不退出循環(huán)結(jié)構(gòu)。

下面舉兩個例子來說明econtinue語句的使用。

例例4.10

輸出100~0200之間所有能被77或或99整除的自然數(shù)。

相應的CC程序如下:

#include

quot;stdio.hquot;main(){int

n;

for(n=100;

nn<=200;

nn=nn+)1)

{if(n%7!=0)(n%9!=0))

continue;

/*終止本次循環(huán),繼續(xù)進行下次循環(huán)*/

printf(quot;%d

\\nquot;,n);

}}

實際上,上述程序等價于#include

quot;stdio.hquot;main(){int

n;

for(n=100;

nn<=200;

nn=nn+)1)

{if(n%7==0)||(n%9==0))

printf(quot;%d

\\nquot;,n);

}}}}

5.1.1

函數(shù)的概念

在在CC語言中,函數(shù)分為以下兩種。

(11)標準庫函數(shù)

這種函數(shù)用戶不必定義,但可直接使用。例如scanf(),

printf(),

fabs(),

sqrt(),exp(),sin(),cos()等都是CC語言中常用的庫函數(shù)。

(22)用戶自己定義的函數(shù)

這種函數(shù)用以解決用戶的專門問題,一般由用戶自己編寫。

例例5.1

從鍵盤輸入兩個正整數(shù)mm與nn((mmnn)),求

的值(即求

)。

其其CC程序如下:

#include

quot;stdio.hquot;main()

/*主函數(shù)*/{int

m,nn;

int

p();

/*說明本函數(shù)中要調(diào)用的函數(shù)p()是整型*/

scanf(quot;%d,%dquot;,m,n);

if(m>=n)

printf(quot;%d\\nquot;,p(m)/p(m-n));

else

printf(quot;m<n!\\nquot;);}}

intp(k)

/*計算階乘值的函數(shù)*/intk;{ints,ii;

ss=11;

for(i=11;

ii<=kk;

ii=ii+1)s=s*i;

return(s);}}下面對函數(shù)作幾點說明:

(11的)一個完整的CC程序可以由若干個函數(shù)組成,其中必需有一個且只能有一個主函數(shù)main()。

(22)一個完整CC程序中的所有函數(shù)可以放在一個文件中,也可以放在多個文件中。

在編譯命令行中鍵入各個函數(shù)所在的文件名(各文件名之間用空格分隔)。

在主函數(shù)中用

#include語句將各函數(shù)所在的文件包含進來。

(33)CC語言中的函數(shù)沒有附屬關系,各函數(shù)之間相互獨立,可以相互調(diào)用。

函數(shù)的定義

在在CC語言中,函數(shù)定義的一般形式為

類型標識符

函數(shù)名(形參表列)

形參類型說明

{

說明部分

語句部分

}}

在定義CC函數(shù)時要注意以下幾點。

(11)函數(shù)類型標識符同變量類型說明符,它表示返回的函數(shù)值類型。

(22)假使省略函數(shù)的類型標識符,則默認為是tint型。

(33)CC語言允許定義空函數(shù)。如dummy(){}

(44)函數(shù)中返回語句的形式為return(表達式);或return表達式;(55)假使形參表列?中有多個形式參數(shù),則它們之間要用,?分隔。

(66)CC語言允許在形參表中直接對形參的類型進行說明。

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

函數(shù)調(diào)用的一般形式為函數(shù)名(實參表列)

(11)函數(shù)調(diào)用可以出現(xiàn)在表達式中(有函數(shù)值返回);也可以單獨作為一個語句((無函數(shù)值返回))。

(22)實參表中的各實參可以是表達式,但它們的類型和個數(shù)應與函數(shù)中的形參一一對應。

(33)在調(diào)用函數(shù)中,尋常要對被調(diào)用函數(shù)的返回值類型進行說明(一般在調(diào)用函數(shù)的函數(shù)體中的說明部分),包括函數(shù)類型、函數(shù)名和一對圓括號。

例例5.2

以下程序的功能是計算輸出一個圓臺兩底面積之和。

#include

quot;stdio.hquot;main(){doubler1,r2;

doubleq();

printf(quot;input

r1,r2:quot;);

scanf(quot;%lf,%lfquot;,r1,r2);

printf(quot;s=%f\\nquot;,q(r1,r2));}}

doubleq(x,)y)doublex,yy;{double

s;

ss=3.1415926*(x*x+y*y);

return(s);}}

但但CC語言規(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ù)作了類型說明。

(44)CC語言雖不允許嵌套定義函數(shù),但可以嵌套調(diào)用函數(shù)。

形參與實參的結(jié)合方式

11.地址結(jié)合

所謂地址結(jié)合,是指在一個模塊調(diào)用另一個模塊時,并不是將調(diào)用模塊中的實參值直接傳送給被調(diào)用模塊中的形參,而只是將存放實參的地址傳送給形參。

22.數(shù)值結(jié)合

所謂數(shù)值結(jié)合,是指調(diào)用模塊中的實參地址與被調(diào)用模塊中的形參地址是相互獨立的,在一個模塊調(diào)用另一個模塊時,直接將實參值傳送給形參被存放在形參地址中。

例例5.3

分析以下CC程序:

void

swap(x,)y)int

x,yy;{intt;

tt=xx;

xx=y(tǒng)y;

yy=tt;

return;}

#include

quot;stdio.hquot;main(){int

x,yy;

scanf(quot;x=%d,yy=%dquot;,x,y);

swap(x,)y);

printf(quot;x=%d,yy=%d\\nquot;,xx,)y);}}

在這個程序中共有兩個函數(shù)。在主函數(shù)中分別為整型變量xx與與yy輸入數(shù)據(jù),然后調(diào)用函數(shù)swap(x,,)y)。而函數(shù)swap(x,,)y)的功能是實現(xiàn)變量xx值與yy值的交換。但在實際運行該程序時,假使從鍵盤輸入xx=66,yy=8則輸出的結(jié)果為xx=66,yy=88

即沒有達到交換的目的。這是由于在主函數(shù)中調(diào)用函數(shù)swap()時,只是將實參xx和和yy

的值分別傳遞給了swap()函數(shù)中的形參xx和和yy,但由于主函數(shù)中的實參xx和和yy與函數(shù)swap()中的形參xx和和yy在計算機中的存儲地址是不同的,因此,在函數(shù)swap()中雖然交換了形參xx與與yy的值,但實參xx與與yy的值實際上沒有改變,即它們沒有被交換。

由此可以看出,在形參與實參為數(shù)值結(jié)合的狀況下,實參與形參在計算機內(nèi)存中的存儲地址不是同一個,因此,即使在被調(diào)用函數(shù)中改變了形參值,調(diào)用函數(shù)中的實參值也是不會被改變的。

局部變量與全局變量

11.局部變量

在函數(shù)內(nèi)部定義的變量稱為局部變量。函數(shù)內(nèi)部定義的變量只在該函數(shù)范圍內(nèi)有效,因此,不同函數(shù)中的局部變量可以重名,互不混淆。

22.全局變量

在函數(shù)外定義的變量稱為全局變量

除非十分必要,一般不提倡使用全局變量,其原因有以下幾點:

由于全局變量屬于程序中的所有函數(shù),因此,在程序的執(zhí)行過程中,全局變量都需要占用存儲空間,即使實際正在執(zhí)行的函數(shù)中根本用不著這些全局變量,它們也要占用存儲空間。

在函數(shù)中使用全局變量后,要求在所有調(diào)用該函數(shù)的調(diào)用程序中都要使用這些全局變量,從而會降低函數(shù)的通用性。

在函數(shù)中使用全局變量后,使各函數(shù)模塊之間的相互影響比較大,從而使函數(shù)模塊的內(nèi)聚性?差,而與其他模塊的耦合性?強。

在函數(shù)中使用全局變量后,會降低程序的明了性,可讀性差。

動態(tài)存儲變量與靜態(tài)存儲變量

11.用戶程序的存儲分派一般來說,用戶程序在計算機中的存儲分派如圖15.1所示。

程序區(qū)靜態(tài)存儲區(qū)動態(tài)存儲區(qū)

其中:

程序區(qū)用于存放程序;

靜態(tài)存儲區(qū)是在程序開始執(zhí)行時就分派的固定存儲單元,如全局變量;

動態(tài)存儲區(qū)是在函數(shù)調(diào)用過程中進行動態(tài)分派的存儲單元,如函數(shù)形參、自動變量、函數(shù)調(diào)用時的現(xiàn)場保護和返回地址等。

22.變量的存儲類型

數(shù)據(jù)類型:如整型(int)、實型(float)、字符型(char)、雙精度型(double)等。

數(shù)據(jù)的存儲類型:分為自動類型(auto)、靜態(tài)類型(static)、寄放器類型(register)、外部類型(extern)。

例例5.4

計算并輸出11~55的階乘值。其CC程序如下:

int

fac(n)

int

n;{static

int

f=11;

ff=f*n;

return(f);}}

#include

quot;stdio.hquot;main(){int

i;

for(i=11;

ii<=55;

ii=ii+)1)

printf(quot;%d!=%d\\nquot;,ii,fac(i));}}

下面對靜態(tài)存儲變量作幾點說明:

形參不能定義成靜態(tài)類型。

對局部靜態(tài)變量賦初值是在編譯時進行的,在調(diào)用時不再賦初值;而對自動變量賦初值是在調(diào)用時進行的,每次調(diào)用將重新賦初值。

定義局部靜態(tài)變量時若不賦初值,則在編譯時將自動賦初值00;但在定義自動變量時若不賦初值,則其初值為隨機值。

若無多大必要,盡量不用局部靜態(tài)變量。

33.外部變量

全局變量假使在文件開頭定義,則在整個文件范圍內(nèi)的所有函數(shù)都可以使用該變量。

一般來說,全局變量有以下幾種用法:

在同一文件中,為了使全局變量定義點之前的函數(shù)中也能使用該全局變量,則應在函數(shù)中用nextern加以說明。

使一個文件中的函數(shù)也能用另一個文件中的全局變量。

利用靜態(tài)外部變量,使全局變量只能被本文件中的函數(shù)引用。

內(nèi)部函數(shù)與外部函數(shù)

在在CC語言中,函數(shù)可以分為內(nèi)部函數(shù)與外部函數(shù)。只能被本文件中其他函數(shù)調(diào)用的函數(shù)稱為內(nèi)部函數(shù),內(nèi)部函數(shù)又稱為靜態(tài)函數(shù)。

定義內(nèi)部函數(shù)的形式如下:

static

類型標識符

函數(shù)名(形參表)

定義外部函數(shù)的形式如下:

[extern]

類型標識符

函數(shù)名(形參表)

人們在解決一些繁雜問題時,為了降低問題的繁雜程度(如問題的規(guī)模等),一般總是將問題逐層分解,最終歸結(jié)為一些最簡單的問題。

例例5.5

編寫一個CC函數(shù),對于輸入的參數(shù)nn,依次打印輸出自然數(shù)11到nn。

這是一個很簡單的問題,實際上不用遞歸就能解決,其CC函數(shù)如下:

#include

quot;stdio.hquot;wrt(int

n){int

k;

for(k=11;kk<=nn;kk++)

printf(quot;%d\\nquot;,)k);

return;}}解決這個問題還可以用以下的遞歸函數(shù)來實現(xiàn):

#includequot;stdio.hquot;wrt1(intn){if(n!=)0)

{wrt1(n-)1);

printf(quot;%d\\nquot;,n);}

return;}}功能:對于輸入的參數(shù)nn,依次打印輸出自然數(shù)11到nn

自己調(diào)用自己的過程稱為遞歸調(diào)用過程。在CC。

語言中,自己調(diào)用自己的函數(shù)稱為遞歸函數(shù)。

遞歸分為直接遞歸與間接遞歸兩種。

所謂直接遞歸,是指直接調(diào)用函數(shù)本身。

例例5.6

編寫一個函數(shù),其功能是判斷給定的正整數(shù)是否是素數(shù),若是素數(shù)則返回函數(shù)值11,否則返回函數(shù)值00。

其其CC函數(shù)如下:

#include

quot;math.hquot;sushu(intn){int

k,ii,flag;

kk=sqrt((double)n);

ii=22;

flag=00;

while((i<=kk)(flag==0))

{if(n%i==0)flag=11;

ii=ii+11;

}}

return(!flag);}}

例例i5.8

Hanoi塔問題。

相傳古代印度有一座hBramah廟,廟中有三根插在黃銅板上的寶石柱,在其中的一根柱子上放了464個金盤子,大盤在下,小盤在上,稱為iHanoi塔。有一天,廟里的和尚們想把這些盤子從一根柱子上移到另一根柱子上,規(guī)定每次只允許移動一個盤子,并且,在移動過程中都不允許出現(xiàn)大盤子壓在小盤子上面的現(xiàn)象,但在移動盤子的過程中可以利用三根柱子中的任何一根。

為了使問題具有普遍性,假設圓盤數(shù)為nn,按直徑從小到大依次編號為11,22,,nn;三根柱子的名稱分別為XX,YY,ZZ。開始時,nn個圓盤按從大到小的順序(即下面放大圓盤,上面放小圓盤)放在XX柱子上,現(xiàn)在要將XX柱子上的nn個圓盤移到ZZ柱子上,其移動的原則如上所述。這個問題稱為nn階階iHanoi塔問題。

可以寫出CC程序如下:

#includequot;stdio.hquot;main(){intn;

charx="X",yy="Y",zz="Z";

voidhanoi();

printf(quot;inputn=)quot;);

scanf(quot;%dquot;,n);

hanoi(n,xx,yy,)z);}}

voidhanoi(n,xx,yy,)z)intn;charx,yy,zz;{voidmove();

if(n==1)move(x,nn,)z);

else

{hanoi(n-11,xx,zz,)y);

move(x,nn,)z);

hanoi(n-11,yy,xx,)z);

}}

return;}}

voidmove(x,nn,)z)intn;

char

xx,zz;{{

printf(quot;%c(%d)----gt;%c\\nquot;,xx,nn,)z);}}編譯預處理功能是CC語言的一個重要特點。所謂編譯預處理,是指CC語言編譯系統(tǒng)首先對程序模塊中的編譯預處理命令進行處理。

CC語言提供的編譯預處理命令主要有以下33種:

(11)宏定義;

(22)文件包含命令;

(33)條件編譯命令。

編譯預處理命令一般是在函數(shù)體的外面。正確使用編譯預處理命令,可以編寫出易于調(diào)試、易于移植的程序模塊。

文件包含命令

文件包含是指一個源文件可以將另一個指定的源文件包括進來。

文件包含命令的一般形式為

#include〈文件名〉或

#include

quot;文件名quot;quot;

其功能是將指定文件中的全部內(nèi)容讀到該命令所在的位置后一起被編譯。

在使用文件包含命令時,要注意以下幾個問題:

(11)當e#include命令指定的文件中的內(nèi)容改變時,包含這個文件的所有源文件都應當重新進行編譯處理;(22)一個e#include命令只能指定一個被包含文件,假使需要包含多個文件,則要用多個##einclude命令實現(xiàn);(33)被包含的文件應當是源文件,不能是經(jīng)編譯后的目標文件;(44)文件包含可以嵌套使用,即被包含的文件中還可以使用e#include命令;(55)由e#include命令所指定的文件中可以有任何語言成分,因此,尋??梢詫⒔?jīng)常使用的、具有公用性質(zhì)的符號常量、帶參數(shù)的宏定義以及外部變量等集中起來放在這種文件中,以盡量避免一些重復操作。

6.1

一維數(shù)組

6.1.1

一維數(shù)組的定義與引用

定義一維數(shù)組的一般形式如下:

類型說明符

數(shù)組名[[常量表達式]];

其中類型說明符是定義數(shù)組中各元素的數(shù)據(jù)類型,常量表達式是說明數(shù)組的大?。?/p>

數(shù)組中元素的個數(shù)。

數(shù)組的說明與變量的說明一樣,其作用是為數(shù)組分派存儲空間。

關于數(shù)組的說明要注意以下幾個問題:

(11)數(shù)組名的命名規(guī)則與變量名一致。

(22)說明數(shù)組大小的常量表達式必需為整型,并且用方括號括起來(不能用圓括號)。

(33)說明數(shù)組大小的常量表達式中可以包含符號常量,但不能是變量。

例例6.1

下面的程序說明白如何對數(shù)組定義和引用數(shù)組元素:

#include

quot;stdio.h

溫馨提示

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

最新文檔

評論

0/150

提交評論