![計算機與信息技術學院大一上c語言13-1數組ianme_第1頁](http://file4.renrendoc.com/view/5e1b835b09d998d1d0ac9b6050873cd4/5e1b835b09d998d1d0ac9b6050873cd41.gif)
![計算機與信息技術學院大一上c語言13-1數組ianme_第2頁](http://file4.renrendoc.com/view/5e1b835b09d998d1d0ac9b6050873cd4/5e1b835b09d998d1d0ac9b6050873cd42.gif)
![計算機與信息技術學院大一上c語言13-1數組ianme_第3頁](http://file4.renrendoc.com/view/5e1b835b09d998d1d0ac9b6050873cd4/5e1b835b09d998d1d0ac9b6050873cd43.gif)
![計算機與信息技術學院大一上c語言13-1數組ianme_第4頁](http://file4.renrendoc.com/view/5e1b835b09d998d1d0ac9b6050873cd4/5e1b835b09d998d1d0ac9b6050873cd44.gif)
![計算機與信息技術學院大一上c語言13-1數組ianme_第5頁](http://file4.renrendoc.com/view/5e1b835b09d998d1d0ac9b6050873cd4/5e1b835b09d998d1d0ac9b6050873cd45.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1課程內容第一章程序設計和C語言第二章數據對象與計算第三章變量、函數和控制結構第四章基本程序設計技術第五章C程序結構(函數)第六章數組第七章指針第八章文件和輸入輸出第九章結構和其它數據機制第十章程序開發(fā)技術第十一章標準庫2第十三部分數組3語言需要提供一套數據機制,描述與數據有關的問題:必須足夠豐富,以滿足需要;不能過龐雜,臃腫難用;也不能太低級,使描述過于煩瑣。高級語言的數據機制:把數據分為類型,每個類型是一個數據集。提供一組基本數據類型;確定其書寫方式;為各類型提供一組基本操作。提供一組由簡單數據類型或對象構造復合數據類型或對象的機制。組合的數據對象稱為復合數據對象。由所有“同類的”復合對象形成的類型稱為復合數據類型,組成部分稱為成分/成員/元素。4基本類型構造類型指針類型空類型void定義類型typedef數值類型字符類型char
8位枚舉類型enum整型浮點型單精度型float
32位雙精度型double
64位短整型short
16位長整型long
32位整型int
16位數組結構體struct共用體unionC數據類型由基本類型數據按一定規(guī)則組成的,也稱為“導出類型”數組5問題:輸入學生的學號,成績,
計算平均成績,
計算每個學生的成績與平均成績的差,
差>=10成績等級A0<=差<10成績等級B
其它成績等級C
設:學號doublen1,n2,n3,n4,…,n30;
成績doubles1,s2,s3,s4,…,s30;能否:一個變量名對應多個連續(xù)的存儲單元:數組數組是程序中最常用的結構數據類型,用來描述由固定數目的同一類型的元素組成的數據結構6數組的概念、定義和使用數組程序實例數組作為函數參數字符數組和字符串兩維和多維數組編程實例主要內容71數組的概念、定義和使用數組(array):是多個同類型數據對象的組合。一個數組匯集了多個數據項,數組元素??蓮臄到M出發(fā)處理各元素,以統一方式處理一批/所有元素,是數組和一組獨立變量的主要區(qū)別。為此需要:數組描述,數組變量定義,初值化數組使用,包括通過數組變量使用其元素數組實現,數組的存儲方式8數組變量定義定義數組變量(定義數組)時需說明:數組元素類型數組(變量)名數組(變量)的元素個數(也稱數組大小或長度)定義方式:
數據類型數組名[常量表達式];
例,定義兩個數組:
inta[10];
doublea1[100];數組定義可以與其他變量定義寫在一起,如:
inta2[16],n,a3[25],m;方括號內整型表達式說明元素個數,表達式應能靜態(tài)確定值,可用字面量或枚舉常量9可定義外部數組和局部數組,包括局部靜態(tài)數組(用static),作用域與存在期與簡單變量相同。數組的外部說明不必描述數組大小。例:
externinta[];externdoublea1[];下面函數里數組定義不合法:voidf(intm,intn){
intb[n];/*非法,編譯時無法確定大小*/....} 新C99標準支持這種定義,滿足C99的編譯器很少10基本操作是元素訪問。元素順序編號,首元素序號0,其余順序編號。n元數組元素編號是0到n-1。定義:
intb[100];元素編號為0、1、2、…、99。稱為下標或指標。元素訪問通過[]運算符,優(yōu)先級最高,運算對象是數組名和括號里表示下標的表達式。表達式、語句里的b[3]稱為下標表達式或帶下標的變量。例:有上面定義后,可寫:
b[0]=1;b[1]=1; b[2]=b[0]+b[1]; b[3]=b[1]+b[2];數組的使用11數組的真正意義在于能以統一方式描述對一組數據的處理。下標表達式可用一般的整型表達式。如:
b[i]=b[i-1]+b[i-2];訪問哪個元素由i值確定。同一語句可訪問不同元素,可用在循環(huán)里訪問一批元素。for(i=0;i<100;++i){
b[i]+=a1[i]*a2[i];}/*假設數組都有定義*/循環(huán)中涉及到300個基本數據對象。12#include<stdio.h>intmain(){longfib[30];intn;fib[0]=1;fib[1]=1;for(n=2;n<30;++n)fib[n]=fib[n-1]+fib[n-2];
for(n=0;n<30;++n)
{printf("%d",fib[n]);putchar(n%6==5?'\n':'');}/*6個數輸出一行*/return0;}例:寫程序創(chuàng)建包含前30個Fibonacci數的數組,然后打印數組中所有的數。13對數組的多個或全部元素操作,常用for語句。令循環(huán)變量遍歷數組下標:
for(n=0;n<數組長度;++n)...問題:fib是30個元素的數組,假設程序里寫:
for(n=2;n<=30;++n) fib[n]=fib[n-1]+fib[n-2];循環(huán)中試圖訪問fib[30],實際無此元素。用超范圍的下標訪問稱為越界訪問,是數組使用中最常見的錯誤。下標值超范圍是運行中的問題。C不檢查數組元素訪問的合法性,運行中出現越界不會報錯。超范圍訪問是嚴重錯誤,后果無法預料。14數組的負數下標C語言只規(guī)定數組的下標必須是整型數據,因此負數下標也合法,但是語義上是否正確,取決于用負數下標訪問時是否越界?!璦[-1]a[-2]…a[0]a[2]a[3]a[1]…內存空間例給定數組、函數及其調用inta[10];intfunc(intarr[],intn);func(&a[2],8);則在func內部,對arr[-2]和arr[-1]的訪問分別對應于a[0]和a[1],是合法的,并沒有產生實際的越界,在arr[-3]就不一定能保證語義正確性了。1516數組的實現數組占據一片連續(xù)存儲區(qū),元素順序排列,0號元素在最前面,各元素占相同空間。如有:
inta[8];a的存儲恰好能存放8個整型數據,情況如圖:a至少相當于8個int變量,a[0]~a[7]可以看作“變量名”。保證元素排在一起,能以統一方式使用。數組名表示內存首地址,是地址常量編譯時分配連續(xù)內存內存字節(jié)數=數組元素個數*
sizeof(元素數據類型)17在一些系統里越界訪問可能導致動態(tài)錯,系統強行終止出錯的程序。越界可能破壞本程序的數據/程序本身/其他軟件,甚至是整個系統。編程者要保證數組下標值的合法性,保證不越界。數組初始化定義數組時可直接初始化。外部、局部靜態(tài)或自動數組都可在定義時進行初始化。方法一:定義時直接初始化intb[4]={1,1,2,3};doubleax[6]={1.3,2.24,5.11,8.37,6.5};
初值表達式必須是常量表達式。外部和靜態(tài)數組在程序開始執(zhí)行前建立并初始化,局部自動數組在程序執(zhí)行進入相應函數或復合語句體時建立和初始化18這種寫法只能用于數組初始化,不能用在語句里。若定義時未初始化,外部和局部靜態(tài)數組的元素自動初始化為0;自動數組處在不明確的狀態(tài)。方法二:只為部分元素提供初值,其余元素將自動置0。初始化表元素個數不得超過數組元素個數。例:
intb1[4]={1,2};b1[2]、b1[3]將給初值0。方法三:若給了所有元素的初值,可以不寫數組大小而只寫方括號,元素個數由初值個數確定。例:intfib[]={1,1,2,3,5,8,13,21,34,55};這種寫法能減少維護負擔,有利于程序修改。在語句中對數據元素賦值的方法?19說明:數組必須先定義,后使用只能逐個引用數組元素,不能一次引用整個數組數組元素表示形式:數組名[下標]其中:下標可以是常量或整型表達式//順序輸入輸出數組元素#include<stdio.h>voidmain()
{ inti,a[10]; for(i=0;i<10;i++) a[i]=i; for(i=0;i<=9;i++) printf(“%4d”,a[i]);}//將數組元素逆序輸出#include<stdio.h>voidmain()
{ inti,a[10]; for(i=0;i<10;i++) a[i]=i; for(i=9;i<=0;i--) printf(“%4d”,a[i]);}例一維數組的輸入與輸出。20數組的概念、定義和使用數組程序實例數組作為函數參數字符數組和字符串兩維和多維數組編程實例主要內容212數組處理程序實例例:從字符到下標(整數)寫程序統計由標準輸入得到的文件中數字字符的個數。
可定義10個計數變量,用if或switch區(qū)分情況,遇數字字符(isdigit)時對應計數器加1。不需要數組。將字符看作整數可得到另一解法。常見字符集里數字順序排列,ASCII字符集里0到9的編碼是48到57。利用這個事實,用10個元素的計數器數組可以更方便地完成對數字出現的統計。22intcs[10];用cs[0]記錄'0'出現次數,余類推。若c是數字,對應計數器加1可以寫成:++cs[c-'0'];/*c-'0'正是對應計數器的下標*/#include<stdio.h>#include<ctype.h>intcs[10]={0,0,0,0,0,0,0,0,0,0};intmain(){
intc,i;while((c=getchar())!=EOF)if(isdigit(c))++cs[c-'0'];for(i=0;i<10;++i)printf("Digit%d:%d\n",i,cs[i]);return0;}23例:篩法求素數篩法是求素數的著名方法:用空間換時間,1億以內的素數只需要十幾秒的時間(如不考慮輸出)具體算法:取2開始的整數序列:令n等于2,它是素數;劃掉序列中所有n的倍數;令n等于下一未劃元素(它是素數),回到步驟2。用數組表示整數序列,以元素下標表示對應整數。數組an,an[0]代表0,an[i]代表i。每個數只需表示劃掉或未劃掉,用0/1表示。開始時元素置1(即假設所有元素都是素數),而后不斷將元素置0,直到確定了給定范圍里的所有素數。
24假設NUM是給定范圍:/*建數組an,元素初始化1,將an[0]和an[1]置0(它們不是素數)*/for(inti=2;i值不大于某個數;++i)if(an[i]==1)//i是素數
for(intj=i*2;j<NUM;j+=i)an[j]=0;/*i的倍數都不是素數*/外層循環(huán)何時結束?可用NUM作為界限。檢驗一個數是不是素數,只要看比它的平方根小的素數是不是能整除它
,因此只要i超過NUM的平方根,就可以劃掉到既定范圍內的所有合數。123456789101112131415161718192021222324251不算遍歷一遍,劃掉2的倍數:得235791113151719212325遍歷一遍,劃掉3的倍數:得2357111317192325遍歷一遍,劃掉5的倍數:得2357111317192325#include<stdio.h>enum{NUM=200};intan[NUM+1];intmain(void){inti,j;an[0]=an[1]=0;/*建立初始向量*/for(i=2;i<=NUM;++i)an[i]=1;for(i=2;i*i<=NUM;++i)
if(an[i]==1)for(j=i*2;j<=NUM;j+=i)an[j]=0;for(i=2,j=0;i<=NUM;++i)if(an[i]!=0)printf("%d",i);putchar('\n');return0;}26例:成績分類寫程序輸入一批學生成績(≤200)。先輸出不及格成績,再輸出及格成績,最后輸出不及格和及格的人數。
無法在輸入過程中完成(除非輸入兩遍)。用數組記錄學生成績,輸入記入數組,而后輸出,可避免重復輸入
數據裝入數組后有許多可能處理方法。最簡單的是兩次掃描數組,第一次輸出不及格成績,第二次輸出及格的成績。統計工作可在某次掃描中完成(也可在輸入中完成),兩部分人數之和就是總人數,統計一部分就夠了。27enum{NUM=200};constdoublePASS=60.0;doublescores[NUM];intmain(){inti,n=0,fail;
while(n<NUM&&scanf("%lf",&scores[n])==1)++n;
/*輸入時需要判斷不越界*/
for(fail=0,i=0;i<n;++i)if(scores[i]<PASS)
{printf("%f\n",scores[i]);++fail;}
for(i=0;i<n;++i)if(scores[i]>=PASS)printf("%f\n",scores[i]);printf("Fail:%d\nPass:%d\n",fail,n-fail);return0;}28例:多項式求值設數組p中存放下列多項式的系數,其中p[i]存放寫程序求p表示的多項式在指定點的值。方法1:求出各項值累加。假設指定點值存于x:for(sum=0.0,n=0;n<TERMS;++n){for(t=p[n],i=1;i<=n;++i)t*=x;sum+=t;}循環(huán)體內可以改寫為(先算x的冪):
for(t=1.0,i=1;i<=n;++i)t*=x;sum+=t*p[n];可發(fā)現有大量重復計算。29通過保存前次的t值:for(sum=0.0,t=1.0,n=0;n<TERMS;++n){sum+=t*p[n];t*=x;}方法2:多項式可以變形為Horner范式:按照這個公式,求值循環(huán)可寫為:for(sum=0.0,n=TERMS-1;n>=0;--n)sum=sum*x+p[n];從計算量上比較它們:需要多少次加法,多少次乘法。30定義數組的問題如果數組表示的是全局數據集合,需要在多個函數里使用,那么可考慮定義為外部數組。大的數組應定義為外部,以免占大量運行??臻g。一般系統不允許在函數內定義特別大的數組。若數組保存著遞歸定義函數的局部數據,就必須定義為自動數組。因為遞歸調用時需要數組的多份拷貝。其他情況可以根據需要自由選擇。31數組的概念、定義和使用數組程序實例數組作為函數參數字符數組和字符串兩維和多維數組編程實例主要內容323數組作為函數參數
數組可以作為函數的參數,但是在向函數傳遞數組時通常有兩種方法:即:
“地址”的傳遞
“值”的傳遞
33方法一:
用數組名作為實際參數,給函數傳遞數組的地址,通過這個地址就可以訪問到數組的元素了——雙向傳遞。#include<stdio.h>#defineN20voidf(intb[],intn,intm){inti;for(i=m;i>=n;i--)b[i+1]=b[i];}voidmain(){inti,a[N]={1,2,3,4,5,6,7,8,9,10};f(a,2,9);for(i=0;i<5;i++)printf(“%4d”,a[i]);}a12345678910
b1098764531
2
3
3
434方法二:
用數組元素作為實際參數,是一種傳值的方式,即:調用函數時要復制數據——單向傳遞。
#include<stdio.h>intfmax(intx,inty){ return(x>y?x:y);}
voidmain(){
inta[10],j,max;
for(j=0;j<=9;j++)
scanf(“%d”,&a[j]);
max=a[0];
for(j=1;j<=9;j++)
max=fmax(max,a[j]);
printf(“\n最大值為:%8d\n”,max);}35對函數參數的小結:“值”傳遞形參和實參都是普通變量實參是數組元素,形參是普通變量“地址”傳遞:形參、實參都是數組名,完成雙向傳遞。完成單向傳遞36假設有多個數組都需要求平均值?解決方法:定義以數組為參數的函數。以數組為參數,不同調用可以完成對不同數組的計算。定義以double類型的數組為參數求元素平均值的函數,就可解決所有double數組的平均值問題設常量LEN是被處理數組的長度。doubleavg0(double
a[])
{doublex=0.0;inti;for(i=0;i<LEN;++i)x+=a[i];returnx/LEN;}/*注意:數組形參不需要寫數組大小*/37若數組a1長LEN,可用:
x=avg0(a1);avg0有一定通用性,若數組a2長度也是LEN:
y=avg0(a2);用符號常量指定數組大小可解決許多問題。缺點:若數組長度不是LEN,就不能用avg0處理??梢姡篴vg0不夠通用,只能正確處理長為LEN的數組。參數是使函數能處理一類問題的基本機制。為提高數組處理函數的通用性,定義時應引進長度參數,使函數能處理任何給定長度的數組。38改造后的函數:doubleavg(intlen,doublea[]){doublex=0.0;inti;for(i=0;i<len;++i)x+=a[i];returnx/len;}對調用提出的新要求:必須正確提供數組長度。應用實例:intmain(){doubleb1[]={1.2,2.43,1.74},b2[]={6.5,9.2,8.6,4.5,0.3};printf("%f,%f\n",avg(3,b1),avg(5,b2));return0;}39長度參數提高了函數的通用性。但使用時必須關注越界問題。avg(5,b1)引起數組越界(b1有3個元素)。長度實參可小于數組大小,avg(3,b2)求b2前3個
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- Cefotaxime-d3-Cefotaxim-d-sub-3-sub-生命科學試劑-MCE-1932
- 二零二五年度生物基因編輯技術研發(fā)合作保密協議
- 2025年度藥店全職員工聘用合同
- 2025年度銀企合作風險控制與業(yè)務拓展合同標準
- 2025年度二零二五年度門面房使用權拍賣合同
- 2025年度魚塘承包合同書:魚塘承包與漁業(yè)市場拓展合作合同
- 2025年度超市租賃合同排他性節(jié)假日營銷活動策劃協議
- 二零二五年度終止合伙合同-海洋資源開發(fā)合作終止協議
- 個人機械租賃合同范本
- 上海市電子產品購銷合同
- 2024年臨沂市高三一模(學業(yè)水平等級考試模擬試題)物理試卷
- 高中物理選擇性必修2教材習題答案
- 我國糖尿病視網膜病變臨床診療指南2022解讀
- 鋰離子電池健康評估及剩余使用壽命預測方法研究
- c30混凝土路面施工方案
- 頸椎骨折的護理常規(guī)課件
- 2022-2023學年上海市楊浦區(qū)上海同濟大附屬存志學校七年級數學第二學期期中綜合測試模擬試題含解析
- 稿件修改說明(模板)
- GB/T 33107-2016工業(yè)用碳酸二甲酯
- GB/T 16604-2017滌綸工業(yè)長絲
- 勞動合同法經典講義
評論
0/150
提交評論