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

下載本文檔

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

文檔簡介

OK備戰(zhàn)NOIP2010提高組初賽復(fù)習(xí)——程序設(shè)計基礎(chǔ)篇TOC\o\h\z第一章簡單程序 2第一節(jié)Pascal程序結(jié)構(gòu)和基本語句 2第二節(jié)順序結(jié)構(gòu)程序及基本數(shù)據(jù)類型 4第二章分支程序 6第一節(jié)條件語句及復(fù)合語句 6第二節(jié)情況語句及算術(shù)標(biāo)準(zhǔn)函數(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

第一章簡單程序程序設(shè)計語言,是一組用來定義計算機程序的語法規(guī)則。它是一種被標(biāo)準(zhǔn)化的交流技巧,用來向計算機發(fā)出指令。按語言級別有低級語言和高級語言之分。低級語言包括機器語言和匯編語言。它的特點是及特定的機器有關(guān),功效高,但使用復(fù)雜、繁瑣、費時、易出差錯。高級語言的表示方法要比低級語言更接近于待解問題的表示方法,其特點是在一定程度上及具體機器無關(guān),易學(xué)、易用、易維護。由于當(dāng)高級語言程序翻譯成相應(yīng)的低級語言程序時,一般說來,一個高級語言程序單位要對應(yīng)多條機器指令,相應(yīng)的編譯程序所產(chǎn)生的目標(biāo)程序往往功效較低。(例:Pascal、C、C++、Java等)第一節(jié)Pascal程序結(jié)構(gòu)和基本語句在未系統(tǒng)學(xué)習(xí)Pascal語言之前,暫且繞過那些繁瑣的語法規(guī)則細節(jié),通過下面的簡單例題,初步掌握Pascal程序的基本組成和基本語句的用法。[例1.1]編程在屏幕上顯示“HelloWorld!”。Pascal程序:Programex11;BeginWriteln('HelloWorld!');Readln;End. 這個簡單樣例程序,希望大家的程序設(shè)計學(xué)習(xí)能有一個良好的開端。程序中的Writeln是一個輸出語句,它能命令計算機在屏幕上輸出相應(yīng)的內(nèi)容,而緊跟Writeln語句后是一對圓括號,其中用單引號引起的部分將被原原本本地顯示出來。[例1.2]已知一輛自行車的售價是300元,請編程計算num輛自行車的總價是多少?解:若總售價用m來表示,則這個問題可分為以下幾步處理:=1\*GB3①從鍵盤輸入自行車的數(shù)目a;=2\*GB3②用公式m=300*a計算總售價;=3\*GB3③輸出計算結(jié)果。Pascal程序:ProgramEx12; {程序首部}Varnum,total:integer; {說明部分}Begin {語句部分}ReadLn(num); {輸入自行車數(shù)目}total:=300*num; {計算總售價}Writeln('total=',total); {輸出總售價} Readln;End.此題程序結(jié)構(gòu)完整,從中可看出一個Pascal程序由三部分組成:(1)程序首部由保留字Program開頭,后面跟一個程序名(如:Exl1);其格式為: Program程序名;程序名由用戶自己取,它的第一個字符必須是英文字母,其后的字符只能是字母或數(shù)字和下劃線組成,程序名中不能出現(xiàn)運算符、標(biāo)點符和空格。(2)說明部分程序中所用的常量、變量,或類型、及過程及自定義函數(shù),需在使用之前預(yù)先說明,定義數(shù)據(jù)的屬性(類型)。[例1.2]程序中VarS,R,C:Real;是變量說明,此處說明S,R,C三個變量均為實數(shù)類型變量。只有被說明為某一類型的變量,在程序中才能將及該變量同類型的數(shù)值賦給該變量。變量說明的格式為:Var變量表:類型;(3)語句部分指由保留字Begin(開始)至End.(結(jié)尾)之間的語句系列,是解決問題的具體處理步驟,也是程序的執(zhí)行部分。Pascal程序不管是哪部分,每句末尾都必須有分號(;),但允許最接近End的那個語句末尾的分號省略;程序結(jié)束的End末尾必須有圓點(.),是整個程序的結(jié)束標(biāo)志。程序中花括號“{}”之間的部分為注釋部分。Pascal程序結(jié)構(gòu)可歸納用如下的示意圖來表示:Program程序名; 程序首部 標(biāo)號說明;(Label) 常量說明;(Const) 說明部分 類型說明;(Type) 變量說明;(Var) 過程或函數(shù)說明; Begin程序體(主程序) 語句系列; 語句部分 End. 圖1.1Pascal程序的結(jié)構(gòu)把處理問題的步驟編成能從上到下順序執(zhí)行的程序,是簡單程序的基本特征。再來分析下面兩道例題的Pascal程序結(jié)構(gòu)和繼續(xù)學(xué)習(xí)基本語句。[例1.3]編程計算半徑為R的圓的面積和周長。解:這是一個簡單問題,按數(shù)學(xué)方法可分以下幾步進行處理:①從鍵盤輸入半徑的值R;{要求告訴圓的半徑R}②用公式S=πR2計算圓面積;③用公式C=2πR計算圓周長;④輸出計算結(jié)果。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);{輸出結(jié)果}Readln; End.程序中Pi是Pascal提供的標(biāo)準(zhǔn)函數(shù),它返回圓周率的近似值:3.1415926…。(:=)是賦值符號,賦值語句的格式為:變量:=表達式;賦值語句的作用是將:=右邊表達式的值記錄到左邊的變量中。Writeln是輸出語句,輸出語句有三種格式:①Write(輸出項1,輸出項2);{執(zhí)行輸出后光標(biāo)不換行}②Writeln(輸出項1,輸出項2);{執(zhí)行輸出后光標(biāo)換到下一行}③Writeln{僅輸出空白且光標(biāo)換到下一行}Writeln語句后面的圓括號以內(nèi)部分均為輸出項,可以是多項,各項間用逗號分隔;對單引號里的內(nèi)容按照引號內(nèi)的原樣(字符)輸出顯示。如果輸出項是表達式,則只輸出表達式的值,而不是表達式本身。[例1.4]輸出兩個自然數(shù)相除的商和余數(shù)。解:設(shè)被除數(shù)、除數(shù)、商和余數(shù),分別為A,B,C,D,均為變量,且都是整數(shù)類型。題中未給出具體的自然數(shù)A、B,可采用鍵盤輸入方式。①顯示兩數(shù)相除的數(shù)學(xué)形式;②求出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é)順序結(jié)構(gòu)程序及基本數(shù)據(jù)類型前面的簡單程序已體現(xiàn)出處理問題步驟、思路的順序關(guān)系,這就是順序結(jié)構(gòu)程序。[例1.5]交換兩個變量的值:由鍵盤輸入兩個正整數(shù)A和B,編程交換這兩個變量的值。解:交換兩個變量的值,可以想象成交換兩盒錄音帶(稱為A和B)的內(nèi)容,可以按以下步驟處理:步驟①:拿一盒空白錄音帶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定義了五個標(biāo)準(zhǔn)整數(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還定義了五個標(biāo)準(zhǔn)實數(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位第二章分支程序在程序設(shè)計中,許多問題是在一定條件下才選擇某種處理方式的,這就需要用條件判斷語句或情況選擇語句進行處理。程序執(zhí)行中將出現(xiàn)選擇(分支),根據(jù)條件只選擇執(zhí)行部分語句,不一定都是按原順序從頭到尾地執(zhí)行所有語句,這樣的程序稱為分支程序。第一節(jié)條件語句及復(fù)合語句[例2.1]某服裝公司為了推銷產(chǎn)品,采取這樣的批發(fā)銷售方案:凡訂購超過100套的,每套定價為50元,否則每套價格為80元。編程由鍵盤輸入訂購套數(shù),輸出應(yīng)付款的金額數(shù)。解:設(shè)X為訂購套數(shù),Y為付款金額,則:①輸入X;②判斷X值;③根據(jù)判斷結(jié)果選擇符合條件的那種方法計算Y值;④輸出計算結(jié)果。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語句的功能是按條件在兩種可能中選擇其中一種。習(xí)慣上把if后面的表達式稱為條件,then后面的語句稱為真項,else后面的語句稱為假項。若條件成立(為真)就執(zhí)行真項,然后執(zhí)行if語句的后繼語句;若條件不成立(為假)就跳過真項而執(zhí)行假項,然后執(zhí)行后繼語句。而第一種格式只有真項,沒有假項,當(dāng)條件不成立(為假)就什么也不需做,直接往下去執(zhí)行后繼語句。[例2.2]讀入三個不同的數(shù),編程按由小到大的順序排列打印出來。解:設(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{復(fù)合語句}t:=a;a:=b;b:=t{交換a,b}end;ifa>cthenbegin{復(fù)合語句}t:=a;a:=c;c:=t{交換a,c}end;ifb>cthenbegin{復(fù)合語句}t:=b;b:=c;c:=t{交換b,c}end;Writeln(a:6,b:6,c:6);Readln;End.if語句規(guī)定它的真項或假項位置上只能是一個基本語句,如果需要寫一組語句,就應(yīng)當(dāng)使用復(fù)合語句。本程序中有三處用到復(fù)合語句。每個復(fù)合語句的范圍是從Begin開始到及它相對應(yīng)的End為止。復(fù)合語句的地位和一個基本語句相同;其一般格式為:Begin語句系列End;第二節(jié)情況語句及算術(shù)標(biāo)準(zhǔn)函數(shù)如果有多種(兩種或兩種以上)選擇,常用情況語句編程。[例2.3]對某產(chǎn)品征收稅金,在產(chǎn)值1萬元以上征收稅5%;在1萬元以下但在5000元以上的征收稅3%;在5000元以下但在1000元以上征收稅2%;1000元以下的免收稅。編程計算該產(chǎn)品的收稅金額。解:設(shè)x為產(chǎn)值,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是“情況”值,用產(chǎn)值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ù)該值在情況常量表中的“對應(yīng)安排”,選擇其對應(yīng)的語句執(zhí)行,執(zhí)行完所選擇語句后就結(jié)束Case語句;如果常量表中沒有一個及表達式值對應(yīng)的語句,則什么也不做就結(jié)束本Case語句。Case語句的另一種應(yīng)用格式為:Case表達式of情況常量表1:語句1;情況常量表2:語句2;::情況常量表n:語句n;else語句n+1end;這種格式的前面部分是相同的,所不同的是:如果常量表中沒有一個及表達式值對應(yīng)的語句,則執(zhí)行及else對應(yīng)的語句,然后結(jié)束Case語句。程序中的trunc(x)為取整函數(shù),是Pascal的算術(shù)標(biāo)準(zhǔn)函數(shù)之一。Pascal常用的算術(shù)標(biāo)準(zhǔn)函數(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ù)(當(dāng)x為奇數(shù)時odd(x)值為true,否則為false);(7)ord(x)求x的序號,結(jié)果為整型(x為有序類型量);(8)piπ值(3.14932…);(9)pred(x)求x(有序類型)的前趨值;(10)succ(x)求x(有序類型)的后繼值;(11)random隨機函數(shù),產(chǎn)生0~1的隨機值;(12)random(n)產(chǎn)生0~n的隨機數(shù)(n為word類型,先執(zhí)行randomize,才能得到隨機整數(shù));(13)round(x)求x的四舍五入整數(shù);(14)trunc(x)求x的整數(shù)部分(截掉小數(shù)部分,結(jié)果為整型);(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)程序在編程中經(jīng)常遇到需要多次規(guī)律相同的重復(fù)處理,這就是循環(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)范圍則重復(fù)步驟③,否則結(jié)束循環(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①設(shè)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)結(jié)束后,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ù)字對調(diào)后得到一個新數(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 {內(nèi)循環(huán)控制列的變化}write('*'); Writeln; {輸出一行的“*”后換行}End;Readln;End.程序中的循環(huán)對于a的每個值都包含著一個b=(1~9)次的內(nèi)循環(huán)。外循環(huán)fora將內(nèi)循環(huán)forb包含在里面,稱為for循環(huán)的嵌套。嵌套形式如:fora:=n1ton2doforb:=m1tom2do循環(huán)體語句;[例3.6]用“*”號打印出如下的長方形圖案。**********Pascal程序:ProgramExam36;vari,j:integer;BeginFori:=1to4do {外循環(huán)控制行的變化}BeginForj:=1toido {內(nèi)循環(huán)控制列的變化}write('*'); Writeln; {輸出一行的“*”后換行}End;Readln;End.根據(jù)這種格式還可以實現(xiàn)多層循環(huán)嵌套,例如:fori:=m1tom2doforj:=n1ton2dofork=k1tok2do循環(huán)體語句;[例3.7]數(shù)學(xué)上把除了1和它本身,沒有別的數(shù)能夠整除它的自然數(shù)叫做素數(shù)(或質(zhì)數(shù))。現(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(假)布爾值及條件判斷結(jié)果為真(條件成立)或為假(條件不成立)的作用相同,常用于條件語句和循環(huán)語句中。Pascal共有四種邏輯運算符:①and(及)兩條件都為True時,其結(jié)果值為True;否則為False;②or(或)兩條件中只要有一個為True;其結(jié)果值為True;否則為False;③xor(異或)兩條件的邏輯值不相同時,其結(jié)果值為True;否則為False;④not(非)條件為True時,其結(jié)果值為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后面的條件表達式:如果表達式結(jié)果為假,則繼續(xù)執(zhí)行循環(huán)體,接著繼續(xù)檢查Until后面的條件表達式,如此反復(fù)執(zhí)行直到這個表達式結(jié)果為真時結(jié)束循環(huán)。Repeat循環(huán)體語句必須有能改變Until后面條件表達式值的語句,并最終使這個條件表達式的值為真,使循環(huán)自動結(jié)束。[例3.9]猜價格:中央電視臺的“購物街”欄目深受觀眾喜愛,其中的“猜商品價格”的節(jié)目更是膾炙人口,現(xiàn)在請你編一個程序模擬這一游戲:由計算機隨機產(chǎn)生200至5000之間的一個整數(shù),作為某件商品的價格,然后由你去猜是多少,若你猜的數(shù)大了,則計算機輸出提示“Gao”,若你猜的數(shù)小了,則計算機輸出提示“Di”,然后你根據(jù)提示繼續(xù)猜,直到你猜對了,計算機會提示“Ok”,并統(tǒng)計你猜的總次數(shù)。解:本題的游戲規(guī)則大家都清楚,要完成程序,必須把處理步驟理清:(1)用隨機函數(shù)Random產(chǎn)生200至5000之間的一個整數(shù)X; (2)你猜一個數(shù)A; (3)若A>X,則輸出“High”;(4)若A<X,則輸出“Low”;(5)若A=X則輸出“Ok”;(6)重復(fù)(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)指令相當(dāng)于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)是當(dāng)型循環(huán)。While循環(huán)語句的格式為:While條件式do語句;其中do后面的“語句”是被重復(fù)執(zhí)行的,稱為循環(huán)體;若循環(huán)體是多個語句,必須用begin--end包起來成為復(fù)合語句。While循環(huán)首先判斷條件式,當(dāng)條件式的值為真就執(zhí)行do后面的語句(循環(huán)體)。While的循環(huán)體內(nèi)也必須包含能改變控制變量取值語句,影響條件式的值,最終使條件式為false(假),才能結(jié)束循環(huán)。[例3.10]輸入任一的自然數(shù)A,B,求A,B的最小公倍數(shù)。解:這里采用適合計算機查找的方法:設(shè)D是它們的最小公倍數(shù)。先找出A,B當(dāng)中的較大者并存放在A中,將較小者存放在B中,讓D=A,當(dāng)D能夠整除B時,則D是所求的最小公倍數(shù);當(dāng)D不能整除B,就逐次地讓D增加A。例如:A=18,B=12,步驟如下:①讓D=A(D=18)②當(dāng)(DmodB)<>0為真時(D不能整除B)就做D=D+A,重復(fù)②;③當(dāng)(DmodB)<>0為假時結(jié)束循環(huán),并輸出D。Pascal程序:programExam310;vara,b,d,t:integer;beginreadln(a,b);ifa<bthenbegint:=a;a:=b;b:=tend;d:=a;whiledmodb<>0do{當(dāng)條件為真時就做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)當(dāng)余數(shù)<>0就做n=a;a=b;b=nmodb,重復(fù)(1)和(2);(3)當(dāng)余數(shù)=0就結(jié)束循環(huán),并輸出b值。比如a=18,b=12時,處理步驟為: (1)18/12=1,得余數(shù)為6; (2)此余數(shù)不為零,讓a=12,b=6; (3)重復(fù)12/6=2,得余數(shù)為0; (4)結(jié)束循環(huán),輸出6(余數(shù)為零時的b值即是所求的最大公約數(shù))。此方法稱為輾轉(zhuǎn)相除法求最大公約數(shù)。Pascal程序:programExam313;vara,b,n:integer;beginreadln(a,b);whileamodb<>0dobeginn:=a;a:=b;b:=nmodb;end;writeln(b);Readln;End.第四章函數(shù)及過程程序中往往需要把主要任務(wù)分成若干個子任務(wù),每個子任務(wù)只負責(zé)一個專門的基本工作。每個子任務(wù)就是一個獨立的子程序。TurboPascal可以把函數(shù)和過程作為子程序調(diào)用。第一節(jié)函數(shù)Pascal允許用戶在程序中自己說明定義所需要的函數(shù)并在程序中調(diào)用這些函數(shù)。自定義函數(shù)的一般格式為:function函數(shù)名(形式參數(shù)表):類型;{函數(shù)首部}局部變量說明部分;begin語句系列;{函數(shù)體}end;函數(shù)中的形式參數(shù)接受調(diào)用函數(shù)時所傳入的值,用來參及函數(shù)中的運算。[例4.1]求任意輸入的三個自然數(shù)的最大公約數(shù)。解:⑴自定義一個專門求兩自然數(shù)的最大公約數(shù)的函數(shù)GCD;⑵調(diào)用自定義函數(shù),第一次求前兩個數(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);{調(diào)用函數(shù)GCD}a1:=GCD(a1,a3);Writeln(a1);Readln;End.函數(shù)的結(jié)果是一個具體的值,在函數(shù)體中必須將所得到的運算結(jié)果賦給函數(shù)名;主程序通過調(diào)用函數(shù)得到函數(shù)的運算結(jié)果。調(diào)用函數(shù)的一般格式為:函數(shù)名(實在參數(shù)表) 調(diào)用函數(shù)時,函數(shù)名后面圓括號內(nèi)的參數(shù)必須有確定的值,稱為實在參數(shù)。調(diào)用時即把這些實際值傳送給函數(shù)形參表中的相應(yīng)形參變量。函數(shù)不是單獨的語句,只能作為運算賦值或出現(xiàn)在表達式中。第二節(jié)自定義過程自定義函數(shù)通常被設(shè)計成求一個函數(shù)值,一個函數(shù)只能得到一個運算結(jié)果。若要設(shè)計成能得到若干個運算結(jié)果,或完成一系列處理,就需要自定義“過程”來實現(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);{調(diào)用自定義過程}ifa>cthenswap(a,c);ifb>cthenswap(b,c);Writeln(a:6,b:6,c:6);Readln;End.程序中ProcedureSwap是定義過程名,從作用來看,過程及函數(shù)是相似的,都能將復(fù)雜的問題劃分成一些目標(biāo)明確的小問題來求解,只不過函數(shù)有值返回而過程則沒有。自定義過程的一般格式如下:Procedure過程名(形式參數(shù)表);{過程首部}局部變量說明部分;begin語句部分;{過程體部分}end;第五章Pascal的自定義數(shù)據(jù)類型Pascal系統(tǒng)允許用戶自定義的數(shù)據(jù)類型有:數(shù)組類型、子界類型、枚舉類型、集合類型、記錄類型、文件類型、指針類型。第一節(jié)數(shù)組及子界類型數(shù)組必須在說明部分進行定義:確定數(shù)組名,數(shù)組分量(元素)的個數(shù)及類型。一般格式有:Var數(shù)組名:array[下標(biāo)類型]of數(shù)組元素類型;數(shù)組常量說明格式為:Const數(shù)組名:array[下標(biāo)類型]of數(shù)組元素類型=(常量表);程序中對數(shù)組的輸入、輸出處理,常用循環(huán)語句控制下標(biāo),進行有序地直接操作每個數(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ù)中的前面那元素的標(biāo)號,就能進行及后一個序號元素(相鄰數(shù))比較,可寫成通用形式A[i]及A[i+1]比較,那么,比較的次數(shù)又可用1~(n-i)循環(huá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)次進行同樣處理,又把這一輪所比較的“最小數(shù)”調(diào)到所比較范圍的“最末尾”位置;……;每進行一輪兩兩比較后,其下一輪的比較范圍就減少一個。最后一輪僅有一次比較。在比較過程中,每次都有一個“最小數(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ù)組的下標(biāo)類型為1..N,這種類型規(guī)定了值域的上界和下界,是從一個有序類型范圍取出一個區(qū)段,所以稱為子界類型,子界類型也是有序類型。例[5.2]用篩法求出100以內(nèi)的全部素數(shù),并按每行五個數(shù)顯示。解:⑴把2到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ù)}③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)系上傳者。文件的所有權(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)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論