版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第七章數(shù)組目錄/Contents數(shù)組類型、定義、初始化數(shù)組作函數(shù)參數(shù)排序、查找等常用算法問題的提出【例7.1】
從鍵盤輸入10個(gè)學(xué)生的某門課成績(jī),然后輸出他們的平均分。按照已學(xué)知識(shí),需定義10個(gè)不同名整型變量,需要使用10個(gè)scanf()
intscore1,score2,score3,score4,score5,score6,score7,score8,score9,score10;
scanf("%d",&score1);scanf("%d",&score2);......如果有100個(gè)學(xué)生呢?數(shù)百個(gè)學(xué)生呢?一維數(shù)組的定義和初始化一維數(shù)組的定義:存儲(chǔ)類型數(shù)據(jù)類型
數(shù)組名[常量表達(dá)式];inta[10];■定義1個(gè)有10個(gè)int型元素的數(shù)組。系統(tǒng)在內(nèi)存分配連續(xù)的10int空間給此數(shù)組?;愋拖聵?biāo)從0開始■直接對(duì)a的訪問,就是訪問數(shù)組的首地址?!鰯?shù)組的大小必須是正的常量,不能是變量。■數(shù)組大小最好用宏來定義,以方便未來的變化。#defineM10inta[M];一維數(shù)組的定義和初始化一旦定義,不能改變大小■數(shù)組定義后其元素的值依然是隨機(jī)數(shù)?!鰯?shù)組定義后一般要立即進(jìn)行初始化。inta[10]={56,23,78,98,89,86,67,100,72,63};inta[10]={0};inta[]={56,23,78,98,89,86,67,100,72,63};■常用for循環(huán)對(duì)數(shù)組進(jìn)行初始化。for(i=0;i<10;i++) scanf("%d",&a[i]);或for(i=0;i<10;i++) a[i]=i;一維數(shù)組的定義和初始化一維數(shù)組的定義和初始化數(shù)組的引用數(shù)組名
[下標(biāo)]數(shù)組下標(biāo)都是從0開始使用a[0]、a[1]、a[2]、a[3]等這樣的形式訪問每個(gè)元素下標(biāo)既可是常量,也可是整型表達(dá)式,允許快速隨機(jī)訪問,如a[i]可以像使用普通變量一樣使用它們一維數(shù)組的賦值main(){inta[5]={1,2,3,4,5},b[5];
b=a;
}解決方法方法1:逐個(gè)元素賦值
b[0]=a[0];b[1]=a[1];b[2]=a[2];b[3]=a[3];b[4]=a[4];方法2:通過循環(huán)賦值
inti;for(i=0;i<5;i++){
b[i]=a[i];}原因:數(shù)組名表示數(shù)組的首地址,其值不可改變!【例7.2】
編寫程序,從鍵盤輸入10個(gè)學(xué)生的某門課成績(jī),然后輸出他們的平均分。一維數(shù)組的定義和初始化#include<stdio.h>intmain(){ inta[10]; inti,sum=0; printf("inputthescoresof10students:\n"); for(i=0;i<10;i++) { scanf("%d",&a[i]); sum=sum+a[i]; } printf("average=%.2f\n",sum/10.0); return0;}數(shù)組定義數(shù)組初始化數(shù)組運(yùn)算一維數(shù)組的定義和初始化數(shù)組下標(biāo)越界是大忌!編譯程序不檢查是否越界下標(biāo)越界,將訪問數(shù)組以外的空間那里的數(shù)據(jù)是未知的,不受我們掌控,可能帶來嚴(yán)重后果一維數(shù)組的定義和初始化【例7.3】
分析下面程序的輸出結(jié)果是否正確。#include<stdio.h>intmain(){ inta=1,c=2,b[5]={0},i; printf("%p,%p,%p\n",b,&c,&a); for(i=0;i<=8;i++) { b[i]=i; printf("%d",b[i]); } printf("\nc=%d,a=%d,i=%d\n",c,a,i); return0;}一維數(shù)組的定義和初始化運(yùn)行程序或單步執(zhí)行觀察變量變化情況可以看到,變量c和a的值因數(shù)組越界而被悄悄破壞了一維數(shù)組應(yīng)用【例7.4】
編寫程序,輸入數(shù)量不確定的[0,9]范圍內(nèi)的整數(shù),統(tǒng)計(jì)每一種數(shù)字出現(xiàn)的次數(shù),輸入-1表示結(jié)束。#include<stdio.h>intmain(){ intx; intcount[10]; inti; scanf("%d",&x); for(i=0;i<10;i++) { count[i]=0; }
while(x!=-1){ if(x>=0&&x<=9) { count[x]++; } scanf("%d",&x);}for(i=0;i<10;i++){printf("%d:%d\n",i,count[i]);}}數(shù)組定義數(shù)組初始化數(shù)組運(yùn)算數(shù)組遍歷二維數(shù)組的定義和初始化一維數(shù)組用一個(gè)下標(biāo)確定各元素在數(shù)組中的順序可用排列成一行的元素組來表示如inta[5];二維數(shù)組用兩個(gè)下標(biāo)確定各元素在數(shù)組中的順序可用排列成i行、j列的元素組來表示如intb[2][3];n維數(shù)組用n個(gè)下標(biāo)來確定各元素在數(shù)組中的順序如intc[3][2][4];n≥3時(shí),n維數(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]二維數(shù)組的定義和初始化■二維數(shù)組可以按元素初始化,例如:inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};■按行初始化,例如:inta[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};■當(dāng)數(shù)組初始化列表提供全部元素的初值時(shí),第一維長(zhǎng)度的聲明可以忽略inta[][4]={1,2,3,4,5,6,7,8,9,10,11,12};■在按行初始化時(shí),即使初始化列表提供的初值個(gè)數(shù)小于數(shù)組元素的個(gè)數(shù),第一維長(zhǎng)度的聲明也可以忽略,此時(shí)系統(tǒng)自動(dòng)給后面的元素賦初值0。inta[][4]={{1,2,3},{5},{9,10}};相當(dāng)于inta[3][4]={{1,2,3,0},{5,0,0,0},{9,10,0,0}};■也可以通過for循環(huán)初始化for(i=0;i<3;i++){ for(j=0;j<4;j++) scanf("%d",&a[i][j]);}數(shù)組的數(shù)據(jù)類型和存儲(chǔ)類型根據(jù)數(shù)組的數(shù)據(jù)類型,為每一元素安排相同長(zhǎng)度的存儲(chǔ)單元根據(jù)數(shù)組的存儲(chǔ)類型,將其安排在內(nèi)存的動(dòng)態(tài)存儲(chǔ)區(qū)、靜態(tài)存儲(chǔ)區(qū)或寄存器區(qū)用sizeof(a)來獲得數(shù)組a所占字節(jié)數(shù)short二維數(shù)組的存儲(chǔ)結(jié)構(gòu)二維數(shù)組a的邏輯存儲(chǔ)結(jié)構(gòu)a[0][0]a[0][1]a[0][2]A[0][3]a[1][0]a[1][1]●●●需知道數(shù)組每行列數(shù)才能從起始地址開始正確讀出數(shù)組元素二維數(shù)組的定義和初始化【例7.4】
編寫程序,從鍵盤輸入整數(shù)到一個(gè)4行5列的二維數(shù)組中,顯示所有數(shù)組元素,并計(jì)算所有數(shù)組元素之和。#include<stdio.h>#defineM4/*用宏常量定義數(shù)組行/列的長(zhǎng)度*/#defineN5intmain(){ inta[M][N],i,j,sum=0; for(i=0;i<M;i++) { for(j=0;j<N;j++) { scanf("%d",&a[i][j]);/*從鍵盤初始化二維數(shù)組*/ } }數(shù)組定義數(shù)組初始化二維數(shù)組的定義和初始化for(i=0;i<M;i++){for(j=0;j<N;j++){printf("a[%d][%j]=%d",i,j,a[i][j]); /*顯示二維數(shù)組中的元素*/}printf(“\n”);}for(i=0;i<M;i++){for(j=0;j<N;j++){ sum=sum+a[i][j]; /*二維數(shù)組元素求和*/}}printf(“sum=%d”,sum);return0;}數(shù)組運(yùn)算數(shù)組遍歷向函數(shù)傳遞一維數(shù)組傳遞整個(gè)數(shù)組給另一個(gè)函數(shù),可將數(shù)組的首地址作為參數(shù)傳過去用數(shù)組名作函數(shù)參數(shù)只復(fù)制一個(gè)地址自然比復(fù)制全部數(shù)據(jù)效率高由于首地址相同,故實(shí)參數(shù)組與形參數(shù)組占用同一段內(nèi)存在該函數(shù)內(nèi),不僅可以讀這個(gè)數(shù)組的元素,還可以修改它們向函數(shù)傳遞一維數(shù)組向函數(shù)傳遞一維數(shù)組【例7.5】
編寫程序,從鍵盤輸入某班全部學(xué)生某門課的成績(jī),并計(jì)算其平均分、最高分、最低分。max=GetMax(score,n);min=GetMin(score,n);printf("Average=%.2f\n",aver);printf("max=%2d\n",max);printf("min=%2d\n",min);return0;}#include<stdio.h>#defineN40floatGetAverage(inta[],intn);intReadScore(inta[]);intGetMax(inta[],intn);intGetMin(inta[],intn);intmain(){intscore[N],n,max,min;floataver;n=ReadScore(score);printf("Totalstudentsare:%d\n",n);aver=GetAverage(score,n);向函數(shù)傳遞一維數(shù)組returnn>0?sum/n:-1;更安全
向函數(shù)傳遞一維數(shù)組/*函數(shù)功能:輸入n個(gè)學(xué)生某門課的成績(jī)*/intReadScore(inta[]){ inti=-1; /*i初始化為-1,在循環(huán)體內(nèi)增1后可保證數(shù)組下標(biāo)從0開始*/ printf("Inputscores:\n"); do { i++; scanf("%d",&a[i]); }while(a[i]>=0); returni;}標(biāo)記控制的循環(huán)——負(fù)值作為輸入結(jié)束標(biāo)記/*函數(shù)功能:計(jì)算n個(gè)學(xué)生某門課成績(jī)的最低分*/intGetMin(inta[],intn){ intmin,i; min=a[0]; for(i=1;i<n;i++) { if(a[i]<min) min=a[i]; } returnmin;}/*函數(shù)功能:計(jì)算n個(gè)學(xué)生某門課成績(jī)的最高分*/intGetMax(inta[],intn){ intmax,i; max=a[0]; for(i=1;i<n;i++) { if(a[i]>max) max=a[i]; } returnmax;}向函數(shù)傳遞一維數(shù)組冒泡排序985420895420859420854920854290854209a[0]a[1]a[2]a[3]a[4]a[5]for(i=0;i<5;i++)if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}大數(shù)沉淀,小數(shù)起泡如何實(shí)現(xiàn)兩數(shù)交換?冒泡排序854209584209548209542809542089a[0]a[1]a[2]a[3]a[4]a[5]for(i=0;i<4;i++)if(a[i]>a[i+1]){t=a[i];a[i]=a[i+1];a[i+1]=t;}冒泡排序542089452089425089420589a[0]a[1]a[2]a[3]a[4]a[5]冒泡排序420589240589204589a[0]a[1]a[2]a[3]a[4]a[5]冒泡排序204589024589a[0]a[1]a[2]a[3]a[4]a[5]冒泡排序inta[10];inti,j,t;printf("input10numbers:\n");for(i=0;i<10;i++)scanf("%d",&a[i]);printf("\n");for(j=0;j<9;j++) for(i=0;i<9-j;i++) if(a[i]>a[i+1]) {t=a[i];a[i]=a[i+1];a[i+1]=t;}printf("thesortednumbers:\n");for(i=0;i<10;i++)printf("%d",a[i]);printf(“\n”);選擇排序選擇排序voidSortScore(inta[],intn){ inti,j,k,temp; for(i=0;i<n-1;i++) { k=i; for(j=i+1;j<n;j++) { if(a[j]>a[k]) k=j; } if(k!=i) { temp=a[k]; a[k]=a[i]; a[i]=temp; } }}線性查找/*函數(shù)功能:用線性查找法查找值為x的數(shù)組元素*/intLinearSearch(longnum[],longx,intn){ inti; for(i=0;i<n;i++) { if(num[i]==x) { returni;/*若找到,則返回x在數(shù)組中的下標(biāo)*/ } } return-1;/*若循環(huán)結(jié)束仍未找到,則返回-1*/}事先不必排序折半查找選擇排序intBinarySearch(longnum[],longx,intn){ intlow=0,high=n-1,mid; while(low<high) { mid=(low+high)/2; if(num[mid]<x) { low=mid+1; } elseif(num[mid]>x) { high=mid-1; } else { returnmid; } } return-1;}若未按學(xué)號(hào)排序,則如何修改程序?找到時(shí)返回下標(biāo)位置找不到時(shí)返回-1事先必須先排序向函數(shù)傳遞二維數(shù)組a[0][0]a[0][1]a[0][2]a[1][0]a[1][1]a[1][2]inta[2][3];實(shí)際傳送的是數(shù)組第一個(gè)元素的地址偏移1*3+2元素a[i][j]在數(shù)組a中的位置是:i*N+j元素地址:首地址+偏移量向函數(shù)傳遞二維數(shù)組#include<stdio.h>#defineM50#defineN5voidReadScore(inta[][N],longnum[],intn);/*讀取學(xué)生的成績(jī)和學(xué)號(hào)*/voidAverforStud(inta[][N],intsum[],floataver[],intn);/*計(jì)算每個(gè)學(xué)生的總分和平均分*/voidAverforCourse(inta[][N],intsum[],floataver[],intn);/*計(jì)算每門課的總分和平均分*/voidPrint(inta[][N],longnum[],intsum1[],floataver1[],intsum2[],floataver2[],intn);i
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 物聯(lián)網(wǎng)工程承包合同
- 賓館酒店三年租賃合同范本
- 2025建筑企業(yè)流動(dòng)資金借款合同協(xié)議書
- 大型公園橋梁工程建橋合同
- 環(huán)保工程砼施工班組合同責(zé)任
- 成都二手房合同違約責(zé)任分析
- 體育場(chǎng)標(biāo)線施工合同
- 測(cè)試儀器租賃委托合同
- 工業(yè)園區(qū)施工便道工程合同
- 教育培訓(xùn)基地物業(yè)聘用合同
- GB/T 18277-2000公路收費(fèi)制式
- 2023年住院醫(yī)師規(guī)范化培訓(xùn)胸外科出科考試
- 11468工作崗位研究原理與應(yīng)用第7章
- 2023實(shí)施《中華人民共和國野生動(dòng)物保護(hù)法》全文學(xué)習(xí)PPT課件(帶內(nèi)容)
- 2022年初級(jí)育嬰師考試題庫附答案
- 系統(tǒng)家庭療法課件
- 新版GSP《醫(yī)療器械經(jīng)營質(zhì)量管理規(guī)范》培訓(xùn)試題
- 初中道德與法治答題技巧課件
- 管理學(xué)專業(yè):管理基礎(chǔ)知識(shí)試題庫(附含答案)
- 河北省保定市藥品零售藥店企業(yè)藥房名單目錄
- 廣西基本醫(yī)療保險(xiǎn)門診特殊慢性病申報(bào)表
評(píng)論
0/150
提交評(píng)論