Pascal語言程序設計及算法基礎(肖教寧)_第1頁
Pascal語言程序設計及算法基礎(肖教寧)_第2頁
Pascal語言程序設計及算法基礎(肖教寧)_第3頁
Pascal語言程序設計及算法基礎(肖教寧)_第4頁
已閱讀5頁,還剩95頁未讀 繼續免費閱讀

下載本文檔

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

文檔簡介

注:本教程授課時間為十八課時,學生上機練習時間為十八課間,共計三十六課時。可同時對六十名學生授課。TOC\o"1-5"\h\z\o"CurrentDocument"第一章簡單程序 2\o"CurrentDocument"第一節Pasca!程序結構和基本語句 2\o"CurrentDocument"第二節順序結構程序與基本數據類型 7\o"CurrentDocument"第二章分支程序 10\o"CurrentDocument"第一節條件語句與復合語句 10\o"CurrentDocument"第二節情況語句與算術標準函數 12\o"CurrentDocument"第三章循環程序 16\o"CurrentDocument"第一節for循環 16\o"CurrentDocument"第二節repeat循環 23\o"CurrentDocument"第三節While循環 27\o"CurrentDocument"第四章函數與過程 33\o"CurrentDocument"第一節函數 33\o"CurrentDocument"第二節自定義過程 36\o"CurrentDocument"第五章Pascal的自定義數據類型 41\o"CurrentDocument"第一節數組與子界類型 41\o"CurrentDocument"第二節二維數組與枚舉類型 49\o"CurrentDocument"第三節集合類型 58\o"CurrentDocument"第四節記錄類型和文件類型 63\o"CurrentDocument"第五節指針類型與動態數據結構 70\o"CurrentDocument"第六章程序設計與基本算法 75\o"CurrentDocument"第一節遞推與遞歸算法 75\o"CurrentDocument"第二節回溯算法 82第一章簡單程序無論做任何事情,都要有一定的方式方法與處理步驟。計算機程序設計比日常生活中的事務處理更具有嚴謹性、規范性、可行性。為了使計算機有效地解決某些問題,須將處理步驟編排好,用計算機語言組成“序列”,讓計算機自動識別并執行這個用計算機語言組成的“序列”,完成預定的任務。將處理問題的步驟編排好,用計算機語言組成序列,也就是常說的編寫程序。在Pascal語言中,執行每條語句都是由計算機完成相應的操作。編寫Pascal程序,是利用Pascal語句的功能來實現和達到預定的處理要求?!扒Ю镏?,始于足下”,我們從簡單程序學起,逐步了解和掌握怎樣編寫程序。第一節Pascal程序結構和基本語句在未系統學習Pasca!語言之前,暫且繞過那些繁瑣的語法規則細節,通過下面的簡單例題,可以速成掌握Pascal程序的基本組成和基本語句的用法,讓初學者直接模仿學習編簡單程序。[例1.1]編程在屏幕上顯示“HelloWorld!”。Pasca!程序:Programexll;BeginWritelM'HelloWorkl!');ReadLn;End.這個簡單樣例程序,希望大家的程序設計學習能有一個良好的開端。程序中的Writein是ー個輸出語句,它能命令計算機在屏幕上輸出相應的內容,而緊跟Writein語句后是ー對圓括號,其中用單引號引起的部分將被原原本本地顯示出來。[例1.2]已知一輛自行車的售價是300元,請編程計算a輛自行車的總價是多少?解:若總售價用m來表示,則這個問題可分為以下兒步處理:①從鍵盤輸入自行車的數目a;②用公式m=300*a計算總售價;③輸出計算結果。Pasca!程序:ProgramEx12;Vara5m:integer;BeginWrite(ta=,);ReadLn(a);M:=300*a;{程序首部}{說明部分}(語句部分){輸入自行車數目}{計算總售價}

Writeln('M=\m); {輸出總售價}ReadLn; {等待輸入回車鍵}End.此題程序結構完整,從中可看出ー個Pasca!程序由三部分組成:(1)程序首部由保留字Program開頭,后面跟ー個程序名(如:Exll);其格式為:Program程序名;_程序名由用戶自己取,它的第一個字符必須是英文字母,其后的字符只能是字母或數字和下劃線組成,程序名中不能出現運算符、標點符和空格。(2)說明部分程序中所用的常量、變量,或類型、及過程與自定義函數,需在使用之前預先說明,定義數據的屬性(類型)。[例1.2]程序中VarS,R,C:Real,是變量說明,此處說明S,R,C三個變量均為實數類型變量。只有被說明為某ー類型的變量,在程序中才能將與該變量同類型的數值賦給該變量。變量說明的格式為:Var變量表:類型;(3)語句部分指由保留字Begin(開始)至End.(結尾)之間的語句系列,是解決問題的具體處理步驟,也是程序的執行部分。Pascal程序不管是哪部分,每句末尾都必須有分號(;),但允許最接近End的那個語句末尾的分號省略:程序結束的End末尾必須有圓點(.),是整個程序的結束標志。程序中花括號“{ド之間的部分為注釋部分。Pascal程序結構可歸納用如下的示意圖來表示:Program程ノ予名:標號說明:Program程ノ予名:標號說明:(Label)常量說明:(Const)類型說明:(Type)變量說明:(Var)過程或函數說明:Begin語句系列:End.圖1.1Pascal程序的結構說明部分程序體(主程序)

語句部分把處理問題的步驟編成能從上到下順序執行的程序,是簡單程序的基本特征。再來分析下面兩道例題的Pasca!程序結構和繼續學習基本語句。[例1.3]編程計算半徑為R的圓的面積和周長。解:這是ー個簡單問題,按數學方法可分以下幾步進行處理:①從鍵盤輸入半徑的值R: {要求告訴圓的半徑R}

②用公式S=nR2計算圓面積;計算圓周長;Pasca!程序:ProgramExl3;VarR,S?C:Real;{程序首部}計算圓面積;計算圓周長;Pasca!程序:ProgramExl3;VarR,S?C:Real;{程序首部}BeginWrite('R二?');Readln(R);S:=Pi*R*R;C:=2*Pi*R;WritelnCS=',S);WritelnCC士,C);Readln{說明部分}{語句部分}{輸入半徑)(圓面積公式S=nR2}{圓周長公式C=2"R){輸出結果}(等待輸入回車鍵}End.程序中Pi是Pascal提供的標準函數,它返回圓周率的近似值:3.1415926…。(:=)是賦值符號,賦值語句的格式為:變量:=表達式:賦值語句的作用是將:=右邊表達式的值記錄到左邊的變量中。Writein是輸出語句,輸出語句有三種格式:①Write(輸出項1,輸出項2); {執行輸出后光標不換行}②Writein(輸出項!,輸出項2); {執行輸出后光標換到下一行}③Writein I{僅輸出空白且光標換到下一行}Writein語句后面的圓括號以內部分均為輸出項,可以是多項,各項間用逗號分隔;對單引號里的內容按照引號內的原樣(字符)輸出顯示。如果輸出項是表達式,則只輸出表達式的值,而不是表達式本身。[例1.4]輸出兩個自然數相除的商和余數。解:設被除數、除數、商和余數,分別為A,B,C,D,均為變量,且都是整數類型。題中未給出具體的自然數A、B,可采用鍵盤輸入方式。①給出提示,從鍵盤輸入a,b;②顯示兩數相除的數學形式;③求出a除以b的商c;④求出a除以b的余數d;⑤緊接等式后面輸出顯示商和余數。Pasca!程序:ProgramExl4:Vara,b,c,d:integer;BeginWrite(lNPUTA,B:')Write(lNPUTA,B:');{給出提示信息}Readln(a,Writein;Write(a,Readln(a,Writein;Write(a,ソ‘,b,'=')c:=adivb;d:=amodb:Writeln(C,d);Readln{輸入a,b){輸出一空行}{輸出等式之后不換行}{整除運算,取商的整數部分}{相除求余運算,取商的余數部分}{輸出后自動換行){等待輸入回車鍵}End.執行本程序中第一個Write語句,輸出其引號以內的ー串提示信息,是給緊接著的輸入語句提供明確的提示(要求),有“一目了然,人機對話”之效果。Readln是一個特殊的輸入語句,要求輸入一個回車(換行)才能往下執行。Readln是輸入語句,它的?般格式為:①Read(變量1,變量2);②Readln(變量1,變量2);③Readln前兩種格式均要從鍵盤給變量輸入數據,輸入時,所鍵入的數據之間以空格為分隔,以回車為輸入結束。若多輸入了數據(即數據個數超過變量個數),Read語句讀完數據之后,能讓后續的讀語句接著讀取多下來的數據;而Readln語句對本行多輸入的數據不能讓后續語句接著讀取多下來的數據。為了防止多輸入的數據影響下ー個輸入語句讀取數據,建議盡量使用Readln語句輸入數據。第三種格式不需輸入數據,只需按入一個回車鍵。[例1.5]自然數的立方可以表示為兩個整數的平方之差,比如43=1〇2一62,請輸出自然數1996的這種表示形式。(這里的ペ用臼乘二次的形式4*4*4表示;IOユ也用自乘二次的形式1〇?1〇表示)解:此題沒有現成的計算公式能直接利用,但可以自行推出處理方法或構建適當的運算公式,按著構想的處理方案編排出各步驟。設這個自然數為N,兩個平方數分別為X,Y,將問題表示為求N3=X2-Y2①先找出X的值,仔細觀察題中的示例,用數學方法歸納可得出X=N*(N+l)/2;(構成本題可用的計算公式)②再仔細觀察,發現丫值比X小一個N值,即Y=X—N;③輸出等式N3=X2—Y2或N*N*N=X*X—Y*丫Pasca!程序:ProgramEx15;ConstN=1996; {常量說明}VarX,Y:Longint; {變量說明,此題計算中的數值較大,用長整型}BeginX:=N*(N+l)div2; {div是整除運算}Y:=X-N;Writeln(N,'*',N,'*',N;=',X;*',X;—',Y,'*',Y); {輸出結果)

End.本程序中N是常量,X,Y是變量,為長整數類型(Longint);程序中的div是整除運算,其結果只取商的整數部分:[例1.6]求一元二次方程x2+3x+2=0的兩個實數根。解:方程的系數是常量,分別用a,b,c表示,可運用數學上現成的求根公式求方程的根,采取如下方法:①先求出d=b2>4ac;(求根公式中需用開方運算的那部分)②再用求根公式算出xl,x2的值。(xl,x2=?)③輸出xl,x2.Pasca!程序:programExl6;Consta=1;programExl6;Consta=1;b=3;c=2;Vard:integer;XI,X2:Real;Begind:=b*b-4*a*c;xl:=(-b+sqrt(d))/(2*a);x2:=(-b-sqrt(d))/(2*a);WritelnCXl=',XI,1f:6,Readln'X2=',{常量說明}{a,b,c表示方程系數){d為整型變量){XI,X2為實型變量){求方程的根}X2);{輸出結果}{等待輸入ー個回車鍵}求右圖所示邊長為5.6的正立方體表面積。已知圖園柱體的高為求右圖所示邊長為5.6的正立方體表面積。已知圖園柱體的高為12,底面園的半徑為7,End.本程序中的a,b,c均為常量;變量d是整數類型,而變量xl,x2則是實數類型,因為運算式中的Sqn(d)開平方運算和(7)除法運算使結果為實數。Sqrt()是開平方函數,是Pascal系統的ー個標準函數。習題1.1模仿例題編程1.加法計算器:編程由鍵盤輸入兩個整數a和b,計算出它們的和并輸出到屏幕上。某梯形的上底、下底和高分別為8,12,9,求該梯形的面積。(梯形面積公式為S=(上底+下底)x髙5.計算某次考試語文、數學、英語和計算機等四科的總成績與平均成績。(請用輸入語句從鍵盤輸入各科成績分)第二節順序結構程序與基本數據類型前面的簡單程序已體現出處理問題步驟、思路的順序關系,這就是順序結構程序。[例1.7]交換兩個變量的值:由健盤輸入兩個正整數A和B,編程交換這兩個變量的值。解:交換兩個變量的值,可以想象成交換兩盒錄音帶(稱為A和B)的內容,可以按以下步驟處理:步驟①:拿一盒空白錄音帶C為過渡,先將A翻錄至C;步驟②:再將B翻錄至A;步驟③:最后將C翻錄至B。這樣操作,可達到題目要求。Pasca!程序:ProgramExaml7;Vara,b,c:integer;BeginWrite(tA,B=,);Readln(a,b);C:=A; {等價于步驟1}A:=B; {等價于步驟2}B:=C; {等價于步驟3)Writeln(A,B);End.[例1.8]分錢游戲。甲、乙、丙三人共有24元錢,先由甲分錢給乙、丙兩人,所分給的數與各人已有數相同;接著由乙分給甲、丙,分法同前:再由丙分錢給甲、乙,分法亦同前。經上述三次分錢之后,每個人的錢數恰好一樣多。求原先各人的錢數分別是多少?解:設甲、乙、丙三人的錢數分別為A,B,C。用倒推(逆序)算法,從最后結果入手,按反相順序,分步驟推算出每次各人當時的錢數:(在每個步驟中,各人錢數分別存在A、B、C中)步驟①:A=8B=8C=8 {這是最后結果的錢數,三人都一樣多}步驟②:A=A/2(=4)B=B/2(=4)C=A+B+C(=16) {A,B未得到丙分給的錢時,只有結果數的一半;C應包含給A,B及本身數三者之和}步驟③:A=A/2(=2)C=C/2(=8)B=A+B+C(=14) {A,C未得到乙分給的錢時,只有巳有數的一半;B應包含給A,C及本身數三者之和}步驟④:B=B/2(=7)C=C/2(=4)A=A+B+C(=13)C未得到甲分給的錢時,只有巳有數的一半;A應包含給B,C及本身數三者之和}步驟⑤:輸出A(=13)B(=7)C(=4){此時的A,B,C就是三人原先的錢數}Pasca!程序:ProgramExaml8;Vara,b,c:integer;Begina:=8;b:=8;c:=8; {對應于步驟①)a:=adiv2; b:=bdiv2; c:=a+b+c; {對應于步驟②}a:=adiv2; c:=cdiv2; b:=a+b+c; {對應于步驟③}b:=bdiv2; c:=cdiv2; a:=a+b+c; {對應于步驟④}Writeln('a±,a,' 4, 'b=',b,' 4,'c=',c);{輸出)ReadlnEnd.細心觀察,會發現本程序語句的順序很關鍵。此例用反推順序(逆序),按步驟正確推算出各變量的值。當然,有的問題可按正序步驟編程,這類程序都稱為順序程序。本程序Writein語句的輸出項含有('4),這里的冒號用來指定該項顯示所占寬度,此處是輸出4個空格即(空格項占4格)。[例1.9]有雞兔同籠,頭30,腳90,究竟籠中的雞和兔各有多少只?解:設雞為J只,兔為T只,頭為H,腳為F,貝リ:J+T=30 ①2*J+4*T=90 ②解此題暫不必采用數學上直接解方程的辦法,可采用“假設條件與邏輯推理”的辦法:假設籠中30個頭全都是兔,那么都按每頭4只腳計算,總腳數為(4*H),與實際腳數(F)之差為(4*H—F),如果這個差=0,則籠中全是兔(即雞為0只);如果這個差值>0,說明多計算了腳數,凡是雞都多給算了兩只腳,用它除以2就能得到雞的只數,處理步驟為:①J=(4*H—F)/2 {先用腳數差值除以2算出雞的只數)②T=H-J {再用總頭數減雞數算出免的只數}按此方法,這兩步運算必須注意先后順序オ會符合運算邏輯。Pasca!程序:ProgramExaml6;ConstH=30; {常量說明}F=90;VarJ,T:byte: {為字節類型的整數}BeginJ:=(4*H-F)div2; {整除運算}T:=H-JWritein(7=',J,' 6,T=',T);ReadlnEnd.本程序中H,F為常量,變量J,T為byte類型,屬于整數類型。Pascal定義了五個標準整數類型,如下表所示:類型取值范圍占字節數格式Shortint(短整型)-128..1271帶符號8位Integer (整型)-32768.327672帶符號16位

Longint(長整型)-2147483648..21474836474帶符號32位Byte(字節型)0..2551無符號8位Word (字型)0..655352無符號16位在前面程序中常用的數據類型除整數類型,還有實數類型。Pasca!還定義了五個標準實數類型,列表所示如下:類型取值范圍占字節數有效數字Real2.9X10-39~1.7X103867~8位Single1.5X1O-45~3.4X1038411~12位DoubleS.OXIO-^-I.VXIO308815~16位Extended1.9X1O495I~1.1X1049321019~20位Comp-263+l~238-l819-20位在TurboPasca!中實數的表示用科學記數法,可認為由三部分組成:#.##E+##或#.##E-##①#.##表示有效數字;②E表示以10為底的‘幕;③鈣#或"##是指數部分,+號可省略。例如:1.7E+38可寫成1.7E38(等同于1.7X1038)。在實數類型定義下,即使是整數,在程序執行時系統也將自動轉換成科學記數形式,試請運行下面程序并注意觀察運行結果:ProgramExam17;{X為實數類型}{把整數{X為實數類型}{把整數180賦給實數類型變量X}

{輸出的x自動表示成實數形式}BeginX:=180;Writein('x=\x);ReadlnEnd.習題1.21.已知△ABC中的三邊長分別為25.76,74.03,59.31I求△ABC的面積。〇其中P=〇其中P=.某車棚存有自行車和三輪車共65輛,它們的輪子數合計為150個。求該棚內存有的自行車和三輪車各是多少輛?.甲、乙、丙三人分別有磁帶36,48,64盒。先由甲把自己的磁帶平均分為三份,分給乙、丙各ー份,自己留下ー份;接著是乙,最后是丙,都按甲的方法處理。編程輸出甲、乙、丙在上述過程中各人的磁帶數分別是多少?(輸出所有的中間結果).五位好朋友相聚。第一位朋友帶來了很多糖塊贈送給各位朋友,使每人的糖塊在各自原有的基礎上翻了一倍;接著第二位好友也同樣向每人贈送糖塊,他同樣使每人的糖塊在各人已有的數量上翻了一倍;第三、第四、第五位好友都照此辦理。經過這樣的贈送之后,每人的糖塊恰好都為32塊。問各位好友原先的糖塊數分別是多少?第二章分支程序在程序設計中,許多問題是在一定條件下オ選擇某種處理方式的,這就需要用條件判斷語句或情況選擇語句進行處理。程序執行中將出現選擇(分支),根據條件只選擇執行部分語句,不一定都是按原順序從頭到尾地執行所有語句,這樣的程序稱為分支程序。第一節條件語句與復合語句[例2.1]某服裝公司為了推銷產品,采取這樣的批發銷售方案:凡訂購超過100套的,每套定價為50元,否則每套價格為80元。編程由鍵盤輸入訂購套數,輸出應付款的金額數。解:設X為訂購套數,Y為付款金額,貝リ:_150*X (X>100){如果X>100就用Y=5〇?X計算}丫リ8〇?X (X<=100) {否則用Y=8〇?X計算}①輸入X;②判斷X值;③根據判斷結果選擇符合條件的那種方法計算Y值;④輸出計算結果。Pasca!程序:ProgramExam21;Varx?y:integer;BeginWrite(*X=*);Readln(x); {輸入X}ifx>100theny:=50*Xelsey:=80*X; {條件判斷與選擇}Writeln('yゴ,y);ReadlnEnd.程序中的if語句常稱為條件語句,它的一般格式為:if條件then語句;if條件then語句Ielse語句2;IF語句的功能是按條件在兩種可能中選擇其中一種。習慣上把if后面的表達式稱為條件,then后面的語句稱為真項,else后面的語句稱為假項。若條件成立(為真)就執行真項,然后執行if語句的后繼語句;若條件不成立(為假)就跳過真項而執行假項,然后執行后繼語句。而第一種格式只有真項,沒有假項,當條件不成立(為假)就什么也不需做,直接往下去執行后繼語句。

[例2.2]讀入三個不同的數,編程按由小到大的順序排列打印出來。解:設讀入的三個數為a,b,c,為了把較小的數排在前面,可作如下處理:①如果a>b就交換a、b的值,②如果a>c就交換a、c的值,③如果b>c就交換b、c的值,④輸出處理后的a,b,c。Pasca!程序:ProgranmExam22;Vara,b?c,t:Real;將較大的值換至后面將較大的值換至后面;將較大的值換至后面Begin將較大的值換至后面將較大的值換至后面;將較大的值換至后面Write('Inputa,b,Readln(a,b,c);ifa>bthenbegint:=a;a:=b;end;ifa>cthenbegint:=a;a:=c;end;ifb>cthenbegint:=b;b:=c;end;Writeln('a,b,c:\0=');{復合語句}0=');{復合語句}b:=t(交換a,b]{復合語句}c:=t{交換a,c]{復合語句}c:=t {交換b,c]a:6,b:6?c:6);End.if語句規定它的真項或假項位置上只能是一個基本語句,如果需要寫ー組語句,就應當使用復合語句。本程序中有三處用到更合語句。每個復合語句的范圍是從Begin開始到與它相對應的End為止。復合語句的地位和一個基本語句相同;其一般格式為:Begin語句系列End;習題2.1.假設郵局規定寄郵件時若每件重量在1公斤以內(含1公斤),按每公斤1.5元計算郵費,如果超過1公斤時,其超出部分每公斤加收08元。請編程序計算郵件收費。.輸入三個正整數,若能用這三個數作為邊長組成三角形,就計算并輸出該三角形的面積,否則輸出Can'to(組成三角形的條件為:任意兩邊之和大于第三邊).輸入ー個三位數的整數,將數字位置重新排列,組成一個盡可大的三位數。例如:輸入213,重新排列可得到盡可能大的三位數是321。第二節情況語句與算術標準函數如果有多種(兩種或兩種以上)選擇,常用情況語句編程。前面[例2.1]改成用如下方法來處理。根據題意,付款計算可分為兩種情況:Y=50*X (X>100)Y=80*X (X<=100)顯然,情況①與②的選擇取決于X值。假設用N表示“情況值”,暫且先讓N=2;如果X>100則N=1;(此題屮N的值只是1或2,且取決于X值)Pasca!程序:ProgramExam21_l;VarX,Y,N:integer;BeginWrite('X=);readln(x);n:=2: {先讓n=2}ifX>100thenn:=l; {如果X>100則n=l}Casenof {關于情況處理}Y:=50*X;Y:=80*X;end;Writeln(Y=',Y);ReadlnEnd.程序中的Case—end語句為情況語句,是多路分支控制,?般格式為:Case表達式of情況常量表1:語句1;情況常量表2:語句2;情況常量表n:語句nend;執行情況語句時,先計算Case后面表達式的值,然后根據該值在情況常量表中的“對應安排”,選擇其對應的語句執行,執行完所選擇語句后就結束Case語句;如果常量表中沒有一個與表達式值對應的語句,則什么也不做就結束本Case語句。Case語句的另一種應用格式為:Case表達式of情況常量表1:語句1;情況常量表2:語句2;情況常量表n:語句n;else語句n+1end;這種格式的前面部分是相同的,所不同的是:如果常量表中沒有一個與表達式值對應的語句,則執行與else對應的語句,然后結束Case語句。[例2.2I對某產品征收稅金,在產值1萬元以上征收稅5%;在1萬元以下但在5000元以上的征收稅3%;在5000元以下但在1000元以上征收稅2%;1000元以下的免收稅。編程計算該產品的收稅金額。解:設x為產值,tax為稅金,用P表示情況常量各值,以題意中每1000元為情況分界:P=0:tax=0(x<1000)P=l,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的整數值作為P,女課P>10也歸入P=10的情況。Pascal語言用P=trunc(x/1000)取整計算,Pasca!程序:ProgramExam22;Varx,p:integer;Tax:real;BeginWrite('Number=*);readln(x);P:=trunc(x/1000);ifP>9thenP:=10;CasePof0 : tax:=0;1,2,3,4 : tax:=x*0.2;5,6,7,8,9 : tax:=x*0.3;10 : tax:=x*0.5end;Writeln(,tt=,,tt:5:2);ReadlnEnd.情況表達式的計算必須考慮到“全部”情況,不要有遺漏。如果情況常量表的“值”在某范圍內是連續的,可將常量表寫成:nl..n2:語句;因此,上面程序中的情況常量表可以寫成如下程序中表示形式:ProgramExam22_l;Varx,p:integer;tax:real;BeginWrite(*Number=);readln(x);P:=trunc(x/1000);ifP>9thenP:=10;CasePof0 :tax:=0;1..4:tax:=x*0.2; {從1至4作為同一情況處理}5..9:tax:=x*0.3; {從5至9作為同一情況處理}10 :tax:=x*0.5end;Writeln('tt=’,tt:5:2);ReadlnEnd.程序中的trunc(x)為取整函數,是Pascal的算術標準函數之一。Pasca!常用的算術標準函數有19個:abs(x)求x的絕對值(Ixl);exp(x)求ex的值;(e為無理數2.71828…)frac(x)求x的小數部分;(4)int(x)求x的整數部分(不舍入,函數值為實型);ln(x)求以e為底的x的對數(logex);odd(x)判斷x的奇偶數(當x為奇數時odd(x)值為true,否則為false);(7)ord(x)求x的序號,結果為整型(x為有序類型量);pin值(3.1415926535897932…);pred(x)求x(有序類型)的前趨值;succ(x)求x(有序類型)的后繼值;random隨機函數,產生〇~1的隨機值;random(n)產生〇?n的隨機數(n為word類型,先執行randomize,才能得到隨機整數);(13)round(x)求x的四舍五入整數;trunc(x)求x的整數部分(截掉小數部分,結果為整型);sqr(x)求x的平方值(x2);sqrt(x)求x的開平方根值( );sin(x)求x的正弦函數(x為弧度);cox(x)求x的余弦函數(x為弧度);arctan(x)正切的反三角函數(x為數值);習題2.2.運輸公司計算運費時,距離(S)越長,每公里運費越低,標準如下:如果S<250公里;運費為標準運價的100%如果250公里<=S<500公里,運費為標準運價的98%;如果500公里<=SV1000公里,運費為標準運價的95%;如果1000公里<=SV2000公里,運費為標準運價的92%;如果2000公里<=SV3000公里,運費為標準運價的90%;如果S=>3000公里,運費為標準運價的85%;。請編計算運費的程序。.輸入考試成績,如果獲85分以上為A等,獲60分?84分為B等,60分以下為C等,編程輸出考試等級。.某車間按工人加工零件的數量發放獎金,獎金分為五個等級:每月加工零件數N<100者獎金為10元;100<=N<110者獎金為30元;110<=N<120者獎金為50元;120<=N<130者獎金為70元;N>130者為80元。請編程,由鍵盤輸入加工零件數量,顯示應發獎金數。第三章循環程序在編程中經常遇到需要多次規律相同的重復處理,這就是循環問題。TurboPasca!采用不同的循環方式來實現,常用的環循有三種:for>repeat>while.第一節for循環for循環是ー種自動計數型循環。[例3.1]試打印出1?20的自然數。解:①用a代表1?20各數,同時也用a兼作計數,以控制循環次數;②讓a從1開始;③輸出a;④a自動計數(加1),如果未超越所規定的循環范圍則重復步驟③,否則結束循環。Pasca!程序:ProgramExaml2;Vara:byte;Beginfora:=lto20doWritein(a);ReadlnEnd.程序中fora:=1to20doWritein(a);是for循環語句。for循環語句有兩種格式:(l)for循環變量:=初值To終值do語句;(2)for循環變量:二初值downto終值do語句;第⑴種格式的初值小于等于終值,循環變量值按自動加1遞增變化;第(2)種格式的初值大于或等于終值,循環變量值按自動減1遞減變化。for循環是(以遞增1或以遞減!)計數型循環。比如:若將[例3.1]程序改為倒計數(遞減)循環,則輸出2〇?1的自然數數:ProgramExam31;Vara:byte;Beginfora:=20downto1doWriteln(a);ReadlnEnd.[例3.2]打印出30至60的偶數。]解:方法一:①設a表示30至60的所有的數,可用for循環列出;②用式子amod2=0篩選出其中的偶數并輸出。Pasca!程序:Programex32;Vara:integer;BeginFora:=30to60doIf(amod2=0)thenwriteln(a);Readln;End.在這個程序中,for循環后的循環語句是ー個條件分支語句。方法二:我們知道,在式子a=2*n中,若n取自然數1、2、3、…,時,則a依次得到偶數2、4、6、…。因此要想得到30至60的偶數,就可以讓上面式子中的n取15至30的自然數就可以了。所以本題還可以按以下步驟處理:①設n表示15至30的所有自然數,可用for循環列出;②用式子a:=2*n求出其中的偶數;③將結果輸出至屏幕。Pasca!程序:Programex32;BeginForn:=15to30doBegina:=2*n;Writeln(a);End;Readln;End.[例3.3]自然數求和:編ー個程序,求從1至100的自然數的和。解:①令S=0;②令a表示1至100的自然數,用循環列出:③將這些自然數用公式S:=S+a逐一累加到S中去;④循環結束后,S即為1至100的自然數的和,輸出即可。Pasca!程序:Programex33;vars,a:integer;BeginS:=0;Fora:=1to100doS:=S+a;WritelnCS=\S);Readln;End.[例3.4]ー個兩位數x,將它的個位數字與十位數字對調后得到ー個新數y,此時y恰好比x大36,請編程求出所有這樣的兩位數。解:①用for循環列舉出所有的兩位數,x為循環變量;②用公式a:=xdiv10分離出x的十位數字:③用公式b:=xmod10分離出x的個位數字;④用公式y:=b*10+a合成新數y;⑤用式子y-x=36篩選出符合條件的數x并輸出。Pasca!程序:Programex34;BeginForx:=10to99doBegina:=xdiv10;b:=xmod10;y:=b*10+a;ify-x=36thenwriteln(x);End;Readln;End.[例3.5]把整數3025從中剪開分為30和25兩個數,此時再將這兩數之和平方,(30+25-=3025計算結果又等于原數。求所有符合這樣條件的四位數。解:設符合條件的四位數為N,它應當是ー個完全平方數,用(a*a)表示。①為了確保N=(a*a)在四位數(1000-9999)范圍內,可確定a在32?99循環:②計算N=a*a;將四位數N拆分為兩個數nl和n2;③若滿足條件(nl+n2)*(nl+n2)=N就輸出N。Pasca!程序:ProgramExam35;VarN,a,x,nl,n2:Integer;Begin

fora:=32to99dobeginN:=a*a;nl:=Ndiv100; {拆取四位數的前兩位數}n2:=N-nl*100; {拆取四位數的后兩位數}X:=nl+n2;ifx*x=Nthenwritein(N);end;ReadlnEnd.[例3.6]用“*”號打印出如下的長方形圖案。解:①上面給出的圖例共有4行,我們可以用一個循環控制行的變化;②在每行中又有9歹リ,我們可以在前面控制行的循環中再套一個循環來控制列的變化。Pasca!程序:Programex36;{外循環控制行的變{外循環控制行的變化}{內循環控制列的變化}{輸出一行的“*”后換行}Fora:=1to4doBeginForb:=1to9dowrite。*');Writein;End;Readln;End.程序中的循環對于a的每個值都包含著一個b=(l?9)次的內循環。外循環fora將內循環forb包含在里面,稱為for循環的嵌套。嵌套形式如:fora:=n1ton2doforb:=mltom2do循環體語句:[例3.7J打印出九九乘法表:解:設a為被乘數,范圍為1?9;b為乘數,范圍為1?a;乘式為a*b=(ab的乘積),則TOC\o"1-5"\h\za=l: b=l?a 1*1=1a=2: b=l?a 2*1=2 2*2=4a=3: b=l?a 3*1=3 3*2=6 3*3=9a=4:b=l?a4*1=4 4*2=84*3=13 4*4=16a=4:a=9 b=l?a 9*1=9 9*2=18… 9*9=81⑴從上面分解的橫行中看到共有9行,這里的“行”數變化與a的變化從1?9相同,可用a控制“行”的循環;⑵每“行”里面相乘的次數與b的范圍相關,由b控制每“行”里面的“內部”循環:(3)內循環被包含在最里層,執行完每“行”的內部循環,就到下ー“行”去執行新“行”里面的循環,每“行”都擁有形式相同的(b=l?a)內循環。即每到ー“行”都要執行該“行”的內循環。這里所指的“行”可以理解成抽象的行,不一定是實際上具體對應的行,可以是ー個處理“塊”。Pasca!程序:ProgramExam37;Vara,b:byte:Beginfora:=lto9do {外循環}beginforb:=1toado {內循環)write(a,'*',b,'=',a*b,9 ':3);writeinend;ReadlnEnd.根據這種格式還可以實現多層循環嵌套,例如:fora:=nlton2doforb:=mltom2doforc:=kltok2do循環體語句;[例3.8]從七張撲克牌中任取三張,有幾種組合方法?請編程輸出所有組合形式。解:設每次取出三張分別為a,b,c?用三重循環分別從1?7的范圍里取值;為了排除取到重號,用(a-b)*(b-c)*(a-c)<>0進行判斷。Pasca!程序:programExam38;constn=7;vara,b,c,t:integer;Begint:=0;fora:=1tondoforb:=ltondoforc:=ltondoif(a-b)*(b-c)*(a-c)<>0thenBegininc⑴;writein(a:3,b:3,c:3)End;writein(total:,t:5);readlnEnd.[例3.9]數學上把除了1和它本身,沒有別的數能夠整除它的自然數叫做素數(或質數)?,F在由健盤輸入ー個自然數N,編程判斷N是否是素數,是則輸出“Yes”,否則輸出“N?!薄=?根據定義,對于給定的自然數N,只需判斷除1和它本身外,還有沒有第三個自然數即可。①令K從1循環至N;②根據NmodK是否為0可統計K的約數的個數;③若N的約數的個數超過2個,則判定N不是素數。Pasca!程序:ProgramExam39;Varn,m?k,t:integer;Beginwrite(‘N二');ReadLn(N);t:=0;fork:=ltoNdo {外循環}ifNmodk=Othent:=t+1; {如果N是奇數}ift>2thenwriteln('No')elsewriteln('Yes');Readln;End.程序中的變量yse為布爾(或邏輯)類型(Boolean)。布爾值只有兩個:True(真) False(假)布爾值與條件判斷結果為真(條件成立)或為假(條件不成立)的作用相同,常用于條件語句和循環語句中。上面程序中用ifyesand(tmod7=0)thenwritein:實現每行打印七個素數換行,程序中布爾變量yes為真,在邏輯上表示是素數;關系式(tmod7=0)的值為真時,表示該行輸出素數巳是7個;用and將這兩個“條件”連起來是作一種布爾(邏輯)運算。Pasca!共有四種邏輯運算符;①and(與)兩條件都為True時,其結果值為True;否則為False;②or(或)兩條件中只要有一個為True;其結果值為True;否則為False;③xor(異或)兩條件的邏輯值不相同時,其結果值為True;否則為False;④not(非)條件為True時,其結果值為False;否則為True;(取反)習題3.1:.打印出1至20的平方數表。.打印出100至200之間的奇數。.雞兔同籠(用for循環程序完成).ー輛快車和一輛慢車開往同一地點,快車票價為18元,慢車票價為13.5元,共售出400張,共計5940元,求快車票和慢車票各多少張?..求出能被5整除的所有四位數的和。.在下面式子中的ニ個口內填入一個合適的同樣的數字,使等式成立?!?*6528=3ロ*8256.有一個三位數,它的各位數字之和的11倍恰好等于它自身,請編程求出這個三位數。.在自然數中,如果一個三位數等于自身各位數字之立方和,則這個三位數就稱為是水仙花數。如:153=1ゝ53+33,所以153是ー個水仙花數。求所有的水仙花數。.編程序打印出下列圖案:平行四邊形 等腰三解形 菱形.編程打印出如下圖案:1222333334444444555555555.有三種明信片:第一種每套ー張,售價2元;第二種每套ー張,售價4元;第三種每套9張,售價2元。現用100元錢要買100張明信片,要求每種明信片至少要買ー套,問三種明信片應各買幾套?請輸出全部購買方案。.某人想把一元錢換成伍分、貳分、壹分這樣的零錢,在這三種零錢中每種零錢都至少各有一個的情況下,共有多少種兌換方案。并打出這些方案。..輸出100以內的全部素數,要求每行顯示5個。.A、B兩個自然數的和、差、積、商四個數加起來等于243,求ん、B兩數。.百錢買百雞;今有錢100元,要買100只雞,公雞3元一只,母雞1元一只,小雞1元3只,若公雞、母雞和小雞都至少要買1只,請編程求出恰好用完100元錢的所有的買雞方案。第二節repeat循環Repeat循環是直到型循環。試將上一節的例3.1(打印出1~20的平方數表)程序改為repeat循環:ProgramExam31_l;Vara:byte;Begina:=l;writein('a,:8, 1a*a*:8);repeatwritein(a:8,a*a:8);inc(a); {改變a的值}Untila>20;ReadlnEmd.程序中的Repeat循環格式為:repeat循環體語句;until條件表達式; {直到條件為真)Repeat循環首先執行由Repeat和Until括起來的循環體語句,然后檢查Until后面的條件表達式:如果表達式結果為假,則繼續執行循環體,接著繼續檢查Until后面的條件表達式,如此反復執行直到這個表達式結果為真時結束循環。Repeat循環體語句必須有能改變Until后面條件表達式值的語句,并最終使這個條件表達式的值為真,使循環自動結朿。程序中inc(a)指令相當于a:=a+l,常用的同類指令格式如下:inc(x) 等同x:=x+l;inc(x,n)等同x:=x+n;dec(x) 等同x:=x—1;dec(x,n)等同x:=x—n;[例3.10]求兩個自然數M和N的最大公約數。解:若自然數a既是M和約數,又是N的約數,則稱a為M和N的公約數,其中最大的稱為最大公約數。為了求得最大公約數,可以從最大可能的數(如M或N)向下尋找,找到的第一個公約數即是最大公約數。Pasca!程序:Programex310;Begina:=N+1;Repeata:=a-1;Until(Mmoda=0)and(Nmoda=0);writeln(a);Readln;End.[例3.11]校體操隊到操場集合,排成每行2人,最后多出1人;排成每行3人,也多出1人;分別按每行排4,5,6人,都多出1人;當排成每行7人時,正好不多。求校體操隊至少是多少人?解:①設校體操隊為X人,根據題意X應是7的倍數,因此X的初值為7,以后用inc(x,7)改變X值;②為了控制循環,用邏輯變量yes為真(True)使循環結束;③如果諸條件中有一個不滿足,yes的值就會為假(false),就繼續循環。Pasca!程序:programExam311;varx:word;yes:boolean;beginx:=0;repeatyes:=true;inc(x,7);ifxmod2<>1thenyes:=false;ifxmod3<>1thenyes:=false;ifxmod4<>1thenyes:=false;ifxmod5<>1thenyes:=false;ifxmod6<>1thenyes:=false;untilyes; {直到yes的值為真}writeln(,Al!:',x);readlnend.程序中對每個X值,都先給Yes賦真值,只有在循環體各句對X進行判斷時,都得到“通過”(此處不賦假值)才能保持真值。[例3.12]從鍵盤輸入ー個整數X(X不超過10000),若X的各位數字之和為7的倍數,則打印‘'Yes",否則中打印''No”。解:本題考察的是數字分離的方法,由于X的位數不定,所以以往的解法不能奏效,這是介紹ー種取余求商法。(1)用Xmod10分離出X的個位數字;(2)用Xdiv10將剛分離的個數數字刪除,并將結果送回給X;(3)重復(1)(2)直到X=0。Pasca!程序:Programex!2;varx,a,s:integer;begins:=0;repeata:=xmod10;x:=xdiv10;s:=s+a;untilx=0;ifsmod7=0thenwriteln('Yes')elsewriteln('No');Readln;end;[例3.13]求1992個!992的乘積的末兩位數是多少?解:積的個位與十位數只與被乘數與乘數的個位與十位數字有關,所以本題相當于求1992個92相乘,而且本次的乘積主下一次相乘的被乘數,因此也只需取末兩位參與運算就可以了。Pasca!程序:Programex313;vara,t:integer;Begina:=1;t:=0;repeatt:=t+1;a:=(a*92)mod100;untilt=1992;writeln(a);Readln;End.[例3.14]尼科徹斯定理:將任何ー個正整數的立方寫成一組相鄰奇數之和。如:3コ=7+9+11=27 43=13+15+17+19=64解:從舉例中發現:(1)ペ正好等于n個奇數之和;(2)n個奇數中的最小奇數是從1開始的奇數序列中的第m個奇數,與n的關系為:m=n(n—1)/2+!〇(3)奇數序列中第m個奇數的值為x,且x=2m—1,比如:n=3時,m=3(3-1)/2+1=4,

即3個奇數中最小的奇數是奇數序列中的第4個,它的值為x=(2m-l)=7,所以:33=7+9+11。(4)從最小的奇數值x開始,逐個遞增2,蹴n個,用t從1開始計數,直到t=n為止。Pasca!程序:ProgramExam35;Varn?m,x,t,s:Beginwrite('inputn/);m:=(n*(n-l)div2)+ProgramExam35;Varn?m,x,t,s:Beginwrite('inputn/);m:=(n*(n-l)div2)+1;x:=2*m-l;t:=l;write(n'n,'*'integer;readln(n);{輸入N}{找到第m個奇數}{算出第m個奇數的值x,是所求的第一個}n.s:=x;ifn>1thenRepeatinc(x,2);write('+',x);inc(t);inc(s?x);Untilt=n;Writein('=\s);ReadlnEnd.=',x);{輸出第一個}{用S計算和}{計算下一個奇數}{加上下一個奇數}{計個數并累加和){直到n個}[例3.15]猜價格:中央電視臺的“幸運52”欄目深受觀眾喜愛,其中的“猜商品價格”的節目更是膾炙人口,現在請你編?個程序模擬這ー游戲:由計算機隨機產生200至5000之間的ー個整數,作為某件商品的價格,然后由你去猜是多少,若你猜的數大了,則計算機輸出提示“Gao”,若你猜的數小了,則計算機輸出提示“Di”,然后你根據提示繼續猜,直到你猜對了,計算機會提示“Ok”,并統計你猜的總次數。解:本題的游戲規則大家都清楚,要完成程序,必須把處理步驟理清:(1)用隨機函數Random產生200至5000之間的ー個整數X;(2)你猜一個數A;(3)若A>X,則輸出“Gao”;(4)若A<X,則輸出“Di”;(5)若A=X則輸出“Ok”:(6)重復(2)(3)(4)(5)直到A=X。Pasca!程序:Programex315;Vart,X,a :integer;BeginRandomize;X:=Random(4800)+200;t:=0;Repeatt:=t+1;write('「[']Qingcaiyigezhengshu:');readln(a);ifa>xthenwriteln('Gao');ifa<xthenwriteln('Di');ifa=xthenwriteln('Ok');UntilA=X;Readln;End.習題3.2.求兩個自然數M和N的最小公倍數。(如果求三個或更多個數的最小公倍數呢?應如何解決).小會議室里有幾條相同的長凳,有若干人參加開會。如果每條凳子坐6人,結果有一條凳子只坐有3人;如果每條凳子坐5人,就有4人不得不站著。求會議室里有多少人開會,有多少條長凳?.某動物飼養中心用!700元??钯徺I小狗(每只3I元)和小貓(每只21元)兩種小動物。要求專款專用,正好用完,應當如何購買?請輸出所有方案。.某整數X加上100就成為ー個完全平方數,如果讓X加上168就成為另ー個完全平方數。求X?.某次同學聚會,老同學見面個個喜氣洋洋,互相握手問好。參加此次聚會者每人都與老同學握了一次手,共握903次,試求參加聚會的人數?.用自然數300,262,205,167分別除以某整數A,所得到的余數均相同。求出整數A以及相除的余數?.1600年前我國的一部經典數學著作中有題:“今有物,不知其數,三三數之,剩二;五五數之,剩三:七七數之,剩二,問物幾何?!鼻笞钚〗?。.編程求出所有不超過1000的數中,含有數字3的自然數,并統計總數。.阿姆斯特朗數:如果一個正整數等于其各個數字的立方和,則該數稱為阿姆斯特朗數(也稱自戀數),如407=43+0^+73,試編程求出1000以內的所有阿姆斯特朗數。第三節While循環While循環是當型循環。[例3.8]前面第一章[例1.2]的雞兔同籠,頭30,腳90,求雞兔各幾只?在此用下面方法編程求解。解:設雞為J只,兔為T只。已知頭為H,腳為F。①讓雞的只數逐次加1進行遞推計算,初始時J=0;

②計算兔的只數T二H-J;③當總腳數(4*T+2*J)<>F就做(J=J+1,T=H-J);④當4*T+2*尸F時,說明所推算的J和T是正確的,應結束循環,并輸出T,JoPascal程序:ProgramExam38;ConstH=30;F=90;VarJ,T:integer;Begin{初始時讓J從0{初始時讓J從0開始計算}{當條件為真就做do后面的循環體}While4*T+2*JOFdobegininc(J); {遞推改變J值}T:=H-J {計算兔的只數}end;WriteinCT=*,T,>':6,‘J=',J);ReadInEnd.程序中采用While當型循環,While循環語句的格式為:While條件式do語句;其中do后面的“語句”是被重復執行的,稱為循環體;若循環體是多個語句,必須用begin-end包起來成為復合語句。While循環首先判斷條件式,當條件式的值為真就執行do后面的語句(循環體)。While的循環體內也必須包含能改變控制變量取值語句,影響條件式的值,最終使條件式為false(假),才能結束循環。[例3.9]輸入任一的自然數A,B,求A,B的最小公倍數。解:這里采用適合計算機查找的方法:設D是它們的最小公倍數。先找出A,B當中的較大者并存放在A中,將較小者存放在B中,讓?=ん當D能夠整除B時,則D是所求的最小公倍數;當D不能整除B,就逐次地讓D增加A。例如:A=18,B=12,步驟如下:①讓D=A(D=18)②當(DmodB)<>0為真時(D不能整除B)就做D=D+A,重復②;③當(DmodB)<>0為假時結束循環,并輸出D。Pascal程序:programExam39;vara,b,d,t:word;beginwrite(inputa,b: readIn(a,b);ifa<bthenbegint:=a;a:=b;b:=tend;d:=a;whiledmodb<>0do {當條件為真時就做do后面的語句}inc(d,a);writeln(*V,a,',',b,']=',d);readlnEnd.Pascal語言的三種基本循環方式,for循環對循環范圍有明確規定,且循環變量只能是遞增加1或遞減1自動計數控制;而repeat—until循環和while--do循環比較靈活,只要對條件表達式的值能控制滿足?定要求就能組成循環,但在循環體中必須有改變循環變量值的語句,使條件判斷(邏輯值)最終為True或flase,讓循環能夠終止。[例3,10]求自然數A,B的最大公約數。解:采用如下方法步驟:(1)求A除以B的余數;(2)當余數V>0就做n=a;a=b;b=nmodb,重復⑴和(2);(3)當余數二0就結朿循環,并輸出b值。比如a=18,b=12時,處理步驟為:(1) = ,得余數為6;(2)此余數不為零,讓a=12,b=6;(3)重復= ,得余數為0;(4)結束循環,輸出6(余數為零時的b值即是所求的最大公約數)。此方法稱為輾轉相除法求最大公約數。Pascal程序:programExam310;vara,b,n:word;beginwriteCinputa,b:');readln(a,b);writeCC,a,',',b,')=');whileamodb<>0dobeginn:=a;a:=b;b:=nmodb;end;writeln(b);readlnEnd.[例3.11]將一根長為369cm的鋼管截成長為69cm和39cm兩種規格的短料。在這兩種規格的短料至少各截ー根的前提下,如何截才能余料最少。解:設兩種規格的短料分別為:規格為69cm的x根,可在1至(369-39)/69范圍循環取值;規格為39cm的y根,用y=(369-69*X)/39)計算;余料R=369-69*X-39*Y。①設最小余料的初始值min=369;②在X循環范圍內,每ー個X值都計算出對應的丫和R;③如果R<min,就將R存入min,x存入n,y存入m,記錄余料最小時的x和y;④重復步驟②,當x值超出((369—39)/69)時結束循環。Pascal程序:programexam311;varx,y,r,min,n,m,a:integer;beginmin:=369;a:=(369-39)div69;x:=l;whilex<=adobeginy:=(369-69*x)div39;r:=369-69*x-39*y;ifr<minthenbeginmin:=r;n:=x;m:=yend;inc(x);end;writeinCmin=',min,'x=',n,' y=',m);readInend.在有些情況中,三種循環方法可以互相換用。[例3.12]甲、乙、丙三人都是業余射擊愛好者,在ー次練習中他們槍槍中靶:甲射了ハ發子彈,取得225環成績,乙射了七發,也取得225環;丙只射了六發,同樣取得225環。下面是成績表,請編程完成下表中空項的填數。射子彈數中50環有幾發中35環有幾發中25環有幾發成績(環)甲8225乙7225丙6225解:①設N為發射子彈數,只有8,7,6三個數字,正好又可用來代表甲、乙、丙:②設A為中50環的子彈數,最小為〇,最大為(225div50=4);B為中35環的子彈數,最小為〇,最大為(225div35=6);C為中25環的子彈數,C-N-A-B,但必須C>0オ可能正確;③先讓N=8,A取值(〇?4),B取值(〇?6)用循環逐個選定,在C>0的情況下若能

滿足條件A*50+B*35+C*25=225就能確定一組填數。然后選N的下一數值,重復同樣的過程。Pascal程序:programexam312;vara,b,c,n,s:integer;beginwriteinCn:3,'a':3,'b':3,'c':3,'s':5);n:=8;whilen<=6dobegina:=0;whilea<=4dobeginb:=0;whileb<=6dobeginc:=n-a-b;ifc>0thenbegins:=50*a+35*b+25*c;ifs=225thenwritein(n:3,a:3,b:3,c:3,s:5);end;inc(b);end;inc(a);end;dec(n);end;readInend.程序運行結果獲得兩組填數答案。如果改用for循環,程序將更加簡明:ProgramExam312_1ProgramExam312_1;Vara,b,c,n,s:Integer;BeginWritein('N':3,'A':3,'B':3,'C:3,forn:=8downto6dofora:=0to4doforb:=0to6dobeginc:=n-a-b;ifc>0thenbegin'st5);{N取值8,7,6I并分別代表甲、乙、丙}{中50環的可能范圍}{中30環的可能范圍}{計算中25環的子彈數}{如果不是負數}s:=50?a+35*6+25*c; {計算總成績}ifs=225thenwritein(n:3,a:3,b:3,c:3,s:5);endend;readInEnd.習題3.31.求S=1-1/2+1/3-1/4+1/5-1/6+ (求前N項的和).Faibonacci數列前幾項為:0,l,l,2,3,5,8,…,其規律是從第三項起,每項均等于前兩項之和。求前30項,并以每行5個數的格式輸出。.小球從100高處自由落下,著地后又彈回高度的一半再落下。求第20次著地時,小球共通過多少路程?.某登山隊員第一天登上山峰高度的一半又24米;第二天登上余下高度的一半又24米;每天均如此。到第七天,距山頂還剩91米。求此山峰的高度?.給出某整數N,將N寫成因數相乘的形式。如:N=12,輸出:12=1*2*2*3..出售金魚者決定將缸里的金魚全部賣出。第一次賣出全部金魚的一半加二分之一條;第二次賣出剩余的三分之一ー加三分之一條金魚;第三次賣出余下金魚的四分之一加四分之ー條;第四次賣出余下的五分之一加五分之一條金魚。還剩下11條金魚。當然,出售金魚時都是整數條,不能有任何破損。求缸里原有的金魚數?.外出旅游的幾位朋友決定次日早晨共分ー筐蘋果。天剛亮,第一個人醒來,他先拿了一個,再把筐里的八分之一拿走;第二個人醒來,先拿兩個,再把筐里的八分之一拿走;第三個人醒來,先拿三個,再拿走筐里的八分之一;…每個人依次照此方法拿出各人的蘋果,最后筐里的蘋果全部拿完,他們每人所拿到的蘋果數正巧一樣多。求原先筐里的蘋果數和人數。.圖中由6個圓圈構成三角形,每條邊上有三個圈,將自然數1一6不重復地填入各圓圈位置上,使每條邊圓圈上的數字之和相等,請編程輸出所有的填法。.請編程顯示出下面數字金字塔圖形:第四章函數與過程程序中往往需要把主要任務分成若干個子任務,每個子任務只負責ー個專門的基本工作。每個子任務就是ー個獨立的子程序。TurboPascal可以把函數和過程作為子程序調用。第一節函數Pascal允許用戶在程序中自己說明定義所需要的函數并在程序中調用這些函數。[例4.1]編程找出由鍵盤任意輸入五個整數中的最大整數。解:設輸入的五個整數為nl、n2、n3、n4、n5,為了便于處理,引入一個中間變量tl,按如下步驟處理:①令tl=nl;②將tl與n2比較,將兩者中較大的數放入tl;③將tl與n3比較,將兩者中較大的數放入tl;④將tl與n4比較,將兩者中較大的數放入tl;⑤將tl與n5比較,將兩者中較大的數放入tl:⑥經過以上5步處理后,tl即為5個數中最大者。從上面規劃的步驟看來,從步驟②到步驟⑤需處理的目標是相同的,因此我們可以設計一段子程序Max(xl,x2),以找出xl和x2中最大的值并返回。Pascal程序:ProgramExam41a;Varnl,n2,n3,n4,n5,tl:integer;Functionmax(xl,x2:integer):integer;BeginIfxl>x2thenMax:=xlElseMax:=x2;End;BeginWrite(4Input5numbers:');Readln(nl,n2,n3,n4,n5);Tl:=nl;Tl:=Max(t1,n2);Tl:=Max(tl,n3);Tl:=Max(t1,n4);Tl:=Max(tl,n5);Writeln(4Maxnumber:',tl);

End.從上例看出,引入函數實際上是將一個復雜的問題劃分成若干個易于處理的子問題,將編程化簡的一種有效辦法,而化簡的方法是多種多樣的,如前面已經做過求三個數中的最大數,所以可定義ー個專門求三個數中最大數的函數(Max)。第一次用這個函數求出nl,n2,n3三個數中的最大數tl;第二次調用這個函數求出tl與n4,n5三個數中的最大數,也就是前三個數的最大數(已在tl中)和后面二個數再求一次,就得到五個數的最大數。因此,需要兩次使用“求三個數中的最大數”,步驟如下:①調用函數Max(nl,n2,n3),求出nl,n2,n3中的最大者tl;②調用函數Max(tl,n4,n5),求出tl,n4,n5中的最大者t2;③輸出最大數t2。ProgramExam41_b;Varnl,n2,n3,n4,n5,tl:integer;functionMax(xl,x2,x3:integer):integer;VarXX:integer;beginifX1>X2thenXX:=X1elseXX:=X2;ifX3>XXthenXX:=X3;Max:=XXend;BeginWrite(*Input5numb:');Readln(nl,n2,n3,n4,n5);tl:=Max(nl,n2,n3);tl:=Max(n4,n5,tl);Writein('MaxNumber:',tl);ReadIn(自定義函數Max}(自定義函數Max}{函數內部變量說明}{函數體}{主程序){輸入五個數}{用函數求nl,n2,n3的最大數}{用函數求n4,n5,tl的最大數}主程序

溫馨提示

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

評論

0/150

提交評論