版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
枚舉類型和子界類型6.1PASCAL中數據類型數據類型基本類型構造類型指針類型標準類型用戶自定義類型實數類型整數類型字元類型布爾類型枚舉類型字界類型數組類型集合類型記錄類型檔類型順序類型無序類型6.2枚舉類型1、為什麼需要枚舉類型?程式不應只是用於數值計算,還應處理非數值的數據。例如:月份、星期、學歷等。2、枚舉方法:事先考慮到某一變數可能取的所有的值,儘量用自然語言中含義清楚的單詞來表示它的每一個值的方法,稱為枚舉方法。“枚舉”:意思就是把所需要的對象都一個一個的列舉出來。如:星期是一個只有7個元素的數據,因此我們可以定義一種數據類型Days代表星期,如果一個變數定義為Days類型,那麼他的取值範圍就是Sunday..Saturday,另外顏色Color也一樣。TypeDays=(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday);Color=(Red,Yellow,Blue,Green.Purple,White,Black);3、枚舉類型的定義TYPE
<枚舉類型識別字>=(<識別字1>,<識別字2>···<識別字n>);VAR<枚舉類型變數表>:<枚舉類型識別字>;例如:
TYPEday=(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,saturday);VARtoday,tomorrow:day;或者:VAR<枚舉類型變數表>:
(<識別字1>,<識別字2>···<識別字n>);例如:VARtoday,tomorrow:(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,saturday);注意:(1)枚舉類型定義時,必須將該類型變數所允許的枚舉值全部列在等號後括弧中,並用逗號隔開。(2)枚舉元素只能是識別字,而不能是數值常量或字元常量。(3)每個枚舉值只能出現在一個枚舉類型的定義中,並且只能在該定義中出現一次。例如以下的定義是錯誤的:
typedaytype1=(monday,tuesday);
daytype2=(monday,wednesday);
判斷下列定義正確與否:TYPEt1=(‘a’,’b’,’c’,’d’);t2=(1,2,3,4,5);t3=(sun,mon,tue,wed,sun);t4=(wed,thu,fri,sat);
4、枚舉類型的運算只能進行賦值運算和關係運算,不能進行算術運算和邏輯運算。一、賦值運算
Today:=Tuesday;Tomorrow:=today;(1)同類型的枚舉值賦值給同類型的變數。如:today:=mon;(2)枚舉類型變數的值只能用賦值語句來獲得。不能對枚舉變數進行讀寫。如:readln(today);Writeln(tomorrow);均是錯誤的如:
iftoday=Tuesdaythenwriteln(‘Tuesday’);(1)枚舉類型屬於順序類型,根據定義類型時各枚舉元素的排列順序確定它們的序號,依次為0,1…。比較時,序號小的枚舉元素小於序號大的枚舉元素。如:Sunday<monday結果是true。(2)只能對同一類型的枚舉數據比較,不能對不同類型的枚舉數據比較。
二、關係運算(比較運算)(3)枚舉類型可作標準函數pred,succ,ord的參數。如:pred(Monday)為sundaysucc(monday)為tuesday
ord(sunday)為05、布爾類型也可以看作一種枚舉類型,它只有兩個值。相當於:Typeboolean=(false,true)
所以:
ord(false)為0
pred(true)為false6、讀和列印枚舉值的方法
不可以直接用read語句或write語句直接讀或列印,只能採用間接的方法。如:讀枚舉值的序號,然後由case語句賦相應枚舉值。輸出時,也可利用case語句輸出相應枚舉值的字串。例題:輸入今天的日期數字:0=Sunday,1=Monday,…6=Saturday,輸出明天的日期,用英文單詞表示。
programxoi;TypeDays=(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday);vartoday,tomorrow:Days;number,i:integer;beginwrite('Entertodaynumber:');readln(number);if(number<0)or(number>6)thenwriteln('Errornumber')elsebegintoday:=Sunday;fori:=0tonumber-1dotoday:=succ(today);iftoday=Saturdaythentomorrow:=Saturdayelsetomorrow:=succ(today);
write('Tomorrowis:');casetomorrowofSunday:writeln('Sunday');Monday:writeln('Monday');Thursday:writeln('Thusday');Wednesday:writeln('Wednesday');Thursday:writeln('Thursday');Friday:writeln('Friday');Saturday:writeln('Saturday')
end
endend.6.3子界類型
子界類型是在其他的離散類型的值域中取出一部分構成獨立的類型,是由整型、字元型、枚舉型、布爾型的兩個常量指定該類型的值域區間,即通過定義子界類型和子界類型變數來進行。1、子界類型的定義TYPE
<子界類型識別字>=<常量1>
··
<常量2>;VAR<子界類型變數表>:<子界類型識別字>;如:typeage=15..30;letter=‘a’..’z’;workday=Monday..Friday;logical=false..true;上界下界也可以:VAR<子界類型變數表>:<常量1>···<常量2>;注意:(1)上界和下界類型稱為基類型。下界和上界必須屬於順序類型,且為同一順序類型。不能定義為實數類型子界。(2)上界的序號必須大於等於下界的序號。(3)子界類型變數的值不允許超出子界的範圍。且類型一致。2、子界類型的運算子界類型的運算與相應的基類型的運算一致。子界類型變數輸入輸出的方法與基類型一致。例按月、日、年順序讀入一日期,輸出該日期是這一年中的第幾天。
programdate;
varyear:0..2010;
month:1..12;
day:1..31;
dayth:integer;
begin
read(month,day,year);
dayth:=0;
fori:=1tomonth-1do
caseiof1,3,5,7,8,10,12:dayth:=dayth+31;
2:if((yearmod4=0)and(yearmod100<>0)or(yearmod400=0)
thendayth:=dayth+29
elsedayth=:=dayth+28;
4,6,9,11:dayth:=dayth+30;
end;
dayth:=dayth+day;
writeln(dayth)
end.7.1PASCAL中數據類型數據類型基本類型構造類型指針類型標準類型用戶自定義類型實數類型整數類型字元類型布爾類型枚舉類型字界類型數組類型集合類型記錄類型檔類型順序類型無序類型7.2一維數組1、數組類型用來解決簡單類型不能解決的問題:(1)輸入50個數,要求程式按輸入時的逆序把這50個數列印出來。(2)輸入100名學生某門課程的成績,要求把高於平均分的成績列印出來。程式:
readln(a1,a2,a3,a4,a5);readln(a6,a7,a8,a9,a10);readln(a11,a12,a13,a14,a15);……如果要求對一千個、一萬個數進行處理,可以想像程式會是什麼樣子。2、一維數組的定義TYPE
數組類型名=array[下標]of數組元素類型;VAR
數組類型變數表:數組類型名;例如:
TYPEart=array[1..10]ofreal;VARa,b:art;或者:VAR
數組類型變數表:
array[下標]of數組元素類型;例如:VARa,b:array[1..10]ofreal;注意:1、數組名必須為識別字。2、下標:必須為順序類型。一般為枚舉類型或字界類型。下標個數決定數組的維數。3、基類型:數組元素的類型,可以是除檔類型的所有類型。所有數組元素類型相同。4、TP允許定義一維數組的同時給一維數組的各個元素賦值。但放在常量說明區。如:Const
a1:array[1..5]ofinteger=(1,2,3,4,5);或:typearr=array[1..5]ofinteger;consta1:arr=(1,2,3,4,5);3、數組元素的引用(1)引用形式數組名[下標運算式]如:a[1]:=1;writeln(a[1]);(2)數組元素可以象同類型的變數那樣使用,可以出現在相應的運算式中、賦值號左邊以及輸入輸出語句中,但不能整體讀、寫。(3)同類型的數組可以整體拷貝(賦值)和作為參數傳遞。如:數組a和數組b是同一類型的,如果數組a有值,則:b:=a。等價:
forI:=1to10dob[i]:=a[i];4、一維數組的存放12345a[1]a[2]a[3]a[4]a[5]順序存放數組元素例如:Const
a1:array[1..5]ofinteger=(1,2,3,4,5);例1:輸入5個考分數,計算它們的總分。programxoi00_03;TypeTScore=Array[1..5]ofinteger;varscore:TScore;i:integer;sum:integer;beginfori:=1to5dobeginwrite('EnterNumber#',i);readln(score[i]);end;sum:=0;fori:=1to5dobeginsum:=sum+score[i];end;writeln('TotalScoreis:',sum);end.例2:從鍵盤輸入10個數,將這10個數逆序輸入,並求這10個數的和,輸出這個和。programp1;var
a:array[1..10]ofinteger;i,s:integer;beginfori:=1to10doread(a[i]);fori:=10downto1dowrite(a[i],'');writeln;s:=0;fori:=1to10dos:=s+a[i];writeln('s=',s);end.例:讀入5個學生的學號和成績,計算他們的平均分,若比平均分高10分的等第為A,若比平均分高小於10分的等地為B,若低於平均分,則等第為C,輸出他們的成績和等第。
programsample(input,output);
constn=5;
type
no=array[1..n]ofinteger;
s=array[1..n]ofreal;
var
i:integer;
k:real;
num:no;
score:s;
begin
k:=0;
fori:=1tondo
begin
readln(num[i],score[i]);
k:=k+score[i];
end;
k:=k/n;
fori:=1tondo
begin
write(num[i],score[i]);
if(score[i]-k)>=10thenwriteln('A')
elseif((score[i]-k)<10)and((score[i]-k)>0)thenwriteln('B')
elsewriteln('C')
end
end.5、舉例(1)、選擇排序基本思想:首先從要排序的數中選擇最大的數,將它放在第一個位置,然後從剩下的數中選擇最大的數放在第二個位置,如此繼續,直到從剩下的兩個數中選擇最大的數放在倒數第二個位置,剩下的一個數放在最後位置,完成排序。以5個數為例:
a[1]a[2]a[3]a[4]a[5]45712
547127451274512第一趟結束74512…75421結束程式段:Fori:=1ton-1doforj:=i+1tondoifa[i]<a[j]thenbegint:=a[i];a[i]:=a[j];a[j]:=tend;P145例7.4輸入20個數將它們按從高到低的次序排序後輸出PROGRAMsort1(input,output);VAR
a:ARRAY[1··20]OFreal;temp:real;i,j:integer;BEGINFORi:=1TO20DOBEGINread(a[i]);write(a[i]);IFiMOD5=0THENWRITELNEND;FORI:=1TO19DOFORJ:=I+1TO20DOIFA[I]<A[J]THENBEGINTEMP:=A[I];A[I]:=A[J];A[J]:=TEMPEND;FORI:=1TO20DOBEGINWRITE(A[I]);IFIMOD5=0THENWRITELNENDEND.改進的選擇排序法P147(2)、冒泡排序
基本思想:依次比較相鄰的兩個數,將大數放在前面,小數放在後面,如此繼續,直到比較最後兩個數,將大數放在前面,小數放在後面,此時第一趟結束,最小的數一定放在最後位置。如此繼續,只比較前面的數,將第二小的數放在倒數第二位置,…
直到最後一趟,只比較第一個數和第二個數,將最小的數放在第二位置,另一個數放在第一位置,排序完畢。以5個數為例:
a[1]a[2]a[3]a[4]a[5]45712547125741257412第一趟結束57421…75421結束程式段:Fori:=1ton-1doforj:=1ton-idoifa[j]<a[j+1]thenbegint:=a[j];a[j]:=a[j+1];a[j+1]:=tend;改進的冒泡排序程式段。7.3多維數組(以二維數組為代表)1、重點是二維數組,二維數組的定義TYPE
數組類型名=array[下標1]ofarray[下標2]of數組元素類型;等價:TYPE(數組定義)數組類型名=array[下標1,下標2]of
數組元素類型;VAR(變數定義)數組類型變數表(識別字):數組類型名;例如:TYPEart=array[1..2,1..3]ofreal;VARa,b:art;可以用下標來描述二維數組的每一個分量:
a[1,1]a[1,2]a[1,3](第一行)
a[2,1]a[2,2]a[2,3](第二行)2、二維數組的引用舉例說明:已知4名學生5門課程的成績,列印每位學生的平均分。Varave:array[1..4]ofreal;S:array[1..4,1..5]ofreal;(二維數組)
i,j:integer;t:real;假定在數組s中存放4名學生5門課程的成績,在ave數組中存放每位學生的平均分。演算法:(1)、輸入學生成績(2)、求每位學生的平均分(3)、輸出(列印)學生成績Fori:=1to4dobeginForj:=1to5doread(s[i,j]);readln;end;(1)、輸入學生成績Fori:=1to5dobeginForj:=1to4doread(s[i,j]);readln;end;
二者都可(2)、求每位學生的平均分Fori:=1to4dobegint:=0;Forj:=1to5dot:=t+s[i,j]);ave[i]:=t/5;end;(3)、輸出(列印)學生成績Fori:=1to4dobeginForj:=1to5dowrite(s[i,j]);writeln(ave[i])end;3、二維數組的存放1234561920a[1,1]a[1,2]a[1,3]a[1,4]a[1,5]a[2,1]a[4,4]a[4,5]按行主順序存放數組元素例如:a:array[1..4,1..5]ofreal;···7.4緊縮字元數組1、字元型數組(1)定義:
Vara:array[1..15]ofchar;(2)數組元素賦值:不能是:
a:=‘thisisabook.’;必須一個一個賦值,如:
a[1]:=‘t’;a[2]:=‘h’;···a[14]:=‘k’;a[15]:=‘.’;或者從鍵盤輸入:
Fori:=1to15doread(a[i]);readln;(3)數組元素操作:與其他類型數組一樣,只能對數組元素逐個進行。2、字串常量(1)定義:用單引號括起來的一串字元稱為字串常量。如:‘pascal’。(2)字串常量說明:Conststring=‘thisisabook.’;(3)在主程序中使用:(一般是輸出語句中)writeln(string);
或者
writeln(‘thisisabook.’);3、壓縮式字元數組(字串變數)(1)定義Typest=packedarray[1..15]ofchar;Vara,b:st;注意:(1)可以對壓縮式字元數組整體賦字串。
a:=‘thisisabook.’;
注意:字串的長度必須與數組a的長度相等。(2)壓縮式字元數組輸入和輸出
readln(b);{當一行多於15個字元,則只取前15個字元。當一行少於15個字元,不足的部分用空格填滿}
Writeln(b);(不允許)(3)壓縮式字元數組的比較
ifa<bthenwriteln(a,’<’,b)elsewriteln(a,’>’,b);比較條件:兩個比較的數組必須長度相等。比較規則:與字串比較規則一樣。(4)數組元素可以是一個壓縮式字元數組,即每個元素都為一個字串變數。Type
st=packedarray[1..7]ofchar;starr=array[1..3]ofst;Varname:starr;(5)對壓縮式字元數組進行操作時速度比較慢。4、TurboPascal中的字串類型(1)定義:
Typest=string[長度];Varname:st;或
Varname:string[長度];注意:長度的要求(2)string類型的變數也稱動態串。因為它包含最多字元個數是固定的,但實際字串長度可以是0個至串長上限之間。(3)字串處理的標準函數和過程3.1流程圖起止框判斷框處理框輸入輸出框連接點流程線例:從十個數中選出最大者.列印出A的值1結束開始輸入一個數→A0→N輸入一個數→BA>=BB→AN<=9N+1→N1YNYN3.2IF語句1、用來實現選擇結構。有兩種形式:IF<布爾運算式>THEN<語句>IF<布爾運算式>THEN<語句1>ELSE<語句2>ab條件P語句1語句22、執行順序:先計算並測試布爾運算式的值,若為TRUE,則執行THEN後面的語句,否則執行ELSE後面的語句或直接執行下一條語句。條件P語句abNYYNIf<布爾運算式>
then<语句1>
else<语句2>;a:=20;
b:=30;Ifa>=bthenwrite(“投票通過”)Elsewrite(“投票不通過”);對錯語句1語句2條件練習1:從鍵盤輸入兩個數,求最大數。Readln(a,b)Ifa>=bMax:=aMax:=bWriteln(Max)TF流程圖programL3_1;
var
a,b,max:real;
begin
write('entera,b=');
readln(a,b);
ifa>=b
thenmax:=a
elsemax:=b;writeln('max=',max:8:2)
end.開始輸入WEIGHTWEIGHT<=50PAY=50+0.35+(WEIGHT-50)*0.5PAY=WEIGHT*0.35輸出PAY開始NY課本例題3.1p38課堂練習:寫出下麵程式運行結果programprogaml(input,output);
var
a,b,c,d,e,f,g,x,y,z:integer;begin
read(d,e,f,g);
a:=d+e+f+g-5;
b:=d*(e-fdivg+8);
c:=d*edivf*g;
x:=(a+b+2)*3-a;
y:=(c*100-13)divadivb;
if((x+y)mod2=0)thenz:=(a+b+c+x+y)div2else
z:=(a+b+c-x-y)*2;
writeln(x+y-z)end.數據輸入:25743、注意:(1)書寫的四種方式:
IF···THENIF······THEN···IF···THEN···IF···ELSE···THEN···ELSE···(2)IF···THEN···ELSE···語句:ELSE前面的語句不能有分號,否則將ELSE以及它後面的語句看成一條新語句,這樣就發生語法錯誤。4、複合語句(1)當THEN或ELSE後語句不止一個時,要用到複合語句。複合語句是一個以BEGIN開始,以END結束的語句。
(2)一般形式:
BEGIN<語句1>;
<語句2>;
···END;一個複合語句從外部看來,相當於一個語句。
(3)舉例
複合語句:在某種情況下,當滿足某個條件時,我們需要連續執行多個語句,在pascal語言中為了讓結構清晰,允許我們把多個語句組成一個複合語句,這樣一個複合語句的使用就可以看作一個語句使用。begin<語句1>;
<語句2>;
......<語句n>;endwrite(‘a,b=’);
readln(a,b);
ifb=0
thenwriteln(‘inputerror’)
else
begin
c:=a/b;
writeln(‘a/b=’,c);
end;例:當x>0時候,計算x*x,並且輸出x和x*x,programlianxie3;
varx,x1:real;
begin
readln('x=',x);
ifx>0then
begin
x1:=x*x;
writeln('x*x=',x1);
writeln('x=',x)
end
end.
例題:從鍵盤任意輸入三個字元,求ASCII碼最大的字元和ASCII最小的字元。開始結束輸入NUM1,NUM2,NUM3NUM1>NUM2NUM1→MAXNUM2→MAXNUM3>MAXNUM3→MAX輸出MAXYNYNprogramt3(input,output);varc1,c2,c3,max,min:char;beginwrite('C1,C2,C3=');readln(c1,c2,c3);
ifc1>c2thenBEGINmax:=c1;min:=c2;
ENDelseBEGINmax:=c2;min:=c1;
END;ifc3>maxthenmax:=c3;
ifc3<minthenmin:=c3;writeln('MAX=',max,'MIN=',min);end.5、IF語句嵌套(複合IF語句)(1)一般形式:
IF<布爾運算式1>THEN
IF<布爾運算式2>THEN<語句1>
ELSE<語句2>
ELSE
IF<布爾運算式3>THEN<語句3>
ELSE<語句4>(2)為了避免歧義,規定ELSE與它最近的THEN配對。(3)舉例(1)if語句嵌套在then子句中。
一般形式:
(2)if語句嵌套在else子句中。對於條件語句的嵌套,無論多複雜,只要注意採用縮進式格式書寫程式,if、then和else相互配對,適當使用複合語句形式,即增加語句括弧,就能順利解決問題。例1計算下列函數
分析:根據輸入的x值,先分成x>0與x≤0兩種情況,然後對於情況x≤0,再區分x是小於0,還是等於0。
源程序如下:
顯然,以上的程式中,在then子句中嵌套了一個Ⅱ型if語句。當然程式也可以寫成如下形式:
輸出”優秀”開始結束輸入SCORESCORE>=90SCORE>=60YNYN輸出”不及格”輸出”良好”課本例3.4p44programL3_2(input,output);varsex,age:integer;beginwrite('sex(1boy,0girl)=');readln(sex);write('age=');readln(age);if((sex=1)and(age>=10))or((sex=0)and(age>=14))thenwriteln('pass')elsewriteln('nopass')end.讀懂以下的程式,並說明其編寫目的:
programL3_3(input,output);vara,b,c,d,e,average:real;beginwrite('enterfivegrade:');readln(a,b,c,d,e);average:=(a+b+c+d+e)/5;writeln('average=',average:8:2);if(average>80)and(a>=60)and(b>=60)and(c>=60)and(d>=60)and(e>=60)thenwriteln('modelstudent')end.programL3_4(input,output);vara,b,c,p,s:real;beginwrite('a,b,c=');readln(a,b,c);ifnot((a>0)and(b>0)and(c>0)and(a+b>=c)and(abs(a-b)<=c))thenbeginwriteln('inputdateerro!');halt;end;p:=(a+b+c)/2;s:=sqrt(p*(p-a)*(p-b)*(p-c));writeln('s=',s:8:2)end.programL3_5(input,output);vara,b:integer;c,p:longint;name:string;begina:=random(101);b:=random(101);c:=a*b;write(a,'*',b,'=');readln(p);ifc=pthenname:='right!'elsename:='wrong!';writeln(name,'computerresult=',c)end.3.3CASE語句
實現選擇結構的又一種語言。也稱情況語句、多分支選擇語句。1、一般形式:
CASE<運算式>OF<值表1>:<語句1>;
<值表2>:<語句2>;
···<值表n>:<語句n>ENDCase<運算式>of
<常量表1>:<語句1>;
……
<常量表n>:<語句n>
else
<語句n+1>
endelse常量表n運算式語句1語句n語句n+1常量表12、執行順序:(1)計算運算式值。(2)當運算式的值與某一值表中常量相同時,則執行該值表對應的語句。執行完,即去執行該情況語句下一個語句。(3)若運算式的值和所有的值表中常量均不同,則什麼也不做。ab是否在值表1語句1YN計算運算式是否在值表2語句2YN···是否在值表N語句nYN3、注意:(1)值表與語句間用冒號隔開;(2)值表是一組情況常量,它們之間用逗號隔開;(3)運算式的類型必須是順序類型;(4)一個CASE語句中,各值表應互不相同。如果相同則執行最先出現的值表對應的語句。例:根據學生的成績給予相應的等低,對應關係如下:
90——100A
80——89B
60——79C
60以下D
指出程序中的错误:
programchengji(input,output);
vars:real;ch:char;
begin
write(‘inputthescore:’);
readln(s);
if(s>=0)and(s<=100)then
case
sdiv10
of
10,9:ch:=‘B’;
8:ch:=‘B’;
7,6:ch=‘C’;
elsech:=‘D’;
end;
writeln(s,‘--’,ch);
end.programchengji2(input,output);vars:real;ch:char;begin
write(‘inputthescore:’);
readln(s);
n:=trunc(s/10);
casenof
10,9:writeln(‘classisA’);
8:writeln(‘classisB’);
7,6:writeln('classisC');
5,4,3,2,1,0:writeln('classisD')
else
writeln('inputerro!')
endend.例3.5講解p48開始計算該月天數days讀入年、月(year,month)輸出年、月和該月天數
(year,month,days)結束逐步求精y:=(yearmod4)and(yearmod100<>0)or(yearmod400=0)判斷該年是否為閏年,並把true或false存入y中Case(month)1,3,5,7,8,10,12days:=314,6,9,112else輸出錯誤資訊
並終止程式y值days:=30TFdays:=28days:=29判斷該年是否為閏年,並把true或false存入y中開始結束輸入YEAR,MONTHMONTH值為1,3,5,7,8,10YNYN31→DAYSMONTH值為4,6,9,11MONTH值為2,是否閏年30→DAYS29→DAYS28→DAYSYN輸出YEAR,MONTH,DAYSprograml3_6(input,output);varp,t:real;n:integer;beginwrite('price=');readln(p);ifp<=0thenbeginwriteln('inputerro!');halt;end;n:=trunc(p/1000);casenof0:t:=0;1,2,3,4:t:=p*2/100;5,6,7,8,9:t:=p*3/100;elset:=p*5/100end;writeln('price=',p:8:2,'tax=',t:8:2)end.Programex(input,output);beginwriteln(sqrt(1));writeln(sqrt(2));writeln(sqrt(3));writeln(sqrt(4));writeln(sqrt(5));writeln(sqrt(6));writeln(sqrt(7));writeln(sqrt(8));writeln(sqrt(9))End.程式:100句!?Programex(input,output);beginwriteln(sqrt(1));writeln(sqrt(2));……writeln(sqrt(100))End.引例2:請計算並輸出1~100這100個數的算術平方根。用迴圈語句解決該問題Programex(input,output);varI:integer;begin
forI:=1to100dowriteln(sqrt(i):0:3)End.第四講迴圈結構程式設計電腦在執行一個程式模組時,不是按照語句的排列順序進行的,而是按照一定的規律和規則在一定的條件下重複執行模組內部的一系列語句,那麼我們可以把這種結構看作是迴圈結構。這種結構的程式設計可以稱為迴圈程式程式設計。PASCAL語言的迴圈語句有三種:FOR語句;WHILE語句;REPEAT語句。pascal語言中的for語句:
for
迴圈控制變數:=初值to
終值do
循環體注:如果循環體是若干條語句,需在循環體前面加begin,後面加end。For迴圈語句格式(一)迴圈變數≤終值循環體truefalseFOR迴圈流程圖(Pascal語言)迴圈變數賦初值pascal語言中的for語句:
for
迴圈控制變數:=初值
downto
終值
do
循環體注:如果循環體是若干條語句,需在循環體前面加begin,後面加end。For迴圈語句格式(二)例:請利用迴圈語句輸出1~1000以內的自然數。for迴圈控制變數:=初值to終值do
循環體Programzz(input,output);VarI:integer;BeginforI:=1to1000dobeginwriteln(i);ifImod20=0thenreadlnendEnd.迴圈變數:=初值迴圈變數:=SUCC(迴圈變數)循環體迴圈變數<=終值FalsetruePascal語言中迴圈模組的執行過程例計算1+2+3+……+100的值programlt(input,output);vars,i:integer;begins:=0;fori:=1to100dos:=s+i;write('s=',s)end.注意事項:1.初值,終值可為運算式,但類型必須一致;2.若初值>終值,退出迴圈,故循環體有可能一次也不執行;3.每執行完循環體,迴圈變數自動變為下一個值,下一個值由SUCC(X)函數產生;4.迴圈變數可為整型,字元型,布爾型,子界型,枚舉型等;5.在循環體內,不允許改變迴圈變數的值;6.在迴圈之前,根據初,終值計算迴圈次數及每次迴圈變數的值;7.FOR迴圈退出後,迴圈變數的值是無定義的,不可引用.S=2+4+6+8+…+100;S=1+1/2+1/3+1/4+…+1/100;S=12+22+32+42+…+1002;練習:對上題的程式稍加改變,試給出以下算式的程式:習題1:programex(input,output);vari,s,x:integer;begins:=0;fori:=1to50dobeginx:=i*2;s:=s+xend;writeln(s)end.習題2:
programex(input,output);vari:integer;s,x:real;begins:=0;fori:=1to100dobeginx:=1/i;s:=s+xend;writeln(s:0:3)end.習題3:
programex(input,output);vari:integer;s,x:longint;begins:=0;fori:=1to100dobeginx:=i*10+2;s:=s+xend;writeln(s)end.按正、反序分別輸出26個小寫英文字母。分析:輸出2次,一次正序‘a’---‘z’;一次反序‘z’---‘a’.數據定義:ch:char;forch:='a'to'z'dowrite(ch);writeln;{正序}forch:='z'downto'a'dowrite(ch);writeln;{反序}解決辦法注:迴圈控制變數的值可以是字元型數據。警察局抓了A、B、C、D四名盜竊嫌疑犯,其中有一人是小偷。審問中A說:“我不是小偷。”B說:“C是小偷。”C說:“小偷肯定是D。”D說:“C在冤枉人。”現在已經知道四個人中只有一人說的是假話,問到底誰是小偷。例題:分析:我們判斷的方法是:先假設某人是小偷,然後判斷四個嫌疑犯說的話是不是有三句真的,一句假的。如果是,則假設成立,找到小偷。用‘A’,’B’,’C’,’D’
四個字元分別代表A,B,C,D這四個人。用變數X代表小偷。則四個嫌疑犯說的話可以轉化為四個關係運算式:
A說:“我不是小偷。”x<>’A’B說:“C是小偷。”x=‘C’C說:“小偷肯定是D。”x=‘D’D說:“C在冤枉人。”x<>’D’
我們為X賦值,即假設某人是小偷,如:X
‘A’,即假設A是小偷,然後判斷四個嫌疑犯說的話是不是有三句真的一句假的樣程:Programex(input,output);varx:char;n:integer;beginforx:=‘A’to‘D’dobeginn:=0;ifx<>’A’thenn:=n+1;ifx=’C’thenn:=n+1;ifx=’D’thenn:=n+1;ifx<>’D’thenn:=n+1;ifn=3thenwriteln(x,’isathief.’)endEnd.分析二:用‘A’,’B’,’C’,’D’
四個字元分別代表A,B,C,D這四個人。用變數X代表小偷。則:
A說:“我不是小偷。”x<>’A’B說:“C是小偷。”x=‘C’C說:“小偷肯定是D。”x=‘D’D說:“C在冤枉人。”x<>’D’
ord(x<>‘A’)+ord(x=‘C’)+ord(x=‘D’)+ord(x<>’D’)=3時X的值是小偷。程式二:Programex;Varx:char;s:integer;Beginforx:=‘A’to‘D’dobegins:=ord(x<>’A’)+ord(x=‘C’)+ord(x=‘D’)+ord(x<>’D’);ifs=3thenwriteln(x,’isathief’)endEnd.練習:輸入20個數,統計它們中正數、負數和零的個數。分析:1、重複執行的操作:輸入一個數;判斷這個數是什麼數?2、重複次數?20次程式:programstu(input,output);vara:real;
x,y,z,i:integer;beginx:=0;y:=0;z:=0;fori:=1to20do
begin
readln(a);
ifa>0thenx:=x+1elseifa=0theny:=y+1elsez:=z+1
end;write(‘x=‘,x,’y=‘,y,’z=‘,z)end.練習:
輸入20個數,求它們的最大值、最小值和平均值。分析:1、重複執行的操作:輸入一個數;判斷;累加;2、重複次數?20次程式:programstu9(input,output);vara,s,min,max:real;
i:integer;beginreadln(a);
min:=a;max:=a;s:=a;fori:=1to20dobeginreadln(a);
ifa>maxthenmax:=a;ifa<minthenmin:=a;s:=s+aend;write(‘max=‘,max,’min=‘,min,’s=‘,s/20)end.練習:99^99值的最後三位數字分別是幾?分析:如果選用99累乘99次,再將所得的積截取出最後三位數,顯然是不可能的,所以要每自乘一次就截取出最後三位。
X:longint;程式:Programex(input,output);Varx:longint;I:integer;Beginx:=1;forI:=1to99dobeginx:=x*99;
x:=xmod1000;end;writeln(x)End.練習:鍵入一個自然數,求這個自然數的所有約數之和S。鍵入一個自然數,求這個自然數的所有約數之和S。輸入一個自然數X累加器清零s
0ForI
1toxdoXmodI=0truefalseS
S+I輸出結果分析:練習:輸入一個數,判斷其是否為質數。如果是質數輸出‘Yes’,否則輸出‘No’分析:質數x,即只能被1和它本身x整除的數。也就是在2到x-1裏面沒有約數(約數個數為0)的數。練習:輸入一個數,判斷其是否為質數。如果是質數輸出‘Yes’,否則輸出‘No’樣程:programex(input,output);varx,i,j:integer;beginreadln(x);i:=0;forj:=2tox-1doifxmodj=0theni:=i+1;ifi<>0thenwriteln(‘No’)elsewriteln(‘Yes’);end.while語句格式:while<布爾運算式>do
循環體注:如果循環體是若干條語句需在循環體前面加begin,後面加end。布爾運算式循環體falsetrue例1:輸出1—100之間的奇數(For語句)Programex;varx,y:integer;Beginforx:=1to50dobeginy:=x*2-1;write(y)end;writelnEnd.例1.1:輸出1、100之間的奇數(while語句)Programex;varx:integer;Begin
x:=1;{變數賦初值}whilex<100dobeginwrite(x);
x:=x+2;{改變變數的值}end;writelnEnd.S=2+4+6+8+…+100;S=1+1/2+1/3+1/4+…+1/100;S=12+22+32+42+…+1002;練習:用while語句編程算出以下算式:程式1:programex(input,output);vari,s:integer;begins:=0;
i:=2;whilei<=100dobegins:=s+i;
i:=i+2;{改變變數的值}end;writeln(s)end.程式2:
programex(input,output);vari:integer;s,x:real;begins:=0;i:=1;whilei<=100dobeginx:=1/i;s:=s+x;
i:=i+1;{改變變數的值}end;writeln(s)end.程式3:
programex(input,output);vari:integer;s,x:longint;begins:=0;i:=12;whilei<=1002dobegins:=s+i;
i:=i+10;{改變變數的值}end;writeln(s)end.Whileflag=0do初始化:abcd
1000;flag
0(ab+cd)*(ab+cd)=abcdtruefalseab
abcddiv100輸出abcdcd
abcdmod100flag
1練習1:編程找出最小的滿足下述關係的四位整數abcd:(ab+cd)(ab+cd)=abcd。例如:2025,(20+25)*(20+25)=2025Whileflag=0do(ab+cd)*(ab+cd)=abcdtruefalseab
abcddiv100輸出abcdcd
abcdmod100初始化:abcd
1000;flag
0flag
1abcd:=abcd+1分析:programex(input,output);varabcd,ab,cd:integer;flag:integer;beginabcd:=1000;flag:=0;
whileflag=0dobeginab:=abcddiv100;cd:=abcdmod100;if(ab+cd)*(ab+cd)=abcdthenbeginwriteln(abcd);flag:=1;end;
abcd:=abcd+1;
endend.練習2:輸入一個數,判斷其是否為質數。如果是質數輸出‘Yes’,否則輸出‘No’質數x,即只能被1和它本身x整除的數。也就是在2到x-1裏面沒有約數(約數個數為0)的數。實際上只要x被1到xdiv2都不能整除的話,則可以確定x為質數。
分析:基本思想是將x被2、3、4……、xdiv2除,如果都除不盡,則x為質數。根據該思路得到的演算法如下。(1)設除數為i,i的值從2變化到xdiv2,I的初值為2;(2)用i除x,得到餘數為R;(3)如果R=0,則表示x能被i整,x不是素數,演算法結束;否則,表示x不能被I整除,可能為素數,繼續;(4)使i加上1;(5)如果i<=xdiv2,那麼返回(2);否則,表示x為素數。Readln(x)Flag
0i
2xmodI=0truefalseflag
1i
i+1While(i<=x/2)and(flag=0)doWrite('yes')Flag=0truefalseWrite('no')程式:
programex(input,output);varx,i,r:integer;flag:integer;beginreadln(x);i:=2;flag:=0;while(i<=x/2)and(flag=0)dobeginifxmodi=0thenflag:=1;
i:=i+1;end;ifflag=0thenwriteln('Yes')elsewriteln('No')end.練習3:輸入一串字元,以回車符結束,輸出其中字母個數與數字個數。分析:確定使用while迴圈.迴圈條件是:輸入的字元不是回車符(即ord(ch)<>13)定義數據:ch:char;num1,num2:integer;計數器初始化num1
0,num2
0讀入第一個字元chWhileord(ch)<>13do讀入下一個字元chch是字母truefalseCh是數字truefalseInc(num1)Inc(num2)輸出結果num1,num2的值Programex;Varch:char;num1,num2:integer;Beginnum1:=0;num2:=0;read(ch);whileord(ch)<>13dobegin
if(ch>='a')and(ch<='z')or(ch>='A')and(ch<='Z')thennum1:=num1+1
elseif(ch>=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 销售总结课件教学课件
- 红火蚁的预防与治疗
- 教育培训机构的年终总结
- 第二章 相互作用-三种常见力 2025年高考物理基础专项复习
- 侵袭性肺曲霉菌病诊治指南
- 氧化碳的制取的研究说课稿
- 好玩的磁铁说课稿
- 农村水上运动中心建设合同协议书
- 污水处理厂标识系统招投标文件
- 投资合伙人合同协议书
- 耳鼻喉科手术分级目录2022
- 课后习题答案-电机与拖动-刘锦波
- 急混合细胞白血病
- GB/T 11836-2023混凝土和钢筋混凝土排水管
- 烟花爆竹生产企业2023安全生产费用投入计划和实施方案
- 第三章 继承优良传统 弘扬中国精神
- 中国阴道炎诊治课件
- 微生物生物转化
- 冠心病的护理心得体会(11篇)
- 高中数学 人教A版 选修一 空间向量基本定理 课件
- 古埃及古希腊古罗马柱式分析
评论
0/150
提交评论