while循環(huán)和repeat-until循環(huán).ppt_第1頁
while循環(huán)和repeat-until循環(huán).ppt_第2頁
while循環(huán)和repeat-until循環(huán).ppt_第3頁
while循環(huán)和repeat-until循環(huán).ppt_第4頁
while循環(huán)和repeat-until循環(huán).ppt_第5頁
已閱讀5頁,還剩15頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

while循環(huán)和 repeat-until循環(huán),主講人:山成虎,1. while循環(huán),2. repeat-until循環(huán),3.多重循環(huán)結構,對于for循環(huán)有時也稱為計數(shù)循環(huán),當循環(huán)次數(shù)未知,只能根據(jù)某一條件來決定是否進行循環(huán)時,用while 語句或repeat語句實現(xiàn)循環(huán)要更方便。,1. while循環(huán),1.1while語句的形式為: while do ;,其意義為:當布爾表達式的值為true時,執(zhí)行do后面的語句。,1.2 while語句的執(zhí)行過程為: 判斷布爾表達式的值,如果其值為真,執(zhí)行步驟2,否則執(zhí)行步驟4; 執(zhí)行循環(huán)體語句(do后面的語句); 返回步驟1; 結束循環(huán),執(zhí)行while的下一個語句。,說明:這里while和do為保留字,while語句的特點是先判斷,后執(zhí) 行。當布爾表達式成立時,重復執(zhí)行do后面的語句(循環(huán)體)。,例 1: 求s=1+2+99+100.,program xy; var i,sum:interger; begin i:=1; sum:=0; while i=100 do begin sum:=sum+i; i:=i+1; end; writeln(sum); end.,i=100,sum:=sum+i i:=i+1;,真(非0),假(0),1.3 舉例,下一條語句 (循環(huán)語句結束),例2 :求恰好使s=1+1/2+1/3+1/n的值大于10時n的值。,分析:“恰好使s的值大于10“意思是當表達式s的前n-1項的和小于或等于10,而加上了第n項后s的值大于10。從數(shù)學角度,我們很難計算這個n的值。故從第一項開始,當s的值小于或等于10時,就繼續(xù)將下一項值累加起來。當s的值超過10時,最后一項的項數(shù)即為要求的n。,program xy; var s : real; n : integer;n表示項數(shù) begin s:=0.0;n:=0; while s=10 do當s的值還未超過10時 begin n:=n+1;項數(shù)加1 s:=s+1/n;將下一項值累加到s end; writlen(n);輸出結果 end.,例3:求兩個正整數(shù)m和n的最大公約數(shù)。,分析:求兩個正整數(shù)的最大公約數(shù)采用的輾轉相除法求解。以下是輾轉的算法: 分別用m,n,r表示被除數(shù)、除數(shù)、余數(shù)(一般mn)。 求m/n的余數(shù)r. 若r=0,則n為最大公約數(shù).若r0,執(zhí)行第步. 將n的值放在m中,將r的值放在n中. 返回重新執(zhí)行第步。,program xy; var m,n,a,b,r:integer; begin readln(m,n); a:=m;b:=n;r:=a mod b; while r0 do begin a:=b;b:=r; r:=a mod b; end; writeln(b:8); end.,求兩個正整數(shù)m和n的最小公 倍數(shù),可以用m*n div (m和n的 最大公約數(shù)).例如:6和4的最小公倍數(shù),可以用 6*4 div 2=12 .,例4:利用格里高公式求。/4=1-1/3+1/5-1/7+,直到最后一項的值小于10-6為止。,【分析】解本題的關鍵就是求右邊數(shù)值序列的和,序列有明顯的特點:分母是從1開始的奇數(shù),加、減號輪流出現(xiàn),因此,我們可以用n=n+2表示序列數(shù)值的變化,用f=-f來設置它們知項的符號位。,program xy; var n,f : integer; t,pai : real; begin pai : =0; t : =1; n : =1;f : =1; while abs(t)=1e-6 do begin pai : =pai+t;n : =n+2;f : =-f; t : =f/n; end; pai : =pai*4; writeln(pai : 10 : 8); end.,運行程序會發(fā)現(xiàn)沒有結果,為什么?因為布爾表達式abs(t)=1e-6,即1/n=1e-6,而程序的說明部分n是整型數(shù),它的范圍是-3276832767,條件永遠成立,所以形成死循環(huán),從而沒有運行結果。while循環(huán)不需要用順序型數(shù)據(jù)來控制循環(huán)的次數(shù),改程序的說明部分中的n為實型數(shù)或說明為長整型即可,請同學們自己修正,以后要對變量的取值范圍引起重視。,2. repeat-until循環(huán),用while語句可以實現(xiàn)“當型循環(huán)“,用repeat-until 語句可以實現(xiàn)“直到型循環(huán)“。repeat-until語句的含義是:“重復執(zhí)行循環(huán),直到指定的條件為真時為止“。,2.1 repeat-until語句一般格式,repeat ; : ; until ;,其中repeat、until是Pascal保留字,repeat與until之間的所有語句稱 為循環(huán)體。,2.2 說明,(1)repeat語句的特點是:先執(zhí)行循環(huán),后判斷結束條件,因而至少要執(zhí)行一次循環(huán)體。 (2)repeat-until是一個整體,它是一個(構造型)語句,不要誤認為repeat是一個語句, until是另一個語句。 (3)repeat語句在布爾表達式的值為真時不再執(zhí)行循環(huán)體,且循環(huán)體可以是若干個語句,不需用begin和end把它們包起來, repeat 和until已經(jīng)起了begin和end的作用。while循環(huán)和repeat循環(huán)是可以相互轉化的。 (4)在repeat和until之間的語句構成循環(huán)。在它們之間可以有任意多個語句,這一點和for,while循環(huán)不同, for,while循環(huán)體在語法上只允許一條語句。要想循環(huán)多條語句必須用復合語句。,2.3repeat-until語句的執(zhí)行過程,(1)遇到repeat語句后,即進入循環(huán)體,順序執(zhí)行循環(huán)體內的語句。 (2)遇到until語句后,求布爾表達式的值。若值為假,則返回步 驟1;若為“真”,執(zhí)行步驟3 (3)循環(huán)結束,執(zhí)行until后面的下一條語句。,例 5: 求s=1+2+99+100.,program xy; var i,sum:interger; begin i:=1; sum:=0; repeat sum:=sum+i; i:=i+1; until i100; writeln(sum); end.,i100,sum:=sum+i i:=i+1;,假(false),真(true),2.4舉例,下一條語句 (循環(huán)語句結束),例6 求兩個正整數(shù)m和n的最大公約數(shù)。 程序采用repeat-until循環(huán)實現(xiàn)。,program xy; var m,n,r : integer; begin readln(m,n); repeat /輾轉相除法 r : =m mod n; m: =n; n: =r; until r=0; writeln(m); end.,為什么用while語句結果是n, repeat until語句結果是m?,例7 校體操隊到操場集合,排成每行2人,最后多出1人;排成每行3人,也多出1人;分別按每行排4,5,6人,都多出1人;當排成每行7人時,正好不多。求校體操隊至少是多少人?,【分析】設校體操隊為X人,根據(jù)題意X應是7的倍數(shù),因此X的初值為7,以后用inc(x,7)改變X值;為了控制循環(huán), 用邏輯變量yes為真(True) 使循環(huán)結束; 如果諸條件中有一個不滿足, yes 的值就會為假(false),就繼續(xù)循環(huán)。,program xy; var x: integer; 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進行判斷時,都得到“通過”(此處不賦假值)才能保持真值。此處的yes相當于一個標志變量。,以上我們已介紹了三種循環(huán)語句。一般說來,用for 循環(huán)比較簡明,只要能用for循環(huán),就盡量作用for循環(huán)。只在無法使用for循環(huán)時才用while循環(huán)和repeat-until循環(huán), 而且 while 循環(huán)和repeat-until循環(huán)是可以互相轉化的,具體用哪個,還要看個人喜好,但他們也存在細微區(qū)別,while語句的循環(huán)體有可能一次都不會被執(zhí)行,而repeat語句中循環(huán)體至少執(zhí)行一次。for 循環(huán)在大多數(shù)場合也能用while和repeat-until循環(huán)來代替。一般for循環(huán)用于有確定次數(shù)循環(huán),而while和repeat-until循環(huán)用于未確定循環(huán)次數(shù)的循環(huán)。,當一個循環(huán)的循環(huán)體中又包含循環(huán)結構程序時,我們就稱之為循環(huán)嵌套。 內循環(huán)整個作為外循環(huán)的一條語句。,3. 多重循環(huán)結構,3.1 舉例,例8 求1!+2!+10!的值。,【分析】這個問題是求10自然數(shù)的階乘之和,可以用for 循環(huán)來實現(xiàn)。程序結構如下: for n:=1 to 10 do begin N!的值t 累加N!的值s end 顯然,通過10次的循環(huán)可求出1!,2!,10!,并同時累加起來, 可求得S的值。而求T=N!,又可以用一個for循環(huán)來實現(xiàn): t=1; for j:=1 to n do t:=t*j;,整個程序為: Program xy; var t,s:longint; i,j,n:integer; begin s:=0; for n:=1 to 10 do begin t=1; for j:=1 to n do /求n! t:=t*j; s:=s+t; /累加n! end; writeln(s=,s:0:0); end.,以上的程序是一個二重的for循環(huán)嵌套。這是比較好想的方法,但實際上對于求n!,我們可以根據(jù)求出的(n-1)!乘上n即可得到,而無需重新從1再累乘到n。,程序可改為: program ex4_17; var t,s:longint; i,j,n:integer; begin s:=0;t:=1; for n:=1 to 10 do begin t:=t*n; /t為上一個數(shù)n-1的階乘值,再乘以n即為n! s:=s+t; /累加n! end; writeln(s=,s:0:0); end.,顯然第二個程序的效率要比第一個 高得多。第一程序要進行1+2+ 10=55次循環(huán),而第二程序進行10次 循環(huán)。如題目中求的是1!2! 1000!,則兩個程序的效率區(qū) 別更明顯。,例9 一個炊事員上街采購,用500元錢買了90只雞, 其中母雞一只15元,公雞一只10元,小雞一只5元,正好把錢買完。問母雞、公雞、小雞各買多少只?,分析:設母雞I只,公雞J只,這里I的值可以是0到33,J的值可以0到50,則小雞為90-I-J只,則15*I+ 10* J+(90-I-J)*5=500,顯然一個方程求兩個未知數(shù)是不能直接求解。必須組合出所有可能的i,j值,看是否滿足條件。,programr xy; var i,j,k:integer; begin for i:=0 to 33 do /枚舉母雞的數(shù)量 for j:=0 to 50 do /枚舉公雞的數(shù)量 begin k:=90-i-j; if 15*i+10*j+5*k=500 then writeln(i:5,j:5,k:5); end; end.,例10 求100200之間的所有素數(shù)。,分析:我們可對100200之間的每一整數(shù)進行判斷,判斷它是否為素數(shù),是則輸出。而對于任意整數(shù)i,根據(jù)素數(shù)定義,我們從2開始,到 ,找i的第一個約數(shù)。若找到第一個約數(shù),則i必然不是素數(shù)。否則i為素數(shù)。,program xy; var i : integer; x : integer; begin for i:=100 to 200 do begin x:=2; while (x0)do begin x:=x+1; end; if xtrunc(sqrt(i) then write(i:8); end; end.,例11 試編寫能夠打印輸出如下圖形的程序: # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #,program xy; var i,j,k : integer; begin for i : =8 downto 1 do /

溫馨提示

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

評論

0/150

提交評論