C語(yǔ)言程序設(shè)計(jì)活頁(yè)式教程 課件 -04處理批量數(shù)據(jù)_第1頁(yè)
C語(yǔ)言程序設(shè)計(jì)活頁(yè)式教程 課件 -04處理批量數(shù)據(jù)_第2頁(yè)
C語(yǔ)言程序設(shè)計(jì)活頁(yè)式教程 課件 -04處理批量數(shù)據(jù)_第3頁(yè)
C語(yǔ)言程序設(shè)計(jì)活頁(yè)式教程 課件 -04處理批量數(shù)據(jù)_第4頁(yè)
C語(yǔ)言程序設(shè)計(jì)活頁(yè)式教程 課件 -04處理批量數(shù)據(jù)_第5頁(yè)
已閱讀5頁(yè),還剩147頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

C語(yǔ)言程序設(shè)計(jì)活頁(yè)式教程項(xiàng)目4處理批量數(shù)據(jù)項(xiàng)目任務(wù)知識(shí)目標(biāo)學(xué)習(xí)目標(biāo)任務(wù)1:求一維整型數(shù)組元素的最值任務(wù)2:求二維數(shù)組主對(duì)角線上元素之和任務(wù)3:統(tǒng)計(jì)彩票中獎(jiǎng)數(shù)據(jù)任務(wù)4:隨機(jī)產(chǎn)生一組彩票數(shù)據(jù)任務(wù)5:統(tǒng)計(jì)字符串中的各類字符(1)了解數(shù)組的類型和存儲(chǔ)特點(diǎn)。(2)掌握一維數(shù)組的聲明、初始化和元素訪問。(3)掌握二維數(shù)組的聲明、初始化和元素訪問。(4)掌握字符串的存儲(chǔ)、元素訪問和輸入輸出。(5)能夠使用數(shù)組對(duì)大量數(shù)據(jù)進(jìn)行統(tǒng)計(jì)。任務(wù)準(zhǔn)備任務(wù)實(shí)施任務(wù)描述任務(wù)1求一維整型數(shù)組元素的最值任務(wù)描述在處理大量數(shù)據(jù)時(shí),常常要對(duì)數(shù)據(jù)進(jìn)行統(tǒng)計(jì),如求最大值、最小值、總和、平均值等等。在C語(yǔ)言中,在統(tǒng)計(jì)數(shù)據(jù)之前先要將數(shù)據(jù)存儲(chǔ)在內(nèi)存中,然后再訪問每一個(gè)數(shù)據(jù),對(duì)數(shù)據(jù)進(jìn)行對(duì)應(yīng)的運(yùn)算。本任務(wù)在實(shí)現(xiàn)求一維整型數(shù)組元素的最大值或最小值的過程中,向?qū)W生講解一維數(shù)組的定義、一維數(shù)組的初始化、一維數(shù)組元素的訪問,以及一維數(shù)組的使用場(chǎng)景。讓學(xué)生掌握一維數(shù)組的相關(guān)操作,具備靈活使用一維數(shù)組處理數(shù)據(jù)的能力。任務(wù)準(zhǔn)備任務(wù)實(shí)施Part

1Part

2Part

3任務(wù)描述任務(wù)準(zhǔn)備1.一維數(shù)組的定義數(shù)組是相同類型數(shù)據(jù)的有序集合,數(shù)組中的每個(gè)數(shù)據(jù)我們稱之為“元素”。數(shù)組元素在內(nèi)存中是連續(xù)存儲(chǔ)的。一維數(shù)組的定義形式為:

數(shù)據(jù)類型數(shù)組名[數(shù)組長(zhǎng)度];數(shù)組元素的類型可以是整型、浮點(diǎn)型、字符型這樣的基礎(chǔ)類型,也可以是結(jié)構(gòu)體、指針等復(fù)雜類型?!皵?shù)組名”是一個(gè)地址常量,代表一個(gè)數(shù)組在內(nèi)存中開始的地方。它是一維數(shù)組的首地址,也是最前面那個(gè)元素(習(xí)慣稱之為第0個(gè)元素,因?yàn)樗木幪?hào)是0,而大部分書籍稱之為第1個(gè)元素)的地址?!皵?shù)組長(zhǎng)度”是指一維數(shù)組能存儲(chǔ)的數(shù)據(jù)個(gè)數(shù),通常稱之為元素個(gè)數(shù)。每個(gè)數(shù)組元素所占據(jù)的空間大小也與類型有關(guān),如一維整型數(shù)組的元素占4個(gè)字節(jié)空間,一維字符數(shù)組的元素占1個(gè)字節(jié)空間。任務(wù)準(zhǔn)備例如,定義一個(gè)能存儲(chǔ)10個(gè)整數(shù)的數(shù)組,代碼如下:inta[10];上面的語(yǔ)句定義了一個(gè)一維整型數(shù)組,數(shù)組名為a,它有10個(gè)元素,能存儲(chǔ)10個(gè)整型數(shù)據(jù)。編譯軟件在編譯該語(yǔ)句時(shí),會(huì)在內(nèi)存里分配一個(gè)長(zhǎng)度為40個(gè)字節(jié)的空間,數(shù)組名a是這40個(gè)字節(jié)空間的首地址,它是地址常量,只能讀取不能修改。又如,定義一個(gè)能存儲(chǔ)15個(gè)字符的數(shù)組,代碼如下:charch[15];同理,上面的語(yǔ)句定義了一維字符數(shù)組,數(shù)組名為ch,它有15個(gè)元素,能存儲(chǔ)15個(gè)字符。編譯軟件給該字符數(shù)組分配了15個(gè)字節(jié)的內(nèi)存空間,數(shù)組名ch是這個(gè)空間的首地址,也是地址常量,只能讀取不能修改。任務(wù)準(zhǔn)備再如,定義一個(gè)能存儲(chǔ)15個(gè)structnode型數(shù)據(jù)的數(shù)組,代碼如下:structnode{ intage; floatheight;};structnodestu[15];上面的語(yǔ)句先定義了一個(gè)結(jié)構(gòu)體類型structnode,它由一個(gè)整型變量age和一個(gè)單精度浮點(diǎn)型變量height構(gòu)成。然后又定義了一個(gè)structnode類型的一維數(shù)組,數(shù)組名為stu,它有15個(gè)元素,能存儲(chǔ)15個(gè)structnode類型的數(shù)據(jù)。編譯軟件給該數(shù)組分配了15個(gè)structnode類型數(shù)據(jù)所占字節(jié)的內(nèi)存空間,數(shù)組名stu是這個(gè)空間的首地址,也是地址常量,只能讀取不能修改。一個(gè)structnode類型數(shù)據(jù)所占字節(jié)數(shù)可以用運(yùn)算符sizeof求得,寫法是sizeof(structnode),返回一個(gè)整數(shù)。任務(wù)準(zhǔn)備一維數(shù)組的定義形式中,“數(shù)組長(zhǎng)度”用來指定該一維數(shù)組的元素個(gè)數(shù),它必須是一個(gè)常量表達(dá)式,不可以是變量表達(dá)式。并且數(shù)組一旦定義后,它的元素個(gè)數(shù)就固定了,無(wú)法修改數(shù)組的容量。數(shù)組的正確定義和錯(cuò)誤的定義如下,注意區(qū)分。inta[10]; /*正確*/constintm=13;floatb[m]; /*正確*/charc[m+2]; /*正確*/intx=13;doubled[x]; /*錯(cuò)誤,x不是常量*/值得注意的是,一些較新的編譯器如devc++已經(jīng)支持用變量來定義數(shù)組,所以doubled[x]在有些編譯器中并不會(huì)報(bào)錯(cuò)。任務(wù)準(zhǔn)備2.一維數(shù)組的初始化在定義數(shù)組時(shí)給數(shù)組元素集體賦值,稱為數(shù)組的初始化。數(shù)組的初始化只能在定義數(shù)組時(shí)進(jìn)行,之后只能給單個(gè)元素賦值。一維數(shù)組初始化的形式如下:

數(shù)據(jù)類型數(shù)組名[數(shù)組長(zhǎng)度]={初值表};其中,“數(shù)組長(zhǎng)度”是指數(shù)組的元素個(gè)數(shù),數(shù)組初始化時(shí)它可以省略不寫,這時(shí)數(shù)組的元素個(gè)數(shù)由初始值的個(gè)數(shù)決定。“初值表”是指用來給數(shù)組元素賦值的初值列表,一般有多個(gè)初值,它們之間以逗號(hào)隔開。C語(yǔ)言規(guī)定,初始值的個(gè)數(shù)不能超過數(shù)組長(zhǎng)度。以整型、字符型、結(jié)構(gòu)體類型的一維數(shù)組初始化為例,代碼如下:inta[10]={0,1,2,3,4,5,6,7,8,9};intb[]={0,1,2,3,4,5,6,7};intc[10]={0,1,2,3,4,5};intd[10]={0,1,2,3,4,5,6,7,8,9,10,11,12};/*錯(cuò)誤*/charch[]={'a','b','c','d','e'};任務(wù)準(zhǔn)備structnodestu[]={ {19,1.75f},/*一個(gè)structnode變量的初值*/ {17,1.62f}, {21,1.83f}, {18,1.55f}};整型數(shù)組a的初值個(gè)數(shù)剛好與數(shù)組長(zhǎng)度10相等,代碼正確。整型數(shù)組b有沒指定長(zhǎng)度,數(shù)組長(zhǎng)度由初值個(gè)數(shù)決定。因此,數(shù)組b的長(zhǎng)度為8。整型數(shù)組c的長(zhǎng)度為10,但初值只有6個(gè)。因此,剩下的4個(gè)元素的值為整型數(shù)據(jù)的默認(rèn)值0。整型數(shù)組d的長(zhǎng)度為10,初值卻有13個(gè),這是一種錯(cuò)誤的寫法。初值個(gè)數(shù)必須小于等于數(shù)組的指定長(zhǎng)度。字符型數(shù)組ch沒有指定長(zhǎng)度,數(shù)組長(zhǎng)度由初值個(gè)數(shù)決定。因此,數(shù)組ch的長(zhǎng)度為5。結(jié)構(gòu)體類型structnode之前已經(jīng)定義,一個(gè)structnode變量的初值是一個(gè)整數(shù)和一個(gè)單精度浮點(diǎn)數(shù)的合集,用大括號(hào)括起來。任務(wù)準(zhǔn)備3.一維數(shù)組的元素訪問除了初始化數(shù)組時(shí)能對(duì)數(shù)組元素整體賦值外,其它時(shí)候只能對(duì)單個(gè)的數(shù)組元素賦值。同樣,不能整體讀取一個(gè)數(shù)組,只能讀取數(shù)組中的某個(gè)元素。訪問一維數(shù)組元素的形式如下:

數(shù)組名[下標(biāo)];其中,“下標(biāo)”是數(shù)組元素的位置編號(hào)。C語(yǔ)言規(guī)定,一維數(shù)組的下標(biāo)從0開始,最后一個(gè)元素的下標(biāo)是數(shù)組長(zhǎng)度減1,即下標(biāo)的取值范圍是[0,數(shù)組長(zhǎng)度-1]。比如有10個(gè)元素的一維數(shù)組,數(shù)組元素的下標(biāo)范圍是0到9。任務(wù)準(zhǔn)備以一維雙精度型數(shù)組為例,初始化數(shù)組、修改元素、讀取元素的代碼如下:doubled[6]={1.11,2.22,3.33,4.44,5.55,6.66};doublex=9.99;d[1]=3.14;d[3]=5.67;x=d[5];一維數(shù)組d的下標(biāo)為1和3的元素被修改后,該數(shù)組的所有元素變成了{(lán)1.11,3.14,3.33,5.67,5.55,6.66},將下標(biāo)為5的元素賦值給變量x后,x的值變成了6.66。任務(wù)準(zhǔn)備當(dāng)需要訪問一維數(shù)組的所有元素時(shí),可以使用循環(huán)語(yǔ)句讓循環(huán)變量取到數(shù)組下標(biāo)的每一個(gè)值,以循環(huán)變量作下標(biāo)就可以訪問到一維數(shù)組的每一個(gè)元素。用for語(yǔ)句訪問一維數(shù)組所有元素的形式如下:inti;for(i=0;i<數(shù)組長(zhǎng)度;i++){

數(shù)組名[i];/*下標(biāo)為i的元素*/}在for語(yǔ)句內(nèi)部修改第i個(gè)元素的代碼形式為“數(shù)組名[i]=xxx”,讀取第i個(gè)元素并將它賦值給變量x的代碼形式為“x=數(shù)組名[i]”。任務(wù)準(zhǔn)備用while語(yǔ)句訪問一維數(shù)組所有元素的形式如下inti=0;while(i<數(shù)組長(zhǎng)度){

數(shù)組名[i]; i++; }也可以逆序訪問數(shù)組元素,形式如下:inti;for(i=數(shù)組長(zhǎng)度-1;i>=0;i--){

數(shù)組名[i]; }任務(wù)準(zhǔn)備【實(shí)例1】定義一個(gè)整型數(shù)組,輸出數(shù)組所有元素的編號(hào)、地址和值。#include<stdio.h>intmain(){ inta[6]; inti; for(i=0;i<6;i++) printf("第%d個(gè)元素的地址:%p,值:%d\n",i,&a[i],a[i]); return0;}編譯運(yùn)行的結(jié)果如圖4-1所示:圖4-1數(shù)組元素的編號(hào)、地址和值任務(wù)準(zhǔn)備將運(yùn)行結(jié)果整理成表4-1所示:從運(yùn)行結(jié)果可以看出,整型數(shù)組a的相鄰元素的地址相差為4,剛好是一個(gè)int數(shù)據(jù)所占據(jù)的字節(jié)數(shù),足以說明數(shù)組a的6個(gè)元素在內(nèi)存中是連續(xù)存儲(chǔ)的,每個(gè)元素占4個(gè)字節(jié)。由于沒有將數(shù)組a初始化,數(shù)組a的6個(gè)元素的值都是隨機(jī)的,在不同的編譯環(huán)境中會(huì)顯示不同的數(shù)據(jù)。表4-1整型數(shù)組元素的下標(biāo)、地址和值下標(biāo)012345地址0060FEE40060FEE80060FEEC0060FEF00060FEF40060FEF8元素值4201472635686442015664201472818任務(wù)準(zhǔn)備修改實(shí)例1中的代碼,在定義整型數(shù)組a同時(shí)進(jìn)行初始化,代碼如下:inta[6]={11,22,33,44,55,66};將新的運(yùn)行結(jié)果整理成如表4-2所示??梢钥闯?,數(shù)組元素不再是隨機(jī)值,而是初始化時(shí)給定的初始值。表4-2初始化后數(shù)組元素的下標(biāo)、地址和值值下標(biāo)012345地址0060FEE40060FEE80060FEEC0060FEF00060FEF40060FEF8元素值112233445566任務(wù)準(zhǔn)備如果沒有在定義數(shù)組時(shí)初始化整個(gè)數(shù)組,后續(xù)就只能利用循環(huán)對(duì)數(shù)組每個(gè)元素賦值?!緦?shí)例2】定義有5個(gè)元素的整型數(shù)組,要求用戶輸入5個(gè)整數(shù)給數(shù)組賦值,然后輸出所有數(shù)組元素。intmain(){ inta[5],i; for(i=0;i<5;i++) { printf("請(qǐng)輸入一個(gè)整數(shù):");/*&a[i]取數(shù)組a的第i個(gè)元素的地址,scanf("%d",a+i);*/ scanf("%d",&a[i]); } for(i=0;i<5;i++) printf("%d,",a[i]); return1;}圖4-2數(shù)據(jù)元素的輸入和輸出編譯運(yùn)行的結(jié)果如圖4-2所示:從運(yùn)行結(jié)果來看,數(shù)組a的5個(gè)元素就是用戶輸入的5個(gè)整數(shù),說明用戶輸入的整數(shù)被依次存入了數(shù)組a中。a[i]是數(shù)組的第i的元素,&a[i]是對(duì)第i個(gè)元素取地址。而數(shù)組名a是一維數(shù)組的首地址,也是下標(biāo)為0的元素的地址,a+i代表向前跨過i個(gè)整型數(shù)據(jù)占據(jù)的空間后的地址,即第i個(gè)元素的地址。因此,對(duì)于一維數(shù)組a來說,&a[i]與a+i相等,都是第i個(gè)元素的地址。任務(wù)準(zhǔn)備任務(wù)實(shí)施Part

1Part

2Part

3任務(wù)描述任務(wù)實(shí)施【任務(wù)1】定義一個(gè)一維整型數(shù)組并賦初值,求出數(shù)組元素的最大值、最小值、總和和平均值,然后輸出。1.任務(wù)分析本任務(wù)考查一維數(shù)組的初始化和元素訪問。求數(shù)組元素的最大值和最小值的思路是:定義兩個(gè)整型變量max、min并賦初值,然后依次訪問一維數(shù)組的所有元素,將所有元素分別與max、min比較,用max存儲(chǔ)更大的數(shù),用min存儲(chǔ)更小的數(shù)。需要注意的是,存儲(chǔ)最大值的變量max的初值應(yīng)該設(shè)定為一維數(shù)組的某個(gè)元素值,通常是下標(biāo)為0的元素。同理,min的初值通常設(shè)定為數(shù)組下標(biāo)為0的元素。有些初學(xué)者喜歡將max的初值設(shè)為100,min的初值設(shè)為0,這是不對(duì)的。求數(shù)組元素的總和和平均值的思路是:定義一個(gè)初值為0的整型變量sum用于存儲(chǔ)數(shù)組元素的總和,在循環(huán)訪問每一個(gè)數(shù)組元素時(shí),將數(shù)組元素累加到變量sum上;定義一個(gè)浮點(diǎn)型變量avg用于存儲(chǔ)數(shù)組元素的平均值,它的值為數(shù)組元素的總和除以數(shù)組長(zhǎng)度。任務(wù)實(shí)施2.任務(wù)實(shí)現(xiàn)實(shí)現(xiàn)代碼如下,請(qǐng)將代碼中空白處補(bǔ)充完整。intmain(){ /*14個(gè)元素*/ inta[]={76,66,23,19,-5,44,33,75,22,90,134,47,85,72}; /*最大值max、最小值min的初值,應(yīng)該來自于數(shù)組內(nèi)部元素*/ inti,max=

,min=

,sum=0; doubleavg; for(i=0;i<14;i++) {/*如果第i個(gè)元素比最大值max還大,就用max記錄下來*/ if(

) max=a[i];圖4-3一維整型數(shù)組的最值 if(

) min=a[i]; sum=sum+a[i]; }/*乘以1.0的目標(biāo)是得到小數(shù)部分*/ avg=1.0*sum/14; printf("最大值:%d\n最小值:%d\n總和:%d\n平均值:%.2lf\n",max,min,sum,avg); return0;}編譯運(yùn)行的結(jié)果如圖4-3所示:任務(wù)實(shí)施3.任務(wù)總結(jié)部分初學(xué)者習(xí)慣寫如下代碼,來比較第i個(gè)元素與最大值和最小值的關(guān)系,這種寫法是錯(cuò)誤的。因?yàn)槿绻鸻[i]不是最大值,并不能說明a[i]就是最小的。比如我們說如果小明不是班上最高的男生,那么小明一定是最矮的男生,很顯然這做說法不合邏輯。if(a[i]>max) max=a[i];else min=a[i];由于兩個(gè)整數(shù)相除所得的結(jié)果依然是一個(gè)整數(shù),不會(huì)得到小數(shù)部分。所以在求數(shù)組元素的平均值時(shí),可以用1.0去乘以總和sum,將之變成小數(shù)。再用小數(shù)去除以數(shù)組長(zhǎng)度,就能得到包含小數(shù)部分的平均值。當(dāng)然也可以采用將總和sum強(qiáng)制轉(zhuǎn)換成小數(shù)的做法,寫法是(double)sum。將整數(shù)強(qiáng)制轉(zhuǎn)換成小數(shù)或乘以1.0,才能得出整數(shù)相除后的小數(shù)部分,這是初學(xué)者容易忽略的編程技巧。任務(wù)實(shí)施【任務(wù)2】將一維整型數(shù)組的元素逆序存儲(chǔ),然后輸出。1.任務(wù)分析將數(shù)組元素逆序存儲(chǔ),相當(dāng)于將數(shù)組沿中間線對(duì)折。本任務(wù)主要考查將數(shù)組沿中間線對(duì)折后,對(duì)應(yīng)元素下標(biāo)之間的關(guān)系。假設(shè)一維整型數(shù)組a有8個(gè)元素,分別是{1,2,3,4,5,6,7,8},它們的下標(biāo)及對(duì)換關(guān)系如圖4-4所示。從圖可以看出,a[0]與a[7]對(duì)換,a[1]與a[6]對(duì)換,a[2]與a[5]對(duì)換,a[3]與a[4]對(duì)換。由此可以得出結(jié)論,a[i]應(yīng)該與a[數(shù)組長(zhǎng)度-1-i]對(duì)換。循環(huán)訪問數(shù)組元素時(shí),下標(biāo)從0遞增到(數(shù)組長(zhǎng)度-1)/2即可。圖4-48個(gè)數(shù)組元素的對(duì)換關(guān)系任務(wù)實(shí)施假設(shè)一維整型數(shù)組a有9個(gè)元素,分別是{1,2,3,4,5,6,7,8,9},它們的下標(biāo)及對(duì)換關(guān)系如圖4-5所示。從圖可以看出,a[0]與a[8]對(duì)換,a[1]與a[7]對(duì)換,a[2]與a[6]對(duì)換,a[3]與a[5]對(duì)換,a[4]與自己對(duì)換。由此可以得出結(jié)論,a[i]與a[數(shù)組長(zhǎng)度-1-i]對(duì)換。循環(huán)訪問數(shù)組元素時(shí),下標(biāo)從0遞增到(數(shù)組長(zhǎng)度-1)/2即可。圖4-59個(gè)數(shù)組元素的對(duì)換關(guān)系任務(wù)實(shí)施2.任務(wù)實(shí)現(xiàn)實(shí)現(xiàn)代碼如下,請(qǐng)將代碼中空白處補(bǔ)充完整。intmain(){ inta[]={1,2,3,4,5,6,7,8,9,temp,i; printf("對(duì)換前:"); for(i=0;i<=8;i++) printf("%d,",a[i]); /*i<=最后一個(gè)元素的下標(biāo)/2*/ for(i=0;i<=

;i++) { /*第i個(gè)元素與第8-i個(gè)元素對(duì)換*/ temp=a[i]; a[i]=

; a[8-i]=temp; }圖4-6數(shù)組逆序存儲(chǔ) printf("\n對(duì)換后:"); for(i=0;i<=8;i++) printf("%d,",a[i]); return0;}編譯運(yùn)行的結(jié)果如圖4-6所示:任務(wù)實(shí)施3.任務(wù)總結(jié)循環(huán)訪問數(shù)組元素時(shí),如何確定下標(biāo)的變化范圍,是本任務(wù)中最難也是最容易出錯(cuò)的地方。在分析任務(wù)時(shí),應(yīng)該分別以數(shù)組長(zhǎng)度是單數(shù)、雙數(shù)為例,找出對(duì)換元素下標(biāo)之間的關(guān)系。最終得出結(jié)論,無(wú)論數(shù)組長(zhǎng)度是單數(shù)還是雙數(shù),下標(biāo)的變化范圍都是[0,(數(shù)組長(zhǎng)度-1)/2]。任務(wù)實(shí)施【任務(wù)3】用冒泡排序法將一維整型數(shù)組中的元素從小到大排序,然后輸出排序后的數(shù)組元素。1.任務(wù)分析冒泡排序是一種簡(jiǎn)單的排序算法。它重復(fù)訪問要排序的數(shù)組,每次比較相鄰的兩個(gè)元素,如果它們的順序錯(cuò)誤就把它們交換過來。訪問數(shù)組的工作一直重復(fù)地進(jìn)行,直到?jīng)]有再需要交換的元素,說明說該數(shù)組已經(jīng)排序完成。因?yàn)閷?duì)數(shù)組進(jìn)行從小到大排序時(shí),越小的元素會(huì)經(jīng)由交換慢慢“浮”到數(shù)列的頂端,形似冒泡,所以將這種排序方法稱為“冒泡排序”。以整型數(shù)組inta[10]={76,66,23,19,-5,44,33,22,9,13}為例,冒泡排序的做法是重復(fù)訪問下標(biāo)為[0,x]之間的每一個(gè)元素,然后比較a[j]與a[j+1]的大小,如果順序錯(cuò)誤就把它們交換過來。其中,j是[0,x]之間的下標(biāo)值,而x的取值從8遞減到1,即x會(huì)分別取值8、7、6、5、4、3、2、1。但x值不能是最后一個(gè)元素的下標(biāo)9,因?yàn)槿绻鹙的值為9,那么j+1就會(huì)超出數(shù)組下標(biāo)的范圍。冒泡排序會(huì)經(jīng)歷多次循環(huán)訪問,循環(huán)訪問的下標(biāo)范圍從[0,8]逐漸縮小到[0,1],這正是“重復(fù)訪問”的意思。任務(wù)實(shí)施下面用表格形式來說明從小到大進(jìn)行冒泡排序的過程,如表4-3所示。本任務(wù)僅將第1次排序的過程詳細(xì)列出來,每次比較的兩個(gè)元素加粗顯示,用陰影標(biāo)示每次循環(huán)訪問的元素范圍。要實(shí)現(xiàn)多次循環(huán)訪問一定范圍內(nèi)的數(shù)組元素,并且訪問的范圍逐漸減小,需要用到兩層循環(huán)。外層循環(huán)以i為循環(huán)變量,內(nèi)層循環(huán)以j為循環(huán)變量,通過設(shè)置i與j之間的關(guān)系,使i不斷變大時(shí)j的循環(huán)范圍逐漸變小。表4-3冒泡排序示意表下標(biāo)0123456789第1次排序76662319-5443322913排序過程66762319-544332291366237619-544332291366231976-5443322913662319-576443322913662319-544763322913662319-544337622913662319-544332276913662319-544332297613第2次排序662319-544332291376第3次排序2319-54433229136676第4次排序19-5233322913446676第5次排序-519232291333446676第6次排序-519229132333446676第7次排序-519913222333446676第8次排序-591319222333446676第9次排序-591319222333446676最后結(jié)果-591319222333446676任務(wù)實(shí)施2.任務(wù)實(shí)現(xiàn)實(shí)現(xiàn)代碼如下,請(qǐng)將代碼中空白處補(bǔ)充完整。intmain(){ inttemp,i,j;inta[10]={76,66,23,19,-5,44,33,22,9,13}; printf("排序前:"); for(i=0;i<10;i++) printf("%d,",a[i]); for(i=0;i<

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

;j++) { /*交換的條件*/ if(a[j]

a[j+1]) { temp=a[j];圖4-7冒泡排序結(jié)果 a[j]=a[j+1]; a[j+1]=temp; } } } printf("\n排序后:"); for(i=0;i<10;i++) printf("%d,",a[i]); return0;}編譯運(yùn)行的結(jié)果如圖4-7所示:任務(wù)實(shí)施3.任務(wù)總結(jié)假定一維數(shù)組a的元素個(gè)數(shù)為n,內(nèi)層循環(huán)變量j的取值范圍為0≤j<n-1-i。隨著外層循環(huán)變量i的取值不斷遞增,內(nèi)層循環(huán)的范圍就逐次變小。當(dāng)i=0時(shí),內(nèi)層循環(huán)的范圍最大,j的最大值是n-2,這時(shí)a[j]與a[j+1]的比較就成了最后的兩個(gè)數(shù)a[n-2]與a[n-1]的比較;當(dāng)i=n-2時(shí),內(nèi)層循環(huán)的范圍最小,j的最大值為0,這時(shí)a[j]與a[j+1]的比較就成了最前面的兩個(gè)數(shù)a[0]與a[1]的比較,符合冒泡排序的過程。因此,外層循環(huán)變量i的取值范圍應(yīng)為0≤i<n-1。冒泡排序的規(guī)則由a[j]與a[j+1]的大小關(guān)系決定。當(dāng)a[j]大于a[j+1]時(shí),它們的值互換,說明小的在前大的在后,因此排序規(guī)則是從小到大;當(dāng)a[j]小于a[j+1]時(shí),它們的值互換,說明大的在前小的在后,因此排序規(guī)則是從大到小。如果將本任務(wù)中的代碼if(a[j]>a[j+1])改成if(a[j]<a[j+1]),排序結(jié)果如圖4-8所示,是從大到小排序。圖4-8從大到小排序的結(jié)果任務(wù)準(zhǔn)備任務(wù)實(shí)施任務(wù)描述任務(wù)2求二維數(shù)組主對(duì)角線上元素之和任務(wù)描述如果把一維數(shù)組看作是一行數(shù)據(jù)的話,那么二維數(shù)組就是多行數(shù)據(jù),類似于Excel軟件中的一張數(shù)據(jù)表。在使用二維數(shù)組前要指定有幾行幾列.本任務(wù)實(shí)現(xiàn)求5行5列二維整型數(shù)組主對(duì)角線上的元素之和。在實(shí)現(xiàn)任務(wù)的過程中,向?qū)W生講解二維數(shù)組的定義、二維數(shù)組的初始化、二維數(shù)組元素的訪問等,讓學(xué)生掌握二維數(shù)組的相關(guān)操作,具備靈活使用二維數(shù)組處理數(shù)據(jù)的能力。任務(wù)準(zhǔn)備任務(wù)實(shí)施Part

1Part

2Part

3任務(wù)描述任務(wù)準(zhǔn)備1.二維數(shù)組的定義和初始化二維數(shù)組在本質(zhì)上還是一個(gè)一維數(shù)組,只不過這個(gè)一維數(shù)組的元素又是一個(gè)一維數(shù)組。二維數(shù)組的邏輯結(jié)構(gòu)就像一張二維表,有行有列。二維數(shù)組的定義形式為:數(shù)據(jù)類型數(shù)組名[行數(shù)][列數(shù)];二維數(shù)組名是一個(gè)地址常量,它代表第0行的首地址,“數(shù)組名+1”代表下一行的首地址?!靶袛?shù)”、“列數(shù)”均是常量表達(dá)式,“行數(shù)”用于指明該二維數(shù)組有多少行,“列數(shù)”用于指明每一行有多少個(gè)元素。定義一個(gè)3行4列的二維整型數(shù)組的代碼如下,二維數(shù)組a能存儲(chǔ)12個(gè)int型數(shù)據(jù)。因?yàn)橐粋€(gè)int型數(shù)據(jù)占據(jù)4個(gè)字節(jié),因此數(shù)組a占據(jù)48個(gè)連續(xù)的字節(jié)空間。inta[3][4];定義一個(gè)3行5列的二維浮點(diǎn)型數(shù)組的代碼如下,二維數(shù)組b能存儲(chǔ)15個(gè)double型數(shù)據(jù)。因?yàn)橐粋€(gè)double型數(shù)據(jù)占據(jù)8個(gè)字節(jié),因此數(shù)組b占據(jù)120個(gè)連續(xù)的字節(jié)空間。doubleb[3][5];任務(wù)準(zhǔn)備二維數(shù)組的物理結(jié)構(gòu)并不是像二維表那樣的,它的所有元素在內(nèi)存中是按線形連續(xù)存儲(chǔ)的,只是在使用時(shí)被人為地劃分成行和列。如二維數(shù)組a[m][n]將下標(biāo)為[0,n-1]的元素劃分成第0行,下標(biāo)為[n,2n-1]的元素劃分成第1行,以此類推。因此,二維數(shù)組的初始化有兩種形式:數(shù)據(jù)類型數(shù)組名[m][n]={ {值0,值1,值2,…,值n-1}, {值n,值n+1,值n+2,…,值2n-1}, {值2n,值2n+1,值2n+2,…,值3n-1} …, {值(m-1)n,值(m-1)n+1,值(m-1)n+2,…,值mn-1}};或:

數(shù)據(jù)類型數(shù)組名[m][n]={值0,值1,值2,…,值mn-1};第一種初始化形式將若干初值分成m行n列,將每行的初值用大括號(hào)包圍,并用逗號(hào)隔開,使用起來更加直觀。第二種初始化形式對(duì)初值不作行列的劃分,編譯時(shí)編譯軟件會(huì)自動(dòng)將前n個(gè)元素識(shí)別成第0行,以此類推。任務(wù)準(zhǔn)備定義并初始化3行4列的二維整型數(shù)組,代碼如下:inta[3][4]={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12}/*最后一行沒有逗號(hào)*/};或:inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};任務(wù)準(zhǔn)備2.二維數(shù)組的元素訪問除了初始化數(shù)組時(shí)能對(duì)二維數(shù)組元素整體賦值外,其它時(shí)候只能對(duì)單個(gè)的數(shù)組元素賦值。同樣,不能整體讀取一個(gè)二維數(shù)組,只能讀取二維數(shù)組中的某個(gè)元素。訪問二維數(shù)組某個(gè)元素時(shí),必須指明第幾行第幾列。訪問二維數(shù)組某個(gè)元素的形式如下:數(shù)組名[行][列];具有m行n列元素的二維數(shù)組a,它的行編號(hào)是0到m-1,列的編號(hào)是0到n-1。因此,二維數(shù)組a的最前面的元素是a[0][0],最后一個(gè)元素是a[m-1][n-1]。任務(wù)準(zhǔn)備如果要訪問二維數(shù)組的每一個(gè)元素,通常用兩層循環(huán)訪問二維數(shù)組的行和列,示例代碼如下:inti,j;inta[3][4]={ {1,2,3,4}, {5,6,7,8}, {9,10,11,12}};for(i=0;i<3;i++)/*訪問每一行*/{ for(j=0;j<4;j++)/*訪問第i行的每一列*/ { /*a[i][j]指第i行第j列的元素*/ printf("%d,",a[i][j]); } printf("\n");}外層循環(huán)訪問二維數(shù)組的每一行,循環(huán)變量i取所有行的下標(biāo)。內(nèi)層循環(huán)訪問第i行的每一列,即第i行的每一個(gè)元素,循環(huán)變量j取所有列(或元素)的下標(biāo)。a[i][j]就是第i行第j列的元素,i和j的值都從0開始計(jì)數(shù)。任務(wù)準(zhǔn)備【實(shí)例1】定義并初始化一個(gè)3行4列的二維整型數(shù)組,求出所有元素中偶數(shù)的和并輸出。intmain(){ inta[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; inti,j,sum=0; for(i=0;i<3;i++) { for(j=0;j<4;j++) { /*如果a[i][j]是偶數(shù)*/ if(a[i][j]%2==0) sum=sum+a[i][j]; } } printf("所有偶數(shù)的和為:%d\n",sum); return1;}編譯運(yùn)行的結(jié)果如圖4-9所示:在本實(shí)例中,二維數(shù)組的初值并沒有分行列,編譯軟件會(huì)自動(dòng)按數(shù)組定義的3行4列來劃分。當(dāng)元素a[i][j]除以2余下0時(shí),說明它是偶數(shù),將它加到變量sum上。循環(huán)結(jié)束時(shí),變量sum中存儲(chǔ)的就是所有偶數(shù)的和。圖4-9二維數(shù)組的偶數(shù)和任務(wù)準(zhǔn)備任務(wù)實(shí)施Part

1Part

2Part

3任務(wù)描述任務(wù)實(shí)施【任務(wù)1】求5行5列二維整型數(shù)組主對(duì)角線上元素之和,然后輸出。1.任務(wù)分析本任務(wù)考查二維數(shù)組的初始化、二維數(shù)組的元素訪問以及元素下標(biāo)之間的關(guān)系。在一個(gè)n行n列的二維數(shù)組中,從左上角到右下角這一斜線方向上的n個(gè)元素所在的對(duì)角線,叫做主對(duì)角線。從右上角到左下角這一斜線方向上的n個(gè)元素所在的對(duì)角線,叫做副對(duì)角線。以一個(gè)5階方陣為例,它的主對(duì)角線、副對(duì)角線如圖4-10和圖4-11所示:任務(wù)實(shí)施在求5行5列二維整型數(shù)組主對(duì)角線上元素之和前,需要弄清楚主對(duì)角線上元素的下標(biāo)有什么規(guī)律。以主對(duì)角線圖為例,數(shù)字1、7、13、19、25的下標(biāo)分別是[0][0]、[1][1]、[2][2]、[3][3]、[4][4]。因此可以得出結(jié)論:n行n列二維數(shù)組主對(duì)角線上所有元素的行下標(biāo)與列下標(biāo)相等。同理,副對(duì)角線上數(shù)字5、9、13、17、21的下標(biāo)分別是[0][4]、[1][3]、[2][2]、[3][1]、[4][0]。因此可以得出結(jié)論:n行n列二維數(shù)組副對(duì)角線上元素的行下標(biāo)與列下標(biāo)之和是n-1。在求5行5列二維整型數(shù)組主對(duì)角線上元素之和時(shí),可以用兩層循環(huán)訪問行和列,再判斷行下標(biāo)與列下標(biāo)是否相等,將行下標(biāo)與列下標(biāo)相等的元素值加到總和中。也可以只用一個(gè)循環(huán)訪問行,取出行下標(biāo)、列下標(biāo)相同的元素,將它的值加到總和中。任務(wù)實(shí)施2.任務(wù)實(shí)現(xiàn)本任務(wù)的實(shí)現(xiàn)代碼有兩種,第一種采用兩層循環(huán)的實(shí)現(xiàn)代碼如下,請(qǐng)將代碼中空白處補(bǔ)充完整。#include<stdio.h>intmain(){ inta[5][5]={ {1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15}, {16,17,18,19,20}, {21,22,23,24,25} }; inti,j,sum=0; for(i=0;i<5;i++) { for(j=0;j<5;j++) { if(

)

; } } printf("主對(duì)象線元素之和為:%d\n",sum); return1;}任務(wù)實(shí)施第二種只用一層循環(huán)的實(shí)現(xiàn)代碼如下,請(qǐng)將代碼中空白處補(bǔ)充完整。intmain(){ inta[5][5]={ {1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15}, {16,17,18,19,20}, {21,22,23,24,25} }; inti,sum=0; for(i=0;i<5;i++) {

; } printf("主對(duì)象線元素之和為:%d\n",sum); return1;}編譯運(yùn)行的結(jié)果如圖4-12所示:圖4-12主對(duì)角線元素之和任務(wù)實(shí)施3.任務(wù)總結(jié)對(duì)于求n行n列二維整型數(shù)組主對(duì)角線上的元素之和,本任務(wù)采用了兩種方式來實(shí)現(xiàn),從效率上看,采用一層循環(huán)的實(shí)現(xiàn)代碼更加高效。多數(shù)情況下都需要用兩層循環(huán)來訪問二維數(shù)組的所有元素,但也可以根據(jù)實(shí)際情況找出元素下標(biāo)之間的規(guī)律,提高編程效率。例如,如果將任務(wù)改成求副對(duì)角線上元素之和,修改后的核心代碼如下:inti,sum=0;for(i=0;i<5;i++){ sum+=a[i][4-i];}在實(shí)現(xiàn)一維數(shù)組元素的逆序存儲(chǔ)時(shí),需要找出兩個(gè)對(duì)換元素的下標(biāo)關(guān)系,并且只訪問前半部分元素來實(shí)現(xiàn)對(duì)換。同樣,在將二維數(shù)組元素按不同規(guī)則對(duì)換時(shí),也要分析出對(duì)換元素的下標(biāo)關(guān)系,也只需訪問部分元素。任務(wù)實(shí)施【任務(wù)2】將5行5列二維整型數(shù)組的元素沿主對(duì)角線對(duì)折,輸出對(duì)折后的所有元素。1.任務(wù)分析要實(shí)現(xiàn)元素沿主對(duì)角線對(duì)折,先要找出所有對(duì)換元素,再分析它們的下標(biāo)關(guān)系。仍然使用圖4-10中的二維數(shù)組元素,所有對(duì)換元素及對(duì)應(yīng)下標(biāo)如表4-4所示:從表中可以看出,沿主對(duì)角線對(duì)折時(shí),對(duì)應(yīng)元素的行、列下標(biāo)是互換的關(guān)系,即數(shù)組元素a[i][j]應(yīng)該與a[j][i]對(duì)換。表4-4對(duì)換的元素對(duì)換的元素下標(biāo)1下標(biāo)21與1[0][0][0][0]2與6[0][1][1][0]3與11[0][2][1][0]4與16[0][3][3][0]5與21[0][4][4][0]7與7[1][1][1][1]8與12[1][2][2][1]9與17[1][3][3][1]10與22[1][4][4][1]13與13[2][2][2][2]14與18[2][3][3][2]15與23[2][4][4][2]19與19[3][3][3][3]20與24[3][4][4][3]25與25[4][4][4][4]任務(wù)實(shí)施在實(shí)現(xiàn)元素對(duì)換時(shí)不能訪問全部元素,而只能訪問表4-5中陰影部分的元素,即主對(duì)角線下面的部分元素。因?yàn)楫?dāng)訪問到第0行第1列元素時(shí),2與6對(duì)換;當(dāng)訪問到第1行第0列元素時(shí),2又與6對(duì)換,會(huì)還原成兩個(gè)數(shù)對(duì)換之前的樣子。所以,如果訪問二維數(shù)組的所有元素,會(huì)導(dǎo)致對(duì)應(yīng)位置的元素對(duì)換了兩次,從而使數(shù)組恢復(fù)成原來的樣子。表4-5主對(duì)角線對(duì)折訪問的元素12345678910111213141516171819202122232425任務(wù)實(shí)施2.任務(wù)實(shí)現(xiàn)實(shí)現(xiàn)代碼如下,請(qǐng)將代碼中空白處補(bǔ)充完整。intmain(){ inta[5][5]={ {1,2,3,4,5}, {6,7,8,9,10}, {11,12,13,14,15}, {16,17,18,19,20}, {21,22,23,24,25} }; inti,j,temp; for(i=0;i<

;i++){ for(j=0;

;j++){ temp=a[i][j]; a[i][j]=; a[j][i]=temp; } } printf("沿主對(duì)角線對(duì)折后:\n"); for(i=0;i<5;i++) { for(j=0;j<5;j++) printf("%2d",a[i][j]); printf("\n"); } return1;}編譯運(yùn)行的結(jié)果如圖4-13所示:圖4-13二維數(shù)據(jù)沿主對(duì)角線對(duì)折任務(wù)實(shí)施3.任務(wù)總結(jié)初學(xué)者可以自行分析,當(dāng)將n行n列的二維數(shù)組元素沿副對(duì)角線對(duì)折時(shí),兩個(gè)對(duì)換元素的下標(biāo)關(guān)系。經(jīng)分析,與數(shù)組元素a[i][j]對(duì)換的元素是a[n-1-j][n-1-i],元素訪問范圍如表4-6陰影部分所示:表4-6副對(duì)角線對(duì)折訪問的元素12345678910111213141516171819202122232425任務(wù)實(shí)施因此,修改后的核心代碼如下,請(qǐng)將代碼中空白處補(bǔ)充完整。inti,j,temp;for(i=0;i<5;i++){ for(j=0;j<

;j++) { temp=a[i][j]; a[i][j]=; a[4-j][4-i]=temp; }}編譯運(yùn)行的結(jié)果如圖4-14所示:圖4-14二維數(shù)據(jù)沿副對(duì)角線對(duì)折任務(wù)準(zhǔn)備任務(wù)實(shí)施任務(wù)描述任務(wù)3統(tǒng)計(jì)彩票中獎(jiǎng)數(shù)據(jù)任務(wù)描述中國(guó)福利彩票“雙色球”是一種由中國(guó)福利彩票發(fā)行管理中心統(tǒng)一組織發(fā)行,在全國(guó)銷售聯(lián)合發(fā)行的“樂透型”福利彩票。該彩票的一組號(hào)碼由7個(gè)數(shù)組成,即6個(gè)紅色號(hào)碼和1個(gè)藍(lán)色號(hào)碼。6個(gè)紅色號(hào)碼是從1~33中抽取的、互相不重復(fù)的數(shù);1個(gè)藍(lán)色號(hào)碼是從1~16中抽取的數(shù)。本任務(wù)實(shí)現(xiàn)用二維數(shù)組存儲(chǔ)雙色球歷史中獎(jiǎng)數(shù)據(jù)并加以統(tǒng)計(jì),用一維數(shù)組存儲(chǔ)紅色號(hào)碼和藍(lán)色號(hào)碼出現(xiàn)的頻率。通過實(shí)現(xiàn)任務(wù),讓學(xué)生掌握靈活處理數(shù)據(jù)的能力任務(wù)準(zhǔn)備任務(wù)實(shí)施Part

1Part

2Part

3任務(wù)描述任務(wù)準(zhǔn)備1.用一維結(jié)構(gòu)體數(shù)組存儲(chǔ)和統(tǒng)計(jì)數(shù)據(jù)在用程序解決問題時(shí),首先要找出需要用到的數(shù)據(jù),思考這些數(shù)據(jù)如何存儲(chǔ)。比如在講解數(shù)據(jù)類型時(shí)以存儲(chǔ)一個(gè)學(xué)生的信息為例,可以用五個(gè)變量分別存儲(chǔ)學(xué)生的學(xué)號(hào)、姓名、性別、年齡和身高。為了方便存儲(chǔ)和使用,還可以定義結(jié)構(gòu)體類型,用一個(gè)結(jié)構(gòu)體變量存儲(chǔ)一個(gè)學(xué)生的五個(gè)信息。當(dāng)要存儲(chǔ)一個(gè)班級(jí)所有學(xué)生的信息時(shí),就可以考慮用一個(gè)結(jié)構(gòu)體數(shù)組來存儲(chǔ),數(shù)組的元素就是一個(gè)結(jié)構(gòu)體變量,存儲(chǔ)一個(gè)學(xué)生的五個(gè)信息。任務(wù)準(zhǔn)備以存儲(chǔ)30個(gè)學(xué)生的語(yǔ)文、數(shù)學(xué)、英語(yǔ)、歷史、地理、生物共6門課的成績(jī)?yōu)槔?,可以先?門課的成績(jī)“打包”成一個(gè)結(jié)構(gòu)體類型。為了方便,甚至還可以在結(jié)構(gòu)體類型中加入學(xué)號(hào)和姓名。該類型的定義如下:structstudent{ /*charxuehao[20];學(xué)號(hào)*/ /*charxingming[20];姓名*/ intyuwen; /*語(yǔ)文成績(jī)*/ intshuxue; /*數(shù)學(xué)成績(jī)*/ intyingyu; /*英語(yǔ)成績(jī)*/ intlishi; /*歷史成績(jī)*/ intdili; /*地理成績(jī)*/ intshengwu; /*生物成績(jī)*/};任務(wù)準(zhǔn)備再用structstudent類型定義一個(gè)有30個(gè)元素的一維數(shù)組,用它存儲(chǔ)30個(gè)學(xué)生的6門課的成績(jī),代碼如下:structstudentstus[30]={ {87,93,89,85,64,89},/*一個(gè)structstudent變量的初值*/ {80,91,85,87,87,87}, …… {92,57,64,95,64,80}};數(shù)組stus的初值列表看起來像一個(gè)二維數(shù)組,實(shí)際上每一對(duì)大括號(hào)中的數(shù)據(jù)是一個(gè)structstudent變量的初始值。由于篇幅的問題,省略了中間27個(gè)學(xué)生的成績(jī)。任務(wù)準(zhǔn)備【實(shí)例1】定義一個(gè)一維結(jié)構(gòu)體數(shù)組存儲(chǔ)一個(gè)班30名學(xué)生的語(yǔ)文、數(shù)學(xué)、英語(yǔ)、歷史、地理、生物共6門學(xué)科的成績(jī),統(tǒng)計(jì)數(shù)學(xué)的最高分、英語(yǔ)的平均分、總成績(jī)的最高分,然后輸出。#include<stdio.h>structstudent{ intyuwen; /*語(yǔ)文成績(jī)*/ intshuxue; /*數(shù)學(xué)成績(jī)*/ intyingyu; /*英語(yǔ)成績(jī)*/ intlishi; /*歷史成績(jī)*/ intdili; /*地理成績(jī)*/ intshengwu; /*生物成績(jī)*/};intmain(){ structstudentstus[30]={ {87,93,89,85,64,89}, …… {92,57,64,95,64,80} }; doublezongheYY=0; intzuidaSX=0,zuidaZF=0,i; for(i=0;i<30;i++) { if(stus[i].shuxue>zuidaSX) zuidaSX=stus[i].shuxue; zongheYY+=stus[i].yingyu;任務(wù)準(zhǔn)備 if(zuidaZF<stus[i].yuwen+stus[i].shuxue+stus[i].yingyu+stus[i].lishi+stus[i].dili+stus[i].shengwu) { zuidaZF=stus[i].yuwen+stus[i].shuxue+stus[i].yingyu+stus[i].lishi+stus[i].dili+stus[i].shengwu; } } printf("數(shù)學(xué)最高分:%d\n",zuidaSX); printf("英語(yǔ)平均分:%.1f\n",zongheYY/30); printf("總成績(jī)最高分:%d\n",zuidaZF); return0;}編譯運(yùn)行的結(jié)果如圖4-15所示:圖4-15用一維數(shù)組統(tǒng)計(jì)成績(jī)?cè)诒緦?shí)例中,數(shù)組元素stus[i]存儲(chǔ)第i個(gè)學(xué)生的信息,stus[i].shuxue記錄了該學(xué)生的數(shù)學(xué)成績(jī),其它成績(jī)也是用類似這樣訪問形式得到。stus[i].yuwen、stus[i].shuxue、stus[i].yingyu、stus[i].lishi、stus[i].dili、stus[i].shengwu之和,就是第i個(gè)學(xué)生的總成績(jī)。變量zongheYY用于存儲(chǔ)英語(yǔ)成績(jī)的總和,變量zuidaSX用于存儲(chǔ)數(shù)學(xué)最高分,變量zuidaZF用于存儲(chǔ)總成績(jī)的最高分。任務(wù)準(zhǔn)備2.用二維數(shù)組存儲(chǔ)和統(tǒng)計(jì)數(shù)據(jù)在Excel中可以用函數(shù)實(shí)現(xiàn)對(duì)大量數(shù)據(jù)的統(tǒng)計(jì),如用sum函數(shù)求出一行數(shù)據(jù)的總和,用max函數(shù)求一列數(shù)據(jù)的最大值,用average函數(shù)求一列數(shù)據(jù)的平均值。Excel中的一張存儲(chǔ)整數(shù)數(shù)據(jù)的表,可以對(duì)應(yīng)C語(yǔ)言中的一個(gè)二維整型數(shù)組。在存儲(chǔ)30個(gè)學(xué)生的課程成績(jī)時(shí),也可以用二維數(shù)組。定義一個(gè)30行6列的二維整型數(shù)組,用于存儲(chǔ)30個(gè)學(xué)生的6門課的成績(jī),每行中下標(biāo)0-5的元素分別是語(yǔ)文、數(shù)學(xué)、英語(yǔ)、歷史、地理、生物的成績(jī)。在統(tǒng)計(jì)數(shù)學(xué)最高分和英語(yǔ)平均分時(shí),只需要訪問二維數(shù)組中每一行,再將該行中數(shù)學(xué)成績(jī)和英語(yǔ)成績(jī)挑出來進(jìn)行運(yùn)算。在統(tǒng)計(jì)總成績(jī)的最高分時(shí),就需要訪問二維數(shù)組的每一行每一列(即每一個(gè)元素),這時(shí)候就要用到兩層循環(huán)。外層循環(huán)負(fù)責(zé)訪問每一行,內(nèi)層循環(huán)負(fù)責(zé)訪問某一行的每一列(即每一個(gè)元素)。任務(wù)準(zhǔn)備【實(shí)例2】定義一個(gè)二維數(shù)組存儲(chǔ)一個(gè)班30名學(xué)生的語(yǔ)文、數(shù)學(xué)、英語(yǔ)、歷史、地理、生物共6門學(xué)科的成績(jī),統(tǒng)計(jì)數(shù)學(xué)的最高分、英語(yǔ)的平均分、總成績(jī)的最高分,然后輸出intmain(){ intchengji[30][6]={ {87,93,89,85,64,89}, …… {92,57,64,95,64,80} }; doublezongheYY=0; intzuidaSX=chengji[0][1],zf,zuidaZF=0,i,j; for(i=0;i<30;i++) { /*加上每一行的英語(yǔ)成績(jī)*/ zongheYY+=chengji[i][2]; if(chengji[i][1]>zuidaSX) /*zuidaSX記錄數(shù)學(xué)最高分*/ zuidaSX=chengji[i][1]; zf=0; /*計(jì)算出每一行的總分*/ for(j=0;j<6;j++) zf+=chengji[i][j]; /*用zuidaZF記錄最高總分*/ if(zf>zuidaZF) zuidaZF=zf; } printf("數(shù)學(xué)最高分:%d\n",zuidaSX); printf("英語(yǔ)平均分:%.1f\n",zongheYY/30); printf("總成績(jī)最高分:%d\n",zuidaZF); return1;}任務(wù)準(zhǔn)備編譯運(yùn)行的結(jié)果如圖4-16所示:統(tǒng)計(jì)數(shù)學(xué)的最高分時(shí),需要定義一個(gè)變量zuidaSX存儲(chǔ)數(shù)學(xué)最高分,它的初值設(shè)為第0行的數(shù)學(xué)成績(jī),即chengji[0][1]。在循環(huán)訪問二維數(shù)組chengji的每一行時(shí),取出第i行的數(shù)學(xué)成績(jī)chengji[i][1]與zuidaSX比較,用zuidaSX記錄更大的數(shù)學(xué)成績(jī)。統(tǒng)計(jì)英語(yǔ)的平均分時(shí),需要定義一個(gè)初值為0的變量zongheYY,用它存儲(chǔ)所有英語(yǔ)成績(jī)之和。在循環(huán)訪問二維數(shù)組chengji的每一行時(shí),取出第i行的英語(yǔ)成績(jī)chengji[i][2],將它加到zongheYY上。循環(huán)結(jié)束后,用zongheYY除以人數(shù)30就能求出英語(yǔ)成績(jī)的平均分。圖4-16用二維數(shù)組統(tǒng)計(jì)成績(jī)統(tǒng)計(jì)總成績(jī)最高分時(shí),需要定義一個(gè)臨時(shí)變量zf用于存儲(chǔ)計(jì)算出的每一行的總成績(jī),再定義一個(gè)變量zuidaZF記錄總成績(jī)的最高分。在循環(huán)訪問到二維數(shù)組chengji的第i行時(shí),利用內(nèi)層循環(huán)將第i行的6個(gè)成績(jī)?nèi)肯嗉樱鎯?chǔ)到變量zf中。再將zf與zuidaZF比較,用zuidaZF存儲(chǔ)它們中那個(gè)較大的總成績(jī)。外層循環(huán)結(jié)束后,變量zuidaZF中存儲(chǔ)的就是總成績(jī)的最高分。任務(wù)準(zhǔn)備3.用二維數(shù)組記錄方塊坐標(biāo)俄羅斯方塊是一款由俄羅斯人阿列克謝·帕基特諾夫于1984年6月發(fā)明的休閑游戲。該游戲由小方塊組成的不同形狀的板塊陸續(xù)從屏幕上方落下來,玩家通過調(diào)整板塊的位置和方向,使它們?cè)谄聊坏撞科闯鐾暾囊粭l或幾條。這些完整的橫條會(huì)隨即消失,給新落下來的板塊騰出空間,與此同時(shí),玩家得到分?jǐn)?shù)獎(jiǎng)勵(lì)。沒有被消除掉的方塊不斷堆積起來,一旦堆到屏幕頂端,玩家便告輸,游戲結(jié)束。俄羅斯方塊有7種典型的形狀如圖4-17所示,分別是L形、J形、Z形、S形、I形、T形和O型。圖4-17俄羅斯方塊的7種形狀任務(wù)準(zhǔn)備從形狀圖可以看出,俄羅斯方塊的形狀均由四個(gè)小方塊組成。如果給這些形狀加上坐標(biāo)軸,就可以記錄下每個(gè)小方塊的左頂點(diǎn)坐標(biāo)。以“L形”方塊為例,它在平面坐標(biāo)中的位置如圖4-18所示,它的四個(gè)小方塊的左頂點(diǎn)坐標(biāo)分別是(1,1)、(1,2)、(1,3)、(2,3),它們可以組成一個(gè)一維數(shù)組(或二維數(shù)組中的一行):{1,1,1,2,1,3,2,3}。將7種形狀的坐標(biāo)都記錄下來,就能得到一個(gè)二維整型數(shù)組,該數(shù)組的每一行記錄4個(gè)小方塊的左頂點(diǎn)坐標(biāo)。圖4-17中7種形狀的方塊坐標(biāo)組成的二維數(shù)組如下:intshape[7][8]={ {1,1,1,2,1,3,2,3}, {1,1,1,2,1,3,0,3}, {0,2,1,2,1,3,2,3}, {0,3,1,2,1,3,2,2}, {0,1,1,1,2,1,3,1}, {0,2,1,2,1,3,2,2}, {1,1,1,2,2,1,2,2}};圖4-18方塊坐標(biāo)圖任務(wù)準(zhǔn)備在C語(yǔ)言中,庫(kù)函數(shù)fillpoly的功能是填充一個(gè)多邊形區(qū)域,它有兩個(gè)參數(shù)。第一個(gè)參數(shù)是多邊形的邊數(shù),第二個(gè)參數(shù)是多邊形各頂點(diǎn)坐標(biāo)組成的一維數(shù)組,每?jī)蓚€(gè)一組表示一個(gè)頂點(diǎn)的X坐標(biāo)和Y坐標(biāo)。因此,當(dāng)要填充一個(gè)左頂點(diǎn)為(x,y)、邊長(zhǎng)為SIZE像素的正方形小方塊時(shí),代碼如下:intpoints[10]={x*SIZE,y*SIZE,(x+1)*SIZE,y*SIZE,(x+1)*SIZE,(y+1)*SIZE,x*SIZE,(y+1)*SIZE,x*SIZE,y*SIZE};fillpoly(5,points);數(shù)組points記錄5個(gè)點(diǎn)的坐標(biāo),分別是正方形的左頂點(diǎn)、右頂點(diǎn)、右下點(diǎn)、左下點(diǎn)、左頂點(diǎn)。因?yàn)?個(gè)點(diǎn)要組成閉合的形狀,所以左頂點(diǎn)的坐標(biāo)出現(xiàn)了兩次,它既是起點(diǎn)也是終點(diǎn)。任務(wù)準(zhǔn)備二維數(shù)組shap的第0行,記錄了組成L形方塊的四個(gè)小正方形的左頂點(diǎn)坐標(biāo)。填充出L形方塊的實(shí)現(xiàn)代碼如下:inti,x,y;intpoints[10];for(i=0;i<8;i=i+2) /*每次訪問2個(gè)元素*/{ x=shape[0][i]; y=shape[0][i+1]; /*取出一個(gè)左頂點(diǎn)坐標(biāo)*/ points[0]=x*SIZE; points[1]=y*SIZE; points[2]=(x+1)*SIZE; points[3]=y*SIZE; points[4]=(x+1)*SIZE; points[5]=(y+1)*SIZE; points[6]=x*SIZE; points[7]=(y+1)*SIZE; points[8]=x*SIZE; points[9]=y*SIZE; fillpoly(5,points);}需要注意的是,fillpoly()函數(shù)并不能單獨(dú)使用,實(shí)現(xiàn)畫圖還需要其它函數(shù)配合使用,有興趣的同學(xué)可以查閱C語(yǔ)言圖形編程的知識(shí)。任務(wù)準(zhǔn)備任務(wù)實(shí)施Part

1Part

2Part

3任務(wù)描述任務(wù)實(shí)施【任務(wù)1】一注雙色球中獎(jiǎng)數(shù)據(jù)由7個(gè)數(shù)組成,前6位稱為紅色號(hào)碼,是1~33之間的整數(shù);第7位稱藍(lán)色號(hào)碼,是1~16之間的整數(shù)?,F(xiàn)有30期雙色球彩票的中獎(jiǎng)數(shù)據(jù),要求統(tǒng)計(jì)出每個(gè)紅色號(hào)碼、藍(lán)色號(hào)碼出現(xiàn)的次數(shù)并輸出。1.任務(wù)分析30期雙色球彩票的中獎(jiǎng)數(shù)據(jù),可以看作是一個(gè)30行7列的二維整型數(shù)組,每行的前6位是1~33之間的紅色號(hào)碼,第7位是1~16之間的藍(lán)色號(hào)碼。紅色號(hào)碼是1~33之間的整數(shù),記錄33個(gè)紅色號(hào)碼出現(xiàn)的次數(shù)需要用到33個(gè)變量,因此,可以用一個(gè)一維數(shù)組來存儲(chǔ)它們出現(xiàn)的次數(shù)。存儲(chǔ)1~33的整數(shù)出現(xiàn)的次數(shù)可以定義有34個(gè)元素的一維整型數(shù)組,該數(shù)組元素的下標(biāo)是0~33。本任務(wù)只使用下標(biāo)1~33的元素,用它們分別存儲(chǔ)對(duì)應(yīng)紅色號(hào)碼出現(xiàn)的次數(shù),即下標(biāo)為i的數(shù)組元素存儲(chǔ)紅色號(hào)碼i出現(xiàn)的次數(shù)。同理,定義一個(gè)有17個(gè)元素的一維整型數(shù)組,用其中下標(biāo)1~16的元素來存儲(chǔ)藍(lán)色號(hào)碼出現(xiàn)的次數(shù),即下標(biāo)為i的數(shù)組元素存儲(chǔ)藍(lán)色號(hào)碼i出現(xiàn)的次數(shù)。任務(wù)實(shí)施2.任務(wù)實(shí)現(xiàn)本任務(wù)實(shí)現(xiàn)代碼如下,請(qǐng)將代碼中空白處補(bǔ)充完整。intmain(){ intcp[30][7]={ {4,19,22,26,29,30,11}, …… {4,14,16,23,28,29,3} }; inti,j,x;/*全部初始化為0,hs[i]存儲(chǔ)紅色號(hào)碼i出現(xiàn)的次數(shù)*/ inths[

]={0};/*全部初始化為0,ls[i]存儲(chǔ)藍(lán)色號(hào)碼i出現(xiàn)的次數(shù)*/ intls[

]={0}; /*循環(huán)訪問彩票數(shù)組cp的每一行中的紅色、藍(lán)色號(hào)碼,把存儲(chǔ)某號(hào)碼出現(xiàn)次數(shù)的對(duì)應(yīng)元素加1。比如出現(xiàn)了紅色號(hào)碼7,則把hs[7]加1,即hs[7]=hs[7]+1或hs[7]++*/ /*訪問彩票數(shù)組cp的每一行*/ for(i=0;i<30;i++) {/*訪問第i行的前6個(gè)數(shù)字,它們都是紅色號(hào)碼*/ for(j=0;j<6;j++) { /*取出一個(gè)紅色號(hào)碼x*/ x=cp[i][j]; /*hs[x]存儲(chǔ)的是紅色號(hào)碼x出現(xiàn)的次數(shù)*/ hs[

]++; }/*取出一行彩票中的第7個(gè)數(shù)字,它是藍(lán)色號(hào)碼*/ x=cp[i][

]; /*ls[x]存儲(chǔ)的是藍(lán)色號(hào)碼x出現(xiàn)的次數(shù)*/ ls[

]++; }任務(wù)實(shí)施 for(i=1;i<34;i++) printf("紅色號(hào)碼%d出現(xiàn)的次數(shù)是:%d\n",i,hs[i]); printf("----------------------\n"); for(i=1;i<17;i++) printf("藍(lán)色號(hào)碼%d出現(xiàn)的次數(shù)是:%d\n",i,ls[i]); return1;}編譯運(yùn)行的結(jié)果如圖4-19所示:(由于截圖太長(zhǎng),分成兩段顯示)圖4-19統(tǒng)計(jì)彩票數(shù)據(jù)任務(wù)實(shí)施3.任務(wù)總結(jié)在統(tǒng)計(jì)中獎(jiǎng)號(hào)碼出現(xiàn)次數(shù)時(shí),巧妙地運(yùn)用元素下標(biāo)對(duì)應(yīng)中獎(jiǎng)號(hào)碼,即以中獎(jiǎng)號(hào)碼為下標(biāo)的元素存儲(chǔ)了該號(hào)碼出現(xiàn)的次數(shù)。C語(yǔ)言中的數(shù)組下標(biāo)都是從0開始的,而0不是中獎(jiǎng)號(hào)碼,因此下標(biāo)為0的元素被舍棄不用。需要特別聲明的是,本任務(wù)只是通過統(tǒng)計(jì)彩票中獎(jiǎng)數(shù)據(jù)達(dá)到靈活使用數(shù)組的目的,而非鼓勵(lì)大家沉迷于研究彩票規(guī)律。事實(shí)上,2003年2月16日雙色球正式發(fā)行,截止本書出版時(shí)中獎(jiǎng)數(shù)據(jù)不足5000期,而雙色球所有數(shù)字的組合是17721088種。用不足5000組數(shù)據(jù)去預(yù)測(cè)17721088種數(shù)據(jù)的走勢(shì),很顯然是不合理的。除了將數(shù)據(jù)統(tǒng)計(jì)出結(jié)果外,有時(shí)還需要對(duì)數(shù)據(jù)進(jìn)行比較、排序等操作。因此,在解決不同的問題時(shí),先要設(shè)計(jì)出數(shù)據(jù)結(jié)構(gòu),再設(shè)計(jì)算法解決問題。任務(wù)實(shí)施【任務(wù)2】一注雙色球中獎(jiǎng)數(shù)據(jù)由7個(gè)數(shù)組成,前6位稱為紅色號(hào)碼,是1~33之間的整數(shù);第7位稱藍(lán)色號(hào)碼,是1~16之間的整數(shù)?,F(xiàn)有30期雙色球彩票的中獎(jiǎng)數(shù)據(jù),要求統(tǒng)計(jì)出每個(gè)紅色號(hào)碼、藍(lán)色號(hào)碼出現(xiàn)的次數(shù),從大到小排序并輸出。1.任務(wù)分析本任務(wù)不僅要統(tǒng)計(jì)出中獎(jiǎng)號(hào)碼出現(xiàn)的次數(shù),還要對(duì)出現(xiàn)次數(shù)進(jìn)行排序,因此需要定義二維數(shù)組來存儲(chǔ)中獎(jiǎng)號(hào)碼和出現(xiàn)次數(shù)。例如,定義二維整型數(shù)組hs[34][2]來存儲(chǔ)33個(gè)紅色號(hào)碼和它們出現(xiàn)的次數(shù),其中hs[i][0]存儲(chǔ)紅色號(hào)碼i,hs[i][1]存儲(chǔ)紅色號(hào)碼i出現(xiàn)的次數(shù)。同理,定義二維整型數(shù)組ls[17][2]來存儲(chǔ)16個(gè)藍(lán)色號(hào)碼和它們出現(xiàn)的次數(shù),其中l(wèi)s[i][0]存儲(chǔ)藍(lán)色號(hào)碼i,ls[i][1]存儲(chǔ)藍(lán)色號(hào)碼i出現(xiàn)的次數(shù)。定義函數(shù)對(duì)中獎(jiǎng)號(hào)碼按出現(xiàn)次數(shù)進(jìn)行排序,采用冒泡排序法,代入二維整型數(shù)組和行數(shù),按二維整型數(shù)組中存儲(chǔ)的次數(shù)進(jìn)行排序。任務(wù)實(shí)施2.任務(wù)實(shí)現(xiàn)本任務(wù)實(shí)現(xiàn)代碼如下,請(qǐng)將代碼中空白處補(bǔ)充完整。#include<stdio.h>voidmaopao(inthm[][2],intn);intmain(){ intcp[30][7]={ {4,19,22,26,29,30,11}, …… {4,14,16,23,28,29,3} }; inti,j,x;/*hs[i][0]存儲(chǔ)紅色號(hào)碼i,hs[i][1]存儲(chǔ)它出現(xiàn)的次數(shù)*/ inths[

][2];/*ls[i][0]存儲(chǔ)藍(lán)色號(hào)碼i,ls[i][1]存儲(chǔ)它出現(xiàn)的次數(shù)*/ intls[

][2]; /*初始化紅色號(hào)碼和出現(xiàn)次數(shù)*/ for(i=1;i<34;i++) { hs[i][0]=

; hs[i][1]=0; } /*初始化藍(lán)色號(hào)碼和出現(xiàn)次數(shù)*/ for(i=1;i<17;i++) { ls[i][0]=

; ls[i][1]=0; }任務(wù)實(shí)施 /*循環(huán)訪問彩票數(shù)組cp的每一行中的紅色、藍(lán)色號(hào)碼,把存儲(chǔ)某號(hào)碼出現(xiàn)次數(shù)的對(duì)應(yīng)元素加1*/ for(i=0;i<30;i++) /*訪問彩票數(shù)組每一行*/ {/*訪問第i行的前6個(gè)數(shù)字,它們都是紅色號(hào)碼*/ for(j=0;j<6;j++) { /*取出一個(gè)紅色號(hào)碼x*/ x=cp[i][j]; /*hs[x][1]存儲(chǔ)的是紅色號(hào)碼x出現(xiàn)的次數(shù)*/ hs[

][

]++; }/*取出一行彩票中的第7個(gè)數(shù)字,它是藍(lán)色號(hào)碼*/ x=cp[i][6]; /*ls[x][1]存儲(chǔ)的是藍(lán)色號(hào)碼x出現(xiàn)的次數(shù)*/ ls[

][

]++; } maopao(hs,34);/*對(duì)紅色號(hào)碼按次數(shù)排序*/ maopao(ls,17);/*對(duì)藍(lán)色號(hào)碼按次數(shù)排序*/ for(i=1;i<34;i++) printf("紅色號(hào)碼%d出現(xiàn)的次數(shù)是:%d\n",hs[i][0],hs[i][1]); printf("----------------------\n"); for(i=1;i<17;i++) printf("藍(lán)色號(hào)碼%d出現(xiàn)的次數(shù)是:%d\n",ls[i][0],ls[i][1]); return1;}任務(wù)實(shí)施/*代入幾行2列的二維整型數(shù)組,代入行數(shù)n*/voidmaopao(inthm[][2],intn){ inti,j,haoma,cishu; for(i=0;i<n-1;i++) { /*j從1開始,將第0行排除在外*/ for(j=1;j<n-1-i;j++) { /*排序條件*/ if(hm[j][1]<hm[j+1][1]) { haoma=hm[j][0]; cishu=hm[j][1]; hm[j][0]=hm[j+1][0]; hm[j][1]=hm[j+1][1]; hm[j+1][0]=haoma; hm[j+1][1]=cishu; } } }}任務(wù)實(shí)施編譯運(yùn)行的結(jié)果如圖4-20所示:(由于截圖太長(zhǎng),分成兩段顯示)圖4-20統(tǒng)計(jì)彩票并排序任務(wù)實(shí)施3.任務(wù)總結(jié)本任務(wù)中,不再用一維整型數(shù)組記錄中獎(jiǎng)號(hào)碼的出現(xiàn)次數(shù),而是用二維整型數(shù)組的每一行記錄中獎(jiǎng)號(hào)碼和它出現(xiàn)的次數(shù)。因此,在統(tǒng)計(jì)號(hào)碼出現(xiàn)的次數(shù)前,需要將二維整型數(shù)組的每一行賦值為下標(biāo)對(duì)應(yīng)的號(hào)碼和出現(xiàn)次數(shù)0。自定義函數(shù)maopao代入的是二維數(shù)組,排序的依據(jù)是數(shù)組第1列中號(hào)碼出現(xiàn)次數(shù),元素交換時(shí)須將中獎(jiǎng)號(hào)碼(第0列)、出現(xiàn)次數(shù)(第1列)一起交換,實(shí)際上是將兩行數(shù)據(jù)進(jìn)行交換。任務(wù)準(zhǔn)備任務(wù)實(shí)施任務(wù)描述任務(wù)4隨機(jī)產(chǎn)生一組彩票數(shù)據(jù)任務(wù)描述雙色球福利彩票的一組號(hào)碼由7個(gè)數(shù)組成,即6個(gè)紅色號(hào)碼和1個(gè)藍(lán)色號(hào)碼。6個(gè)紅色號(hào)碼是從1~33中抽取的、互相不重復(fù)的數(shù);1個(gè)藍(lán)色號(hào)碼是從1~16中抽取的數(shù)。本任務(wù)實(shí)現(xiàn)用隨機(jī)函數(shù)產(chǎn)生6個(gè)紅色號(hào)碼和1個(gè)藍(lán)色號(hào)碼,保證紅色號(hào)碼不重復(fù),并用一維數(shù)組存儲(chǔ)產(chǎn)生的彩票號(hào)碼。通過實(shí)現(xiàn)任務(wù),讓學(xué)生了解隨機(jī)數(shù)的產(chǎn)生方法,掌握靈活處理數(shù)據(jù)的能力。任務(wù)準(zhǔn)備任務(wù)實(shí)施Part

1Part

2Part

3任務(wù)描述任務(wù)準(zhǔn)備函數(shù)是一段可以被重復(fù)調(diào)用、功能相對(duì)獨(dú)立的程序段。函數(shù)必須先定義再使用(又稱調(diào)用),定義函數(shù)時(shí)需要寫清楚代入數(shù)據(jù)的類型和個(gè)數(shù)、返回什么類型的數(shù)據(jù)以及實(shí)現(xiàn)函數(shù)的代碼。而調(diào)用函數(shù)則簡(jiǎn)單很多,按照函數(shù)的定義給入對(duì)應(yīng)的參數(shù),它就能返回指定類型的數(shù)據(jù),函數(shù)調(diào)用的一般形式如下:

函數(shù)名1(實(shí)際參數(shù)列表);或:

數(shù)據(jù)類型變量=函數(shù)名2(實(shí)際參數(shù)列表);C語(yǔ)言提供了大量的庫(kù)函數(shù),這些函數(shù)都稱為標(biāo)準(zhǔn)庫(kù)函數(shù),它們由系統(tǒng)提供可以直接使用。在調(diào)用標(biāo)準(zhǔn)庫(kù)函數(shù)時(shí),不需要預(yù)先聲明,但必須在程序的開頭用“#include”命令將庫(kù)函數(shù)所在的頭文件包含進(jìn)來。本任務(wù)將會(huì)用庫(kù)函數(shù)rand()、srand()和time()函數(shù)來產(chǎn)生隨機(jī)數(shù)。任務(wù)準(zhǔn)備1.產(chǎn)生隨機(jī)數(shù)rand()是C語(yǔ)言的一個(gè)標(biāo)準(zhǔn)庫(kù)函數(shù),定義在<stdlib.h>頭文件中。rand()函數(shù)用于生成隨機(jī)整數(shù),它的定義如下:intrand(void);rand()函數(shù)不需要傳遞任何參數(shù),返回一個(gè)[0,RAND_MAX]范圍內(nèi)的整數(shù)。其中RAND_MAX是一個(gè)在<stdlib.h>中定義的宏,通常取值至少為32767。如果需要生成特定范圍內(nèi)的隨機(jī)數(shù),可以使用算術(shù)運(yùn)算來改變返回值的范圍。例如隨機(jī)產(chǎn)生[0,32]和[1,33]的代碼如下:intx=rand()%33; /*產(chǎn)生0~32之間的整數(shù)*/inty=rand()%33+1; /*產(chǎn)生1~33之間的整數(shù)*/在C語(yǔ)言中,rand()函數(shù)產(chǎn)生的是一個(gè)偽隨機(jī)數(shù),不是真正意義上的隨機(jī)數(shù)。rand()函數(shù)以一個(gè)被稱為“種子”的數(shù)為基準(zhǔn),以某個(gè)遞推公式推算出一個(gè)數(shù)列。當(dāng)數(shù)列中的數(shù)足夠多時(shí),它們就符合正態(tài)公布,就相當(dāng)于產(chǎn)生了隨機(jī)數(shù)。但這些數(shù)不是真正的隨機(jī)數(shù),計(jì)算機(jī)每次給的隨機(jī)數(shù)種子是一樣的,rand()函數(shù)產(chǎn)生的隨機(jī)數(shù)也是一樣。也就是說,在“種子”值固定不變的情況下,rand()產(chǎn)生的數(shù)列也是固定不變的。任務(wù)準(zhǔn)備【實(shí)例1】用rand()函數(shù)產(chǎn)生10個(gè)隨機(jī)整數(shù)并輸出。#include<stdio.h>#include<stdlib.h>intmain(){ inti; for(i=0;i<10;i++) printf("第%d個(gè)隨機(jī)數(shù):%d\n",i,rand()); return1;}編譯運(yùn)行的結(jié)果如圖4-21所示:從運(yùn)行結(jié)果可以看出,產(chǎn)生的10個(gè)隨機(jī)整數(shù)的值都在[0,32767]的范圍內(nèi)。無(wú)論是重新運(yùn)行程序,還是關(guān)閉開發(fā)工具后重新打開、編譯、運(yùn)行,產(chǎn)生的隨機(jī)整數(shù)都是一樣的。需要注意的是,在不同的計(jì)算機(jī)上運(yùn)行得到的隨機(jī)數(shù)是不一樣的。圖4-21產(chǎn)生10個(gè)隨機(jī)整數(shù)任務(wù)準(zhǔn)備2.改變隨機(jī)數(shù)種子想讓rand()函數(shù)產(chǎn)生真正的隨機(jī)數(shù),需要與srand()函數(shù)搭配使用。C語(yǔ)言提供了srand()函數(shù)來改變隨機(jī)

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論