《C語(yǔ)言程序設(shè)計(jì)d》課件-第五講-數(shù)組_第1頁(yè)
《C語(yǔ)言程序設(shè)計(jì)d》課件-第五講-數(shù)組_第2頁(yè)
《C語(yǔ)言程序設(shè)計(jì)d》課件-第五講-數(shù)組_第3頁(yè)
《C語(yǔ)言程序設(shè)計(jì)d》課件-第五講-數(shù)組_第4頁(yè)
《C語(yǔ)言程序設(shè)計(jì)d》課件-第五講-數(shù)組_第5頁(yè)
已閱讀5頁(yè),還剩88頁(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ì)算機(jī)學(xué)院1引言西安電子科技大學(xué)計(jì)算機(jī)學(xué)院2簡(jiǎn)單問(wèn)題:求4個(gè)整數(shù)的最大值如何表示4個(gè)整數(shù)?如何求出最大值?intmain(){inta1=75,a2=78,a3=91,a4=80;intmax=a1;

if(a2>max)max=a2;if(a3>max)max=a3;if(a4>max)max=a4;printf("max=%d\n",max);return0;}用4個(gè)整數(shù)變量逐一比較這4個(gè)變量西安電子科技大學(xué)計(jì)算機(jī)學(xué)院3引申:求n(n>100)個(gè)整數(shù)的最大值如果仍然采用前面的方法存在什么問(wèn)題?intmain(){inta1=80,a2=75,…,an=88;intmax=a1;

if(a2>max)max=a2;if(a3>max)max=a3;…if(an>max)max=an;printf("max=%d\n",max);return0;}多個(gè)整數(shù)變量表示繁瑣用于比較的代碼冗長(zhǎng)西安電子科技大學(xué)計(jì)算機(jī)學(xué)院4解決前面問(wèn)題的思路:將n個(gè)同類型變量以整體的形式表示能夠以簡(jiǎn)單的方式訪問(wèn)整體中的每個(gè)元素已具備的知識(shí)每個(gè)變量在內(nèi)存中都有對(duì)應(yīng)的地址,知道該地址就可以訪問(wèn)變量每個(gè)變量占據(jù)的內(nèi)存大小只取決于變量類型西安電子科技大學(xué)計(jì)算機(jī)學(xué)院5一種可能的解決方式假設(shè)n個(gè)同類型變量在內(nèi)存中連續(xù)存放,依次編號(hào)為0,1,2,…n-1已知第一個(gè)變量的內(nèi)存地址為a每個(gè)變量占據(jù)的內(nèi)存大小為SIZE任意一個(gè)編號(hào)為i的變量對(duì)應(yīng)的地址ai可以通過(guò)以下公式計(jì)算:ai=a+i×SIZE…aa1a2a3an-1西安電子科技大學(xué)計(jì)算機(jī)學(xué)院6需要解決的問(wèn)題如何才能讓一組同類型變量連續(xù)存放?第一個(gè)變量的地址如何得到?能否直接通過(guò)編號(hào)引用任意一個(gè)變量,而將變量地址計(jì)算及通過(guò)地址訪問(wèn)變量的操作隱含在編號(hào)中?解決以上問(wèn)題需要引入一個(gè)新的概念

——數(shù)組西安電子科技大學(xué)計(jì)算機(jī)學(xué)院7主要內(nèi)容數(shù)組定義和使用排序算法二維和多維數(shù)組函數(shù)與數(shù)組字符數(shù)組和字符串西安電子科技大學(xué)計(jì)算機(jī)學(xué)院89.1數(shù)組定義和使用西安電子科技大學(xué)計(jì)算機(jī)學(xué)院9定義數(shù)組的方法語(yǔ)法:元素類型數(shù)組名稱[元素個(gè)數(shù)];元素類型可以是任意類型數(shù)組名稱(數(shù)組變量)必須是合法標(biāo)識(shí)符數(shù)組元素個(gè)數(shù)必須是常量表達(dá)式//包含100個(gè)實(shí)數(shù)元素的數(shù)組floatscore[100];

//包含20個(gè)字符元素的數(shù)組charname[20];

10數(shù)組在內(nèi)存中的實(shí)現(xiàn)數(shù)組名是一個(gè)內(nèi)存地址(不可修改),稱為數(shù)組首地址數(shù)組元素從首地址開(kāi)始連續(xù)存放取數(shù)組首地址的三種方法取數(shù)組名對(duì)應(yīng)的值a取數(shù)組名的地址&a取第一個(gè)元素的地址&a[0]數(shù)組不能整體賦值inta[8],b[8];a=b;//錯(cuò)誤inta[5];?第1個(gè)元素????0x10000x10040x10080x100C0x1010地址數(shù)組元素第2個(gè)元素第3個(gè)元素第4個(gè)元素第5個(gè)元素11訪問(wèn)數(shù)組元素訪問(wèn)數(shù)組元素的方法:數(shù)組名[下標(biāo)]數(shù)組下標(biāo)從0開(kāi)始計(jì)數(shù),最后一個(gè)元素下標(biāo)是數(shù)組大小-1下標(biāo)可以是常數(shù)、變量和表達(dá)式,但計(jì)算結(jié)果必須是整數(shù)每個(gè)數(shù)組元素都是一個(gè)變量,可以賦值或取值通過(guò)數(shù)組名和下標(biāo)引用數(shù)組元素的本質(zhì)是:&a[i]=a

+i×sizeof(a[0])inta[5],i;a[4]=0;for(i=0;i<4;i++){a[i]=i;

a[4]+=a[i];}西安電子科技大學(xué)計(jì)算機(jī)學(xué)院12數(shù)組初始化數(shù)組元素和變量一樣應(yīng)該先初始化再使用方法1:先定義數(shù)組,然后用循環(huán)初始化每個(gè)元素inta[4],i;for(i=0;i<4;i++)

a[i]=i;

13數(shù)組初始化方法2:在定義數(shù)組時(shí)指定元素的初始值格式:所有初值用大括號(hào)包圍,逗號(hào)分隔inta[5]={0,1,2};a[0]=0a[1]=1a[2]=2a[3]=0a[4]=0數(shù)組大小大于初值個(gè)數(shù)時(shí),其余元素用0初始化inta[4]={0,1,2,3};a[0]=0a[1]=1a[2]=2a[3]=3數(shù)組大小和初值個(gè)數(shù)相同時(shí),一一對(duì)應(yīng)初始化inta[]={0,1,2,3};a[0]=0a[1]=1a[2]=2a[3]=3不指定數(shù)組大小時(shí),數(shù)組大小和初值個(gè)數(shù)相同西安電子科技大學(xué)計(jì)算機(jī)學(xué)院14數(shù)組初始化初始化數(shù)組時(shí)易犯的錯(cuò)誤使用方法1時(shí),數(shù)組下標(biāo)越界使用方法2時(shí)初值個(gè)數(shù)大于數(shù)組元素個(gè)數(shù)inta[3]={0,1,2,3};編譯錯(cuò)誤inta[4],i;for(i=0;i<8;i++)a[i]=i;當(dāng)數(shù)組下標(biāo)大于等于數(shù)組元素個(gè)數(shù)時(shí),編譯不會(huì)出錯(cuò),但運(yùn)行時(shí)通常會(huì)出現(xiàn)內(nèi)存訪問(wèn)錯(cuò)誤西安電子科技大學(xué)計(jì)算機(jī)學(xué)院15例1:求100個(gè)整數(shù)的最大值//不使用數(shù)組的程序intmain(){inta1=80,a2=75,…,a100=88;intmax=a1;

if(a2>max)max=a2;if(a3>max)max=a3;…if(a100>max)max=a100;printf("max=%d\n",max);return0;}//使用數(shù)組的程序intmain(){inta[100]={/*初值*/};intmax=a[0],i;

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

printf("max=%d\n",max);return0;}表示多個(gè)整數(shù)用于比較的代碼西安電子科技大學(xué)計(jì)算機(jī)學(xué)院16例2:找出數(shù)組中最小元素所在的位置//使用數(shù)組的程序intmain(){inta[100]={/*初值*/};intk=0,i;//k記錄最小元素所在的位置

for(i=1;i<100;i++)if(a[i]<a[k])k=i;

printf(“minimumelementindexis%d\n",k);return0;}西安電子科技大學(xué)計(jì)算機(jī)學(xué)院17例3:計(jì)算Fibonacci數(shù)列的前40項(xiàng)F(0)=1F(1)=1F(n)=F(n-1)+F(n-2)n>1F[0]=1F[1]=1F[n]=F[n-1]+F[n-2]n>1如果把圓括號(hào)換成方括號(hào)?這其實(shí)就是數(shù)組的表示方式西安電子科技大學(xué)計(jì)算機(jī)學(xué)院18例3:計(jì)算Fibonacci數(shù)列的前40項(xiàng)intmain(){

intF[40]={1,1};

//F(0)=1,F(1)=1

int

i;for(i=2;i<40;i++){//i>1時(shí),F(xiàn)(i)=F(i-1)+F(i-2)

F[i]=F[i-1]+F[i-2];printf("F(%d)=%d\n",i,F[i]);//輸出F(i)}return0;}西安電子科技大學(xué)計(jì)算機(jī)學(xué)院19例4:求下圖所示的折線長(zhǎng)度折線長(zhǎng)度=多條線段長(zhǎng)度之和求線段長(zhǎng)度的公式:可以利用循環(huán)完成求和每個(gè)點(diǎn)的坐標(biāo)可以用數(shù)組存儲(chǔ)yx(0,1)(2,2)(3,2)(4,1)(6,1)西安電子科技大學(xué)計(jì)算機(jī)學(xué)院20intmain(){

doublex[5]={0,2,3,4,6};doubley[5]={1,2,2,1,1};doublepolyline_len=0;inti;for(i=0;i<4;i++){polyline_len+=sqrt(pow(x[i]-x[i+1],2)+pow(y[i]-y[i+1],2);}printf(“polylinelength=%f\n”,polyline_len);return0;}例4:求折線長(zhǎng)度西安電子科技大學(xué)計(jì)算機(jī)學(xué)院21例5查找指定元素寫(xiě)一個(gè)程序,判斷一個(gè)整數(shù)n是否在一個(gè)整數(shù)數(shù)組a中出現(xiàn)。如果出現(xiàn),輸出第一次出現(xiàn)位置的下標(biāo),不出現(xiàn)輸出-1。思路:掃描整數(shù)數(shù)組中的每個(gè)整數(shù)a[i],如果a[i]等于給定的整數(shù)n,記錄i,否則比較下一個(gè)整數(shù),直到數(shù)組結(jié)束#include<stdio.h>intmain(){ inta[]={1,2,3,4,5,6,7,8,9,0}; intn=5;//n=10; inti=0; for(i=0;i<10;i++){

if(a[i]==n)break; } if(i<10) printf("pos=%d\n",i); else printf("pos=-1\n"); return0;}西安電子科技大學(xué)計(jì)算機(jī)學(xué)院23排序算法問(wèn)題:輸入100個(gè)學(xué)生的成績(jī),按從高到低排序后輸出100個(gè)學(xué)生成績(jī)可以用一個(gè)具有100個(gè)元素的數(shù)組表示如何對(duì)數(shù)組元素排序?西安電子科技大學(xué)計(jì)算機(jī)學(xué)院24排序算法排序算法應(yīng)用廣泛排序算法是很多算法的基礎(chǔ)二分查找排序算法的種類?選擇排序、起泡排序(O(n2))快速排序、歸并排序、堆排序(O(n*Logn))排序算法的核心是比較和交換西安電子科技大學(xué)計(jì)算機(jī)學(xué)院25選擇排序算法第1

趟在n個(gè)元素中選取最小元素作為有序序列的第1個(gè)元素第2

趟在n-1個(gè)元素中選取最小元素作為有序序列的第2個(gè)元素第i

趟在n-i+1個(gè)元素中選取最小的元素作為有序序列中的第i個(gè)元素。…1234*32296445347826inta[100];inti,j,k,t,n=100;//外層循環(huán)重復(fù)n-1次for(i=0;i<n-1;i++){

//循環(huán)體內(nèi)找到第i小的元素,放在數(shù)組的位置i

}for(j=i+1,k=i;j<n;j++)if(a[j]<a[k])k=j;

if(k!=i){t=a[i];a[i]=a[k];a[k]=t;}找出[i..n]中最小值對(duì)應(yīng)的下標(biāo)k如果最小值不是第i個(gè)元素則將a[i]和a[j]交換西安電子科技大學(xué)計(jì)算機(jī)學(xué)院27起泡排序算法起泡排序(BubbleSorting)的基本思想是:將相鄰位置的元素進(jìn)行比較,若為逆序則交換之。若在一趟排序過(guò)程中沒(méi)有進(jìn)行過(guò)交換記錄的操作,則整個(gè)排序過(guò)程終止。無(wú)序序列R[1..n-i+1]有序序列R[n-i+2..n]n-i+1無(wú)序序列R[1..n-i]有序序列R[n-i+1..n]比較相鄰記錄,將值最大的元素交換到n-i+1的位置上第i趟起泡排序28初始數(shù)組4938659776132749*0123456738496576132749*97第一趟排序后384965132749*7697第二趟排序后3849132749*657697第三趟排序后3813274949*657697第四趟排序后1327384949*657697第五趟排序后1327384949*657697第六趟排序后起泡排序過(guò)程示例西安電子科技大學(xué)計(jì)算機(jī)學(xué)院29inta[10],i,j,change,t,n=10;

for(i=0,change=1;i<n&&change;++i){}

change=0;

//一趟排序過(guò)程中是否進(jìn)行了元素交換for(j=0;j<n-i-1;++j){if(a[j]>a[j+1]){//需要交換相鄰元素t=a[j];a[j]=a[j+1];a[j+1]=t;

change=1;

}}起泡排序算法西安電子科技大學(xué)計(jì)算機(jī)學(xué)院30排序算法示例給定N個(gè)不同的整數(shù),要求對(duì)這N個(gè)整數(shù)按如下規(guī)則排序并輸出。規(guī)則一:所有的偶數(shù)排在奇數(shù)前面。規(guī)則二:在規(guī)則一的前提下按照從大到小的順序排序。排序算法示例方法1輸入數(shù)據(jù)時(shí)將偶數(shù)和奇數(shù)分別放在兩個(gè)數(shù)組中對(duì)偶數(shù)數(shù)組從大到小排序,然后輸入對(duì)奇數(shù)數(shù)組從大到小排序,然后輸入西安電子科技大學(xué)計(jì)算機(jī)學(xué)院31intodd[100],even[100];intn,i,even_count=0,odd_count=0;scanf(“%d”,&n);for(i=0;i<n;i++){intv;scanf(“%d”,&v);

if(v%2==0)even[even_count++]=v;elseodd[odd_count++]=v;}…排序算法示例方法2定義比較規(guī)則偶數(shù)大于奇數(shù)同為偶數(shù)或奇數(shù)時(shí)正常比較大小按定義的規(guī)則進(jìn)行排序西安電子科技大學(xué)計(jì)算機(jī)學(xué)院32//compare函數(shù)比較x和y的大小關(guān)系//如果x大于y返回正數(shù)//如果x小于y返回負(fù)數(shù)//如果x等于y返回0intcompare(intx,inty){if((x%2)==0&&(y%2)!=0)return1;elseif((x%2)!=0&&(y%2)==0)return-1;elsereturn(x-y);}多關(guān)鍵字排序示例1:世界杯排序規(guī)則1.積分2.凈勝球…示例2:撲克牌花色數(shù)字西安電子科技大學(xué)計(jì)算機(jī)學(xué)院33多關(guān)鍵字排序需要能夠用一個(gè)整體表示一條記錄,同時(shí)能訪問(wèn)一條記錄的各個(gè)字段。比較時(shí)可以逐一比較需要排序的各個(gè)字段交換時(shí)可以交換整條記錄西安電子科技大學(xué)計(jì)算機(jī)學(xué)院34西安電子科技大學(xué)計(jì)算機(jī)學(xué)院34練習(xí)寫(xiě)一個(gè)程序?qū)?shù)組x中的整數(shù)以相反順序復(fù)制到數(shù)組y中(也就是y[0]中保存x[n-1],…,y[n-1]中保存x[0])12,15,67,23,55,4444,55,23,67,15,12xy西安電子科技大學(xué)計(jì)算機(jī)學(xué)院359.2二維數(shù)組一維數(shù)組處理線性結(jié)構(gòu)二維數(shù)組可以處理矩陣?yán)纾阂环?00×600的圖像或一個(gè)行列式C語(yǔ)言對(duì)二維數(shù)組的表示定義二維數(shù)組:類型數(shù)組名[行數(shù)][列數(shù)]36也可以認(rèn)為a是一個(gè)3個(gè)元素的一維數(shù)組,每個(gè)元素都是有4個(gè)元素的一維數(shù)組inta[3][4];//定義一個(gè)三行四列的二維數(shù)組

C語(yǔ)言對(duì)二維數(shù)組的表示C語(yǔ)言二維數(shù)組在內(nèi)存中的表示內(nèi)存是一維線性編址,沒(méi)有行列的概念在內(nèi)存中依次存放二維數(shù)組的每一行3701234567891011第一行a[0]第二行a[1]第三行a[2]0x10000x102C連續(xù)線性編址a[1][3]a[0][1]a[2][3]a[1][0]a[2][0]a[2][1]a[2][2]a[0][0]a[1][2]a[1][1]a[0][3]a[0][2]西安電子科技大學(xué)計(jì)算機(jī)學(xué)院38二維數(shù)組的使用用行下標(biāo)和列下標(biāo)引用單個(gè)元素,行列下標(biāo)都從0開(kāi)始計(jì)數(shù)a[i][j]表示二維數(shù)組a的第i行第j列的元素j=0123i=012a[1][2]a[2][2]西安電子科技大學(xué)計(jì)算機(jī)學(xué)院39二維數(shù)組初始化方法1:按行初始化inta[2][3]={{1,2,3},{4,5,6}}inta[2][3]={{1,2,3}}inta[2][3]={{1,2},{4,5}}每一對(duì)大括號(hào)內(nèi)是一行的初值,初值個(gè)數(shù)不足時(shí)用0初始化西安電子科技大學(xué)計(jì)算機(jī)學(xué)院40二維數(shù)組初始化方法2:將二維數(shù)組當(dāng)作一維數(shù)組初始化inta[2][3]={1,2,3,4,5,6}inta[2][3]={1,2,3,4}大括號(hào)內(nèi)是整個(gè)二維數(shù)組的初值,按照行序依次賦值,初值個(gè)數(shù)不足時(shí)用0初始化西安電子科技大學(xué)計(jì)算機(jī)學(xué)院41二維數(shù)組初始化方法3:省略第一維大小inta[][3]={1,2,3,4,5,6}inta[][3]={{1,2,3},{4,5}}定義二維數(shù)組時(shí),如果有初值,可以省略第一維大?。ㄐ袛?shù)),但不能省略第二維大小(列數(shù)),行數(shù)根據(jù)初始值個(gè)數(shù)計(jì)算定義二維數(shù)組時(shí),如果有沒(méi)有初值,第一維大?。ㄐ袛?shù))和第二維大?。袛?shù))都不能省略西安電子科技大學(xué)計(jì)算機(jī)學(xué)院42二維數(shù)組的使用示例1:求一個(gè)方陣的主/輔對(duì)角線之和inta[3][3]={…};intsum=0,i;for(i=0;i<3;i++){sum+=a[i][i];}inta[3][3]={…};intsum=0,i;for(i=0;i<3;i++){sum+=a[i][2-i];}231125789302010210210西安電子科技大學(xué)計(jì)算機(jī)學(xué)院43二維數(shù)組的使用示例2:寫(xiě)一個(gè)程序,找出給定矩陣的馬鞍點(diǎn)。若一個(gè)矩陣中的某元素是其所在行的最小值,并且是其所在列的最大值,則該元素為矩陣的一個(gè)馬鞍點(diǎn),如果找到輸出對(duì)應(yīng)的行和列,找不到輸出“no”

馬鞍點(diǎn),行為1,列為1西安電子科技大學(xué)計(jì)算機(jī)學(xué)院44二維數(shù)組的使用思路:(假設(shè)矩陣為a)Step1:初始化行號(hào)row=0Step2:找出第row行最小元素及其所在列下標(biāo)colStep3:然后檢查元素a[row][col]是不是所在列上的最大值,是則輸出行列坐標(biāo),行號(hào)row遞增重復(fù)步驟2和3直到所有行檢查完馬鞍點(diǎn),行為1,列為145示例2偽代碼for(row=0;row<行數(shù);row++){//外層循環(huán)處理每一行找到一行的最小值對(duì)應(yīng)的列下標(biāo)col,則當(dāng)前行值最小的元素是a[row][col]

//內(nèi)層循環(huán)處理一列

for(i=0;i<行數(shù);i++){

判斷a[row][col]是不是這一列中最大的值}if(是馬鞍點(diǎn)){輸出行列坐標(biāo)馬鞍點(diǎn)個(gè)數(shù)遞增

}}if(馬鞍點(diǎn)個(gè)數(shù)==0)輸出"no"西安電子科技大學(xué)計(jì)算機(jī)學(xué)院46二維數(shù)組的使用示例3:圖像的灰度直方圖一幅m×n的灰度圖像可以用一個(gè)二維矩陣表示,矩陣中的每個(gè)元素表示對(duì)應(yīng)像素的灰度值?!盎叶戎狈綀D”以圖像中每種灰度級(jí)的象素個(gè)數(shù)來(lái)反映圖像中每種灰度出現(xiàn)的頻率灰度圖像灰度直方圖intmain(){intimg[256][256];//表示圖像的數(shù)組inta[256]={0};//統(tǒng)計(jì)出現(xiàn)次數(shù)的數(shù)組intm,n,k,i,j;scanf("%d%d%d",&m,&n,&k);for(i=0;i<n;i++){for(j=0;j<m;j++){scanf("%d",&img[i][j]);

a[img[i][j]]++;}}for(i=0;i<k;i++)printf("%d%d\n",i,a[i]);return0;}灰度圖像灰度直方圖西安電子科技大學(xué)計(jì)算機(jī)學(xué)院489.3數(shù)組與函數(shù)需要討論的問(wèn)題數(shù)組元素能否作為函數(shù)參數(shù)?數(shù)組能否作為函數(shù)參數(shù)?數(shù)組能否作為函數(shù)返回值?西安電子科技大學(xué)計(jì)算機(jī)學(xué)院49數(shù)組元素作為函數(shù)參數(shù)數(shù)組元素是一個(gè)變量,可以出現(xiàn)在任何普通變量能出現(xiàn)的地方作為表達(dá)式的一部分參與運(yùn)算作為函數(shù)調(diào)用的實(shí)際參數(shù)西安電子科技大學(xué)計(jì)算機(jī)學(xué)院50示例:求下圖所示的折線長(zhǎng)度折線長(zhǎng)度=多條線段長(zhǎng)度之和求線段長(zhǎng)度的公式:可以利用循環(huán)完成求和yx(0,1)(2,2)(3,2)(4,1)(6,1)西安電子科技大學(xué)計(jì)算機(jī)學(xué)院51intmain(){

doublex[5]={0,2,3,4,6};doubley[5]={1,2,2,1,1};doublepolyline_len=0;inti;for(i=0;i<4;i++){polyline_len+=sqrt(pow(x[i]-x[i+1],2)+pow(y[i]-y[i+1],2);}printf(“polylinelength=%f\n”,polyline_len);return0;}不使用函數(shù)求折線長(zhǎng)度如何用函數(shù)實(shí)現(xiàn)求線段長(zhǎng)度?用函數(shù)line_len求線段長(zhǎng)度:西安電子科技大學(xué)計(jì)算機(jī)學(xué)院52doubleline_len(doublex1,//第一個(gè)點(diǎn)x坐標(biāo)doubley1,//第一個(gè)點(diǎn)y坐標(biāo)doublex2,//第二個(gè)點(diǎn)x坐標(biāo)doubley2)//第二個(gè)點(diǎn)y坐標(biāo){returnsqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}數(shù)組元素作為函數(shù)參數(shù)在主函數(shù)中如何調(diào)用該函數(shù)?西安電子科技大學(xué)計(jì)算機(jī)學(xué)院53intmain(){

doublex[5]={0,2,3,4,6};doubley[5]={1,2,2,1,1};doublepolyline_len=0;inti;for(i=0;i<4;i++){polyline_len+=line_len(x[i],y[i],x[i+1],y[i+1]);}printf(“polylinelength=%f\n”,polyline_len);return0;}數(shù)組元素作為函數(shù)參數(shù)西安電子科技大學(xué)計(jì)算機(jī)學(xué)院54數(shù)組元素作為函數(shù)參數(shù)時(shí)的傳遞數(shù)組元素作為實(shí)參就是把數(shù)組元素的值傳遞給形參02346x[0]x[1]x[2]x[3]x[4]12211y[0]y[1]x[2]y[3]y[4]0212x1x2y1y2main函數(shù)數(shù)據(jù)區(qū)line_len函數(shù)數(shù)據(jù)區(qū)西安電子科技大學(xué)計(jì)算機(jī)學(xué)院55用函數(shù)求折線段長(zhǎng)度數(shù)組可以表示一組數(shù)據(jù),而且可以單獨(dú)操作每個(gè)元素,考慮用數(shù)組作為函數(shù)參數(shù)用數(shù)組作為函數(shù)參數(shù)需要解決的問(wèn)題1.定義函數(shù)時(shí)如何定義數(shù)組類型的參數(shù)?2.調(diào)用函數(shù)時(shí)如何傳入實(shí)際的數(shù)組?3.實(shí)參數(shù)組和形參數(shù)組的關(guān)系?西安電子科技大學(xué)計(jì)算機(jī)學(xué)院56用函數(shù)求折線段長(zhǎng)度doublepolyline_len(…){…}intmain(){doubleco_x[5],co_y[5];

doublelen=polyline_len(…);printf(“polylinelength=%f\n”,len);return0;}如何定義數(shù)組參數(shù),需要定義數(shù)組大小嗎?如何傳入實(shí)際數(shù)組,數(shù)組元素值和元素個(gè)數(shù)如何傳遞?西安電子科技大學(xué)計(jì)算機(jī)學(xué)院57回顧數(shù)組的特點(diǎn)數(shù)組名是數(shù)組首地址,數(shù)組元素連續(xù)存放通過(guò)下標(biāo)和首地址可以計(jì)算任何一個(gè)數(shù)組元素的地址只要將數(shù)組首地址(數(shù)組變量名)傳入函數(shù),那么在函數(shù)內(nèi)就可以訪問(wèn)到所有數(shù)組元素為了使數(shù)組元素訪問(wèn)不超出數(shù)組范圍,應(yīng)該明確給出數(shù)組大小&a[i]=a

+i×sizeof(a[0])西安電子科技大學(xué)計(jì)算機(jī)學(xué)院58用函數(shù)來(lái)求折線段長(zhǎng)度doublepoly_len(doublex[],doubley[],intn){doublelen=0.0;inti;for(i=0;i<n-1;i++)len+=sqrt(pow(x[i]-x[i+1],2)+pow(y[i]-y[i+1],2));returnlen;}傳遞數(shù)組首地址的好處是避免復(fù)制大量元素這確實(shí)是一個(gè)數(shù)組嗎?intmain(){

doubleco_x[5]={0,2,3,4,6};doubleco_y[5]={1,2,2,1,1};

doublelen=poly_len(co_x,co_y,5);}西安電子科技大學(xué)計(jì)算機(jī)學(xué)院59用數(shù)組作為函數(shù)參數(shù)的本質(zhì)x是函數(shù)內(nèi)的局部變量,x是用指針變量表示的,x的值是數(shù)組首地址,是函數(shù)調(diào)用時(shí)傳入實(shí)際數(shù)組的首地址doublepoly_len(doublex[],doubley[],intn){…}doublepoly_len(double*x,double*y,intn){…}如果x是一個(gè)數(shù)組,那么x=&x=&x[0]實(shí)際的結(jié)果是:x=0x0012fc60&x=0x0012fbfc&x[0]=0x0012fc60doublepolyline_len(doublex[],doubley[],intn){…}intmain(){…polyline_len(co_x,co_y,5)…}0co_x[0]0x0012fc602364co_x[1]co_x[4]co_x0x0012fc60x0x0012fbfcx的內(nèi)存地址值變量co_x[2]co_x[3]poly_len函數(shù)數(shù)據(jù)區(qū)main函數(shù)數(shù)據(jù)區(qū)西安電子科技大學(xué)計(jì)算機(jī)學(xué)院61計(jì)算數(shù)組元素個(gè)數(shù)數(shù)組大小一旦改變,這個(gè)值也要改變,能不能用表達(dá)式計(jì)算出數(shù)組元素個(gè)數(shù)?intmain(){

doubleco_x[5]={0,2,3,4,6};doubleco_y[5]={1,2,2,1,1};

poly_len(co_x,co_y,5);}西安電子科技大學(xué)計(jì)算機(jī)學(xué)院62sizeof運(yùn)算符sizeof運(yùn)算符用于計(jì)算一種類型或一個(gè)變量所占據(jù)的存儲(chǔ)空間數(shù)組元素個(gè)數(shù)=sizeof(數(shù)組)/sizeof(數(shù)組第一個(gè)元素)intn=0,m=0;doubled=3.5;n=sizeof(double);//n=8m=sizeof(d);//m=8inta[6]={0},m=0,n=0,k=0;m=sizeof(a);//m=24n=sizeof(a[0]);//n=4k=m/n;//k=6如果對(duì)數(shù)組變量應(yīng)用sizeof運(yùn)算符得到的是整個(gè)數(shù)組所占據(jù)的存儲(chǔ)空間西安電子科技大學(xué)計(jì)算機(jī)學(xué)院63計(jì)算數(shù)組元素個(gè)數(shù)intmain(){

doubleco_x[6]={0,2,3,4,6,8};doubleco_y[6]={1,2,2,1,1,2};

poly_len(co_x,co_y,sizeof(co_x)/sizeof(co_x[0]);}數(shù)組大小一旦改變,這個(gè)表達(dá)式的值也會(huì)改變西安電子科技大學(xué)計(jì)算機(jī)學(xué)院64對(duì)函數(shù)的數(shù)組參數(shù)應(yīng)用sizeof運(yùn)算符這從另一個(gè)角度證明函數(shù)參數(shù)中的數(shù)組不是一個(gè)真正的數(shù)組。doublepoly_len(doublex[],doubley[],intn){…}sizeof(x)=?sizeof(x)/sizeof(x[0])=?sizeof(x)=4sizeof(x)/sizeof(x[0])=0doublepoly_len(intx[],inty[],intn){…}sizeof(x)=?sizeof(x)/sizeof(x[0])=?sizeof(x)=4sizeof(x)/sizeof(x[0])=1西安電子科技大學(xué)計(jì)算機(jī)學(xué)院65西安電子科技大學(xué)計(jì)算機(jī)學(xué)院數(shù)組作為函數(shù)的輸出參數(shù)用函數(shù)完成折線段坐標(biāo)輸入voidinput(intx[],inty[]intn){inti;for(i=0;i<n;i++)scanf(“%d%d”,&x[i],&y[i]);}intmain(){intco_x[5],co_y[5];

input(co_x,co_y,5);}?co_x[0]0x12f060?…?co_x[1]co_x[4]co_x0x12f060x0x12fbfc內(nèi)存地址值變量input函數(shù)數(shù)據(jù)區(qū)main函數(shù)數(shù)據(jù)區(qū)函數(shù)形參數(shù)組指向?qū)崊?shù)組所在內(nèi)存地址,因此在函數(shù)內(nèi)修改形參數(shù)組就相當(dāng)于修改了實(shí)參數(shù)組西安電子科技大學(xué)計(jì)算機(jī)學(xué)院66數(shù)組與函數(shù)返回值數(shù)組不能作為函數(shù)返回值int[]rand_int(intn){…}intmain(){intrand_num[10];

rand_num=rand_int(10);}數(shù)組不能整體賦值這樣聲明返回值是語(yǔ)法錯(cuò)誤西安電子科技大學(xué)計(jì)算機(jī)學(xué)院67示例1寫(xiě)一個(gè)函數(shù),它判斷一個(gè)整數(shù)n是否在一個(gè)整數(shù)數(shù)組a中出現(xiàn)。如果出現(xiàn),給出第一次出現(xiàn)位置的下標(biāo),不出現(xiàn)給出-1。思路:掃描整數(shù)數(shù)組中的每個(gè)整數(shù)a[i],如果a[i]等于給定的整數(shù)n,記錄i,否則比較下一個(gè)整數(shù),直到數(shù)組結(jié)束#include<stdio.h>intsearch(inta[],intsize,intn){inti=0;for(i=0;i<size;i++){

if(a[i]==n)break;}

returni<size?i:-1;}intmain(){inta[]={1,2,3,4,5,6,7,8,9,0};intn1=5,n2=10;intpos1=search(a,10,n1);intpos2=search(a,10,n2);printf("pos1=%d,pos2=%d\n",pos1,pos2);return0;}函數(shù)參數(shù):a表示待查找的數(shù)組size表示數(shù)組大小n表示待查找整數(shù)示例2用函數(shù)實(shí)現(xiàn)排序算法西安電子科技大學(xué)計(jì)算機(jī)學(xué)院69voidsort(inta[],intn){inti,j,k;for(i=0;i<n-1;i++){for(j=i+1,k=i;j<n;j++)if(a[j]<a[k])k=j;if(i!=k){intt=a[i];a[i]=a[k];a[k]=t;}}}西安電子科技大學(xué)計(jì)算機(jī)學(xué)院70西安電子科技大學(xué)計(jì)算機(jī)學(xué)院70練習(xí)寫(xiě)一個(gè)函數(shù)將數(shù)組x中的整數(shù)顛倒順序12,15,67,23,55,4444,55,23,67,15,12xx調(diào)用函數(shù)西安電子科技大學(xué)計(jì)算機(jī)學(xué)院719.4字符數(shù)組和字符串文字處理是應(yīng)用程序中一個(gè)常用的功能字符數(shù)組就是元素類型是字符的數(shù)組定義方式和普通數(shù)組一樣使用方式和初始化方式也一樣charname[20]={'W','a','n','b','o'};字符數(shù)組name的其余元素用0初始化,不是字符'0',這個(gè)0對(duì)字符串而言有特殊意義西安電子科技大學(xué)計(jì)算機(jī)學(xué)院72從鍵盤(pán)輸入一行字符,保存到字符數(shù)組中#include<stdio.h>intmain(){charline[80]={0};//如果不初始化為0會(huì)導(dǎo)致什么結(jié)果?inti;for(i=0;i<80;i++){scanf("%c",&line[i]);//輸入一個(gè)字符if(line[i]=='\n')break;//輸入字符是換行符時(shí)結(jié)束輸入}

printf(“%s”,line);//輸出字符數(shù)組內(nèi)容return0;}西安電子科技大學(xué)計(jì)算機(jī)學(xué)院73字符串的相關(guān)問(wèn)題字符串是一個(gè)字符數(shù)組加結(jié)束標(biāo)志('\0')定義字符串就是定義一個(gè)字符數(shù)組字符串用字符數(shù)組存儲(chǔ)字符串存儲(chǔ)空間比實(shí)際字符個(gè)數(shù)多1結(jié)束標(biāo)志是為了知道字符串什么時(shí)候結(jié)束字符串長(zhǎng)度是字符數(shù)組中第一個(gè)結(jié)束標(biāo)志前的字符個(gè)數(shù)字符串長(zhǎng)度可能小于字符數(shù)組大小字符數(shù)組中沒(méi)有結(jié)束標(biāo)志時(shí),長(zhǎng)度不確定74字符串初始化方法1:像數(shù)組一樣單獨(dú)指定每個(gè)元素charname[20]={'W','a','n','b','o'};數(shù)組大小為20,字符串長(zhǎng)度為5,其余字符初值為'\0'charname[]={'W','a','n','\0','o'};數(shù)組大小為5,字符串長(zhǎng)度為3charname[5]={'W','a','n','b','o'};數(shù)組大小為5,缺少結(jié)束標(biāo)志'\0',不能當(dāng)作字符串使用charname[]={'W','a','n','b','o'};數(shù)組大小為5,缺少結(jié)束標(biāo)志'\0',不能當(dāng)作字符串使用西安電子科技大學(xué)計(jì)算機(jī)學(xué)院75字符串初始化方法2:用雙引號(hào)括起來(lái)的字符串常量初始化charname[20]="Wanbo";數(shù)組大小為20,字符串長(zhǎng)度為5,其余字符初值為'\0'charname[]="Wanbo";數(shù)組大小為6,字符串長(zhǎng)度為5,自動(dòng)添加結(jié)束標(biāo)志'\0'charname[5]="Wanbo";數(shù)組大小為5,沒(méi)有結(jié)束標(biāo)志'\0',不能當(dāng)作字符串使用西安電子科技大學(xué)計(jì)算機(jī)學(xué)院76字符串使用示例示例1:寫(xiě)一個(gè)程序,求一個(gè)字符串的長(zhǎng)度。intmain(){chars[]=“hello,world”;inti=0;//累加字符串長(zhǎng)度while(s[i]!='\0'){++i;}

returni;}西安電子科技大學(xué)計(jì)算機(jī)學(xué)院77字符串使用示例示例2:寫(xiě)一個(gè)程序,將一個(gè)字符串復(fù)制到一個(gè)字符數(shù)組里(同樣做成字符串)。intmain(){chardst[100],src[]=“hello,world”;inti=0;while(src[i]!='\0'){dst[i]=src[i];++i;}

dst[i]=‘\0’;

//添加結(jié)束標(biāo)志

return0;}注意:dst必須能夠容納src中所有字符和結(jié)束標(biāo)志78字符串使用示例示例2的其他實(shí)現(xiàn)方式。intmain(){chardst[100],src[]=“hello,world”;inti=0;while((dst[i]=src[i])!='\0')++i;return0;}這兩個(gè)程序利用賦值表達(dá)式的值作為循環(huán)結(jié)束條件intmain(){chardst[100],src[]=“hello,world”;inti=0;while(dst[i]=src[i])++i;

return0;}西安電子科技大學(xué)計(jì)算機(jī)學(xué)院79示例3回文是從前向后和從后向前讀起來(lái)都一樣的句子。例如"amanaplanacanalpanama",寫(xiě)一個(gè)函數(shù),夠判斷一個(gè)字符串是否為一個(gè)回文。步驟1:設(shè)兩個(gè)下標(biāo)i和j,i指向第一個(gè)字符,j指向最后一個(gè)字符步驟2:判斷s[i]和s[j]是否相同,相同則i遞增,j遞減,直到i>=j,否則結(jié)束比較(循環(huán)體)#include<stdio.h>#include<STRING.H>inthuiwen(chars[]){ inti=0,j=strlen(s)-1;

while(i<j&&s[i]==s[j]){i++;j--;} returni>=j;//這條語(yǔ)句不屬于for循環(huán)}intmain(){ chars[]="abcba"; if(huiwen(s)) printf("%sishuiwen\n",s); else printf("%sisnothuiwen\n",s);

return0;}西安電子科技大學(xué)計(jì)算機(jī)學(xué)院81示例4寫(xiě)函數(shù)squeeze(chars1[],chars2[]),它從字符串s1中刪除串s2里包含的所有字符(而且保證剩下的字符仍然按照原來(lái)順序連續(xù)排列,形成字符串)。步驟1:掃描s1的每個(gè)字符c,如果c不在s2中則將c存放在一個(gè)臨時(shí)數(shù)組temp中,否則繼續(xù)檢查下一個(gè)字符步驟2:將臨時(shí)數(shù)組temp中的字符復(fù)制到s1中#include<stdio.h>voidsqueeze(chars1[],chars2[]){chartemp[100];inti,j,k=0;for(i=0;s1[i];i++){charc=s1[i];

//判斷c是否在s2中

for(j=0;s2[j]&&c!=s2[j];j++);if(s2[j]==0)

//c不在s2中

temp[k++]=c;}

//將temp復(fù)制到s1for(i=0;i<k;i++)s1[i]=temp[i];

s1[k]=0;}intmain(){chars1[]="abcedfghijkl",s2[]="dhj";printf("s1=%s,s2=%s\n",s1,s2);squeeze(s1,s2);printf("s1=%s\n",s1);return0;}9.5C語(yǔ)言字符串處理庫(kù)函數(shù)西安電子科技大學(xué)計(jì)算機(jī)學(xué)院8384字符串處理庫(kù)函數(shù)需要包含頭文件<string.h>intstrlen(chars[])計(jì)算字符串長(zhǎng)度,返回值表示字符串長(zhǎng)度strcat(chardst[],c

溫馨提示

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