第五章 重復結構_第1頁
第五章 重復結構_第2頁
第五章 重復結構_第3頁
第五章 重復結構_第4頁
第五章 重復結構_第5頁
已閱讀5頁,還剩58頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第五章第五章 重復結構重復結構河師大附中信息技術 重復控制結構為計算機程序描述重復計算所提供的控制手段。一個重復控制結構需指明以下三件事情: 1被重復執(zhí)行的語句; 2是否重復的條件; 3具體的重復方式。 在PASCAL語言,用for,while和repeat三種語句描述重復控制結構。第一節(jié)第一節(jié) FOR語句語句 for語句用來描述已知重復次數的重復結構。FOR語句有二種格式: 1.for 控制變量:=初值 to 終值 do 語句; 2.for 控制變量:=初值 downto 終值 do 語句; 為了正確使用for語句,需遵守以下幾點約定: 1for語句的控制變量、初值、終值的數據類型應一致,且

2、限于整型、 布爾型和字符型等對函數ord 有意義的數據類型,即序數類型; 2初值與終值一經確定,重復次數就確定不變了。 3控制變量在重復語句內不能施加任何賦值操作; 4for語句正常結束后,控制變量值無意義。 例例5-1 打印輸出大寫英文字符A到Z,以及對應的ASCII的序號。 Program example5_1; var i : char; begin for i := A to Z do write(i:4,ord(i):4); readln; end. 例例5-2 由鍵盤輸入N(N max then max:=a; if amin then min:=a; end; s:=(s-min

3、-max)/8; writeln(s:5:3); readln; end. 循環(huán)的嵌套:在一個循環(huán)體內,還包含有另一個循環(huán)的形式,稱之為循環(huán)的嵌套或多重循環(huán)。按照循環(huán)嵌套的重數,分別叫做二重循環(huán)、三重循環(huán)、四重循環(huán)等等。 例例5-6 打印輸出九九乘法表,按以下的格式輸出。 * 1 2 3 4 5 6 7 8 9 1 1 2 3 4 5 6 7 8 9 2 2 4 6 8 10 12 14 16 18 3 3 6 9 12 15 18 21 24 27 4 4 8 12 16 20 24 28 32 36 5 5 10 15 20 25 30 35 40 45 6 6 12 18 24 30 3

4、6 42 48 54 7 7 14 21 28 35 42 47 56 63 8 8 16 24 32 40 48 56 64 72 9 9 18 27 36 45 54 63 72 81 Program example5_6; var i,j : integer; begin write(*); for i := 1 to 9 do write(i:5); writeln; for i := 1 to 9 do begin write(i); for j := 1 to 9 do write(i*j:5); writeln; end; end. 在上述程序的執(zhí)行部分中,一至三行為打印輸出 *

5、 和1至9數字。以下是一個二重循環(huán),其中i 做的是外循環(huán),表示打印輸出的行數;j 做的是內循環(huán),表示一行內打印輸出數的個數。 例例5-7 百錢買百雞:用一百錢買一百只雞,公雞五錢一只,母雞三錢一只,小雞一錢買三只,每種雞至少買一只,編程打印輸出共有多少種不同的買法? Program example5_7; var i,j,k : integer; begin for i := 1 to 19 do for j := 1 to (100-i*5) div 3 do begin k := (100-5*I-3*j)*3; if i+j+k = 100 then writeln(i:10,j:10,

6、k:10); end; end. 在上面的程序中,我們采用的是“枚舉法”。它是計算機解題的一種常用的方法。它的基本思路是:一一枚舉各種可能的情況,并判斷那一種可能是符合要求的解。在程序中變量i代表公雞的只數,它從1變化到19,因為公雞最多只能買19只;變量j代表母雞的只數,它從1變化到(100-i*5) div 3;變量k代表小雞的只數,如果公雞的只數i和母雞的只數j確定以后,小雞的只數k可以直接求出來。如果符合百錢買百雞,就打印輸出。 例例5-8 打印“*”字三角形:從鍵盤輸入一個自然數N(1N9),根據N的值,打印輸出對應的“*”字三角形,例如: N = 4 輸出: * * * * * *

7、 * * * * * * * * * * Program example5_8; var i,j,n : integer; begin write(N = ); readln(n); for i := 1 to n do begin write(:40-i*2); for j := 1 to i do write(*:2); for j := i-1 downto 1 do write(*:2); writeln; end; end.第二節(jié)第二節(jié) while語句語句 while語句用于“當滿足某一條件時進行循環(huán)”的情況。 語句格式: while 布爾表達式 do 語句; 使用while語句要注

8、意: 1循環(huán)結束條件在進入循環(huán)體之前測試,若最初的測試值為false, 則根本不進入循環(huán)體; 2為了能使while重復能終止,循環(huán)體中一定要有影響布爾表達式的操作, 否則該循環(huán)就是死循環(huán)。 例例5-9 有一張紙,其厚度為0.1毫米,將它對折多少次,其厚度將超過珠穆朗瑪峰的高度。 Program example5_9; var i : byte; r : real; begin i := 0; r := 0.0001; while r 0 do begin s := s+n mod 10; n := n div 10; end; writeln(S = ,s);end. 例例5-11 輸入一個正

9、整數,將這個正整數的各位數倒過來,并打印輸出。 Program example5_11; var i,n,s : longint; begin write(Input N : ); readln(n); s := 0; while n 0 do begin s := s*10 + n mod 10; n := n div 10; end; writeln(S = ,s); end. 例例5-12 輸入兩個正整數,求這兩個正整數的最大公約數。 算法:采用輾轉相除法求m和n的最大公約數。即:設m = n+r (0r 0 do begin c := a mod b; a := b; b := c;

10、end; writeln(The greatest common divisor is ,a); end.例例5-13 輸入兩個正整數,求這兩個正整數的最小公倍數。 Program example5_13; var a,b,c,d : longint;begin write(A = ); readln(a); write(B = ); readln(b); d := a*b; while b 0 do begin c := a mod b; a := b; b := c; end; writeln(The lease common multiple is ,d div a);end. Whil

11、e 語句也可相嵌套,形成多重循環(huán)。 例例5-14 輸入一個大于1的自然數N,將N分解成質因數的乘積。例如:N = 120120 = 2*2*2*3*5 Program example5_14; var i,n : longint; f : boolean; begin write(N = ); readln(n); write(n, = ); f := false; i := 2 ; while n = i do begin while n mod i = 0 do begin if f then write(*) else f := true; write(i); n := n div i;

12、 end; i := i+1; end; end.例例5-15 打印輸出一百到一億之間的,既是完全平方數又是回文數的所有的正整數(完全平方數是一個正整數的平方數,回文數即為左右對稱的正整數)。例如121,它是11的平方,也是左右對稱的自然數。 Program example5_15; var i,j,m : longint; begin i := 10; while i 0 do begin m := m*10+j mod 10; j := j div 10; end; if m = i*i then writeln(i,*,i,=,i*i); i := i+1; end; end. 例例5-

13、16 求2到1000之間的素數。一行打印十個素數。 Program example5_16; var i,k,n : integer; prime : boolean; begin for i := 2 to 1000 do begin prime := true; n := trunc(sqrt(i); k := 2; while (k = n) and prime do begin if i mod k = 0 then prime := false; k := k+1; end; if prime then write(i:8); end; end. 程序中 1trunc(x)是截尾函數

14、,將實數x的小數部分截去,只取其整數部分, 返回值為整型。 2sqrt(i)是平方根函數,返回i的平方根值,返回值為實型 第三節(jié)第三節(jié) repeat語句語句 repeat語句用于“重復執(zhí)行循環(huán)體,直到指定的條件為真時為止”。 語句格式: repeat 語句1; 語句2; 語句n; until 布爾表達式; repeat重復基本上有與while重復一樣的描述循環(huán)計算的能力,但有三點不同: 1在repeat重復結構中,布爾表達式求值在計算操作之后,而在while重復結構中,布爾表達式求值在計算操作之前。 2while語句的成分語句只能是一個語句。因此,當重復動作包含幾個語句時,需用begin 和e

15、nd,使它們變成一個復合語句。而repeat 語句的保留字 repeat 和until已起語句括號作用,可以包含多個語句而無需begin和end。 3repeat重復結構中,僅當布爾表達式值為true時結束重復,而while 重復結構中,是當布爾表達式值為false時才結束重復。 一般地說;“repeat 語句 until 布爾表達式;”能用while重復結構表示: “while NOT (布爾表達式) DO 語句;” 在上述等價表示中,同樣的計算操作出現兩次。因此,當描述由計算操作后的情況確定重復是否繼續(xù)進行的計算時,通常用repeat結構描述。 例例5-17 有一大堆核桃,兩個兩個拿,余下

16、一個;三個三個拿,余下兩個;四個四個拿,余下三個;以此類推,直至九個九個拿,余下八個。問這一大堆核桃最少是幾個? Program example5_17; var i :word; begin i := 10; repeat i := i+1; until (i mod 2 = 1) and (i mod 3 = 2) and (i mod 4 = 3) and (i mod 5 = 4) and (i mod 6 = 5) and (i mod 7 = 6) and (i mod 8 = 7) and (i mod 9 = 8); writeln(i); end. 例例5-18 有四個自然數

17、,它們的和為45,而第一個數加上2,等于第二個數減去2,同時等于第三個數乘以2,也等于第四個數除以2,以次打印輸出這四個數。 Program example5_18; var i : byte; begin i := 0; repeat i := i+2; until (i-2)+(i+2)+(i div 2)+(i*2) = 45; writeln(i-2:5,i+2:5,i div 2:5,i*2:5); end. 例例5-19 求由鍵盤輸入的正整數N的所有約數的和。 Program example5_19; var n,i,s: integer; begin write(Input N

18、: ); readln(n); s := 0; i := 0; repeat i := i+1; if n mod i = 0 then s := s+i; until i = n; writeln(S = ,s); end. 例例5-20 利用格里高利公式:/4 = 1-1/3+1/5-1/7+1/9-1/11 可以求出的值。要求精確到數點后的第六位。 Program example5_20; var n,s : longint; t,pi : real; begin pi := 0; t := 1; n := 1; s := 1; repeat pi := pi+t; n := n+2;

19、s := -s; t := s/n until abs(t) 0.000001; pi := pi*4; writeln(Pi = , pi:0:6) end. 運行結果: pi = 3.141596 例例5-21 A、B兩地相距200公里,在一次軍事行動中,A、B兩支軍隊作相向運動。A軍每小時行軍5公里,B軍每小時行軍8公里。有一個騎著摩托車的通訊兵,與A軍同時出發(fā),其行駛的速度為每小時45公里,為行進中的兩軍傳遞信息。他碰到B軍后,算跑了一趟,然后折回駛向A軍;碰到A軍后,也算跑了一趟,再折回駛向B軍。如此來來回回,直至A、B兩軍之間的距離小于0.1公里為止,問通訊兵共行駛多少趟? Pro

20、gram example5_21; var s,v,t :real; n : byte; begin n := 0; s := 200; v := 8; repeat t := s/(45+v); s := s-(8+5)*t; n := n+1; v := 13-v; until s 0.1; writeln(n, Times); end. 例例5-22 尋找怪數:有一種奇怪的自然數,它的比其小的所有因子之和等于它本身,例如:6 = 1+2+3,其中1、2、3都是6的因子,編程找出10000之內的所有怪數。 Program example5_22; var i,j,s : integer;

21、begin for i := 2 to 10000 do begin s := 1; for j := 2 to i div 2 do if i mod j = 0 then s := s+j; if s = i then writeln(i); end; end. 例例5-23 設有一個NM方格的棋盤(1N100,1M100)。求出該棋盤中包含有多少個正方形、多少個長方形(長方形不包括正方形)。例如:當N = 2,M = 3時: 正方形的個數有8個:即邊長為1的正方形有6個;邊長為2的正方形有2個。 長方形的個數有10個: 21的長方形有4個: 12的長方形有3個: 31的長方形有2 個:

22、32的長方形有1個: 輸入輸出示例: N = 2 M = 3 ZFX = 8 CFX = 10 Program example5_23; var i,j,m,n : word; zf,cf : longint; begin repeat write(N = ); readln(n); write(M = ); readln(m); until (n = 100) and (m = 100); zf := 0; cf := 0; for i := 1 to n do for j := 1 to m do if i = j then zf := zf+(m+1-j)*(n+1-i) else cf

23、 := cf+(m+1-j)*(n+1-i); writeln(zfx = ,zf); writeln(cfx = ,cf); end. 例例5-24 在如圖所示的方格中,不重復地填入數字1、2、3、4、5、6。 要求右邊的數字比左邊的數字大,下邊的數字比上邊的數字大,編程 打印輸出各種填寫方法。 Program example5_24; var a,b,c,d : byte; begin for a := 2 to 3 do for b := a+1 to 5 do for d := a+1 to 5 do if b d then begin c := 14-a-b-d; if c d th

24、en begin writeln(1:2,a:2,b:2); writeln(c:2,d:2,6:2); writeln(_); end; end; end. 例例5-25 有一個自然數,它的各位數字的和,能被17整除。這個數的后繼數(即這個數加1)的各位數字的和,也能被17整除。求具有這種特性的最小的那個自然數。 Program example5_25; var f : boolean; i,s,m,t : integer; begin f := false; i := 1; repeat i := i+1; s := 0; m := i; while m 0 do begin s := s

25、+ m mod 10; m := m div 10; end; if s mod 17 = 0 then begin s := 0; m := i+1; while m 0 do begin s := s+ m mod 10; m := m div 10; end; if s mod 17 = 0 then f := true; end; until f; writeln(i); end. 例例5-26 哥德巴赫猜想指出:任何一個大于6的偶數,都可以表示成兩個素數的和。例如:8 = 3+5,44 = 13+31 等。試編程在6至100范圍內驗證哥德巴赫猜想。 Program example5_

26、26; var i,j,k,m,n : integer; f,b : boolean; begin i := 6; repeat j := 3; f := true; while (j = i div 2) and f do begin b := true; k := i-j; m := 2; n := trunc(sqrt(k); while b and (m 100; end. 例例5-27 在如圖所示的圓圈中,不重復地填入數字1、2、3、4、5、6。要求每條邊上三個數之和都相同,編程打印輸出各種填法。Program example5_27;var s,n,a,b,c,d,e,f : in

27、teger;begin n := 0; for a := 1 to 6 do for b := 1 to 6 do if b a then for c := 1 to 6 do if (c a) and (c b) then for d := 1 to 6 do if (d a) and (d b) and (d c) then for e := 1 to 6 do if (e a) and (e b) and (e c) and (e d) then begin f := 21-a-b-c-d-e; s := a+b+c; if (c+d+e = s) and (a+f+e = s) the

28、n begin n := n+1; writeln(No.,n:2, : ,a:4); writeln(b:10,f:4); writeln(c:8,d:4,e:4); readln; end; end;end.例例5-28 下面的地圖共有12個區(qū)域,用四種不同的顏色去著色,要求相鄰區(qū)域的顏色不可相同,編程打印輸出各種不同的著色方案。Program example5_28;var n,a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12 : byte;begin n := 0; for a1 := 1 to 4 do for a2 := 1 to 4 do if a1a

29、2 then for a3 := 1 to 4 do if (a3a1) and (a3a2) then for a4 := 1 to 4 do if (a4a1) and (a4a3) then for a5 := 1 to 4 do if (a5a4) and (a5a1) then for a6 := 1 to 4 do if (a6a1) and (a6a5) and (a6a2) then for a7 := 1 to 4 do if (a7a2) and (a7a6) then for a8 := 1 to 4 do if (a8a2) and (a8a3) and (a8a7) then for a9 := 1 to 4 do if (a9a3) and (a9a4) and (a9a8) t

溫馨提示

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

評論

0/150

提交評論