在if語句中,如果then子句或else子句仍然是if語句,則稱為if語句嵌套。
例1計算以下函數
解析:根據輸入的x值,分為x & gt0和x≤0,然後對於x≤0,區分x是小於0還是等於0。
源程序如下:
程序ex;
定義變量
x:真實;
y:整數;
開始
wrtie(' Input x:');readln(x);
如果x & gt0,則y:= 1 { x & gt;0,y的值是1}
Else {當x ≤ 0時}
如果x=0,那麽y:=0
else y:=-1;
writeln('x= ',x:6:2,' y= ',y);
結束。
顯然,在上面的程序中,壹個type II if語句嵌套在then子句中。當然,程序也可以寫成以下形式:
程序ex;
定義變量
x:真實;y:整數;
開始
wrtie(' Input x:');readln(x);
如果x & gt那麽=0
如果x & gt0然後y:=1
否則y:=0
else y =-1;
writeln('x= ',x:6:2,' y= ',y);
結束。
但是對於這個問題,下面的程序是錯誤的。
y:= 0;
如果x & gt那麽=0
如果x & gt0然後y:=1
else y:=-1;
顯然,從這個人的編程格式可以看出,他想把else和第壹個if配對,但實際上,這是錯誤的。因為pascal規定else與它上面最近的then配對,所以上面程序段的邏輯意義與題意不壹致。
要將上部程序段中的esle與第壹個then配對,程序段應修改為:
y:= 0;或者y:= 0;
如果x & gt如果x & gt=0
那麽如果x & gt那麽0
那麽y:=1開始
else if x & gt0那麽Y:= 1;
else y:=-1;結束
else Y:=-1;
二、案例陳述
以上,我們知道可以使用嵌套的if語句實現多分支選擇結構。但是如果分支越來越多,用嵌套的if語句實現多個分支會很復雜。當多分支選擇的每個條件由同壹表達式的不同結果值決定時,可以通過case語句實現。它的選擇過程很像多路開關,即case語句的選擇表達式的值決定了切換到哪個語句工作。因此,在分支結構編程中,它是壹種強有力的手段。在實現多路分支控制時,用case處理和設計壹些問題,比用if語句編寫程序更簡潔明了。
(壹)、情況說明的壹般形式:
案例& lt表達式>的
& lt情況標簽表1 >;:語句1;
& lt情況標簽表2 & gt:聲明2;
:
& lt情況標簽表n & gt:陳述n
結束;
其中,case、of和end是Pascal的保留字,表達式的值必須是序列類型,可以是整數類型、布爾類型和後來學過的字符類型、枚舉類型和子邊界類型。情境標簽表是壹系列用逗號分隔的常數序列,與表達式類型壹致。語句可以是任何語句,包括復合語句和空語句。
(2)、case語句的執行過程
先計算表達式(稱為情境表達式)的值。如果其值等於壹個常數(稱為情境常數,也稱為情境標簽),則執行情境常數後的語句。執行完語句後,跳轉到case語句的末尾。
(3)描述
①情境表達必須是順序型的;
②情境常數是情境表達式的可能值,因此應該與情境表達式具有相同的類型;
③情境常數出現的順序可以是任意的;
④同壹情況下的常數不能在同壹case語句中出現兩次或多次;
⑤每個子句前,可以有壹個或幾個用逗號分隔的情境常數;
⑥如果情況表達式的值不在情況的範圍內,則認為該case語句無效,執行case語句的下壹條語句。turbo pascal中增加了壹個“否則”的情況,即增加了壹個else子句,但也可以保存。
⑦每個常量後面只能跟壹個語句或復合語句。
例2根據x的值,求函數y的值:
解析:用case語句編程的關鍵是巧妙構造情境表達式。在這個例子中,可以用壹個表達式來區分三種情況:Trunc(x/100)。因為x在(0 ~ 100)之間時表達式值為0;當x為[100,200]時,表達式值為1;剩下的可以用else子句表示。
源程序如下:
程序ex;
var x,y:實數;
開始
write('輸入x:');readln(x);
的行李箱c(x/100)
0:y:= x+1;
1:y:= x-1;
else y:= 0;
結束;{案例結束}
writeln('x= ',x:8:2),' y= ',y:8:2);
結束。
第三,選擇程序設計的結構
示例3輸入壹個年份數字來確定它是否是閏年。
解析:判斷閏年的算法是:如果這個年份數字能被400整除,或者能被4整除但不能被100整除,則為閏年。否則就是正常的壹年。
源程序如下:
程序ex;
var年:整數;
開始
寫('輸入年份:');readln(年份);
寫(年:6);
如果(年模塊400=0 ),則
writeln('是閏年。)
其他
如果(年模4=0)和(年模100 & lt;& gt0)
然後writeln('是閏年。')
else writeln('不是閏年。);
結束。
例4判斷1995,每個月的天數。
解析:程序分為:輸入月份,計算月份的天數,輸出天數。
源程序如下:
計劃天數;
var月、日:整數;
開始
寫('輸入月份:');readln(月);
案例月份
1,3,5,7,8,10,12:天:= 31;
4,6,9,11:天:= 30;
2:天數:= 28;
else天數:= 0;
結束;
如果天數& lt& gt0然後writeln('Days= ',Days);
結束。
例5來了,班長小Q決定用剩下的X元班費買幾支筆,獎勵壹些學習好,表現好的同學。據了解,該店有三種筆,單價分別為6元、5元和4元。小Q想買盡可能多的筆(鼓勵盡可能多的同學),同時又不想剩下什麽錢。請編壹個程序,幫小Q制定壹個買筆的計劃。
分析:針對以上實際問題,買多少支就買多少支,易之都4塊錢肯定能買到多少支。所以,妳能買到的筆的最大數量是4個格。由於小Q想把錢用完,我們可以通過以下方式把錢用完:
如果用4元錢買x div 4支筆,還有1元,可以用4元錢買1支,換成5元的筆。如果妳用4元錢買了x div 4支筆,還剩2元,妳可以用4元錢買1支筆,換成6元的筆。如果在X DIV用4元錢買了4支筆,還剩3元,可以用4元錢買2支筆,換成5元筆和6元筆。
從上面買筆方案的調整可以看出,筆數是x格4,所以這個方案確實是最佳方案。
源程序如下:
程序筆;
var a,b,c:整數;{A、B、C分別代表6元、5元、4元的錢筆數。}
x,y:整數;{x和Y代表剩余的班費和買了最多的4元筆後剩下的錢。}
開始
寫(' x = ');Readln(x){ enter x}
c:= x div 4;{ 4元最多買幾支筆}
y:= x mod 4;{求買C 4元鋼筆後剩下的錢數y}
案例y
0:開始a:= 0;b:= 0;結束;
1:begin a:= 0;b:= 1;c:= c-1;結束;
2:begin a:= 1;b:= 0;c:= c-1;結束;
3:begin a:= 1;b:= 1;c:= c-2;結束;
結束;
writeln('a= ',a,' b= ',b,' c= ',c);
結束。
在實際應用中,妳會經常遇到很多有規律的重復操作,這就需要妳掌握本章介紹的循環結構程序設計。在Pascal語言中,循環結構程序通常由三種循環語句實現。它們分別是FOR循環、when循環和until循環。通常壹組重復的語句稱為循環體,重復執行或終止執行的控制由重復終止條件決定。因此,重復句由兩部分組成:循環體和重復終止條件。
首先,for語句的壹般格式
for & lt控制變量>;:= & lt表達式1 >;到& lt表達式2 & gtdo & lt語句>;
for & lt控制變量>;:= & lt表達式1 >;downto & lt表達式2 & gtdo & lt語句>;
其中for、to、downto和do是Pascal保留字。表達式1和表達式2的值也稱為初始值和最終值。
二、For語句的執行過程
①將初始值賦給左邊的變量(稱為循環控制變量);
(2)判斷循環控制變量的值是否已經“超過”最終值,如果是,跳到步驟6;
(3)如果end超過了final值,則執行do後的語句(稱為循環體);
④循環變量增加(到)或減少(到下)1;
⑤返回步驟②;
⑥在循環結束時,執行for循環下面的語句。
三。說明
①循環控制變量必須是序列類型。比如可以是整數,字符等。,但它不可能是真實的。
(2)回路控制變量值的增減規律是:to是遞增的;選擇向下以減少。
(3)所謂循環控制變量的值“超過”最終值,對於遞增循環,“超過”意味著大於,對於遞減循環,“超過”意味著小於。
④循環體可以是基本語句,也可以是復合語句。
⑤壹旦確定了循環控制變量的初值和終值,就確定了循環次數。但是,在循環體中修改循環變量的值往往會導致循環過早結束或出現死循環。建議不要在循環體中隨意修改控制變量的值。
⑥for語句中的初值和終值可以是常量、變量和序列類型的表達式。
四、應用實例
示例1。輸出1-100之間的所有偶數。
var i:整數;
開始
對於i:=1到100 do
如果i mod 2=0那麽寫(I:5);
結束。
例2。找n!= 1 * 2 * 3 * ...* n,其中n不大於10。
解析:程序首先要輸入n,然後從1乘以n。
該過程如下:
定義變量
n,I:整數;{I是循環變量}
s:longint;{s作為乘數}
開始
寫(' Enter n = ');readln(n);{輸入n}
s:= 1;
對於i:=2到n do { {從2到n到s相乘}
s:= s * I;
writeln(n,'!= ',s);{輸出n!值為}
結束。
首先,WHILE循環
For循環有時也稱為計數循環。當循環次數未知時,用while語句或repeat語句實現循環更方便。
while語句的形式為:
while & lt布爾表達式> do & lt語句>;
其含義是:當Dambre表達式的值為true時,執行do後的語句。
while語句的執行過程是:
(1)判斷布爾表達式的值,如果值為真,執行步驟2,否則執行步驟4;
(2)執行loop語句(do後的語句);
③返回步驟1;
④結束循環,執行while的下壹條語句。
註意:這裏while和do是保留字,while語句的特點是先判斷後執行。當Dambre表達式成立時,在do之後重復語句(循環體)。
示例1。求S = 1+1/2+1/3+…+1/n大於10時n的值。
解析:“只需使S的值大於10”是指當表達式S中前n-1項之和小於等於10時,加上第n項後,S的值大於10。數學上我們很難計算出這個n的值,所以從第壹項開始,當s的值小於等於10時,繼續累加下壹項。當s的值超過10時,最後壹項的個數就是所需的n。
該過程如下:
定義變量
s:真實;
n:整數;{n代表項目的數量}
開始
s:= 0.0;n:= 0;
而s & lt= 10 do {當S的值沒有超過10時}
開始
n:= n+1;{項目數加上1}
s:= s+1/n;{將下壹個值添加到s}
結束;
writlen('n= ',n);{輸出結果}
結束。
例2:求兩個正整數m和n的最大公約數..
解析:求兩個正整數的最大公約數,用折騰除法的方法求解。以下是輾轉反側的算法:
m、n、r n和r分別用來表示被除數、除數和余數。
①求m/n的余數r .
②如果r=0,那麽n是最大公約數。如果r≠0,進行步驟③。
③把n的值放在m中,把r的值放在n中.
④返回並重新執行步驟①。
該過程如下:
程序ex4 _ 4;
var m,n,a,b,r:整數;
開始
寫('輸入m,n:');
readln(m,n);
a:= m;b:= n;r:= a mod b;
而r & lt& gt0 do
開始
a:= b;b:= r;
r:= a mod b;
結束;
writeln('最大公約數是:',b:8);
結束。
第二,直到循環(REPEAT-until語句)
while語句可以實現“when-type循環”,repeat-until語句可以實現“until-type循環”。repeat-until語句的含義是:“重復循環,直到指定的條件為真”。
直到循環語句的壹般形式:
重復
& lt語句1 >;;
:
& lt語句n & gt;
直到& lt布爾表達式>;
Repeat和until是Pascal保留字,repeat和until之間的所有語句都稱為循環體。
描述:
①①repeat語句的特點是先執行循環,再判斷結束條件,所以循環體至少要執行壹次。
②repeat-until是壹個整體,是壹個(建設性的)陳述。不要把repeat誤認為是壹種說法,把until誤認為是另壹種說法。
③當布爾表達式的值為true時,repeat語句不會執行循環體,循環體可以是幾個語句,不用begin和end把它們包起來。重復和直到已經扮演了開始和結束的角色。而循環和重復循環可以相互轉換。
為了找到例2中兩個正整數的最大公約數,程序可以通過重復-until循環來實現,如下所示:
定義變量
m,n,a,b,r:整數;
開始
寫('輸入m,n = ');
readln(m,n);
a:= m;b:= n;
重復
r:= a mod b;
a:= b;b:= r;
直到r = 0;
writeln('最大公約數是',a);
結束。
上面我們介紹了三種循環語句。壹般來說,使用for循環更簡單。只要能用,盡量用for循環。僅當不能使用for循環,且while循環和repeat-until循環可以相互替換時,才使用while循環和repeat-until循環。For循環在大多數情況下也可以用whiel和repeat-until循環代替。壹般來說,for循環用於有壹定次數的循環,而while和repeat-until循環用於次數不確定的循環。
當循環的循環體包含循環結構程序時,我們稱之為循環嵌套。
三、循環結構程序設計
例3查找1!+2!+…+10!的價值。
解析:此題是求10自然數的階乘之和,可通過for循環實現。程序結構如下:
對於n:=1到10做
開始
①N!àt的值
2積累n!的值t
結束
很明顯,通過10次循環,我們可以得到1!,2!…,10!,同時相加,就可以得到s .的值,求T=N!,可以通過for循環來實現:
t = 1;
對於j:=1到n do
t:= t * j;
因此,整個程序是:
程序ex4 _ 5;
var t,s:real;
I,j,n:整數;
開始
s:= 0;
對於n:=1到10做
開始
t:= 1;
對於j:=1到n do
t:= t * j;
S:= S+t;
結束;
writeln('s= ',s:0:0);
結束。
上面的程序是壹個雙for循環嵌套。這是壹個更好的思考方式,但實際上,對於求n!,我們可以根據計算(n-1)!乘以n就可以得到,不用再從1乘以n。
該過程可以更改為:
程序ex4 _ 5;
var t,s:real;
I,j,n:整數;
開始
s:= 0;t:= 1;
對於n:=1到10做
開始
t:= t * n;
S:= S+t;
結束;
writeln('s= ',s:0:0);
結束。
顯然,第二個程序的效率比第壹個程序高得多。第壹個程序需要1+2+…+10=55個周期,第二個程序需要10個周期。如果題目是1!+2!+…+1000!,兩個程序的效率差異就更明顯了。
例4:壹個廚師去逛街,用500元的錢買了90只雞,其中壹只母雞15元,壹只公雞10元,壹只雞5元,剛好把錢花完。妳買多少只母雞、公雞和小雞?
解析:如果有I只母雞和J只公雞,那麽就有90-I-J只小雞,然後15 * I+10 * J+(90-I-J)* 5 = 500,顯然不可能直接求解壹個方程中的兩個未知數。必須組合所有可能的I和J值,以查看是否滿足條件。這裏,I的值可以是0到33,J的值可以是0到50。
源程序如下:
程序員ex4 _ 6;
var i,j,k:整數;
開始
for i:=1到5 do
對於j:=1到8 do
開始
k:= 90-I-j;
如果15*i+10*j+5*k=500那麽writeln(i:5,j:5,k:5);
結束;
結束。
例5:求100-200之間的所有質數。
解析:我們可以判斷100-200之間的每壹個整數來判斷它是否是素數,如果是,就輸出。對於任意壹個整數I,根據素數的定義,我們從2開始,求I的第壹個除數,如果找到了第壹個除數,I壹定不是素數。否則I就是壹個質數。
源程序如下:
定義變量
I:整數;
x:整數;
開始
對於i:=100到200 do
開始
x:= 2;
while(x & lt;=trunc(sqrt(i)))和(i mod x & lt& gt0)做
開始
x:= x+1;
結束;
如果x & gttrunc(sqrt(i))然後寫(I:8);
結束;
結束。