循環(huán)結(jié)構(gòu)與數(shù)組_第1頁
循環(huán)結(jié)構(gòu)與數(shù)組_第2頁
循環(huán)結(jié)構(gòu)與數(shù)組_第3頁
循環(huán)結(jié)構(gòu)與數(shù)組_第4頁
循環(huán)結(jié)構(gòu)與數(shù)組_第5頁
已閱讀5頁,還剩23頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、2021/8/141循環(huán)結(jié)構(gòu)與數(shù)組2021/8/142循環(huán)結(jié)構(gòu) 循環(huán)控制結(jié)構(gòu)為計(jì)算機(jī)程序描述重復(fù)計(jì)算提供控制手段。一個循環(huán)控制結(jié)構(gòu)需指明以下三件事情中的兩件: 被循環(huán)執(zhí)行的語句; 是否循環(huán)的條件; 詳細(xì)指明循環(huán)方式。 在PASCAL語言,用while,repeat和for三種語句描述循環(huán)控制結(jié)構(gòu)2021/8/143例:求S=1+2+3+100的值S:=S+1S:=S+2S:=S+100S:=S+i (i=1,2,100)分析:用S統(tǒng)計(jì)所有的和,如果每次加一個數(shù)值,需要做100次賦值。從上面的語句可以看出:上述這100個賦值語句有一個共同的特點(diǎn),都可以抽象成S:=S+i的形式。其中i從1變化到1

2、00。為了簡化程序設(shè)計(jì),因此有必要采用可以用來重復(fù)運(yùn)行某些語句段的程序結(jié)構(gòu)這就是循環(huán)結(jié)構(gòu)。2021/8/144計(jì)數(shù)循環(huán)For 語句For For 語句有兩種形式,它們的格式分別是:語句有兩種形式,它們的格式分別是:(1)遞增循環(huán):for 控制變量 := to do (2)遞減循環(huán):for 控制變量 := downto do 2021/8/145For循環(huán)語句使用說明:(1)我們一般把表達(dá)式1稱為記數(shù)循環(huán)的初值,表達(dá)式2稱為記數(shù)循環(huán)的終值。(2)for語句中的初值、終值、控制變量的數(shù)據(jù)都必須是順序類型,且類型賦值相容。(3)當(dāng)初值和終值確定后,循環(huán)的次數(shù)就確定不變了,并且在重復(fù)語句內(nèi)不能對控制變

3、量施加任何賦值操作。(4)Do后面的語句可以是任何一種語句,我們一般稱其為循環(huán)體。2021/8/146例:求S=1+2+3+100的值 程序代碼段:Var i,s:integer;begin S:=0; For i:=1 to 100 do s:=s+i; Writeln(s=,s);End.S:=S+1S:=S+2S:=S+100S:=S+i (i=1,2,100)分析:用S統(tǒng)計(jì)所有的和,如果每次加一個數(shù)值,需要做100次賦值。從上面的語句可以看出:上述這100個賦值語句有一個共同的特點(diǎn),都可以抽象成S:=S+i的形式。其中i從1變化到100。為了簡化程序設(shè)計(jì),因此有必要采用可以用來重復(fù)運(yùn)行

4、某些語句段的程序結(jié)構(gòu)這就是循環(huán)結(jié)構(gòu)。2021/8/147 例:按正、反兩種順序輸出26個大寫英文字母var ch:char;begin for ch:= A to Z do write(ch); writeln; for ch:=Z downto A do write(ch);end.2021/8/148例:例:NocomachnsNocomachns定理定理任何一個n3一定可以表示成n個連續(xù)的奇數(shù)和。輸入n(n100),輸出n3對應(yīng)的表達(dá)式。題解題解 設(shè)表達(dá)式中的最小奇數(shù)為x。 當(dāng)n=1時,最小奇數(shù)x=1,1個奇數(shù);n=2時,最小奇數(shù)x=3,2個奇數(shù);n=3時,最小奇數(shù)x=7,3個奇數(shù);當(dāng)n

5、=k時,最小奇數(shù)x前已有1+2+k-1個奇數(shù),第k個奇數(shù)x=12*2)1(*kk=k*(k-1)+1=n*(n-1)+1。var i,n,a:longint; 循環(huán)變量,連續(xù)的奇數(shù)個數(shù),當(dāng)前項(xiàng),類型為長整型begin readln(n); 輸入連續(xù)的奇數(shù)個數(shù) a:=(n*(n-1)+1; 計(jì)算最小奇數(shù) for i:=1 to n-1 do 輸出表達(dá)式的前n-1項(xiàng)begin write(a,+);a:=a+2; end; writeln(a); 輸出第n項(xiàng) readln;end.main2021/8/149例:百雞問題例:百雞問題 一只公雞值5錢,一只母雞值3錢,而1錢可買3只小雞?,F(xiàn)有100錢

6、,想買100只雞。問可買公雞、母雞、小雞各幾只? 我們通過兩重for循環(huán)枚舉出公雞和母雞的所有可能只數(shù)。在確定當(dāng)前公雞只數(shù)為i、母雞只數(shù)為j的情況下, 計(jì)算小雞只數(shù)k=100-i-j。然后通過下述布爾表達(dá)式i*5+j*3+k/3=100判斷當(dāng)前100只雞的總價值是否為100錢。如果是,則輸出i、j和k。var i,j,k:integer;beginfor i:=1 to 20 do for j:=1 to 33 do begin k:=100-i-j; if i*5+j*3+k/3=100 then writeln(i:5,j:5,k:5); end;for readln;end.main20

7、21/8/1410FOR循環(huán)上機(jī)練習(xí)題 1.求N!=1*2*3*N。(N7) 2.找出100以內(nèi)所有被2、3、5除余數(shù)均為1的數(shù) 3.求100999之間的所有水仙花數(shù)。所謂水仙花數(shù),是該數(shù)等于它各位數(shù)字的立方和。例如:153=13+53+33。習(xí)題一參考程序var i,n:integer; sum:integer;begin write(input n:); readln(n); sum:=1; for i:=1 to n do sum:=sum*i; writeln(n,!=,sum);end.習(xí)題2參考程序vari,n,s:integer;beginfor i:=1 to 100 do i

8、f (i mod 2=1) and (i mod 3=1) and (i mod 5=1) then writeln(i);end.var m,a,b,c:integer;beginfor m:=100 to 999 do begin a := m div 100; b := (m-a*100) div 10; c := m mod 10; if a*a*a + b*b*b + c*c*c = m then writeln(m) endend.2021/8/1411條件循環(huán) For循環(huán)語句適用于已知次數(shù)的循環(huán)結(jié)構(gòu),但有時我們判斷是否結(jié)束循環(huán)的依據(jù)是某個條件是否滿足,比如“當(dāng)時就做”,或者是“一

9、直做到時為止”,這種循環(huán)我們稱之為條件循環(huán)。在Pascal中條件循環(huán)語句有兩種,分別是While循環(huán)語句和Repeat循環(huán)語句。接下來我們就分別介紹這兩種語句的使用方法。2021/8/1412while語句 while語句用于“當(dāng)滿足某一條件時進(jìn)行循環(huán)”的情況,因此它也被稱為“當(dāng)型循環(huán)”。while語句的語法格式如下: while do while循環(huán)語句的執(zhí)行流程如圖。布爾表達(dá)式循環(huán)體falsetruewhile循環(huán)語句執(zhí)行流程While語句使用說明:(1)當(dāng)布爾表達(dá)式為true則執(zhí)行循環(huán)體,若為false,則根本不進(jìn)入循環(huán)體。(2)如果一開始布爾表達(dá)式的值就為假時,while循環(huán)就會一次循

10、環(huán)體都不執(zhí)行。(3)相反的,如果布爾表達(dá)式永遠(yuǎn)是真的,那么循環(huán)就無法結(jié)束,從而成為“死循環(huán)”。為了避免這種情況的發(fā)生,在循環(huán)體中就一定要有能改變布爾表達(dá)式結(jié)果的操作。2021/8/1413repeat語句Repeat 語句用于“重復(fù)執(zhí)行循環(huán)體,一直到指定的條件為真時為止”的循環(huán)結(jié)構(gòu),它又被稱為“直到型循環(huán)”。Repeat語句的語法格式為: repeat 循環(huán)體語句 until 布爾表達(dá)式repeat循環(huán)語句的執(zhí)行流程見圖。布爾表達(dá)式循環(huán)體truefalse圖 repeat循環(huán)語句執(zhí)行流程Repeat語句使用說明:(1)先執(zhí)行循環(huán)體,然后判斷當(dāng)布爾表達(dá)式的值,為false,則繼續(xù)循環(huán),為true

11、則終止循環(huán)。(2)為了能使repeat循環(huán)重復(fù)能終止,與while循環(huán)一樣,循環(huán)體中一定要有影響布爾表達(dá)式的操作,否則該循就是一個死循環(huán)。(3)與while循環(huán)不一樣的是,repeat循環(huán)不管布爾表達(dá)式是否成立,都會至少執(zhí)行一次循環(huán)體。另外需要說明的是,由于while循環(huán)與repeat語句都屬于條件循環(huán)語句,因此一般可以將這兩種語句互相轉(zhuǎn)換,而具體使用哪條語句時要看實(shí)際情況決定。2021/8/1414例:求某年后的第例:求某年后的第n(nn(n1)1)個閏個閏年年 輸入y和n 輸出y年后第n個閏年的年號題解題解 若y能被4整除但不能被100整除或y能被400整除,則y是閏年。由此得出判斷y是閏

12、年的布爾表達(dá)式 (y mod 4=0) and (y mod 1000) or (r mod 400=0)開始時逐年判斷。一旦確定y年為閏年的話,則下一個閏年為y+4*s(s1),即每相隔4年后才可能有一個閏年。因此設(shè)步長變量s。初值為1;當(dāng)找到第一個閏年后,s改為4。2021/8/1415var y,n,s:integer; 年號、間隔的閏年數(shù)、布長值begin write(begining year and numbers:); readln (y,n); 輸入年號和間隔的閏年數(shù) s:=1; 步長值初始化 repeat if (y mod 4=0)and (y mod 1000)or (y

13、 mod 400=0) then begin 若y是閏年,則輸出年號 writeln (y,year); _ s:=4; 步長值設(shè)為4 end;then _Until _end. mainvar y,n,s:integer; begin write(begining year and numbers:); readln (y,n); s:=1; while n0 do begin if (y mod 4=0)and (y mod 1000) or (y mod 400=0) then begin writeln (y,year); n:=n-1; s:=4; end;then y:=y+s;

14、endEnd.n:=n-1; 間隔的閏年數(shù)-1y:=y+s; 移至s年后n=0; 直至輸出了n個閏年為止2021/8/1416例:計(jì)算Sum=1+3+5+n(n為大于1的奇數(shù)),求當(dāng)Sum10000時,n的最大值Var n,sum,:integer;begin write(input a odd data:); sum:=0; n:=1; writeln(sum) end.while sum10000 dowhile sum=10000拓展:若求當(dāng)SUMM時,n的最大取值呢2021/8/1417循環(huán)使用的一些說明循環(huán)的強(qiáng)制終止循環(huán)的強(qiáng)制終止一般來說,只要循環(huán)的條件及循環(huán)體描述得當(dāng),循環(huán)都能順利

15、結(jié)束,不會產(chǎn)生死循環(huán)的。有時在程序運(yùn)行中會有一些特殊的情況,需要終止當(dāng)前循環(huán)的執(zhí)行,如果將這個條件寫到循環(huán)體外有不太方便,這時可以使用break來強(qiáng)制終止當(dāng)前循環(huán)的執(zhí)行。WhileWhile與與RepeatRepeat語句對比語句對比while和repeat語句一般情況下可以相互替換。它們的主要區(qū)別是:while是先判斷后執(zhí)行,而repeat是先執(zhí)行后判斷,因此while語句的循環(huán)體有可能一次也不執(zhí)行,而repeat語句至少執(zhí)行一次;前者是當(dāng)條件滿足時執(zhí)行,而后者是當(dāng)條件不滿足時執(zhí)行;前者的循環(huán)體是復(fù)合語句時要用begin、end,而后者卻不一定要用。2021/8/1418條件控制循環(huán)練習(xí)1、

16、輸入一串字符,以“?”結(jié)束,輸出其中小寫字母個數(shù)與數(shù)字個數(shù)。2、從2開始,輸出50個素?cái)?shù)3、利用泰勒公式求e的值,直到最后一項(xiàng)小于10-7為止。泰勒公式如下e=1+1/1!+1/2!+1/3!+1/n!var ch:char; n1,n2:integer;begin n1:=0;n2:=0; read(ch); while ch ? do begin if (ch=a) and (ch= 0) and (ch= 9) then n2:=n2+1; read(ch) end; writeln(number of letter:,n1); writeln(number of digit:,n2)e

17、nd.Var n,I,j:integer; flag:boolean;Begin n:=2;i:=1; while i=50 do begin flag:=false; j:=2; while j=trunc(sqrt(n) do beginend; if n mod j=0 then begin flag:=true; break; j:=j+1; end ; if flag=false then begin write(n:4); if (I mod 10=0) then writeln; i:=i+1; end; n:=n+1; end;End.var e,p:real; i:integ

18、er;begin e:=1;p:=1;i:=1; repeat p:=p/i; e:=e+p; i:=i+1 until p1e-7; writeln(e=,e)end.2021/8/1419利用循環(huán)輸出各種規(guī)則圖形任意輸入一個大寫的英文字母,按菱形的方式輸出。圖為輸入D時的顯示結(jié)果AABAABCBAABCDCBAABCBA ABAA2021/8/1420利用循環(huán)輸出各種規(guī)則圖形 對于平面規(guī)則圖案的輸出,一般用一個兩重循環(huán)來實(shí)現(xiàn),在實(shí)現(xiàn)時我們主要從以下幾個方面來考慮: 有多少行,一般用外循環(huán)來控制;1.每一行的起始位置跟行有什么關(guān)系,通常是用write(:有關(guān)行的表達(dá)式)的形式來控制輸出的空格

19、數(shù);2.每一行有多少個輸出項(xiàng)(列),用內(nèi)循環(huán)來控制輸出;3.具體一個輸出項(xiàng)跟行、列有什么關(guān)系,直接輸出相關(guān)輸出項(xiàng)有關(guān)行和列的表達(dá)式。2021/8/1421數(shù)組在代數(shù)上我們常常這樣寫:a1,a2.ai.a100(0i101),通過i來指明具體的ai,如i=10時代表a10,在pascal語言里我們也希望能夠類似地描述。從前面的變量名里我們已經(jīng)知道,a1,a2.ai彼此之間是相互獨(dú)立的,并沒有必然的聯(lián)系。如要象代數(shù)上那樣,可以使用數(shù)組。數(shù)組其實(shí)是一組相同值類型的變量的集合,這些變量共用一個名,彼此之間通過下標(biāo)來區(qū)別。如定義了數(shù)組a,它的下標(biāo)可以從1到100,那么就可以直接通過ai來指明第i個量,如

20、i=10,ai指的是a10。數(shù)組的說明數(shù)組的說明可以先通過 type 標(biāo)識符=array下標(biāo)范圍 of 值類型;然后再在變量說明里引用。 如:type array1=array1.100 of integer; var a,b:array1;也可以直接在變量說明里說明:變量名:array下標(biāo)范圍 of 值類型; 如:var a,b:array1.100 of integer; 描述下標(biāo)范圍一般通過離散(有序)類型,如從一個整數(shù)到另一個整數(shù),或者從一個字符到另一個字符等。如: var a:array-5.5 of integer; c:array1.20 of char;d:arraya.z o

21、f integer;數(shù)組元素值類型本身也可以是復(fù)雜的自定義類型,如子界類型,數(shù)組類型,記錄等2021/8/1422例:用篩法求100以內(nèi)的素?cái)?shù)分析:素?cái)?shù)是除了1和它本身以外沒有其它約數(shù)的數(shù)。用篩法求素?cái)?shù)的方法是:用質(zhì)數(shù)篩去合數(shù):從第一個素?cái)?shù)2開始,把它的倍數(shù)去掉;這樣2以后的第一個非0數(shù)就一定也是素?cái)?shù),把它的倍數(shù)也刪了重復(fù)這個刪數(shù)過程,直到在所找到的素?cái)?shù)后再也找不到一個非0數(shù)。把所有非0數(shù)輸出。2021/8/1423例:計(jì)算燈的開關(guān)狀態(tài)例:計(jì)算燈的開關(guān)狀態(tài) 有N個燈放在一排,從1到N依次順序編號。有N個人也從1到N依次編號。1號將燈全部關(guān)閉,2將凡是2的倍數(shù)的燈打開;3號將凡是3的倍數(shù)的燈作相

22、反處理(該燈如為打開的, 則將它關(guān)閉;如關(guān)閉的,則將它打開)。以后的人都和3號一樣,將凡是自己編號倍數(shù)的燈作相反處理。試計(jì)算第N個操作后,哪幾盞燈是點(diǎn)亮的。(0-表示燈打開,1-表示燈關(guān)閉)題解題解 設(shè)布爾數(shù)組a為n盞燈的狀態(tài)。初始時,所有的燈打開,即a數(shù)組的每一個元素設(shè)為false。然后依次將每盞燈序號的倍數(shù)作取反處理,由此得出的a數(shù)組元素的序數(shù)值即為最后的燈狀態(tài)。var k,n,i,j:integer;a:array1.100of boolean; N盞燈的狀態(tài)begin readln (n); 讀入燈的數(shù)目 for i:=1 to n do ai:=false; 初始時所有燈打開 for

23、 i:=1 to n do 依次進(jìn)行n次操作 begin j:=i; 從第i號隊(duì)員出發(fā)進(jìn)行第i次操作 while j=n do begin aj:=not(aj);j:=j+i; 將凡是i的倍數(shù)的燈作取反處理 end;while end;for for i:=1 to n do write(ord(ai); 輸出n次操作后的結(jié)果 writeln;end.main2021/8/1424字符串在Pascal中,字符類型只可以處理一個字符的內(nèi)容,而實(shí)際生活中我們經(jīng)常要處理到的是大量的字、詞、句等文字信息。為了使程序能夠處理這些文字信息,Turbo Pascal特別引入了字符串類型,即一組具有可變長度的字符序列。 字符串類型定義形式為: stringn或者string字符串可以參加的運(yùn)算有:連接運(yùn)算、關(guān)系運(yùn)算和賦值運(yùn)算三種。連接運(yùn)算是用“+”符號將兩個字符串連接成一個字符串,如:“Turbo”+“Pascal”的結(jié)果為“TurboPascal”。字符串的關(guān)系運(yùn)算用于字符串的比較,字符串的比較是按字典順序進(jìn)行的,其結(jié)果是一個布爾值。以下字符串的關(guān)系運(yùn)算結(jié)果均為true:ABC= ABCABCabcPascal

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論