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

下載本文檔

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

文檔簡介

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

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

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

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

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

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

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

8、個數,是很困難的。個數,是很困難的。u如果用數組處理,每一個數組元素代表數列中如果用數組處理,每一個數組元素代表數列中的一個數,依次求出各數并存放在相應的數組的一個數,依次求出各數并存放在相應的數組元素中元素中程序設計基礎#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;程序設計基礎 例例7.3 有有10個個整型數據整型數據,要求對它們按,要求對它們按

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

10、5for(i=0;iai+1) t=ai;ai=ai+1;ai+1=t; 程序設計基礎542089452089425089420589a0a1a2a3a4a5for(i=0;iai+1) t=ai;ai=ai+1;ai+1=t; 程序設計基礎420589240589204589a0a1a2a3a4a5for(i=0;iai+1) t=ai;ai=ai+1;ai+1=t; 程序設計基礎204589024589a0a1a2a3a4a5for(i=0;iai+1) t=ai;ai=ai+1;ai+1=t; 程序設計基礎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+)程序設計基礎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);程序設計基礎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;程序設計基礎7.2.1怎樣定義二維數組怎樣定義二維數組7.2.2怎樣引用二維數組的元素怎樣引用二維數組的元素7.2.3二維數組的初始化二維數組的初始化7.2.4二維數組程序舉例二維數組程序舉例程序設計基礎二維數組定義的一般形式為二維數組定義的一般形式為 類型符類型符 數組名數組名常量表達式常量表達式常量表達式常量表達式; 如:如:float a34,b510;二維數組可被看作是一種特殊的一

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

14、數組名下標下標數組名下標下標 b12=a23/2 合法合法for(i=0;i3;i+) printf(“%d,%dn”,ai0,a0i);合法合法程序設計基礎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;相當于相當于int a34=1,5,6,0;程序設計基礎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;合法合法程序設計基礎 例例7.4 將一個二維數組行和列的元素互換,將一個二維數組行和列的元素互換,存到另一個二維數組中。存到另一個二維數組中。654321a635241b程序設計基礎解題思路:解題思路:u可以定義兩個數組:數組可以定義兩個數組:數組a為為2行行3列,存放指定列,存放指定的的6個數個數u數組數組b為為3行行2列,開始時未賦值列,開始時未賦值u將將a數組中的元素數組中的元素aij存放到存放到b數組中的數組中的bji元素中元素中u用嵌套的用嵌套的for循環完成循環完成程序設計基礎#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相應元素相應元素程序設計基礎 printf(array b:n); for (i=0;i=2;i+) for(j=0;jmax,則表示則表示a01是已經比過的數據中值最大的,是已經比過的數據中值最大的,把它的值賦

17、給把它的值賦給max,取代了,取代了max的原值的原值u以后依此處理,以后依此處理,最后最后max就是最大的值就是最大的值程序設計基礎 for i=0 to 2 for j=0 to 3max=aijrow=Icolum=jaijmax真真 max=a00輸出:輸出:max,row,colum假假程序設計基礎記行號記行號 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);記記最大值最大值記記列列號號程序設計基礎一個變量有地址,一個數組包含若干元素一個變量有地址,一個數組包含若干元素,每個數組元素都有相應的地址,每個數組元素都有相應的地址指針變量可以指向數組元素(把某一元素指針變量可以指向數組元素(把某一元素的地址放到一個指針變量中)的地址放到一個指針變量中)所謂數組元素的指針就是數組元素的地址所謂數組元素的指針就是數組元素的地址程序設計基礎可以用一個指針變量指向一個數組元素可以用一個指針變量指向一個數組元素 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;注意注意:數組名數組名a不代表整個數組,不代表整個數組,只代表數組首元素的地址。只代表數組首元素的地址?!皃=a;”的作用是的作用是“把把a數組的首元素的地數組的首元素的地址賦給指針變量址賦給指針變量p”,而不是,而不是“把把數組數組a各元素的值賦給各元素的值賦給p”。程序設計基礎在指針指向數組元素時,在指針指向數組元素時,允許允許以下運算:以下運算:u加一個整數加一個整數(用用+或或+=),如,如p+1u減一個整數減一個整數(用用-或或-=),如,如p-1u自加運算,如自加運算,

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

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

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

23、算數組元素地址,找出元素的值數組元素地址,找出元素的值;(3) 用指用指針變量指向數組元素針變量指向數組元素分別寫出程序,以資比較分析。分別寫出程序,以資比較分析。程序設計基礎(1) 下標法。下標法。 #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; 程序設計基礎(2) 通過數組名計算數組元素地址,找出元素的值通過數組名

24、計算數組元素地址,找出元素的值#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);程序設計基礎(3) 用指針變量指向數組元素用指針變量指向數組元素 #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); 錯!錯!程序設計基礎用數組名作函數參數用數組名作函數參數時,因為時,因為實參數組名實參數組名代表該數組首元素的地址代表該數組首元素的地址,形參應該是一形參應該是一個指針變量個指針變量C編譯都是將形參數組名作為指針變量來編譯都是將形參數組名作為指針變量來處理的處理的程

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

27、與與a5對換。對換。ji程序設計基礎ji程序設計基礎ji程序設計基礎ji程序設計基礎ji程序設計基礎#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;程序設計基礎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; 程序設計基礎例例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;不可少!不可少!程序設計基礎 例例7.10 用指針方法對用指針方法對10個整數按由大到個整數按由大到小

29、順序排序。小順序排序。解題思路:解題思路:u在主函數中定義數組在主函數中定義數組a存放存放10個整數,定義個整數,定義int *型指針變量型指針變量p指向指向a0u定義函數定義函數sort使數組使數組a中的元素按由大到小的中的元素按由大到小的順序排列順序排列u在主函數中調用在主函數中調用sort函數,用指針函數,用指針p作實參作實參u用選擇法進行排序用選擇法進行排序程序設計基礎#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;程序設計基礎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;程序設計基礎指針變量可以指向一維數組中的元素,也指針變量可以指向一維數組中的元素,也可以指向多維數

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

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

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

34、)+j)代表什么?代表什么?與與*(ai+j)等價等價程序設計基礎例例7.11 二維數組的有關數據二維數組的有關數據(地址和值地址和值)#include int main() int a34=1,3,5,7,9,11,13,15, 17,19,21,23;程序設計基礎 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;程序設計基礎2. 指向多維數組元素的指針變量指向多維數組元素的指針變量(1) 指向數組元素的指針變量指向數組元素的指針變量 例例7.12 有一個有一個34的二維數組,要求的二維數組,要求用指向元素的指針變量輸出二維數組各用指向元素的指針變量輸出二維數組各元素的值。元素的值。程序設計基礎解題思路:解題思路:u二維數組的元素是整型的,它相當于整型變二維數組的元素是整型的,它相

36、當于整型變量,可以用量,可以用int*型指針變量指向它型指針變量指向它u二維數組的元素在內存中是按行順序存放的二維數組的元素在內存中是按行順序存放的,即存放完序號為,即存放完序號為0的行中的全部元素后,的行中的全部元素后,接著存放序號為接著存放序號為1的行中的全部元素,依此的行中的全部元素,依此類推類推u因此可以用一個指向整型元素的指針變量,因此可以用一個指向整型元素的指針變量,依次指向各個元素依次指向各個元素程序設計基礎#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;控制換行控制換行逐個訪問各元素時常用此類指針逐個訪問各元素時常用此類指針程序設計基礎(2) 指向由個元素組成的一維數組的指針指向由個元素組成的一維數組的指針變量變量 例例7.13 輸出二維數組任一行任一列元素的輸出二維數組任一行任一列元素的值。值。解題思路:假設仍然用例解題思路:假設仍然用例7.12程序中的二程序中的二維數組,例維數組,例7.12中定義的指針變量是指向中定義的指針變量是指向變量或數組元素的,現在改用指向一維數變量或數組元素的,現在改用指向一維數組

38、的指針變量。組的指針變量。程序設計基礎#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程序設計基礎3. 用指向數組的指針作函數參數用指向數組的指針作函數參數一維數組名可以作為函數參數,多維數組一維數組名可以作為函數參數,多維數組名也可作函數參數。名也可作

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

40、第出并輸出第i個學生的成績。個學生的成績。程序設計基礎#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的地址的地址程序設計基礎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程序設計基礎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程序設計基礎7.4.1數組元素作函數實參數組元素作函數實參7.

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

43、比較,最后得到的m值值就是就是10個數中的最大者個數中的最大者程序設計基礎#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);程序設計基礎 for(i=1,m=a0,n=0;im) m=max(m,ai); n=i; printf(“largest number is %dn,m); printf(“%dth number.n“,n+1);int max(int x,int y) r

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

45、成績,用數組名作為函數實參,形參也用數組名作為函數實參,形參也用數組名u在在average函數中引用各數組元素,求函數中引用各數組元素,求平均成績并返回平均成績并返回main函數函數程序設計基礎#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; 定義實參數組定義實參數組程序設計基礎float average(float array10) int i; float aver,sum=array0; for(i=1;i10;i+) sum=sum+arrayi; aver=sum/10; return(aver);定義形參數組定義形參數組相當于相當于score0相當于相當于scorei程序設計基礎 例例7.11 有兩個班級,分別有有兩個班級,分別有35名和名和30名學生,調用一個名學生,調用一個average函數,分別求函數,分別求這兩個班的學生的平均成績。這兩個班的學生的平均成績。程序設計基礎解題思路:解題思路:u需要解決怎樣用同

47、一個函數求兩個不同長度的需要解決怎樣用同一個函數求兩個不同長度的數組的平均值的問題數組的平均值的問題u定義定義average函數時不指定數組的長度,在函數時不指定數組的長度,在形參表中增加一個整型變量形參表中增加一個整型變量iu從主函數把數組實際長度從實參傳遞給形參從主函數把數組實際長度從實參傳遞給形參iu這個這個i用來在用來在average函數中控制循環的次數函數中控制循環的次數u為簡化,設兩個班的學生數分別為為簡化,設兩個班的學生數分別為5和和10程序設計基礎#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;程序設計基礎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);調用形式為調用形式為av

49、erage(score1,5)時時相當于相當于score10相當于相當于score1i相當于相當于5程序設計基礎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);調用形式為調用形式為average(score2,10)時時相當于相當于score20相當于相當于score2i相當于相當于10程序設計基礎 例例7.12用選擇法對數組中用選擇法對數組中10個整數按由個整數按由小到大排序。小到大排序。解題思路:解題

50、思路:u所謂選擇法就是先將所謂選擇法就是先將10個數中最小的數與個數中最小的數與a0對換對換;再將再將a1到到a9中最小的數與中最小的數與a1對換對換每比較一輪每比較一輪,找出一個未經排找出一個未經排序的數中最小的一個序的數中最小的一個u共比較共比較9輪輪程序設計基礎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小到大排序小到大排序程序設計基礎#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; 程序設計基礎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中,中,最小數與最小數與sorti對換對換程

52、序設計基礎 例例7.13 有一個的矩陣,求所有有一個的矩陣,求所有元素中的最大值。元素中的最大值。解題思路:先使變量解題思路:先使變量max的初值等于的初值等于矩陣中第一個元素的值,然后將矩陣矩陣中第一個元素的值,然后將矩陣中各個元素的值與中各個元素的值與max相比,每次比相比,每次比較后都把較后都把“大者大者”存放在存放在max中,全中,全部元素比較完后,部元素比較完后,max 的值就是所有的值就是所有元素的最大值。元素的最大值。程序設計基礎#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;可以省略可以省略不能省略不能省略要與要與形參數組第形參數組第二二維大小維大小相同相同程序設計基礎int max_value(int array4) int i,j,max; max = array00; for (i=0;i3;i+) for(j=0;jmax) max = arrayij; return (max);要與實參要與實參數組第數組第二二維大小維大小相同相同程序設計基礎輸入輸入5個整數,將它們存入數組個整數,將它們存入數組a中,再輸入中,再輸入1個數個數x,然后在數

54、組中查找然后在數組中查找x,如果找到,如果找到,輸出相應的位置,否則,輸出輸出相應的位置,否則,輸出“Not Found”。輸入:輸入:2 9 8 9 6 9輸出:輸出:1輸入:輸入:2 9 8 9 6 7輸出:輸出:Not Found綜合例題:綜合例題:在數組中查找一個給定的數在數組中查找一個給定的數程序設計基礎#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程序設計基礎#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綜合例題:將數組元素逆序存放綜合例題:將數組元素逆序存放程序設計基礎7.5 動態創建數組動態

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

溫馨提示

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

評論

0/150

提交評論