學習c語言教學相關第07講_第1頁
學習c語言教學相關第07講_第2頁
學習c語言教學相關第07講_第3頁
學習c語言教學相關第07講_第4頁
學習c語言教學相關第07講_第5頁
已閱讀5頁,還剩82頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第07講數(shù)組2第九講數(shù)組一維數(shù)組概念定義和聲明初始化使用二維數(shù)組查找和排序程序設計舉例C語言程序設計為什么使用數(shù)組(Array)?【例】要讀入10人的成績,然后求平均成績需定義10個不同名整型變量,需要使用多個scanf()

intscore1,score2,…score10;

scanf("%d",&score1); scanf("%d",&score2);......而用數(shù)組,可共用一個scanf()并利用循環(huán)語句讀取

intscore[10],i; for(i=0;i<10;i++){scanf("%d",&score[i]);

}保存大量同類型的相關數(shù)據(jù)一維數(shù)組的定義和初始化

一維數(shù)組的定義

存儲類型數(shù)據(jù)類型數(shù)組名[整數(shù)1][整數(shù)2]……[整數(shù)n];a[9]a[8]a[7]a[1]a[0]…數(shù)組首地址inta[10];定義一個有10個int型元素的數(shù)組系統(tǒng)在內存分配連續(xù)的10個int空間給此數(shù)組直接對a的訪問,就是訪問此數(shù)組的首地址基類型下標從0開始一維數(shù)組的定義和初始化a[9]a[8]a[7]a[1]a[0]…inta[10];數(shù)組大小必須是值為正的常量,不能為變量一旦定義,不能改變大小數(shù)組大小最好用宏來定義,以適應未來可能的變化 #define

SIZE10inta[SIZE];

一維數(shù)組的定義

存儲類型數(shù)據(jù)類型數(shù)組名[整數(shù)1][整數(shù)2]……[整數(shù)n];一維數(shù)組的定義和初始化數(shù)組定義后的初值仍然是隨機數(shù)一般需要我們來初始化

inta[5]={12,34,56,78,9};inta[5]={0};inta[]={11,22,33,44,55};一維數(shù)組的定義和初始化數(shù)組的引用數(shù)組名

[下標]數(shù)組下標(index)都是從0開始使用a[0]、a[1]、a[2]、……、a[9]這樣的形式訪問每個元素下標既可是常量,也可是整型表達式,允許快速隨機訪問,如a[i]可以像使用普通變量一樣使用它們如何使兩個數(shù)組的值相等?voidmain(){inta[4]={1,2,3,4},b[4];

b=a;

}解決方法方法1:逐個元素賦值

b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];方法2:通過循環(huán)賦值

inti;for(i=0;i<4;i++){

b[i]=a[i];}原因:數(shù)組名表示數(shù)組的首地址,其值不可改變!一維數(shù)組的定義和初始化【例】編程實現(xiàn)顯示用戶輸入的月份(不包括閏年的月份)擁有的天數(shù)輸入驗證循環(huán)一維數(shù)組的定義和初始化下標越界是大忌!編譯程序不檢查是否越界下標越界,將訪問數(shù)組以外的空間那里的數(shù)據(jù)是未知的,不受我們掌控,可能帶來嚴重后果b[0]b[1]b[2]b[3]b[4]b[5]b[6]b[7]b[8]b[9]ca當下標值小于0或超過數(shù)組長度時會出現(xiàn)什么情況?運行程序或單步執(zhí)行觀察變量變化情況可以看到,變量c和a的值因數(shù)組越界而被悄悄破壞了12345612078910114044484c5054585c6064686c求數(shù)組中最大元素及其下標

一維數(shù)組的使用結構化程序設計方法:自上而下,逐步求精劃分成一系列較小的任務1輸入元素到數(shù)組中2循環(huán)比較找出最大值

2.1假設第一個為最大數(shù)max=num[0];

imax=0;

2.2對所有數(shù)進行比較,即

for(i=1;i<n;i++){if(num[i]>max)

{ 則修改max值為num[i];

記錄imax為i;

}

3.打印max,imax#defineN10Voidmain(){

inti,imax,max,a[N];

printf("Enter%dNumbers\n",N);/*提示輸入數(shù)據(jù)*/

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

scanf("%d",&a[i]);max=a[0];/*假設第0元素就是最大元素*/imax=0;

for(i=1;i<N;i++){if(a[i]>max)//若當前的值比最大值大,

{//則將最大值更新為當前值,同時記錄標號 max=a[i];imax=i;}}printf("TheMaxNumbwera[%d]=%d\n",imax,max);}

例用數(shù)組處理求Fibonacci數(shù)列問題解題思路:用簡單變量處理的,缺點不能在內存中保存這些數(shù)。假如想直接輸出數(shù)列中第25個數(shù),是很困難的。如果用數(shù)組處理,每一個數(shù)組元素代表數(shù)列中的一個數(shù),依次求出各數(shù)并存放在相應的數(shù)組元素中用數(shù)組計算fibonacci數(shù)列的前20個數(shù),并按每行打印5個數(shù)的格式輸出。1,1,2,3,5,8,13,……一維數(shù)組的使用—遞推#include<stdio.h>voidmain(){

inti;

intf[20]={1,1};

for(i=2;i<20;i++)f[i]=f[i-2]+f[i-1];//遞推計算

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

if(i%5==0)//每5個數(shù)換行printf(“\n”);

printf(“%12d”,f[i]);}

printf("\n");}分魚問題

A、B、C、D、E五人合伙夜間捕魚,凌晨時都疲憊不堪,各自在河邊的樹叢中找地方睡著了,日上三竿,A第一個醒來,他將魚平分作五份,把多余的一條扔回湖中,拿自己的一份回家去了,B第二個醒來,也將魚平分為五份,扔掉多余的一條,只拿走自己的一份,接著C、D、E依次醒來,也都按同樣的辦法分魚。問五人至少合伙捕到多少條魚?每個人醒來后看到的魚數(shù)是多少條?一維數(shù)組的使用—遞推問題分析: 假定A、B、C、D、E五人的編號分別為1、2、3、4、5,整型數(shù)組fish[k]表示第k個人所看到的魚數(shù)。fish[1]表示A所看到的魚數(shù),fish[2]表示B所看到的魚數(shù)…… fish[1]為五人合伙捕魚的總魚數(shù)

fish[2]=(fish[1]-1)*4/5 fish[3]=(fish[2]-1)*4/5 fish[4]=(fish[3]-1)*4/5 fish[5]=(fish[4]-1)*4/5寫成一般式

fish[i]=(fish[i-1]–1)*4/5

i=2,3,4,5 這個公式可用于:從A所看到的魚數(shù)去推算出B所看到的魚數(shù),再去推算出C所看到的,……。分析上式1.當i=1時,fish[i]表示A醒來所看到的魚數(shù),該數(shù)應滿足被5整除后余1,即

fish[1]%5==12.當i=2時,fish[i]表示B醒來所看到的魚數(shù),這個數(shù)既要滿足

fish[2]=(fish[1]–1)*4/5又要滿足

fish[2]%5==1顯然,fish[2]不能不是整數(shù),這個結論同樣可以用至fish[3],fish[4]和fish[5]3.按題意要求5人合伙捕到的最少魚數(shù),可以從小往大枚舉,可以先讓A所看到的魚數(shù)最少為6條,即fish[1]初始化為6來試,之后每次增加5再試,直至遞推出fish[2]、fish[3]、fish[4]和fish[5]均為整數(shù)且除以5之后的余數(shù)均為1。voidmain(){inti,fish[6]={0};//fish[1]~fish[5]fish[1]=6; //總魚數(shù)最少為

6while(1){for(i=2;i<=5;i++){fish[i]=(fish[i-1]–1)*4/5;if(fish[i]%5!=1)break;}if(i<=5)fish[1]+=5;//推算失敗

elsebreak; //推算成功

}二維數(shù)組的定義和初始化一維數(shù)組用一個下標確定各元素在數(shù)組中的順序可用排列成一行的元素組來表示如inta[5];二維數(shù)組用兩個下標確定各元素在數(shù)組中的順序可用排列成i行,j列的元素組來表示如intb[2][3];n維數(shù)組用n個下標來確定各元素在數(shù)組中的順序如intc[3][2][4];n≥3時,維數(shù)組無法在平面上表示其各元素的位置a[0]a[1]a[2]a[3]a[4]b[0][0]b[0][1]b[0][2]b[1][0]b[1][1]b[1][2]【例】以下程序的運行結果是什么?intmain(){inta[][3]={{1,2,3},{4,5},{6},{0}};printf("%d,%d,%d\n",a[1][1],a[2][1],a[3][1]);return0;}123450600000結果:5,0,0【例】若inta[][3]={1,2,3,4,5,6,7},則a數(shù)組的第一維大小是多少?

123456700二維數(shù)組的初始化數(shù)組的數(shù)據(jù)類型和存儲類型根據(jù)數(shù)組的數(shù)據(jù)類型,為每一元素安排相同長度的存儲單元根據(jù)數(shù)組的存儲類型,將其安排在內存的動態(tài)存儲區(qū)、靜態(tài)存儲區(qū)或寄存器區(qū)用sizeof(a)來獲得數(shù)組a所占字節(jié)數(shù)shortshortinta[2][3];a[0]a[1]a[1][0]a[1][1]a[1][2]a[0][0]a[0][1]a[0][2]存放順序:按行存放先順序存放第0行元素,再存放第1行元素a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]需知道數(shù)組每行列數(shù)才能從起始地址開始正確讀出數(shù)組元素二維數(shù)組的存儲結構二維數(shù)組實例【例8.4】從鍵盤輸入某年某月(包括閏年),編程輸出該年的該月?lián)碛械奶鞌?shù)

8.3向函數(shù)傳遞一維數(shù)組傳遞整個數(shù)組給另一個函數(shù),可將數(shù)組的首地址作為參數(shù)傳過去用數(shù)組名作函數(shù)參數(shù)只復制一個地址自然比復制全部數(shù)據(jù)效率高由于首地址相同,故實參數(shù)組與形參數(shù)組占用同一段內存在該函數(shù)內,不僅可以讀這個數(shù)組的元素,還可以修改它們28簡介引例問題:保存n個學生的成績,并按從高到低的順序排序。數(shù)組6572837997877957…78657283799787795778…score怎么處理排序查找?score1score2…scorenscore[0]score[1]…score[n-1]用一個名字和編號去引用這些變量。29定義數(shù)組定義數(shù)組的格式

類型說明符

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

數(shù)組類型

數(shù)組名元素個數(shù)(數(shù)組長度)數(shù)組#defineMAX200intc[12];floatf[1000];inta[MAX],b[MAX*10];intn,m=5,x[m];scanf(“%d”,&n);{inty[n];}數(shù)組長度必須是一個整型常量或整型常量表達式數(shù)組長度不能是不確定的值30數(shù)組的初始化數(shù)組的初始化

類型說明符

數(shù)組名[整型常量表達式]={初值表};在定義數(shù)組時為每一個元素指定初值。舉例 初值表中的初值太多,產生語法錯誤(syntaxerror)

a[0]=1,其他元素的初值是0

數(shù)組的長度就是初值表中初值的個數(shù)數(shù)組inta[5]={1,2,3,4,5,6};inta[5]={1};inta[]={1,2,3,4,5};31數(shù)組的初始化數(shù)組的初始化說明初值表不能為空沒有初始化的程序塊內的數(shù)組,其元素的值不確定數(shù)組inta[5]={};inta[5]={1};for(i=0;i<5;i++)printf(“%d”,a[i]);inta[5];for(i=0;i<5;i++)printf(“%d”,a[i]);100008720不可預知32案例分析一:使用數(shù)組問題從一個數(shù)組中讀取數(shù)據(jù),并以直方圖的形式顯示信息。源代碼(cw1001.c)數(shù)組#include<stdio.h>#defineSIZE10voidmain(){

intn[SIZE]={19,2,15,7,11,9,13,5,17,1};inti,j;用一系列‘*’來代替長方形************************33案例分析一:使用數(shù)組源代碼數(shù)組printf("%s%13s%17s\n","Element","Value","Histogram");

for(i=0;i<=SIZE-1;i++){printf("%7d%13d",i,n[i]);

for(j=1;

j<=n[i];j++)

printf("%c",'*');printf("\n");}}ElementValueHistogram019*******************13***215***************37*******411***********59*********613*************75*****817*****************91*34案例分析二:使用數(shù)組問題統(tǒng)計全班32名同學某門功課的平均成績,找出最高分。把學生成績保存到數(shù)組score源代碼(cw1002a.c)數(shù)組#include<stdio.h>#defineMAX32voidmain(){floatscore[MAX],sum,best;inti;printf("Input%dscores:\n",MAX);

for(i=0;i<MAX;i++)scanf("%f",&score[i]);輸入數(shù)據(jù)數(shù)據(jù)結構保存最好成績35案例分析二:使用數(shù)組源代碼數(shù)組

sum=best=score[0];for(i=1;i<MAX;i++){

sum+=score[i];

if(best<score[i])

best=score[i];}printf("Theaverage:%.1f\n",sum/MAX);printf("Thebest:%.1f\n",best);}遍歷數(shù)組進行累加比較輸出結果36案例分析三:使用數(shù)組問題統(tǒng)計全班32名同學某門功課的平均成績,找出最高分。使用位置指針變量源代碼(cw1002b.c)數(shù)組#include<stdio.h>#defineMAX32voidmain(){floatscore[MAX],sum;inti,best_p;printf("Input%dscores:\n",MAX);for(i=0;i<MAX;i++)scanf("%f",&score[i]);65728379978779579178位置指針保存最好成績在數(shù)組中的位置37案例分析三:使用數(shù)組源代碼數(shù)組sum=score[0];

best_p=0;for(i=1;i<MAX;i++){sum+=score[i];

if(score[best_p]<score[i])

best_p=i;}printf("Theaverage:%.1f\n",sum/MAX);printf("Thebest:%.1f\n",score[best_p]);}適用于數(shù)組元素較寬(復雜)的情況38案例分析四:使用數(shù)組問題把一個任意的正整數(shù)N轉換成d進制數(shù)。用數(shù)組remainder[MAX+1]保存每一步的余數(shù)數(shù)組NN/8N%8134816841682102125202printremainder[len]remainder[1]remainder[2]remainder[3]remainder[4]用N除以d如果商不為0,繼續(xù)用商除以d,直到商為039案例分析四:使用數(shù)組源代碼(cw1003.c)數(shù)組#include<stdio.h>#defineMAX10/*估計的最大位數(shù)*/voidmain(){intN,/*保存正整數(shù)和每次相除得到的商*/d,/*基數(shù)*/

len;/*保存實際的位數(shù)*/intremainder[MAX+1];printf("Inputadecimalintegerandabase:");

scanf("%d%d",&N,&d);printf("Converting...\n");40案例分析四:使用數(shù)組源代碼數(shù)組len=0;while(N)//只要商(N)不為零

{len++;

remainder[len]=N%d;N=N/d;}printf("equals");for(;len>0;len--)printf("%d",remainder[len]);}41案例分析五:使用并列數(shù)組約瑟夫問題m個人圍成一圈,從第一個人開始報數(shù),數(shù)到n的人出圈。再由下一個人報數(shù),數(shù)到n的人出圈,……輸出依次出圈的人的編號。分析與設計數(shù)據(jù)結構算法順序循環(huán)掃描,同時判斷各人的狀態(tài)未出圈,則報數(shù)數(shù)到n則出圈,即更新狀態(tài)數(shù)組數(shù)組a保存m個人的編號1234500000數(shù)組b保存m個人的狀態(tài)0表示未出圈,1表示已出圈并列數(shù)組42案例分析五:使用并列數(shù)組源代碼(cw1004.c)數(shù)組#include<stdio.h>#defineM5#defineN3voidmain(){

inta[M];

intb[M]={0};

//初始化狀態(tài):未出圈(0)

inti,/*順序循環(huán)掃描的序號,同時用來計算下標*/

count,/*報數(shù):0-1-2……N-1*/

out;

/*出圈人數(shù)*///初始化編號

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

a[i]=i+1;43案例分析五:使用并列數(shù)組源代碼(cw1004.c)數(shù)組

//順序掃描,i保存掃描序號

for(i=0,count=0,out=0;out<M;i++){

//判斷當前掃描對象是否未出圈

if(b[i%M]==0){

//如果未出圈,則判斷報的數(shù)是否是N-1if(count%N==N-1){

//如果報到了N-1,則出圈,輸出出圈順序號和原始編號

printf("%2d:%2d\n",out+1,a[i%M]);b[i%M]=1;//修改狀態(tài)為“已出圈”

out++;//出圈人數(shù)增一

}count++;//計算下一個該報的數(shù)

}}}44案例分析五:使用并列數(shù)組運行結果數(shù)組45數(shù)組做函數(shù)的參數(shù)把數(shù)組作為參數(shù)傳遞給函數(shù)實參用數(shù)組名通常要把數(shù)組的長度傳遞給函數(shù)對應的函數(shù)定義實參與形參的類型相同可以不指定形參數(shù)組長度函數(shù)原型中數(shù)組參數(shù)的形式數(shù)組intmyArray[20];myFunction(myArray,20);voidmyFunction(intarray[],intarraySize){}voidmyFunction(int[],int);可以有空格長度在這兒不起作用通過一個參數(shù)接受長度46數(shù)組做函數(shù)的參數(shù)把數(shù)組作為參數(shù)傳遞給函數(shù)舉例數(shù)組voidtry(intarray[],intlen){inti;for(i=0;i<len;i++)array[i]*=2;}voidmain(){inti,list[5]={0,1,2,3,4};try(list,5);for(i=0;i<5;i++)printf(“%d”,list[i]);}0246847數(shù)組做函數(shù)的參數(shù)把數(shù)組作為參數(shù)傳遞給函數(shù)數(shù)組的傳遞模擬了引用傳遞數(shù)組voidtry(intarray[],intlen){…array[i]*=2;}voidmain(){…try(list,5);}list[0]list[1]list[2]list[3]list[4]FF00FF00listFF00array數(shù)組名是數(shù)組第一個元素的地址(內存單元編號)。所以,依然是按值傳遞(傳遞的是地址)48數(shù)組做函數(shù)的參數(shù)數(shù)組名數(shù)組名是一個指針,其值是數(shù)組第一個元素的地址。數(shù)組#include<stdio.h>voidmain(){intarray[10];printf("array=%p\n"

"&array[0]=%p\n",

array,&array[0]);}array=19b8&array[0]=19b8%p輸出地址的格式說明字符。printf的格式控制字符串可以分多行寫,但每一行必須用“”括起來。49數(shù)組元素做函數(shù)調用的實參數(shù)組元素可以做函數(shù)調用的實參數(shù)組元素就是一個普通的變量。數(shù)組元素不能做函數(shù)的形參。舉例源代碼(cw1006.c)數(shù)組#include<stdio.h>voidmodifyArray(int[],int);voidmodifyElement(int);voidmain(){inta[]={0,1,2,3,4},i;50數(shù)組元素做函數(shù)調用的實參舉例源代碼數(shù)組printf("\nThevaluesoftheoriginalarrayare:\n");for(i=0;i<5;i++)printf("%d",a[i]);

modifyArray(a,5);printf("\nThevaluesofthemodifiedarrayare:\n");for(i=0;i<5;i++)printf("%d",a[i]);printf("\nThevalueofa[3]is%d",a[3]);

modifyElement(a[3]);printf("\nThevalueofa[3]is%d",a[3]);}51數(shù)組元素做函數(shù)調用的實參舉例源代碼數(shù)組voidmodifyArray(intarray[],intsize){intj;for(j=0;j<size;j++)array[j]*=2;}voidmodifyElement(inte){printf("\nValueinmodifyElementis%d",e*=2);}52數(shù)組元素做函數(shù)調用的實參舉例運行結果數(shù)組Thevaluesoftheoriginalarrayare:01234Thevaluesofthemodifiedarrayare:02468Thevalueofa[3]is6ValueinmodifyElementis12Thevalueofa[3]is653二維數(shù)組二維數(shù)組可以看作是一個有行號和列號的數(shù)據(jù)表。例如,矩陣或行列式。舉例inta[3][4];數(shù)組Row0Row1Row2Column0Column1Column2Column3a[

0

][

0

]a[

1

][

0

]a[

2

][

0

]a[

0

][

1

]a[

1

][

1

]a[

2

][

1

]a[

0

][

2

]a[

1

][

2

]a[

2

][

2

]a[

0

][

3

]a[

1

][

3

]a[

2

][

3

]RowsubscriptArraynameColumnsubscript68768156778378819082757954二維數(shù)組定義二維數(shù)組

數(shù)組類型

數(shù)組名[行數(shù)][列數(shù)];舉例數(shù)組#defineMAXNUM30#defineMAXLEN20#defineMAXLES5inta[3][3],b[30][3];charname[MAXNUM][MAXLEN];floatscore[MAXNUM][MAXLES];a[3][3]二維數(shù)組可以看作是由一維數(shù)組組成的數(shù)組,即數(shù)組元素是一維數(shù)組的一維數(shù)組。a[0]a[0][0]a[0][1]a[0][2]a[1]a[1][0]a[1][1]a[1][2]a[2]a[2][0]a[2][1]a[2][2]第1維第2維55二維數(shù)組引用二維數(shù)組的元素

數(shù)組名[行下標][列下標]舉例遍歷二維數(shù)組中的元素數(shù)組inta[3][4];for(m=0;m<3;m++)

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

a[m][n]=m*n;常用嵌套的for循環(huán)############for(m=0;m<3*4;m++)

printf(“%d”,a[m/4][m%4]);像這樣也行56二維數(shù)組二維數(shù)組的存儲形式二維數(shù)組的元素是按行順序存放的。舉例inta[2][3];數(shù)組a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]1232-187053a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]a數(shù)組a的存儲形式57二維數(shù)組二維數(shù)組的初始化四種方式:給全部元素賦初值給部分元素賦初值給全部元素賦初值時,不指定第一維的長度,但要指定第二維的長度給部分元素賦初值時,不指定第一維的長度,但要指定第二維的長度數(shù)組58二維數(shù)組二維數(shù)組的初始化給全部元素賦初值數(shù)組inta[2][3]={{10,11,12},{13,14,15}};inta[2][3]={10,11,12,13,14,15};a[0][0]a[0][1]a[0][2]101112a[1][0]a[1][1]a[1][2]131415用括號按行分組59二維數(shù)組二維數(shù)組的初始化給部份元素賦初值數(shù)組inta[2][3]={{10,11},{13}};a[0][0]a[0][1]a[0][2]10110a[1][0]a[1][1]a[1][2]1300inta[2][3]={10,11,13};a[0][0]a[0][1]a[0][2]101113a[1][0]a[1][1]a[1][2]000沒有明確指定初值的元素被初始化為缺省初值60二維數(shù)組二維數(shù)組的初始化給全部元素賦初值時,不指定第一維的長度,但要指定第二維的長度.數(shù)組inta[][3]={{10,11,12},{13,14,15}};inta[][3]={10,11,12,13,14,15};a[0][0]a[0][1]a[0][2]101112a[1][0]a[1][1]a[1][2]131415編譯器:我來算吧。61二維數(shù)組二維數(shù)組的初始化給部分元素賦初值時,不指定第一維的長度,但要指定第二維的長度。數(shù)組inta[][3]={{10,11},{13}};a[0][0]a[0][1]a[0][2]10110a[1][0]a[1][1]a[1][2]130062案例分析:二維數(shù)組的應用問題求矩陣a的轉置矩陣b。分析與設計用二維數(shù)組來保存矩陣。數(shù)組b的第i行第j列的元素等于a的第j行第i列的元素for(i=0;i<3;i++)for(j=0;j<2;j++)b[i][j]=a[j][i]63案例分析:二維數(shù)組的應用源代碼(cw1007.c)數(shù)組#include<stdio.h>voidmain(){inta[2][3]={1,2,3,4,5,6},b[3][2];inti,j;printf("matrixais:\n");for(i=0;i<2;i++){for(j=0;j<3;j++){printf("%3d",a[i][j]);}printf("\n");}64案例分析:二維數(shù)組的應用源代碼數(shù)組printf("matrixbis:\n");for(i=0;i<3;i++){for(j=0;j<2;j++){b[i][j]=a[j][i];printf("%3d",b[i][j]);}printf("\n");}}matrixais:123456matrixbis:14253665案例分析:二維數(shù)組的應用問題用二維數(shù)組來解決約瑟夫問題數(shù)組102030405066二維數(shù)組做函數(shù)的參數(shù)二維數(shù)組做函數(shù)的參數(shù)數(shù)組元素做函數(shù)的實參值傳遞二維數(shù)組名做函數(shù)的實參,對應的形參是二維數(shù)組模擬引用傳遞數(shù)組voidexchange(inta[][3],intb[][2],intm,intn);voidmain(){inta[2][3],b[3][2];…

exchange(a,b,2,3);…}第一維的長度可以為空,其他維的長度必須指定。實參數(shù)組與形參數(shù)組應該同構。67查找查找根據(jù)指定的關鍵字查找數(shù)組中的特定元素。常用方法順序查找折半查找數(shù)組200735013王峰18太原200711002李明18武漢200747003匡俊19合肥200721421趙菲18上?!?00747003關鍵字(Keyword)68順序查找順序查找適用于小型和(或)沒有排序的數(shù)組。用關鍵字與數(shù)組的元素依次進行比較。平均而言,要與數(shù)組的一半元素進行比較數(shù)組6572837997877957917887查找表關鍵字69#defineN10voidmain(){

intlist[N+1]={0,65,72,83,79,97,87,75,57,91,78};intkey,i;printf("Inputsearchkey:");

scanf("%d",&key);

for(i=1;i<=N;i++)if(list[i]==key)break;if(i>N)printf("Notfound!");elseprintf("Success!Thepositionis%d.",i);}順序查找順序查找舉例(cw1009.c)數(shù)組6572837997877957917870#defineN10voidmain(){intlist[N+1]={0,65,72,83,79,97,87,75,57,91,78};intkey,i;printf("Inputsearchkey:");scanf("%d",&key);

for(i=1;(i<=N)&&(list[i]!=key);i++);if(i>N)printf("Notfound!");elseprintf("Success!Thepositionis%d.",i);}順序查找順序查找舉例:第二種實現(xiàn)(cw1009b.c)數(shù)組6572837997877957917871折半查找折半查找適用于已經(jīng)排好序的數(shù)組。用關鍵字與數(shù)組的中間元素比較如果相等,則查找結束——找到如果key<middle,則繼續(xù)在前半部分查找如果key>middle,則繼續(xù)在后半部分查找如果沒有可查找的部分,則查找結束——沒有找到數(shù)組5765727578798387919783lowmidhigh72折半查找折半查找舉例(cw1010.c)數(shù)組#include<stdio.h>#defineN10voidmain(){inti,low,mid,high,key;

intlist[N+1]={0,57,65,72,75,78,79,83,87,91,97};printf("Sortedlist:\n");for(i=1;i<=N;i++)printf("%-4d",list[i]);printf("\n");printf("Inputsearchkey:");

scanf("%d",&key);73折半查找折半查找舉例數(shù)組low=1;high=N;while(low<=high){

mid=(low+high)/2;

if(key>list[mid])low=mid+1;

elseif(key==list[mid])break;

elsehigh=mid-1;}if(low<=high)printf("Success!Thepositionis%d.",mid);elseprintf("Notfound!");}74排序排序按特定的順序來安排數(shù)據(jù)。常用方法直接插入排序簡單選擇排序冒泡排序數(shù)組200711002李明18武漢200721421趙菲18上海200735013王峰18太原200747003匡俊19合肥……按學號升序排列75數(shù)據(jù)插入問題把一個數(shù)據(jù)插入到已排好序的有序表中,從而得到一個新的、長度增1的有序表。數(shù)組5765727578798791978357657275787983879197576572757879878791971.找到插入點2.騰出位置3.插入數(shù)據(jù)①②③8376數(shù)據(jù)插入數(shù)據(jù)插入(cw1011.c)把一個數(shù)據(jù)插入到一個有序表中。數(shù)組#include<stdio.h>#defineN20voidmain(){inti,j,x,len=9;//len保存當前有序表中數(shù)據(jù)的個數(shù)

intlist[N]={57,65,72,75,78,79,87,91,97};//list的容量應該足夠大

printf("Sortedlist:\n");for(i=0;i<len;i++)printf("%-4d",list[i]);printf("\n");printf("Inputaintegertobeinsertedintothelist:");

scanf("%d",&x);77數(shù)據(jù)插入數(shù)據(jù)插入續(xù)數(shù)組

for(i=0;(i<len)&&(x>list[i]);i++);

for(j=len;j>i;j--)list[j]=list[j-1];

list[i]=x;

len++;printf("Thenewlist:\n");for(i=0;i<len;i++)printf("%-4d",list[i]);printf("\n");}找到插入點“騰出位子”插入數(shù)據(jù)此時的len保存一個特殊的下標值。78直接插入排序直接插入排序數(shù)組(78)4525311366928初始狀態(tài)(4578)25311366928插入第2個數(shù)(254578)311366928插入第3個數(shù)(813253145667892)插入最后一個數(shù)……79直接插入排序直接插入排序(cw1012.c)輸入任意個數(shù),按從小到大的順序對它們進行排序。數(shù)組#include<stdio.h>#defineN10voidmain(){inti,j,k,len;intlist[N],x;printf("Inputseveralintegerstoconstructalist\n");printf(“Howmany?(<%d)”,N);

scanf("%d",&len);printf(“Pleaseinputthem:”);

for(i=0;i<len;i++)scanf("%d",&list[i]);printf("OK!Thelisthasbeenconstructed:\n");for(i=0;i<len;i++)printf("%-4d",list[i]);任意個數(shù):程序運行時確定80直接插入排序直接插入排序續(xù)數(shù)組printf("\nTosort...\n");for(i=1;i<len;i++){x=list[i];for(j=0;(j<i)&&(list[i]>list[j]);j++);for(k=i;k>j;k--)list[k]=list[k-1];list[j]=x;}printf("Finished!Thelisthasbeensorted:\n");for(i=0;i<len;i++)printf("%-4d",list[i]);}記住list[i]把list[i]插入有序數(shù)列:list[0]..list[i-1](1)查找插入點(2)移動數(shù)據(jù)(3)插入78452531136692881簡單選擇排序簡單選擇排序數(shù)組784525311366928初始狀態(tài)(8)

45253113669278找到最小數(shù)(813)253145669278找到第二小的數(shù)(813253145667892)最大數(shù)被找到……一趟簡單選擇排序的操作:通過n-i次數(shù)據(jù)間的比較,從n-i+1個記錄中選出最小的數(shù),并和第i個數(shù)交換。82簡單選擇排序簡單選擇排序(cw101

溫馨提示

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

評論

0/150

提交評論