C語(yǔ)言程序設(shè)計(jì)實(shí)例教程(第三版)課件:學(xué)生成績(jī)管理_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì)實(shí)例教程(第三版)課件:學(xué)生成績(jī)管理_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì)實(shí)例教程(第三版)課件:學(xué)生成績(jī)管理_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì)實(shí)例教程(第三版)課件:學(xué)生成績(jī)管理_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì)實(shí)例教程(第三版)課件:學(xué)生成績(jī)管理_第5頁(yè)
已閱讀5頁(yè),還剩212頁(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)介

學(xué)生成績(jī)管理能力目標(biāo)知識(shí)目標(biāo)能對(duì)使用數(shù)組存儲(chǔ)數(shù)據(jù),并對(duì)數(shù)組進(jìn)行操作能調(diào)用系統(tǒng)函數(shù),并自定義函數(shù)能較熟練使用指針掌握一維數(shù)組、二維數(shù)組和字符型數(shù)組的定義掌握通過(guò)循環(huán)結(jié)構(gòu)對(duì)數(shù)組進(jìn)行高效處理掌握函數(shù)的定義和調(diào)用掌握函數(shù)的參數(shù)使用掌握變量的作用域與生存期掌握指針的定義掌握指針與數(shù)組的使用掌握指針與函數(shù)的使用

任務(wù)1學(xué)生成績(jī)存儲(chǔ)任務(wù)2學(xué)生等級(jí)成績(jī)存儲(chǔ)任務(wù)3學(xué)生成績(jī)統(tǒng)計(jì),求平均分和總分任務(wù)4數(shù)組作為函數(shù)的參數(shù)任務(wù)5指針型參數(shù)應(yīng)用于函數(shù)項(xiàng)目分解任務(wù)1學(xué)生成績(jī)存儲(chǔ)3.1.1問(wèn)題情景及其實(shí)現(xiàn)#include<stdio.h>intmain(){ floatscore[4]={60,70,80,90}; inti;for(i=0;i<4;i++)printf("該學(xué)生的第%d科成績(jī)?yōu)椋?5.2f\n",i+1,score[i]);return0;}

某班有1名學(xué)生參加了4門(mén)考試,已經(jīng)將成績(jī)存儲(chǔ)在計(jì)算機(jī)中,請(qǐng)輸出他們的成績(jī)。具體實(shí)現(xiàn)代碼如下:該學(xué)生的第1科成績(jī)?yōu)椋?0.00該學(xué)生的第2科成績(jī)?yōu)椋?0.00該學(xué)生的第3科成績(jī)?yōu)椋?0.00該學(xué)生的第4科成績(jī)?yōu)椋?0.00

程序運(yùn)行結(jié)果如下:一個(gè)人N門(mén)課的成績(jī)?cè)鯓哟鎯?chǔ)和處理?一個(gè)班N門(mén)課的成績(jī)?cè)鯓哟鎯?chǔ)和處理?......這些數(shù)據(jù)的特點(diǎn):具有相同的數(shù)據(jù)類(lèi)型。為了方便地使用這些數(shù)據(jù),C語(yǔ)言提供了一種構(gòu)造數(shù)據(jù)類(lèi)型:數(shù)組。一維數(shù)組二維數(shù)組3.1.2知識(shí)分解一、一維數(shù)組

一維數(shù)組是指只有一個(gè)下標(biāo)的數(shù)組。一維數(shù)組適合用于存儲(chǔ)一組具有相同數(shù)據(jù)類(lèi)型的數(shù)據(jù)。一維數(shù)組定義后,在內(nèi)存中為數(shù)組元素分配連續(xù)的內(nèi)存存儲(chǔ)空間,用于存放各數(shù)組元素的值。例如:inta[10];……a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]1、一維數(shù)組的定義

一維數(shù)組定義的一般語(yǔ)法格式為:數(shù)據(jù)類(lèi)型說(shuō)明符數(shù)組名[常量表達(dá)式];例如:intarr[9];#defineN9intarr[N];intarr[2*(N+1)];floatarr[N];doublearr[N];chararr[N]

是數(shù)組元素的數(shù)據(jù)類(lèi)型。

表示數(shù)組中有多少個(gè)元素,即數(shù)組的長(zhǎng)度。][intn;intarr[n];=10;1、一維數(shù)組的定義

一維數(shù)組定義的一般語(yǔ)法格式為:數(shù)據(jù)類(lèi)型說(shuō)明符數(shù)組名[常量表達(dá)式];例如:intarr[9];

是數(shù)組元素的數(shù)據(jù)類(lèi)型。

表示數(shù)組中有多少個(gè)元素,即數(shù)組的長(zhǎng)度。][數(shù)組名……arr[0]arr[1]arr[2]arr[3]arr[4]arr[5]arr[6]arr[7]arr[8]arr

注意:數(shù)組一旦定義,數(shù)組元素在內(nèi)存空間的位置以及空間的大小就被確定下來(lái)。2、一維數(shù)組元素的引用引用一維數(shù)組元素的語(yǔ)法格式為:數(shù)組名[下標(biāo)表達(dá)式]例如:intarr[4];arr[0],arr[1],arr[2],arr[3]…1000H1001H1002H1003H1004H1005H1006H1007H1008H1009H100AH100BH100CH100DH100EH100FH1011H1012H1013H1014H…arr[0]arr[1]arr[2]arr[3]

注意:C語(yǔ)言在編譯時(shí)并不檢查下標(biāo)越界,所以引用數(shù)組元素時(shí)應(yīng)特別注意避免下標(biāo)越界,即引用下標(biāo)超過(guò)數(shù)組元素個(gè)數(shù)的定義范圍。

arr[4]危險(xiǎn)!危險(xiǎn)!3、一維數(shù)組的初始化(1)一維數(shù)組初始化的概念

在定義一維數(shù)組的同時(shí)給一維數(shù)組的各個(gè)數(shù)組元素賦初值,稱(chēng)為一維數(shù)組的初始化。(2)對(duì)一維數(shù)組進(jìn)行初始化有以下幾種形式:

定義數(shù)組時(shí)對(duì)全部數(shù)組元素賦初值。inta[10]={0,1,2,3,4,5,6,7,8,9};inta[]={0,1,2,3,4,5,6,7,8,9};3、一維數(shù)組的初始化(1)一維數(shù)組初始化的概念

在定義一維數(shù)組的同時(shí)給一維數(shù)組的各個(gè)數(shù)組元素賦初值,稱(chēng)為一維數(shù)組的初始化。(2)對(duì)一維數(shù)組進(jìn)行初始化有以下幾種形式:定義數(shù)組時(shí)只對(duì)一部分?jǐn)?shù)組元素賦初值,未賦初值的元素由系統(tǒng)自動(dòng)賦初值為0。inta[10]={0,1,2,3,4}說(shuō)明:(1)如果沒(méi)有進(jìn)行一維數(shù)組的初始化,則各個(gè)數(shù)組元素的值不確定(為隨機(jī)數(shù)),直接使用會(huì)造成意想不到的錯(cuò)誤。(2)如果進(jìn)行一維數(shù)組的初始化時(shí),提供的初值個(gè)數(shù)大于數(shù)組長(zhǎng)度則會(huì)造成編譯錯(cuò)誤。習(xí)題:1.以下對(duì)一維整型數(shù)組a的正確說(shuō)明是()。A)inta(10);B)intn=10,a[n];C)intn;D)#defineSIZE10;scanf("%",&n);inta[SIZE];inta[n];D2.以下能對(duì)一維數(shù)組a的每一位元素進(jìn)行正確初始化使其值為1的語(yǔ)句是()。A)inta[10]=(0,0,0,0,0)B)inta[10]={1,1,1}C)inta[]={1};D)inta[10]={10*1};C3.下面程序——(每行程序前面的數(shù)字表示行號(hào))1intmain()2{3floata[10]={0.0};4inti;5for(i=0;i<3;i++)scanf("%d",&a[i]);6for(i=0;i<10;i++)a[0]=a[0]+a[i];7printf("%d\n",a[0]);8return0;9}哪些行號(hào)的語(yǔ)句是錯(cuò)誤的?%f%f習(xí)題:4.以下不正確的定義語(yǔ)句是().A)doublex[5]={2.0,4.0,6.0,8.0,10.0};B)inty[5]={0,1,3,5,7,9};C)charc1[]={’1’,’2’,’3’,’4’,’5’};D)charc2[]={'\x10','\xa','\x8'};B習(xí)題:

先要定義1個(gè)數(shù)組用來(lái)存放10個(gè)整數(shù),再定義2個(gè)變量max、min,max和min分別用來(lái)記錄數(shù)組中的最大數(shù)下標(biāo)和最小數(shù)下標(biāo)?!纠?-1】鍵盤(pán)輸入10個(gè)整數(shù),找出并對(duì)調(diào)其中的最大數(shù)和最小數(shù),然后將10個(gè)整數(shù)進(jìn)行輸出。

#include<stdio.h>intmain(){}intarry[10],max,min,i,t;for(i=0;i<10;i++)scanf("%d",&arry[i]);for(i=1;i<10;i++)max=min=0;elseif(arry[i]<arry[min])if(arry[i]>arry[max]){max=i;}{min=i;}t=arry[max];arry[max]=arry[min];arry[min]=t;printf("\n");for(i=0;i<10;i++)printf("%d\t",arry[i]);分析:return0;【例3-2】將一個(gè)10個(gè)元素的一維數(shù)組中的元素值按逆序存放,然后輸出這個(gè)數(shù)組?!璦rr[0]arr[1]arr[2]arr[3]arr[4]arr[5]arr[6]arr[7]arr[8]arr[9]#include<stdio.h>intmain(){}intarr[10];for(i=0;i<10;i++)scanf("%d",&arr[i]);12345678910i指向數(shù)組的第一個(gè)元素;然后向右移動(dòng)。j指向數(shù)組的最后一個(gè)元素;然后向左移動(dòng)。分析:定義2個(gè)變量i和j;for(i=0,j=9;i<10/2;i++,j--)t=arr[i];arr[i]=arr[j];arr[k]=t;{}printf("\n");for(i=0;i<10;i++)printf("%d\t",arry[i]);,i;,j;,t;return0;【例3-2】將一個(gè)10個(gè)元素的一維數(shù)組中的元素值按逆序存放,然后輸出這個(gè)數(shù)組?!璦rr[0]arr[1]arr[2]arr[3]arr[4]arr[5]arr[6]arr[7]arr[8]arr[9]12345678910i指向數(shù)組的第一個(gè)元素;然后向右移動(dòng)。j指向數(shù)組的最后一個(gè)元素;然后向左移動(dòng)。分析:定義2個(gè)變量i和j;#include<stdio.h>intmain(){}intarr[10];for(i=0;i<10;i++)scanf("%d",&arr[i]);for(i=0,j=9;i<10/2;i++,j--)t=arr[i];arr[i]=arr[j];arr[k]=t;{}printf("\n");for(i=0;i<10;i++)printf("%d\t",arry[i]);,i;,j;,t;return0;二、二維數(shù)組

二維數(shù)組是指只有兩個(gè)下標(biāo)的數(shù)組,其中第一個(gè)下標(biāo)稱(chēng)為行標(biāo),第二個(gè)下標(biāo)稱(chēng)為列標(biāo)。二維數(shù)組適合于處理邏輯上具有行列結(jié)構(gòu)的一批相同數(shù)據(jù)類(lèi)型的數(shù)據(jù)。例如:inta[2][5];……a[0][0]a[0][1]a[0][2]a[0][3]a[0][4]a[1][0]a[1][1]a[1][2]a[1][3]a[1][4]1、二維數(shù)組的定義

二維數(shù)組定義的一般語(yǔ)法格式為:數(shù)據(jù)類(lèi)型說(shuō)明符數(shù)組名[常量表達(dá)式1][常量表達(dá)式2];例如:intarr[2][3];arr[0][0]arr[0][1]arr[0][2]arr[1][0]arr[1][1]arr[1][2]…1000H1001H1002H1003H1004H1005H1006H1007H1008H1009H100AH100BH100CH100DH100EH100FH1011H1012H1013H1014H1015H1016H1017H1018H…arr[0][0]arr[0][1]arr[0][2]arr[1][0]arr[1][1]arr[1][2]arrarrarr[0]arr[1]2、二維數(shù)組元素的引用

引用二維數(shù)組元素的語(yǔ)法格式為:數(shù)組名[行下標(biāo)表達(dá)式][列下標(biāo)表達(dá)式]例如:intarr[2][3];arr[0][0]arr[0][1]arr[0][2]arr[1][0]arr[1][1]arr[1][2]…1000H1001H1002H1003H1004H1005H1006H1007H1008H1009H100AH100BH100CH100DH100EH100FH1011H1012H1013H1014H1015H1016H1017H1018H…arr[0][0]arr[0][1]arr[0][2]arr[1][0]arr[1][1]arr[1][2]arr說(shuō)明:(1)二維數(shù)組元素也是變量,可以用普通變量的地方也可以使用相同數(shù)據(jù)類(lèi)型的二維數(shù)組元素。二維數(shù)組元素和普通變量一樣能夠進(jìn)行輸入、輸出、運(yùn)算和賦值。(2)應(yīng)注意理定義語(yǔ)句中的下標(biāo)數(shù)與引用時(shí)使用的下標(biāo)數(shù)的區(qū)別。前者是定義二維數(shù)組,用于指定兩維的下標(biāo)上限長(zhǎng)度;后者是對(duì)實(shí)際的二維數(shù)組元素進(jìn)行引用。(3)引用二維數(shù)組元素時(shí)要注意避免下標(biāo)越界的情況。3、二維數(shù)組的初始化

二維數(shù)組進(jìn)行初始化有以下幾種形式:

(1)按行對(duì)二維數(shù)組各元素賦初值(2)按數(shù)組元素在內(nèi)存中的排列順序?qū)ΧS數(shù)組各元素賦初值。(3)僅對(duì)二維數(shù)組部分元素賦初值。(4)如果提供全部初值,則二維數(shù)組初始化時(shí),第一維的長(zhǎng)度可以省略,第二維的長(zhǎng)度不能省略inta[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};inta[3][4]={0,1,2,3,4,5,6,7,8,9,10,11};inta[3][4]={{1},{2},{3}};inta[][4]={0,1,2,3,4,5,6,7,8,9,10,11};33、二維數(shù)組的初始化

如果沒(méi)有進(jìn)行二維數(shù)組的初始化,則各個(gè)數(shù)組元素的初值不確定,可能導(dǎo)致程序運(yùn)行結(jié)果出錯(cuò)。如果進(jìn)行二維數(shù)組的初始化時(shí),提供的初值個(gè)數(shù)大于數(shù)組長(zhǎng)度(元素個(gè)數(shù))則會(huì)造成編譯錯(cuò)誤。inta[3][4]={0,1,2,3,4,5,6,7,8,9,10,11,12};采用第4種初始化方式時(shí),應(yīng)注意在數(shù)組未賦全部初值的情況下數(shù)組的行標(biāo)和列標(biāo)均不能省略;在提供全部初值的情況下,只能省略行標(biāo)而不能省略列標(biāo),如果這樣做省略列標(biāo),則編譯系統(tǒng)無(wú)法判斷二維數(shù)組每行元素的個(gè)數(shù)。說(shuō)明:2.以下對(duì)二維數(shù)組a正確初始化的是().A)inta[2][3]={{1,2},{3,4},{5,6}};B)inta[][3]={1,2,3,4,5,6};C)inta[2][]={1,2,3,4,5,6};D)inta[2][]={{1,2},{3,4}};B1.以下正確的定義語(yǔ)句是().A)inta[b];B)inta[3,4];C)inta[][3];D)inta[3][5];D習(xí)題:3.在定義inta[5][4];之后,對(duì)a數(shù)組的引用正確的是()A)a[2][4]B)a[5][0]C)a[0,0]D)a[0][0]D4.在定義inta[2][3];之后,對(duì)a數(shù)組的引用正確的是()

A)a(1,2)B)a[1,3]C)a[1>2][!1]D)a[2][0]C5.在定義inta[5][6];后,第10個(gè)元素是().A)a[2][5]B)a[2][4]C)a[1][3]D)a[1][5]C習(xí)題:6.若二維數(shù)組a有m列,則在a[i][j]前的元素個(gè)數(shù)為().A)j*m+iB)i*m+jC)i*m+j-1D)i*m+j+1B7.已知:inta[3][4]={0};則下面正確的敘述是().A)只有元素a[0][0]可得到初值0;B)此說(shuō)明語(yǔ)句是錯(cuò)誤的;C)數(shù)組a中的每一個(gè)元素都可以得到初值,但其值不一定為0;D)數(shù)組a中的每一個(gè)元素均可得到初值0;D習(xí)題:【例3-3】輸入整型數(shù)據(jù)到一個(gè)4行5列的二維數(shù)組中,然后輸出該二維數(shù)組本身和二維數(shù)組中值最小的元素及其行標(biāo)和列標(biāo)。ji#include<stdio.h>intmain(){}inta[4][5],i,j;for(i=0;i<4;i++)scanf("%d",&a[i][j]);for(j=0;j<5;j++)for(i=0;i<4;i++)m=n=0;if(a[i][j]<a[m][n]){m=i;n=j;}for(j=0;j<5;j++)printf("二維數(shù)組中值最小的元素是:a[%d][%d]=%d",m,n,a[m][n]);1234654523214416411537165676118635171828printf("%d\t",a[i][j]);{{}}printf("\n");i指向數(shù)組的行,j指向數(shù)組的列;分析:再定義2個(gè)變量i和j;定義一個(gè)4行5列的二維數(shù)組,1234654523214416411537165676118635171828↙return0;【例3-4】編程求一個(gè)4×4矩陣的兩條對(duì)角線元素之和。i指向數(shù)組的行,j指向數(shù)組的列;分析:再定義2個(gè)變量i和j;定義一個(gè)4行4列的二維數(shù)組,ji#include<stdio.h>intmain(){}inta[4][4],i,j;for(i=0;i<4;i++)scanf("%d",&a[i][j]);for(j=0;j<4;j++)124376891112151316537↙i==j,sum=0;for(i=0;i<4;i++)sum=sum+a[i][i]+a[i][3-i];printf("sum=%d\n",sum);j==3-i124376891112151316537return0;【例3-4】編程求一個(gè)4×4矩陣的兩條對(duì)角線元素之和。i指向數(shù)組的行,j指向數(shù)組的列;分析:再定義2個(gè)變量i和j;定義一個(gè)4行4列的二維數(shù)組,ji#include<stdio.h>intmain(){}inta[4][4],i,j;for(i=0;i<4;i++)scanf("%d",&a[i][j]);for(j=0;j<4;j++)124376891112151316537↙,sum=0;for(i=0;i<4;i++)sum=sum+a[i][i]+a[i][3-i];printf("sum=%d\n",sum);if(i%2!=0)sum=sum-a[i/2][i/2];i==jj==3-i124376891112151316537return0;3.1.3知識(shí)擴(kuò)展:將n個(gè)數(shù)按從小到大進(jìn)行排序

所謂排序就是將無(wú)序排列的數(shù)據(jù)轉(zhuǎn)換為有序排列的數(shù)據(jù),是程序中一種經(jīng)常使用的基本算法,解決實(shí)際問(wèn)題過(guò)程中也得到普遍運(yùn)用。常用的排序方法是冒泡法和選擇法。1、冒泡排序法冒泡法的基本算法思想:將包含n個(gè)數(shù)據(jù)的數(shù)組按升序排列,從第一個(gè)元素開(kāi)始,依次將相鄰的兩個(gè)元素進(jìn)行比較,即第1個(gè)元素和第2個(gè)元素比較,然后再第2個(gè)元素和第3個(gè)元素進(jìn)行比較…,依次類(lèi)推,直到第n-1個(gè)元素和第n個(gè)元素比較。。比較的原則是:相鄰兩個(gè)元素在比較的過(guò)程中,保證小數(shù)在前,大數(shù)在后,如果不滿足這一要求,就將兩個(gè)元素的值進(jìn)行交換。3.1.3知識(shí)擴(kuò)展:將n個(gè)數(shù)按從小到大進(jìn)行排序

所謂排序就是將無(wú)序排列的數(shù)據(jù)轉(zhuǎn)換為有序排列的數(shù)據(jù),是程序中一種經(jīng)常使用的基本算法,解決實(shí)際問(wèn)題過(guò)程中也得到普遍運(yùn)用。常用的排序方法是冒泡法和選擇法。2、選擇排序法

選擇法的基本算法思想:

將包含n個(gè)數(shù)據(jù)的數(shù)組按升序排列,從n個(gè)元素中找出最小元素和第1個(gè)元素交換,再?gòu)暮竺娴膎-1個(gè)元素中找出最小元素和第2個(gè)元素交換,依次類(lèi)推……。找最小值原則:先假定第1個(gè)元素為最小元素,用一個(gè)變量t記錄下當(dāng)前最小元素的下標(biāo)1,然后用這個(gè)t下標(biāo)對(duì)應(yīng)的元素依次和后面的n-1個(gè)的元素進(jìn)行比較,比較過(guò)程中保證比較過(guò)的元素中,最小元素的下標(biāo)在變量t中,最后將變量t與第1個(gè)元素下標(biāo)進(jìn)行比較,相同則不交換,不同則進(jìn)行交換,此時(shí)第1個(gè)元素是這n個(gè)元素的最小的元素。任務(wù)2學(xué)生等級(jí)成績(jī)存儲(chǔ)3.2.1問(wèn)題情景及其實(shí)現(xiàn)#include<stdio.h>intmain(){chara[][10]={"優(yōu)秀","良好","中等","及格","不及格"};inti=0;for(i=0;i<5;i++)printf("%s\t",a[i]);return0;}

在實(shí)際的考試中,考試的最終成績(jī)不一定都是用一個(gè)具體的數(shù)值來(lái)表示的,例如,等級(jí)制(優(yōu)秀、良好、中等、及格、不及格)的表示形式?,F(xiàn)在我們需要用等級(jí)制來(lái)表示學(xué)生的成績(jī)。

優(yōu)秀良好中等及格不及格

程序運(yùn)行結(jié)果如下:字符數(shù)組的定義字符數(shù)組的引用字符數(shù)組的初始化3.2.2知識(shí)分解

當(dāng)數(shù)組中的元素都是由一個(gè)個(gè)字符組成時(shí),便稱(chēng)之為字符數(shù)組。1.字符數(shù)組的定義char數(shù)組名[常量表達(dá)式][常量表達(dá)式];定義字符數(shù)組的語(yǔ)法格式為:char數(shù)組名[常量表達(dá)式];chara[5];例如:charb[4][5];2.字符數(shù)組的引用(1)引用字符數(shù)組元素

字符數(shù)組中存放的是若干單個(gè)字符,則只能引用字符數(shù)組中的單個(gè)數(shù)組元素。

當(dāng)數(shù)組中的元素都是由一個(gè)個(gè)字符組成時(shí),便稱(chēng)之為字符數(shù)組。c1[i]='A'+i;c2[i]='a'+i;【例3-5】字符數(shù)組c1賦值為'A'-'Z'的字符,字符數(shù)組c2賦值為'a'-'z'后,輸出字符數(shù)組c1、c2。分析:字符數(shù)組c1和c2分別用于存儲(chǔ)26個(gè)大寫(xiě)字母和26個(gè)小寫(xiě)字母,而字母存放是以其ASCII碼值存放,其ASCII碼值按字母順序遞增,可以使用for語(yǔ)句遍歷每一字符數(shù)組元素,對(duì)各元素分別進(jìn)行賦值和輸出操作。本例中的字符數(shù)組用于存放若干單個(gè)字符。#include<stdio.h>intmain(){}charc1[26],c2[26];inti;for(i=0;i<26;i++){}for(i=0;i<26;i++)printf("%c",c1[i]);printf("\n");for(i=0;i<26;i++)printf("%c",c2[i]);printf("\n");ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz程序運(yùn)行結(jié)果如下:return0;2.字符數(shù)組的引用(2)整體引用字符數(shù)組

當(dāng)數(shù)組中的元素都是由一個(gè)個(gè)字符組成時(shí),便稱(chēng)之為字符數(shù)組。

對(duì)字符數(shù)組可以引用數(shù)組元素也可以整體引用整個(gè)數(shù)組,但整體引用字符數(shù)組的前提是字符數(shù)組中存放的是一個(gè)字符串,如果字符數(shù)組中存放的是若干單個(gè)字符,則只能引用字符數(shù)組中的各個(gè)數(shù)組元素。①輸入字符串并存放在字符數(shù)組中chars1[10];scanf("%s",s1);例如:……s1[0]s1[1]s1[2]s1[3]s1[4]s1[5]s1[6]s1[7]s1[8]s1[9]鍵盤(pán)輸入:Chongqing↙Chongqing\0①輸入字符串并存放在字符數(shù)組中chars1[10],s2[10],s3[10];scanf("%s%s%s",s1,s2,s3);再例如:……s1[0]s1[1]s1[2]s1[3]s1[4]s1[5]s1[6]s1[7]s1[8]s1[9]鍵盤(pán)輸入:Class1Class2Class3

↙Class\0……s2[0]s2[1]s2[2]s2[3]s2[4]s2[5]s2[6]s2[7]s2[8]s2[9]Class\0……s3[0]s3[1]s3[2]s3[3]s3[4]s3[5]s3[6]s3[7]s3[8]s3[9]Class\0123②輸出存放在字符數(shù)組中的字符串chars2[]="student";printf("%s",s2);例如:……s2[0]s2[1]s2[2]s2[3]s2[4]s2[5]s2[6]s2[7]stude\0nt83.字符數(shù)組的初始化

在定義字符數(shù)組的同時(shí)給字符數(shù)組的各數(shù)組元素賦初值稱(chēng)為字符數(shù)組的初始化。字符數(shù)組的初始化有多種形式。(1)使用若干個(gè)字符常量逐一給各個(gè)數(shù)組元素賦初值例如:charc[6]={'s','t','u','d','n','t'};字符數(shù)組c中存放6個(gè)字符又例如:charc[7]={'s','t','u','d','n','t','\0'};字符數(shù)組c中存放一個(gè)字符串3.字符數(shù)組的初始化

在定義字符數(shù)組的同時(shí)給字符數(shù)組的各數(shù)組元素賦初值稱(chēng)為字符數(shù)組的初始化。字符數(shù)組的初始化有多種形式。(2)使用字符串常量給數(shù)組賦初值例如:chars[7]={"school"};

字符數(shù)組s中,前6個(gè)數(shù)組元素依次存放字符串"school"中的各個(gè)字符,最后一個(gè)元素存放字符串結(jié)束標(biāo)志'\0'。又例如:chars[3][6]={"red","green","blue"};二維字符數(shù)組s共有3行,各行依次存放一個(gè)字符串常量。red\0green\0blue\0s3.字符數(shù)組的初始化

在定義字符數(shù)組的同時(shí)給字符數(shù)組的各數(shù)組元素賦初值稱(chēng)為字符數(shù)組的初始化。字符數(shù)組的初始化有多種形式。(3)字符數(shù)組初始化時(shí)數(shù)組長(zhǎng)度的省略

如果為字符數(shù)組的全部數(shù)組元素都提供了初值,則字符數(shù)組的長(zhǎng)度可以省略。例如:chara[]={'p','r','o','g','r','a','m','\0'};又例如:chars[3][6]={"red","green","blue"};

二維字符數(shù)組初始化時(shí),如果為字符數(shù)組的全部數(shù)組元素都提供了初值,則字符數(shù)組的第一維長(zhǎng)度可以省略,而第二維長(zhǎng)度則不能省略。8省略的長(zhǎng)度由初值個(gè)數(shù)決定。3【例3-6】從鍵盤(pán)上輸入一個(gè)字符串,要求統(tǒng)計(jì)并輸出該字符串中各位數(shù)字、大寫(xiě)字母、小寫(xiě)字母、空格和其他字符出現(xiàn)的次數(shù)。分析:定義字符數(shù)組接收字符串,因?yàn)樽址邪崭?,所以使用gets函數(shù)要求用戶輸入字符串并存儲(chǔ)在該字符數(shù)組中。接著使用循環(huán)語(yǔ)句遍歷字符數(shù)組中存儲(chǔ)的每一個(gè)字符(數(shù)組元素),對(duì)每一字符使用選擇結(jié)構(gòu)if判斷該字符是數(shù)字、大寫(xiě)字母、小寫(xiě)字母、空格還是其他字符,并相應(yīng)設(shè)置多個(gè)計(jì)數(shù)器變量分別進(jìn)行統(tǒng)計(jì),最后輸出各種類(lèi)型字符出現(xiàn)的次數(shù)即可。1.以下給字符數(shù)組str定義和賦值正確的是()A)charstr[6];str={"China"};B)charstr[]={"China"};C)charstr[6]={'a','b','c',‘d','e','f','g'};D)charstr[6]={"abcdefghijklmn"};B習(xí)題:2.對(duì)兩個(gè)數(shù)組a和b進(jìn)行如下初始化

chara[]="ABCDEF";charb[]={'A','B','C','D','E','F'};

則以下敘述正確的是().A)a與b數(shù)組完全相同B)a與b長(zhǎng)度相同C)a和b中都存放字符串D)a數(shù)組比b數(shù)組長(zhǎng)度長(zhǎng)D習(xí)題:3.下面程序的運(yùn)行結(jié)果是()#indude<stdio.h>intmain(){charch[7]={"12ab56"};inti,s=0;for(i=0;ch[i]>='0'&&ch[i]<='9';i+=2)s=10*s+ch[i]-'0';printf("%d\n",s);return0;}1習(xí)題:4.有字符數(shù)組a[80]和b[80],則正確的輸出形式是().A)puts(a,b);B)printf("%s,%s,a[],b[]);C)putchar(a,b);D)puts(a),puts(b);D習(xí)題:5.有兩個(gè)字符數(shù)組a、b,則以下正確的輸入格式是().A)gets(a,b);B)scanf("%s%s",a,b);C)scanf("%s%s",&a,&b);D)gets("a"),gets("b");B#include<stdio.h>intmain(){chara1[5],a2[5],a3[5],a4[5];scanf("%s%s",a1,a2);gets(a3);gets(a4);puts(a1);puts(a2);puts(a3);puts(a4);return0;}A)aaB)aaC)aaD)aabbbbbbbbccccccddddddccdd6.當(dāng)運(yùn)行以下程序時(shí),從鍵盤(pán)輸入:aabb<CR>ccdd<CR>(<CR>表示回車(chē)),則下面程序的運(yùn)行結(jié)果是()B習(xí)題:3.2.3知識(shí)擴(kuò)展:編寫(xiě)簡(jiǎn)單密碼檢測(cè)程序

編程實(shí)現(xiàn)簡(jiǎn)單密碼檢測(cè)程序,對(duì)用戶輸入的密碼進(jìn)行檢測(cè),檢測(cè)正確才能執(zhí)行后續(xù)程序段,否則要求用戶重新輸入密碼,輸入三次錯(cuò)誤密碼后退出程序。(假定正確的用戶密碼為1234。)分析:定義兩個(gè)字符數(shù)組分別用于存放用戶預(yù)設(shè)的正確密碼和用戶輸入的密碼字符串。然后使用循環(huán)語(yǔ)句檢測(cè)用戶輸入的密碼,即將用戶輸入的密碼和用戶預(yù)設(shè)的正確密碼進(jìn)行比較。用戶每次輸入都會(huì)給出相應(yīng)提示,如果用戶在三次內(nèi)未輸入正確密碼則退出此循環(huán),并給出相應(yīng)的提示語(yǔ)句。具體檢測(cè)過(guò)程為:獲取用戶輸入密碼并與正確密碼比較(使用strcmp函數(shù)),如果一致則終止循環(huán),給出密碼正確提示;如果不一致則輸出密碼錯(cuò)誤提示,并繼續(xù)進(jìn)行循環(huán),當(dāng)輸入三次錯(cuò)誤密碼后(使用計(jì)數(shù)器變量統(tǒng)計(jì)錯(cuò)誤次數(shù),取值為4時(shí)即表示已輸入了3次錯(cuò)誤密碼),給出相應(yīng)提示,終止程序運(yùn)行。1、gets()函數(shù);2、puts()函數(shù)函數(shù)功能:該函數(shù)用于實(shí)現(xiàn)字符串的輸出。將作為參數(shù)的字符串輸出到屏幕上,輸出到字符串結(jié)束標(biāo)志"\0"為止,并且在輸出時(shí)將"\0"自動(dòng)替換為"\n",即輸出字符串后自動(dòng)換行。常用字符串處理函數(shù):

函數(shù)功能:該函數(shù)用于實(shí)現(xiàn)字符串的鍵盤(pán)輸入。將從鍵盤(pán)輸入的字符串存儲(chǔ)在參數(shù)字符數(shù)組名指定的字符數(shù)組中,以回車(chē)符代表輸入結(jié)束,并且在輸入時(shí)將"\n"自動(dòng)替換為"\0",即在輸入得字符串后自動(dòng)添加字符串結(jié)束標(biāo)志。常用字符串處理函數(shù):

3、strlen()函數(shù);函數(shù)功能:該函數(shù)用于求字符串的長(zhǎng)度,即字符串中包含的有效字符個(gè)數(shù),應(yīng)特別注意有效字符不包含字符串結(jié)束標(biāo)志"\0"在內(nèi)。4、strcat()函數(shù)函數(shù)功能:也稱(chēng)為“字符串連接函數(shù)”。該函數(shù)用于將兩個(gè)字符串連接成一個(gè)字符串。5、strcpy()函數(shù)函數(shù)功能:也稱(chēng)為“字符串拷貝函數(shù)”。該函數(shù)用于將一個(gè)字符數(shù)組str2中存放的字符串復(fù)制到另一個(gè)字符數(shù)組str1中。6、strcmp()函數(shù);函數(shù)功能:也稱(chēng)為“字符串比較函數(shù)”。該函數(shù)用于字符數(shù)組str1和符數(shù)組str2中存放的字符串進(jìn)行比較;比較方法是:兩個(gè)字符串從第一個(gè)字符開(kāi)始自左至右逐個(gè)字符比較其AscII碼值,直到出現(xiàn)不同字符或所有字符比較完畢。函數(shù)的返回值有三種情況:⑴為0,表示兩個(gè)字符串長(zhǎng)度相等且每個(gè)字符的AscII碼值相等;⑵為一正整數(shù),表示str1大于str2;⑶為一負(fù)整數(shù),表示str1小于str2。7、strupr()函數(shù)和strlwr()函數(shù)函數(shù)功能:strupr()函數(shù)是將字符串中小寫(xiě)字母轉(zhuǎn)換為大寫(xiě)字母,strlwr()函數(shù)是將字符串中的大寫(xiě)字母轉(zhuǎn)換為小寫(xiě)字母。常用字符串處理函數(shù):

作業(yè)編程在一個(gè)已知的字符串中查找最長(zhǎng)單詞,假定字符串中只含字母和空格,空格用來(lái)分隔不同單詞?!?include<stdio.h>

intmain(){ inti,j,front,end,max=0,maxf,maxe;chars[20];printf("請(qǐng)輸入字符串:");gets(s);for(i=0;;i++){front=i;for(j=i;a[j]!=''||a[j]!='\0';j++);end=j;i=j;if(end-front>max){max=end-front;maxe=end;maxf=front;}if(s[i]=='\0')break;}s[maxe]=0;puts(s+maxf);return0;}

i請(qǐng)輸入字符串:最長(zhǎng)的單詞是:apple程序運(yùn)行結(jié)果如下:↙This

is

an

apple\0Thisisanapple任務(wù)3學(xué)生成績(jī)統(tǒng)計(jì),求平均分和總分學(xué)生成績(jī)統(tǒng)計(jì),求平均分和總分3.3.1問(wèn)題情景及其實(shí)現(xiàn)#include<stdio.h>

intmain(){ floatcj1=80,cj2=70;floatsum1=0,average1=0;sum1=sum(cj1,cj2);average1=average(cj1,cj2);printf("該學(xué)生的總分為:%5.2f,平均分為:5.2f\n",sum1,average1);return0;}

存儲(chǔ)完學(xué)生的成績(jī)后,我們常常還會(huì)對(duì)學(xué)生的成績(jī)進(jìn)行統(tǒng)計(jì),本任務(wù)中要求計(jì)算學(xué)生的平均分和總分。該學(xué)生的總分為:150.00,平均分為:75.00

程序運(yùn)行結(jié)果如下:floatsum(floatcj1,floatcj2){return(cj1+cj2);}floataverage(floatcj1,floatcj2){return(cj1+cj2)/2;}函數(shù)的概述函數(shù)的定義函數(shù)的調(diào)用3.3.2知識(shí)分解一、函數(shù)的概述

函數(shù)是實(shí)現(xiàn)特定程序功能的代碼段,在C語(yǔ)言中函數(shù)主要分為兩大類(lèi):一類(lèi)是系統(tǒng)函數(shù),也稱(chēng)為“標(biāo)準(zhǔn)庫(kù)函數(shù)”,這類(lèi)函數(shù)是由系統(tǒng)定義的函數(shù),直接通過(guò)函數(shù)名進(jìn)行調(diào)用;另一類(lèi)是用戶自定義函數(shù),這類(lèi)函數(shù)是用戶為實(shí)現(xiàn)特定程序功能而自己定義的函數(shù)。1、函數(shù)的概念【例3-7】求兩個(gè)整數(shù)中的較大整數(shù)intmain()#include<stdio.h>{}inta,b;printf("請(qǐng)輸入兩個(gè)整數(shù):");scanf("%d%d",&a,&b);printf("大的一個(gè)數(shù)是:%d",max(a,b));intmax(intx,inty){}intz;z=x>y?x:y;returnz;/*函數(shù)定義*//*函數(shù)調(diào)用*/請(qǐng)輸入兩個(gè)整數(shù):2315大的一個(gè)數(shù)是:23程序運(yùn)行結(jié)果如下:↙max(a,b)2、通過(guò)函數(shù)定義和調(diào)用的簡(jiǎn)單實(shí)例認(rèn)識(shí)函數(shù)return0;說(shuō)明:

C語(yǔ)言源程序是由1個(gè)或多個(gè)函數(shù)組成的,每個(gè)函數(shù)是能夠?qū)崿F(xiàn)特定程序功能的代碼段,各個(gè)函數(shù)間通過(guò)相互調(diào)用以實(shí)現(xiàn)整個(gè)程序功能。理解和使用函數(shù)時(shí)應(yīng)注意以下幾個(gè)方面:(1)一個(gè)C語(yǔ)言的源程序由1個(gè)或多個(gè)源程序文件組成,而一個(gè)源程序文件又由1個(gè)或多個(gè)函數(shù)組成。C語(yǔ)言的編譯系統(tǒng)在對(duì)C語(yǔ)言的源程序進(jìn)行編譯時(shí)是以文件為單位的,而不是以函數(shù)為單位的。一個(gè)源文件可以被多個(gè)C程序共用。(2)一個(gè)C語(yǔ)言的源程序文件由1個(gè)或多個(gè)函數(shù)組成。這些函數(shù)的地位是平等且獨(dú)立的,函數(shù)之間不存在隸屬關(guān)系。除main函數(shù)外,函數(shù)間可以相互調(diào)用,每個(gè)函數(shù)都既可以做主調(diào)函數(shù)調(diào)用其它函數(shù);又可以做被調(diào)函數(shù)被其它函數(shù)調(diào)用。主函數(shù)較為特殊,可以認(rèn)為主函數(shù)是系統(tǒng)定義并調(diào)用的。(3)C程序的執(zhí)行總是從main函數(shù)開(kāi)始,調(diào)用其它函數(shù)后程序流程返回main函數(shù),并在main函數(shù)中結(jié)束整個(gè)程序的運(yùn)行。(4)函數(shù)不能嵌套定義,即不能在一個(gè)函數(shù)中定義另一個(gè)函數(shù);但函數(shù)可以嵌套調(diào)用,即一個(gè)函數(shù)在調(diào)用另一個(gè)函數(shù)時(shí),被調(diào)函數(shù)又調(diào)用了其它函數(shù)。①程序結(jié)構(gòu)清晰,可讀性好。②減少重復(fù)編碼的工作量。③可多人共同編制一個(gè)大程序,縮短程序設(shè)計(jì)周期,提高程序設(shè)計(jì)和調(diào)試的效率。使用函數(shù)的好處……C程序源程序文件n函數(shù)1函數(shù)m……源程序文件1函數(shù)1函數(shù)n從不同的角度看,函數(shù)有不同的分類(lèi)方式。⑴從函數(shù)定義者的角度來(lái)看,函數(shù)可以分為:①標(biāo)準(zhǔn)函數(shù)(系統(tǒng)庫(kù)函數(shù)):由系統(tǒng)提供的數(shù)學(xué)函數(shù)、字符串函數(shù)和輸入輸出函數(shù)等,直接調(diào)用即可,如前面介紹過(guò)的pow函數(shù)、strcat函數(shù)和printf函數(shù)。②用戶自定義函數(shù):用戶根據(jù)程序設(shè)計(jì)需要自己定義的函數(shù),如上例的max函數(shù)。⑵從函數(shù)的定義形式來(lái)看,函數(shù)可以分為:①有參函數(shù),調(diào)用此類(lèi)函數(shù)不需要主調(diào)函數(shù)提供數(shù)據(jù)。②無(wú)參函數(shù),調(diào)用此類(lèi)函數(shù)需要主調(diào)函數(shù)提供數(shù)據(jù)。⑶從函數(shù)間的調(diào)用關(guān)系來(lái)看,函數(shù)可以分為:①主調(diào)函數(shù),即調(diào)用其它函數(shù)的函數(shù),如上例的main函數(shù)。②被調(diào)函數(shù),被其他函數(shù)調(diào)用的函數(shù),如上例的max函數(shù)。3、函數(shù)的分類(lèi)二、函數(shù)的定義1、函數(shù)定義的語(yǔ)法格式C語(yǔ)言中函數(shù)定義的一般形式為:函數(shù)類(lèi)型函數(shù)名(數(shù)據(jù)類(lèi)型名形式參數(shù)1,數(shù)據(jù)類(lèi)型名形式參數(shù)2…){

說(shuō)明性語(yǔ)句可執(zhí)行語(yǔ)句}例如:定義一個(gè)求矩形面積的函數(shù)areaintarea(intl,intw){ints;s=l*w;return(s);}函數(shù)類(lèi)型形式參數(shù)①函數(shù)定義中的函數(shù)體是用{}括起來(lái)的語(yǔ)句。②在函數(shù)體中,數(shù)據(jù)說(shuō)明要放在執(zhí)行語(yǔ)句的前面。③函數(shù)體可以是空,稱(chēng)為空函數(shù)。④函數(shù)定義中不能包括對(duì)另一函數(shù)的定義。即函數(shù)不能嵌套定義。voidprint(){putchar('*');voidprnline(){putchar('\n');}}2、函數(shù)定義的規(guī)則①當(dāng)函數(shù)定義時(shí),參數(shù)可有可無(wú),若有超過(guò)一個(gè)以上的參數(shù)要用逗號(hào)分隔。②函數(shù)定義時(shí)的參數(shù)稱(chēng)為形式參數(shù),簡(jiǎn)稱(chēng)形參。③有形參的函數(shù)稱(chēng)為有參函數(shù),無(wú)形參的函數(shù)稱(chēng)為無(wú)參函數(shù)。④形式參數(shù)是用來(lái)記錄調(diào)用者實(shí)際參數(shù)的值,當(dāng)函數(shù)沒(méi)有形式參數(shù)時(shí)稱(chēng)為無(wú)參函數(shù)。3、函數(shù)的形式參數(shù)intarea(l,w)intl,w;{ints;s=l*w;return(s);}intarea(l,w){intl,y;……}或:intarea(intl,w){……}intarea(l,w)intl,w,s;{s=l*w;return(s);}形參也可以這樣定義如下定義都是錯(cuò)誤的

√三、函數(shù)的調(diào)用函數(shù)名(實(shí)參表列)1、函數(shù)調(diào)用的一般形式:其中:參數(shù)表列中,參數(shù)之間用逗號(hào)分隔,參數(shù)的個(gè)數(shù)與定義的個(gè)數(shù)、數(shù)據(jù)類(lèi)型應(yīng)該匹配#include<stdio.h>intsum100(){inti,t=0;for(i=1;i<=100;i++)t+=i;return(t);}intmain(){ints;s=sum100();printf("%d\n",s);return0;}程序輸出結(jié)果:5050#include<stdio.h>intsum(intx){inti,t=0;for(i=1;i<=x;i++)t+=i;return(t);}intmain(){ints;s=sum(100);printf("%d\n",s);return0;

}【補(bǔ)充例】求1~100的累加和。思考:兩個(gè)程序有何不同程序輸出結(jié)果:5050分析:左邊的sum100()函數(shù)是無(wú)參函數(shù),不需要從主調(diào)函數(shù)中獲取數(shù)據(jù),該函數(shù)只能完成1到100數(shù)的求和;分析:右邊的sum(intx)函數(shù)是有參函數(shù),需要從主調(diào)函數(shù)中獲取數(shù)據(jù),該函數(shù)可以完成1到x數(shù)的求和;2、函數(shù)調(diào)用的三種常見(jiàn)方式例如:(1)函數(shù)調(diào)用單獨(dú)構(gòu)成一條語(yǔ)句。即將函數(shù)調(diào)用作為一個(gè)語(yǔ)句使用welcome();(2)函數(shù)調(diào)用作為表達(dá)式的一部分,參與表達(dá)式運(yùn)算。函數(shù)調(diào)用出現(xiàn)在表達(dá)式中,作為表達(dá)式中的一個(gè)運(yùn)算對(duì)象,這時(shí)要求函數(shù)返回值以參加表達(dá)式運(yùn)算。例如:(3)函數(shù)調(diào)用做為另一個(gè)函數(shù)調(diào)用的實(shí)參。也就是將函數(shù)調(diào)用的返回值作為實(shí)際參數(shù)調(diào)用另一個(gè)函數(shù)。例如:minnum=min(a,min(b,c));c=2*min(a,b);注意:函數(shù)需要先定義再調(diào)用。被調(diào)用的函數(shù)一定是已經(jīng)定義過(guò)的函數(shù)。如果調(diào)用的函數(shù)屬于系統(tǒng)標(biāo)準(zhǔn)庫(kù)函數(shù),一般應(yīng)在源文件開(kāi)頭處使用編譯預(yù)處理命令#include將該標(biāo)準(zhǔn)庫(kù)函數(shù)所屬的頭文件包含到本源文件中?!纠?-8】編寫(xiě)一個(gè)函數(shù)求整數(shù)m到n之間所有奇數(shù)的和,其中m和n由用戶指定。調(diào)用該函數(shù)驗(yàn)證其功能。intOdd(intx,inty){}inti,sum=0;while(i<=y)if(x%2==1)i=x;elsei=x+1;{sum=sum+i;}i=i+2;intmain(){}intm,n,t;printf("請(qǐng)輸入兩個(gè)整數(shù):");scanf("%d,%d",&m,&n);printf("%d到%d之間的所有奇數(shù)的和:%d\n",m,n,Odd(m,n));#include<stdio.h>if(m>n)t=m;m=n;n=t;{}return(sum);return0;

【例3-9】編寫(xiě)一個(gè)判斷素?cái)?shù)的函數(shù)。在主函數(shù)中輸入一個(gè)整數(shù),調(diào)用該函數(shù)判斷這個(gè)數(shù)是不是素?cái)?shù)并輸出判斷結(jié)果。intPrime(intx){}inti;for(i=2;i<x;i++)intmain(){}intn;printf("請(qǐng)輸入一個(gè)整數(shù):");scanf("%d",&n);printf("%d不是素?cái)?shù)\n",n);#include<stdio.h>if(Prime(n))printf("%d是素?cái)?shù)\n");elseif(x%i==0)if(i>=x)return(1);elsereturn(0);break;return0;3、函數(shù)的參數(shù)與函數(shù)的返回值

一般情況下,在函數(shù)調(diào)用時(shí),在主調(diào)函數(shù)和被調(diào)函數(shù)之間會(huì)發(fā)生數(shù)據(jù)傳遞。這種數(shù)據(jù)傳遞由函數(shù)參數(shù)來(lái)實(shí)現(xiàn)。函數(shù)參數(shù)的作用是:在進(jìn)行函數(shù)調(diào)用時(shí),將主調(diào)函數(shù)中的數(shù)據(jù)傳遞給被調(diào)函數(shù),在被調(diào)函數(shù)的函數(shù)體中對(duì)傳入的數(shù)據(jù)進(jìn)行處理并將處理結(jié)果返回主調(diào)函數(shù)。(1)函數(shù)的形式參數(shù)與實(shí)際參數(shù)

在定義函數(shù)時(shí)函數(shù)名后圓括號(hào)中的參數(shù)稱(chēng)為“形式參數(shù)”(簡(jiǎn)稱(chēng)形參);在調(diào)用函數(shù)時(shí)函數(shù)名后圓括號(hào)中的參數(shù)稱(chēng)為“實(shí)際參數(shù)”(簡(jiǎn)稱(chēng)實(shí)參)。

C語(yǔ)言中發(fā)生函數(shù)調(diào)用時(shí),主調(diào)函數(shù)中實(shí)參的值會(huì)傳遞給被調(diào)函數(shù)相應(yīng)的形參。在被調(diào)函數(shù)中對(duì)形參進(jìn)行處理,函數(shù)調(diào)用結(jié)束后,無(wú)論形參的值是否發(fā)生改變都不會(huì)影響實(shí)參的值。因此這種數(shù)據(jù)傳遞是一種“單向值傳遞”,即實(shí)參能夠把值傳遞給形參,但形參值不能回傳給實(shí)參。

【例3-10】編寫(xiě)一個(gè)swap函數(shù)用來(lái)交換兩個(gè)變量的值,在主函數(shù)中調(diào)用swap函數(shù)交換用戶通過(guò)鍵盤(pán)輸入的兩個(gè)整數(shù)并輸出交換后的兩個(gè)整數(shù)。voidswap(intx,inty){}inttemp;intmain(){}inta,b;printf(“請(qǐng)輸入兩個(gè)整數(shù)a和b:");scanf("%d,%d",&a,&b);printf("\na=%d,b=%d\n",a,b);#include<stdio.h>swap(a,b);temp=x;x=y;y=temp;printf("\nx=%d,y=%d",x,y);請(qǐng)輸入兩個(gè)整數(shù)a和b:5,8↙x=8,y=5a=5,b=8程序運(yùn)行結(jié)果如下:ab58xy58tempreturn0;(2)函數(shù)的返回值

非void類(lèi)型的函數(shù)在被調(diào)用后會(huì)返回一個(gè)值,該值稱(chēng)為函數(shù)的返回值或簡(jiǎn)稱(chēng)為函數(shù)值。函數(shù)的返回值與函數(shù)類(lèi)型密切相關(guān),函數(shù)類(lèi)型決定了函數(shù)返回值的類(lèi)型。①函數(shù)的類(lèi)型

【例3-11】定義一個(gè)函數(shù)用于計(jì)算指定半徑的圓的面積。在主函數(shù)中調(diào)用該函數(shù)計(jì)算并輸出圓面積。#include<stdio.h>ints(floatr){return(3.14*r*r);}intmain(){intr,area;scanf("%f",&r);printf("%d\n",s(r));return0;}自動(dòng)轉(zhuǎn)換為int型思考:若要得到單精度實(shí)型的圓面積,程序應(yīng)如何修改212程序運(yùn)行情況如下:

intfloatf

【例3-12】無(wú)返回值函數(shù)的定義和調(diào)用。要求定義一個(gè)顯示歡迎信息的函數(shù)并在主函數(shù)中進(jìn)行調(diào)用。voidwelcome(){charstr[50];printf("請(qǐng)輸入你的名字:");gets(str);printf("*******************************\n");printf("%s,歡迎你來(lái)到中國(guó)重慶!\n",str);printf"*******************************\n");}intmain(){welcome();return0;}#include<stdio.h>函數(shù)的調(diào)用能通過(guò)返回值使主調(diào)函數(shù)得到一個(gè)確定的值。描述:使函數(shù)運(yùn)行結(jié)束,并返回一個(gè)確定的值。語(yǔ)法:return(表達(dá)式);注釋?zhuān)?/p>

return語(yǔ)句只能用于函數(shù)中,它使得函數(shù)運(yùn)行結(jié)束,并向主調(diào)函數(shù)傳回“表達(dá)式”的值。函數(shù)的返回值是通過(guò)return語(yǔ)句來(lái)獲得的。函數(shù)返回值應(yīng)具有確定的類(lèi)型。應(yīng)當(dāng)在定義函數(shù)時(shí)獲得。注:如果函數(shù)返回值的類(lèi)型是void,則不能有“表達(dá)式”,其它情形應(yīng)該提供“表達(dá)式”。理論上“表達(dá)式”的類(lèi)型應(yīng)該與函數(shù)定義的類(lèi)型相同,如果不同。則C語(yǔ)言以函數(shù)定義的類(lèi)型為準(zhǔn)自動(dòng)進(jìn)行類(lèi)型轉(zhuǎn)換。②函數(shù)返回值方法return語(yǔ)句函數(shù)返回值建議:函數(shù)用return語(yǔ)句確定表示函數(shù)執(zhí)行結(jié)束,且返回值。沒(méi)有返回值的函數(shù)應(yīng)該定義類(lèi)型為:void。使用強(qiáng)制類(lèi)型轉(zhuǎn)換代替可能的自動(dòng)類(lèi)型轉(zhuǎn)換。

return語(yǔ)句的表達(dá)式用()使程序更清楚。函數(shù)返回值的分析:當(dāng)函數(shù)調(diào)用結(jié)束后,返回值將通過(guò)“中間量”或地址(指針)傳遞返回。如果使用“中間量”,則函數(shù)返回后應(yīng)立即引用該“中間量”,否則函數(shù)返回值將不在存在。例如:u=func(12,12);←立即引用函數(shù)返回值

func(12,12);←不引用函數(shù)返回值函數(shù)被定義為基本類(lèi)型,都是采用“中間量”進(jìn)行值傳遞返回。如果函數(shù)被定義為復(fù)雜的構(gòu)造類(lèi)型,則返回值借助指針進(jìn)行值傳遞返回

一個(gè)函數(shù)調(diào)用另一函數(shù):⑴調(diào)用函數(shù)必須存在(函數(shù)庫(kù)內(nèi)),否則將在連接時(shí)出錯(cuò)。例如:intmain(){printF("Hello!\n");return0;}⑵如果使用庫(kù)函數(shù),一般應(yīng)該在本文件的開(kāi)頭用#include命令將調(diào)用有關(guān)庫(kù)函數(shù)時(shí)用到的信息“包含”到本文件中來(lái)。例如:#include<stdio.h>⑶調(diào)用函數(shù)一般要在調(diào)用前先有明確聲明;其一般形式:函數(shù)返回值類(lèi)型說(shuō)明符被調(diào)用函數(shù)名(形參表);

形參表可以給出形參的數(shù)據(jù)類(lèi)型和形參名,也可以只給出形參的類(lèi)型名。4、函數(shù)聲明和函數(shù)原型

#include<stdio.h>

intmain(){inti;

for(i=0;i<2;i++)print();putchar('\n');return0;}voidprint(){putchar('*');}#include<stdio.h>intmain(){

inti;

for(i=0;i<2;i++)print();putchar('\n');return0;}voidprint(){putchar('*');}說(shuō)明語(yǔ)句的位置應(yīng)該在函數(shù)定義之前。函數(shù)說(shuō)明語(yǔ)句既可以置于函數(shù)外,也可以置于函數(shù)內(nèi)。voidprint();voidprint();4、函數(shù)聲明和函數(shù)原型

4、函數(shù)聲明和函數(shù)原型

C語(yǔ)言中有三種情況可以省略函數(shù)的說(shuō)明:⑴被調(diào)用函數(shù)的定義出現(xiàn)在調(diào)用它的函數(shù)之前。#include<stdio.h>voidprint(){putchar('*');}intmain(){inti,j;

for(i=0;i<2;i++){for(j=0;j<3;j++)print();putchar('\n');}return0;}⑵如果被調(diào)用函數(shù)的返回值是整型或字符型。⑶對(duì)C編譯提供的庫(kù)函數(shù)的調(diào)用不需要再作函數(shù)說(shuō)明,但必須把該函數(shù)的頭文件用#include命令包含在源程序的最前面。

【例3-13】定義一個(gè)雙精度型函數(shù)求兩個(gè)雙精度實(shí)數(shù)的和。doubleadd(doublex,doubley){doublez;z=x+y;

return(z);}#include<stdio.h>doubleadd(double,double);intmain(){doublea,b,sum;printf("請(qǐng)輸入兩個(gè)實(shí)數(shù)a和b(用逗號(hào)分隔):");scanf("%lf,%lf",&a,&b);sum=add(a,b);printf("\n%f+%f=%f",a,b,sum);return0;}5、函數(shù)的嵌套調(diào)用

在C語(yǔ)言中,把函數(shù)調(diào)用也作為一個(gè)表達(dá)式。因此凡是表達(dá)式可以出現(xiàn)的地方都可以出現(xiàn)函數(shù)調(diào)用。例如:①welcome();

②if(iabs(a)>max)max=iabs(a);

③m=max(c,max(a,b));C語(yǔ)言中不允許作嵌套的函數(shù)定義。因此各函數(shù)之間是平行的,不存在上一級(jí)函數(shù)和下一級(jí)函數(shù)的問(wèn)題。但是C語(yǔ)言允許在一個(gè)函數(shù)的定義中出現(xiàn)對(duì)另一個(gè)函數(shù)的調(diào)用。這樣就出現(xiàn)了函數(shù)的嵌套調(diào)用。#include<stdio.h>intsub1(intm,intn){return(m>n?m:n);}intsub2(intx,inty){x=110;

return(sub1(x,y));}intmain(){inta=45,b=120,c;c=sub2(a,b);printf(“c=%d\n”,c);return0;}例如:其調(diào)用過(guò)程可以圖示如下:【例3-14】使用函數(shù)的嵌套調(diào)用實(shí)現(xiàn)求12+22+32+…+n2,其中n由用戶鍵盤(pán)輸入。intSquare(intx){}return(x*x);intSum(intn){}inti,sum=0;for(i=1;i<n;i++)sum=sum+Square(i);return(sum);intmain(){}intn;printf(“請(qǐng)輸入一個(gè)整數(shù):");scanf("%d",&n);printf("1到%d的平方和:%d\n",n,Sum(n));#include<stdio.h>return0;222習(xí)題:以下程序的輸出結(jié)果是()func2(inta,intb){intc;c=a*b%3;return(c);}func1(inta,intb){intc;a+=a;b+=b;c=func2(a,b);return(c*c);}intmain(){intx=7,y=17;printf("%d\n".func1(x,y));return0;}A.7B.17.C.4D.0Cmainfunc1func2xy717a7b17c1434ab34c1414*34%33.3.3知識(shí)擴(kuò)展:知識(shí)擴(kuò)展:Hanoi(漢諾)塔問(wèn)題。

古代有一個(gè)梵塔,塔內(nèi)有三個(gè)座A、B、C,開(kāi)始時(shí),A座上有64個(gè)盤(pán)子,盤(pán)子大小不等,大的在下,小的在上,如圖3-9所示,有一個(gè)老和尚想把64個(gè)盤(pán)子從A座移到C座,但每次只允許移動(dòng)一個(gè)盤(pán)子,且在移動(dòng)過(guò)程中在3個(gè)座上都始終保持大盤(pán)在下,小盤(pán)在上。在移動(dòng)過(guò)程中可以利用B座,要求編程序輸出移動(dòng)步驟。①將A的4個(gè)頂盤(pán)假想成1個(gè)頂盤(pán),則②向右移動(dòng)A的頂盤(pán)到B③向右移動(dòng)A的底盤(pán)到C④向右移動(dòng)B的底盤(pán)到CABC

即,將五個(gè)盤(pán)移動(dòng)的原始問(wèn)題分解成一個(gè)盤(pán)移動(dòng)的基本問(wèn)題和有待解決的四個(gè)盤(pán)移動(dòng)的新問(wèn)題,再對(duì)新問(wèn)題逐步分解,直至基本問(wèn)題。函數(shù)的遞歸調(diào)用

遞歸調(diào)用:一個(gè)函數(shù)直接或間接地調(diào)用了它本身,就稱(chēng)為函數(shù)的遞歸調(diào)用。遞歸函數(shù):在函數(shù)體內(nèi)調(diào)用該函數(shù)本身。

綜上所述,用遞歸解決問(wèn)題應(yīng)分為兩部分:一部分屬于基本問(wèn)題,對(duì)它可以直接求出結(jié)果;另一部分稱(chēng)為新問(wèn)題,雖然不是基本問(wèn)題,但是與原始問(wèn)題類(lèi)似并且比原始問(wèn)題簡(jiǎn)單一些。對(duì)稍微簡(jiǎn)單一些的新問(wèn)題繼續(xù)進(jìn)行分解,直至達(dá)到僅有基本問(wèn)題。解決完基本問(wèn)題后,函數(shù)會(huì)沿著調(diào)用順序不斷給上一次的調(diào)用返回結(jié)果,直至原始問(wèn)題。

求解遞歸問(wèn)題有兩個(gè)過(guò)程:第一個(gè)過(guò)程是遞歸調(diào)用,從原始問(wèn)題出發(fā),層層向下,直至基本問(wèn)題;第二個(gè)過(guò)程是返回過(guò)程,從基本問(wèn)題出發(fā),層層向上返回,直至原始問(wèn)題。intmain(){intm;printf("inputthenumberofdiskes:");scanf("%d",&m);printf("thesteptomoving%3ddiskes:\n",m);hanoi(m,'A','B','C');return0;}voidmove(charx,chary){printf("%c%c\n",x,y);}voidhanoi(intn,charone,chartwo,charthree){if(n==1)move(one,three);else{hanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three);}voidhanoi(intn,charone,chartwo,charthree){if(n==1)move(one,three);else{hanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three);}2ABC1ACB1BACvoidhanoi(intn,charone,chartwo,charthree){if(n==1)move(one,three);else{hanoi(n-1,one,three,two);move(one,three);hanoi(n-1,two,one,three);}1ACBA→CA→BB→C1BAC例:編一遞歸函數(shù)求n!。longfac(intn){inti;longfc=1;if(n==0)return(1);elsereturn(n*fac(n-1));}intmain(){intn;scanf("%d",&n);printf("%d!=%d\n",fac(n);return0;}

#include<stdio.h>假定n=5,則調(diào)用過(guò)程為:2*11fac(5)5*fac(4)4*fac(3)3*fac(2)2*fac(1)3*24*65*24120遞歸與迭代的比較:有的問(wèn)題不僅可以用遞歸方法解決,也可以用迭代方法解決。下面我們分別寫(xiě)出階乘的迭代程序和遞歸程序進(jìn)行分析。分析:根據(jù)上面左邊的迭代程序可以看出,它是從基本問(wèn)題出發(fā),由前向后,由簡(jiǎn)單到復(fù)雜,每一步都得出一個(gè)確定的值,作為下一步計(jì)算的基礎(chǔ),最后得到所求問(wèn)題的解。longfac(intn){inti;longfc=1;if(n==0);elsefor(i=1;i<=n;i++)

溫馨提示

  • 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)論