第7章 批量數(shù)據(jù)處理程序設(shè)計_第1頁
第7章 批量數(shù)據(jù)處理程序設(shè)計_第2頁
第7章 批量數(shù)據(jù)處理程序設(shè)計_第3頁
第7章 批量數(shù)據(jù)處理程序設(shè)計_第4頁
第7章 批量數(shù)據(jù)處理程序設(shè)計_第5頁
已閱讀5頁,還剩118頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、程序設(shè)計基礎(chǔ)程序設(shè)計基礎(chǔ)前幾章前幾章使用的變量都屬于使用的變量都屬于基本類型基本類型,例如整型、字符型、浮點型數(shù)據(jù),這例如整型、字符型、浮點型數(shù)據(jù),這些都是簡單的數(shù)據(jù)類型。些都是簡單的數(shù)據(jù)類型。對于有些數(shù)據(jù),只用簡單的數(shù)據(jù)類型對于有些數(shù)據(jù),只用簡單的數(shù)據(jù)類型是不夠的,是不夠的,難以難以反映出數(shù)據(jù)的反映出數(shù)據(jù)的特點特點,也難以有效地進(jìn)行處理。也難以有效地進(jìn)行處理。程序設(shè)計基礎(chǔ)如果有如果有1000名學(xué)生名學(xué)生,每個學(xué)生有一每個學(xué)生有一個成績,需要求這個成績,需要求這1000名學(xué)生的平名學(xué)生的平均成績。均成績。用用s1,s2,s3,s1000表示每個學(xué)生表示每個學(xué)生的成績,能體現(xiàn)的成績,能體現(xiàn)內(nèi)在聯(lián)

2、系內(nèi)在聯(lián)系。C語言用方括號中的數(shù)字表示下標(biāo),語言用方括號中的數(shù)字表示下標(biāo),如用如用s15表示表示數(shù)組名數(shù)組名程序設(shè)計基礎(chǔ)數(shù)組是一組數(shù)組是一組有序數(shù)據(jù)的集合有序數(shù)據(jù)的集合。數(shù)組中。數(shù)組中各數(shù)據(jù)的排列是有一定規(guī)律的,下標(biāo)各數(shù)據(jù)的排列是有一定規(guī)律的,下標(biāo)代表數(shù)據(jù)在數(shù)組中的序號代表數(shù)據(jù)在數(shù)組中的序號用一個用一個數(shù)組名數(shù)組名和和下標(biāo)下標(biāo)惟一確定數(shù)組中惟一確定數(shù)組中的元素的元素數(shù)組中的每一個元素都屬于數(shù)組中的每一個元素都屬于同一個數(shù)同一個數(shù)據(jù)類型據(jù)類型程序設(shè)計基礎(chǔ)7.1 怎樣定義和引用一維數(shù)組怎樣定義和引用一維數(shù)組7.2 怎樣定義和引用二維數(shù)組怎樣定義和引用二維數(shù)組程序設(shè)計基礎(chǔ)7.1.1 怎樣定義一維數(shù)組

3、怎樣定義一維數(shù)組7.1.2 怎樣引用一維數(shù)組元素怎樣引用一維數(shù)組元素7.1.3 一維數(shù)組的初始化一維數(shù)組的初始化7.1.4 一維數(shù)組程序舉例一維數(shù)組程序舉例程序設(shè)計基礎(chǔ)定義一維數(shù)組的一般形式為:定義一維數(shù)組的一般形式為: 類型符類型符 數(shù)組名數(shù)組名常量表達(dá)式常量表達(dá)式;數(shù)組名的命名規(guī)則和變量名相同數(shù)組名的命名規(guī)則和變量名相同如如 int a10;數(shù)組名數(shù)組名程序設(shè)計基礎(chǔ)定義一維數(shù)組的一般形式為:定義一維數(shù)組的一般形式為: 類型符類型符 數(shù)組名數(shù)組名常量表達(dá)式常量表達(dá)式;數(shù)組名的命名規(guī)則和變量名相同數(shù)組名的命名規(guī)則和變量名相同如如 int a10;數(shù)組數(shù)組長度長度程序設(shè)計基礎(chǔ)定義一維數(shù)組的一般形

4、式為:定義一維數(shù)組的一般形式為: 類型符類型符 數(shù)組名數(shù)組名常量表達(dá)式常量表達(dá)式;數(shù)組名的命名規(guī)則和變量名相同數(shù)組名的命名規(guī)則和變量名相同如如 int a10;10個元素個元素:a0,a1,a2,a9每個元素的數(shù)據(jù)類型每個元素的數(shù)據(jù)類型a0 a1 a2 a3a7 a8 a9程序設(shè)計基礎(chǔ)例:例:int a4+6; 合法合法int n=10; int an;不合法不合法程序設(shè)計基礎(chǔ)在定義數(shù)組并對其中各元素賦值后,就在定義數(shù)組并對其中各元素賦值后,就可以引用數(shù)組中的元素可以引用數(shù)組中的元素注意:只能引用數(shù)組元素而不能一次整注意:只能引用數(shù)組元素而不能一次整體調(diào)用整個數(shù)組全部元素的值體調(diào)用整個數(shù)組全部

5、元素的值程序設(shè)計基礎(chǔ)引用數(shù)組元素的表示形式為:引用數(shù)組元素的表示形式為: 數(shù)組名下標(biāo)數(shù)組名下標(biāo)如如a0=a5+a7-a2*3 合法合法int n=5,a10;an=20;合法合法程序設(shè)計基礎(chǔ) 例例7.1 對對10個數(shù)組元素依次賦值為個數(shù)組元素依次賦值為0,1, 2,3,4,5,6,7,8,9,要求按逆序輸出。,要求按逆序輸出。解題思路:解題思路:u定義一個長度為定義一個長度為10的數(shù)組,數(shù)組定義為整型的數(shù)組,數(shù)組定義為整型u要賦的值是從要賦的值是從0到到9,可以用循環(huán)來賦值,可以用循環(huán)來賦值u用循環(huán)按下標(biāo)從大到小輸出這用循環(huán)按下標(biāo)從大到小輸出這10個元素個元素程序設(shè)計基礎(chǔ)#include in

6、t main() int i,a10; for (i=0; i=0; i-) printf(%d ,ai); printf(n); return 0; 使使a0a9的值為的值為090123456789a0a1a2a3a4a5a6a7a8a9程序設(shè)計基礎(chǔ)#include int main() int i,a10; for (i=0; i=0; i-) printf(%d ,ai); printf(n); return 0; 先輸出先輸出a9,最,最后輸出后輸出a00123456789a0a1a2a3a4a5a6a7a8a9程序設(shè)計基礎(chǔ)在定義數(shù)組的同時,給各數(shù)組元素賦值在定義數(shù)組的同時,給各數(shù)組元

7、素賦值int a10=0,1,2,3,4,5,6,7,8,9;int a10=0,1,2,3,4;相當(dāng)于相當(dāng)于 int a10=0,1,2,3,4,0,0,0,0,0;int a10=0,0,0,0,0,0,0,0,0,0;相當(dāng)于相當(dāng)于 int a10=0;int a5=1,2,3,4,5;可寫為可寫為 int a =1,2,3,4,5;程序設(shè)計基礎(chǔ) 例例7.2 用數(shù)組處理求用數(shù)組處理求Fibonacci數(shù)列問題數(shù)列問題解題思路:解題思路:u例例5.8中用簡單變量處理的,中用簡單變量處理的,缺點缺點不能在內(nèi)存不能在內(nèi)存中保存這些數(shù)。假如想直接輸出數(shù)列中第中保存這些數(shù)。假如想直接輸出數(shù)列中第25

8、個數(shù),是很困難的。個數(shù),是很困難的。u如果用數(shù)組處理,每一個數(shù)組元素代表數(shù)列中如果用數(shù)組處理,每一個數(shù)組元素代表數(shù)列中的一個數(shù),依次求出各數(shù)并存放在相應(yīng)的數(shù)組的一個數(shù),依次求出各數(shù)并存放在相應(yīng)的數(shù)組元素中元素中程序設(shè)計基礎(chǔ)#include int main() int i; int f20=1,1; for(i=2;i20;i+) fi=fi-2+fi-1; for(i=0;i20;i+) if(i%5=0) printf(“n”); printf(“%12d”,fi); printf(n); return 0;程序設(shè)計基礎(chǔ) 例例7.3 有有10個個整型數(shù)據(jù)整型數(shù)據(jù),要求對它們按,要求對它們按

9、由小到大的順序排列。由小到大的順序排列。解題思路:解題思路:u排序的規(guī)律有兩種:一種是排序的規(guī)律有兩種:一種是“升序升序”,從小到從小到大;另一種是大;另一種是“降序降序”,從大到小,從大到小u把題目抽象為:把題目抽象為:“對對n個數(shù)按升序排序個數(shù)按升序排序”u采用起泡法排序采用起泡法排序程序設(shè)計基礎(chǔ)985420895420859420854920854290854209大數(shù)沉淀,小數(shù)起泡大數(shù)沉淀,小數(shù)起泡a0a1a2a3a4a5for(i=0;iai+1) t=ai;ai=ai+1;ai+1=t; 程序設(shè)計基礎(chǔ)854209584209548209542809542089a0a1a2a3a4a

10、5for(i=0;iai+1) t=ai;ai=ai+1;ai+1=t; 程序設(shè)計基礎(chǔ)542089452089425089420589a0a1a2a3a4a5for(i=0;iai+1) t=ai;ai=ai+1;ai+1=t; 程序設(shè)計基礎(chǔ)420589240589204589a0a1a2a3a4a5for(i=0;iai+1) t=ai;ai=ai+1;ai+1=t; 程序設(shè)計基礎(chǔ)204589024589a0a1a2a3a4a5for(i=0;iai+1) t=ai;ai=ai+1;ai+1=t; 程序設(shè)計基礎(chǔ)for(i=0;iai+1) for(i=0;iai+1) for(i=0;iai

11、+1) for(i=0;iai+1) for(j=0;j5;j+)程序設(shè)計基礎(chǔ)int a10; int i,j,t;printf(input 10 numbers :n);for (i=0;i10;i+) scanf(%d,&ai); printf(n);for(j=0;j9;j+)for(i=0;iai+1) t=ai;ai=ai+1;ai+1=t;printf(the sorted numbers :n);for(i=0;i10;i+) printf(%d ,ai);printf(n);程序設(shè)計基礎(chǔ)2456 1847 1243 1600 2346 27573045 2018 172

12、5 2020 2458 14361427 1175 1046 1976 1477 20181分隊分隊2分隊分隊3分隊分隊隊員隊員1 隊員隊員2隊員隊員3 隊員隊員4隊員隊員5隊員隊員6float pay36;程序設(shè)計基礎(chǔ)7.2.1怎樣定義二維數(shù)組怎樣定義二維數(shù)組7.2.2怎樣引用二維數(shù)組的元素怎樣引用二維數(shù)組的元素7.2.3二維數(shù)組的初始化二維數(shù)組的初始化7.2.4二維數(shù)組程序舉例二維數(shù)組程序舉例程序設(shè)計基礎(chǔ)二維數(shù)組定義的一般形式為二維數(shù)組定義的一般形式為 類型符類型符 數(shù)組名數(shù)組名常量表達(dá)式常量表達(dá)式常量表達(dá)式常量表達(dá)式; 如:如:float a34,b510;二維數(shù)組可被看作是一種特殊的一

13、維數(shù)組:二維數(shù)組可被看作是一種特殊的一維數(shù)組: 它的元素又是一個一維數(shù)組它的元素又是一個一維數(shù)組例如,把例如,把a(bǔ)看作是一個一維數(shù)組,它有看作是一個一維數(shù)組,它有3個元素:個元素: a0、a1、a2每個元素又是一個包含每個元素又是一個包含4個元素的一維數(shù)組個元素的一維數(shù)組程序設(shè)計基礎(chǔ)a00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23a0a1a2程序設(shè)計基礎(chǔ)a00 a01 a02 a03a10 a11 a12 a13a20 a21 a22 a23邏輯存儲邏輯存儲內(nèi)存中的存儲順序內(nèi)存中的存儲順序程序設(shè)計基礎(chǔ)二維數(shù)組元素的表示形式為二維數(shù)組元素的表示形式為:

14、數(shù)組名下標(biāo)下標(biāo)數(shù)組名下標(biāo)下標(biāo) b12=a23/2 合法合法for(i=0;i3;i+) printf(“%d,%dn”,ai0,a0i);合法合法程序設(shè)計基礎(chǔ)int a34=1,2,3,4,5,6,7,8, 9,10,11,12;int a34=1,2,3,4,5,6,7,8,9,10,11,12;int a34=1,5,9;等價于等價于int a34=1,0,0,0,5,0,0,0, 9,0,0,0;int a34=1,5,6;相當(dāng)于相當(dāng)于int a34=1,5,6,0;程序設(shè)計基礎(chǔ)int a34=1,2,3,4,5,6,7,8,9,10,11,12;等價等價于于:int a 4=1,2,3

15、,4,5,6,7,8,9,10,11,12;int a4=0,0,3, ,0,10;合法合法程序設(shè)計基礎(chǔ) 例例7.4 將一個二維數(shù)組行和列的元素互換,將一個二維數(shù)組行和列的元素互換,存到另一個二維數(shù)組中。存到另一個二維數(shù)組中。654321a635241b程序設(shè)計基礎(chǔ)解題思路:解題思路:u可以定義兩個數(shù)組:數(shù)組可以定義兩個數(shù)組:數(shù)組a為為2行行3列,存放指定列,存放指定的的6個數(shù)個數(shù)u數(shù)組數(shù)組b為為3行行2列,開始時未賦值列,開始時未賦值u將將a數(shù)組中的元素數(shù)組中的元素aij存放到存放到b數(shù)組中的數(shù)組中的bji元素中元素中u用嵌套的用嵌套的for循環(huán)完成循環(huán)完成程序設(shè)計基礎(chǔ)#include in

16、t main() int a23=1,2,3,4,5,6; int b32,i,j; printf(array a:n); for (i=0;i=1;i+) for (j=0;j=2;j+) printf(%5d,aij); bji=aij; printf(n); 處理處理a的一行中各元素的一行中各元素處理處理a中某一列元素中某一列元素輸出輸出a的的各元素各元素a元素值賦給元素值賦給b相應(yīng)元素相應(yīng)元素程序設(shè)計基礎(chǔ) printf(array b:n); for (i=0;i=2;i+) for(j=0;jmax,則表示則表示a01是已經(jīng)比過的數(shù)據(jù)中值最大的,是已經(jīng)比過的數(shù)據(jù)中值最大的,把它的值賦

17、給把它的值賦給max,取代了,取代了max的原值的原值u以后依此處理,以后依此處理,最后最后max就是最大的值就是最大的值程序設(shè)計基礎(chǔ) for i=0 to 2 for j=0 to 3max=aijrow=Icolum=jaijmax真真 max=a00輸出:輸出:max,row,colum假假程序設(shè)計基礎(chǔ)記行號記行號 int i,j,row=0,colum=0,max; int a34=1,2,3,4,9,8,7,6, -10,10,-5,2; max=a00; for (i=0;i=2;i+) for (j=0;jmax) max=aij; row=i; colum=j; printf(

18、max=%dnrow=%dn colum=%dn,max,row,colum);記記最大值最大值記記列列號號程序設(shè)計基礎(chǔ)一個變量有地址,一個數(shù)組包含若干元素一個變量有地址,一個數(shù)組包含若干元素,每個數(shù)組元素都有相應(yīng)的地址,每個數(shù)組元素都有相應(yīng)的地址指針變量可以指向數(shù)組元素(把某一元素指針變量可以指向數(shù)組元素(把某一元素的地址放到一個指針變量中)的地址放到一個指針變量中)所謂數(shù)組元素的指針就是數(shù)組元素的地址所謂數(shù)組元素的指針就是數(shù)組元素的地址程序設(shè)計基礎(chǔ)可以用一個指針變量指向一個數(shù)組元素可以用一個指針變量指向一個數(shù)組元素 int a10=1,3,5,7,9,11,13,15,17,19; int

19、 *p; p=&a0;等價于等價于p=a;等價于等價于int *p=a;或或int *p=&a0;注意注意:數(shù)組名數(shù)組名a不代表整個數(shù)組,不代表整個數(shù)組,只代表數(shù)組首元素的地址。只代表數(shù)組首元素的地址?!皃=a;”的作用是的作用是“把把a(bǔ)數(shù)組的首元素的地數(shù)組的首元素的地址賦給指針變量址賦給指針變量p”,而不是,而不是“把把數(shù)組數(shù)組a各元素的值賦給各元素的值賦給p”。程序設(shè)計基礎(chǔ)在指針指向數(shù)組元素時,在指針指向數(shù)組元素時,允許允許以下運算:以下運算:u加一個整數(shù)加一個整數(shù)(用用+或或+=),如,如p+1u減一個整數(shù)減一個整數(shù)(用用-或或-=),如,如p-1u自加運算,如自加運算,

20、如p+,+pu自減運算,如自減運算,如p-,-pu兩個指針相減,如兩個指針相減,如p1-p2 (只有只有p1和和p2都都指向同一數(shù)組中的元素時才有意義指向同一數(shù)組中的元素時才有意義)程序設(shè)計基礎(chǔ)(1) 如果指針變量如果指針變量p已指向數(shù)組中的一個元已指向數(shù)組中的一個元素,則素,則p+1指向同一數(shù)組中的下一個元素指向同一數(shù)組中的下一個元素,p-1指向同一數(shù)組中的上一個元素。指向同一數(shù)組中的上一個元素。 float a10,*p=a; 假設(shè)假設(shè)a0的地址為的地址為2000,則,則up的值為的值為2000up+1的值為的值為2004uP-1的值為的值為1996越界越界程序設(shè)計基礎(chǔ)(2) 如果的初如果

21、的初值為值為&a0,則則p+i和和a+i就就是數(shù)組元素是數(shù)組元素ai的地址,的地址,或者說,它們或者說,它們指向指向a數(shù)組序號數(shù)組序號為為i的元素的元素a0a1a2a3a4a5a6a7a8a9pp+1,a+1 p+i,a+i p+9,a+9 程序設(shè)計基礎(chǔ)(3) *(p+i)或或*(a+i)是是p+i或或a+i所指向所指向的數(shù)組元素,的數(shù)組元素,即即ai。a0a1a2a3a4a5a6a7a8a9pp+1,a+1 p+i,a+i p+9,a+9 *(p+i)程序設(shè)計基礎(chǔ)(4) 如果指針如果指針p1和和p2都指向同一數(shù)組都指向同一數(shù)組 p2-p1的值的值是是4 不能不能p1+p2a0a1a2

22、a3a4a5a6a7a8a9p1p2 程序設(shè)計基礎(chǔ)引用一個數(shù)組元素,可用下面兩種方法:引用一個數(shù)組元素,可用下面兩種方法: ()() 下標(biāo)法,如下標(biāo)法,如ai形式形式 ()() 指針法,如指針法,如*(a+i)或或*(p+i) 其中其中a是數(shù)組名,是數(shù)組名,p是指向數(shù)組元素的指針是指向數(shù)組元素的指針變量,其初值變量,其初值p=a程序設(shè)計基礎(chǔ) 例例7.6 有一個整型數(shù)組有一個整型數(shù)組a,有,有10個元素,個元素,要求輸出數(shù)組中的全部元素。要求輸出數(shù)組中的全部元素。解題思路:引用數(shù)組中各元素的值有解題思路:引用數(shù)組中各元素的值有3種種方法:方法:(1)下標(biāo)法下標(biāo)法;(2)通過數(shù)組名計算通過數(shù)組名計

23、算數(shù)組元素地址,找出元素的值數(shù)組元素地址,找出元素的值;(3) 用指用指針變量指向數(shù)組元素針變量指向數(shù)組元素分別寫出程序,以資比較分析。分別寫出程序,以資比較分析。程序設(shè)計基礎(chǔ)(1) 下標(biāo)法。下標(biāo)法。 #include int main() int a10; int i; printf(“enter 10 integer numbers:n); for(i=0;i10;i+) scanf(%d,&ai); for(i=0;i10;i+) printf(“%d ”,ai); printf(%n); return 0; 程序設(shè)計基礎(chǔ)(2) 通過數(shù)組名計算數(shù)組元素地址,找出元素的值通過數(shù)組名

24、計算數(shù)組元素地址,找出元素的值#include int main() int a10; int i; printf(“enter 10 integer numbers:n); for(i=0;i10;i+) scanf(%d,&ai); for(i=0;i10;i+) printf(“%d ”,*(a+i); printf(n); return 0; scanf(%d,a+i);程序設(shè)計基礎(chǔ)(3) 用指針變量指向數(shù)組元素用指針變量指向數(shù)組元素 #include int main() int a10; int *p,i; printf(“enter 10 integer numbers:

25、n); for(i=0;i10;i+) scanf(%d,&ai); for(p=a;p(a+10);p+) printf(“%d ”,*p); printf(n); return 0;for(p=a;p(a+10);p+) scanf(%d,p);for(p=a;p(a+10);a+) printf(“%d ”,*a); 錯!錯!程序設(shè)計基礎(chǔ)用數(shù)組名作函數(shù)參數(shù)用數(shù)組名作函數(shù)參數(shù)時,因為時,因為實參數(shù)組名實參數(shù)組名代表該數(shù)組首元素的地址代表該數(shù)組首元素的地址,形參應(yīng)該是一形參應(yīng)該是一個指針變量個指針變量C編譯都是將形參數(shù)組名作為指針變量來編譯都是將形參數(shù)組名作為指針變量來處理的處理的程

26、序設(shè)計基礎(chǔ)int main() void fun(int arr,int n; int array10; fun (array,10); return 0; void fun(int arr ,int n) fun(int *arr,int n)程序設(shè)計基礎(chǔ)int main() void fun(int arr,int n; int array10; fun (array,10); return 0; void fun(int *arr,int n) 程序設(shè)計基礎(chǔ)例例7.8 將數(shù)組將數(shù)組a中中n個整數(shù)按相反順序存放個整數(shù)按相反順序存放解題思路:將解題思路:將a0與與an-1對換,對換,將將a4

27、與與a5對換。對換。ji程序設(shè)計基礎(chǔ)ji程序設(shè)計基礎(chǔ)ji程序設(shè)計基礎(chǔ)ji程序設(shè)計基礎(chǔ)ji程序設(shè)計基礎(chǔ)#include int main() void inv(int x ,int n); int i, a10=3,7,9,11,0,6,7,5,4,2; for(i=0;i10;i+) printf(“%d ”,ai); printf(n); inv(a,10); for(i=0;i10;i+) printf(“%d ”,ai); printf(n); return 0;程序設(shè)計基礎(chǔ)void inv(int x ,int n) int temp,i,j,m=(n-1)/2; for(i=0;i=

28、m;i+) j=n-1-i; temp=xi;xi=xj;xj=temp; 程序設(shè)計基礎(chǔ)例例7.9 改寫例改寫例7.8,用指針變量作實參。,用指針變量作實參。#include int main() void inv(int *x,int n); int i, arr10,*p=arr; for(i=0;i10;i+,p+) scanf(“%d”,p); inv(p,10); for(p=arr;parr+10;p+) printf(“%d ”,*p); printf(n); return 0;不可少!不可少!程序設(shè)計基礎(chǔ) 例例7.10 用指針方法對用指針方法對10個整數(shù)按由大到個整數(shù)按由大到小

29、順序排序。小順序排序。解題思路:解題思路:u在主函數(shù)中定義數(shù)組在主函數(shù)中定義數(shù)組a存放存放10個整數(shù),定義個整數(shù),定義int *型指針變量型指針變量p指向指向a0u定義函數(shù)定義函數(shù)sort使數(shù)組使數(shù)組a中的元素按由大到小的中的元素按由大到小的順序排列順序排列u在主函數(shù)中調(diào)用在主函數(shù)中調(diào)用sort函數(shù),用指針函數(shù),用指針p作實參作實參u用選擇法進(jìn)行排序用選擇法進(jìn)行排序程序設(shè)計基礎(chǔ)#include int main() void sort(int x ,int n); int i,*p,a10; p=a; for(i=0;i10;i+) scanf(“%d”,p+); p=a; sort(p,10

30、); for(p=a,i=0;i10;i+) printf(“%d ”,*p); p+; printf(n); return 0;程序設(shè)計基礎(chǔ)void sort(int x,int n) int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;jxk) k=j; if(k!=i) t=xi;xi=xk;xk=t; void sort(int *x,int n)if (*(x+j)*(x+k) k=j;t=*(x+i);*(x+i)=*(x+k);*(x+k)=t;程序設(shè)計基礎(chǔ)指針變量可以指向一維數(shù)組中的元素,也指針變量可以指向一維數(shù)組中的元素,也可以指向多維數(shù)

31、組中的元素。但在概念上可以指向多維數(shù)組中的元素。但在概念上和使用方法上,多維數(shù)組的指針比一維數(shù)和使用方法上,多維數(shù)組的指針比一維數(shù)組的指針要復(fù)雜一些。組的指針要復(fù)雜一些。程序設(shè)計基礎(chǔ)1. 多維數(shù)組元素的地址多維數(shù)組元素的地址int a34=1,3,5,7, 9,11,13,15,17,19,21,23;1357911131517192123a0a1a2aa+1a+2a0 a0+1 a0+2 a0+3行指針行指針列指針列指針程序設(shè)計基礎(chǔ)a代表第代表第0行首地址行首地址a+1代表第代表第1行首地址行首地址a+2代表第代表第2行首地址行首地址1357911131517192123a0a1a2aa+1

32、a+2a0 a0+1 a0+2 a0+3行指針行指針列指針列指針行指針每加行指針每加1,走一行,走一行程序設(shè)計基礎(chǔ)a+i代表行號為代表行號為i的行首地址(按行變化)的行首地址(按行變化)*(a+i)代表什么?代表什么?1357911131517192123a0a1a2aa+1a+2a0 a0+1 a0+2 a0+3行指針行指針列指針列指針相當(dāng)于相當(dāng)于ai程序設(shè)計基礎(chǔ)a0代表代表a00的地址的地址a0+1代表代表a01的地址的地址a0+2代表代表a02的地址的地址a0+3代表代表a03的地址的地址1357911131517192123a0a1a2aa+1a+2a0 a0+1 a0+2 a0+3行

33、指針行指針列指針列指針列指針每加列指針每加1,走一列,走一列程序設(shè)計基礎(chǔ)a1代表誰的地址?代表誰的地址?a1+1代表誰的地址?代表誰的地址?a1+2代表誰的地址?代表誰的地址?a1+3代表誰的地址?代表誰的地址?1357911131517192123a0a1a2aa+1a+2a0 a0+1 a0+2 a0+3行指針行指針列指針列指針程序設(shè)計基礎(chǔ)ai+j代表誰的地址?代表誰的地址?1357911131517192123a0a1a2aa+1a+2a0 a0+1 a0+2 a0+3行指針行指針列指針列指針代表代表aij的地址的地址*(ai+j)代表什么?代表什么?代表元素代表元素aij*(*(a+i

34、)+j)代表什么?代表什么?與與*(ai+j)等價等價程序設(shè)計基礎(chǔ)例例7.11 二維數(shù)組的有關(guān)數(shù)據(jù)二維數(shù)組的有關(guān)數(shù)據(jù)(地址和值地址和值)#include int main() int a34=1,3,5,7,9,11,13,15, 17,19,21,23;程序設(shè)計基礎(chǔ) printf(“%d,%dn”,a,*a); printf(“%d,%dn”,a0,*(a+0); printf(“%d,%dn”,&a0,&a00); printf(“%d,%dn”,a1,a+1); printf(“%d,%dn”,&a10,*(a+1)+0); printf(“%d,%dn”,a2,

35、*(a+2); printf(“%d,%dn”,&a2,a+2); printf(“%d,%dn”,a10,*(*(a+1)+0); printf(“%d,%dn”,*a2,*(*(a+2)+0); return 0;程序設(shè)計基礎(chǔ)2. 指向多維數(shù)組元素的指針變量指向多維數(shù)組元素的指針變量(1) 指向數(shù)組元素的指針變量指向數(shù)組元素的指針變量 例例7.12 有一個有一個34的二維數(shù)組,要求的二維數(shù)組,要求用指向元素的指針變量輸出二維數(shù)組各用指向元素的指針變量輸出二維數(shù)組各元素的值。元素的值。程序設(shè)計基礎(chǔ)解題思路:解題思路:u二維數(shù)組的元素是整型的,它相當(dāng)于整型變二維數(shù)組的元素是整型的,它相

36、當(dāng)于整型變量,可以用量,可以用int*型指針變量指向它型指針變量指向它u二維數(shù)組的元素在內(nèi)存中是按行順序存放的二維數(shù)組的元素在內(nèi)存中是按行順序存放的,即存放完序號為,即存放完序號為0的行中的全部元素后,的行中的全部元素后,接著存放序號為接著存放序號為1的行中的全部元素,依此的行中的全部元素,依此類推類推u因此可以用一個指向整型元素的指針變量,因此可以用一個指向整型元素的指針變量,依次指向各個元素依次指向各個元素程序設(shè)計基礎(chǔ)#include int main() int a34=1,3,5,7,9,11,13,15, 17,19,21,23; int *p; for(p=a0;pa0+12;p+

37、) if(p-a0)%4=0) printf(“n”); printf(“%4d”,*p); printf(n); return 0;控制換行控制換行逐個訪問各元素時常用此類指針逐個訪問各元素時常用此類指針程序設(shè)計基礎(chǔ)(2) 指向由個元素組成的一維數(shù)組的指針指向由個元素組成的一維數(shù)組的指針變量變量 例例7.13 輸出二維數(shù)組任一行任一列元素的輸出二維數(shù)組任一行任一列元素的值。值。解題思路:假設(shè)仍然用例解題思路:假設(shè)仍然用例7.12程序中的二程序中的二維數(shù)組,例維數(shù)組,例7.12中定義的指針變量是指向中定義的指針變量是指向變量或數(shù)組元素的,現(xiàn)在改用指向一維數(shù)變量或數(shù)組元素的,現(xiàn)在改用指向一維數(shù)組

38、的指針變量。組的指針變量。程序設(shè)計基礎(chǔ)#include int main()int a34=1,3,5,7,9,11,13,15, 17,19,21,23; int (*p)4,i,j; p=a; printf(“enter row and colum:); scanf(“%d,%d”,&i,&j); printf(“a%d,%d=%dn”, i,j,*(*(p+i)+j); return 0;行指針行指針aij程序設(shè)計基礎(chǔ)3. 用指向數(shù)組的指針作函數(shù)參數(shù)用指向數(shù)組的指針作函數(shù)參數(shù)一維數(shù)組名可以作為函數(shù)參數(shù),多維數(shù)組一維數(shù)組名可以作為函數(shù)參數(shù),多維數(shù)組名也可作函數(shù)參數(shù)。名也可作

39、函數(shù)參數(shù)。用指針變量作形參,以接受實參數(shù)組名傳用指針變量作形參,以接受實參數(shù)組名傳遞來的地址。遞來的地址??梢杂袃煞N方法:可以有兩種方法:用指向變量的指針變量用指向變量的指針變量用指向一維數(shù)組的指針變量用指向一維數(shù)組的指針變量程序設(shè)計基礎(chǔ) 例例7.14 有一個班,有一個班,3個學(xué)生,各學(xué)個學(xué)生,各學(xué)4門課,門課,計算總平均分?jǐn)?shù)以及第計算總平均分?jǐn)?shù)以及第n個學(xué)生的成績。個學(xué)生的成績。 解題思路:這個題目是很簡單的。本例用指解題思路:這個題目是很簡單的。本例用指向數(shù)組的指針作函數(shù)參數(shù)。用函數(shù)向數(shù)組的指針作函數(shù)參數(shù)。用函數(shù)average求總平均成績,用函數(shù)求總平均成績,用函數(shù)search找找出并輸出

40、第出并輸出第i個學(xué)生的成績。個學(xué)生的成績。程序設(shè)計基礎(chǔ)#include int main() void average(float *p,int n); void search(float (*p)4,int n); float score34=65,67,70,60, 80,87,90,81,90,99,100,98; average(*score,12); search(score,2); return 0;score00的地址的地址程序設(shè)計基礎(chǔ)void average(float *p,int n) float *p_end; float sum=0,aver; p_end=p+n-1;

41、 for( ;p=p_end; p+) sum=sum+(*p); aver=sum/n; printf(average=%5.2fn,aver);6567706080879081909910098pp_endp+1程序設(shè)計基礎(chǔ)void search(float (*p)4,int n) int i; printf(The score of No.%d are:n,n); for(i=0;i4;i+) printf(%5.2f ,*(*(p+n)+i); printf(n);6567706080879081909910098pp+2程序設(shè)計基礎(chǔ)7.4.1數(shù)組元素作函數(shù)實參數(shù)組元素作函數(shù)實參7.

42、4.2數(shù)組名作函數(shù)參數(shù)數(shù)組名作函數(shù)參數(shù)7.4.3多維數(shù)組名作函數(shù)參數(shù)多維數(shù)組名作函數(shù)參數(shù)程序設(shè)計基礎(chǔ) 例例7.9 輸入輸入10個數(shù),要求輸出其中值個數(shù),要求輸出其中值最大的元素和該數(shù)是第幾個數(shù)。最大的元素和該數(shù)是第幾個數(shù)。程序設(shè)計基礎(chǔ)解題思路:解題思路:u定義數(shù)組定義數(shù)組a,用來存放,用來存放10個數(shù)個數(shù)u設(shè)計函數(shù)設(shè)計函數(shù)max,用來求兩個數(shù)中的大者,用來求兩個數(shù)中的大者u在主函數(shù)中定義變量在主函數(shù)中定義變量m,初值為,初值為a0,每次調(diào)用每次調(diào)用max函數(shù)后的返回值存放在函數(shù)后的返回值存放在m中中u用用“打擂臺打擂臺”算法,依次將數(shù)組元素算法,依次將數(shù)組元素a1到到a9與與m比較,最后得到的

43、比較,最后得到的m值值就是就是10個數(shù)中的最大者個數(shù)中的最大者程序設(shè)計基礎(chǔ)#include int main() int max(int x,int y); int a10,m,n,i; printf(“10 integer numbers:n); for(i=0;i10;i+) scanf(%d,&ai); printf(n);程序設(shè)計基礎(chǔ) for(i=1,m=a0,n=0;im) m=max(m,ai); n=i; printf(“l(fā)argest number is %dn,m); printf(“%dth number.n“,n+1);int max(int x,int y) r

44、eturn(xy?x:y); 程序設(shè)計基礎(chǔ)除了可以用數(shù)組元素作為函數(shù)參數(shù)外除了可以用數(shù)組元素作為函數(shù)參數(shù)外,還可以用數(shù)組名作函數(shù)參數(shù),還可以用數(shù)組名作函數(shù)參數(shù)(包括實包括實參和形參參和形參)用數(shù)組元素作實參時,向形參變量傳用數(shù)組元素作實參時,向形參變量傳遞的是數(shù)組元素的值遞的是數(shù)組元素的值用數(shù)組名作函數(shù)實參時,向形參用數(shù)組名作函數(shù)實參時,向形參 傳遞傳遞的是數(shù)組首元素的地址的是數(shù)組首元素的地址程序設(shè)計基礎(chǔ) 例例7.10 有一個一維數(shù)組有一個一維數(shù)組score,內(nèi)放,內(nèi)放10個學(xué)生成績,求平均成績。個學(xué)生成績,求平均成績。解題思路:解題思路:u用函數(shù)用函數(shù)average求平均成績,用數(shù)組名求平均

45、成績,用數(shù)組名作為函數(shù)實參,形參也用數(shù)組名作為函數(shù)實參,形參也用數(shù)組名u在在average函數(shù)中引用各數(shù)組元素,求函數(shù)中引用各數(shù)組元素,求平均成績并返回平均成績并返回main函數(shù)函數(shù)程序設(shè)計基礎(chǔ)#include int main() float average(float array10); float score10,aver; int i; printf(input 10 scores:n); for(i=0;i10;i+) scanf(%f,&scorei); printf(n); aver=average(score); printf(%5.2fn,aver); return

46、0; 定義實參數(shù)組定義實參數(shù)組程序設(shè)計基礎(chǔ)float average(float array10) int i; float aver,sum=array0; for(i=1;i10;i+) sum=sum+arrayi; aver=sum/10; return(aver);定義形參數(shù)組定義形參數(shù)組相當(dāng)于相當(dāng)于score0相當(dāng)于相當(dāng)于scorei程序設(shè)計基礎(chǔ) 例例7.11 有兩個班級,分別有有兩個班級,分別有35名和名和30名學(xué)生,調(diào)用一個名學(xué)生,調(diào)用一個average函數(shù),分別求函數(shù),分別求這兩個班的學(xué)生的平均成績。這兩個班的學(xué)生的平均成績。程序設(shè)計基礎(chǔ)解題思路:解題思路:u需要解決怎樣用同

47、一個函數(shù)求兩個不同長度的需要解決怎樣用同一個函數(shù)求兩個不同長度的數(shù)組的平均值的問題數(shù)組的平均值的問題u定義定義average函數(shù)時不指定數(shù)組的長度,在函數(shù)時不指定數(shù)組的長度,在形參表中增加一個整型變量形參表中增加一個整型變量iu從主函數(shù)把數(shù)組實際長度從實參傳遞給形參從主函數(shù)把數(shù)組實際長度從實參傳遞給形參iu這個這個i用來在用來在average函數(shù)中控制循環(huán)的次數(shù)函數(shù)中控制循環(huán)的次數(shù)u為簡化,設(shè)兩個班的學(xué)生數(shù)分別為為簡化,設(shè)兩個班的學(xué)生數(shù)分別為5和和10程序設(shè)計基礎(chǔ)#include int main() float average(float array ,int n); float score

48、15=98.5,97,91.5,60,55; float score210=67.5,89.5,99,69.5, 77,89.5,76.5,54,60,99.5; printf(“%6.2fn”,average(score1,5); printf(“%6.2fn”,average(score2,10); return 0;程序設(shè)計基礎(chǔ)float average(float array ,int n) int i; float aver,sum=array0; for(i=1;in;i+) sum=sum+arrayi; aver=sum/n; return(aver);調(diào)用形式為調(diào)用形式為av

49、erage(score1,5)時時相當(dāng)于相當(dāng)于score10相當(dāng)于相當(dāng)于score1i相當(dāng)于相當(dāng)于5程序設(shè)計基礎(chǔ)float average(float array ,int n) int i; float aver,sum=array0; for(i=1;in;i+) sum=sum+arrayi; aver=sum/n; return(aver);調(diào)用形式為調(diào)用形式為average(score2,10)時時相當(dāng)于相當(dāng)于score20相當(dāng)于相當(dāng)于score2i相當(dāng)于相當(dāng)于10程序設(shè)計基礎(chǔ) 例例7.12用選擇法對數(shù)組中用選擇法對數(shù)組中10個整數(shù)按由個整數(shù)按由小到大排序。小到大排序。解題思路:解題

50、思路:u所謂選擇法就是先將所謂選擇法就是先將10個數(shù)中最小的數(shù)與個數(shù)中最小的數(shù)與a0對換對換;再將再將a1到到a9中最小的數(shù)與中最小的數(shù)與a1對換對換每比較一輪每比較一輪,找出一個未經(jīng)排找出一個未經(jīng)排序的數(shù)中最小的一個序的數(shù)中最小的一個u共比較共比較9輪輪程序設(shè)計基礎(chǔ)a0 a1 a2 a3 a4 3 6 1 9 4 1 6 3 9 4 1 3 6 9 4 1 3 4 9 6 1 3 4 6 9小到大排序小到大排序程序設(shè)計基礎(chǔ)#include int main() void sort(int array,int n); int a10,i; printf(enter array:n); for(

51、i=0;i10;i+) scanf(%d,&ai); sort(a,10); printf(The sorted array:n); for(i=0;i10;i+) printf(%d ,ai); printf(n); return 0; 程序設(shè)計基礎(chǔ)void sort(int array,int n) int i,j,k,t; for(i=0;in-1;i+) k=i; for(j=i+1;jn;j+) if(arrayjarrayk) k=j; t=arrayk; arrayk=arrayi; arrayi=t; 在在sortisort9中,中,最小數(shù)與最小數(shù)與sorti對換對換程

52、序設(shè)計基礎(chǔ) 例例7.13 有一個的矩陣,求所有有一個的矩陣,求所有元素中的最大值。元素中的最大值。解題思路:先使變量解題思路:先使變量max的初值等于的初值等于矩陣中第一個元素的值,然后將矩陣矩陣中第一個元素的值,然后將矩陣中各個元素的值與中各個元素的值與max相比,每次比相比,每次比較后都把較后都把“大者大者”存放在存放在max中,全中,全部元素比較完后,部元素比較完后,max 的值就是所有的值就是所有元素的最大值。元素的最大值。程序設(shè)計基礎(chǔ)#include int main() int max_value(int array4); int a34=1,3,5,7,2,4,6,8, 15,1

53、7,34,12; printf(“Max value is %dn”, max_value(a); return 0;可以省略可以省略不能省略不能省略要與要與形參數(shù)組第形參數(shù)組第二二維大小維大小相同相同程序設(shè)計基礎(chǔ)int max_value(int array4) int i,j,max; max = array00; for (i=0;i3;i+) for(j=0;jmax) max = arrayij; return (max);要與實參要與實參數(shù)組第數(shù)組第二二維大小維大小相同相同程序設(shè)計基礎(chǔ)輸入輸入5個整數(shù),將它們存入數(shù)組個整數(shù),將它們存入數(shù)組a中,再輸入中,再輸入1個數(shù)個數(shù)x,然后在數(shù)

54、組中查找然后在數(shù)組中查找x,如果找到,如果找到,輸出相應(yīng)的位置,否則,輸出輸出相應(yīng)的位置,否則,輸出“Not Found”。輸入:輸入:2 9 8 9 6 9輸出:輸出:1輸入:輸入:2 9 8 9 6 7輸出:輸出:Not Found綜合例題:綜合例題:在數(shù)組中查找一個給定的數(shù)在數(shù)組中查找一個給定的數(shù)程序設(shè)計基礎(chǔ)#include int main(void) int i, x; int a5; printf(Enter 5 integers: ); for(i = 0; i 5; i+) scanf(%d, &ai); printf(Enter x: ); scanf(%d, &am

55、p;x); for(i = 0; i 5; i+) if(ai = x) printf(Index is %dn, i+1); break; if(i= 5) printf(Not Foundn); return 0; Enter 5 integers: 2 9 8 1 9Enter x: 9Index is 1Enter 5 integers: 2 9 8 1 9Enter x: 7Not Found程序設(shè)計基礎(chǔ)#include int main(void) int i, a10,n; void reverse(int p , int n); printf(Enter n: ); scanf

56、(%d, &n); printf(Enter %d integers: , n); for(i = 0; i n; i+) scanf(%d, &ai); for(i=0, j=n-1; ij; i+, j-) t = ai; ai = aj; aj = t; for(i = 0; i n; i+) printf(%dt, ai);return 0; Enter n:10Enter 10 integers: 10 9 8 7 6 5 4 3 2 11 2 3 4 5 6 7 8 9 10綜合例題:將數(shù)組元素逆序存放綜合例題:將數(shù)組元素逆序存放程序設(shè)計基礎(chǔ)7.5 動態(tài)創(chuàng)建數(shù)組動態(tài)

57、創(chuàng)建數(shù)組對內(nèi)存的動態(tài)分配是通過系統(tǒng)提供的庫函數(shù)對內(nèi)存的動態(tài)分配是通過系統(tǒng)提供的庫函數(shù)來實現(xiàn)的,主要有來實現(xiàn)的,主要有malloc,calloc,free這這3個函數(shù)。個函數(shù)。程序設(shè)計基礎(chǔ)malloc函數(shù)函數(shù)其函數(shù)原型為其函數(shù)原型為 void *malloc(unsigned int size); u其作用是在內(nèi)存的動態(tài)存儲區(qū)中分配一個長度其作用是在內(nèi)存的動態(tài)存儲區(qū)中分配一個長度為為size的連續(xù)空間的連續(xù)空間u函數(shù)的值是所分配區(qū)域的第一個字節(jié)的地址,函數(shù)的值是所分配區(qū)域的第一個字節(jié)的地址,或者說,此函數(shù)是一個指針型函數(shù),返回的指或者說,此函數(shù)是一個指針型函數(shù),返回的指針指向該分配域的開頭位置針指向該分配域的開頭位置程序設(shè)計基礎(chǔ) malloc

溫馨提示

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

評論

0/150

提交評論