




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第四單元PASCALS言程序設(shè)計在上一冊教材中,我們已經(jīng)初步了解了 PASCAL語言的三種基本結(jié)構(gòu)、程序設(shè)計的基本思想 和方法。本單元是在上冊內(nèi)容的基礎(chǔ)上進一步深入學(xué)習(xí)PASCAL語言的數(shù)組、子程序、字符串處 理等基礎(chǔ)知識。隨著學(xué)習(xí)的深入,程序設(shè)計的題目類型越來越廣泛,難度也越來越大,程序設(shè)計 者不能“完全”把求解的任務(wù)推給計算機,而應(yīng)對題目作較充分的分析,用較優(yōu)的算法去求解, 因此在計算機上編程解題是一項極好的實踐活動,它可以訓(xùn)練觀察能力、邏輯思維能力、形式化 描述問題能力、規(guī)劃能力、動手動腦分析問題和解決問題的能力。第一課循環(huán)結(jié)構(gòu)的程序設(shè)計在程序設(shè)計中,經(jīng)常處理一些需要重復(fù)執(zhí)行某些操作的問
2、題,這就需要循環(huán)結(jié)構(gòu)程序設(shè)計, 循環(huán)結(jié)構(gòu)是程序設(shè)計的三種基本結(jié)構(gòu)之一,循環(huán)結(jié)構(gòu)是指當某個條件滿足時反復(fù)執(zhí)行某些語句, 否則不執(zhí)行。利用循環(huán)結(jié)構(gòu),使得我們能用少而精的程序編碼,來完成大量的重復(fù)計算。在Pascal言中,實現(xiàn)循環(huán)程序設(shè)計的主要語句有For語句(計數(shù)循環(huán))、While語句(當型 循環(huán))、Repea姑句(直到型循環(huán))。上冊教材已經(jīng)介紹了 For語句,本節(jié)課介紹While語句、Repeat 語句及多重循環(huán)結(jié)構(gòu)。一、While語句結(jié)構(gòu)For循環(huán)語句適用于已知次數(shù)的循環(huán)結(jié)構(gòu),而在實際的問題中,有時我們并不能確切知道循 環(huán)要執(zhí)行多少次,我們判斷是否結(jié)束循環(huán)的依據(jù)是某個條件是否滿足,比如“當,,
3、時就做,,”, 或者是"一直做到,時為止”,這種循環(huán)我們稱之為條件循環(huán)。在Pascal中條件循環(huán)語句有兩 種,分別是While循環(huán)語句和Repea循環(huán)語句。下面分別介紹這兩種語句的使用方法。While語句用于“當滿足某一條件時進行循環(huán)”的情況,因此它也被稱為“當型循環(huán)”。While 語句的語法格式如下:While布爾表達式do循環(huán)體語句;While循環(huán)語句的執(zhí)行流程如圖1-1-1所示。圖1-1-1 While循環(huán)語句執(zhí)行流程While語句使用說明:(1) 當布爾表達為true則執(zhí)行循環(huán)體,若為false,則根本不進入循環(huán)體;(2) 如果一開始布爾表達式的值就為假時,While循環(huán)就會
4、一次循環(huán)體都不執(zhí)行;(3) 相反的,如果布爾表達式永遠是真的,那么循環(huán)就無法結(jié)束,從而成為"死循環(huán)”,為 了避免這種情況的發(fā)生,在循環(huán)體中就一定要有能改變布爾表達式結(jié)果的操作;(4) 循環(huán)體中的語句一般情況下是多條語句,必須使用begin和end將它們括起來形成一條 復(fù)合語句。例1計算S=1+3+5+,+n(n為大于1的奇數(shù))。程序如下:program ex1_1;varodds,n,sum:integer;beginwrite(,input a odd data:?);readln(n);sum:=0; odds:=1;while odds<=n dobeginsum:=su
5、m+odds;odds:=odds+2;end;writeln(sum);end.例2輸入若干個字符,它的終止符是“?”,計算輸入的字符中字母“a”出現(xiàn)的次數(shù)(包括 大小寫)。程序如下:program ex1_2;varch:char;i:integer;begini:=0;read(ch);while ch<>? dobeginif (ch=?a?) or (ch=?Athen i:=i+1;read(ch);end;writeln(,i=?,i)end.在執(zhí)行時,每當輸入的字符為“a”或“A”時,則將變量i原有的值加上1再賦給i,相當于 使i在原有的基礎(chǔ)上加1。當輸入一個“?
6、”的時候,循環(huán)條件不成立,循環(huán)結(jié)束,輸出結(jié)果。 在本程序中,輸入數(shù)據(jù)“? ”就是循環(huán)結(jié)束的標志,這種在程序中人為設(shè)置循環(huán)結(jié)束條件的方法 我們將它叫作結(jié)束標志法,在設(shè)計循環(huán)結(jié)構(gòu)程序時經(jīng)常要用到這種方法。二、Repea姑句結(jié)構(gòu)Repea姑句與While語句正好相反,Repeat句用于"重復(fù)執(zhí)行循環(huán)體,一直到指定的條件 為真時為止”的循環(huán)結(jié)構(gòu),它又被稱為"直到型循環(huán)”。Repea弟句的語法格式為:repeat循環(huán)體語句until布爾表達式;Repea循環(huán)語句的執(zhí)行流程如圖1-2-1所示。圖1-2-1 Repea循環(huán)語句執(zhí)行流程Repea弟句使用說明:1、先執(zhí)行循環(huán)體,然后判斷布爾
7、表達式的值,為false則繼續(xù)循環(huán),為true則終止循環(huán);2、為了使repea循環(huán)重復(fù)能終止,與while循環(huán)一樣,循環(huán)體中一定要有影響布爾表達式值 的操作,否則該循環(huán)就是一個死循環(huán);3、repea姑句的特點是:先執(zhí)行循環(huán),后判斷結(jié)束條件,因而至少要執(zhí)行一次循環(huán)體;4、 repeat-unti是一個整體,它是一個(構(gòu)造型)語句,不要誤認為repea逞一個語句,until 是另一個語句;5、repeat循環(huán)體可以是若干個語句,不需用begin和encL另外需要說明的是,由于while循環(huán)與repeat語句都屬于條件循環(huán)語句,因此一般可以將這 兩種語句互相轉(zhuǎn)換,而具體使用哪條語句時要看實際情況決定
8、。例3利用泰勒公式求e的值,直到最后一項小于10-7為止。泰勒公式如下:e=1+1/1!+1/2!+1/3!+,+1/n!分析:逐步往后遞推,直到最后一項小于10-7為止。程序如下:program ex1-3;vare,p:real;i:longint;Begine:=1;p:=1;i:=1;repeatp:=p/i;e:=e+p;i:=i+1until p<1e-7;writeln('e=' ,e);end.例4求兩個正整數(shù)m和n的最大公約數(shù)。分析:求兩個正整數(shù)的最大公約數(shù)采用的輾轉(zhuǎn)相除法求解。以下是輾轉(zhuǎn)的算法:分別用m,n,r表示被除數(shù)、除數(shù)、余數(shù)。 求m/n的余數(shù)r
9、; 若r=0,則n為最大公約數(shù),若r豐0,執(zhí)行第步; 將n的值放在m中,將r的值放在n中; 返回重新執(zhí)行第步。程序如下:program ex1_4;varm,n,r : integer;beginwrite('Input m,n='); readln(m,n);repeatr:=m mod n;m:=n;n:=r;until r=0;writeln('The greatest common divide is',m);end.三、多重循環(huán)結(jié)構(gòu)前面學(xué)習(xí)的循環(huán)結(jié)構(gòu)都是由單一重復(fù)語句構(gòu)成,即循環(huán)體部分不再是循環(huán)語句,我們把它稱 之為單重循環(huán)。事實上,當一個循環(huán)體語句的
10、循環(huán)體中包含另一個循環(huán)語句時,就構(gòu)成了多重循 環(huán),我們也稱之為循環(huán)語句的嵌套結(jié)構(gòu)。由嵌套的層數(shù)分別稱之為雙重循環(huán)、三重循環(huán)等,處于內(nèi)部的循環(huán)稱為內(nèi)循環(huán),處于外部的 循環(huán)稱為外循環(huán),在循環(huán)的嵌套結(jié)構(gòu)中,讀者應(yīng)牢牢掌握其執(zhí)行過程滿足“外層循環(huán)執(zhí)行一次, 內(nèi)層循環(huán)執(zhí)行一遍”的規(guī)律。設(shè)計多重循環(huán)時,要特別注意內(nèi)、外循環(huán)之間的關(guān)系,以及各語句安放的位置,內(nèi)外循環(huán)控 制變量不得同名,多重循環(huán)的執(zhí)行次數(shù)為各層循環(huán)執(zhí)行次數(shù)的乘積。例5用多重循環(huán)求100999之間的所有水仙花數(shù),所謂水仙花數(shù),是該數(shù)等于它各位數(shù)字 的立方和,例如:153=13+33+53。分析:根據(jù)題意,我們可以利用循環(huán)枚舉三個數(shù)位上的數(shù)字,采
11、用三重循環(huán)來求解,由于循 環(huán)次數(shù)一定,用for循環(huán)最為簡單,程序如下:program ex1_5;vara,b,c:integer;beginfor a:=1 to 9 dofor b:=0 to 9 dofor c:=0 to 9 doif a*a*a+b*b*b+c*c*c=a*100+b*10+cthen write(a*100+b*10+c:6);readlnend.例6求1100之間的素數(shù),所謂素數(shù),就是只能被1和它本身整除的數(shù)。分析:要判斷一個數(shù)i是否為素數(shù),只要看i是否能被2到i-1范圍內(nèi)的數(shù)整除,若只要有一個能整除i,則i不是素數(shù),否則i為素數(shù)。因此求1100之間的素數(shù),只要對
12、這個范圍內(nèi)的每一個數(shù)進行判斷就可以了。程序如下:program ex1_6;constn=100;vari,k,s:integer;prime:Boolean;begins:=0;for i:=2 to n dobeginprime:=true;k:=2;while (k<i) and prime dobeginif i mod k=0 then prime:=false;inc(k);end;if prime thenbeginwrite(i:5);s:=s+1;if s mod 10=0 then writeln; end;枚舉n個數(shù)判斷i是否為素數(shù)相當于k:=k+1滿10個就換行e
13、nd;end.注意:上述程序k<i條件實際上只要k<=trunc(sqrt(i)就可以了,可以減少循環(huán)次數(shù)。例7編寫程序在屏幕上打印出由*組成的三角形圖形,其中三角形的層數(shù)n由鍵盤輸入,如 當n=3時顯示圖形如下:* * * * * * *分析:用兩層循環(huán)進行控制,外層循環(huán)控制三角形的層數(shù),內(nèi)層循環(huán)控制每一層三角形的星 號個數(shù)。程序如下:program ex1_7;vari,j,d:integer;beginwrite(,inputdepth:?);readln(d);for i:=1 to d dobeginwrite(,,:d-i+1);for j:=1 to 2*i-1 do
14、 write(,*?);writelnend;end.學(xué)習(xí)評價1、從鍵盤讀入5個數(shù),計算它們的和與積以及平均值。2、輸入10個數(shù),求出其中的最大值和最小值。3、Fibnaocci(斐波那契)數(shù)列的定義如下:數(shù)列的第一項為0,第二項為1,從第三項開始,每一項都是其前兩項之和。試編程輸出Fibnaocci數(shù)列的前n項元素的值。(n由鍵盤輸入,3<=n<=30)一一一 . 一.22224、編程求下式中n的最大值:2 +4 +6 +, +n <1500=5、猴子吃棗問題。猴子摘了一堆棗,第一天吃了一半,還嫌不過癮,又吃了一個;第二天又 吃了剩下的一半零一個;以后每天如此。到第十天,猴
15、子一看只剩下一個了。問最初有多少個棗 子?6、要將一張100元的鈔票換成等值的10元、5元、2元、1元一張的小鈔票,要求每次換成 40張小鈔票,每種至少一張,編程輸出所有可能的換法,程序應(yīng)適當考慮減少重復(fù)次數(shù)。第二課枚舉類型和子界類型數(shù)據(jù)是程序設(shè)計的一個重要內(nèi)容,其重要特征一一數(shù)據(jù)類型,確定了該數(shù)據(jù)的取值范圍以及 所能參與的運算。Pascal語言提供了豐富的數(shù)據(jù)類型,這些數(shù)據(jù)類型可以分為三大類:簡單類型、構(gòu)造類型和 指針類型。其中簡單類型可以分為標準類型(整型、實型、字符型、布爾型)和自定義類型(枚 舉類型、子界類型),構(gòu)造類型可以分為數(shù)組類型、集合類型、記錄類型和文件類型。這些數(shù)據(jù)類 型中除
16、了指針類型是動態(tài)數(shù)據(jù)類型外,其他的都是靜態(tài)數(shù)據(jù)類型。在這些數(shù)據(jù)類型中,除了實型 以外的簡單類型都是順序類型,所謂順序類型就是它們的值不僅是有序的而且是有順序號的。枚舉類型和子界類型就是本課學(xué)習(xí)的主要內(nèi)容。一、枚舉類型(一)枚舉類型的定義枚舉類型是用戶自定義的簡單類型,適用于表示和處理一些非數(shù)值數(shù)據(jù)。例如,對于一個星 期中的每一天,一年中的四季,人的性別,交通信號燈的三種顏色等非數(shù)值數(shù)據(jù),若用數(shù)值類型 來表示它們,比如用整數(shù)06分別表示星期日、星期一星期六,用14分別表示春、夏、秋、 冬四季,用0和1分別表示男和女,用13分別表示紅、綠和黃三種顏色,則顯得很不直觀,處 理起來也容易出錯。人們希望
17、能用直觀的方式表示這些數(shù)據(jù),而用枚舉類型就能直觀地表示和處 理這些數(shù)據(jù)。枚舉類型屬于用戶自定義類型,因此在程序的說明部分必須對類型進行定義,只有經(jīng)過定義 后,這種類型才能被使用。類型說明的關(guān)鍵字是type ,類型標識符由用戶自已決定,原則是以字 母開頭,后面跟以字母或數(shù)字,但注意不要使用Pascal保留字或標準標識符。如以"daytype” 表示有關(guān)日期的數(shù)據(jù)類型名,可定義如下:typedaytype=(sun,mon,tue,wed,thu,fri,sat);可見,枚舉類型定義的一般格式為:type枚舉類型標識符 =(標識符1, 標識符2,標識符n);其中,衣舉類型標識符給出了用戶
18、定義的枚舉類型的名字,括號中的標識符1,標識符 2, 市識符n稱為枚舉元素,它們構(gòu)成了這種枚舉類型的取值范圍(又稱“值域”),需 要注意的是衣舉類型標識符 后跟的是等號。定義了枚舉類型后,就可以在變量說明部分定義相應(yīng)的枚舉類型的變量了。如:typedaytype=(sun,mon,tue,wed,thu,fri,sat);colortype=(red,yellow,blue,white);vard1,d2:daytype;c:colortype;在類型說明部分,定義了兩個枚舉類型:daytype和colortype 。 daytype的值域為sun,mon,tue,wed,thu,fri,sa
19、t 共七個;colortype 的值域為 red,yellow,blue,white 共四個。在 變量說明部分,定義了變量d1、d2為枚舉類型daytype ,它們的取值只限于類型daytype的值域, 還定義了變量c為枚舉類型colortype,它的取值只限于類型colortype的值域。初學(xué)自定義類型時應(yīng)特別注意將類型名與變量名區(qū)別開來,尤其不能將類型名當作變量名使 用,類型和變量是兩個完全不同的概念。例如,在上面的例子中,d1表示變量,可對其進行運算, 而daytype表示類型,不可對其施行任何運算。以上類型定義和變量說明可合并在變量說明部分,即vard1,d2: (sun,mon,tu
20、e,wed,thu,fri,sat);c: (red,yellow,blue,white);以這樣的方法說明變量的好處是較為簡潔,但由于未定義類型標識符,所定義的類型不能重 復(fù)使用。(二)枚舉類型數(shù)據(jù)的特點及應(yīng)用1、枚舉元素只能是標識符枚舉元素只能是標識符,不能是數(shù)值常量、字符常量等其他任何數(shù)據(jù)類型。下列的定義是錯 誤的:typemonthtype=(1 , 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);colortype=( 'red' ,'yellow ' ,'blue ');前者錯在把數(shù)值常量作為枚舉值,后者錯在把
21、字符串常量作為枚舉值。還需注意的是,枚舉 元素是標識符,但不能把作為枚舉元素的標識符視作變量名,枚舉值是不能被賦值的。2、同一個枚舉元素不能出現(xiàn)在兩個或兩個以上的枚舉類型定義中在一個程序中,需要定義多個枚舉類型時,需注意同一個枚舉元素不能出現(xiàn)在兩個或兩個以上的枚舉類型定義中。如下列的定義是錯誤的:typecolor1=(red,yellow,blue,white);color2=(black,blue,green);因為枚舉元素blue既屬于枚舉類型colorl,又屬于枚舉類型color2。3、枚舉類型屬于順序類型枚舉類型定義中通過列出所有值的標識符來定義一個有序集合,這些值的次序和枚舉類型說
22、 明中的標識符的次序是一致的,且序號從0開始。變量說明如下:vard1,d2:(sun,mon,tue,wed,thu,fri,sat);其中枚舉值sun的序號為0,枚舉值mon勺序號為1,依次類推,枚舉值sat的序號值為6。同時,枚舉值是可以由大小來區(qū)別的,關(guān)系式sun<tue的值是true , tue>fri的值是false。用序號函數(shù)可以求出枚舉值的序號:ord(sun)=0 ord(mon)=1 ord(fri)=5用succ和pred函數(shù)可以求出枚舉值的后繼和前趨:succ(sun)=mon succ(wed)=thu pred(wed)=tue pred(sat)=fr
23、i當然,枚舉類型中的第一個元素沒有前趨,最后一個元素沒有后繼??梢?,枚舉值可以作為序號函數(shù)(ord)、前趨函數(shù)(pred)和后繼函數(shù)(succ)的自變量。4、對枚舉類型只能進行賦值運算和關(guān)系運算vard1,d2:(sun,mon,tue,wed,thu,fri,sat);c:(red,yellow,blue,white);此時,在程序中允許出現(xiàn)以下語句:d1:=sun;d2:=fri;c:=blue;if d2=d2 then write( 'the same day ' ) else write( 'the different day ');可見,對枚舉類型能
24、進行賦值運算和關(guān)系運算。但下列的語句是錯誤的: mon:=1; c:=sun; read(d1,d2,c); write(d1,d2,c);writeln(blue);錯誤分析:語句:把枚舉值當成了變量名;語句:枚舉值sun不屬于枚舉類型變量c的值域;語句:枚舉類型的變量不能用read或readln語句進行讀值;語句:枚舉類型的變量值和枚舉值不能通過write或writeln語句進行輸出。5、枚舉類型的應(yīng)用Pascal不允許直接讀寫枚舉值,所以枚舉值的輸入、輸出常用case語句間接地輸入、輸出。 枚舉值的輸入,一般先讀入序號,通過case語句將枚舉值相應(yīng)地賦給枚舉變量;輸出時,通過 case語
25、句判斷枚舉類型變量的值,輸出相應(yīng)的字符串。例1有紅、橙、黃、綠、藍五種顏色的小旗,每次取出三種不同顏色的小旗表示不同的信 號,輸出所有信號的方案及方案總數(shù)。程序如下:program ex2_1;typecolor=(red,orange,yellow,green,blue);varm,m1,m2,m3:color;s,p:integer;begins:=0;for m1:=red to blue dofor m2:=red to blue doif m1<>m2 thenfor m3:=red to blue doif (m3<>m1) and (m3<>m
26、2) thenbegins:=s+1;write(s, ':');for p:=1 to 3 dobegincase p of1:m:=m1;2:m:=m2;3:m:=m3;end; case pcase m ofred:write( 'red ' :8);orange:write('orange' :8);yellow:write('yellow ' :8);green:write('green' :8);blue:write( 'blue ' :8);end; case mend; for pw
27、riteln;end; ifwriteln( 'total: ' ,s);end.運行后共輸出60種不同的信號方案。由于枚舉類型是一種順序類型,故枚舉類型的變量可以作為循環(huán)變量。二、子界類型(一)子界類型的定義在實際應(yīng)用中,有些數(shù)據(jù)的變化范圍只局限在某一數(shù)據(jù)類型的某一確定的區(qū)域,Pascal語言 中,對只取某一已經(jīng)定義了的順序類型的值的某一范圍的這類問題,定義了子界這一數(shù)據(jù)類型。 例如,一年中的月份不超過12, 一月中的夭數(shù)不超過31。采用子界類型便于檢查數(shù)據(jù)的合法性, 增加程序的可讀性,使解決這類問題既符合常規(guī)概念,又自然清晰,更好保證了程序運行的正確 性。子界類型定義的一般
28、格式為:type<子界類型標識符 >=柔量1>.<常量2>其中常量1稱作下界,常量2稱作上界,且上界必須大于下界。下界和上界可以是整型、字 符型、布爾型、枚舉型等順序型的兩個常量,但必須是同一種順序類型,該順序類型稱為子界類 型的“基類型”。一個子界類型的取值范圍是其基類型的取值范圍中從下界到上界的連續(xù)一段,子 界類型的值域?qū)嶋H上就是基類型值域的一個子集。下面的類型定義部分中定義了一個枚舉類型和四個子界類型:Constn=150;Typeweek=(sun, mon, tue, wed, thu, fri, sat);age=0.n;days=28.31;lett
29、er='a'.'z'workday=mon.fri;其中,子界類型age可表示人的年齡,其基類型為整型,取值范圍為整數(shù)0150;子界類型 days可表示一個月的夭數(shù),其基類型也是整型,取值范圍為整數(shù)2831;子界類型letter表示 小寫字母,其基類型為字符類型,取值范圍為字符'a''z';子界類型workday可表示一個星期 的工作日,其基類型為枚舉類型weeK取值范圍為類型week的五個枚舉類型元素mogfri ,注 意作為類型workday的基類型,類型week必須在類型workday之前定義。在定義子界類型時應(yīng)注意,子界類
30、型的基類型必須是順序類型,常用整型、字符類型和枚舉 類型,當用枚舉類型時,該枚舉類型必須先定義。特別不可用實型作為子界類型的基類型?;?型為整型、字符類型和枚舉類型的子界類型分別稱為整數(shù)子界類型,字符子界類型和枚舉子界類 型。在定義了一個子界類型之后,就可說明該子界類型的變量。例如,對于如上定義的子界類型 age, days, letter和workday,可說明這些子界類型的變量如下:Varstudentage: age;n, m: days;ch1, ch2, ch3: letter;today: workday;其中,整數(shù)子界類型變量studentage只能在0150范圍內(nèi)取值,不可超
31、出該范圍,字符子 界類型變量ch1, ch2和ch3都只能在'a''z'范圍內(nèi)取值,余者類推。在說明子界類型變量時還可先不定義相應(yīng)的子界類型,直接在變量說明部分中將類型定義與 變量說明合并起來寫,例如下面的變量說明是合法的:Varch: 'A'.'Z'u, v: 0.9;其中,ch被說明為字符子界類型變量,其取值范圍為大寫字母字符'A''Z' ; u和v被說 明為整數(shù)子界類型變量,只能取值數(shù)字09。(二)子界類型數(shù)據(jù)的特點及應(yīng)用1、對基類型適用的各種運算,均適用于該子界類型一個子界類型與其基類型的區(qū)
32、別僅在于取值范圍不同,前者的取值范圍是后者的取值范圍中 連續(xù)的一部分,除此之外,子界類型具有其基類型的所有性質(zhì)。所以,子界類型的運算完全取決 于其基類型,即基類型的所有運算同樣適用于其子界類型。例如,整型的運算有算術(shù)運算:+、-、 *、Div和Mod以及關(guān)系運算和賦值運算,這些運算都適用于整數(shù)子界類型;而適用于字符子界 類型和枚舉子界類型的運算為關(guān)系運算和賦值運算。同樣,適用于一個有序類型的函數(shù)運算也適用于以其為基類型的子界類型。例如,適用于枚 舉子界類型的函數(shù)運算有:前趨函數(shù)Pred,后繼函數(shù)Succ和序號函數(shù)Ord。由于子界類型本身也 是順序類型,所以序號函數(shù)Ord適用于任何一個子界類型,
33、只是子界類型每個值的序號是按該值 在相應(yīng)的基類型中的序號來定的。例如,下面程序:Program test;Typeweek=(sun, mon, tue, wed, thu, fri, sat);Vard: tue.fri;n: -1.1;c: 'A'.'Z'Begind:=wed;n:=1;c:='A'Writeln(Ord(d):3, Ord(n):3, Ord(c):3);End.的輸出結(jié)果為:31 65子界類型的輸入、輸出方法同樣與其基類型相同。例如,枚舉子界類型變量的值不能用標準 過程Read Write直接輸入和輸出,只可采用與枚舉類
34、型變量相同的方法間接輸入和輸出。2、在同一程序中,具有相同類型的不同子界類型的數(shù)據(jù),可以混合運算例如,若有如下變量說明:Varn: Integer;m: 0.9;k: 5.20;則下列賦值語句都是合法的:n:=3;m:=n;k:=n*m+1;n:=(k-m)*n;應(yīng)注意在對子界類型變量賦值時,所賦的值不要越界。若執(zhí)行下列語句:m:=10;k:=n+50;則變量m的值為10,變量k的值為53,均超過m,k的值域,則在編譯時會出錯。3、子界類型的應(yīng)用例2從鍵盤上輸入一個字符,判斷其為數(shù)字字符,字母字符還是其它字符。程序如下:Program ex2_2;Varc: Char;BeginReadln(
35、c);Case c Of'0'.'9': Writeln('This is a digit.');'A'.'Z', 'a'.'z': Writeln('This is a letter.');Else Writeln('This is a other character.');End;End.例3確定19002000年中某年某月的天數(shù)。程序如下:Program ex2_3;Typeyear=1900.2000;month=1.12;days=28.31
36、;Vary: year;m: month;d: days;Begin$R+Write('I nput year(1900-2000) and month:');Readln(y, m);Case m Of1,3,5,7,8,10,12:d:=31;4,6,9,11:d:=30;2:If (y Mod 4=0) And (y Mod 100<>0) Or (y Mod 400=0) Then d:=29Else d:=28;End;Writeln('d=',d);End.在該程序中定義了整數(shù)子界類型year、month和days分別表示年、月和天數(shù),為
37、了使系統(tǒng) 在運行程序時能自動檢查子界類型變量y、m和d的值是否越界,在程序中加了編譯器指示$R+。 若在運行該程序時輸入越界的年份或月份,例如輸入年份為2001,則中斷程序的運行,并出現(xiàn)如 下出錯信息:range check error學(xué)習(xí)評價1、 設(shè)有四種水果:蘋果、橘子、香蕉和菠蘿,現(xiàn)要任取其中3種水果,不能重復(fù),不計先 后順序,請編寫程序列出所有可能的取法。2、輸入年、月、日,輸出該月有幾天。3、類型定義type ren=,A .,F(xiàn),;用A至F表示6個人,輸出6個人相互握手的各種情況,統(tǒng)計握手的次數(shù)。第三課數(shù)組在前面我們所學(xué)的變量都是獨立的變量,即變量之間沒有內(nèi)在的聯(lián)系,一個變量只能表
38、示一 個數(shù)據(jù)。如果處理的數(shù)據(jù)個數(shù)較少,僅使用簡單變量編程就夠了。如果處理大批數(shù)據(jù),而且這些 數(shù)據(jù)之間有某種內(nèi)在聯(lián)系,例如,一個工廠100名工人,要給這100人記入每個月的工資,并求 月平均工資,那么用簡單變量處理就很不方便了。像此處所說的求平均工資的問題,需要設(shè) 100 個變量:S, S2, 一 , S100,要寫出100個變量名,然后在求月平均工資的表達式中進行100項相 加運算;如果要處理1000個數(shù)據(jù),就要設(shè)1000個變量,這種方法顯得太煩瑣了。為了便于描述、 處理,我們經(jīng)常用一個變量來表示一批數(shù)據(jù),而這類變量中,最常用的是數(shù)組。數(shù)組是程序中最經(jīng)常使用的數(shù)據(jù)類型,由固定數(shù)目的相同類型的元
39、素按一定的順序排列而 成。并且在Pascal語言中,數(shù)組的元素個數(shù)必須事先確定。同時,數(shù)組元素的數(shù)據(jù)類型也必須是 固定的、惟一的。比如實型數(shù)組,數(shù)組元素都必須是實型數(shù);字符數(shù)組,數(shù)組元素都必須是字符。一、一維數(shù)組(一) 一維數(shù)組的定義一維數(shù)組是指只有一個下標的數(shù)組,一般用于線性批量數(shù)據(jù)的組織。在Pascal語言中定義數(shù)組有兩種方法:(1) 在說明部分type區(qū)中定義數(shù)組類型,然后再在Var區(qū)中說明數(shù)組。形式如下:type數(shù)組類型名=array下標類型of數(shù)組元素類型;var數(shù)組名:數(shù)組類型名;例如:typearr1=array1.100 of real;vara,b:arr1;以上說明部分的t
40、ype區(qū)中,由用戶定義了一個名為arr1的數(shù)組類型,在var部分說明了 a 和b為arr1類型的數(shù)組。(2) 直接在var區(qū)中定義數(shù)組var數(shù)組名:array下標類型of數(shù)組元素類型; 對于上例中a,b數(shù)組的定義,我們完全可以采用以下形式:a,b:array1.100 of real;說明:其中array和of是pascal保留字。方括號中的"下標類型"可以是任何順序類型, 即可以是整型、布爾型、字符型、枚舉類型和子界類型。下標類型不僅確定了該數(shù)組中數(shù)組元素 下標的類型,也規(guī)定了數(shù)組元素可用下標的上界、下界和該數(shù)組中元素的個數(shù)。如上例:下標類 型為子界類型,它規(guī)定了數(shù)組元素
41、下標的下界是整數(shù)1,上界是整數(shù)100,該數(shù)組一共包含100 個元素。在保留字of后面的數(shù)組元素類型規(guī)定了數(shù)組中所包含的每個元素的類型,數(shù)組元素類型 可以是任何類型。在同一個數(shù)組中,所有數(shù)組元素都具有相同類型。因此我們可以說,數(shù)組是由 固定數(shù)量的相同類型的元素組成的。再次提請注意:類型和變量是兩個不同概念,不能混淆。就數(shù)組而言,程序的執(zhí)行部分使用 的不是數(shù)組類型(標識符)而是數(shù)組變量(標識符)。(二)一維數(shù)組的引用當定義了一個數(shù)組,則數(shù)組中的各個元素就共用一個數(shù)組名(即該數(shù)組變量名),它們之間 是通過下標不同以示區(qū)別的。對數(shù)組的操作歸根到底就是對數(shù)組元素的操作。一維數(shù)組元素的引 用格式為:數(shù)組名
42、下標表達式說明:下標表達式值的類型,必須與數(shù)組類型定義中下標類型完全一致,并且不允許超越 所定義的下標下界和上界。數(shù)組是一個整體,數(shù)組名是一個整體的標識,要對數(shù)組進行操作,必須對其元素操作。數(shù) 組元素可以象同類型的普通變量那樣作用。如:a3:=34;是對數(shù)組a中第三個下標變量賦以34 的值。read(a4);是從鍵盤讀入一個數(shù)到數(shù)組a第4個元素中去。特殊地,如果兩個數(shù)組類型一致,它們之間可以整個數(shù)組元素進行傳送。如:var a,b,c:array1.100 of integer;beginc:=a;a:=b;b:=c;end.在上程序中,a,b,c三個數(shù)組類型完全一致,它們之間可以實現(xiàn)整數(shù)組傳
43、送,例子中,先將 a數(shù)組所有元素的值依次傳送給數(shù)組c,同樣b數(shù)組傳給a,數(shù)組c又傳送給b,上程序段實際上 實現(xiàn)了 a,b兩個數(shù)組所有元素的交換。(三)一維數(shù)組的應(yīng)用舉例對數(shù)組的操作其實是對所有數(shù)組元素的操作,數(shù)組元素在上下界之間是連續(xù)的,我們可以通 過逐個改變下標來逐個進行訪問,而下標也可以是個變量,針對這些特點,對數(shù)組的操作往往利 用下標設(shè)計循環(huán),以提高處理效率。例1按照順序讀入10個數(shù)據(jù),以逆序方式輸出。分析:我們可定義一個數(shù)組a用以存放輸入的10個數(shù),然后將數(shù)組a內(nèi)容逆序輸出。程序如下:program ex3_1;vara:array1.10 of integer;i :integer;
44、beginwriteln(,Input 10 dates:?);for i:=1 to 10 do read(ai);writeln(,revers:?);for i:=10 downto 1 do write(ai:3);end.例2編程,從數(shù)組中找出最大的一個元素,并指出它是哪一個元素。分析:設(shè)變量max先將第一個元素的值賦與ma*從第二個元素開始逐個與max比較,如 max小于當前元素,則把當前元素的值賦于max并記錄其下標,然后按此方法,直到所有元素都 與max比較完后,max的值即是所有元素中的最大值。程序如下:program ex3_2;var a:array 1.100 of i
45、nteger;i,k,n,max:integer;beginwrite('Input n:'); readln(n);writeln('Input ',n,' datas into array:');for i:=1 to n do read(ai);readln;max:=a1; k:=1;for i:=2 to n doif max<ai thenbegin max:=ai; k:=i end;writeln('Max is a',k,'=',max) end.例3從鍵盤輸入若干個數(shù),將它們按照從小到大的
46、順序輸出。分析:在數(shù)據(jù)處理中經(jīng)常使用排序。排序的方法很多,如:選擇法、冒泡法、shell排序法、 插入法等。我們這里以選擇法為例如何實現(xiàn)排序。選擇排序的過程如下:先將一組數(shù)(假定為整數(shù))放在a1,a2,an 中。先用a1和其他各個元素進行比較, 凡比它小的進行交換,一直比到 an,這樣,a1中存放的便是最小的元素。然后用 a2和 a3,a4,an進行比較,凡比它小的進行交換,這樣a2中存放的便是n個數(shù)中的次小元素,以此類推,直到最后。于是a1an便成為一組從小到大排序的數(shù)據(jù)。對于數(shù)組a,第一遍掃描需進行n-1次比較操作,最小數(shù)置于a1,第二遍掃描需進行n-2 次比較操作,次小數(shù)置于a2,每掃描
47、一次,比較的范圍就向后移動一個位置。當掃描到第n-1 次時,比較數(shù)據(jù)只需一次就能完成整個排序過程。程序如下:program ex3_3;const n=10;假設(shè)有10個數(shù)據(jù)需排序var a:array1.n of integer;i,j:integer;temp:integer;beginwriteln('Input ',n,' datas into array:');for i:=1 to n do read(ai);writeln( 'array a:');for i:=1 to n do write(ai:3);writeln; 輸出原始
48、數(shù)據(jù)for i:=1 to n-1 dofor j:=i+1 to n doif ai>aj thenbegintemp:=ai;ai:=aj;aj:=temp; 交換 ai、ajend;writeln( 'Result ');for i:=1 to n do write(ai:3);writeln; 輸出排序結(jié)果end.想一想如果需要將一組數(shù)據(jù)從大到小排序,程序該如何調(diào)整?例4給定含有n(n<=100)個有序(不妨設(shè)為從小到大)整數(shù)的序列,現(xiàn)從鍵盤輸入一個新 的整數(shù)x,將x插入到序列中,使之仍然有序。分析:我們將n個有序序列的元素存放在一個數(shù)組a中,首先需要找到元
49、素x的插入位置i , 然后從第i+1個元素至最后一個元素都向后移動一個位置,即aj+1:=aj(i+1<=j<=n), 最后我 們將元素x插入到第i個位置即可,根據(jù)這一思想,我們得到程序如下:program ex3_4;const maxn=100;vara:array1.maxn of integer;n,x,i,j,k:integer;beginwriteln('Input n: ' );readln(n);for i:=1 to n do read(ai);writeln('Input x: ' );read(x);if x<a1 the
50、n k:=1;if x>an then k:=n;for i:=1 to n doif(x>ai)and(x<ai+1) then k:=i;for j:=n downto k+1 doaj+1:=aj;ak+1:=x;for i:=1 to n+1 do write(ai,'');end.程序當n<100時運行結(jié)果完全正確,但當輸入的n值恰好是100時,程序?qū)⒊霈F(xiàn)錯誤,這是 因為程序中定義的數(shù)組a的下標值最多為100,而當完成插入x操作后,程序中a數(shù)組的下標值 將會達到n+1,即101,超出了數(shù)組下標范圍從而導(dǎo)致錯誤,為修改上述程序,只需將程序中的 m
51、axM直定義為101即可,這樣可避免數(shù)組下標超界。二、二維與多維數(shù)組前面介紹的一維數(shù)組只有一個下標。如果在數(shù)組的定義中有兩個下標就得到二維數(shù)組類型, 有多個下標類型就得到多維數(shù)組類型。同一維數(shù)組一樣,每個下標都有必須為一個順序類型的數(shù) 據(jù)類型,且每個下標都有上界和下界,一旦下標確定,數(shù)組元素的個數(shù)就確定了,且數(shù)組元素的 總個數(shù)是每個下標類型值的個數(shù)的乘積。對于二維或多維數(shù)組,其定義方式與一維數(shù)組類似,我 們同樣可以在type說明中先定義,然后在var變量中進行說明,也可以直接在var變量中進行說 明。二維數(shù)組的定義如下:type數(shù)組類型名=array<下標類型1>,下標類型2>
52、; of 3素類型例如:有下面二維數(shù)組定義:typearr1=array1.3,1.5 of integer;vara,b:arr1;我們可以把一個定義好的二維數(shù)組想象為一張二維表格,每個單元表格相當一個數(shù)組元素, 例如以上定義的a,b都是一個3行5列的二維數(shù)表,數(shù)表中共有3*5=15個數(shù)組元素,如圖3-2-1 所示,在二維數(shù)組中,元素的存放順序是按照先行后列的方式存放的。a1,1a1,2a1,3a1,4a1,5a2,1a2,2a2,3a2,4a2,5a3,1a3,2a3,3a3,4a3,5圖3-2-1二維數(shù)表對于二維數(shù)組元素的訪問,一般用一個循環(huán)控制一個下標的變化(行數(shù)),用另一個循環(huán)控 制
53、另一個下標的變化(列數(shù)),通過雙重循環(huán)來實現(xiàn)對二維數(shù)組全部或部分數(shù)組元素的操作,例如, 對于上面定義的二維數(shù)組a的輸入輸出的程序段如下:for i:=1 to 3 dofor j:=1 to 5 do read(ai,j); 輸入for i:=1 to 3 do beginfor j:=1 to 5 do writel(ai,j, ,); 輸出writeln;end;對于多維的情況,一般用來描述一個空間狀態(tài),例如,描述空間一個點的坐標,假設(shè)該點的 空間坐標X, Y, Z軸的坐標為整數(shù),假設(shè)如下定義一個三維數(shù)組來表示空間點的坐標:typearr1=array0.9,0.9,0.9 of inte
54、gervara:arr1;這樣,我們就可以得到1000個空間上的點ax,y,z(0<=x,y,z<=9),多維數(shù)組中元素的訪問往往通過多循環(huán)來控制,由于數(shù)組的維數(shù)越多,占用的內(nèi)存空間越大,因此在程序設(shè)計中一般不 超過三維數(shù)組。例5從鍵盤讀入10個學(xué)生語文、數(shù)學(xué)、英語這三門課的成績,計算出每位學(xué)生的平均分 和每門課程10個學(xué)生的平均分。分析:定義一個10行3列的二維數(shù)組來存放這些成績,定義一個10個元素的一維數(shù)組來存 放學(xué)生平均分,定義一個3個元素的一維數(shù)組來存放學(xué)科平均分。程序如下:program ex3_5;vara:array1.10,1.3 of integer;b:arra
55、y1.10 of real;c:array1.3 of real;i,j:integer;beginfor i:=1 to 10 dobeginfor j:=1 to 3 do read(ai);readln;end;for i:=1 to 10 do bi:=0;for i:=1 to 10 dobeginfor j:=1 to 3 do bi+ai,j;bi:=bi/3;end;for i:=1 to 10 do writeln(bi:5:1);for i:=1 to 3 do ci:=0;for i:=1 to 3 dobeginfor j:=1 to 10 do ci:=ci+aj,i;ci:=ci/10end;for i:=1 to 3 do writeln(ci:5:1);end.例6打印楊輝三角形的前10行。楊輝三角形如圖3-2-2 :1 5 10 10 51 5 1010 5 13-2-3需要打印前10行yh1,1:=1;for i:=2 to 10 do 設(shè)定第一行的值設(shè)定第210行的值3-2-2分析:觀察圖3-2-2,大家不容易找到規(guī)律,但是如果將它轉(zhuǎn)化為圖3-2-3,不難發(fā)現(xiàn)楊輝 三角形其實是一個二維表的下三角部分,假設(shè)通過二維數(shù)組yh存儲,每行首尾元素為1,且其中 任意一個非首尾元素yhi的值其實就是yhi-1,j-1 與yhi-1,j的和,另外每
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 科技與文化太原文化產(chǎn)業(yè)的雙輪驅(qū)動策略
- 電子商務(wù)平臺的營銷策略及效果比較
- 棗莊房屋租賃合同范本
- 領(lǐng)帶訂做合同范本
- 2025至2030年中國煙塵過濾檢測器數(shù)據(jù)監(jiān)測研究報告
- 知識產(chǎn)教育推廣助力科技發(fā)展與創(chuàng)新
- 2025年中儲糧集團紀檢監(jiān)察組招聘(4人)筆試參考題庫附帶答案詳解
- 上海購房合同范本
- 科技引領(lǐng)下的食品安全管理-以肉類產(chǎn)品為例的實踐研究
- 2025至2030年中國水移畫裝飾門數(shù)據(jù)監(jiān)測研究報告
- 液壓滑動模板施工方案
- 農(nóng)產(chǎn)品電商運營-完整全套課件
- 唐河縣泌陽凹陷郭橋天然堿礦產(chǎn)資源開采與生態(tài)修復(fù)方案
- 科研項目匯報ppt
- 建設(shè)工程項目法律風(fēng)險防控培訓(xùn)稿PPT講座
- “不作為、慢作為、亂作為”自查自糾報告范文(三篇)
- 上海市楊浦區(qū)2022屆初三中考二模英語試卷+答案
- 課件《中國式現(xiàn)代化》
- 公共事業(yè)管理案例
- 建筑電工考試題庫與答案
- TCSES 71-2022 二氧化碳地質(zhì)利用與封存項目泄漏風(fēng)險評價規(guī)范
評論
0/150
提交評論