《C語(yǔ)言程序設(shè)計(jì) 第4版》 課件 3- 利用數(shù)組處理同類(lèi)型的批量數(shù)據(jù)、4- 利用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計(jì)_第1頁(yè)
《C語(yǔ)言程序設(shè)計(jì) 第4版》 課件 3- 利用數(shù)組處理同類(lèi)型的批量數(shù)據(jù)、4- 利用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計(jì)_第2頁(yè)
《C語(yǔ)言程序設(shè)計(jì) 第4版》 課件 3- 利用數(shù)組處理同類(lèi)型的批量數(shù)據(jù)、4- 利用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計(jì)_第3頁(yè)
《C語(yǔ)言程序設(shè)計(jì) 第4版》 課件 3- 利用數(shù)組處理同類(lèi)型的批量數(shù)據(jù)、4- 利用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計(jì)_第4頁(yè)
《C語(yǔ)言程序設(shè)計(jì) 第4版》 課件 3- 利用數(shù)組處理同類(lèi)型的批量數(shù)據(jù)、4- 利用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩60頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第1單元:C語(yǔ)言程序設(shè)計(jì)入門(mén)第2單元:利用三種程序結(jié)構(gòu)解決簡(jiǎn)單問(wèn)題第3單元:利用數(shù)組處理同類(lèi)型的批量數(shù)據(jù)第4單元:利用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計(jì)第5單元:靈活使用指針處理問(wèn)題第6單元:利用復(fù)雜的構(gòu)造類(lèi)型解決實(shí)際問(wèn)題第7單元:利用文件進(jìn)行數(shù)據(jù)管理第8單元:應(yīng)用軟件設(shè)計(jì)

教學(xué)內(nèi)容第3單元利用數(shù)組處理同類(lèi)型的批量數(shù)據(jù)【單元導(dǎo)讀】

思考:已經(jīng)學(xué)過(guò)的基本數(shù)據(jù)類(lèi)型有哪些?

若用基本數(shù)據(jù)類(lèi)型,如何解決10個(gè)整型數(shù)據(jù)的存放和輸出問(wèn)題?

在C語(yǔ)言中,數(shù)據(jù)類(lèi)型除了基本類(lèi)型(整型、實(shí)型、字符型),還有構(gòu)造類(lèi)型,包括數(shù)組、結(jié)構(gòu)體、共用體和枚舉類(lèi)型。其中,數(shù)組是將相同類(lèi)型的若干數(shù)據(jù)按序組合在一起,即數(shù)組是有序同類(lèi)型數(shù)據(jù)的集合。

本單元主要學(xué)習(xí)數(shù)值數(shù)組和字符數(shù)組,其他類(lèi)別的數(shù)組將在后續(xù)單元中陸續(xù)學(xué)習(xí)。學(xué)習(xí)目標(biāo):能利用一維數(shù)組、二維數(shù)組和字符數(shù)組處理同類(lèi)型的批量數(shù)據(jù)。3.1.1定義一維數(shù)組的方法數(shù)組和變量一樣,要先定義后使用。定義一維數(shù)組的形式:類(lèi)型標(biāo)識(shí)符數(shù)組名[常量表達(dá)式];說(shuō)明:(1)類(lèi)型標(biāo)識(shí)符可以是基本類(lèi)型或

構(gòu)造類(lèi)型。(2)常量表達(dá)式表示數(shù)據(jù)元素的個(gè)數(shù),也稱(chēng)為數(shù)組長(zhǎng)度。

例如:

inta[10];

該數(shù)組有10個(gè)整型元素:a[0]~a[9]。

元素編號(hào)是從0開(kāi)始。C語(yǔ)言規(guī)定,數(shù)組名可以代表數(shù)組的首地址(數(shù)組首元素的地址)。

系統(tǒng)為數(shù)組a分配連續(xù)的10個(gè)整型內(nèi)存空間,用來(lái)存儲(chǔ)10個(gè)數(shù)組元素。任務(wù)3.1利用一維數(shù)組處理同類(lèi)型的批量數(shù)據(jù)【課堂練習(xí)】同步練習(xí)3-1:知識(shí)鞏固。3.1.2一維數(shù)組的初始化任務(wù)3.1利用一維數(shù)組處理同類(lèi)型的批量數(shù)據(jù)

在定義數(shù)組時(shí),對(duì)數(shù)組元素賦初值。初值用{}括起來(lái),初值之間用逗號(hào)隔開(kāi)。(1)對(duì)全部元素賦初值

inta[5]={1,2,3,4,5};

(2)對(duì)部分元素賦初值

inta[5]={1,2,3};

注意:初值個(gè)數(shù)不能超過(guò)指定的元素個(gè)數(shù)。

此時(shí),也可寫(xiě)成:

inta[]={1,2,3,4,5};inta[5]=

{1,2,3,4,5,6};

特別注意:在定義數(shù)組之后,不能一次性對(duì)整個(gè)數(shù)組的所有元素賦值,而只能對(duì)每個(gè)元素逐個(gè)賦值。例如:inta[5];//定義數(shù)組a[5]

=

{1,

3,

5,

7,

9};

//錯(cuò)誤a[0]=1;a[1]=3;a[2]=5;a[3]=7;a[4]=9;//正確//錯(cuò)誤

結(jié)果:a[0]=1,a[1]=2,a[2]=3,a[3]=4,a[4]=5

結(jié)果:a[0]=1,a[1]=2,a[2]=3,a[3]=0,a[4]=0

3.1.3一維數(shù)組元素的引用C語(yǔ)言規(guī)定,只能引用某個(gè)數(shù)組元素而不能一次引用整個(gè)數(shù)組的全部元素。

一維數(shù)組元素的引用形式:數(shù)組名[下標(biāo)]

下標(biāo)就是數(shù)組元素的編號(hào)。

【例3.1】一維數(shù)組元素的引用:將一組數(shù)據(jù)倒序輸出。#include<stdio.h>intmain(void){

inti,a[10];

for(i=0;i<=9;i++)

a[i]=i;

for(i=9;i>=0;i--)

printf("%d",a[i]);

printf("\n");}

將數(shù)組和循環(huán)結(jié)構(gòu)相結(jié)合,可有效處理同類(lèi)型的批量數(shù)據(jù),大大提高工作效率。任務(wù)3.1利用一維數(shù)組處理同類(lèi)型的批量數(shù)據(jù)【課堂練習(xí)】同步練習(xí)3-2:分析并運(yùn)行程序。3.1.4一維數(shù)組的應(yīng)用

一維數(shù)組廣泛應(yīng)用于對(duì)多個(gè)同類(lèi)型的數(shù)據(jù)進(jìn)行存取、排序等操作的場(chǎng)合。用一維數(shù)組還可構(gòu)造出軟件設(shè)計(jì)中常用的堆棧、隊(duì)列等數(shù)據(jù)結(jié)構(gòu)。

在嵌入式軟件設(shè)計(jì)中,一維數(shù)組可用于數(shù)碼管顯示的筆形碼、鍵盤(pán)的鍵碼等編碼的存取。任務(wù)3.1利用一維數(shù)組處理同類(lèi)型的批量數(shù)據(jù)3.1.4一維數(shù)組的應(yīng)用任務(wù)3.1利用一維數(shù)組處理同類(lèi)型的批量數(shù)據(jù)【例3.2】輸入若干個(gè)整數(shù),找出其中的最大值。

#include<stdio.h>#defineN5

//宏定義數(shù)據(jù)個(gè)數(shù)intmain(void){

inti,max,a[N];

printf("請(qǐng)輸入%d個(gè)整數(shù):",N);for(i=0;i<N;i++)scanf("%d",&a[i]);

max=a[0];for(i=1;i<N;i++)if(a[i]>max)max=a[i];

printf("最大值:%d\n",max);}(1)算法分析:如何找到最大值?(2)數(shù)據(jù)結(jié)構(gòu)選擇:采用變量還是數(shù)組?(3)代碼如何實(shí)現(xiàn)?【課堂練習(xí)】同步練習(xí)3-3:

利用一維數(shù)組解決實(shí)際問(wèn)題。使用宏定義有何好處?3.1.4一維數(shù)組的應(yīng)用【例3.3】對(duì)n個(gè)數(shù)進(jìn)行排序(由小到大)。

由于是對(duì)多個(gè)數(shù)進(jìn)行排序,自然會(huì)想到利用數(shù)組來(lái)保存和管理參與排序的多個(gè)數(shù)據(jù)。排序算法有多種(冒泡法、選擇法等),在此只介紹冒泡排序法。任務(wù)3.1利用一維數(shù)組處理同類(lèi)型的批量數(shù)據(jù)用冒泡法對(duì)5個(gè)數(shù)(如:9、7、5、8、0)進(jìn)行由小到大排序的過(guò)程:9758075988900975805787809708975975895780第1次9579第2次第3次第4次第1次7570第1次第2次第3次7570050550第1次第2次a[0]a[1]a[2]a[3]a[4]第1輪第2輪第3輪第4輪3.1.4一維數(shù)組的應(yīng)用冒泡排序法的思路:從第1個(gè)數(shù)開(kāi)始,和下鄰數(shù)比較,小數(shù)上浮,大數(shù)下沉。任務(wù)3.1利用一維數(shù)組處理同類(lèi)型的批量數(shù)據(jù)【例3.3】對(duì)n個(gè)數(shù)進(jìn)行排序(由小到大)。

3.1.4一維數(shù)組的應(yīng)用冒泡排序法的思路:從第1個(gè)數(shù)開(kāi)始,和下鄰數(shù)比較,小數(shù)上浮,大數(shù)下沉。任務(wù)3.1利用一維數(shù)組處理同類(lèi)型的批量數(shù)據(jù)【例3.3】對(duì)n個(gè)數(shù)進(jìn)行排序(由小到大)。

3.1.4一維數(shù)組的應(yīng)用任務(wù)3.1利用一維數(shù)組處理同類(lèi)型的批量數(shù)據(jù)swap_flag=1;

若參與排序的多個(gè)數(shù)據(jù)在某輪比較前,恰好已經(jīng)按照由小到大排序,則上述程序有無(wú)需要改進(jìn)之處?swap_flag=0;//交換標(biāo)志:0-無(wú)交換,1-有交換

if(swap_flag==0)break;//若本輪無(wú)交換,則結(jié)束比較

#defineN5

//宏定義參與排序的數(shù)據(jù)個(gè)數(shù)

inta[N];

//存放待排序的一組數(shù)據(jù)

inti,j,t;

for(i=1;i<N;i++)

//N個(gè)數(shù),共需比較N-1輪{

for(j=0;j<N-i;j++)

//第i輪需要比較N-i次{

if(a[j]

>

a[j+1])

//依次比較兩個(gè)相鄰的數(shù),將大數(shù)放后面

{

t

=

a[j];a[j]

=

a[j+1];a[j+1]

=

t;

//交換

}}

},swap_flag;【例3.3】對(duì)n個(gè)數(shù)進(jìn)行排序(由小到大)。

任務(wù)3.2利用二維數(shù)組處理同類(lèi)型的批量數(shù)據(jù)

我們可用1個(gè)一維數(shù)組存放1名同學(xué)的語(yǔ)文、數(shù)學(xué)、英語(yǔ)3門(mén)課的成績(jī),而如何存放多名同學(xué)的語(yǔ)文、數(shù)學(xué)、英語(yǔ)3門(mén)課成績(jī)呢?在C語(yǔ)言中,可用二維數(shù)組解決此類(lèi)問(wèn)題。在嵌入式軟件設(shè)計(jì)中,二維數(shù)組可用于點(diǎn)陣顯示碼、液晶顯示碼等編碼的存取。3.2.1定義二維數(shù)組的方法定義二維數(shù)組的一般形式:

類(lèi)型標(biāo)識(shí)符數(shù)組名[常量表達(dá)式1][常量表達(dá)式2];其中,常量表達(dá)式1表示行數(shù),常量表達(dá)式2表示的列數(shù)。例如:

inta[3][4];

//定義3行4列的整型數(shù)組,共有3×4個(gè)元素

每個(gè)元素的編號(hào):系統(tǒng)會(huì)為數(shù)組a分配連續(xù)的12個(gè)整型內(nèi)存空間,用來(lái)存儲(chǔ)12個(gè)數(shù)組元素。

在C語(yǔ)言中,二維數(shù)組中元素排列的順序是按“行”存放的,即在內(nèi)存中先順序存放第1行的元素;

再順序存放第2行的元素;

最后順序存放第3行的元素。任務(wù)3.2利用二維數(shù)組處理同類(lèi)型的批量數(shù)據(jù)【課堂練習(xí)】同步練習(xí)3-4:知識(shí)鞏固。

它有3個(gè)行元素:a[0]、a[1]、a[2],而每個(gè)行元素又是一個(gè)包含4個(gè)列元素的一維數(shù)組,此時(shí)把a(bǔ)[0]、a[1]、a[2]看作一維數(shù)組名。例如第一行元素:a[0][0]a[0][1]a[0][2]a[0][3]C語(yǔ)言中,又可以把二維數(shù)組a看作是一個(gè)特殊的一維數(shù)組。3.2.1定義二維數(shù)組的方法任務(wù)3.2利用二維數(shù)組處理同類(lèi)型的批量數(shù)據(jù)3.2.2二維數(shù)組的初始化在定義二維數(shù)組時(shí),對(duì)其元素初始化賦值。(1)分行給二維數(shù)組賦初值(一行對(duì)應(yīng)一個(gè)花括號(hào))例如:inta[3][4]={{1,2,3,4},

{5,6,7,8},

{9,10,11,12}};

(2)將所有數(shù)據(jù)寫(xiě)在一個(gè)花括號(hào)內(nèi),按順序給元素賦初值例如:inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};

效果與第(1)種方法相同。但不如第(1)種方法直觀。(4)對(duì)全部元素都賦初值時(shí),行數(shù)可以不指定,但列數(shù)不能省略。

例如:inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};(3)可只給部分元素賦初值。例如:inta[3][4]={{1},{5},{9}};

特別注意:在定義二維數(shù)組之后,不能一次性對(duì)整個(gè)數(shù)組的所有元素賦值,而只能對(duì)數(shù)組的每個(gè)元素逐個(gè)賦值。例如:inta[3][4];//定義數(shù)組a[3][4]

=

{{1,2,3,4},

{5,6,7,8},

{9,10,11,12}};

//錯(cuò)誤任務(wù)3.2利用二維數(shù)組處理同類(lèi)型的批量數(shù)據(jù)3.2.3二維數(shù)組元素的引用C語(yǔ)言規(guī)定,只能引用某個(gè)數(shù)組元素而不能一次引用整個(gè)數(shù)組的全部元素。

二維數(shù)組元素的引用形式:數(shù)組名[下標(biāo)][下標(biāo)]

下標(biāo)就是數(shù)組元素的編號(hào)。

【例3.4】二維數(shù)組元素的引用:二維數(shù)組元素的賦值和輸出。

任務(wù)3.2利用二維數(shù)組處理同類(lèi)型的批量數(shù)據(jù)#include<stdio.h>intmain(void){

inta[3][4];

//定義二維數(shù)組

inti,

j;printf("請(qǐng)輸入12個(gè)整數(shù):");

for(i=0;i<3;i++)

//二維數(shù)組的行{

for(j=0;j<4;j++)

//二維數(shù)組的列scanf("%d",

&a[i][j]);//向數(shù)組a賦值}

for(i=0;i<3;i++){

for(j=0;j<4;j++)printf("a[%d][%d]=%d\n",

i,

j,

a[i][j]);//輸出數(shù)組a的12個(gè)元素值}}【課堂練習(xí)】同步練習(xí)3-5:分析并運(yùn)行程序。3.2.4二維數(shù)組的應(yīng)用【例3.5】輸出3×4矩陣,并求出值最大的元素值,及其所在的行號(hào)和列號(hào)。

任務(wù)3.2利用二維數(shù)組處理同類(lèi)型的批量數(shù)據(jù)#include<stdio.h>intmain(void){

inti,

j,

max,

row=0,

col=0;//變量i表示行,j表示列

int

a[3][4]

=

{{1,2,3,4},

{5,6,7,8},

{9,10,11,12}};for(i=0;i<3;i++){

for(j=0;j<4;j++)printf("%3d",

a[i][j]);

printf("\n");

//每輸出一行,換行}

max

=

a[0][0];for(i=0;i<3;i++){for(j=0;j<4;j++){ if(a[i][j]>max){ max

=

a[i][j];row=i;col=j; }}}printf("最大值=%d,行=%d,列=%d\n",

max,

row+1,

col+1);}【課后作業(yè)】

同步練習(xí)3-6:利用二維數(shù)組解決實(shí)際問(wèn)題。

用來(lái)存放字符型數(shù)據(jù)的數(shù)組是字符數(shù)組,字符數(shù)組中的每個(gè)元素存放一個(gè)字符。在嵌入式網(wǎng)絡(luò)通信軟件設(shè)計(jì)中,可用字符數(shù)組存放待發(fā)送或待接收的數(shù)據(jù)。3.3.1定義字符數(shù)組的方法

系統(tǒng)為數(shù)組c分配連續(xù)的10字節(jié)內(nèi)存空間,用來(lái)存儲(chǔ)10個(gè)字符型數(shù)據(jù)。例如:

charc[10];數(shù)組名c代表該數(shù)組的首地址。

任務(wù)3.3利用字符數(shù)組處理多個(gè)字符或字符串3.3.2字符數(shù)組的初始化1、逐個(gè)字符賦值法(1)對(duì)全部元素賦初值

charc[5]={'a','b','c','d','e'};

結(jié)果:c[0]='a',c[1]='b',c[2]='c',c[3]='d',c[4]='e'。

也可寫(xiě)成:

charc[]={'a','b','c','d','e'};

(2)對(duì)部分元素賦初值

charc[6]={'a','b','c','d','e'};

最后1個(gè)元素由系統(tǒng)自動(dòng)賦空字符'\0'。任務(wù)3.3利用字符數(shù)組處理多個(gè)字符或字符串

2、字符串常量賦值法(將字符串常量賦給字符數(shù)組:用數(shù)組處理字符串)也可寫(xiě)成:charc[]="abcde";

charc[]={"abcde"};

字符串常量"abcde"在內(nèi)存中的存儲(chǔ):因此,數(shù)組c的長(zhǎng)度是

6。3.3.2字符數(shù)組的初始化【思考】

下面兩種賦值方式是否有區(qū)別?如何等價(jià)?

charc[]={'a','b','c','d','e'}; ②charc[]="abcde";

特別注意:在定義字符數(shù)組之后,不能一次性對(duì)整個(gè)數(shù)組的所有元素賦值,而只能對(duì)數(shù)組的每個(gè)元素逐個(gè)賦值。例如:char

c[5];//定義數(shù)組c[5]

=

{'a','b','c','d','e'};

//錯(cuò)誤c[5]

=

"abcd";

//錯(cuò)誤任務(wù)3.3利用字符數(shù)組處理多個(gè)字符或字符串【課堂練習(xí)】同步練習(xí)3-7:知識(shí)鞏固。3.3.3字符數(shù)組元素的引用

字符數(shù)組的引用形式與數(shù)值數(shù)組相同,可以引用字符數(shù)組中的一個(gè)元素而得到一個(gè)字符。【例3.6】字符數(shù)組元素的引用:輸出字符數(shù)組元素的值。

任務(wù)3.3利用字符數(shù)組處理多個(gè)字符或字符串#include<stdio.h>intmain(void){

chara[5]

=

{'a','b','c','d','e'};

//定義字符數(shù)組并初始化

charb[6]

=

"12345";

inti;printf("字符數(shù)組a:");

for(i=0;i<5;i++)printf("%c",a[i]);

//字符數(shù)組a元素的引用printf("\n");printf("字符數(shù)組b:");

for(i=0;i<6;i++)printf("%c",b[i]);

//字符數(shù)組b元素的引用printf("\n");}【例3.7】字符數(shù)組逐個(gè)字符的輸入、輸出。3.3.4字符數(shù)組的輸入、輸出1、用格式符“%c”逐個(gè)字符輸入、輸出在輸入字符時(shí),系統(tǒng)將輸入的空格、換行符作為有效字符賦給數(shù)組元素。

任務(wù)3.3利用字符數(shù)組處理多個(gè)字符或字符串#include<stdio.h>intmain(void){

inti;

charc[5];

//定義字符數(shù)組printf("請(qǐng)輸入5個(gè)字符:");

for(i=0;i<5;i++)scanf("%c",&c[i]);

//逐個(gè)字符輸入printf("字符數(shù)組元素:");

for(i=0;i<5;i++)printf("%c",c[i]);

//逐個(gè)字符輸出printf("\n");}【例3.8】字符串的格式化輸入、輸出

。

2、用格式符“%s”對(duì)整個(gè)字符串一次輸入、輸出

(1)用“%s”輸入、輸出字符串時(shí),scanf、printf中的地址項(xiàng)、輸出項(xiàng)都是字符數(shù)組名(首地址)。說(shuō)明:

(2)用scanf

輸入字符串時(shí),若輸入空格或換行,系統(tǒng)則認(rèn)為是字符串結(jié)束符'\0'

。若輸入字符串“abcdef”時(shí),運(yùn)行結(jié)果:

可見(jiàn),系統(tǒng)只將空格前的字符串“abc”送入數(shù)組str中。如何將含有空格的字符串送給一個(gè)字符數(shù)組呢?——用后續(xù)介紹的gets函數(shù)來(lái)實(shí)現(xiàn)。3.3.4字符數(shù)組的輸入、輸出任務(wù)3.3利用字符數(shù)組處理多個(gè)字符或字符串#include<stdio.h>intmain(void){

charstr[10];printf("請(qǐng)輸入字符串:");

scanf("%s",str);

//輸入字符串

printf("%s\n",str);

//輸出字符數(shù)組對(duì)應(yīng)的字符串}【例3.9】多個(gè)字符串的格式化輸入、輸出

。

2、用格式符“%s”對(duì)整個(gè)字符串一次輸入、輸出3.3.4字符數(shù)組的輸入、輸出任務(wù)3.3利用字符數(shù)組處理多個(gè)字符或字符串用scanf函數(shù)輸入多個(gè)字符串時(shí),在字符串之間可用空格、換行符或Tab符作分隔。

#include<stdio.h>intmain(void){

charstr1[10],str2[10],str3[10];printf("請(qǐng)輸入3個(gè)字符串:");

scanf("%s%s%s",str1,

str2,

str3);

//輸入3個(gè)字符串

printf("%s%s%s\n",str1,

str2,

str3);

//輸出3個(gè)字符串

}【課后作業(yè)】同步練習(xí)3-8:利用字符數(shù)組解決實(shí)際問(wèn)題。3.3.5字符串處理函數(shù)C語(yǔ)言提供了若干個(gè)字符串處理函數(shù)。

其中,字符串輸入、輸出函數(shù),在使用前應(yīng)包含頭文件“stdio.h”;而其他字符串處理函數(shù),在使用前應(yīng)包含頭文件“string.h”。任務(wù)3.3利用字符數(shù)組處理多個(gè)字符或字符串1、字符串輸出函數(shù):puts(字符串或字符數(shù)組名)

●將字符串或字符數(shù)組中存放的字符串輸出到顯示終端,并換行。2、字符串輸入函數(shù):gets(字符數(shù)組名)

●從鍵盤(pán)輸入一個(gè)字符串(可含空格)到字符數(shù)組中,換行符作為輸入的結(jié)束符。3、字符串連接函數(shù):strcat(字符數(shù)組名1,字符串或字符數(shù)組名2)

●將字符串或字符數(shù)組2中的字符串連接到字符數(shù)組1中字符串的后面,結(jié)果放在字符數(shù)組1中。

說(shuō)明:(1)字符數(shù)組1必須足夠大,能夠容納連接后的新字符串。

(2)連接時(shí)將原字符串1最后的'\0'取消,只在新字符串最后保留'\0'。3.3.5字符串處理函數(shù)任務(wù)3.3利用字符數(shù)組處理多個(gè)字符或字符串4、字符串復(fù)制函數(shù):strcpy(字符數(shù)組名1,字符串或字符數(shù)組名2)

●將字符串或字符數(shù)組2中的字符串復(fù)制到字符數(shù)組1中(原有內(nèi)容被覆蓋)。

說(shuō)明:(1)字符數(shù)組1的長(zhǎng)度必須能夠容納被復(fù)制的字符串。(2)字符數(shù)組在定義后,只能用strcpy函數(shù)將一個(gè)字符串常量或字符數(shù)組復(fù)制到另一個(gè)字符數(shù)組中。只能將一個(gè)字符賦給一個(gè)字符變量或字符數(shù)組元素。例如:charc[6];

chard[6]="abcde";若要實(shí)現(xiàn)將字符串常量"abcde"賦給字符數(shù)組c,則:c="abcde";//不合法

c=d;//不合法

strcpy(c,"abcde");strcpy(c,d);//合法

//合法

c[0]='a';c[1]='b';c[2]='c';c[3]='d';c[4]='e';c[5]='\0';//合法

3.3.5字符串處理函數(shù)任務(wù)3.3利用字符數(shù)組處理多個(gè)字符或字符串5、字符串比較大小函數(shù):

strcmp(字符數(shù)組名1或字符串1,字符數(shù)組名2或字符串2)

●比較規(guī)則:對(duì)兩個(gè)字符串自左至右逐個(gè)字符相比較(按ASCII碼值大小比較),直到出現(xiàn)不同的字符或遇到'\0'為止。

(1)字符串1=字符串2,則函數(shù)值為0;

(2)字符串1>字符串2,則函數(shù)值為正整數(shù)1;

(3)字符串1<字符串2,則函數(shù)值為負(fù)整數(shù)-1。說(shuō)明:對(duì)兩個(gè)字符串的比較:if(str1>str2) printf("OK!");if((strcmp(str1,str2)>0) printf("OK!");//不合法

//合法

3.3.5字符串處理函數(shù)任務(wù)3.3利用字符數(shù)組處理多個(gè)字符或字符串6、字符串長(zhǎng)度測(cè)試函數(shù):

strlen(字符串或字符數(shù)組名)

●測(cè)試字符串的實(shí)際長(zhǎng)度(不包括'\0'在內(nèi))。3.3.5字符串處理函數(shù)任務(wù)3.3利用字符數(shù)組處理多個(gè)字符或字符串7、字符串轉(zhuǎn)換函數(shù)(大寫(xiě)轉(zhuǎn)換為小寫(xiě)):

strlwr(字符數(shù)組名)

8、字符串轉(zhuǎn)換函數(shù)(小寫(xiě)轉(zhuǎn)換為大寫(xiě)):strupr(字符數(shù)組名)

●將字符數(shù)組對(duì)應(yīng)字符串中的大寫(xiě)字母轉(zhuǎn)換成小寫(xiě)字母?!駥⒆址麛?shù)組對(duì)應(yīng)字符串中的小寫(xiě)字母轉(zhuǎn)換成大寫(xiě)字母。3.3.5字符串處理函數(shù)任務(wù)3.3利用字符數(shù)組處理多個(gè)字符或字符串【課后作業(yè)】同步練習(xí)3-9:字符串處理函數(shù)知識(shí)鞏固及應(yīng)用。第1單元:C語(yǔ)言程序設(shè)計(jì)入門(mén)第2單元:利用三種程序結(jié)構(gòu)解決簡(jiǎn)單問(wèn)題第3單元:利用數(shù)組處理同類(lèi)型的批量數(shù)據(jù)第4單元:利用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計(jì)第5單元:靈活使用指針處理問(wèn)題第6單元:利用復(fù)雜的構(gòu)造類(lèi)型解決實(shí)際問(wèn)題第7單元:利用文件進(jìn)行數(shù)據(jù)管理第8單元:應(yīng)用軟件設(shè)計(jì)

教學(xué)內(nèi)容第4單元利用函數(shù)實(shí)現(xiàn)模塊化程序設(shè)計(jì)【單元導(dǎo)讀】

前面所學(xué)的大部分程序都比較簡(jiǎn)單,只有一個(gè)源程序文件(.c文件)。但在設(shè)計(jì)復(fù)雜的C程序時(shí),往往將其劃分為若干個(gè)程序模塊,每個(gè)程序模塊作為一個(gè)程序文件,而每個(gè)程序文件可包括多個(gè)函數(shù)。

單元學(xué)習(xí)目標(biāo):熟悉C程序的結(jié)構(gòu)和函數(shù)的分類(lèi),熟悉定義函數(shù)的方法,掌握函數(shù)的3種調(diào)用方式,能利用數(shù)組作為函數(shù)參數(shù)進(jìn)行模塊化程序設(shè)計(jì),能根據(jù)問(wèn)題的需求靈活設(shè)置變量的類(lèi)型,能使用內(nèi)部函數(shù)和外部函數(shù)進(jìn)行模塊化程序設(shè)計(jì)。

一個(gè)復(fù)雜的C程序由若干個(gè)程序模塊組成,每個(gè)程序模塊作為一個(gè)源程序文件(.c文件、.h文件等),而每個(gè)源程序文件由預(yù)處理命令、數(shù)據(jù)聲明以及若干函數(shù)組成。

一個(gè)C程序必須有且只能有一個(gè)主函數(shù),C程序總是從主函數(shù)開(kāi)始執(zhí)行(不論位置如何),最后在主函數(shù)中結(jié)束整個(gè)程序的運(yùn)行。需要注意:在主函數(shù)中可以調(diào)用其他函數(shù),而不允許被其他函數(shù)調(diào)用。

在實(shí)際工程應(yīng)用中,可將主函數(shù)設(shè)計(jì)得簡(jiǎn)單些,主要負(fù)責(zé)調(diào)用各個(gè)功能函數(shù),依次實(shí)現(xiàn)各項(xiàng)功能——模塊化程序設(shè)計(jì)(將在第8單元詳細(xì)學(xué)習(xí))。任務(wù)4.1熟悉C程序的結(jié)構(gòu)和函數(shù)的分類(lèi)

從不同的角度對(duì)函數(shù)進(jìn)行分類(lèi)。1.從定義函數(shù)的角度

(1)庫(kù)函數(shù):由編譯系統(tǒng)提供,只要在源文件中包含其對(duì)應(yīng)的頭文件,即可在程序中直接調(diào)用【見(jiàn)附錄D】。例如,“stdio.h”頭文件中的printf、scanf等函數(shù),“math.h”頭文件中的sin、cos等函數(shù)。

(2)用戶自定義函數(shù):用戶根據(jù)需要,將實(shí)現(xiàn)某個(gè)功能的代碼編寫(xiě)成相對(duì)獨(dú)立的函數(shù)。2.從有無(wú)返回值的角度

(1)有返回值函數(shù):執(zhí)行完畢后會(huì)向主調(diào)函數(shù)返回一個(gè)值。

(2)無(wú)返回值函數(shù):執(zhí)行完畢后不向主調(diào)函數(shù)返回值。3.從數(shù)據(jù)傳遞的角度

(1)無(wú)參函數(shù):調(diào)用時(shí),主調(diào)函數(shù)和被調(diào)函數(shù)之間不進(jìn)行參數(shù)傳遞。

(2)有參函數(shù):調(diào)用時(shí),主調(diào)函數(shù)需將實(shí)參的值傳遞給形參(虛參)。任務(wù)4.1熟悉C程序的結(jié)構(gòu)和函數(shù)的分類(lèi)【課堂練習(xí)】同步練習(xí)4-1:知識(shí)鞏固。4.2.1定義無(wú)參函數(shù)定義形式:

類(lèi)型標(biāo)識(shí)符函數(shù)名(void){

聲明部分 執(zhí)行部分}函數(shù)首部函數(shù)體函數(shù)的類(lèi)型(函數(shù)返回值的類(lèi)型)表示函數(shù)沒(méi)有參數(shù),也可省略不寫(xiě)例如:intfun(void){

inti,j;

intsum=0; i=2;j=3; sum=i+j; retrun(sum);}

聲明執(zhí)行說(shuō)明:(1)書(shū)寫(xiě)函數(shù)體時(shí),一般先寫(xiě)聲明部分,后寫(xiě)執(zhí)行部分。若將前3行寫(xiě)成:inti,j;//聲明語(yǔ)句i=2;j=3;//執(zhí)行語(yǔ)句intsum=0;//聲明語(yǔ)句系統(tǒng)編譯不通過(guò)!(2)若函數(shù)無(wú)需返回值,則函數(shù)類(lèi)型應(yīng)定義為void類(lèi)型。例如:

voidHello(){ printf("Helloworld\n");}函數(shù)返回值(變量sum)的類(lèi)型任務(wù)4.2熟悉定義函數(shù)的方法任務(wù)4.2熟悉定義函數(shù)的方法4.2.2定義有參函數(shù)定義形式:

類(lèi)型標(biāo)識(shí)符函數(shù)名(形參列表){

聲明部分 執(zhí)行部分}

形參可以是各種類(lèi)型的變量。若有多個(gè)形參,則各形參之間要用逗號(hào)分隔。在函數(shù)調(diào)用時(shí),主調(diào)函數(shù)將實(shí)參的值傳遞給形參。注意:必須在形參列表中給出形參的類(lèi)型標(biāo)識(shí)符。例如:

intmax(intx,inty)

{

intz;

if(x>y)z=x;elsez=y;

return(z);

}

有返回值的函數(shù)中至少應(yīng)有一個(gè)return語(yǔ)句。形參:整型變量x、y,其具體值由主調(diào)函數(shù)調(diào)用時(shí)傳遞過(guò)來(lái)將z的值作為函數(shù)值返回給主調(diào)函數(shù)函數(shù)返回值(變量

z)的類(lèi)型【課堂練習(xí)】同步練習(xí)4-2:照葫蘆畫(huà)瓢:定義求兩個(gè)整數(shù)最小值的函數(shù)。4.3.1函數(shù)的一般調(diào)用

函數(shù)的一般調(diào)用流程:

函數(shù)被定義之后,即可被其他函數(shù)調(diào)用。本節(jié)將介紹函數(shù)的一般調(diào)用、嵌套調(diào)用和遞歸調(diào)用3種調(diào)用方式。1、函數(shù)的一般調(diào)用形式

調(diào)用有參函數(shù)時(shí),主調(diào)函數(shù)將“實(shí)參”的值傳遞給被調(diào)函數(shù)的“形參”,從而實(shí)現(xiàn)信息傳遞。如果有多個(gè)實(shí)參,則各參數(shù)之間要用逗號(hào)隔開(kāi)。實(shí)參與形參的個(gè)數(shù)應(yīng)相等,類(lèi)型應(yīng)匹配,按順序?qū)?yīng),一一傳遞信息。(2)有參函數(shù)的調(diào)用形式:函數(shù)名(實(shí)參列表)

(1)無(wú)參函數(shù)的調(diào)用形式:函數(shù)名()

例如,4.2.1節(jié)中的Hello函數(shù)調(diào)用語(yǔ)句可寫(xiě)為:Hello();任務(wù)4.3掌握函數(shù)的調(diào)用方法【例4.1】有參函數(shù)的一般調(diào)用:求兩個(gè)數(shù)的最大值。4.3.1函數(shù)的一般調(diào)用1、函數(shù)的一般調(diào)用形式

c=max(a,b);

(main函數(shù))intmax(int

x,int

y)(max函數(shù)){intz;if(x>y)z=x;elsez=y;return(z);

}#include<stdio.h>intmax(intx,inty);

//對(duì)max函數(shù)進(jìn)行聲明intmain(void){

int

a,b,c;printf("請(qǐng)輸入兩個(gè)整數(shù):");scanf("%d%d",

&a,

&b);c

=

max(a,b);

//調(diào)用max函數(shù)printf("a=%d,b=%d,max=%d\n",

a,

b,

c);}intmax(intx,inty)

//定義有參函數(shù){

intz;if(x>y)z=x;else

z=y;

return(z);

//向主調(diào)函數(shù)返回z的值

}任務(wù)4.3掌握函數(shù)的調(diào)用方法2、關(guān)于函數(shù)調(diào)用時(shí)“參數(shù)傳遞”

的幾點(diǎn)說(shuō)明4.3.1函數(shù)的一般調(diào)用

(1)形參變量只有在發(fā)生函數(shù)調(diào)用時(shí)才被臨時(shí)分配內(nèi)存單元。在調(diào)用結(jié)束后,形參所占用的內(nèi)存單元也被釋放。實(shí)參與形參占用不同的存儲(chǔ)空間。

(2)只能由實(shí)參傳遞給形參,而不能由形參傳遞給實(shí)參,即“單向信息傳遞”。在執(zhí)行一個(gè)被調(diào)函數(shù)時(shí),形參的值如果發(fā)生改變,并不會(huì)改變主調(diào)函數(shù)的實(shí)參值。

(3)當(dāng)形參為普通變量(基本類(lèi)型的變量)時(shí),實(shí)參可以是常量、變量或表達(dá)式,但必須有確定的值。形參:x函數(shù)調(diào)用時(shí)被調(diào)函數(shù)執(zhí)行時(shí)實(shí)參:a1b3y1324【例4.2】函數(shù)參數(shù)傳遞。#include<stdio.h>voidfun(intx,inty);

//對(duì)fun函數(shù)進(jìn)行聲明intmain(void){

inta=1,

b=3;

fun(a,

b);

//調(diào)用fun函數(shù)printf("a=%d,b=%d\n",

a,

b);}voidfun(intx,inty)

//定義有參函數(shù){

x=x+1;

y=y+1;printf("x=%d,y=%d\n",

x,

y);}任務(wù)4.3掌握函數(shù)的調(diào)用方法3、函數(shù)的值(3)沒(méi)有返回值的函數(shù),函數(shù)的類(lèi)型應(yīng)當(dāng)明確定義為void類(lèi)型。(1)函數(shù)的值只能通過(guò)return語(yǔ)句獲得。

return語(yǔ)句的一般形式:return表達(dá)式;

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

(2)函數(shù)返回值的類(lèi)型和定義函數(shù)時(shí)指定的函數(shù)類(lèi)型應(yīng)保持一致。定義函數(shù)時(shí)若不指定函數(shù)類(lèi)型,C編譯系統(tǒng)則默認(rèn)為整型。

說(shuō)明:在函數(shù)中可有多個(gè)return語(yǔ)句,但每次調(diào)用只能有一個(gè)return語(yǔ)句被執(zhí)行,因此只能返回一個(gè)函數(shù)值。return語(yǔ)句也可以不含表達(dá)式,此時(shí)必須將函數(shù)定義為void類(lèi)型,其作用只是使流程返回到主調(diào)函數(shù)。4.3.1函數(shù)的一般調(diào)用任務(wù)4.3掌握函數(shù)的調(diào)用方法4、對(duì)被調(diào)函數(shù)的聲明

在例4.1和例4.2的主調(diào)函數(shù)(主函數(shù))的前面,都對(duì)被調(diào)函數(shù)進(jìn)行了聲明。若不進(jìn)行聲明,編譯系統(tǒng)對(duì)程序從上到下進(jìn)行編譯的過(guò)程中,遇到被調(diào)函數(shù)名時(shí),就會(huì)認(rèn)為是一個(gè)“陌生人”而報(bào)告錯(cuò)誤。解決辦法有兩個(gè)。

(1)在主調(diào)函數(shù)的函數(shù)體的開(kāi)始,或者在源文件中所有函數(shù)的前面,對(duì)被調(diào)函數(shù)進(jìn)行聲明。提前向編譯系統(tǒng)“打招呼”,讓編譯系統(tǒng)“提前認(rèn)識(shí)”被調(diào)函數(shù)。

(2)若在主調(diào)函數(shù)前面定義被調(diào)函數(shù),則無(wú)須額外對(duì)被調(diào)函數(shù)進(jìn)行聲明。或:

類(lèi)型標(biāo)識(shí)符函數(shù)名(形參類(lèi)型1,形參類(lèi)型2,…);

函數(shù)聲明(也稱(chēng)為函數(shù)原型)的一般形式:

類(lèi)型標(biāo)識(shí)符函數(shù)名(形參類(lèi)型1

形參名1,形參類(lèi)型2形參名2,…);

在函數(shù)首部的基礎(chǔ)上加一分號(hào)4.3.1函數(shù)的一般調(diào)用任務(wù)4.3掌握函數(shù)的調(diào)用方法說(shuō)明:調(diào)用庫(kù)函數(shù)時(shí),無(wú)需對(duì)其進(jìn)行聲明,但要把該函數(shù)對(duì)應(yīng)的頭文件用#include命令包含在源文件中。4、對(duì)被調(diào)函數(shù)的聲明

4.3.1函數(shù)的一般調(diào)用提倡使用任務(wù)4.3掌握函數(shù)的調(diào)用方法【課后作業(yè)】同步練習(xí)4-3:

知識(shí)鞏固;

學(xué)以致用(定義和調(diào)用函數(shù))。4.3.2函數(shù)的嵌套調(diào)用

在C語(yǔ)言中,所有函數(shù)(包括主函數(shù))都是相互平行、相互獨(dú)立的。在一個(gè)函數(shù)內(nèi)不能再定義另一個(gè)函數(shù)(函數(shù)不能嵌套定義)。但允許在調(diào)用一個(gè)函數(shù)的過(guò)程中,又調(diào)用另一個(gè)函數(shù),即函數(shù)的嵌套調(diào)用?!纠?.3】函數(shù)的嵌套調(diào)用:加、減、乘、除四則運(yùn)算。

#include<stdio.h>voidadd(float

x,floaty);

//加法函數(shù)聲明voidsub(float

x,floaty);

//減法函數(shù)聲明voidmul(float

x,floaty);

//乘法函數(shù)聲明voiddiv(float

x,floaty);

//除法函數(shù)聲明voidresult(float

i,

float

j);

//四則運(yùn)算函數(shù)聲明intmain(void){

floata,

b;printf("請(qǐng)輸入兩個(gè)實(shí)數(shù)(用空格隔開(kāi)):");scanf("%f%f",&a,&b);printf("a=%f,b=%f\n",a,b);

result(a,

b);

//調(diào)用result函數(shù)}任務(wù)4.3掌握函數(shù)的調(diào)用方法voidresult(float

i,

float

j)

//定義四則運(yùn)算函數(shù){

add(i,j);

//調(diào)用加法函數(shù)

sub(i,j);

//調(diào)用減法函數(shù)

mul(i,j);

//調(diào)用乘法函數(shù)

div(i,j);

//調(diào)用除法函數(shù)}void

add(floatx,floaty)

//定義加法函數(shù){printf("add=%f\n",x+y);}void

sub(floatx,

floaty)

//定義減法函數(shù){printf("sub=%f\n",x-y);}void

mul(floatx,

floaty)

//定義乘法函數(shù){printf("mul=%f\n",x*y);}void

div(floatx,

floaty)

//定義除法函數(shù){printf("div=%f\n",x/y);}【課堂練習(xí)】同步練習(xí)4-4:知識(shí)鞏固及學(xué)以致用。4.3.3函數(shù)的遞歸調(diào)用

在調(diào)用一個(gè)函數(shù)的過(guò)程中,又出現(xiàn)直接或間接地調(diào)用該函數(shù)本身,稱(chēng)為函數(shù)的遞歸調(diào)用。直接遞歸調(diào)用間接遞歸調(diào)用任務(wù)4.3掌握函數(shù)的調(diào)用方法【例4.4】有5個(gè)人坐在一起,問(wèn)第5個(gè)人多少歲,他說(shuō)比第4個(gè)人大2歲。問(wèn)第4個(gè)人歲數(shù),他說(shuō)比第3個(gè)人大2歲。問(wèn)第3個(gè)人,又說(shuō)比第2個(gè)人大2歲。問(wèn)第2個(gè)人,說(shuō)比第1個(gè)人大2歲。最后問(wèn)第1個(gè)人,他說(shuō)他10歲。請(qǐng)問(wèn)第5個(gè)人多大?顯然,這是一個(gè)遞歸問(wèn)題,分回推和遞推兩個(gè)過(guò)程:上述過(guò)程,可用數(shù)學(xué)公式表述:4.3.3函數(shù)的遞歸調(diào)用

程序中需要具有一個(gè)結(jié)束遞歸過(guò)程的條件。age(1)=10,就是使遞歸結(jié)束的條件。#include<stdio.h>intage(intn)

//求年齡的遞歸函數(shù),函數(shù)參數(shù):變量n{

intc;if(n==1)c

=

10;else

c

=

age(n-1)+2;//函數(shù)遞歸調(diào)用return(c);}intmain(void){ printf("第5個(gè)人的年齡:%d\n",

age(5));//調(diào)用age函數(shù)

}任務(wù)4.3掌握函數(shù)的調(diào)用方法【例4.5】用遞歸方法計(jì)算n的階乘n!公式表示:4.3.3函數(shù)的遞歸調(diào)用#include<stdio.h>#include<stdlib.h>longlong

jc(intn)//求階乘的遞歸函數(shù){

longlongx;if(n<0){ printf("n<0,輸入錯(cuò)誤!\n");

exit(0);

//終止程序運(yùn)行}else{ if(n==0

||

n==1)x=1;else

x

=

jc(n-1)*n;//函數(shù)遞歸調(diào)用return(x); }}intmain(void){

intn;

longlongy;printf("請(qǐng)輸入一個(gè)正整數(shù):");scanf("%d",

&n);y

=

jc(n);printf("%d!=%I64d\n",

n,

y);}用于輸出長(zhǎng)長(zhǎng)整型數(shù)據(jù)任務(wù)4.3掌握函數(shù)的調(diào)用方法【課堂練習(xí)】同步練習(xí)4-5:分析并運(yùn)行遞歸調(diào)用程序。4.4.1數(shù)組元素作為函數(shù)實(shí)參

在函數(shù)調(diào)用時(shí),將實(shí)參(數(shù)組元素,相當(dāng)于普通變量)的值傳遞給形參(變量),實(shí)現(xiàn)“單向的值傳遞”。

數(shù)組用作函數(shù)參數(shù)有兩種形式:數(shù)組元素作為函數(shù)的實(shí)參;數(shù)組名作為函數(shù)的實(shí)參和形參?!纠?.6】數(shù)組元素作為函數(shù)實(shí)參:根據(jù)學(xué)生課程成績(jī),判斷考試結(jié)果。任務(wù)4.4利用數(shù)組作為函數(shù)參數(shù)進(jìn)行模塊化程序設(shè)計(jì)#include<stdio.h>voidtest(intx);

//函數(shù)聲明intmain(void){

inta[5]

=

{62,

57,

70,

48,

85},i;//將課程成績(jī)存入數(shù)組a中for(i=0;i<5;i++){printf("a[%d]=%d:",i,

a[i]);test(a[i]);

//調(diào)用成績(jī)測(cè)試函數(shù),數(shù)組元素a[i]

作為實(shí)參

}}voidtest(intx)

//成績(jī)測(cè)試函數(shù),函數(shù)參數(shù):變量x{if(x>=60)printf("及格!\n");else

printf("不及格!\n");

}【課后作業(yè)】同步練習(xí)4-6:學(xué)以致用。4.4.2數(shù)組名作為函數(shù)參數(shù)

數(shù)組名作為函數(shù)參數(shù)時(shí),實(shí)參向形參傳遞的信息是數(shù)組的首地址,即“單向的地址傳遞”。

數(shù)組名作為函數(shù)的實(shí)參和形參時(shí),應(yīng)在主調(diào)函數(shù)和被調(diào)函數(shù)中分別定義實(shí)參數(shù)組和形參數(shù)組,并且類(lèi)型要一致,其中形參數(shù)組在定義時(shí)可以不指定大小。任務(wù)4.4利用數(shù)組作為函數(shù)參數(shù)進(jìn)行模塊化程序設(shè)計(jì)【例4.7】數(shù)組名作為函數(shù)的實(shí)參和形參,輸出形參數(shù)組元素的值。#include<stdio.h>voidoutput(intb[],intn);

//函數(shù)聲明intmain(void){

inta[5]={1,3,5,7,9};

output(a,5);//調(diào)用output函數(shù),實(shí)參:數(shù)組名a、數(shù)值5}voidoutput(intb[],intn)//形參:數(shù)組名b、變量n{

inti;for(i=0;i<n;i++)printf("b[%d]=%d",i,b[i]);//輸出形參數(shù)組元素的值}【實(shí)踐與思考】編寫(xiě)并運(yùn)行例4.7程序,根據(jù)運(yùn)行結(jié)果思考形參數(shù)組與實(shí)參數(shù)組的關(guān)系。4.4.2數(shù)組名作為函數(shù)參數(shù)【例4.8】數(shù)組名作為函數(shù)的實(shí)參和形參,改變實(shí)參數(shù)組元素的值。

函數(shù)調(diào)用時(shí),是將實(shí)參數(shù)組a的首地址傳遞給形參數(shù)組名b,使形參數(shù)組名獲得了實(shí)參數(shù)組的首地址,因此形參數(shù)組與實(shí)參數(shù)組為同一數(shù)組。

顯然,a[i]與b[i]共占同一存儲(chǔ)單元,因此當(dāng)形參數(shù)組各元素的值發(fā)生變化時(shí),實(shí)參數(shù)組元素的值也隨之變化。任務(wù)4.4利用數(shù)組作為函數(shù)參數(shù)進(jìn)行模塊化程序設(shè)計(jì)#include<stdio.h>voidchange(intb[],

intn);

//函數(shù)聲明intmain(void){

inta[5]

=

{1,

3,

5,

7,

9},i;printf("函數(shù)調(diào)用前:");for(i=0;i<5;i++)printf("a[%d]=%d",

i,

a[i]);printf("\n");

change(a,

5);//調(diào)用change函數(shù),實(shí)參:數(shù)組名a、數(shù)值5printf("函數(shù)調(diào)用后:");for(i=0;i<5;i++)printf("a[%d]=%d",

i,

a[i]);printf("\n");}voidchange(intb[],intn)//形參:數(shù)組名b、變量n{

inti;for(i=0;i<n;i++)

b[i]

++;}

可見(jiàn),在函數(shù)調(diào)用之后,實(shí)參數(shù)組a元素的值發(fā)生了變化。其奧秘何在?4.4.2數(shù)組名作為函數(shù)參數(shù)

數(shù)組名作函數(shù)參數(shù),在函數(shù)執(zhí)行過(guò)程中,當(dāng)形參數(shù)組各元素的值發(fā)生變化時(shí),實(shí)參數(shù)組元素的值也隨之變化。在程序設(shè)計(jì)中,可以利用這一特點(diǎn)改變實(shí)參數(shù)組元素的值?!纠?.9】根據(jù)例3.3程序,以數(shù)組名作為函數(shù)參數(shù),編寫(xiě)冒泡法排序程序(由小到大)。任務(wù)4.4利用數(shù)組作為函數(shù)參數(shù)進(jìn)行模塊化程序設(shè)計(jì)voidMPSort(intb[],intn)//冒泡排序函數(shù),形參:數(shù)組名b、變量n{

inti,j,

t,swap_flag;for(i=1;i<n;i++)

//n個(gè)數(shù),共需比較n-1輪{swap_flag=0;

//交換標(biāo)志:0-無(wú)交換,1-有交換for(j=0;j<n-i;j++)//第i輪需要比較n-i次{if(b[j]

>b[j+1])//依次比較兩個(gè)相鄰的數(shù),將大數(shù)放后面{ t

=

b[j];b[j]

=

b[j+1];b[j+1]

=

t;swap_flag

=

1;//交換

}}if(swap_flag==0)break;//若本輪無(wú)交換,則結(jié)束比較}}#defineN5

//宏定義參與排序的數(shù)據(jù)個(gè)數(shù)voidMPSort(intb[],intn);

//函數(shù)聲明intmain(void){

inta[N],

i;

//數(shù)組a存放待排序的N個(gè)數(shù)

...//依次輸入N個(gè)數(shù)據(jù)給數(shù)組a...//依次輸出數(shù)組a的各元素值(排序前)

MPSort(a,N);//調(diào)用排序函數(shù),實(shí)參:數(shù)組名a、數(shù)值N...//依次輸出數(shù)組a的各元素值(排序后)}【課后作業(yè)】同步練習(xí)4-7:知識(shí)鞏固與學(xué)以致用。4.5.1局部變量和全局變量

從變量值存在的時(shí)間(生存期)角度,變量有靜態(tài)存儲(chǔ)和動(dòng)態(tài)存儲(chǔ)兩種存儲(chǔ)方式。從變量的作用域(作用范圍)角度,變量可分為局部變量和全局變量。1、局部變量任務(wù)4.5靈活設(shè)置變量的類(lèi)型

在函數(shù)或復(fù)合語(yǔ)句的內(nèi)部定義的變量是內(nèi)部變量,也稱(chēng)為“局部變量”,只在本函數(shù)或復(fù)合語(yǔ)句范圍內(nèi)有效。函數(shù)的形參是局部變量。

主函數(shù)中定義的變量也只能在主函數(shù)中使用,不能在其它函數(shù)中使用,并且主函數(shù)也不能使用其他函數(shù)中定義的變量。

允許在不同的函數(shù)中使用相同的局部變量名,它們代表不同的對(duì)象,分配不同的內(nèi)存單元,互不干擾,也不會(huì)發(fā)生混淆。

通過(guò)函數(shù)可實(shí)現(xiàn)模塊化程序設(shè)計(jì),而每個(gè)函數(shù)中都會(huì)定義和使用一些變量。2、全局變量

在函數(shù)外部定義的變量是外部變量,也稱(chēng)“全局變量”。全局變量的有效范圍是從定義變量的位置開(kāi)始到本源文件結(jié)束。4.5.1局部變量和全局變量任務(wù)4.5靈活設(shè)置變量的類(lèi)型【例4.10】輸入正方體的棱長(zhǎng),輸出其表面積和體積的大小。

(1)打通函數(shù)之間數(shù)據(jù)聯(lián)系的通道,使多個(gè)函數(shù)共享全局變量的值;并且通過(guò)函數(shù)調(diào)用可以得到一個(gè)以上的值。2、全局變量4.5.1局部變量和全局變量任務(wù)4.5靈活設(shè)置變量的類(lèi)型#include

<stdio.h>float

S,V;

//定義全局變量S和V,分別存放表面積和體積voidsv(floatx)

//求正方體的表面積和體積函數(shù){

S

=

6*x*x;

//計(jì)算表面積

V

=

x*x*x;

//計(jì)算體積

}intmain(void){

floata;

//定義變量a,存放正方體的棱長(zhǎng)printf("請(qǐng)輸入正方體的棱長(zhǎng):");scanf("%f",

&a);

sv(a);

//調(diào)用求表面積和體積函數(shù)printf("棱長(zhǎng)=%6.2f,表面積=%6.2f,體積=%6.2f\n",

a,

S,

V);}

(2)在同一個(gè)源文件中,若全局變量與局部變量同名,則在局部變量的作用范圍內(nèi),全局變量被“屏蔽”失效?!纠?.11】外部變量與局部變量同名。

2、全局變量4.5.1局部變量和全局變量任務(wù)4.5靈活設(shè)置變量的類(lèi)型

說(shuō)明:盡管使用全局變量有時(shí)會(huì)帶來(lái)一些便利,但建議不是非常必要的情況下,盡量不要使用全局變量。為了實(shí)現(xiàn)程序的模塊化設(shè)計(jì)(函數(shù)化),提倡通過(guò)“實(shí)參-形參”的方式實(shí)現(xiàn)函數(shù)之間的信息傳遞,例如數(shù)組名作為函數(shù)參數(shù)。#include

<stdio.h>inta=1,

b=2;

//a、b為全局變量intadd(inta,intb)//a、b為局部變量{

intc;c

=

a+b;return(c);}intmain(void){

inta=3;

//a為局部變量printf("%d\n",

add(a,

b));}【例4.12】考察全局變量和局部變量的系統(tǒng)默認(rèn)初值。(3)若定義全局變量時(shí)不賦初值,系統(tǒng)會(huì)自動(dòng)賦初值數(shù)值0或空字符'\0'。若定義局部變量時(shí)不賦初值,則系統(tǒng)會(huì)為其賦一個(gè)隨機(jī)值。2、全局變量4.5.1局部變量和全局變量任務(wù)4.5靈活設(shè)置變量的類(lèi)型#include<stdio.h>int

a;

//定義全局變量charb;

//定義全局變量intmain(void){

int

i;

//定義局部變量

charj;

//定義局部變量printf("a=%d,b=%c,i=%d,j=%c\n",a,

b,

i,

j);}【課堂練習(xí)】同步練習(xí)4-8:知識(shí)鞏固與總結(jié)。4.5.2變量的存儲(chǔ)方式

從變量值存在的時(shí)間(生存期)角度,變量有靜態(tài)存儲(chǔ)和動(dòng)態(tài)存儲(chǔ)兩種存儲(chǔ)方式(存儲(chǔ)類(lèi)別)。變量有兩個(gè)屬性:存儲(chǔ)類(lèi)型和數(shù)據(jù)類(lèi)型。定義變量的完整格式:

存儲(chǔ)類(lèi)別數(shù)據(jù)類(lèi)型

變量名;

動(dòng)態(tài)存儲(chǔ):在程序運(yùn)行期間根據(jù)需要(如調(diào)用函數(shù)時(shí))臨時(shí)分配存儲(chǔ)空間。

靜態(tài)存儲(chǔ):在程序運(yùn)行期間分配固定的存儲(chǔ)空間,即變量在程序整個(gè)運(yùn)行時(shí)間內(nèi)都存在。

全局變量使用靜態(tài)存儲(chǔ),而局部變量使用靜態(tài)存儲(chǔ)或動(dòng)態(tài)存儲(chǔ)。

有4個(gè)存儲(chǔ)類(lèi)別標(biāo)識(shí)符:自動(dòng)的(auto)、靜態(tài)的(static)、寄存器的(register)和外部的(extern)。

任務(wù)4.5靈活設(shè)置變量的類(lèi)型1、局部變量的存儲(chǔ)類(lèi)別聲明

程序中大多數(shù)局部變量以及函數(shù)的形參變量都是自動(dòng)局部變量,關(guān)鍵字“auto”通常省略不寫(xiě)。例如autointa,b;

通常簡(jiǎn)寫(xiě)成:inta,b;

在調(diào)用該函數(shù)時(shí),系統(tǒng)臨時(shí)為局部變量x、a、b分配存儲(chǔ)空間,在函數(shù)調(diào)用結(jié)束時(shí)系統(tǒng)自動(dòng)釋放這些存儲(chǔ)空間。此類(lèi)局部變量稱(chēng)為自動(dòng)局部變量,也稱(chēng)為動(dòng)態(tài)局部變量。4.5.2變量的存儲(chǔ)方式(1)用auto聲明動(dòng)態(tài)局部變量任務(wù)4.5靈活設(shè)置變量的類(lèi)型intf(intx)

//定義f函數(shù),x為形參變量{

autointa,

b;//定義a、b為自動(dòng)局部變量...}

有時(shí)希望函數(shù)中的局部變量在函數(shù)調(diào)用結(jié)束后,其占用的存儲(chǔ)單元不被釋放,其值不消失而繼續(xù)被保留。需要用static將該局部變量聲明為靜態(tài)存儲(chǔ)類(lèi)型。【例4.13】考察動(dòng)態(tài)局部變量和靜態(tài)局部變量的值。

變量a、b在三次函數(shù)調(diào)用時(shí)的初值和函數(shù)調(diào)用結(jié)束時(shí)的值的變化情況:4.5.2變量的存儲(chǔ)方式(2)用static聲明靜態(tài)局部變量1、局部變量的存儲(chǔ)類(lèi)別聲明第幾次調(diào)用

函數(shù)調(diào)用時(shí)的初值函數(shù)調(diào)用結(jié)束時(shí)的值abab第1次22第2次23第3次24123111任務(wù)4.5靈活設(shè)置變量的類(lèi)型

【課堂練習(xí)】

【例4.14】考察靜態(tài)局部變量和靜態(tài)局部數(shù)組的系統(tǒng)默認(rèn)初值。#include<stdio.h>voidlv();

//函數(shù)聲明intmain(void){

inti;for(i=1;i<=3;i++){ printf("第%d次調(diào)用lv函數(shù)后:",

i);

lv();

//調(diào)用lv函數(shù)

}}voidlv()

//局部變量函數(shù){

auto

int

a=1;//定義動(dòng)態(tài)局部變量astatic

int

b=1;//定義靜態(tài)局部變量b

a++; b++;printf("a=%db

溫馨提示

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

評(píng)論

0/150

提交評(píng)論