NOIP初賽復習程序設計基礎_第1頁
NOIP初賽復習程序設計基礎_第2頁
NOIP初賽復習程序設計基礎_第3頁
NOIP初賽復習程序設計基礎_第4頁
NOIP初賽復習程序設計基礎_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

OK備戰(zhàn)NOIP2010提高組初賽復習——程序設計基礎篇TOC\o\h\z第一章簡單程序 2第一節(jié)Pascal程序結構和基本語句 2第二節(jié)順序結構程序及基本數(shù)據(jù)類型 4第二章分支程序 6第一節(jié)條件語句及復合語句 6第二節(jié)情況語句及算術標準函數(shù) 8第三章循環(huán)程序 9第一節(jié)for循環(huán) 10第二節(jié)Repeat循環(huán) 14第三節(jié)While循環(huán) 15第四章函數(shù)及過程 17第一節(jié)函數(shù) 17第二節(jié)自定義過程 18第五章Pascal的自定義數(shù)據(jù)類型 19第一節(jié)數(shù)組及子界類型 19第二節(jié)二維數(shù)組 22

第一章簡單程序程序設計語言,是一組用來定義計算機程序的語法規(guī)則。它是一種被標準化的交流技巧,用來向計算機發(fā)出指令。按語言級別有低級語言和高級語言之分。低級語言包括機器語言和匯編語言。它的特點是及特定的機器有關,功效高,但使用復雜、繁瑣、費時、易出差錯。高級語言的表示方法要比低級語言更接近于待解問題的表示方法,其特點是在一定程度上及具體機器無關,易學、易用、易維護。由于當高級語言程序翻譯成相應的低級語言程序時,一般說來,一個高級語言程序單位要對應多條機器指令,相應的編譯程序所產生的目標程序往往功效較低。(例:Pascal、C、C++、Java等)第一節(jié)Pascal程序結構和基本語句在未系統(tǒng)學習Pascal語言之前,暫且繞過那些繁瑣的語法規(guī)則細節(jié),通過下面的簡單例題,初步掌握Pascal程序的基本組成和基本語句的用法。[例1.1]編程在屏幕上顯示“HelloWorld!”。Pascal程序:Programex11;BeginWriteln('HelloWorld!');Readln;End. 這個簡單樣例程序,希望大家的程序設計學習能有一個良好的開端。程序中的Writeln是一個輸出語句,它能命令計算機在屏幕上輸出相應的內容,而緊跟Writeln語句后是一對圓括號,其中用單引號引起的部分將被原原本本地顯示出來。[例1.2]已知一輛自行車的售價是300元,請編程計算num輛自行車的總價是多少?解:若總售價用m來表示,則這個問題可分為以下幾步處理:=1\*GB3①從鍵盤輸入自行車的數(shù)目a;=2\*GB3②用公式m=300*a計算總售價;=3\*GB3③輸出計算結果。Pascal程序:ProgramEx12; {程序首部}Varnum,total:integer; {說明部分}Begin {語句部分}ReadLn(num); {輸入自行車數(shù)目}total:=300*num; {計算總售價}Writeln('total=',total); {輸出總售價} Readln;End.此題程序結構完整,從中可看出一個Pascal程序由三部分組成:(1)程序首部由保留字Program開頭,后面跟一個程序名(如:Exl1);其格式為: Program程序名;程序名由用戶自己取,它的第一個字符必須是英文字母,其后的字符只能是字母或數(shù)字和下劃線組成,程序名中不能出現(xiàn)運算符、標點符和空格。(2)說明部分程序中所用的常量、變量,或類型、及過程及自定義函數(shù),需在使用之前預先說明,定義數(shù)據(jù)的屬性(類型)。[例1.2]程序中VarS,R,C:Real;是變量說明,此處說明S,R,C三個變量均為實數(shù)類型變量。只有被說明為某一類型的變量,在程序中才能將及該變量同類型的數(shù)值賦給該變量。變量說明的格式為:Var變量表:類型;(3)語句部分指由保留字Begin(開始)至End.(結尾)之間的語句系列,是解決問題的具體處理步驟,也是程序的執(zhí)行部分。Pascal程序不管是哪部分,每句末尾都必須有分號(;),但允許最接近End的那個語句末尾的分號省略;程序結束的End末尾必須有圓點(.),是整個程序的結束標志。程序中花括號“{}”之間的部分為注釋部分。Pascal程序結構可歸納用如下的示意圖來表示:Program程序名; 程序首部 標號說明;(Label) 常量說明;(Const) 說明部分 類型說明;(Type) 變量說明;(Var) 過程或函數(shù)說明; Begin程序體(主程序) 語句系列; 語句部分 End. 圖1.1Pascal程序的結構把處理問題的步驟編成能從上到下順序執(zhí)行的程序,是簡單程序的基本特征。再來分析下面兩道例題的Pascal程序結構和繼續(xù)學習基本語句。[例1.3]編程計算半徑為R的圓的面積和周長。解:這是一個簡單問題,按數(shù)學方法可分以下幾步進行處理:①從鍵盤輸入半徑的值R;{要求告訴圓的半徑R}②用公式S=πR2計算圓面積;③用公式C=2πR計算圓周長;④輸出計算結果。Pascal程序:ProgramEx13; {程序首部}Varr,s,c:Real;{說明部分}Begin {語句部分}Readln(r);{輸入半徑}s:=Pi*r*r;{圓面積公式S=πR2}c:=2*Pi*r;{圓周長公式C=2πR}Writeln('s=',s:5:1,'c=',c:5:1);{輸出結果}Readln; End.程序中Pi是Pascal提供的標準函數(shù),它返回圓周率的近似值:3.1415926…。(:=)是賦值符號,賦值語句的格式為:變量:=表達式;賦值語句的作用是將:=右邊表達式的值記錄到左邊的變量中。Writeln是輸出語句,輸出語句有三種格式:①Write(輸出項1,輸出項2);{執(zhí)行輸出后光標不換行}②Writeln(輸出項1,輸出項2);{執(zhí)行輸出后光標換到下一行}③Writeln{僅輸出空白且光標換到下一行}Writeln語句后面的圓括號以內部分均為輸出項,可以是多項,各項間用逗號分隔;對單引號里的內容按照引號內的原樣(字符)輸出顯示。如果輸出項是表達式,則只輸出表達式的值,而不是表達式本身。[例1.4]輸出兩個自然數(shù)相除的商和余數(shù)。解:設被除數(shù)、除數(shù)、商和余數(shù),分別為A,B,C,D,均為變量,且都是整數(shù)類型。題中未給出具體的自然數(shù)A、B,可采用鍵盤輸入方式。①顯示兩數(shù)相除的數(shù)學形式;②求出a除以b的商c;③求出a除以b的余數(shù)d;④緊接等式后面輸出顯示商和余數(shù)。Pascal程序:ProgramEx14;Vara,b,c,d:integer;BeginReadln(a,b);{輸入a,b}c:=adivb;{整除運算,取商的整數(shù)部分}d:=amodb;{相除求余運算,取商的余數(shù)部分}Writeln('c=',c,'d=',d);{輸出后自動換行} Readln;End.第二節(jié)順序結構程序及基本數(shù)據(jù)類型前面的簡單程序已體現(xiàn)出處理問題步驟、思路的順序關系,這就是順序結構程序。[例1.5]交換兩個變量的值:由鍵盤輸入兩個正整數(shù)A和B,編程交換這兩個變量的值。解:交換兩個變量的值,可以想象成交換兩盒錄音帶(稱為A和B)的內容,可以按以下步驟處理:步驟①:拿一盒空白錄音帶C為過渡,先將A翻錄至C;步驟②:再將B翻錄至A;步驟③:最后將C翻錄至B。這樣操作,可達到題目要求。Pascal程序:ProgramExam15;Vara,b,c:integer;BeginReadln(a,b);c:=a; a:=b; b:=c; Writeln('a=',a,'b=',b);Readln;End.Pascal定義了五個標準整數(shù)類型,如下表所示:類型取值范圍占字節(jié)數(shù)格式Shortint(短整型)-128..1271帶符號8位Integer(整型)-32768..327672帶符號16位Longint(長整型)-2147483648..21474836474帶符號32位Byte(字節(jié)型)0..2551無符號8位Word(字型)0..655352無符號16位在前面程序中常用的數(shù)據(jù)類型除整數(shù)類型,還有實數(shù)類型。Pascal還定義了五個標準實數(shù)類型,列表所示如下:類型取值范圍占字節(jié)數(shù)有效數(shù)字Real2.9×10-39~1.7×103867~8位Single1.5×10-45~3.4×1038411~12位Double5.0×10-324~1.7×10308815~16位Extended1.9×10-4951~1.1×1049321019~20位Comp-263+1~238-1819~20位第二章分支程序在程序設計中,許多問題是在一定條件下才選擇某種處理方式的,這就需要用條件判斷語句或情況選擇語句進行處理。程序執(zhí)行中將出現(xiàn)選擇(分支),根據(jù)條件只選擇執(zhí)行部分語句,不一定都是按原順序從頭到尾地執(zhí)行所有語句,這樣的程序稱為分支程序。第一節(jié)條件語句及復合語句[例2.1]某服裝公司為了推銷產品,采取這樣的批發(fā)銷售方案:凡訂購超過100套的,每套定價為50元,否則每套價格為80元。編程由鍵盤輸入訂購套數(shù),輸出應付款的金額數(shù)。解:設X為訂購套數(shù),Y為付款金額,則:①輸入X;②判斷X值;③根據(jù)判斷結果選擇符合條件的那種方法計算Y值;④輸出計算結果。Pascal程序:ProgramExam21;Varx,y:integer;BeginReadln(x);{輸入X}ifx>100theny:=50*xelsey:=80*x;{條件判斷及選擇}Writeln('y=',y);Readln;End.程序中的if語句常稱為條件語句,它的一般格式為:(1)if條件then語句;(2)if條件then語句1else語句2;IF語句的功能是按條件在兩種可能中選擇其中一種。習慣上把if后面的表達式稱為條件,then后面的語句稱為真項,else后面的語句稱為假項。若條件成立(為真)就執(zhí)行真項,然后執(zhí)行if語句的后繼語句;若條件不成立(為假)就跳過真項而執(zhí)行假項,然后執(zhí)行后繼語句。而第一種格式只有真項,沒有假項,當條件不成立(為假)就什么也不需做,直接往下去執(zhí)行后繼語句。[例2.2]讀入三個不同的數(shù),編程按由小到大的順序排列打印出來。解:設讀入的三個數(shù)為a,b,c,為了把較小的數(shù)排在前面,可作如下處理:①如果a>b就交換a、b的值,將較大的值換至后面;②如果a>c就交換a、c的值,將較大的值換至后面;③如果b>c就交換b、c的值,將較大的值換至后面;④輸出處理后的a,b,c。Pascal程序:ProgramExam22;Vara,b,c,t:Integer;BeginReadln(a,b,c);ifa>bthenbegin{復合語句}t:=a;a:=b;b:=t{交換a,b}end;ifa>cthenbegin{復合語句}t:=a;a:=c;c:=t{交換a,c}end;ifb>cthenbegin{復合語句}t:=b;b:=c;c:=t{交換b,c}end;Writeln(a:6,b:6,c:6);Readln;End.if語句規(guī)定它的真項或假項位置上只能是一個基本語句,如果需要寫一組語句,就應當使用復合語句。本程序中有三處用到復合語句。每個復合語句的范圍是從Begin開始到及它相對應的End為止。復合語句的地位和一個基本語句相同;其一般格式為:Begin語句系列End;第二節(jié)情況語句及算術標準函數(shù)如果有多種(兩種或兩種以上)選擇,常用情況語句編程。[例2.3]對某產品征收稅金,在產值1萬元以上征收稅5%;在1萬元以下但在5000元以上的征收稅3%;在5000元以下但在1000元以上征收稅2%;1000元以下的免收稅。編程計算該產品的收稅金額。解:設x為產值,tax為稅金,用P表示情況常量各值,以題意中每1000元為情況分界:P=0:tax=0(x<1000)P=1,2,3,4:tax=x*0.02(1000<=x<5000)P=5,6,7,8,9:tax=x*0.03(5000<=X<=10000)P=10:tax=x*0.05(x>10000)這里的P是“情況”值,用產值x除以1000的整數(shù)值作為P,如果P>10也歸入P=10的情況。Pascal語言用P=trunc(x/1000)取整計算,Pascal程序:ProgramExam23;Varx,p:integer; Tax:real;Beginreadln(x);P:=trunc(x/1000);ifP>9thenp:=10;Casepof0 :tax:=0;1..4:tax:=x*0.02;5..9 :tax:=x*0.03;10 :tax:=x*0.05end;Writeln(tax:6:1);Readln;End.程序中的Case─end語句為情況語句,是多路分支控制,一般格式為:Case表達式of情況常量表1:語句1;情況常量表2:語句2;::情況常量表n:語句nend;執(zhí)行情況語句時,先計算Case后面表達式的值,然后根據(jù)該值在情況常量表中的“對應安排”,選擇其對應的語句執(zhí)行,執(zhí)行完所選擇語句后就結束Case語句;如果常量表中沒有一個及表達式值對應的語句,則什么也不做就結束本Case語句。Case語句的另一種應用格式為:Case表達式of情況常量表1:語句1;情況常量表2:語句2;::情況常量表n:語句n;else語句n+1end;這種格式的前面部分是相同的,所不同的是:如果常量表中沒有一個及表達式值對應的語句,則執(zhí)行及else對應的語句,然后結束Case語句。程序中的trunc(x)為取整函數(shù),是Pascal的算術標準函數(shù)之一。Pascal常用的算術標準函數(shù)有19個:(1)abs(x)求x的絕對值(|x|);(2)exp(x)求ex的值;(e為無理數(shù)2.71828…)(3)frac(x)求x的小數(shù)部分;(4)int(x)求x的整數(shù)部分(不舍入,函數(shù)值為實型);(5)ln(x)求以e為底的x的對數(shù)(logex);(6)odd(x)判斷x的奇偶數(shù)(當x為奇數(shù)時odd(x)值為true,否則為false);(7)ord(x)求x的序號,結果為整型(x為有序類型量);(8)piπ值(3.14932…);(9)pred(x)求x(有序類型)的前趨值;(10)succ(x)求x(有序類型)的后繼值;(11)random隨機函數(shù),產生0~1的隨機值;(12)random(n)產生0~n的隨機數(shù)(n為word類型,先執(zhí)行randomize,才能得到隨機整數(shù));(13)round(x)求x的四舍五入整數(shù);(14)trunc(x)求x的整數(shù)部分(截掉小數(shù)部分,結果為整型);(15)sqr(x)求x的平方值(x2);(16)sqrt(x)求x的開平方根值;(17)sin(x)求x的正弦函數(shù)(x為弧度);(18)cox(x)求x的余弦函數(shù)(x為弧度);(19)arctan(x)正切的反三角函數(shù)(x為數(shù)值);第三章循環(huán)程序在編程中經常遇到需要多次規(guī)律相同的重復處理,這就是循環(huán)問題。Pascal采用不同的循環(huán)方式來實現(xiàn),常用的環(huán)循有三種:for、repeat、while.第一節(jié)for循環(huán)for循環(huán)是一種自動計數(shù)型循環(huán)。[例3.1]試打印出1~20的自然數(shù)。解:①用a代表1~20各數(shù),同時也用a兼作計數(shù),以控制循環(huán)次數(shù);②讓a從1開始;③輸出a;④a自動計數(shù)(加1),如果未超越所規(guī)定的循環(huán)范圍則重復步驟③,否則結束循環(huán)。Pascal程序:ProgramExam31;Vara:byte;Beginfora:=1to20doWriteln(a);Readln;End.程序中fora:=1to20doWriteln(a);是for循環(huán)語句。for循環(huán)語句有兩種格式:(1)for循環(huán)變量:=初值To終值do語句;(2)for循環(huán)變量:=初值downto終值do語句;第(1)種格式的初值小于等于終值,循環(huán)變量值按自動加1遞增變化;第(2)種格式的初值大于或等于終值,循環(huán)變量值按自動減1遞減變化。for循環(huán)是(以遞增1或以遞減1)計數(shù)型循環(huán)。比如:若將[例3.1]程序改為倒計數(shù)(遞減)循環(huán),則輸出20~1的自然數(shù)數(shù):ProgramExam31;Vara:byte;Beginfora:=20downto1doWriteln(a);Readln;End.[例3.2]打印出30至60的偶數(shù)。解:=1\*GB3①設a表示30至60的所有的數(shù),可用for循環(huán)列出;=2\*GB3②用式子amod2=0篩選出其中的偶數(shù)并輸出。Pascal程序:Programex32;Vara:integer;BeginFora:=30to60do Ifamod2=0thenwriteln(a);Readln;End.在這個程序中,for循環(huán)后的循環(huán)語句是一個條件分支語句。[例3.3]自然數(shù)求和:編一個程序,求從1至100的自然數(shù)的和。解:①令S=0;②令a表示1至100的自然數(shù),用循環(huán)列出;③將這些自然數(shù)用公式S:=S+a逐一累加到S中去;=4\*GB3④循環(huán)結束后,S即為1至100的自然數(shù)的和,輸出即可。Pascal程序:Programex33;vars,a:integer;BeginS:=0;Fora:=1to100doS:=S+a;Writeln('S=',S);Readln;End.[例3.4]一個兩位數(shù)x,將它的個位數(shù)字及十位數(shù)字對調后得到一個新數(shù)y,此時y恰好比x大36,請編程求出所有這樣的兩位數(shù)。解:①用for循環(huán)列舉出所有的兩位數(shù),x為循環(huán)變量;②用公式a:=xdiv10分離出x的十位數(shù)字;③用公式b:=xmod10分離出x的個位數(shù)字;④用公式y(tǒng):=b*10+a合成新數(shù)y;=5\*GB3⑤用式子y-x=36篩選出符合條件的數(shù)x并輸出。Pascal程序:Programex34;varx,a,b,y:integer;BeginForx:=10to99doBegina:=xdiv10;b:=xmod10;y:=b*10+a;ify-x=36thenwriteln(x);End;Readln;End.[例3.5]用“*”號打印出如下的長方形圖案。****************解:①上面給出的圖例共有4行,我們可以用一個循環(huán)控制行的變化;②在每行中又有9列,我們可以在前面控制行的循環(huán)中再套一個循環(huán)來控制列的變化。Pascal程序:Programex35;vari,j:integer;BeginFori:=1to4do {外循環(huán)控制行的變化}BeginForj:=1to4do {內循環(huán)控制列的變化}write('*'); Writeln; {輸出一行的“*”后換行}End;Readln;End.程序中的循環(huán)對于a的每個值都包含著一個b=(1~9)次的內循環(huán)。外循環(huán)fora將內循環(huán)forb包含在里面,稱為for循環(huán)的嵌套。嵌套形式如:fora:=n1ton2doforb:=m1tom2do循環(huán)體語句;[例3.6]用“*”號打印出如下的長方形圖案。**********Pascal程序:ProgramExam36;vari,j:integer;BeginFori:=1to4do {外循環(huán)控制行的變化}BeginForj:=1toido {內循環(huán)控制列的變化}write('*'); Writeln; {輸出一行的“*”后換行}End;Readln;End.根據(jù)這種格式還可以實現(xiàn)多層循環(huán)嵌套,例如:fori:=m1tom2doforj:=n1ton2dofork=k1tok2do循環(huán)體語句;[例3.7]數(shù)學上把除了1和它本身,沒有別的數(shù)能夠整除它的自然數(shù)叫做素數(shù)(或質數(shù))?,F(xiàn)在由鍵盤輸入一個自然數(shù)N,編程判斷N是否是素數(shù),是則輸出“Yes”,否則輸出“No”。解:根據(jù)定義,對于給定的自然數(shù)N,只需判斷除1和它本身外,還有沒有第三個自然數(shù)即可。①令K從2循環(huán)至N;②根據(jù)NmodK是否為0,如果為0則判定N不是素數(shù);如果都不為0則判定N是素數(shù)。Pascal程序:ProgramExam37;Varn,m,k:integer;flag:boolean;BeginReadLn(n);flag:=true;fork:=2ton-1do{外循環(huán)}ifnmodk=0thenflag:=false;ifflagthenwriteln('Yes') elsewriteln('No');readln;End.程序中的變量yes為布爾(或邏輯)類型(Boolean)。布爾值只有兩個:True(真)False(假)布爾值及條件判斷結果為真(條件成立)或為假(條件不成立)的作用相同,常用于條件語句和循環(huán)語句中。Pascal共有四種邏輯運算符:①and(及)兩條件都為True時,其結果值為True;否則為False;②or(或)兩條件中只要有一個為True;其結果值為True;否則為False;③xor(異或)兩條件的邏輯值不相同時,其結果值為True;否則為False;④not(非)條件為True時,其結果值為False;否則為True;(取反)第二節(jié)Repeat循環(huán)Repeat循環(huán)是直到型循環(huán)。程序中的Repeat循環(huán)格式為:repeat循環(huán)體語句;until條件表達式;{直到條件為真}Repeat循環(huán)首先執(zhí)行由Repeat和Until括起來的循環(huán)體語句,然后檢查Until后面的條件表達式:如果表達式結果為假,則繼續(xù)執(zhí)行循環(huán)體,接著繼續(xù)檢查Until后面的條件表達式,如此反復執(zhí)行直到這個表達式結果為真時結束循環(huán)。Repeat循環(huán)體語句必須有能改變Until后面條件表達式值的語句,并最終使這個條件表達式的值為真,使循環(huán)自動結束。[例3.9]猜價格:中央電視臺的“購物街”欄目深受觀眾喜愛,其中的“猜商品價格”的節(jié)目更是膾炙人口,現(xiàn)在請你編一個程序模擬這一游戲:由計算機隨機產生200至5000之間的一個整數(shù),作為某件商品的價格,然后由你去猜是多少,若你猜的數(shù)大了,則計算機輸出提示“Gao”,若你猜的數(shù)小了,則計算機輸出提示“Di”,然后你根據(jù)提示繼續(xù)猜,直到你猜對了,計算機會提示“Ok”,并統(tǒng)計你猜的總次數(shù)。解:本題的游戲規(guī)則大家都清楚,要完成程序,必須把處理步驟理清:(1)用隨機函數(shù)Random產生200至5000之間的一個整數(shù)X; (2)你猜一個數(shù)A; (3)若A>X,則輸出“High”;(4)若A<X,則輸出“Low”;(5)若A=X則輸出“Ok”;(6)重復(2)(3)(4)(5)直到A=X。 Pascal程序: Programex39;Vart,x,a :integer; BeginRandomize;x:=Random(4800)+200; t:=0;Repeat readln(a);ifa>xthenwriteln('High'); ifa<xthenwriteln('Low');ifa=xthenwriteln('OK');Inc(t);Untila=x; Readln;End.程序中inc(a)指令相當于a:=a+1,常用的同類指令格式如下:(1)inc(x)等同x:=x+1;(2)inc(x,n)等同x:=x+n;(3)dec(x)等同x:=x—1;(4)dec(x,n)等同x:=x—n;第三節(jié)While循環(huán)While循環(huán)是當型循環(huán)。While循環(huán)語句的格式為:While條件式do語句;其中do后面的“語句”是被重復執(zhí)行的,稱為循環(huán)體;若循環(huán)體是多個語句,必須用begin--end包起來成為復合語句。While循環(huán)首先判斷條件式,當條件式的值為真就執(zhí)行do后面的語句(循環(huán)體)。While的循環(huán)體內也必須包含能改變控制變量取值語句,影響條件式的值,最終使條件式為false(假),才能結束循環(huán)。[例3.10]輸入任一的自然數(shù)A,B,求A,B的最小公倍數(shù)。解:這里采用適合計算機查找的方法:設D是它們的最小公倍數(shù)。先找出A,B當中的較大者并存放在A中,將較小者存放在B中,讓D=A,當D能夠整除B時,則D是所求的最小公倍數(shù);當D不能整除B,就逐次地讓D增加A。例如:A=18,B=12,步驟如下:①讓D=A(D=18)②當(DmodB)<>0為真時(D不能整除B)就做D=D+A,重復②;③當(DmodB)<>0為假時結束循環(huán),并輸出D。Pascal程序:programExam310;vara,b,d,t:integer;beginreadln(a,b);ifa<bthenbegint:=a;a:=b;b:=tend;d:=a;whiledmodb<>0do{當條件為真時就做do后面的語句} inc(d,a);writeln('[',a,',',b,']=',d);readln;End.Pascal語言的三種基本循環(huán)方式,for循環(huán)對循環(huán)范圍有明確規(guī)定,且循環(huán)變量只能是遞增加1或遞減1自動計數(shù)控制;而repeat--until循環(huán)和while--do循環(huán)比較靈活,只要對條件表達式的值能控制滿足一定要求就能組成循環(huán),但在循環(huán)體中必須有改變循環(huán)變量值的語句,使條件判斷(邏輯值)最終為True或flase,讓循環(huán)能夠終止。[例3.13]求自然數(shù)A,B的最大公約數(shù)。解:采用如下方法步驟:(1)求A除以B的余數(shù);(2)當余數(shù)<>0就做n=a;a=b;b=nmodb,重復(1)和(2);(3)當余數(shù)=0就結束循環(huán),并輸出b值。比如a=18,b=12時,處理步驟為: (1)18/12=1,得余數(shù)為6; (2)此余數(shù)不為零,讓a=12,b=6; (3)重復12/6=2,得余數(shù)為0; (4)結束循環(huán),輸出6(余數(shù)為零時的b值即是所求的最大公約數(shù))。此方法稱為輾轉相除法求最大公約數(shù)。Pascal程序:programExam313;vara,b,n:integer;beginreadln(a,b);whileamodb<>0dobeginn:=a;a:=b;b:=nmodb;end;writeln(b);Readln;End.第四章函數(shù)及過程程序中往往需要把主要任務分成若干個子任務,每個子任務只負責一個專門的基本工作。每個子任務就是一個獨立的子程序。TurboPascal可以把函數(shù)和過程作為子程序調用。第一節(jié)函數(shù)Pascal允許用戶在程序中自己說明定義所需要的函數(shù)并在程序中調用這些函數(shù)。自定義函數(shù)的一般格式為:function函數(shù)名(形式參數(shù)表):類型;{函數(shù)首部}局部變量說明部分;begin語句系列;{函數(shù)體}end;函數(shù)中的形式參數(shù)接受調用函數(shù)時所傳入的值,用來參及函數(shù)中的運算。[例4.1]求任意輸入的三個自然數(shù)的最大公約數(shù)。解:⑴自定義一個專門求兩自然數(shù)的最大公約數(shù)的函數(shù)GCD;⑵調用自定義函數(shù),第一次求前兩個數(shù)的最大公約數(shù);從第二次開始,用每次求得的最大公約數(shù)及下一個數(shù)再求兩個數(shù)最大公約數(shù),直到最后。本題共兩次“求兩個數(shù)的最大公約數(shù)”,設輸入的三個自然數(shù)分別是a1,a2,a3,采用如下步驟:①求a1,a2兩個數(shù)的最大公約數(shù)→存入a1;②求a1,a3兩個數(shù)的最大公約數(shù)→存入a1;⑤輸出a1,此時的a1已是三個數(shù)的最大公約數(shù)。Pascal程序:ProgramExam41;Vara1,a2,a3:integer;functionGCD(x,y:integer):integer;{自定義函數(shù)}Varn:integer;beginWhilexmody<>0dobeginn:=x;x:=y;y:=nmodyend;GCD:=yend;Begin {主程序}readln(a1,a2,a3); a1:=GCD(a1,a2);{調用函數(shù)GCD}a1:=GCD(a1,a3);Writeln(a1);Readln;End.函數(shù)的結果是一個具體的值,在函數(shù)體中必須將所得到的運算結果賦給函數(shù)名;主程序通過調用函數(shù)得到函數(shù)的運算結果。調用函數(shù)的一般格式為:函數(shù)名(實在參數(shù)表) 調用函數(shù)時,函數(shù)名后面圓括號內的參數(shù)必須有確定的值,稱為實在參數(shù)。調用時即把這些實際值傳送給函數(shù)形參表中的相應形參變量。函數(shù)不是單獨的語句,只能作為運算賦值或出現(xiàn)在表達式中。第二節(jié)自定義過程自定義函數(shù)通常被設計成求一個函數(shù)值,一個函數(shù)只能得到一個運算結果。若要設計成能得到若干個運算結果,或完成一系列處理,就需要自定義“過程”來實現(xiàn)。[例4.3]把前面[例2.2](輸入三個不同的整數(shù),按由小到大排序)改為下面用自定義過程編寫的Pascal程序:Programexam42;Vara,b,c:integer;ProcedureSwap(varx,y:integer);{自定義交換兩個變量值的過程}Vart:integer;Begin {過程體}t:=x;x:=y;y:=t {交換兩個變量的值}end;Begin {主程序}Readln(a,b,c);ifa>bthenswap(a,b);{調用自定義過程}ifa>cthenswap(a,c);ifb>cthenswap(b,c);Writeln(a:6,b:6,c:6);Readln;End.程序中ProcedureSwap是定義過程名,從作用來看,過程及函數(shù)是相似的,都能將復雜的問題劃分成一些目標明確的小問題來求解,只不過函數(shù)有值返回而過程則沒有。自定義過程的一般格式如下:Procedure過程名(形式參數(shù)表);{過程首部}局部變量說明部分;begin語句部分;{過程體部分}end;第五章Pascal的自定義數(shù)據(jù)類型Pascal系統(tǒng)允許用戶自定義的數(shù)據(jù)類型有:數(shù)組類型、子界類型、枚舉類型、集合類型、記錄類型、文件類型、指針類型。第一節(jié)數(shù)組及子界類型數(shù)組必須在說明部分進行定義:確定數(shù)組名,數(shù)組分量(元素)的個數(shù)及類型。一般格式有:Var數(shù)組名:array[下標類型]of數(shù)組元素類型;數(shù)組常量說明格式為:Const數(shù)組名:array[下標類型]of數(shù)組元素類型=(常量表);程序中對數(shù)組的輸入、輸出處理,常用循環(huán)語句控制下標,進行有序地直接操作每個數(shù)組元素。[例5.1]編程輸入五個正整數(shù),然后自動按從大到小的順序輸出。解:①用循環(huán)把十個數(shù)輸入到A數(shù)組中;②從A[1]到A[10],相鄰的兩個數(shù)兩兩相比較,即:A[1]及A[2]比,A[2]及A[3]比,……A[9]及A[10]比。只需知道兩個數(shù)中的前面那元素的標號,就能進行及后一個序號元素(相鄰數(shù))比較,可寫成通用形式A[i]及A[i+1]比較,那么,比較的次數(shù)又可用1~(n-i)循環(huán)進行控制(即循環(huán)次數(shù)及兩兩相比較時前面那個元素序號有關);③在每次的比較中,若較大的數(shù)在后面,就把前后兩個對換,把較大的數(shù)調到前面,否則不需調換位置。下面例舉5個數(shù)來說明兩兩相比較和交換位置的具體情形:564375和6比較,交換位置,排成下行的順序;654375和4比較,不交換,維持同樣的順序;654374和3比較,不交換,順序不變654373和7比較,交換位置,排成下行的順序;65473經過(1~(5-1))次比較后,將3調到了末尾。經過第一輪的1~(N-1)次比較,就能把十個數(shù)中的最小數(shù)調到最末尾位置,第二輪比較1~(N-2)次進行同樣處理,又把這一輪所比較的“最小數(shù)”調到所比較范圍的“最末尾”位置;……;每進行一輪兩兩比較后,其下一輪的比較范圍就減少一個。最后一輪僅有一次比較。在比較過程中,每次都有一個“最小數(shù)”往下“掉”,用這種方法排列順序,常被稱之為“冒泡法”排序。Pascal程序:ProgramExam51;constN=10;Vara:array[1..N]ofinteger;{定義數(shù)組}i,j:integer;procedureSwap(Varx,y:integer);{交換兩數(shù)位置的過程}Vart:integer;begint:=x;x:=y;y:=tend;Beginfori:=1toNdo{輸入十個數(shù)}beginwrite(i,':');Readln(a[i])end;forj:=1toN-1do{冒泡法排序}fori:=1toN-jdo {兩兩相比較}ifa[i]<a[i+1]thenswap(a[i],a[i+1]);{比較及交換}fori:=1toNdo{輸出排序后的十個數(shù)}write(a[i]:6);end.程序中定義a數(shù)組的下標類型為1..N,這種類型規(guī)定了值域的上界和下界,是從一個有序類型范圍取出一個區(qū)段,所以稱為子界類型,子界類型也是有序類型。例[5.2]用篩法求出100以內的全部素數(shù),并按每行五個數(shù)顯示。解:⑴把2到100的自然數(shù)放入a[2]到a[100]中(所放入的數(shù)及下標號相同);⑵在數(shù)組元素中,以下標為序,按順序找到未曾找過的最小素數(shù)minp,和它的位置p(即下標號);⑶從p+1開始,把凡是能被minp整除的各元素值從a數(shù)組中劃去(篩掉),也就是給該元素值置0;⑷讓p=p+1,重復執(zhí)行第②、③步驟,直到minp>Trunc(sqrt(N))為止;⑸打印輸出a數(shù)組中留下來、未被篩掉的各元素值,并按每行五個數(shù)顯示。用篩法求素數(shù)的過程示意如下(圖中用下劃線作刪去標志):①23456789101112131415…9899100{置數(shù)}②23456789101112131415…9899100{篩去被2整除的數(shù)}③23456789101112131415…9899100{篩去被3整除的數(shù)}……23456789101112131415…9899100{篩去被整除的數(shù)}Pascal程序:ProgramExam52;constN=100;typexx=1..N;{自定義子界類型xx(類型名)}Vara:array[xx]ofboolean;i,j

溫馨提示

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

評論

0/150

提交評論