第5章-數(shù)組-課件_第1頁
第5章-數(shù)組-課件_第2頁
第5章-數(shù)組-課件_第3頁
第5章-數(shù)組-課件_第4頁
第5章-數(shù)組-課件_第5頁
已閱讀5頁,還剩44頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

第五章數(shù)組

第一節(jié)一維數(shù)組第二節(jié)二維數(shù)組第三節(jié)字符數(shù)組和字符串類型第一節(jié)一維數(shù)組

為什么要使用數(shù)組通過前面幾章的學(xué)習(xí),我們已經(jīng)可以編寫程序來解決各種相當(dāng)復(fù)雜的問題了,但是當(dāng)需要處理的數(shù)據(jù)比較多時,僅依靠前面的知識是不夠的,即使簡單的問題也可能需要比較復(fù)雜的程序來處理。請看下面的例子:例題輸入50個學(xué)生的某門課程的成績,打印出低于平均分的學(xué)生序號與成績。

【分析】在解決這個問題時,雖然可以通過一個變量來累加讀入的50個成績求出學(xué)生的總分,進(jìn)而求出平均分。但因?yàn)橹挥凶x入最后一個學(xué)生的分?jǐn)?shù)后才能求得平均分,并且要求打印出低于平均分的學(xué)生序號和成績,故必須把50個學(xué)生的成績都保留起來,然后逐個和平均分比較,把低于平均分的成績打印出來。如果,用簡單變量a1,a2,…,a50存儲這些數(shù)據(jù),要用50個變量保存輸入的數(shù)據(jù),程序片斷如下:

readln(a1,a2…,a10);…readln(a41,a42,…,a50)

注意,如果真正要像上面這樣編寫程序,則上面的所有省略號必須用完整的語句寫出來。可以看出,這樣的程序是多么繁瑣。如果說處理的數(shù)據(jù)規(guī)模達(dá)到成千上萬,上面的例子單單讀入就會異常復(fù)雜,電腦的特點(diǎn)沒有得到體現(xiàn)。從以上的討論可以看出,如果只使用簡單變量處理大量數(shù)據(jù),就必須使用大量只能單獨(dú)處理的變量,即使是簡單問題也需要編寫冗長的程序。選手們可能已經(jīng)看出,我們需要把一大批具有相同性質(zhì)的數(shù)據(jù)組合成一個新類型的變量,可以用簡單的程序(比如循環(huán)50次)對這個新變量的各個分量進(jìn)行相同的處理,每個分量仍然保留單個變量的所有性質(zhì)(在上面的例子中,各分量是整型變量或?qū)嵭妥兞康男再|(zhì))。如果能象數(shù)學(xué)中使用下標(biāo)變量ai形式表示這50個數(shù),則問題就容易實(shí)現(xiàn)。在Pascal語言中,具有下標(biāo)性質(zhì)的數(shù)據(jù)類型是數(shù)組。如果使用數(shù)組,上面的問題就變得十分簡單、清晰。例如,讀入50個學(xué)生的成績,只需寫如下語句即可:

fori:=1to50do readln(a[i]);在這里引用了帶下標(biāo)的變量(分量變量稱為數(shù)組元素)a[i]來代替a1,a2…,a50,方括號中的i稱為下標(biāo),當(dāng)循環(huán)變量i=1時a[i]就是a[1];當(dāng)i=2時a[i]就是a[2]……;當(dāng)i=50時a[i]就是a[50]。輸入的時候,讓i從1變化到50,循環(huán)體內(nèi)輸入語句中的a[i]也就分別代表了a1,a2…,a50這50個帶下標(biāo)的變量。這樣上述問題的程序可寫為:tot:=0; //tot存儲50個學(xué)生的總分fori:=1to50do //循環(huán)讀入每一個學(xué)生的成績,并把它累加到總分中begin

read(a[i]);

tot:=tot+a[i];end;ave:=tot/50; //計算平均分fori:=1to50do

ifa[i]<avethenwriteln('No.',i,'',a[i]);//如果第i個同學(xué)成績小于平均分,則將輸出這個學(xué)生的序號和成績。要在程序中使用下標(biāo)變量,必須先說明這些下標(biāo)變量的整體―數(shù)組,即數(shù)組是若干個同名(如上面的下標(biāo)變量的名字都為a)下標(biāo)變量的集合,這些變量的類型全部一致。

一維數(shù)組

當(dāng)數(shù)組中每個元素只帶有一個下標(biāo)時,我們稱這樣的數(shù)組為一維數(shù)組。一維數(shù)組的定義

(1)類型定義類型定義一般格式為:

type

<標(biāo)識符>=<類型>;其中type是Pascal保留字,表示開始一個類型定義段。在其后可以定義若干個自定義的數(shù)據(jù)類型。<標(biāo)識符>是為定義的類型取的名字,稱它為類型標(biāo)識符。類型定義后,也就確定了該類型數(shù)據(jù)取值的范圍,以及數(shù)據(jù)所能執(zhí)行的運(yùn)算。和Pascal提供的標(biāo)準(zhǔn)類型如integer、real等沒什么區(qū)別。

(2)一維數(shù)組類型的定義一維數(shù)組類型的一般格式:var數(shù)組名:array[下標(biāo)1..下標(biāo)2]of<基類型>;對于上例:

a:array[1..50]ofinteger;說明:其中array和of是Pascal保留字。下標(biāo)1和下標(biāo)2是同一順序類型,且下標(biāo)2的序號大于下標(biāo)1的序號。它給出了數(shù)組中每個元素(下標(biāo)變量)允許使用的下標(biāo)類型,也決定了數(shù)組中元素的個數(shù)?;愋褪侵笖?shù)組元素的類型,它可以是任何類型,同一個數(shù)組中的元素全部具有相同類型。因此我們可以說,數(shù)組是由固定數(shù)量的相同類型的元素組成的。

再次提醒注意:類型和變量是兩個不同概念,不能混淆。就數(shù)組而言,程序的執(zhí)行部分使用的不是數(shù)組類型而是數(shù)組變量。數(shù)組的另一種定義形式,先定義數(shù)組的類型標(biāo)識符,再定義數(shù)組,如:

typearray1=array[1..8]ofinteger;

vara1,a2:array1;其中array1為一個類型標(biāo)識符,表示一個下標(biāo)值從1到8,數(shù)組元素類型為整型的一維數(shù)組;而a1,a2則是這種類型的數(shù)組變量,代表二個數(shù)組。我們平時更多的是將二者全并起來,直接定義:

vara1,a2:array[1..8]ofinteger;當(dāng)在說明部分定義了一個數(shù)組變量之后,Pascal編譯程序?yàn)樗x的數(shù)組在內(nèi)存空間開辟一串連續(xù)的存儲單元。例如:vara:array[1..10]ofinteger;以下表示a數(shù)組在內(nèi)存的存儲如表所示:a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a[10]

a數(shù)組共有10個元素組成,在內(nèi)存中10個數(shù)組元素共占10個連續(xù)的存儲單元。a數(shù)組最小下標(biāo)為1,最大下標(biāo)10。按定義a數(shù)組所有元素都是整型變量。一維數(shù)組元素的賦值操作

數(shù)組元素的引用形式為:數(shù)組名[下標(biāo)表達(dá)式]。數(shù)組一經(jīng)定義后,數(shù)組元素就具有簡單變量一樣的性質(zhì),使用時必須寫出下標(biāo)。對于一維數(shù)組變量的賦值有兩種形式:一是對各數(shù)組元素賦值,二是對數(shù)組所有元素整體賦值。例如:設(shè)有下列變量定義

var a1,a2:array[1..20]ofinteger; i:integer;執(zhí)行下列語句:

fori:=1to20do a1[i]:=1; //數(shù)組元素賦值

a2:=a1; //兩個數(shù)組只要結(jié)構(gòu)(元素個數(shù)和類型)相同,就可以整體賦值這個程序片段的功能是將一維整型數(shù)組變量a1、a2的所有數(shù)組元素都初始化賦值為1,前面的循環(huán)語句是逐個賦值,最后一個賦值語句是兩個一維數(shù)組間的整體賦值,其作用相當(dāng)于把數(shù)組a1中每一個數(shù)組元素的值分別賦給數(shù)組a2中相應(yīng)的元素,這要求兩個數(shù)組具有相同類型和一樣的下標(biāo)范圍。一維數(shù)組的引用一維數(shù)組元素的輸入不能整個數(shù)組輸入,只能逐個元素賦值

a[i]:=x;一般用FOR循環(huán)做。如:

Fori:=1to7doread(a[i]);一維數(shù)組元素的輸出不能整個數(shù)組一起輸出,只能逐個元素輸出

Write(a[i]);一般用FOR循環(huán)做。如:

Fori:=1to7dowrite(a[i]);例5.1

輸入10個數(shù),要求程序按輸入時的逆序把這10個數(shù)打印出來。也就是說,按輸入相反順序打印這10個數(shù)?!痉治觥课覀兛啥x一個數(shù)組a用以存放輸入的50個數(shù),然后將數(shù)組a中的內(nèi)容逆序輸出。programex5_1;typearr=array[1..10]ofinteger;//說明一數(shù)組類型arrvara:arr;i:integer;beginwriteln('Enter10integer:');fori:=1to10doread(a[i]);//從鍵盤上輸入10個整數(shù)

readln;//讀入時起換行作用

fori:=10downto1do//逆序輸出這10個數(shù)

write(a[i]:10);end.例5.2

輸入一串字符,以'?'結(jié)束,統(tǒng)計其中每個字母出現(xiàn)的次數(shù)?!痉治觥?/p>

為了簡單起見,只考慮每個小寫字母出現(xiàn)的次數(shù)。為記錄每個字母出現(xiàn)的次數(shù),定義一個由26個元素組成的數(shù)組,下標(biāo)類型是字符,元素類型為整型。如:num:array['a'..'z']ofinteger;

用num['a']記錄字母a出現(xiàn)的次數(shù),用num['b']記錄字母b出現(xiàn)的次數(shù),……

開始應(yīng)將num的每個元素置成0,其實(shí)所有變量的初始值都為0。當(dāng)讀入的字符不是'?'時,應(yīng)判斷它是否為字母,若是則應(yīng)將相應(yīng)字母計數(shù)加1。此時需判斷哪個字母,只要將讀入的字母作為下標(biāo),就可以找出相應(yīng)的數(shù)組元素,將它加1即可。若讀入的字符是'?'則結(jié)束循環(huán),最后輸出統(tǒng)計結(jié)果。程序如下:Programex5_2;varnum:array['a'..'z']ofinteger;ch:char;beginforch:='a'to'z'do //等價于fillchar(num,sizeof(num),0);num[ch]:=0; read(ch);whilech<>'?'dobeginif(ch>='a')and(ch<='z')then//判斷是否為小寫字母

num[ch]:=num[ch]+1;read(ch);end;readln; //換行和暫停

forch:='a'to'z'doifnum[ch]<>0thenwrtieln(ch,'',num[ch]);end.運(yùn)行結(jié)果cabc*&^8796abcaa?a 4b 2c 3例5.3

將a數(shù)組中第一個元素移到最后數(shù)組末尾,其余數(shù)據(jù)依次往前平移一個位置?!痉治觥繛橥瓿深}目所要求的操作,其算法應(yīng)該包括以下幾個主要步驟:①把第一個元素的值取出放在一個臨時單元temp中;②通過a[2]→a[1],a[3]→a[2],a[4]→a[3],……,a[n]→a[n-1],實(shí)現(xiàn)其余元素前移③將temp值送入a[n].Programex5_3;constn=10;vara:array[1..n]ofinteger;i:integer;temp:integer;beginwriteln(‘read',n,'datas');fori:=1tondoread(a[i]);temp:=a[1];fori:=1ton-1doa[i]:=a[i+1];a[n]:=temp;writeln(‘Result:');fori:=1tondowrite(a[i]:3);end.運(yùn)行結(jié)果:read10datas:?

12345678910Result:?

23456789101例5.4

賓館里有一百個房間,從1-100編了號。第一個服務(wù)員把所有的房間門都打開了,第二個服務(wù)員把所有編號是2的倍數(shù)的房間“相反處理”,第三個服務(wù)員把所有編號是3的倍數(shù)的房間作“相反處理”…,以后每個服務(wù)員都是如此。當(dāng)?shù)?00個服務(wù)員來過后,哪幾扇門是打開的。(所謂“相反處理”是:原來開著的門關(guān)上,原來關(guān)上的門打開。)【分析】此題較簡單,只要設(shè)置一個表示門是開的還是關(guān)的標(biāo)志數(shù)組,只有二種狀態(tài)采用布爾型更直觀。由于有固定的循環(huán)次數(shù),用for循環(huán)顯得簡練。程序如下:Programex5_4;constn=100;vara:array[1..n]ofBoolean;i,j,k:integer;beginfori:=1tondoa[i]:=true; //可用fillchar(a,sizeof(a),true)代替

fori:=2tondoforj:=1tondoifjmodi=0thena[j]:=not(a[j]);forj:=1tondoifa[j]=truethenwrite(j:5); //可寫成:ifa[j]thenwrite(j:5);readlnend.運(yùn)行結(jié)果:1

491625364981100例5.5

約瑟夫問題:N個人圍成一圈,從第一個人開始報數(shù),數(shù)到M的人出圈;再由下一個人開始報數(shù),數(shù)到M的人出圈;…輸出依次出圈的人的編號。N,M由鍵盤輸入。【分析】

(1)由于對于每個人只有出圈和沒有圈兩種狀態(tài),因此可以用布爾型標(biāo)志數(shù)組存儲游戲過程中每個人的狀態(tài)。不妨用TRUE表示出圈,F(xiàn)ALSE表示沒有圈。(2)開始的時候,給標(biāo)志數(shù)組賦初值為FALSE,即全部在圈內(nèi)。(3)模擬報數(shù)游戲的過程,直到所有的人出圈為止。程序如下:Programex5_5;varn,m,s,f,t:integer;a:array[1..100]ofboolean; //根據(jù)題意開出數(shù)組大小begin

readln(n,m); //共n人,報到m出圈

fort:=1tondo

a[t]:=false;f:=0;t:=0;s:=0; //剛開始所有變量默認(rèn)值也是0repeatt:=t+1; //逐個枚舉圈中的所有位置

ift=n+1thent:=1; //數(shù)組模擬環(huán)狀,最后一個與第一個相連

ifa[t]=falsethens:=s+1; //第t個位置上有人則報數(shù)

ifs=mthen //當(dāng)前報的數(shù)是mbegins:=0; //計數(shù)器清零

write(t,′′); //輸出出圈人的編號

a[t]:=true; //此處的人已出圈,設(shè)置為空

f:=f+1; //出圈的人數(shù)增加一個

end;untilf=n; //直到所有的人都出圈為止end.運(yùn)行結(jié)果:輸入:85

輸出:52871463例5.6

輸入十個正整數(shù),把這十個數(shù)按由大到小的順序排列。(選擇排序)將數(shù)據(jù)按一定順序排列稱為排序,排序的算法有很多,其中選擇排序是一種較簡單的方法?!痉治觥?/p>

要把十個數(shù)按從大到小順序排列,則排完后,第一個數(shù)最大,第二個數(shù)次大,……。因此,我們第一步可將第一個數(shù)與其后的各個數(shù)依次比較,若發(fā)現(xiàn),比它大的,則與之交換,比較結(jié)束后,則第一個數(shù)已是最大的數(shù)(最大的泡往上冒)。同理,第二步,將第二個數(shù)與其后各個數(shù)再依次比較,又可得出次大的數(shù)。如此方法進(jìn)行比較,最后一次,將第九個數(shù)與第十個數(shù)比較,以決定次大的數(shù)。于是十個數(shù)的順序排列結(jié)束。如對5個進(jìn)行排序,這個五個數(shù)分別為8

2

9

10

5。按選擇排序方法,過程如下:初始數(shù)據(jù):8

2

9

10

5第一次排序:8

2

9

10

5

9

2

8

10

5

10

2

8

9

5

10

2

8

9

5第二次排序:10

8

2

9

5

10

9

2

8

5

10

9

2

8

5第三次排序:10

9

8

2

5

10

9

8

2

5第四次排序:10

9

8

5

2對于十個數(shù),則排序要進(jìn)行9次。程序如下:programex5_6;vara:array[1..10]ofinteger;

i,j,t:integer;begin

writeln('Input10integers:');fori:=1to10doread(a[i]);//讀入10個初始數(shù)據(jù)

readln;fori:=1to9do//進(jìn)行9次排序

beginforj:=i+1to10do//將第i個數(shù)與其后所有數(shù)比較

ifa[i]<a[j]then//若有比a[i]大,則與之交換

begint:=a[i];a[i]:=a[j];a[j]:=t;endend;fori:=1to10dowrite(a[i]:5);end.運(yùn)行結(jié)果:輸入:867521897455892341輸出:589234152546774189例5.7

編程輸入十個正整數(shù),然后自動按從大到小的順序輸出。(冒泡排序)【分析】①用循環(huán)把十個數(shù)輸入到A數(shù)組中;②從A[1]到A[10],相鄰的兩個數(shù)兩兩相比較,即:

A[1]與A[2]比,A[2]與A[3]比,……A[9]與A[10]比。只需知道兩個數(shù)中的前面那元素的標(biāo)號,就能進(jìn)行與后一個序號元素(相鄰數(shù))比較,可寫成通用形式A[i]與A[i+1]比較,那么,比較的次數(shù)又可用1~(n-i)循環(huán)進(jìn)行控制(即循環(huán)次數(shù)與兩兩相比較時前面那個元素序號有關(guān));③在每次的比較中,若較大的數(shù)在后面,就把前后兩個對換,把較大的數(shù)調(diào)到前面,否則不需調(diào)換位置。下面例舉5個數(shù)來說明兩兩相比較和交換位置的具體情形:

564375和6比較,交換位置,排成下行的順序;

654375和4比較,不交換,維持同樣的順序;

654374和3比較,不交換,順序不變

654373和7比較,交換位置,排成下行的順序;

65473經(jīng)過(1~(5-1))次比較后,將3調(diào)到了末尾。經(jīng)過第一輪的1~(N-1)次比較,就能把十個數(shù)中的最小數(shù)調(diào)到最末尾位置,第二輪比較1~(N-2)次進(jìn)行同樣處理,又把這一輪所比較的“最小數(shù)”調(diào)到所比較范圍的“最末尾”位置;……;每進(jìn)行一輪兩兩比較后,其下一輪的比較范圍就減少一個。最后一輪僅有一次比較。在比較過程中,每次都有一個“最小數(shù)”往下“掉”,用這種方法排列順序,常被稱之為“冒泡法”排序。程序如下:Programex5_7;constN=10;vara:array[1..N]ofinteger;//定義數(shù)組

i,j,t:integer;beginfori:=1toNdoReadln(a[i])//輸入十個數(shù)

forj:=1toN-1do//冒泡法排序

fori:=1toN-jdo //兩兩相比較

ifa[i]<a[i+1]then//比較與交換

begint:=a[i];a[i]:=a[i+1];a[i+1]:=t;end;fori:=1toNdo//輸出排序后的十個數(shù)

write(a[i]:6);readlnend.運(yùn)行結(jié)果: 輸入:2586123465221655

輸出:2568121622345565例5.8

用篩法求出100以內(nèi)的全部素數(shù),并按每行五個數(shù)顯示?!痉治觥竣虐?到100的自然數(shù)放入a[2]到a[100]中(所放入的數(shù)與下標(biāo)號相同);⑵在數(shù)組元素中,以下標(biāo)為序,按順序找到未曾找過的最小素數(shù)minp,和它的位置p(即下標(biāo)號);⑶從p+1開始,把凡是能被minp整除的各元素值從a數(shù)組中劃去(篩掉),也就是給該元素值置0;⑷讓p=p+1,重復(fù)執(zhí)行第②、③步驟,直到minp>Trunc(sqrt(N))為止;⑸打印輸出a數(shù)組中留下來、未被篩掉的各元素值,并按每行五個數(shù)顯示。用篩法求素數(shù)的過程示意如下(圖中用下劃線作刪去標(biāo)志):①23456789101112131415…9899100//置數(shù)②23456789101112131415…9899100//篩去被2整除的數(shù)③2345678

9

1011121314

15…98

99

100//篩去被3整除的數(shù)

……2345678

9

1011121314

15…98

99

100//篩去被整除的數(shù)程序如下:Programex5_8;constN=100;Vara:array[1..n]ofboolean;i,j:integer;Begin

Fillchar(a,sizeof(a),true);a[1]:=False;fori:=2toTrunc(sqrt(N))doifa[I]thenforj:=2toNdivIdo

a[i*j]:=False;t:=0;fori:=2toNdoifa[i]thenBeginwrite(i:5);

inc(t);iftmod5=0thenwritelnend;End.【上機(jī)練習(xí)5.1】1、輸入十個正整數(shù),然后把這十個數(shù)按由小到大的順序輸出。(選擇排序)2、輸入十個正整數(shù),然后把這十個數(shù)按由小到大的順序輸出。(冒泡排序)3、國際象棋盤中,第1格放1粒米,第2格放2粒米,第3格放4粒米,第4格放8粒米,第5格放16粒米,......問:16個格子總共可以放多少粒米?【分析】第i個格子可放多少粒米:2i–14、輸出斐波列契數(shù)列的前N項(xiàng)(5個1行)

01123581321..........5、讀入n個數(shù),打印其中的最大數(shù)及其位置號。6、輸入N個整數(shù),找出最大數(shù)所在位置,并將它與第一個數(shù)對調(diào)位置。7、將一個數(shù)組中的所有元素倒序存放?!痉治觥緼[1]←→A[N]A[2]←→A[N-1]……A[I]←→A[J]I從1開始,每交換1次,I加1;直到I=NDIV28、有52張樸克牌,使它們?nèi)空娉?。從?張牌開始,把凡是2的倍數(shù)位置上的牌翻成正面朝下;接著從第3張牌開始,把凡是3的倍數(shù)位置上的牌正面朝上的翻成正面朝下,正面朝下的翻成正面朝上;接著從第4張牌開始,把凡是4的倍數(shù)位置上的牌按此規(guī)律依此類推,直到第1張要翻的牌是第52張為止。統(tǒng)計最后有幾張牌正面朝上,并打印出它們的位置。9、圍繞著山頂有10個洞,一只狐貍和一只兔子各住一個洞。狐貍總想吃掉兔子。一天兔子對狐貍說:“你想吃我有一個條件,先把洞從1~10編上號,你從10號洞出發(fā),先到1號洞找我;第二次隔1個洞找我,第三次隔2個洞找我,以后依此類推,次數(shù)不限。若能找到我,你就可以飽餐一頓。不過在沒有找到我以前不能停下來?!焙倽M口答應(yīng)就開始找了,它從早到晚找了1000次洞,累得昏了過去也沒有找到兔子。請問,免子躲在幾號洞里?【答案】2,4,7,9第二節(jié)二維數(shù)組二維數(shù)組的定義當(dāng)一維數(shù)組元素的類型也是一維數(shù)組時,便構(gòu)成了“數(shù)組的數(shù)組”,即二維數(shù)組。二維數(shù)組定義的一般格式:我們一般這樣定義二維數(shù)組:數(shù)組名:array[下標(biāo)類型1,下標(biāo)類型2]of元素類型;說明:其中兩個下標(biāo)類型與一維數(shù)組定義一樣,可以看成"下界1..上界1"和"下界2..上界2",給出二維數(shù)組中每個元素(雙下標(biāo)變量)可以使用下標(biāo)值的范圍。of后面的元素類型就是基類型。如:a:array[1..4,1..10]ofinteger;

可以這樣理解:a:array[1..4]ofarr;(arr=array[1..10]ofinteger;) a數(shù)組實(shí)質(zhì)上是一個有4行、10列的表格,表格中可儲存40個元素。第1行第1列對應(yīng)a數(shù)組的a[1,1],第n行第m列對應(yīng)數(shù)組元素a[n,m]。二維數(shù)組元素的引用

二維數(shù)組的數(shù)組元素引用與一維數(shù)組元素引用類似,區(qū)別在于二維數(shù)組元素的引用必須給出二個下標(biāo)。引用的格式為:

<數(shù)組名>[下標(biāo)1,下標(biāo)2]說明:顯然,每個下標(biāo)表達(dá)式的類型應(yīng)與對應(yīng)的下標(biāo)類型一致,且取值不超出下標(biāo)類型所指定的范圍,否則會導(dǎo)致致命的越界錯誤。例如,設(shè)有定義:a:array[1..3,1..5]ofinteger;則表示a是二維數(shù)組(相當(dāng)于一個3*5的表格),共有3*5=15個元素,它們是:

a[1,1]a[1,2]a[1,3]a[1,4]a[1,5]

a[2,1]a[2,2]a[2,3]a[2,4]a[2,5]

a[3,1]a[3,2]a[3,3]a[3,4]a[3,5]因此可以看成一個矩陣(表格),a[3,4]即表示第3行、第4列的元素。對于整個二維數(shù)組的元素引用時,采用二重循環(huán)來實(shí)現(xiàn)。如:給如上定義二維數(shù)組a都賦值為1,表達(dá)如下:

fori:=1to3do

forj:=1to5do

a[i,j]:=1;對二維數(shù)組的輸入與輸出也同樣可用二重循環(huán)來實(shí)現(xiàn):

fori:=1to3do

forj:=1to5do

read(a[i,j]);

fori:=1to3do

begin

forj:=1to5do

write(a[i,j]:5);

writeln;

end;說明:當(dāng)定義的數(shù)組下標(biāo)有多個時,我們稱為多維數(shù)組,下標(biāo)的個數(shù)并不局限在一個或二個,可以任意多個,如定義一個三維數(shù)組a和四維數(shù)組b:

a:array[1..100,1..3,1..5]ofinteger; b:array[1..100,1..100,1..3,1..5]ofinteger;

多維的數(shù)組引用賦值等操作與二維數(shù)組類似。二維數(shù)組程序設(shè)計

例5.9

設(shè)有一程序programex5_9;constn=3;vara:array[1..n,1..n]ofinteger;i,j:1..n;beginfori:=1tondobeginforj:=1tondoread(a[i,j]);readln;end;fori:=1tondobeginforj:=1tondowrite(a[j,i]:5);writeln;end;end.且運(yùn)行程序時的輸入為:2□1□3←┘3□3□1←┘1□2□1←┘則程序的輸出應(yīng)是:2□3□11□3□23□1□1例5.10

已知一個6*6的矩陣(方陣),把矩陣二條對角線上的元素值加上10,然后輸出這個新矩陣。【分析】

矩陣即表格,是一個二維數(shù)組,有6行6列共36個元素,每個矩陣都有二條對角線,本題難點(diǎn)在于對角線的元素怎么確定。Programex5_10;vara:array[1..6,1..6]ofinteger;i,j:integer;beginfori:=1to6do //輸入矩陣元素

forj:=1to6do

read(a[i,j]);fori:=1to6do //更改對角線上元素的值

forj:=1to6doif(i=j)or(i+j=7)thena[i,j]:=a[i,j]+10;//尋找對角線的特征

fori:=1to6do //輸出6行6列的矩陣元素

beginforj:=1to6do

write(a[i,j]:5);writeln;end;end.例5.11

大部分元素是0的矩陣稱為稀疏矩陣,假設(shè)有k個非元素,則可把稀疏矩陣用K*3的矩陣簡記之,其中第一列是行號,第二列是列號,第三列是該行、該列下的非元素的值。如:0005寫簡記成:145//第1行第4列有個數(shù)是50200222//第2行第2列有個數(shù)是20100321//第3行第2列有個數(shù)是1試編程讀入一稀疏矩陣,轉(zhuǎn)換成簡記形式,并輸出。【分析】

本題中需要解決的主要問題是查找非零元素并記憶位置。將原始矩陣存于數(shù)組a。轉(zhuǎn)換后的矩陣存于數(shù)組b,當(dāng)然b數(shù)組的行數(shù)可以控制在一個小范圍內(nèi)。programex5_11;constn=3;m=5;vara:array[1..n,1..m]ofinteger;b:array[1..100,1..3]ofinteger;i,j,k:integer;beginfori:=1tondo//矩陣初始

forj:=1tomdoread(a[i,j]);k:=0;fori:=1tondoforj:=1tomdo

ifa[i,j]<>0then//找到非零值,存儲

begink:=k+1;b[k,1]:=i;b[k,2]:=j;b[k,3]:=a[i,j];end;fori:=1tokdo//輸出

beginforj:=1to3dowrite(b[i,j]:3);writeln;end;end.例5.12

打印楊輝三角形的前10行。楊輝三角形如下圖:

111111121121133113311464114641

[圖6-3]

[圖6-4]【分析】

觀察圖6-3,大家不容易找到規(guī)律,但是如果將它轉(zhuǎn)化為圖6-4,不難發(fā)現(xiàn)楊輝三角形其實(shí)就是一個二維表的小三角形部分,假設(shè)通過二維數(shù)組yh存儲,每行首尾元素為1,且其中任意一個非首位元素yh[i,j]的值其實(shí)就是yh[i-1,j-1]與yh[i-1,j]的和,另外每一行的元素個數(shù)剛好等于行數(shù)。有了數(shù)組元素的值,要打印楊輝三角形,只需要控制好輸出其始位置就行了。程序如下:programex5_12;vara:array[1..10,1..10]ofinteger;i,j:integer;begina[1,1]:=1; //設(shè)定第一行的值

fori:=2to10do //從第二行開始推

begina[i,1]:=1;a[i,i]:=1; //設(shè)定每一行的首尾值為1forj:=2toi-1do //當(dāng)前行非首尾的數(shù)

a[i,j]:=a[i-1,j-1]+a[i-1,j]; //每個數(shù)等于上一行的二個數(shù)之和

end;fori:=1to10dobeginifi<>10thenwrite('':30-3*i);//控制每行的起始位置,即空格數(shù)量

forj:=1toidowrite(a[i,j]:6);writeln;end;end.例5.13

輸入一串字符,字符個數(shù)不超過100,且以“.”結(jié)束。判斷它們是否構(gòu)成回文?!痉治觥克^回文指從左到右和從右到左讀一串字符的值是一樣的,如12321,ABCBA,AA等。先讀入要判斷的一串字符(放入數(shù)組letter中),并記住這串字符的長度,然后首尾字符比較,并不斷向中間靠攏,就可以判斷出是否為回文。程序如下:programex5_13;varletter:array[1..100]ofchar;i,j:0..100;ch:char;begin//讀入一個字符串以'.'號結(jié)束

write('Inputastring:');i:=0;read(ch);whilech<>'.'dobegini:=i+1;letter[i]:=ch;read(ch)end;

j:=1;//判斷它是否是回文

while(j<i)and(letter[j]=letter[i])dobegini:=i-1;j:=j+1;end;ifj>=i

thenwriteln('Yes.')elsewriteln('No.');end.【上機(jī)練習(xí)5.2】1、輸入一個3×3二維數(shù)組,找出其中最小的數(shù),輸出它的值以及所在行號和列號。2、輸入4行4列數(shù)組,將第2行與第3行元素對調(diào)。3、輸入4×4方陣,分別求兩條對角線上元素之和。4、矩陣的轉(zhuǎn)置:

A:B:123轉(zhuǎn)置為1471045625811789369121011125、給一維數(shù)組輸入M個整數(shù),假設(shè)M=6,數(shù)組元素分別為748915,要求建立一個如下數(shù)組(矩陣):748915 489157 891574 915748 157489 5748916、建立如下矩陣:2345 3456 4567 5678

注意:一般情況下,給二維數(shù)組賦初值,都是找A[I,J]

與I和J的函數(shù)關(guān)系,對于任意的A[I,J]=I+J。7、設(shè)數(shù)組a是有n個元素的整數(shù)數(shù)組,從中找出最大和子序列。8、打印楊輝三角形的前10行。第三節(jié)字符數(shù)組和字符串類型無論數(shù)組的下標(biāo)有幾個,類型如何,但數(shù)組中全體元素的類型必須相同。數(shù)組元素的類型可以是任何類型,當(dāng)它是字符型時,我們稱它為字符數(shù)組。由于字符數(shù)組與字符串類型的應(yīng)用是計算機(jī)非數(shù)值處理的重要方面之一,所以我們把它們兩個放在一起進(jìn)行討論。下面我們舉例說明字符數(shù)組的應(yīng)用。字符類型

字符類型為由一個字符組成的字符常量或字符變量。字符常量定義:const

字符常量=‘字符’字符變量定義:Var

字符變量:char;字符類型是一個有序類型,字符的大小順序按其ASCⅡ代碼的大小而定。函數(shù)succ、pred、ord適用于字符類型。例如:后繼函數(shù):succ(‘a(chǎn)’)=‘b’前繼函數(shù):pred(‘B’)=‘A’序號函數(shù):ord(‘A’)=65例5.14

按字母表順序和逆序每隔一個字母打印。即打印出:acegIkmoqsuwyzxrvtpnljhfdb【分析】程序中,我們利用了字符類型是順序類型這一特性,直接將字符類型變量作為循環(huán)變量,使程序處理起來比較直觀。程序如下:programex5_14;varletter:char;beginforletter:='a'to'z'doif(ord(letter)-ord('a'))mod2=0thenwrite(letter:3);writeln;forletter:='z'downto'a'doif(ord(letter)-ord('z'))mod2=0thenwrite(letter:3);writeln;end.字符串類型字符串是由字符組成的有窮序列,pascal提供string和ansistring二種字符串類型,二者只是在字符串的長度上有區(qū)別,string類型長度在255以內(nèi),超出255長度的部分被忽略,而ansistring類型沒有長度限制(其實(shí)可存儲2G的內(nèi)容,所以看作長度無限制)。字符串類型定義:

var

字符串變量:string[n];

其中:n是定義的字符串長度,必須是0~255之間的自然整數(shù),第0號單元中存放串的實(shí)際長度,程序運(yùn)行時由系統(tǒng)自動提供,第1~n號單元中存放串的字符。若將string[n]寫成string,則默認(rèn)n值為255。例如:VARname:string[8];

screenline:string;FreePascal中,一個字符串中的字符可以通過其對應(yīng)的下標(biāo)靈活使用。例如:varname:string;

beginreadln(name);

fori:=1toord(name[0])dowriteln(name[i]);

//輸出name串中的第i個字符

end.語句writeln(name[i])輸出name串中第i個字符。例5.15

求輸入英文句子單詞的平均長度?!痉治觥砍绦蛑?,變量s用于存句子中英文字母的總數(shù),變量count用于存放句子中單詞的個數(shù),ch[j]表示ch串中的第j個位置上的字符,ord(ch[0])為ch串的串長度。程序充分利用FreePascal允許直接通過字符串下標(biāo)得到串中的字符這一特點(diǎn),使程序比較簡捷。programex5_15;varch:string;//定義ch為字符串類

s,count,j:integer;beginwrite('Thesentenceis:');readln(ch);//讀入整行內(nèi)容

s:=0;count:=0j:=0;repeatinc(j);ifnot(ch[j]in[':',',',';','''','!','?','.',''])theninc(s);//[…]這是集合的表式

ifch[j]in['','.','!','?']theninc(count);until(j=ord(ch[0]))or(ch[j]in['.','!','?']);ifch[j]<>'.'thenwriteln('Itisnotasentence.')elsewriteln('Averagelengthis',s/count:10:4);//結(jié)果保留二位小數(shù)end.字符串的操作

由字符串的常量、變量和運(yùn)算符組成的表達(dá)式稱為字符串表達(dá)式。字符串運(yùn)算符包括:1.+:連接運(yùn)算符例如:‘Free’+‘PASCAL’的結(jié)果是‘FreePASCAL’。若連接的結(jié)果字符串長度超過255,則被截成255個字符。若連接后的字符串存放在定義的字符串變量中,當(dāng)其長度超過定義的字符串長度時,超過部份字符串被截斷。例如:varstr1,str2,str3:string[8];

beginstr1:=‘Free’;

str2:=‘PASCAL’;

str3:=str1+str2;

end.則str3的值為:‘FreePA’。2.=、〈〉、〈、〈=、〉、〉=:關(guān)系運(yùn)算符兩個字符串的比較規(guī)則為,從左到右按照ASCⅡ碼值逐個比較,遇到ASCⅡ碼不等時,規(guī)定ASCⅡ碼值大的字符所在的字符串為大。例如:‘AB’〈‘AC’結(jié)果為真;‘12’〈‘2’結(jié)果為真;‘PASCAL’=‘PASCAL’結(jié)果為假;例5.16

對給定的10個國家名,按其字母的順序輸出?!痉治觥砍绦蛑校?dāng)執(zhí)行到ifcname[k]>cname[j]時,自動將cname[k]串與cname[j]串中的每一個字符逐個比較,直至遇到不等而決定其大小。這種比較方式是計算機(jī)中字符串比較的一般方式。程序如下:proramex5_16;

溫馨提示

  • 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

提交評論