中文字幕精品无码一区二区,成全视频在线播放观看方法,大伊人青草狠狠久久,亚洲一区影音先锋色资源

Pascal教程(整理版)

資源下載
  1. 二一教育資源

Pascal教程(整理版)

資源簡介

TOC \o \h \z HYPERLINK \l "_Toc20129722" 第一章 簡單程序 2
HYPERLINK \l "_Toc20129723" 第一節(jié) Pascal 程序結(jié)構(gòu)和基本語句 2
HYPERLINK \l "_Toc20129724" 第二節(jié) 順序結(jié)構(gòu)程序與基本數(shù)據(jù)類型 6
HYPERLINK \l "_Toc20129725" 第二章 分支程序 10
HYPERLINK \l "_Toc20129726" 第一節(jié) 條件語句與復(fù)合語句 10
HYPERLINK \l "_Toc20129727" 第二節(jié) 情況語句與算術(shù)標(biāo)準(zhǔn)函數(shù) 12
HYPERLINK \l "_Toc20129728" 第三章 循環(huán)程序 15
HYPERLINK \l "_Toc20129729" 第一節(jié) for 循環(huán) 15
HYPERLINK \l "_Toc20129730" 第二節(jié) repeat 循環(huán) 21
HYPERLINK \l "_Toc20129731" 第三節(jié) While 循環(huán) 26
HYPERLINK \l "_Toc20129732" 第四章 函數(shù)與過程 31
HYPERLINK \l "_Toc20129733" 第一節(jié) 函數(shù) 31
HYPERLINK \l "_Toc20129734" 第二節(jié) 自定義過程 34
HYPERLINK \l "_Toc20129735" 第五章 Pascal的自定義數(shù)據(jù)類型 39
HYPERLINK \l "_Toc20129736" 第一節(jié) 數(shù)組與子界類型 39
HYPERLINK \l "_Toc20129737" 第二節(jié) 二維數(shù)組與枚舉類型 47
HYPERLINK \l "_Toc20129738" 第三節(jié) 集合類型 55
HYPERLINK \l "_Toc20129739" 第四節(jié) 記錄類型和文件類型 59
HYPERLINK \l "_Toc20129740" 第五節(jié) 指針類型與動態(tài)數(shù)據(jù)結(jié)構(gòu) 66
HYPERLINK \l "_Toc20129741" 第六章 程序設(shè)計與基本算法 72
HYPERLINK \l "_Toc20129742" 第一節(jié) 遞推與遞歸算法 72
HYPERLINK \l "_Toc20129743" 第二節(jié) 回溯算法 79
HYPERLINK \l "_Toc20129744" 第七章 數(shù)據(jù)結(jié)構(gòu)及其應(yīng)用 85
HYPERLINK \l "_Toc20129745" 第一節(jié) 線性表 85
HYPERLINK \l "_Toc20129746" 第二節(jié) 隊列 89
HYPERLINK \l "_Toc20129747" 第三節(jié) 棧 92
HYPERLINK \l "_Toc20129748" 第四節(jié) 數(shù)組 96
HYPERLINK \l "_Toc20129749" 第八章 搜索 99
HYPERLINK \l "_Toc20129750" 第一節(jié) 深度優(yōu)先搜索 99
HYPERLINK \l "_Toc20129751" 第二節(jié) 廣度優(yōu)先搜索 110
HYPERLINK \l "_Toc20129752" 第九章 其他常用知識和算法 114
HYPERLINK \l "_Toc20129753" 第一節(jié) 圖論及其基本算法 114
HYPERLINK \l "_Toc20129754" 第二節(jié) 動態(tài)規(guī)劃 121
第一章 簡單程序
無論做任何事情,都要有一定的方式方法與處理步驟。計算機(jī)程序設(shè)計比日常生活中的事務(wù)處理更具有嚴(yán)謹(jǐn)性、規(guī)范性、可行性。為了使計算機(jī)有效地解決某些問題,須將處理步驟編排好,用計算機(jī)語言組成“序列”,讓計算機(jī)自動識別并執(zhí)行這個用計算機(jī)語言組成的“序列”,完成預(yù)定的任務(wù)。將處理問題的步驟編排好,用計算機(jī)語言組成序列,也就是常說的編寫程序。在Pascal語言中,執(zhí)行每條語句都是由計算機(jī)完成相應(yīng)的操作。編寫Pascal程序,是利用Pascal語句的功能來實(shí)現(xiàn)和達(dá)到預(yù)定的處理要求。“千里之行,始于足下”,我們從簡單程序?qū)W起,逐步了解和掌握怎樣編寫程序。
第一節(jié) Pascal 程序結(jié)構(gòu)和基本語句
在未系統(tǒng)學(xué)習(xí)Pascal語言之前,暫且繞過那些繁瑣的語法規(guī)則細(xì)節(jié),通過下面的簡單例題,可以速成掌握Pascal程序的基本組成和基本語句的用法,讓初學(xué)者直接模仿學(xué)習(xí)編簡單程序。
[例1.1]編程在屏幕上顯示“Hello World!”。
Pascal程序:
Program ex11;
Begin
Writeln(‘Hello World!’);
ReadLn;
End.
這個簡單樣例程序,希望大家的程序設(shè)計學(xué)習(xí)能有一個良好的開端。程序中的Writeln是一個輸出語句,它能命令計算機(jī)在屏幕上輸出相應(yīng)的內(nèi)容,而緊跟Writeln語句后是一對圓括號,其中用單引號引起的部分將被原原本本地顯示出來。
[例1.2]已知一輛自行車的售價是300元,請編程計算a輛自行車的總價是多少?
解:若總售價用m來表示,則這個問題可分為以下幾步處理:
①從鍵盤輸入自行車的數(shù)目a;
②用公式 m=300*a 計算總售價;
③輸出計算結(jié)果。
Pascal程序:
Program Ex12; {程序首部}
Var a,m : integer; {說明部分}
Begin {語句部分}
Write(‘a(chǎn)=’);
ReadLn(a); {輸入自行車數(shù)目}
M := 300*a; {計算總售價}
Writeln(‘M=’,m); {輸出總售價}
ReadLn; {等待輸入回車鍵}
End.
此題程序結(jié)構(gòu)完整,從中可看出一個Pascal 程序由三部分組成:
(1)程序首部
由保留字Program開頭,后面跟一個程序名(如:Exl1);其格式為:
Program 程序名;
程序名由用戶自己取,它的第一個字符必須是英文字母,其后的字符只能是字母或數(shù)字和下劃線組成,程序名中不能出現(xiàn)運(yùn)算符、標(biāo)點(diǎn)符和空格。
(2)說明部分
程序中所用的常量、變量,或類型、及過程與自定義函數(shù),需在使用之前預(yù)先說明,定義數(shù)據(jù)的屬性(類型)。[例1.2] 程序中 Var S,R,C: Real; 是變量說明,此處說明S,R,C三個變量均為實(shí)數(shù)類型變量。只有被說明為某一類型的變量,在程序中才能將與該變量同類型的數(shù)值賦給該變量。變量說明的格式為:
Var 變量表:類型;
(3)語句部分
指由保留字 Begin (開始)至 End. (結(jié)尾)之間的語句系列,是解決問題的具體處理步驟,也是程序的執(zhí)行部分。
Pascal程序不管是哪部分,每句末尾都必須有分號(;),但允許最接近 End 的那個語句末尾的分號省略;程序結(jié)束的End末尾必須有圓點(diǎn)(. ),是整個程序的結(jié)束標(biāo)志。
程序中花括號“{ }”之間的部分為注釋部分。
Pascal程序結(jié)構(gòu)可歸納用如下的示意圖來表示:
Program 程序名; 程序首部
標(biāo)號說明; (Label)
常量說明; (Const) 說明部分
類型說明; (Type)
變量說明; (Var)
過程或函數(shù)說明;
Begin 程序體 (主程序)
語句系列; 語句部分
End.
圖1.1 Pascal程序的結(jié)構(gòu)
把處理問題的步驟編成能從上到下順序執(zhí)行的程序,是簡單程序的基本特征。再來分析下面兩道例題的Pascal程序結(jié)構(gòu)和繼續(xù)學(xué)習(xí)基本語句。
[例1.3]編程計算半徑為R的圓的面積和周長。
解:這是一個簡單問題,按數(shù)學(xué)方法可分以下幾步進(jìn)行處理:
① 從鍵盤輸入半徑的值R; { 要求告訴圓的半徑R }
② 用公式 S=πR2 計算圓面積;
③ 用公式 C=2πR 計算圓周長;
④ 輸出計算結(jié)果。
Pascal程序:
Program Ex13; {程序首部 }
Var R,S,C: Real; {說明部分 }
Begin {語句部分 }
Write ('R= ');
Readln(R); {輸入半徑 }
S:=Pi*R*R; {圓面積公式S=πR2}
C:=2*Pi*R; {圓周長公式C=2πR}
Writeln('S=',S); {輸出結(jié)果 }
Writeln('C=',C);
Readln {等待輸入回車鍵}
End.
程序中Pi是Pascal提供的標(biāo)準(zhǔn)函數(shù),它返回圓周率的近似值:3.1415926…。
(:=)是賦值符號,賦值語句的格式為:
變量:=表達(dá)式;
賦值語句的作用是將:=右邊表達(dá)式的值記錄到左邊的變量中。
Writeln是輸出語句,輸出語句有三種格式:
① Write (輸出項1,輸出項2) ; {執(zhí)行輸出后光標(biāo)不換行}
② Writeln (輸出項1,輸出項2) ; {執(zhí)行輸出后光標(biāo)換到下一行}
③ Writeln {僅輸出空白且光標(biāo)換到下一行}
Writeln語句后面的圓括號以內(nèi)部分均為輸出項,可以是多項,各項間用逗號分隔; 對單引號里的內(nèi)容按照引號內(nèi)的原樣(字符)輸出顯示。如果輸出項是表達(dá)式,則只輸出表達(dá)式的值,而不是表達(dá)式本身。
[例1.4] 輸出兩個自然數(shù)相除的商和余數(shù)。
解:設(shè)被除數(shù)、除數(shù)、商和余數(shù),分別為A,B,C,D,均為變量,且都是整數(shù)類型。題中未給出具體的自然數(shù)A、B,可采用鍵盤輸入方式。
① 給出提示,從鍵盤輸入a, b;
② 顯示兩數(shù)相除的數(shù)學(xué)形式;
③ 求出a除以b的商c;
④ 求出a除以b的余數(shù)d;
⑤ 緊接等式后面輸出顯示商和余數(shù)。
Pascal程序:
Program Ex14;
Var a,b,c,d : integer;
Begin
Write('INPUT A,B:'); {給出提示信息}
Readln(a,b); {輸入a,b}
Writeln; {輸出一空行}
Write(a,'/',b,'='); {輸出等式之后不換行}
c:=a div b; {整除運(yùn)算,取商的整數(shù)部分}
d:=a mod b; {相除求余運(yùn)算,取商的余數(shù)部分}
Writeln(C,'…',d); {輸出后自動換行 }
Readln {等待輸入回車鍵 }
End.
執(zhí)行本程序中第一個Write語句,輸出其引號以內(nèi)的一串提示信息,是給緊接著的輸入語句提供明確的提示(要求),有“一目了然,人機(jī)對話”之效果。
Readln是一個特殊的輸入語句,要求輸入一個回車(換行)才能往下執(zhí)行。
Readln是輸入語句,它的一般格式為:
① Read (變量1,變量2);
② Readln (變量1,變量2);
③ Readln
前兩種格式均要從鍵盤給變量輸入數(shù)據(jù),輸入時,所鍵入的數(shù)據(jù)之間以空格為分隔,以回車為輸入結(jié)束。若多輸入了數(shù)據(jù)(即數(shù)據(jù)個數(shù)超過變量個數(shù)),Read語句讀完數(shù)據(jù)之后,能讓后續(xù)的讀語句接著讀取多下來的數(shù)據(jù);而Readln 語句對本行多輸入的數(shù)據(jù)不能讓后續(xù)語句接著讀取多下來的數(shù)據(jù)。為了防止多輸入的數(shù)據(jù)影響下一個輸入語句讀取數(shù)據(jù),建議盡量使用Readln語句輸入數(shù)據(jù)。第三種格式不需輸入數(shù)據(jù),只需按入一個回車鍵。
[例1.5]自然數(shù)的立方可以表示為兩個整數(shù)的平方之差,比如43=102-62,請輸出自然數(shù)1996的這種表示形式。(這里的43用自乘三次的形式4*4*4表示;102也用自乘二次的形式10*10表示)
解:此題沒有現(xiàn)成的計算公式能直接利用,但可以自行推出處理方法或構(gòu)建適當(dāng)?shù)倪\(yùn)算公式,按著構(gòu)想的處理方案編排出各步驟。
設(shè)這個自然數(shù)為N,兩個平方數(shù)分別為X,Y, 將問題表示為求 N3=X2—Y2
① 先找出X的值,仔細(xì)觀察題中的示例,用數(shù)學(xué)方法歸納可得出X=N*(N+1)/2;(構(gòu)成本題可用的計算公式)
② 再仔細(xì)觀察,發(fā)現(xiàn)Y值比X小一個N值,即 Y=X—N;
③ 輸出等式 N3=X2—Y2 或N*N*N=X*X—Y*Y
Pascal程序:
Program Ex15;
Const N=1996; {常量說明 }
Var X,Y: Longint; {變量說明,此題計算中的數(shù)值較大,用長整型 }
Begin
X:=N*(N+1) div 2; { div 是整除運(yùn)算 }
Y:=X-N;
Writeln(N,'*',N,'*', N,'=', X,'*', X,'—',Y,'*',Y); { 輸出結(jié)果 }
Readln
End.
本程序中N是常量,X,Y是變量,為長整數(shù)類型(Longint); 程序中的div 是整除運(yùn)算,其結(jié)果只取商的整數(shù)部分;
[例1.6] 求一元二次方程x2+3x+2=0的兩個實(shí)數(shù)根。
解:方程的系數(shù)是常量,分別用a,b,c表示,可運(yùn)用數(shù)學(xué)上現(xiàn)成的求根公式求方程的根,采取如下方法:
① 先求出d=b2-4ac;(求根公式中需用開方運(yùn)算的那部分)
② 再用求根公式算出x1,x2的值。(x1,x2 = )
③ 輸出x1,x2.
Pascal程序:
program Ex16;
Const a=1; {常量說明 }
b=3;
c=2; {a,b,c表示方程系數(shù)}
Var d : integer; {d為整型變量}
X1,X2: Real; {X1,X2為實(shí)型變量}
Begin
d:=b*b-4*a*c;
x1:=(-b+sqrt(d))/(2*a); {求方程的根}
x2:=(-b-sqrt(d))/(2*a);
Writeln('X1=',X1,'?':6,'X2=',X2);{輸出結(jié)果}
Readln {等待輸入一個回車鍵}
End.
本程序中的a,b,c均為常量;變量d是整數(shù)類型,而變量x1,x2則是實(shí)數(shù)類型,因?yàn)檫\(yùn)算式中的Sqrt(d)開平方運(yùn)算和(/)除法運(yùn)算使結(jié)果為實(shí)數(shù)。Sqrt( ) 是開平方函數(shù),是Pascal系統(tǒng)的一個標(biāo)準(zhǔn)函數(shù)。
習(xí)題1.1 模仿例題編程
1. 加法計算器:編程由鍵盤輸入兩個整數(shù)a和b,計算出它們的和并輸出到屏幕上。
2. 某梯形的上底、下底和高分別為8,12,9,求該梯形的面積。
( 梯形面積公式為 S=
3. 求右圖所示邊長為5.6 的正立方體表面積。
4. 已知圖園柱體的高為12,底面園的半徑為7,求園柱體表面積。
5. 計算某次考試語文、數(shù)學(xué)、英語和計算機(jī)等四科的總成績與平均成績。
(請用輸入語句從鍵盤輸入各科成績分)
第二節(jié) 順序結(jié)構(gòu)程序與基本數(shù)據(jù)類型
前面的簡單程序已體現(xiàn)出處理問題步驟、思路的順序關(guān)系,這就是順序結(jié)構(gòu)程序。
[例1.7]交換兩個變量的值:由鍵盤輸入兩個正整數(shù)A和B,編程交換這兩個變量的值。
解:交換兩個變量的值,可以想象成交換兩盒錄音帶(稱為A和B)的內(nèi)容,可以按以下步驟處理:
步驟①:拿一盒空白錄音帶C為過渡,先將A翻錄至C;
步驟②:再將B翻錄至A;
步驟③:最后將C翻錄至B。
這樣操作,可達(dá)到題目要求。
Pascal程序:
Program Exam17;
Var a,b,c : integer;
Begin
Write(‘A,B=’);
Readln(a,b);
C:= A; {等價于步驟1}
A := B; {等價于步驟2}
B := C; {等價于步驟3}
Writeln(A,B);
End.
[例1.8] 分錢游戲。甲、乙、丙三人共有24元錢,先由甲分錢給乙、丙兩人,所分給的數(shù)與各人已有數(shù)相同;接著由乙分給甲、丙,分法同前;再由丙分錢給甲、乙,分法亦同前。經(jīng)上述三次分錢之后,每個人的錢數(shù)恰好一樣多。 求原先各人的錢數(shù)分別是多少
解:設(shè)甲、乙、丙三人的錢數(shù)分別為A,B,C。用倒推(逆序)算法, 從最后結(jié)果入手,按反相順序,分步驟推算出每次各人當(dāng)時的錢數(shù):(在每個步驟中,各人錢數(shù)分別存在A、B、C中)
步驟①: A=8 B=8 C=8 {這是最后結(jié)果的錢數(shù),三人都一樣多 }
步驟②: A=A/2 (=4) B=B/2 (=4) C=A+B+C(=16) { A,B未得到丙分給的錢時,只有結(jié)果數(shù)的一半;C應(yīng)包含給A,B及本身數(shù)三者之和 }
步驟③: A=A/2 (=2) C=C/2 (=8) B=A+B+C(=14) {A,C未得到乙分給的錢時,只有巳有數(shù)的一半;B應(yīng)包含給A,C及本身數(shù)三者之和 }
步驟④: B=B/2 (=7) C=C/2 (=4) A=A+B+C(=13)
C未得到甲分給的錢時,只有巳有數(shù)的一半;A應(yīng)包含給B,C及本身數(shù)三者之和 }
步驟⑤: 輸出A(=13)B(=7)C(=4){此時的A,B,C 就是三人原先的錢數(shù) }
Pascal程序:
Program Exam18;
Var a,b,c: integer;
Begin
a:=8; b:=8; c:=8; {對應(yīng)于步驟①}
a:=a div 2; b:=b div 2; c:=a+b+c; {對應(yīng)于步驟②}
a:=a div 2; c:=c div 2; b:=a+b+c; {對應(yīng)于步驟③}
b:=b div 2; c:=c div 2; a:=a+b+c; {對應(yīng)于步驟④}
Writeln('a=',a,' ': 4,'b=',b,' ': 4,'c=',c) ;  {輸出}
Readln
End.
細(xì)心觀察,會發(fā)現(xiàn)本程序語句的順序很關(guān)鍵。此例用反推順序(逆序),按步驟正確推算出各變量的值。當(dāng)然,有的問題可按正序步驟編程,這類程序都稱為順序程序。
本程序Writeln語句的輸出項含有( ' ' : 4 ),這里的冒號用來指定該項顯示所占寬度,此處是輸出4個空格即(空格項占4格)。
[例1.9] 有雞兔同籠,頭30,腳 90,究竟籠中的雞和兔各有多少只
解:設(shè)雞為J只,兔為T只,頭為H,腳為F,則:
J+T=30 ①
2*J+4*T=90 ②
解此題暫不必采用數(shù)學(xué)上直接解方程的辦法,可采用“假設(shè)條件與邏輯推理”的辦法:
假設(shè)籠中30 個頭全都是兔,那么都按每頭4只腳計算,總腳數(shù)為(4*H),與實(shí)際腳數(shù) ( F )之差為(4*H—F),如果這個差=0,則籠中全是兔(即雞為0只);如果這個差值 >0,說明多計算了腳數(shù),凡是雞都多給算了兩只腳,用它除以2就能得到雞的只數(shù),處理步驟為:
① J=(4*H—F)/2 {先用腳數(shù)差值除以2算出雞的只數(shù)}
② T=H—J {再用總頭數(shù)減雞數(shù)算出免的只數(shù)}
按此方法,這兩步運(yùn)算必須注意先后順序才會符合運(yùn)算邏輯。
Pascal程序:
Program Exam16;
Const H=30; {常量說明 }
F=90;
Var J,T: byte; {為字節(jié)類型的整數(shù) }
Begin
J:=(4*H-F) div 2; {整除運(yùn)算 }
T:=H-J
Writeln ('J=',J,' ': 6,'T= ',T ) ;
Readln
End.
本程序中H,F(xiàn)為常量,變量J,T為byte類型,屬于整數(shù)類型。
Pascal定義了五個標(biāo)準(zhǔn)整數(shù)類型,如下表所示:
類型 取值范圍 占字節(jié)數(shù) 格式
Shortint(短整型) -128..127 1 帶符號8位
Integer (整型) -32768..32767 2 帶符號16位
Longint(長整型) -2147483648..2147483647 4 帶符號32位
Byte (字節(jié)型) 0..255 1 無符號8位
Word  (字型) 0..65535 2 無符號16位
在前面程序中常用的數(shù)據(jù)類型除整數(shù)類型,還有實(shí)數(shù)類型。Pascal 還定義了五個標(biāo)準(zhǔn)實(shí)數(shù)類型,列表所示如下:
類型 取值范圍 占字節(jié)數(shù) 有效數(shù)字
Real 2.9×10-39~1.7×1038 6 7~8位
Single 1.5×10-45~3.4×1038 4 11~12位
Double 5.0×10-324~1.7×10308 8 15~16位
Extended 1.9×10-4951~1.1×104932 10 19~20位
Comp -263+1~238-1 8 19~20位
在Turbo Pascal 中實(shí)數(shù)的表示用科學(xué)記數(shù)法,可認(rèn)為由三部分組成:
# . ## E +## 或 # . ## E -##
① #.##表示有效數(shù)字; ② E表示以10為底的冪; ③ +##或-##是指數(shù)部分,+號可省略。
例如: 1.7E+38 可寫成1.7E38 (等同于1. 7×1038 )。
在實(shí)數(shù)類型定義下,即使是整數(shù),在程序執(zhí)行時系統(tǒng)也將自動轉(zhuǎn)換成科學(xué)記數(shù)形式,試請運(yùn)行下面程序并注意觀察運(yùn)行結(jié)果:
Program Exam17;
Var x: real; {x為實(shí)數(shù)類型 }
Begin
X:=180; {把整數(shù)180賦給實(shí)數(shù)類型變量X}
Writeln ('x=',x) ;     {輸出的x自動表示成實(shí)數(shù)形式 }
Readln
End.
習(xí)題1. 2
1.已知△ABC中的三邊長分別為25.76,74.03,59.31,求△ABC的面積。
( 計算公式: S= 。 其中P = )
2.某車棚存有自行車和三輪車共65輛,它們的輪子數(shù)合計為150個。求該棚內(nèi)存有的自行車和三輪車各是多少輛?
3.甲、乙、丙三人分別有磁帶36,48,64盒。先由甲把自己的磁帶平均分為三份,分給乙、丙各一份,自己留下一份;接著是乙,最后是丙,都按甲的方法處理。編程輸出甲、乙、丙在上述過程中各人的磁帶數(shù)分別是多少 (輸出所有的中間結(jié)果)
4.五位好朋友相聚。第一位朋友帶來了很多糖塊贈送給各位朋友,使每人的糖塊在各自原有的基礎(chǔ)上翻了一倍;接著第二位好友也同樣向每人贈送糖塊,他同樣使每人的糖塊在各人已有的數(shù)量上翻了一倍;第三、第四、第五位好友都照此辦理。經(jīng)過這樣的贈送之后,每人的糖塊恰好都為32塊。問各位好友原先的糖塊數(shù)分別是多少
第二章 分支程序
在程序設(shè)計中,許多問題是在一定條件下才選擇某種處理方式的,這就需要用條件判斷語句或情況選擇語句進(jìn)行處理。程序執(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程序:
Program Exam21;
Var x,y: integer;
Begin
Write('X=') ;Readln(x) ; { 輸入X}
if x >100 then y:=50*X else y:=80*X; {條件判斷與選擇 }
Writeln('y=',y) ;
Readln
End.
程序中的 if 語句常稱為條件語句,它的一般格式為:
(1) if 條件 then 語句;
(2) if 條件 then 語句1 else 語句2;
IF 語句的功能是按條件在兩種可能中選擇其中一種。習(xí)慣上把if 后面的表達(dá)式稱為條件,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程序:
Progranm Exam22;
Var a,b,c,t: Real;
Begin
Write('Input a, b,c=');
Readln(a,b,c);
if a>b then
begin {復(fù)合語句}
t:=a; a:=b; b:=t {交換a,b}
end;
if a>c then
begin {復(fù)合語句}
t:=a; a:=c; c:=t {交換a,c}
end;
if b>c then
begin {復(fù)合語句}
t:=b; b:=c; c:=t {交換b,c}
end;
Writeln('a,b,c:',a:6, b:6, c:6);
Readln
End.
if 語句規(guī)定它的真項或假項位置上只能是一個基本語句,如果需要寫一組語句,就應(yīng)當(dāng)使用復(fù)合語句。本程序中有三處用到復(fù)合語句。每個復(fù)合語句的范圍是從Begin開始到與它相對應(yīng)的End為止。復(fù)合語句的地位和一個基本語句相同;其一般格式為:
Begin
語句系列
End;
習(xí)題2. 1
1.假設(shè)郵局規(guī)定寄郵件時若每件重量在1公斤以內(nèi)(含1公斤),按每公斤1.5元計算郵費(fèi),如果超過1公斤時,其超出部分每公斤加收0.8元。請編程序計算郵件收費(fèi)。
2.輸入三個正整數(shù),若能用這三個數(shù)作為邊長組成三角形,就計算并輸出該三角形的面積,否則輸出Can't。(組成三角形的條件為:任意兩邊之和大于第三邊)
3.輸入一個三位數(shù)的整數(shù),將數(shù)字位置重新排列,組成一個盡可大的三位數(shù)。例如:輸入213,重新排列可得到盡可能大的三位數(shù)是321。
第二節(jié) 情況語句與算術(shù)標(biāo)準(zhǔn)函數(shù)
如果有多種(兩種或兩種以上)選擇,常用情況語句編程。
將前面[例2.1]改成用如下方法來處理。根據(jù)題意,付款計算可分為兩種情況:
① Y=50*X (X>100)
② Y=80*X (X<=100)
顯然,情況①與②的選擇取決于X值。假設(shè)用N表示“情況值”,暫且先讓N=2;
如果X>100則N=1;(此題中N的值只是1或2,且取決于X值)
Pascal 程序:
Program Exam21_1;
Var X,Y,N: integer;
Begin
Write('X=') ;readln(x) ; n:=2; { 先讓n=2 }
if X>100 then n:=1; {如果X>100則 n=1 }
Case n of { 關(guān)于情況處理 }
1: Y:=50*X;
2: Y:=80*X;
end;
Writeln('Y=',Y) ;
Readln
End.
程序中的 Case─end 語句為情況語句,是多路分支控制,一般格式為:
Case 表達(dá)式 of
情況常量表1: 語句1;
情況常量表2: 語句2;
: :
情況常量表n: 語句n
end;
執(zhí)行情況語句時,先計算Case后面表達(dá)式的值,然后根據(jù)該值在情況常量表中的“對應(yīng)安排”,選擇其對應(yīng)的語句執(zhí)行,執(zhí)行完所選擇語句后就結(jié)束Case語句;如果常量表中沒有一個與表達(dá)式值對應(yīng)的語句,則什么也不做就結(jié)束本Case語句。
Case 語句的另一種應(yīng)用格式為:
Case 表達(dá)式 of
情況常量表1: 語句1;
情況常量表2: 語句2;
: :
情況常量表n: 語句n;
else 語句 n+1
end;
這種格式的前面部分是相同的,所不同的是:如果常量表中沒有一個與表達(dá)式值對應(yīng)的語句,則執(zhí)行與else對應(yīng)的語句,然后結(jié)束Case語句。
[例2.2] 對某產(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 (5000P=10: tax=x*0.05 (x> 10000 )
這里的P是“情況”值,用產(chǎn)值x除以1000的整數(shù)值作為P,如果P>10也歸入P=10的情況。Pascal語言用P=trunc(x/1000)取整計算,
Pascal程序:
Program Exam22;
Var x,p : integer;
Tax : real;
Begin
Write('Number=') ; readln(x) ;
P:=trunc(x/1000) ;
if P>9 then P:=10;
Case P of
0 : tax:=0;
1,2,3,4 : tax:=x*0.2;
5,6,7,8,9 : tax:=x*0.3;
10 : tax:=x*0.5
end;
Writeln('tt=',tt:5:2) ;
Readln
End.
情況表達(dá)式的計算必須考慮到“全部”情況,不要有遺漏。如果情況常量表的“值”在某范圍內(nèi)是連續(xù)的,可將常量表寫成:
n1.. n2:語句;
因此,上面程序中的情況常量表可以寫成如下程序中表示形式:
Program Exam22_1;
Var x,p: integer;
tax: real;
Begin
Write('Number=') ; readln(x) ;
P:=trunc(x/1000) ;
if P>9 then P:=10;
Case P of
0 : tax:=0;
1..4 : tax:=x*0.2; { 從1至4作為同一情況處理 }
5..9 : tax:=x*0.3; { 從5至9作為同一情況處理 }
10 : tax:=x*0.5
end;
Writeln('tt=',tt:5:2) ;
Readln
End.
程序中的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ù)值為實(shí)型);
(5) ln(x) 求以e為底的x的對數(shù)(log ex );
(6) odd(x) 判斷x的奇偶數(shù)(當(dāng)x為奇數(shù)時odd(x)值為true,否則為false);
(7) ord(x) 求x的序號,結(jié)果為整型(x為有序類型量);
(8) pi π值(3.1415926535897932…);
(9) pred (x) 求x(有序類型)的前趨值;
(10) succ(x) 求x(有序類型)的后繼值;
(11) random 隨機(jī)函數(shù),產(chǎn)生0~1的隨機(jī)值;
(12) random(n)產(chǎn)生0~n的隨機(jī)數(shù)(n為word類型,先執(zhí)行randomize, 才能得到隨機(jī)整數(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ù)值);
習(xí)題2.2
1.運(yùn)輸公司計算運(yùn)費(fèi)時,距離(S)越長,每公里運(yùn)費(fèi)越低,標(biāo)準(zhǔn)如下:
如果S<250公里;運(yùn)費(fèi)為標(biāo)準(zhǔn)運(yùn)價的100%
如果250公里<=S<500公里,運(yùn)費(fèi)為標(biāo)準(zhǔn)運(yùn)價的98%;
如果500公里<=S<1000公里,運(yùn)費(fèi)為標(biāo)準(zhǔn)運(yùn)價的95%;
如果1000公里<=S<2000公里,運(yùn)費(fèi)為標(biāo)準(zhǔn)運(yùn)價的92%;
如果2000公里<=S<3000公里,運(yùn)費(fèi)為標(biāo)準(zhǔn)運(yùn)價的90%;
如果S=>3000公里,運(yùn)費(fèi)為標(biāo)準(zhǔn)運(yùn)價的85%;。請編計算運(yùn)費(fèi)的程序。
2. 輸入考試成績,如果獲85分以上為 A等,獲60分~84分為B等,60分以下為C等,編程輸出考試等級。
3. 某車間按工人加工零件的數(shù)量發(fā)放獎金,獎金分為五個等級:每月加工零件數(shù)N < 100者獎金為10元;100 < = N < 110者獎金為30元;110 < = N <120 者獎金為50元;120 < = N <130 者獎金為70元;N > 130者為80元。
請編程,由鍵盤輸入加工零件數(shù)量,顯示應(yīng)發(fā)獎金數(shù)。
第三章 循環(huán)程序
在編程中經(jīng)常遇到需要多次規(guī)律相同的重復(fù)處理,這就是循環(huán)問題。Turbo Pascal采用不同的循環(huán)方式來實(shí)現(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程序:
Program Exam12;
Var a: byte;
Begin
for a:=1 to 20 do
Writeln (a);
Readln
End.
程序中 for a:=1 to 20 do Writeln (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ù):
Program Exam31;
Var a: byte;
Begin
for a:=20 downto 1 do
Writeln(a) ;
Readln
End.
[例3.2]打印出30至60的偶數(shù)。]
解:
方法一:
①設(shè)a表示30至60的所有的數(shù),可用for循環(huán)列出;
②用式子 a mod 2=0 篩選出其中的偶數(shù)并輸出。
Pascal程序:
Program ex32;
Var a : integer;
Begin
For a := 30 to 60 do
If (a mod 2=0) then writeln(a);
Readln;
End.
在這個程序中,for循環(huán)后的循環(huán)語句是一個條件分支語句。
方法二:我們知道,在式子a=2*n中,若n取自然數(shù)1、2、3、…,時,則a依次得到偶數(shù)2、4、6、…。因此要想得到30至60的偶數(shù),就可以讓上面式子中的n取15至30的自然數(shù)就可以了。所以本題還可以按以下步驟處理:
①設(shè)n表示15至30的所有自然數(shù),可用for循環(huán)列出;
②用式子 a := 2*n 求出其中的偶數(shù);
③將結(jié)果輸出至屏幕。
Pascal程序:
Program ex32;
Begin
For n := 15 to 30 do
Begin
a := 2*n;
Writeln(a);
End;
Readln;
End.
[例3.3]自然數(shù)求和:編一個程序,求從1至100的自然數(shù)的和。
解:① 令S=0;
② 令a表示1至100的自然數(shù),用循環(huán)列出;
③ 將這些自然數(shù)用公式S:=S+a 逐一累加到S中去;
④ 循環(huán)結(jié)束后,S即為1至100的自然數(shù)的和,輸出即可。
Pascal程序:
Program ex33;
var s,a : integer;
Begin
S := 0;
For a := 1 to 100 do
S := 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:= x div 10分離出x的十位數(shù)字;
③ 用公式b:= x mod 10分離出x的個位數(shù)字;
④ 用公式y(tǒng):= b*10+a合成新數(shù)y;
⑤ 用式子y-x=36篩選出符合條件的數(shù)x并輸出。
Pascal程序:
Program ex34;
Begin
For x := 10 to 99 do
Begin
a := x div 10;
b := x mod 10;
y := b*10+a;
if y-x=36 then writeln(x);
End;
Readln;
End.
[例3.5] 把整數(shù)3025從中剪開分為30和25兩個數(shù),此時再將這兩數(shù)之和平方,(30+25)2=3025計算結(jié)果又等于原數(shù)。求所有符合這樣條件的四位數(shù)。
解:設(shè)符合條件的四位數(shù)為N,它應(yīng)當(dāng)是一個完全平方數(shù),用(a*a)表示。
① 為了確保N=(a*a)在四位數(shù)(1000~9999)范圍內(nèi),可確定a在32~99循環(huán);
② 計算N=a*a;將四位數(shù)N拆分為兩個數(shù)n1和n2;
③ 若滿足條件(n1+n2)*(n1+n2)=N 就輸出 N 。
Pascal程序:
Program Exam35;
Var N,a, x,n1,n2: Integer;
Begin
for a:=32 to 99 do
begin
N:=a*a;
n1:= N div 100; {拆取四位數(shù)的前兩位數(shù)}
n2:= N-n1*100; {拆取四位數(shù)的后兩位數(shù)}
X:=n1+n2;
if x*x=N then writeln (N);
end;
Readln
End.
[例3.6]用“*”號打印出如下的長方形圖案。
  *********
*********
*********
*********
解:① 上面給出的圖例共有4行,我們可以用一個循環(huán)控制行的變化;
② 在每行中又有9列,我們可以在前面控制行的循環(huán)中再套一個循環(huán)來控制列的變化。
Pascal程序:
Program ex36;
Begin
For a := 1 to 4 do {外循環(huán)控制行的變化}
Begin
For b := 1 to 9 do {內(nèi)循環(huán)控制列的變化}
write(‘*’);
Writeln; {輸出一行的“*”后換行}
End;
Readln;
End.
程序中的循環(huán)對于a的每個值都包含著一個b=(1~9)次的內(nèi)循環(huán)。外循環(huán)for a 將內(nèi)循環(huán)for b 包含在里面,稱為for循環(huán)的嵌套。嵌套形式如:
for a:=n1 to n2 do
for b:=m1 to m2 do 循環(huán)體語句;
[例3.7] 打印出九九乘法表:
解:設(shè)a為被乘數(shù),范圍為1~9;b為乘數(shù),范圍為1~a;乘式為a*b=(a,b的乘積),則
a=1: b=1~a 1*1=1
a=2: b=1~a 2*1=2 2*2=4
a=3: b=1~a 3*1=3 3*2=6 3*3=9
a=4: b=1~a 4*1=4 4*2=8 4*3=13 4*4=16
: :
a=9 b=1~a 9*1=9 9*2=18 … 9*9=81
⑴從上面分解的橫行中看到共有9行,這里的“行”數(shù)變化與a的變化從1~9相同,可用a控制“行”的循環(huán);
⑵每“行”里面相乘的次數(shù)與b的范圍相關(guān),由b控制每“行”里面的“內(nèi)部”循環(huán);
⑶內(nèi)循環(huán)被包含在最里層,執(zhí)行完每“行”的內(nèi)部循環(huán),就到下一“行”去執(zhí)行新“行”里面的循環(huán),每“行”都擁有形式相同的( b=1~a )內(nèi)循環(huán)。
即每到一“行”都要執(zhí)行該“行”的內(nèi)循環(huán)。這里所指的“行”可以理解成抽象的行,不一定是實(shí)際上具體對應(yīng)的行,可以是一個處理“塊”。
Pascal程序:
Program Exam37;
Var a,b: byte;
Begin
for a:=1 to 9 do {外循環(huán) }
begin
for b:=1 to a do {內(nèi)循環(huán) }
write(a,’* ’,b,’= ’,a*b,’ ’:3);
writeln
end;
Readln
End.
根據(jù)這種格式還可以實(shí)現(xiàn)多層循環(huán)嵌套,例如:
for a:=n1 to n2 do
for b:=m1 to m2 do
for c:=k1 to k2 do 循環(huán)體語句;
[例3.8]從七張撲克牌中任取三張,有幾種組合方法?請編程輸出所有組合形式。
解:設(shè)每次取出三張分別為a,b,c。用三重循環(huán)分別從1~7的范圍里取值;為了排除取到重號,用(a-b)*(b-c)*(a-c) < >0進(jìn)行判斷。
Pascal程序:
program Exam38;
const n=7;
var a,b,c,t: integer;
Begin
t:=0;
for a:=1 to n do
for b:=1 to n do
for c:=1 to n do
if (a-b) * (b-c) * (a-c) < >0 then
Begin
inc (t);
writeln (a:3, b:3, c:3)
End;
writeln ( total:, t :5);
readln
End.
[例3.9] 數(shù)學(xué)上把除了1和它本身,沒有別的數(shù)能夠整除它的自然數(shù)叫做素數(shù)(或質(zhì)數(shù))。現(xiàn)在由鍵盤輸入一個自然數(shù)N,編程判斷N是否是素數(shù),是則輸出“Yes”,否則輸出“No”。
解:根據(jù)定義,對于給定的自然數(shù)N,只需判斷除1和它本身外,還有沒有第三個自然數(shù)即可。
① 令K從1循環(huán)至N;
② 根據(jù)N mod K是否為0可統(tǒng)計K的約數(shù)的個數(shù);
③ 若N的約數(shù)的個數(shù)超過2個,則判定N不是素數(shù)。
Pascal程序:
Program Exam39;
Var n,m,k,t: integer;
Begin
write(‘N=’);
ReadLn(N);
t:=0;
for k:=1 to N do {外循環(huán) }
if N mod k=0 then t := t+1; {如果N是奇數(shù) }
if t>2 then writeln(‘No’)
else writeln(‘Yes’);
Readln;
End.
程序中的變量yse為布爾(或邏輯)類型(Boolean)。布爾值只有兩個:
True(真) False(假)
布爾值與條件判斷結(jié)果為真(條件成立)或?yàn)榧?條件不成立)的作用相同,常用于條件語句和循環(huán)語句中。
上面程序中用 if yes and (t mod 7=0) then writeln;實(shí)現(xiàn)每行打印七個素數(shù)換行,程序中布爾變量yes為真,在邏輯上表示是素數(shù);關(guān)系式(t mod 7=0) 的值為真時,表示該行輸出素數(shù)巳是7個;用and將這兩個“條件”連起來是作一種布爾(邏輯)運(yùn)算。
Pascal 共有四種邏輯運(yùn)算符:
① and (與) 兩條件都為True時,其結(jié)果值為True;否則為False;
② or (或) 兩條件中只要有一個為True ;其結(jié)果值為True;否則為False;
③ xor (異或) 兩條件的邏輯值不相同時,其結(jié)果值為True;否則為False;
④ not (非) 條件為True時,其結(jié)果值為False;否則為True;(取反)
習(xí)題3.1:
1.打印出1至20的平方數(shù)表。
2.打印出100至200之間的奇數(shù)。
3. 雞兔同籠(用for循環(huán)程序完成)
4.一輛快車和一輛慢車開往同一地點(diǎn),快車票價為18元,慢車票價為13. 5元,共售出400張,共計5940元,求快車票和慢車票各多少張 .
5.求出能被5整除的所有四位數(shù)的和。
6.在下面式子中的二個□內(nèi)填入一個合適的同樣的數(shù)字,使等式成立。
□3*6528=3□*8256
7.有一個三位數(shù),它的各位數(shù)字之和的11倍恰好等于它自身,請編程求出這個三位數(shù)。
8.在自然數(shù)中,如果一個三位數(shù)等于自身各位數(shù)字之立方和,則這個三位數(shù)就稱為是水仙花數(shù)。如:153=13+53+33,所以153是一個水仙花數(shù)。求所有的水仙花數(shù)。
9.編程序打印出下列圖案:
平行四邊形 等腰三解形      菱形
  ****** *   *
****** *** ***
****** ***** *****
****** ******* ***
****** ********* *
10.編程打印出如下圖案:
1
222
33333
4444444
555555555
11.有三種明信片:第一種每套一張,售價2元;第二種每套一張,售價4元; 第三種每套9張,售價2元。現(xiàn)用100元錢要買100張明信片,要求每種明信片至少要買一套,問三種明信片應(yīng)各買幾套?請輸出全部購買方案。
12.某人想把一元錢換成伍分、貳分、壹分這樣的零錢, 在這三種零錢中每種零錢都至少各有一個的情況下,共有多少種兌換方案。并打出這些方案。
14. 輸出100 以內(nèi)的全部素數(shù),要求每行顯示5 個。
15.A、B兩個自然數(shù)的和、差、積、商四個數(shù)加起來等于243,求A、B兩數(shù)。
16.百錢買百雞:今有錢100元,要買100只雞,公雞3元一只,母雞1元一只,小雞1元3只,若公雞、母雞和小雞都至少要買1只,請編程求出恰好用完100元錢的所有的買雞方案。
第二節(jié) repeat 循環(huán)
Repeat循環(huán)是直到型循環(huán)。
試將上一節(jié)的例3.1(打印出1~20的平方數(shù)表)程序改為 repeat 循環(huán):
Program Exam31_1;
Var a: byte;
Begin
a:=1; writeln ( ' a ' : 8 , ' a*a ' : 8 ) ;
repeat
writeln ( a :8,a*a : 8);
inc(a); {改變a的值 }
Until a>20;
Readln
End.
程序中的Repeat循環(huán)格式為:
repeat
循環(huán)體語句;
until 條件表達(dá)式; {直到條件為真}
Repeat循環(huán)首先執(zhí)行由Repeat和Until括起來的循環(huán)體語句,然后檢查Until后面的條件表達(dá)式:如果表達(dá)式結(jié)果為假,則繼續(xù)執(zhí)行循環(huán)體,接著繼續(xù)檢查Until后面的條件表達(dá)式,如此反復(fù)執(zhí)行直到這個表達(dá)式結(jié)果為真時結(jié)束循環(huán)。Repeat循環(huán)體語句必須有能改變Until后面條件表達(dá)式值的語句,并最終使這個條件表達(dá)式的值為真,使循環(huán)自動結(jié)束。
程序中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;
[例3.10]求兩個自然數(shù)M和N的最大公約數(shù)。
解:若自然數(shù)a既是M和約數(shù),又是N的約數(shù),則稱a為M和N的公約數(shù),其中最大的稱為最大公約數(shù)。為了求得最大公約數(shù),可以從最大可能的數(shù)(如M或N)向下尋找,找到的第一個公約數(shù)即是最大公約數(shù)。
Pascal程序:
Program ex310;
Begin
a := N+1;
Repeat
a := a-1;
Until (M mod a=0) and (N mod a=0);
writeln(a);
Readln;
End.
[例3.11]校體操隊到操場集合,排成每行2人,最后多出1人;排成每行3人,也多出1人;分別按每行排4,5,6人,都多出1人;當(dāng)排成每行7人時,正好不多。求校體操隊至少是多少人
解:①設(shè)校體操隊為X人,根據(jù)題意X應(yīng)是7的倍數(shù),因此X的初值為7,以后用inc(x,7)改變X值;
②為了控制循環(huán), 用邏輯變量yes為真(True) 使循環(huán)結(jié)束;
③如果諸條件中有一個不滿足, yes 的值就會為假(false),就繼續(xù)循環(huán)。
Pascal程序:
program Exam311;
var x: word; yes : boolean;
begin
x:=0;
repeat
yes :=true; inc(x,7);
if x mod 2 < > 1 then yes:=false;
if x mod 3 < > 1 then yes:=false;
if x mod 4 < > 1 then yes:=false;
if x mod 5 < > 1 then yes:=false;
if x mod 6 < > 1 then yes:=false;
until yes; {直到y(tǒng)es的值為真 }
writeln('All =', x) ; readln
end.
程序中對每個X值,都先給Yes 賦真值,只有在循環(huán)體各句對X進(jìn)行判斷時,都得到“通過”(此處不賦假值)才能保持真值。
[例3.12]從鍵盤輸入一個整數(shù)X(X不超過10000),若X的各位數(shù)字之和為7的倍數(shù),則打印“Yes”,否則中打印“No”。
解:本題考察的是數(shù)字分離的方法,由于X的位數(shù)不定,所以以往的解法不能奏效,這是介紹一種取余求商法。
(1)用X mod 10分離出X的個位數(shù)字;
(2)用X div 10將剛分離的個數(shù)數(shù)字刪除,并將結(jié)果送回給X;
(3)重復(fù)(1)(2)直到X=0。
Pascal程序:
Program ex12;
var x,a,s : integer;
begin
s := 0;
repeat
a := x mod 10;
x := x div 10;
s := s+a;
until x=0;
if s mod 7=0 then writeln(‘Yes’)
else writeln(‘No’);
Readln;
end;
[例3.13]求1992個1992的乘積的末兩位數(shù)是多少?
解:積的個位與十位數(shù)只與被乘數(shù)與乘數(shù)的個位與十位數(shù)字有關(guān),所以本題相當(dāng)于求1992個92相乘,而且本次的乘積為下一次相乘的被乘數(shù),因此也只需取末兩位參與運(yùn)算就可以了。
Pascal程序:
Program ex313;
var a,t : integer;
Begin
a := 1;
t := 0;
repeat
t := t+1;
a := (a*92) mod 100;
until t=1992;
writeln(a);
Readln;
End.
[例3.14]尼科徹斯定理:將任何一個正整數(shù)的立方寫成一組相鄰奇數(shù)之和。
如: 33=7+9+11=27 43=13+15+17+19=64
解:從舉例中發(fā)現(xiàn):
(1) n3正好等于n個奇數(shù)之和;
(2) n個奇數(shù)中的最小奇數(shù)是從1開始的奇數(shù)序列中的第m個奇數(shù),與 n 的關(guān)系為: m=n (n —1) / 2+1。
(3) 奇數(shù)序列中第m個奇數(shù)的值為x,且 x= 2m—1,比如: n=3時,m=3(3-1)/2+1=4,即3個奇數(shù)中最小的奇數(shù)是奇數(shù)序列中的第4個,它的值為x=(2m-1)=7, 所以:33=7+9+11。
(4) 從最小的奇數(shù)值x開始,逐個遞增2,連續(xù)n個,用t從1開始計數(shù),直到t=n為止。
Pascal程序:
Program Exam35;
Var n,m,x,t,s : integer;
Begin
write(’input n:’); readln(n); {輸入N }
m:=(n*(n-1) div 2)+1; {找到第m個奇數(shù) }
x:=2*m-1; t:=1; {算出第m個奇數(shù)的值x,是所求的第一個}
write(n’*’,n,’*’,n,’=’,x);{輸出第一個}
s:=x; {用S計算和 }
if n>1 then
Repeat
inc(x,2); { 計算下一個奇數(shù) }
write (’+ ’,x) ; {加上下一個奇數(shù) }
inc (t ); inc (s,x); { 計個數(shù)并累加和 }
Until t=n; {直到n個 }
Writeln (’= ’,s ) ;
Readln
End.
[例3.15]猜價格:中央電視臺的“幸運(yùn)52”欄目深受觀眾喜愛,其中的“猜商品價格”的節(jié)目更是膾炙人口,現(xiàn)在請你編一個程序模擬這一游戲:由計算機(jī)隨機(jī)產(chǎn)生200至5000之間的一個整數(shù),作為某件商品的價格,然后由你去猜是多少,若你猜的數(shù)大了,則計算機(jī)輸出提示“Gao”,若你猜的數(shù)小了,則計算機(jī)輸出提示“Di”,然后你根據(jù)提示繼續(xù)猜,直到你猜對了,計算機(jī)會提示“Ok”,并統(tǒng)計你猜的總次數(shù)。
解:本題的游戲規(guī)則大家都清楚,要完成程序,必須把處理步驟理清:
  (1)用隨機(jī)函數(shù)Random產(chǎn)生200至5000之間的一個整數(shù)X;
(2)你猜一個數(shù)A;
(3)若A>X,則輸出“Gao”;
(4)若A<X,則輸出“Di”;
(5)若A=X則輸出“Ok”;
(6)重復(fù)(2)(3)(4)(5)直到A=X。
Pascal程序:
Program ex315;
Var t,X,a : integer;
Begin
Randomize;
X := Random(4800)+200;
t := 0;
Repeat
t := t+1;
write(‘[‘,t,’] Qing cai yi ge zheng shu : ‘);
readln(a);
if a>x then writeln(‘Gao’);
if aif a=x then writeln(‘Ok’);
Until A=X;
Readln;
End.
習(xí)題3.2
1.求兩個自然數(shù)M和N的最小公倍數(shù)。(如果求三個或更多個數(shù)的最小公倍數(shù)呢?應(yīng)如何解決)
2.小會議室里有幾條相同的長凳,有若干人參加開會。如果每條凳子坐6人,結(jié)果有一條凳子只坐有3人;如果每條凳子坐5人,就有4人不得不站著。求會議室里有多少人開會,有多少條長凳
3.某動物飼養(yǎng)中心用1700元專款購買小狗(每只31元)和小貓(每只21元)兩種小動物。要求專款專用,正好用完, 應(yīng)當(dāng)如何購買 請輸出所有方案。
4.某整數(shù)X加上100就成為一個完全平方數(shù),如果讓X加上168 就成為另一個完全平方數(shù)。求X
5.某次同學(xué)聚會,老同學(xué)見面?zhèn)€個喜氣洋洋,互相握手問好。參加此次聚會者每人都與老同學(xué)握了一次手,共握903次,試求參加聚會的人數(shù)?
6.用自然數(shù)300,262,205,167分別除以某整數(shù)A,所得到的余數(shù)均相同。求出整數(shù)A以及相除的余數(shù)?
7.1600年前我國的一部經(jīng)典數(shù)學(xué)著作中有題:“今有物,不知其數(shù),三三數(shù)之,剩二;五五數(shù)之,剩三;七七數(shù)之,剩二,問物幾何。”求最小解。
8.編程求出所有不超過1000的數(shù)中,含有數(shù)字3的自然數(shù),并統(tǒng)計總數(shù)。
9.阿姆斯特朗數(shù):如果一個正整數(shù)等于其各個數(shù)字的立方和,則該數(shù)稱為阿姆斯特朗數(shù)(也稱自戀數(shù)),如407=43+03+73,試編程求出1000以內(nèi)的所有阿姆斯特朗數(shù)。
第三節(jié) While 循環(huán)
While循環(huán)是當(dāng)型循環(huán)。
[例3.8] 前面第一章[例1.2]的雞兔同籠,頭30,腳90, 求雞兔各幾只?在此用下面方法編程求解。
解: 設(shè)雞為J只,兔為T只。已知頭為H, 腳為F。
  ①讓雞的只數(shù)逐次加1進(jìn)行遞推計算,初始時J=0;
②計算兔的只數(shù)T=H-J;
③當(dāng)總腳數(shù)(4*T+2*J) < > F就做 (J=J+1,T=H-J);
④當(dāng)4*T+2*J=F時,說明所推算的J和T是正確的,應(yīng)結(jié)束循環(huán),并輸出T, J。
Pascal程序:
Program Exam38;
Const H=30;
F=90;
Var J,T : integer;
Begin
J:=0; T:=H-J; {初始時讓J從0開始計算 }
While 4*T+2*J<>F do {當(dāng)條件為真就做do后面的循環(huán)體 }
begin
inc(J);    { 遞推改變J值 }
T:=H-J   {計算兔的只數(shù) }
end;
Writeln('T=',T,' ':6, 'J=', J ) ;
Readln
End.
程序中采用While當(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.9] 輸入任一的自然數(shù)A, B, 求A , B的最小公倍數(shù)。
解:這里采用適合計算機(jī)查找的方法: 設(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)(D mod B)<>0 為真時 ( D不能整除B ) 就做 D=D+A, 重復(fù)②;
③ 當(dāng)(D mod B)<>0 為假時結(jié)束循環(huán),并輸出D。
Pascal程序:
program Exam39;
var a,b,d,t : word;
begin
write('input a,b: '); readln(a , b);
if abegin
t:=a; a:=b; b:=t
end;
d:=a;
while d mod b < >0 do {當(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)比較靈活, 只要對條件表達(dá)式的值能控制滿足一定要求就能組成循環(huán), 但在循環(huán)體中必須有改變循環(huán)變量值的語句, 使條件判斷(邏輯值)最終為True或flase, 讓循環(huán)能夠終止。
[例3.10]求自然數(shù)A, B的最大公約數(shù)。
解:采用如下方法步驟:
(1)求A除以B的余數(shù);
(2)當(dāng)余數(shù)<>0就做n=a; a=b; b=n mod b, 重復(fù)(1)和(2);
(3)當(dāng)余數(shù)=0就結(jié)束循環(huán),并輸出b值。
比如a=18, b=12時,處理步驟為:
(1) a mod b = 6 ,得余數(shù)為6;
(2) 此余數(shù)不為零 ,讓a = 12, b = 6;
(3) 重復(fù) a mod b = 0 , 得余數(shù)為0;
(4) 結(jié)束循環(huán),輸出6(余數(shù)為零時的b值即是所求的最大公約數(shù))。
此方法稱為輾轉(zhuǎn)相除法求最大公約數(shù)。
Pascal程序:
program Exam310;
var a,b, n : word;
begin
write('input a,b: '); readln (a,b);
write('(', a, ' , ' , b, ')=' ) ;
while a mod b < > 0 do
begin
n:=a; a:=b; b:=n mod b;
end;
writeln(b);
readln
End.
[例3.11]將一根長為369cm的鋼管截成長為69cm和39cm兩種規(guī)格的短料。在這兩種規(guī)格的短料至少各截一根的前提下, 如何截才能余料最少。
解:設(shè)兩種規(guī)格的短料分別為:
規(guī)格為69cm的x根,可在1至(369-39)/69范圍循環(huán)取值;
規(guī)格為39cm的y根,用y = (369-69*X)/39)計算;
余料R=369-69*X-39*Y。
①設(shè)最小余料的初始值min=369;
②在X循環(huán)范圍內(nèi),每一個X值都計算出對應(yīng)的Y和R;
③如果R<min, 就將R存入min, x存入n, y存入m,記錄余料最小時的x和y ;
④重復(fù)步驟②,當(dāng)x值超出 ((369—39)/ 69) 時結(jié)束循環(huán)。
Pascal程序:
program exam311;
var x,y,r,min,n,m,a: integer;
begin
min:=369;
a:=(369-39) div 69; x:=1;
while x<=a do
begin
y:=(369-69*x) div 39;
r:=369-69*x-39*y;
if rbegin
min:=r; n:=x; m:=y
end;
inc(x);
end;
writeln('min=', min, ' x=', n, ' y=', m) ;
readln
end.
在有些情況中, 三種循環(huán)方法可以互相換用。
[例3.12]甲、乙、丙三人都是業(yè)余射擊愛好者, 在一次練習(xí)中他們槍槍中靶: 甲射了八發(fā)子彈,取得225環(huán)成績,乙射了七發(fā),也取得225環(huán);丙只射了六發(fā),同樣取得225環(huán)。下面是成績表,請編程完成下表中空項的填數(shù)。
射子彈數(shù) 中50環(huán)有幾發(fā) 中35環(huán)有幾發(fā) 中25環(huán)有幾發(fā) 成績(環(huán))
甲 8 225
乙 7 225
丙 6 225
解:①設(shè)N為發(fā)射子彈數(shù), 只有8, 7, 6三個數(shù)字, 正好又可用來代表甲、乙、丙;
②設(shè)A為中50環(huán)的子彈數(shù), 最小為0, 最大為(225 div 50=4);
B為中35環(huán)的子彈數(shù), 最小為0, 最大為(225 div 35=6);
C為中25環(huán)的子彈數(shù), C=N-A-B, 但必須C>0才可能正確;
③先讓N=8, A取值(0~4), B取值 (0~6)用循環(huán)逐個選定, 在C>0的情況下若能滿足條件A*50+B*35+C*25=225就能確定一組填數(shù)。然后選N的下一數(shù)值,重復(fù)同樣的過程。
Pascal程序:
program exam312;
var a,b,c,n,s : integer;
begin
writeln('n':3, 'a':3, 'b':3, 'c':3, 's':5) ;
n:=8;
while n>=6 do
begin
a:=0;
while a < = 4 do
begin
b:=0;
while b < = 6 do
begin
c:=n-a-b;
if c>0 then
begin
s:=50*a+35*b+25*c;
if s=225 then writeln(n:3,a:3,b:3,c:3,s:5);
end;
inc(b);
end;
inc(a);
end;
dec(n);
end;
readln
end.
程序運(yùn)行結(jié)果獲得兩組填數(shù)答案。如果改用for循環(huán),程序?qū)⒏雍喢?
Program Exam312_1;
Var a,b,c,n,s : Integer;
Begin
Writeln('N':3, 'A':3, 'B':3, 'C':3, 'S':5) ;
for n:=8 downto 6 do {N取值8,7,6,并分別代表甲、乙、丙 }
for a:=0 to 4 do {中50環(huán)的可能范圍 }
for b:=0 to 6 do {中30環(huán)的可能范圍 }
begin
c:=n-a-b; { 計算中25環(huán)的子彈數(shù) }
if c>0 then begin {如果不是負(fù)數(shù) }
s:=50*a+35*6+25*c; {計算總成績 }
if s=225 then writeln(n:3,a:3,b:3,c:3,s:5);
end
end;
readln
End.
習(xí)題3.3
1.求S= 1-1/2 +1/3-1/4+1/5-1/6+ ……(求前N項的和)
2. Faibonacci數(shù)列前幾項為: 0,1,1,2,3,5,8,…,其規(guī)律是從第三項起, 每項均等于前兩項之和。求前30項, 并以每行5個數(shù)的格式輸出。
3.小球從100高處自由落下,著地后又彈回高度的一半再落下。求第20次著地時, 小球共通過多少路程
4.某登山隊員第一天登上山峰高度的一半又24米; 第二天登上余下高度的一半又24米;每天均如此。到第七天,距山頂還剩91米。求此山峰的高度
5.給出某整數(shù)N,將N寫成因數(shù)相乘的形式。如: N=12,輸出: 12=1*2*2*3.
6.出售金魚者決定將缸里的金魚全部賣出。第一次賣出全部金魚的一半加二分之一條;第二次賣出剩余的三分之一加三分之一條金魚;第三次賣出余下金魚的四分之一加四分之一條;第四次賣出余下的五分之一加五分之一條金魚。還剩下11條金魚。當(dāng)然,出售金魚時都是整數(shù)條,不能有任何破損。求缸里原有的金魚數(shù)
7.外出旅游的幾位朋友決定次日早晨共分一筐蘋果。天剛亮,第一個人醒來,他先拿了一個,再把筐里的八分之一拿走;第二個人醒來,先拿兩個,再把筐里的八分之一拿走;第三個人醒來,先拿三個,再拿走筐里的八分之一;…每個人依次照此方法拿出各人的蘋果,最后筐里的蘋果全部拿完,他們每人所拿到的蘋果數(shù)正巧一樣多。求原先筐里的蘋果數(shù)和人數(shù)。
8.圖中由6個圓圈構(gòu)成三角形,每條邊上有三個圈, 將自然數(shù)1--6 不重復(fù)地填入各圓圈位置上,使每條邊圓圈上的數(shù)字之和相等,請編程輸出所有的填法。
9.請編程顯示出下面數(shù)字金字塔圖形:
第四章 函數(shù)與過程
程序中往往需要把主要任務(wù)分成若干個子任務(wù),每個子任務(wù)只負(fù)責(zé)一個專門的基本工作。每個子任務(wù)就是一個獨(dú)立的子程序。Turbo Pascal 可以把函數(shù)和過程作為子程序調(diào)用。
第一節(jié) 函數(shù)
Pascal允許用戶在程序中自己說明定義所需要的函數(shù)并在程序中調(diào)用這些函數(shù)。
[例4.1]編程找出由鍵盤任意輸入五個整數(shù)中的最大整數(shù)。
解:設(shè)輸入的五個整數(shù)為n1、n2、n3、n4、n5,為了便于處理,引入一個中間變量t1,按如下步驟處理:
①令t1=n1;
②將t1與n2比較,將兩者中較大的數(shù)放入t1;
③將t1與n3比較,將兩者中較大的數(shù)放入t1;
④將t1與n4比較,將兩者中較大的數(shù)放入t1;
⑤將t1與n5比較,將兩者中較大的數(shù)放入t1;
⑥經(jīng)過以上5步處理后,t1即為5個數(shù)中最大者。
從上面規(guī)劃的步驟看來,從步驟②到步驟⑤需處理的目標(biāo)是相同的,因此我們可以設(shè)計一段子程序Max(x1,x2),以找出x1和x2中最大的值并返回。
Pascal程序:
Program Exam41_a;
Var n1,n2,n3,n4,n5,t1 : integer;
Function max(x1,x2 : integer) : integer;
Begin
If x1>x2 then Max := x1
Else Max := x2;
End;
Begin
Write(‘Input 5 numbers : ‘);
Readln(n1,n2,n3,n4,n5);
T1 := n1;
T1 := Max(t1,n2);
T1 := Max(t1,n3);
T1 := Max(t1,n4);
T1 := Max(t1,n5);
Writeln(‘Max number : ‘,t1);
End.
從上例看出,引入函數(shù)實(shí)際上是將一個復(fù)雜的問題劃分成若干個易于處理的子問題,將編程化簡的一種有效辦法,而化簡的方法是多種多樣的,如前面已經(jīng)做過求三個數(shù)中的最大數(shù),所以可定義一個專門求三個數(shù)中最大數(shù)的函數(shù)(Max)。第一次用這個函數(shù)求出n1,n2,n3三個數(shù)中的最大數(shù)t1;第二次調(diào)用這個函數(shù)求出t1與n4,n5三個數(shù)中的最大數(shù),也就是前三個數(shù)的最大數(shù)(已在t1中)和后面二個數(shù)再求一次,就得到五個數(shù)的最大數(shù)。因此,需要兩次使用“求三個數(shù)中的最大數(shù)”,步驟如下:
①調(diào)用函數(shù)Max ( n1, n2, n3), 求出n1,n2,n3中的最大者 t1;
②調(diào)用函數(shù)Max ( t1, n4, n5 ),求出t1, n4, n5中的最大者t2;
③輸出最大數(shù) t2。
Program Exam41_b;
Var n1,n2,n3,n4,n5,t1: integer;
function Max(x1,x2,x3: integer): integer; {自定義函數(shù)Max}
Var XX: integer; {函數(shù)內(nèi)部變量說明}
begin {函數(shù)體}
if X1>X2 then XX:=X1
else XX:=X2;
if X3>XX then XX:=X3;
Max:=XX
end;
Begin {主程序}
Write('Input 5 numb:');
Readln(n1,n2,n3,n4,n5); {輸入五個數(shù)}
t1:=Max(n1,n2,n3); {用函數(shù)求n1, n2, n3的最大數(shù)}
t1:=Max(n4,n5,t1); {用函數(shù)求n4, n5, t1 的最大數(shù)}
Writeln('Max Number :', t1);
Readln
End.
主程序中兩次調(diào)用自定義函數(shù)。自定義函數(shù)的一般格式為:
function 函數(shù)名(形式參數(shù)表): 類型; {函數(shù)首部}
局部變量說明部分;
begin
語句系列; {函數(shù)體 }
end;
函數(shù)中的形式參數(shù)接受調(diào)用函數(shù)時所傳入的值,用來參與函數(shù)中的運(yùn)算。
[例4.2]求任意輸入的五個自然數(shù)的最大公約數(shù)。
解:⑴自定義一個專門求兩自然數(shù)的最大公約數(shù)的函數(shù)GCD;
⑵調(diào)用自定義函數(shù),第一次求前兩個數(shù)的最大公約數(shù);從第二次開始,用每次求得的最大公約數(shù)與下一個數(shù)再求兩個數(shù)最大公約數(shù),直到最后。本題共四次“求兩個數(shù)的最大公約數(shù)”, 設(shè)輸入的五個自然數(shù)分別是a1,a2,a3,a4,a5,采用如下步驟:
①求a1, a2兩個數(shù)的最大公約數(shù) → 存入a1;
②求a1, a3兩個數(shù)的最大公約數(shù) → 存入a1;
③求a1, a4兩個數(shù)的最大公約數(shù) → 存入a1;
④求a1, a5兩個數(shù)的最大公約數(shù) → 存入a1;
⑤ 輸出 a1,此時的a1已是五個數(shù)的最大公約數(shù)。
Pascal程序:
Program Exam42;
Var a1,a2,a3,a4,a5: integder;
function GCD(x,y: integer): integer; {自定義函數(shù) }
Var n:integer;
begin
While x mod y <>0 do
begin
n:=x; x:=y; y:=n mod y
end;
GCD:=y
end;
Begin {主程序 }
Write('input 5 Numper:');
readln(a1,a2,a3,a4,a5); {輸入五個數(shù)}
Write('(',a1,',',a2,',',a3,',',a4,',',a5,')=');
a1:=GCD(a1,a2); {調(diào)用函數(shù)GCD }
a1:=GCD(a1,a3);
a1:=GCD(a1,a4);
a1:=GCD(a1,a5);
Writeln(a1);
readln
End.
函數(shù)的結(jié)果是一個具體的值, 在函數(shù)體中必須將所得到的運(yùn)算結(jié)果賦給函數(shù)名;主程序通過調(diào)用函數(shù)得到函數(shù)的運(yùn)算結(jié)果。調(diào)用函數(shù)的一般格式為:
函數(shù)名 (實(shí)在參數(shù)表)
調(diào)用函數(shù)時, 函數(shù)名后面圓括號內(nèi)的參數(shù)必須有確定的值, 稱為實(shí)在參數(shù)。調(diào)用時即把這些實(shí)際值傳送給函數(shù)形參表中的相應(yīng)形參變量。函數(shù)不是單獨(dú)的語句, 只能作為運(yùn)算賦值或出現(xiàn)在表達(dá)式中。
習(xí)題4.1
1. 數(shù)學(xué)上把從 1 開始的連續(xù)自然數(shù)相乘叫做階乘。例如 把1*2*3*4*5 稱作5的階乘, 記為5!。 編寫一個求n!的函數(shù), 調(diào)用此函數(shù)求: D=
2.求從鍵盤輸入的五個自然數(shù)的最小公倍數(shù)。
3.哥德巴赫猜想的命題之一是:大于6 的偶數(shù)等于兩個素數(shù)之和。編程將6~100所有偶數(shù)表示成兩個素數(shù)之和。
4.如果一個自然數(shù)是素數(shù),且它的數(shù)字位置經(jīng)過對換后仍為素數(shù),則稱為絕對素數(shù),例如13。試求出所有二位絕對素數(shù)。
第二節(jié) 自定義過程
自定義函數(shù)通常被設(shè)計成求一個函數(shù)值,一個函數(shù)只能得到一個運(yùn)算結(jié)果。若要設(shè)計成能得到若干個運(yùn)算結(jié)果,或完成一系列處理,就需要自定義“過程”來實(shí)現(xiàn)。
[例4.3] 把前面[例2.2 ](輸入三個不同的整數(shù),按由小到大排序)改為下面用自定義過程編寫的Pascal程序:
Program exam43;
Var a,b,c: integer;
Procedure Swap (var x,y: integer); {自定義交換兩個變量值的過程 }
Var t : integer;
Begin {過程體}
t:=x; x:=y; y:=t {交換兩個變量的值
end;
Begin {主程序}
Write('input a,b,c=');
Readln(a,b,c);
if a>b then swap (a,b); {調(diào)用自定義過程}
if a>c then swap (a,c);
if b>c fhen swap (b,c);
Writeln (a:6, b:6, c:6);
Readln
End.
程序中Procedure Swap是定義過程名,從作用來看,過程與函數(shù)是相似的,都能將復(fù)雜的問題劃分成一些目標(biāo)明確的小問題來求解,只不過函數(shù)有值返回而過程則沒有。自定義過程的一般格式如下:
Procedure 過程名 (形式參數(shù)表); {過程首部}
局部變量說明部分;
begin
語句部分; {過程體部分}
end;
[例4.4]如果一個自然數(shù)除了1和本身,還有別的數(shù)能夠整除它, 這樣的自然數(shù)就是合數(shù)。例如15,除了1和15,還有3和5能夠整除,所以15是合數(shù)。14,15,16是三個連續(xù)的合數(shù),試求連續(xù)十個最小的合數(shù)。
解:從14,15,16三個連續(xù)合數(shù)中可看出,它們正好是兩個相鄰素數(shù)13和17 之間的連續(xù)自然數(shù),所以求連續(xù)合數(shù)問題可以轉(zhuǎn)化為求有一定跨度的相鄰兩個素數(shù)的問題。因此,求連續(xù)十個最小的合數(shù)可用如下方法:
①從最小的素數(shù)開始,先確定第一個素數(shù)A;
②再確定與A相鄰的后面那個素數(shù)B;(作為第二個素數(shù));
③檢查A,B的跨度是度否在10 以上,如果跨度小于10,就把B 作為新的第一個素數(shù)A,重復(fù)作步驟②;
④如果A、B跨度大于或等于10,就打印A、B之間的連續(xù)10個自然數(shù),即輸出 A+1, A+2, A+3 …, A+10。
Pascal程序:
Program exam44;
var a,b,s,n: integer;
yes: boolean;
procedure sub(x: integer;var yy: boolean); {過程:求x是否為素數(shù) }
var k,m: integer; { 用yy邏輯值轉(zhuǎn)出 }
begin
k:=trunc(sqrt(x));
for m:=3 to k do
if odd(m) then
if x mod m=0 then yy:=false;
end;
begin {主程序 }
b:=3;
repeat
a:=b; {a 為第一個素數(shù) }
repeat
yes:=true;
inc(b,2); {b是a后面待求的素數(shù)}
sub(b,yes); {調(diào)用SUB過程來確認(rèn)b是否為素數(shù) }
if yes then s:=b-a; {如果b是素數(shù),則求出跨度s }
until yes;
until s > = 10;
for n:=a+1 to a+10 do
write(n:6);
writeln;
readln
end.
程序中的過程SUB,用來確定b是否為素數(shù)。過程名后面圓括號內(nèi)的變量是形式參數(shù),簡稱為形參。過程SUB(x: integer; Var yy: boolean) 中的x是值形參,而前面冠有Var的yy是變量形參。值形參只能從外界向過程傳入信息,但不能傳出信息;變量形參既能傳入又能傳出信息。本程序過程SUB中的x是由調(diào)用過程的實(shí)在參數(shù)b傳入值,進(jìn)行處理后,不需傳出;而yy是把過程處理結(jié)果用邏輯值傳出,供調(diào)用程序使用。
試把[例4.3]程序中的過程 SWAP(Val x,y: integer),將x,y前面的Var去掉,就變成了純粹的值形參,就不能將過程所處理的結(jié)果傳出去,也就無法得到處理后的結(jié)果,通過運(yùn)行程序比較,可以非常明顯地看到值形參和變量形參的區(qū)別。
調(diào)用過程的格式為: 過程名(實(shí)在參數(shù)表) ;
調(diào)用過程名后面圓括號內(nèi)的實(shí)在參數(shù)與定義過程的形參表必須相對應(yīng),調(diào)用過程相當(dāng)于一個獨(dú)立語句,可單獨(dú)使用。
[例4.5]將合數(shù)483的各位數(shù)字相加(4+8+3)=15,如果將483分解成質(zhì)因數(shù)相乘: 483=3*7*23,把這些質(zhì)因數(shù)各位數(shù)字相加(3+7+2+3),其和也為15。即某合數(shù)的各位數(shù)字之和等于它所有質(zhì)因數(shù)的各數(shù)字之和。求500以內(nèi)具有上述特點(diǎn)的所有合數(shù)。
解:①設(shè)n為所要求的合數(shù),讓n在1~500間循環(huán)做以下步驟;
②用t1,t2分別累計合數(shù)n及n的質(zhì)因數(shù)的各位數(shù)字之和,初值均為0;
③調(diào)用過程SUB3進(jìn)行非素數(shù)判定,以布爾變量yes的真假值判定是否,yes的初值為true,如果為 (not true)非素數(shù),就做步驟④,⑤,⑥;否則取新的n值,重復(fù)步驟③;
④調(diào)用SUB1,求n的各數(shù)字之和,傳送給t1;
⑤調(diào)用SUB2,求n的各質(zhì)因數(shù),對于每個質(zhì)因素都通過SUB1求它各位數(shù)字之和,將所有各質(zhì)因數(shù)字傳送給t2。
⑥如果t1=t2(各位數(shù)字之和等于它所有質(zhì)因數(shù)的各數(shù)字之和),則輸出此n。
PASCAL程序:
program exam45;
var n,t1,t2,tatol: integer;
yes: boolean;
procedure sub1(x:integer; var t:integer); {過程:分離x的各位數(shù)字 }
begin {并求各位數(shù)字之和 }
repeat
t:=t+x mod 10;
x:=x div 10;
until x=0
end;
procedure sub2(x: integer; var t: integer); {過程:分解質(zhì)因數(shù) }
var xx,tt:integer;
begin
xx:=2;
while x>1 do
if x mod xx=0 then
begin
tt:=0;
sub1(xx,tt);
t:=t+tt;
x:=x div xx
end
else inc(xx)
end;
procedure sub3(x: integer;var yy: boolean); {過程:判斷x是否為素數(shù) }
var k,m: integer;
begin
k:=trunc(sqrt(x));
for m:=2 to k do
if x mod m=0 then yy:=false;
end;
begin {主程序}
for n:=1 to 500 do
begin
t1:=0;t2:=0;
yes:=true;
sub3(n,yes); {調(diào)用過程求素數(shù) }
if not yes then {如果非素數(shù)就… }
begin
sub1(n,t1); {調(diào)用過程求n的各位數(shù)字之和 }
sub2(n,t2); {調(diào)用過程求n的各質(zhì)因數(shù)的數(shù)字之和 }
if t1=t2 then write(n:6); {打印合格的合數(shù) }
end
end;
readln
end.
程序定義了三個過程SUB1,SUB2,SUB3,其中SUB2過程中又調(diào)用了SUB1。在過程中定義的變量或參數(shù),只在本過程內(nèi)部使用有效。這些變量稱為局部變量。如SUB2中的xx只在SUB2中使用,屬于局部變量。
習(xí)題:4.2
1.輸入自然數(shù)n,求前n個合數(shù)(非素數(shù)),其素因子僅有2,3,或5。
2.自然數(shù)a的因子是指能整除a的所有自然數(shù),但不含a本身。例如12的因子為:1,2,3,4,6。若自然數(shù)a的因子之和為b,而且b的因子之和又等于a,則稱a,b為一對“親和數(shù)” 。求最小的一對親和數(shù)。
3.求前n個自然數(shù)的平方和,要求不用乘法。例如:3的平方不用3*3,可用3+3+3。
4.試用容積分別為17升、13升的兩個空油桶為工具,從大油罐中倒出15升油來,編程顯示出具體的倒油過程。
5.如果一個數(shù)從左邊讀和從右邊讀都是同一個數(shù),就稱為回文數(shù)。例如6886就是一個回文數(shù),求出所有的既是回文數(shù)又是素數(shù)的三位數(shù)。
6. 任何大于2的自然數(shù)都可以寫成不超過四個平方數(shù)之和。如:
8=22+22; 14=12+22+32
由鍵盤輸入自然數(shù)N(2 < N < 2000) ,輸出其不超過四個平方數(shù)之和的表示式。
第五章 Pascal的自定義數(shù)據(jù)類型
Pascal系統(tǒng)允許用戶自定義的數(shù)據(jù)類型有:數(shù)組類型、子界類型、枚舉類型、集合類型、記錄類型、文件類型、指針類型。
第一節(jié) 數(shù)組與子界類型
[例5.1]總務(wù)室在商店購買了八種文具用品,其數(shù)量及單價如下表:
序號 1 2 3 4 5 6 7 8
品名 圓珠筆 鉛筆 筆記本 訂書機(jī) 計算器 三角板 圓規(guī) 文件夾
件數(shù) 24 110 60 16 26 32 32 42
單價 1.18 0.45 1.8 8.8 78.50 3.28 4.20 2.16
編程計算各物品計價及總計價。
解:表中有兩組數(shù)據(jù),設(shè)表示物品件數(shù)的一組為a,表示物品單價的一組為b。
a,b兩組數(shù)據(jù)以序號為關(guān)聯(lián),具有相應(yīng)的順序關(guān)系。按如下方法處理:
①定義s,a,b三個數(shù)組,按相應(yīng)順序關(guān)系,給a,b賦值(件數(shù)和對應(yīng)單價) ;
②每讀入一對數(shù)據(jù)(件數(shù)和對應(yīng)單價),以同一序號的件數(shù)和對應(yīng)單價計算出同一物品的計價:
s[ i ]=a[ i ]* b[ i ] ; { 用s[ i] 記入第i種物品的計價}
t = t + s[ i ] { 用簡單變量累加總計價 }
③循環(huán)做步驟②,做完后輸出s數(shù)組所記入的各物品計價及總計價t。
Pascal程序:
Program Exam51;
Var a: array[1..8] of integer; {a數(shù)組為整數(shù)型}
s,b: array[1..8] of real; {s和b數(shù)組為實(shí)數(shù)型}
t: real;
i: integer;
Begin
t:=0;
for i:=1 to 8 do {輸入并計算八種物品 }
begin
write('a[', i, ']=') ;
Readln(a[ i ]) ; {輸入單價}
write('b[', i, ']=') ;
readln(b[ i ]); {輸入件數(shù)}
s[ i ]:=a[ i ]* b[ i ]; t:=t+s[ i ]
end;
write('i':2, ' ':2);
for i:=1 to 8 do {打印物品序號}
write(i:8); {輸出項寬度為8}
writeln;
write('a':2, ' ':2); {輸出項寬度為2}
for i:=1 to 8 do {打印物品件數(shù)a數(shù)組}
write(a[ i ]:8); {輸出項寬度為8}
writeln; {換行}
write('b':2, ' ':2);
for i:=1 to 8 do {打印物品件數(shù)b數(shù)組}
write(b[ i ]:8:2); {輸出項寬度為8,小數(shù)2位}
writeln; {換行}
write('s':2, ' ':2);
for i:=1 to 8 do {打印物品計價s數(shù)組}
write(s[ i ]:8:2); {輸出項寬度為8,小數(shù)2位}
writeln; {換行}
writeln('Totol=', t:8:2); {打印總價t}
Readln
end.
輸出語句為 write(實(shí)數(shù):n:m) 的形式時,則輸出該實(shí)數(shù)的總寬度為n,其中小數(shù)m位,此時的實(shí)數(shù)不以科學(xué)計數(shù)形式顯示。
程序中用來表示如物品件數(shù)和物品單價等屬性相同的有序數(shù)據(jù),Pascal語言把它歸為數(shù)組。數(shù)組成員(分量)稱為數(shù)組元素。數(shù)組必須在說明部分進(jìn)行定義:確定數(shù)組名,數(shù)組分量(元素)的個數(shù)及類型。一般格式有:
Var 數(shù)組名:array[下標(biāo)類型] of 數(shù)組元素類型 ;
本程序中a數(shù)組和b數(shù)組中8個元素的數(shù)據(jù)都是已知數(shù)據(jù),可當(dāng)作常量,用常量說明語句給數(shù)組元素賦初值,所以上面的程序Exam51可改為如下形式:
Program Exam51_1;
const a: array[1..8] of integer
=(24,110,60,16,26,32,32,42); {給a數(shù)組賦初值}
b:array[1..8] of real
=(1.18,0.45,1.80,8.8,78.50,3.28,4.20,2.16); {給b數(shù)組賦初值}
Var s: array[1..8] of real;
t: real;
i: integer;
Begin
t:=0;
for i:=1 to 8 do
begin
s[ i ]:=a[ i ]* b[ i ]; t:=t+s[ i ]
end;
write('i':2, ' ':2);
for i:=1 to 8 do write(i:8);
writeln;
write('a':2, ' ':2);
for i:=1 to 8 do write(a[ i ]:8:);
writeln;
write('b':2, ' ':2);
for i:=1 to 8 do write(b[ i ]:8:2);
writeln;
write('s':2, ' ':2);
for i:=1 to 8 do write(s[ i ]:8:2);
writeln;
writeln('Totol=', t:8:2);
Readln
end.
數(shù)組常量說明格式為:
Const 數(shù)組名:array[下標(biāo)類型]of 數(shù)組元素類型=(常量表);
程序中對數(shù)組的輸入、輸出處理,常用循環(huán)語句控制下標(biāo),進(jìn)行有序地直接操作每個數(shù)組元素。
[例5.2]編程輸入十個正整數(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ù)來說明兩兩相比較和交換位置的具體情形:
5 6 4 3 7 5和6比較,交換位置,排成下行的順序;
6 5 4 3 7 5和4比較,不交換,維持同樣的順序;
6 5 4 3 7 4和3比較,不交換,順序不變
6 5 4 3 7 3和7比較,交換位置,排成下行的順序;
6 5 4 7 3 經(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ù)”往下“掉”,用這種方法排列順序,常被稱之為“冒泡法”排序。
Pascal程序:
Program Exam52;
const N=10;
Var a: array[1..N] of integer; {定義數(shù)組}
i,j: integer;
procedure Swap(Var x,y: integer); {交換兩數(shù)位置的過程}
Var t:integer;
begin
t:=x; x:=y; y:=t
end;
Begin
for i:=1 to N do {輸入十個數(shù)}
begin
write(i, ':');
Readln(a[ i ])
end;
for j:=1 to N-1 do {冒泡法排序}
for i:=1 to N-j do {兩兩相比較}
if a[ i ] < a[i+1] then swap(a[ i ], a[i+1]); {比較與交換}
for i:=1 to N do {輸出排序后的十個數(shù)}
write(a[ i ]:6);
Readln
end.
程序中定義a數(shù)組的下標(biāo)類型為 1.. N ,這種類型規(guī)定了值域的上界和下界,是從一個有序類型范圍取出一個區(qū)段,所以稱為子界類型,子界類型也是有序類型。
例[5.3] 用篩法求出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)志) :
① 2 3 4 5 6 7 8 9 10 11 12 13 14 15…98 99 100 {置數(shù)}
② 2 3 4 5 6 7 8 9 10 11 12 13 14 15…98 99 100 {篩去被2整除的數(shù) }
③ 2 3 4 5 6 7 8 9 10 11 12 13 14 15…98 99 100 {篩去被3整除的數(shù) }
……
2 3 4 5 6 7 8 9 10 11 12 13 14 15…98 99 100 {篩去被整除的數(shù) }
Pascal程序:
Program Exam53;
const N=100;
type xx=1 .. N;      {自定義子界類型xx(類型名)}
Var a: array[xx] of boolean;
i,j: integer;
Begin
Fillchar(a,sizeof(a),true);
a[1] := False;
for i:=2 to Trunc(sqrt(N)) do
if a[I] then
for j := 2 to N div I do
a[I*j]:= False;
t:=0;
for i:=2 to N do
if a[i] then
Begin
write(a[ i ]:5); inc(t);
if t mod 5=0 then writeln
end;
readln
End.
程序中自定義的子界類型,在用法上與標(biāo)準(zhǔn)類型(如integer)相同,只是值域上界、下界在說明中作了規(guī)定,而標(biāo)準(zhǔn)類型的值域由系統(tǒng)內(nèi)部規(guī)定,其上界、下界定義是隱含的,可直接使用。例如:
Type integer= -32768 ... 32768; Pascal系統(tǒng)已作了標(biāo)準(zhǔn)類型處理,不必再作定義。
[例5.4]在一次宴會上,有來自八個不同國家的賓客被安排在同一張圓桌就坐。A是中國人,會講英語;B是意大利人,他能講西班牙語;C是英國人,會講法語;D是日本人,能講漢語;E是法國人,會講德語;F是俄國人,懂意大利語;G是西班牙人,能講日語;最后一個是德國人,懂俄語。編程序安排他們的座位,使他們在各自的座位上能方便地跟兩旁的客人交談。
解:①根據(jù)題目提供條件與數(shù)據(jù),建立如下關(guān)系代碼表:
國家名 中國 意大利 英國 日本 法國 俄國 西班牙 德國
賓客代碼 A B C D E F G H
語言代號 1 2 3 4 5 6 7 8
懂外語代號 3 7 5 1 8 2 4 6
總代碼 A13 B27 C35 D41 E58 F62 G74 H86
表中總代碼實(shí)際上是前三項代碼的歸納:第一個字母表示哪國人;第二個數(shù)字表示本國語代號;第三個數(shù)字表示懂哪國外語。如A13,A表示中國人,1表示漢語(本國語),3表示會說英語。所以每個賓客的情況均用總代碼(三個數(shù)據(jù)組成的字符串)表示;
②定義由8個元素組成的數(shù)組(NAME),元素類型為字符串類型(String);
③元素的下標(biāo)號影響各人座位關(guān)系,必須滿足后一個元素的下標(biāo)號應(yīng)與前一個元素字符串中的第三個數(shù)據(jù)相同。例如:若第一個位置總代碼為A13,則第二個位置應(yīng)根據(jù)A13中最后的3,安排C35。即A與C可以交談。以此類推。
用字符串處理函數(shù)COPY,截取字符串的第一個字母作為賓客代碼打印,再取第三個字符,用VAL將其轉(zhuǎn)換成數(shù)字,將這個數(shù)字作為下標(biāo)號,把這個下標(biāo)號的元素安排在旁邊(相鄰);
④重復(fù)步驟③的方法,安排其后的元素,直到八個數(shù)據(jù)全部處理完為止。
Pascal程序:
Program Exam54;
const name : array[1..8]of string {定義字串類型數(shù)組并賦常量}
=('A13','B27','C35','D41','E58','F62','G74','H86');
Var i, code: integer; {整數(shù)類型}
x: 1..8; {子界類型}
s : string; {字符串類型}
Begin 
s:=copy(name[1],1,1); {截取第一個元素字串的第一個字符}
write(s:4); {確定第一個位置}
s:=copy(name[1],3,1); {截取元素字串的第三個字符作為相鄰}
Val(s,x,code); {將字串s的值轉(zhuǎn)換成數(shù)字存入 x}
for i:=1 to 7 do {確定后面7個位置}
Begin
s:=copy(name[x],1,1); {找到相鄰者的代碼}
write(s:4); {打印相鄰者代碼}
s:=copy(name[x],3,1); {確定下一個相鄰元素}
Val(s,x,code);
end;
readln
End.
Pascal常用的字符串處理標(biāo)準(zhǔn)函數(shù)有7個:
設(shè)變量s,str,str1,str2均為字符串類型(string){多個字符};ch為字符類型(char){單個字符};
(1)copy(str,n,m)從字符串str的左邊第n個開始截取m個字符;
如:copy(' Pascal ' ,3,2)的結(jié)果為'sc ' ;
(2)concat(str1,str2)將兩個字串連接成為一個新的字串;
如:s:=str1+str2;同等于兩串字符相加
(3)Length(str)求字串str的長度(字符個數(shù));
(4)chr(x) 求x(x為1…255整數(shù))的ASII代碼對應(yīng)的字符;
如:chr(65)結(jié)果為 'A'。
(5)ord(ch)求字符ch對應(yīng)的ASCII代碼值;如 ord ( 'A' )結(jié)果為65;
(6)pos(str1,str2)求字串str1在字串中開始的位置;
如: pos('sca','pascal')結(jié)果為3;
(7)upcase(ch)將字符ch轉(zhuǎn)為大寫字母,如 upcase( 'a' )結(jié)果為'A' ;
Pascal常用的字符串處理標(biāo)準(zhǔn)過程有4個:
(1)Val(str,x,code)將數(shù)字型字串轉(zhuǎn)為數(shù)字并存入變量x中;
如:Val(‘768’,x,code),x值為768,code為檢測錯誤代碼,若code=0表示沒有錯誤;
(2)str(n,s)將數(shù)字n轉(zhuǎn)化為字串存入s中,如str(768,s)s的結(jié)果為 ' 768' ;
(3)insert(str1,str2,n)把字串str1插入在字串str2的第n個字符之前,結(jié)果在str2中;{此過程中的str2為變量形參,具有傳入傳出的功能};
(4)delete(str,n,m)從字串str的第n個開始,刪除m個字符,把剩余的字符存在str中,{此過程中的str為變量形參,具有傳入傳出的功能};
[例5.5]一個兩位以上的自然數(shù),如果左右數(shù)字對稱,就稱為回文數(shù),編程找出所有不超過6位數(shù)字的回文數(shù),同時又是完全平方數(shù)的數(shù)。
如121是回文數(shù),又是11的平方,所以是完全平方數(shù)。
解:①不超過6位數(shù)的完全平方數(shù)用循環(huán)在10~999范圍產(chǎn)生(for i:=10 to 999) ;
②將完全平方數(shù) (i*i)轉(zhuǎn)成字串類型存入s中;
③逐個取s的左右字符,檢查是否相同(對稱),檢查對數(shù)不超過總長度的一半;
④如果是回文數(shù),就調(diào)用打印過程(Print)。
Program Exam55;
Var n, k, j ,t : integer;
s : string; {字符串類型 }
i: longint; {長整數(shù)類型 }
Procedure Print; {打印過程(無形參)}
begin
write(s : 10); inc(t); {打印s, 用t 計數(shù) }
if t mod 6=0 then writeln {打印6個換行 }
end;
Begin
t:=0;
for i:=10 to 999 do
begin
str(i*i,s); {將完全平方數(shù)轉(zhuǎn)換成字串 }
k:=length(s); {計算字串長度 }
n:=k div 2; {計算字串長度的一半 }
j:=1;
while j < = n do {取左右字符檢查是否對稱 }
if copy(s,j,1) < > copy(s,k+1-j,1) then j:=1000
else inc( j ) ; {若不對稱讓j=1000,退出循環(huán) }
if j <1000 then Print { j <1000即是回文數(shù),調(diào)打印 }
end;
writeln; writeln('Total=':8, t); {打印總個數(shù) }
readln
End.
習(xí)題5.1
1.裴波那契數(shù)列:數(shù)列1、1、2、3、5、8、13、21…稱為裴波那契數(shù)列,它的特點(diǎn)是:數(shù)列的第一項是1,第二項也是1,從第三項起,每項等于前兩項之和。編程輸入一個正整數(shù)N,求出數(shù)列的第N項是多少?(N不超過30)。
2.下面的豎式是乘法運(yùn)算,式中P表示為一位的素數(shù),編程輸出此乘法豎式的所有可能方案。
3.節(jié)目主持人準(zhǔn)備從N名學(xué)生中挑選一名幸運(yùn)觀眾,因?yàn)榇蠹叶枷霠幃?dāng)幸運(yùn)觀眾,老師只好采取這樣的辦法:全體同學(xué)排成一列,由前面往后面依順序報數(shù)1,2,1,2,…,報單數(shù)的同學(xué)退出隊伍,余下的同學(xué)向前靠攏后再重新由前往后1,2,1,2,…報數(shù),報單數(shù)者退出隊伍,如此下去最后剩下一人為幸運(yùn)觀眾。編程找出幸運(yùn)觀眾在原隊列中站在什么位置上?(N由鍵盤輸入,N < 255)。
4. 1267*1267=1605289,表明等式右邊是一個七位的完全平方數(shù),而這七個數(shù)字互不相同。編程求出所有這樣的七位數(shù)。
5. 校女子100米短跑決賽成績?nèi)缦卤恚埦幊檀蛴∏鞍嗣\(yùn)動員的名次、運(yùn)動員號和成績。(從第一名至第八名按名次排列)
運(yùn)動員號 017 168 088 105 058 123 142 055 113 136 020 032 089 010
成績(秒) 12.3 12.6 13.0 11.8 12.1 13.1 12.0 11.9 11.6 12.4 12.9 13.2 12.2 11.4
6. 求數(shù)字的乘積根。正整數(shù)的數(shù)字乘積這樣規(guī)定:這個正整數(shù)中非零數(shù)字的乘積。例如整數(shù)999的數(shù)字乘積為9*9*9,得到729;729的數(shù)字乘積為7*2*9,得到126;126的數(shù)字乘積為1*2*6,得到12;12從數(shù)字乘積為1*2,得到2。如此反復(fù)取數(shù)字的乘積,直至得到一位數(shù)字為止。999的數(shù)字乘積根是2。編程輸入一個長度不超過100位數(shù)字的正整數(shù),打印出計算數(shù)字乘積根的每一步結(jié)果。輸出格式如下:
(N=3486784401)
3486784401
516096
1620
12
2
7. 有一組13個齒輪互相嚙合,各齒輪嚙合的齒數(shù)依次分別為6,8,9,10,12,14,15,16,18, 20,21,22,24, 問在轉(zhuǎn)動過程中同時嚙合的各齒到下次再同時嚙合時,各齒輪分別轉(zhuǎn)過了多少圈
8. 集合M的元素的定義如下:
(1) 數(shù)1屬于M;
(2) 若X屬于M, 則A=2X+1, B=3X+1, C=5X+1, 也屬于M;
(3) 再沒有別的數(shù)屬于M。(M={1,3,4,6,7,9,10,13,15,16...,如果M中的元素是按遞增次序排列的,求出其中的第201,202和203個元素。
9. 一個素數(shù),去掉最高位,剩下的數(shù)仍是素數(shù);再去掉剩下的數(shù)的最高位,余留下來的數(shù)還是素數(shù),這樣的素數(shù)叫純粹素數(shù)。求所有三位數(shù)的純粹素數(shù)。
10. 自然數(shù)4,9,16,25等叫做完全平方數(shù),因?yàn)?2 =4, 32 =9, 42 =16,52 =25, 當(dāng)某一對自然數(shù)相加和相減, 有時可各得出一個完全平方數(shù)。
例如: 8與17這對自然數(shù): 17+8=25 17—8= 9
試編程,找出所有小于100的自然數(shù)對,當(dāng)加和減該數(shù)對時,可各得出一個完全平方數(shù)。
第二節(jié) 二維數(shù)組與枚舉類型
[例5.6]假設(shè)四個商店一周內(nèi)銷售自行車的情況如下面表一所示,
自行車牌號 永久牌 飛達(dá)牌 五羊牌
第一商店 35 40 55
第二商店 20 50 64
第三商店 10 32 18
第四商店 38 36 28
表一
幾種牌號自行車的單價如表二所示。求各店本周出售自行車的總營業(yè)額。
單價 元
永久牌 395
飛達(dá)牌 398
五羊牌 384
表二
解:①把表一看成是由行(每個店占一行)與列(每種牌號占一列)共同構(gòu)成的數(shù)據(jù)組,按表格排列的位置順序,用A數(shù)組表一各數(shù)據(jù)表示如下:
A[1,1]=35 A[1,2]=40 A[1,3]=55 {第一行共三個數(shù)據(jù)}
A[2,1]=20 A[2,2]=50 A[2,3]=64 {第二行共三個數(shù)據(jù)}
A[3,1]=10 A[3,2]=32 A[3,3]=18 {第三行共三個數(shù)據(jù)}
A[4,1]

展開更多......

收起↑

資源預(yù)覽

<pre id="tfb94"><li id="tfb94"></li></pre>

<bdo id="tfb94"><rt id="tfb94"></rt></bdo>
  • <menu id="tfb94"><dl id="tfb94"></dl></menu><i id="tfb94"><acronym id="tfb94"><sub id="tfb94"></sub></acronym></i>

    1. 主站蜘蛛池模板: 兰考县| 保定市| 巫溪县| 高阳县| 峨山| 海丰县| 西宁市| 盘锦市| 麻栗坡县| 新兴县| 靖西县| 惠东县| 吕梁市| 巨鹿县| 姚安县| 和静县| 泗洪县| 彭州市| 香河县| 凉城县| 封丘县| 个旧市| 仙桃市| 垦利县| 宁津县| 黄骅市| 德江县| 浙江省| 三门县| 大余县| 北海市| 浠水县| 涪陵区| 新乡县| 华安县| 北京市| 调兵山市| 井研县| 襄城县| 余干县| 永年县|