版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
105/105中學信息學奧林匹克競賽培訓教程Pascal語言和程序設(shè)計基礎(chǔ)(第一部分)
第一部分Pascal語言和程序設(shè)計基礎(chǔ)預備知識基本程序結(jié)構(gòu)和幾個概念::標識符
保留字
常量
變量
運算符
表達式
標準數(shù)據(jù)類型Pacal語言程序結(jié)構(gòu)Programprog_name;var變量申明;begin程序體;end.例如:programpname;constn=4;typearr=array[1..4]ofinteger;vari:integer;a:arr;beginfori:=1tondoread(a[i]);readln;fori:=ndownto1dowrite(a[i]:4);writeln;
end.以上是一個PASCAL程序。從鍵盤讀入4個數(shù)據(jù),逆序輸出。一般來說,一個PASCAL程序包括以下幾個部分:程序頭:programpname;
其中,program是保留字,表示程序從這個地方開始,pname是標識符,是程序的名字,可由程序員自定。保留字是PASCAL選定的,具有固定意義和用法的專用單詞或縮寫,這些單詞不允許作其它使用。如上,“program”就有“程序從這里開始”這樣一種特別的意義,而“const”就有“常量說明從這里開始”的意義。我們不能再用“program”、“const”來作為其它變量、常量等的名字。標識符是以字母開頭的字母數(shù)字串,其長度最大為8個字符。用來表示常量、變量、類型、文件、過程、函數(shù)和程序的名字。如“pname”、“i”、“j”、“a1”就是合法的標識符;但“1a”、“#a”是非法的標識符。有一點要注意的是,在PASCAL中,字母除了作為字符值或字符串值之外,其大小寫是無關(guān)的。如標識符“A1”和“a1”在PASCLA看來是同一標識符。在PASCAL中除了保留字和自定義的標識符外,還有一類有特殊含義的標識符,這類標識符稱為標準標識符。它們是用來標記程序中經(jīng)常引用的處理對象,如常量、函數(shù)。(PASCAL定義的保留字和標準標識符附后)標識符在命名的時候要注意:1、名字要易記易讀,有意義。如8皇后問題程序名可以是“queen”也可以是“huanghou”等;2、不能用保留字、標準標識符作為自定義的標識符。說明部分:constn=4;typear=array[1..4]ofinteger;vari:integer;a:ar;其中,const部分是常量說明,說明一些在以下部分用到的,在整個程序執(zhí)行過程不改變值的量。這些量PASCAL稱為常量。在程序中用到這個值的地方均用常量名來代替。如上題中定義“n=4”指本程序處理4個數(shù)值,在下面的程序體中就用“n”來代替具體的值(如fori:=1ton)。如果要改變處理數(shù)據(jù)個數(shù),則只在常量說明部分修改“n=4”這一句就行了,而不用在程序中每一個用到的地方都加以修改。這樣不但在編寫程序的時候很方便,也增加了程序的可讀性,修改時更方便。常量說明在保留字“const”下開始??梢杂卸鄠€語句。常量說明語句的格式是:“常量名=值;”。如“n=4;”。n是常量名,4是該常量的值,“;”是語句分隔符。type部分是類型說明,說明一些在以下部分用到的數(shù)據(jù)類型。如數(shù)組、記錄、指針等。類型說明在保留字“type”下開始??梢杂卸鄠€語句。類型說明語句的格式是:“類型名=類型說明;”。如“ar=array[1..4]ofinteger;”。ar是類型名,array[1..4]ofinteger是類型說明,“;”是語句分隔符。var部分是變量說明。變量是指在程序執(zhí)行過程中可以通過賦值語句或讀語句來改變值的量。所有在程序中使用的變量都應該先在變量說明部分說明。PASCAL中引用的每個變量都有“名字”和“類型”屬性。變量說明“說明”的主要工作是告訴PASCA下面程序中要用到這個名字的量,同時這個量的類型是什么。變量說明在保留字“var”下開始??梢杂卸鄠€語句。變量說明語句的格式是:“變量名:變量類型;”。其中,如果有多個變量同一類型,則變量名與變量名之間用逗號分隔,變量名與變量類型之間用冒號分隔。如“i:integer;”(i是變量名,integer是類型名)、“i、j:integer;”(i、j是變量名,integer是類型名)……變量說明要注意:1、有效變量名稱不能大于8個字符;2、變量名稱必須以字母開頭;3、在同一個有效范圍內(nèi)變量名稱必須唯一。各個說明部分均以該部分的保留字開始。如“const”開始常量說明;“type”開始類型說明;“var”開始變量說明。一個程序包含多少種類型的說明,看需要而定,不是每一個程序都必須同時包含這三種說明。如果程序不須要用到常量,則常量說明部分可以省略;如果不須要用到類型說明,則類型說明可省……
PASCAL還有一條規(guī)則:先說明后引用。即所有在程序體中用到的“名字”必須都在說明部分說明過才能引用,否則就會出錯,通不過編譯,也執(zhí)行不了。如上,類型“ar”先在類型說明中定義,然后在變量說明中引用;變量i在變量說明中定義,在程序中引用。
程序體:beginfori:=1tondoread(a[i]);readln;fori:=ndownto1dowrite(a[i]:4);writeln;end.程序體是以begin
end.括起來的語句系列。“end”后面是一個小圓點,標識著程序結(jié)束,整個程序只有一個是一個程序的主要部分。編程要完成的工作大部分都在這里完成。程序體中每一語句均以“;”作為結(jié)束符。在書寫程序時,以“分層縮進”的風格來寫,以便提高程序的可讀性。所謂的“分層縮進”是指在邏輯上同一級的語句其起始點對齊,下一級的語句向右縮進。運算符
表達式PASCAL中的運算符有算術(shù)運算符和關(guān)系運算符。和我們在數(shù)學課中學的基本一樣但在寫法上有些不同,在寫程序時要特別注意寫法的不同:
+加號;-減號;*乘號(數(shù)學中寫為×);/除號(數(shù)學中寫為÷);MOD
取余
如:8MOD2=0,7MOD2=1,2MOD3=2;DIV
取整
如:8DIV2=4,7DIV2=3,2DIV3=0。在PASCAL只有上面6種數(shù)學運算。其它的就只能利用這6種運算的組合通過語句來實現(xiàn)。如a^2(a的平方)可以化成a*a。>
大于;<
小于;<>不等于(數(shù)學中寫為≠);<=小于等于(數(shù)學中寫為≤);>=大于等于(數(shù)學中寫為≥),變量、常量通過運算符連接起來的式子我們稱為表達式。一個單獨的變量或常量也是表達式。如a、a+3、a*3+b都是表達式。寫表達式時要注意PASCAL表達式跟我們已經(jīng)熟悉的數(shù)學表達式在格式上的區(qū)別:數(shù)學表達式PASCAL表達式注意2a2*a*號不能省略a÷ba/b除號的寫法a≠ba<>b不等號的寫法a≤ba<=b小于等于號的寫法標準數(shù)據(jù)類型:整型
實型
字符型
布爾型
數(shù)據(jù)類型可以理解為一個取值范圍和定義在這取值范圍上的運算規(guī)則。想一想我們對于數(shù)的理解:小學學自然數(shù),范圍是從0開始,那時候不知道有小數(shù),也不知道有負數(shù),允許的運算是+、-、×、÷,而且對于減法規(guī)定被減數(shù)要大于減數(shù)。到了中學,數(shù)的范圍擴大了,整數(shù)包括正數(shù)和負數(shù),減法運算也不再有額外的規(guī)定的了。同理,在PASCAL中“數(shù)據(jù)類型”也是一個取值范圍和在它上面定義的運算規(guī)則。PASCAL中定義好的標準數(shù)據(jù)類型一共有4個:整型、實型、字符型、布爾型,分別用保留字integer、real、char、boolean來標記它們。其取值范圍和運算如下:
整型(integer):范圍
-32768——32767;運算
+
-
*
/
mod
div
實型(real):范圍
運算
+
-
*
/字符型(char):范圍
可顯示的ASCII字符布爾型(boolean):范圍
true
false
運算
and
or
not在PASCAL中可使用的基本符號有:
(1)大寫字母A—Z;小寫字母a—z
;數(shù)字0—9
(2)其它字符+
—
*
/
=
>
<
>=
<=
<>
:=(
)[
].,:‘
$^(*
*){
}其中,有些符號是以雙字符作為一個整體,拆開后就失去原有的意義。如“<>”是一個表示“不等于”的關(guān)系運算符,如拆開后就變成了兩個關(guān)系運算符,分別表示“小于”、“大于”。PASCAL使用的保留字有:AND、ARRAY、BEGIN、CASE、CONST、DIV、DO、DOWNTO、ELSE、END、FILE、FOR、FUNCTION、GOTO
、IF、IN、LABEL、MOD、NIL、NOT、OF、PACKED、PROCEDURE、PROGRAM、RECORD、REPEAT、SET、THEN、TO、TYPE、UNTIL、VAR、WHILE、WITH、FORWARD常用的標準標識符有:
標準常量:FALSE
TRUE
MAXINT
MAXLONGINT
標準類型:INTEGER
BOOLEAN
REAL
CHAR
TEXT
標準文件:INPUT
OUTPUT
標準函數(shù):ABS
ACTAN
CHR
COS
EOF
ELON
EXP
LN
ODD
ORD
PRED
ROUND
SIN
SQR
SQRT
SUCC
TRUNC
標準過程:ASSIGN
GET
NEW
DISPOSE
PACK
PUT
READ
READLN
RESET
REWRITE
UNPACK
WRITE
WRITELN函數(shù)格式:functionfun_name(參數(shù)表):數(shù)據(jù)類型;var變量聲明;begin函數(shù)體;end;例題:寫出計算兩個整數(shù)a,b的和函數(shù)add(a,b)。過程格式:procedureproc_name(參數(shù)表);var變量聲明;begin過程體;end;例題:寫出在屏幕打印一行文字:”hello,Pascallanguageisveryeasy!”函數(shù)和過程的調(diào)用:例題:從鍵盤輸入:a,b兩個數(shù),輸出由這兩個數(shù)為直角邊的三角形的面積。【xoi00_01.pas】programxoi00_01;functionarea(consta,b:real):real;vars:real;begins:=a*b/2.0;area:=s;end;proceduremyproc;vara,b:real;s:real;beginwrite('Pleaseinputtwonumbera,b:');readln(a,b);s:=area(a,b);writeln('theareaoftrianis:',s:5:2);end;{=============mainprogram================}beginmyproc;end.練習:判斷以下標識符的合法性:a33aa17abcdex9.5αβλ將下列的數(shù)學表達式改寫成PASCAL表達式:b^2-4ac求下列表達式的值:20mod19,15mod9,7div8,19div3,(4>5)and(7<8),(8>9)or(9<10),2and((3=3)or(3<7))第一節(jié)順序結(jié)構(gòu)操作一操作二操作一操作二例題:計算圓的周長的過程:輸入圓的半徑;(操作一)計算圓的周長;(操作二)輸出圓的周長;(操作三)基本的程序語句:賦值語句:賦值語句是最簡單的語句,其一般形式為:<變量>:=<表達式>;“:=”稱為賦值號,賦值語句的作用是計算表達式的值,并賦給變量。對于任何一個變量必須首先賦值,然后才能引用,否則,未賦初值的變量將以一個隨機值參與運算。另外,賦值號兩邊的類型必須相同,但表達式值為整數(shù)時,它可自動化為實型后賦給該實型變量,即符合賦值相容。如:Pi:=3.14; R:=2; Age:=20; S:=Pi*R*R例:關(guān)于賦值的例子prssogramexample;vara,b:integer;begina:=3;b:=2;a:=a+b;writeln(a);writeln(b);end.輸入語句通過計算機的外設(shè)把數(shù)據(jù)送到計算機內(nèi)存的過程稱為輸入。TurboPascal語言的輸入語句有如下兩種形式:read(<變量名表>);readln(<變量名表>);<變量名表>是一個或幾個由逗號隔開的變量標識符,他們必須在程序說明部分預先說明,他們可以是整型、實型或字符型,布爾型不可以直接讀入。例如a,b,c為整型變量,read(a,b,c)之后,鍵盤輸入:203040<CR>(<CR>表示回車),結(jié)果:a=20,b=30,c=40readln語句和read語句不同之處在于輸入數(shù)據(jù)到各變量之后,readln自動換行,從下一行開始再輸入數(shù)據(jù)。一個read語句執(zhí)行完后,數(shù)據(jù)行中多余的未讀數(shù)據(jù)可以被下一個輸入語句讀入;而一個readln于執(zhí)行完后,數(shù)據(jù)行中多余未讀數(shù)據(jù)就沒有用了。readln語句中可以不包含變量名表。即有以下等價情況:read(a,b);readln等價于readln(a,b)輸入語句輸入的數(shù)據(jù)類型必須和變量一一對應。如果輸入的是一串整數(shù)或?qū)崝?shù),數(shù)據(jù)間用空格或回車分隔;若輸入的是一串字符,則不用分隔。輸出語句輸出是將內(nèi)存中的數(shù)據(jù)送到外設(shè)的過程。TurboPascal的輸出語句有兩種形式:write(<輸出項表>);writeln(<輸出項表>);其中<輸出項表>是一串用逗號分隔的常量、變量、函數(shù)名、表達式或字符串。如果是變量、函數(shù)名、表達式,則將其計算結(jié)果輸出;如果是常量或字符串,則直接輸出其值。write和writeln的區(qū)別在于:write語句是輸出項輸出后,不換行,光標停留在最后一項后,writeln語句按項輸出后,自動換行,光標則停留在下一行的開始位置。writeln語句允許不含有輸出項,即僅writeln;表示換行。TurboPascal語言把輸出項的數(shù)據(jù)顯示占用的寬度稱為域?qū)?,你可以根?jù)輸出格式的要求在輸出語句中自動定義每個輸出項的寬度。定義寬度時分為單域?qū)捄碗p域?qū)?。單域?qū)捿敵龈袷剑簑riteln(I:n);在n個字符寬的輸出域上按右對齊方式輸出I的值,若n大于I的實際位數(shù),則在I值前面補(n-I的實際位數(shù))個空格。若I的實際位數(shù)大于n,則自動突破限制。n必須是整數(shù)。雙域?qū)捿敵龈袷剑簑riteln(a:n:m);雙域?qū)捴饕糜趯嵭蛿?shù)據(jù)的輸出。n的用法同上。在n個字符寬的輸出域上按右隊齊方式用小數(shù)點形式輸出a的數(shù)值,m是小數(shù)點后的位數(shù)。原來的數(shù)據(jù)按該該格式指定的小數(shù)位數(shù)四舍五入。若m=0,則不輸出小數(shù)部分和小數(shù)點,原數(shù)據(jù)四舍五入取整。n,m必須是整數(shù)。例:輸出語句的例子programshuchu;consts='pascal';vari:integer;r:real;c:char;b:boolean;begini:=12345;r:=123.45c:='a';b:=true;writeln('i=');writeln(i:6);writeln('r=',r,r:6:1);writeln('c=',c,c:10);writeln('b=',b,b:10)end.復合語句復合語句是由若干語句組成的序列,語句之間用分號“;”隔開,并且以begin和end括起來,作為一條語句。復合語句的一般形式:begin語句1;語句2;……語句n;end;例:變量值的交換programswap;vara,b,t:integer;begina:=10;b:=20;begint:=a;a:=b;b:=t;end;writeln('a=',a,'b=',b)end.例題1:輸入圓的半徑,求出圓的周長和面積:ProgamCalCircle;varR,C,S:Real;{變量聲明}beginwrite(‘輸入圓的半徑:’);readln(R);C:=2*Pi*R;write(‘周長=’,C);readln;S:=Pi*sqr(R);{sqr(R)=R*R}write(‘面積=’,S);readln;end.例題2:找出下面程序中的語法錯誤。ProgramExample1;{計算圓環(huán)面積的程序,R2表示外圓環(huán)的半徑,R1表示內(nèi)圓環(huán)的半徑,R2>R1}varR1,R2:Real;beginS=(R2+R1)*(R2-R1)*Pi{Pi=3.14為常數(shù)}writeln(s)end;糾正以后的程序ProgramExample1;{計算圓環(huán)面積的程序,R2表示外圓環(huán)的半徑,R1表示內(nèi)圓環(huán)的半徑,R2>R1}varR1,R2:real;S:real;{每一個變量都必須聲明}beginS=(R2+R1)*(R2-R1)*Pi;{Pi=3.14為常數(shù)}writeln(s);{語句必須以“;”結(jié)束}end.{主程序必須以“.”結(jié)尾}練習:編寫程序?qū)崿F(xiàn)以下功能:1、輸入三角形三邊的長,計算三角形的面積。計算公式:Pascal程序中計算平方根的函數(shù)為:sqrt(x);{x:real;x0}基本要求:有友好的輸入輸出界面,不需要考慮輸入的a,b,c是否可以構(gòu)成三角形,假設(shè)輸入的數(shù)據(jù)符合要求。第二節(jié)IF分支結(jié)構(gòu)例題:輸入一個考試分數(shù),如果大于等于60就說恭喜你考試及格,如果小于60就說真差勁,要努力哦!programJudgeScore;輸入分數(shù)→score;如果Score≥60那么輸出“恭喜你考試及格”否則輸出“真差勁,要努力哦”“如果...那么”形式的判斷在Pascal中使用If語句來實現(xiàn)。IF語句是由一個布爾表達式和兩個供選擇的操作序列組成。運行時根據(jù)布爾表達式求值結(jié)果,選取其中之一的操作序列執(zhí)行。有兩種形式的IF語句:if<布爾表達式>then<語句>;if<布爾表達式>then<語句1>else
<語句2>;當布爾表達式的值為真,則執(zhí)行then后面的語句,值為假時有兩種情況:要么什么也不做,要么執(zhí)行else后面的語句。注意else前面沒有分號,因為分號是兩個語句之間的分隔符,而else并非語句。如果在該處添了分號,則在編譯的時候就會認為if語句到此結(jié)束,而把else當作另一句的開頭,輸出出錯信息。前面例題的Pascal程序代碼:ProgramJudgeScore;varscore:real;{聲明分數(shù)變量score}beginreadln(score);{輸入分數(shù)}ifscore>=60thenbegin{score代表分數(shù)的變量}writeln(‘恭喜你,考試及格!’);endelsebeginwriteln(‘真差勁,要努力哦!’);end;{endifscore>=60}end.例:求y=f(x),當x>0時,y=1,當x=0時,y=0,當x<0時,y=-1programlianxi;varx,y:real;beginifx>0theny:=1;ifx=0theny:=0;ifx<0theny:=-1;writeln('y=',y);end.在TurboPascal語言if語句中被構(gòu)造的語句只能是一條語句,當條件選擇某個分支的計算要用多個語句描述時,就必須把該分支用begin和end括來,寫成復合語句。在用if語句連續(xù)嵌套時,如果你插入適量的復合語句,有利于程序的閱讀和理解。例:當x>0時候,計算x*x,并且輸出x和x*gramlianxi;varx,x1:real;beginreadln('x=',x);
ifx>=then
begin
x1:=x*x;
writeln('x*x=',x1);
writeln('x=',x);
end;
end.當if語句嵌套時,TurboPascal約定else總是和最近的一個if配對。前面介紹了If語句的使用情況,下面來概括if判斷語句的使用方法。分支結(jié)構(gòu)的基本情況:if條件成立thenbegin處理;end;下一語句;if條件成立thenbegin 操作B;endelse{if條件不成立then}begin 操作A;end;下一語句;練習:寫出下列關(guān)系表達式和邏輯表達式的Pascal語句:區(qū)分合格和不合格:x>=6060分到70分之間:(x>=60)and(x<=70)3、判別閏年的條件(年份能被4整除,并且不能被100整除;或者能被400整除的整數(shù)年份):((ymod4=0)and(ymod100<>0))or(ymod400=0)編寫程序?qū)崿F(xiàn)下列功能:1、從鍵盤讀入一個數(shù),判斷它的正負。是正數(shù),則輸出"+",是負數(shù),則輸出"-"2、輸入a,b,c三個不同的數(shù),將它們按由小到大的順序輸出3、鐵路托運行李規(guī)定:行李重不超過50公斤的,托運費按每公斤0.15元計費;如超50公斤,超過部分每公斤加收0.10元。編一程序完成自動計費工作。4、打印某年某月有多少天。(提示:A、閏年的計算方法:年數(shù)能被4整除,并且不能被100整除;或者能被400整除的整數(shù)年份。B、利用MOD運算可以判斷一個數(shù)能否被另一個數(shù)整除)5、從鍵盤輸入3個數(shù)a,b,c輸出其中最大的數(shù)。第三節(jié)Case分支結(jié)構(gòu)case語句是由一個表達式和眾多可選擇的操作序列組成。運行時,根據(jù)表達式的求值結(jié)果,在眾多的分支中選取一個分支執(zhí)行。其形式為:case表達式of常量1:語句1;常量2:語句2;……常量n:語句n;else語句n+1;
{可選項}end;表達式只能是順序類型(除了實型以外的簡單類型),其值必須是唯一確定并且和表達式類型相同。case語句執(zhí)行和表達式值相匹配的case常數(shù)所指向的那條語句,如果沒有相匹配的值,則執(zhí)行else部分(如果有的話)或者什么也不做。在else前面的語句末尾有分號,這是和if語句不同的。Case表達式的應用:例題:輸入一個考試分數(shù)(整數(shù)),根據(jù)分數(shù)情況報告相應的信息。要求:假設(shè)輸入的分數(shù)為[0,100]之間的整數(shù)。ProgramJudgeScore2;varx:real;beginread(x);{輸入一個分數(shù)}casexof0..59:{}writeln(‘不及格’;60..89:{}writeln(‘及格’);90..100;{}writeln(‘優(yōu)秀’);elsewriteln(‘錯誤的分數(shù)’);end;{casexof}end.例:根據(jù)學生的成績給予相應的等級,對應關(guān)系如下:
90——100A
80——89B
60——79C
60以下D
programchengji;
vars:real;ch:char;
begin
write('inputthescore:');
readln(s);
if(s>=0)and(s<=100)then
casesdiv10of
10,9:ch:='A';
8:ch:='B';
7,6:='C';
elsech:='D';
end;
writeln(s,'--',ch);
end.練習:1、我們把字母作如下的分類:大寫字母:’A’..’Z’;小寫字母:’a’..’z’;數(shù)字:’0’..’9’;其他字母,編寫一個程序,根據(jù)上述分類的方法,輸入一個字母,報告該字母所屬的類型。2、某超市為了促銷,規(guī)定:購物不足50元的按原價付款,超過50不足100的按九折付款,超過100元的,超過部分按八折付款。編一程序完成超市的自動計費的工作。第四節(jié)for循環(huán)結(jié)構(gòu)程序設(shè)計時我們經(jīng)常要做一些重復的任務通過反復的執(zhí)行某一個動作來完成任務,編寫這一類程序我們使用循環(huán)結(jié)構(gòu)來實現(xiàn)。如計算1+2+3+….+100。Pascal中循環(huán)結(jié)構(gòu)通過使用For、While、Repeat三種語句來實現(xiàn)。For語句是形式最簡單的循環(huán)語句。例題1:輸入正整數(shù)N,計算分析:=1+2+3+…+N,因此我們必需重復的執(zhí)行S:=S+i,其中S代表和,S=1 {i=1}S=1+2 {i=2}S=1+2+3 {i=3}S=1+2+3+4 {i=4}….S=1+2+3+4+…+N {i=N}i從1變化到N,計算前I項的和:1+2+3+…+I,寫成Pascal代碼如下:Fori:=1toNDOS:=S+i;{i從1變化到N重復執(zhí)行S:=S+i}完整的程序如下:ProgramExample1_4VarN,I,S:integer;BeginWrite(‘輸入正整數(shù)N:’);Readln(N);S:=0;ForI:=0tondoS:=S+I;Writeln(‘1+2+3+…+’,n,’=’,s);End.FOR循環(huán)有兩種形式:升序形式:for<控制變量>:=<初值>to<終值>do<語句>降序形式:for<控制變量>:=<初值>downto<終值>do<語句>for語句功能描述:雖然for循環(huán)形式簡單,但是執(zhí)行的機制卻很復雜。其基本過程如下:計算初值并記憶判斷初值是否超出終值、如果超過則執(zhí)行步驟7,否則執(zhí)行步驟3把初值賦給控制變量執(zhí)行do后面的語句(循環(huán)體)判斷控制變量的值是否達道終值,如果是則執(zhí)行步驟6,否則執(zhí)行步驟7控制變量取下一個值(升序取后繼,降序取前驅(qū))(循環(huán)結(jié)束)執(zhí)行下一語句.例題:編寫程序輸出序號從32到126的ASCII字符與對應代碼之間的對應關(guān)系。每行輸出5個字符,輸出結(jié)果如下如所示。(Example4_2)programexample4_2;vari,j:byte;beginfori:=32to126dobeginif(jmod5=0)thenwriteln;write(i:5,chr(i):2);j:=j+1;end;end.程序說明:標準函數(shù)chr(i)可以得到代碼為i的字符。jmod5求j模5的余數(shù)。語句if(jmod5=0)thenwriteln;用于控制換行,每行寫5個字符的對應關(guān)系。語句write(i:5,chr(i):2);用于格式化輸出結(jié)果。編程完成下列計算:1、2、把數(shù)碼1,2,3,4,…,9分成3組,每組構(gòu)成一個3位數(shù),使這3個3位數(shù)恰好成1:2:3,該怎樣分?求出所有的解答來。(如:192,384,576就是一組解答)求出所有的三位數(shù) ,它除以11所得余數(shù)等于它的三個數(shù)字的平方和。第五節(jié)while、repeat循環(huán)結(jié)構(gòu)While語句是另外一種實現(xiàn)循環(huán)的語句,一般形式如下:While<條件>do<語句>While循環(huán)的執(zhí)行過程如下:判斷條件是否成立,條件成立時執(zhí)行步驟2,否則執(zhí)行步驟4執(zhí)行do后面的語句(循環(huán)體)返回步驟1結(jié)束循環(huán),執(zhí)行下一語句注意:一定要有使條件取假(False)的時候,否則會出現(xiàn)死循環(huán)。例題:從鍵盤輸入一批學生考試數(shù)據(jù),統(tǒng)計這些數(shù)據(jù)中大于80的數(shù)的個數(shù)。分析:因為學生的人數(shù)沒有確定,因此不方便用for循環(huán)來完成此項工作,但是用while循環(huán)比較容易實現(xiàn)。(example4_3)whilescore>=0do輸入一個學生成績→score;計算總分;Pascal代碼:whilescore>=0dobeginreadln(score);total:=total+score;end;完整的程序代碼:programexample4_3;varscore:integer;total:integer;c:char;beginwriteln('輸入學生分數(shù):');readln(score);total:=0;whilescore>=0dobeginreadln(score);total:=total+score;end;writeln('總分為:',total);read(c);end.Repeat語句與while語句基本類類似,只是while先判斷條件,reapeat語句先執(zhí)行循環(huán)體然后再判斷。Repeat<語句>;{循環(huán)體部分}Until<條件>;{循環(huán)結(jié)束條件}執(zhí)行過程如下:執(zhí)行循環(huán)體判斷條件,如果布滿足重復1,否則執(zhí)行步驟3結(jié)束循環(huán),執(zhí)行下一語句例題:改寫Example4_3程序使用Repeat循環(huán)語句實現(xiàn)。(Example4_4)programexample4_4;varscore:integer;total:integer;c:char;beginwriteln('輸入學生分數(shù):');total:=0;repeatreadln(score);total:=total+score;untilscore<0;writeln('總分為:',total);read(c);end.練習:計算下列式子的值:1+3+5+…+991+2+4+8+…+128+256+512+10241+(1+2)+(1+2+3)+…+(1+2+3+4+…+N)有一分數(shù)序列:求出這個數(shù)列的前20項的和。求水仙花數(shù)。所謂水仙花數(shù),是指一個三位數(shù),如果滿足,則abc是水仙花數(shù)。輸入一個整數(shù),計算它各位上數(shù)字的和。(注意:是任意位的整數(shù))輸入一整數(shù)A,判斷它是否質(zhì)數(shù)。(提示:若從2到A的平方根的范圍內(nèi),沒有一個數(shù)能整除A,則A是質(zhì)數(shù)。)求兩個數(shù)的最小公倍數(shù)和最大公約數(shù)。(提示:公約數(shù)一定小于等于兩數(shù)中的小數(shù),且能整除兩數(shù)中的大數(shù)。公倍數(shù)一定大于等于兩數(shù)中的大數(shù),且是大數(shù)的倍數(shù),又能給兩數(shù)中的小數(shù)整除。)編寫一個譯碼程序,把一個英語句子譯成數(shù)字代碼。譯碼規(guī)則是以數(shù)字1代替字母A,數(shù)字2代替字母B,……,26代替字母Z,如遇空格則打印一個星號‘*’,英文句子以‘.‘結(jié)束?!鞍馘X買百雞”是我國古代的著名數(shù)學題。題目這樣描述:3文錢可以買1只公雞,2文錢可以買一只母雞,1文錢可以買3只小雞。用100文錢買100只雞,那么各有公雞、母雞、小雞多少只?與之相似,有"雞兔同籠"問題。輸入一個正整數(shù)N,把它分解成質(zhì)因子相乘的形式。如:36=1×2×2×3×3;19=1×19(提示:設(shè)因子為I,從2開始到N,讓N重復被I除,如果能整除,則用商取代N,I為一個因子;如果不能整除,再將I增大,繼續(xù)以上操作,直到I等于N。)編程實現(xiàn):求之值,其中a是一個數(shù)字。例如:(當n=5時),n由鍵盤輸入。一個數(shù)如果恰好等于它的因子之和,這個數(shù)就稱為“完數(shù)”。例如:6的因子為1、2、3,而6=1+2+3,因此6是“完數(shù)”。編程序找出1000以內(nèi)的所有完數(shù)。編一程序,輸入a,b,c,d,e,f,然后解出方程組的解。第六節(jié)數(shù)據(jù)類型簡單數(shù)據(jù)類型Pascal語言基本數(shù)據(jù)類型由:integer(longint,shortint,byte),real,char,Boolean.等構(gòu)成。自定義數(shù)據(jù)類型:我們可以在基本數(shù)據(jù)類型的基礎(chǔ)上定義新的數(shù)據(jù)類型,類型定義的保留字為“Type”,格式為:TYPE<類型標識符>=<數(shù)據(jù)類型>如:TypeMyLong=Longint;枚舉類型:“枚舉”的意思就是把所需要的對象都一個一個的列舉出來。比方說星期是一個只有7個元素的數(shù)據(jù),因此我們可以定義一種數(shù)據(jù)類型TWeekDay代表星期,如果一個變量定義為TWeekDay類型,那么他的取值范圍就是Sunday..Saturday,另外顏色TColor也一樣。習慣上我們在自定義類型名稱前加上“T”,如TColor,TWeekDay,而且單詞以大寫字母開始。TypeTWeekDay=(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday);TColor=(Red,Yellow,Blue,Green.Purple,White,Black);枚舉變量的第一個代表0,第二個代表1,以此類推,如上面定義的TweekDay類型,Sunday=0,Monday=1,…,Saturday=6。例題:輸入今天的日期數(shù)字:0=Sunday,1=Monday,…6=Saturday,輸出明天的日期,用英文單詞表示?!緓oi00_02.pas】programxoi00_02;TypeTWeekDay=(Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday);vartoday,tomorrow:TWeekDay;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;{iftoday=saturdaythen}end;{if(number<0)or(number>6)}end.子界類型:子界類型是在其它的離散類型的值域中取出一部分構(gòu)成獨立的類型。子界類型的一般定義形式如下:TYPE<子界類型標識符>=<下界常量>..<上界常量>;如:TYPETmonth=1..12;TYPETscore=0..100;例按月、日、年順序讀入一日期,輸出該日期是這一年中的第幾天。programdate;varyear:0..2010;month,i:1..12;day:1..31;dayth:integer;beginread(month,day,year);dyath:=0;fori:=1tomonth-1docaseiof1,3,5,7,8,10,12:dayth:=dayth+31;2:if((yearmod4=0)and(yearmod100<>0)or(yearmod400=0)thendayth:=dayth+29elsedayth=:=dayth+28;4,6,9,11:dayth:=dayth+30;end;dayth:=dayth+day;writeln(dayth)end.數(shù)組類型:定義數(shù)組:Type數(shù)組類型標識符=Array[下標類型]OF數(shù)組元素類型數(shù)組元素類型本身也可以是復雜的自定義類型,如子界類型,數(shù)組類型,記錄等。例如:定義存放學生姓名的字符數(shù)組:TYPETName=Array[1..20]ofChar;定義一個存放班級學生(50人)名單的數(shù)組:TYPETStudents=Array[1..50]ofTName也可以這么定義:TYPETStudents=Array[1..50]ofArray[1..20]ofChar;例1:輸入5個考分數(shù),計算它們的總分?!緓oi00_03.pas】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個數(shù),將這10個數(shù)逆序輸入,并求這10個數(shù)的和,輸出這個和。programp1;vara: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.例3:用篩法求100以內(nèi)的素數(shù)(質(zhì)數(shù))。
分析:素數(shù)是除了1和它本身以外沒有其它約數(shù)的數(shù)。用篩法求素數(shù)的方法是:用質(zhì)數(shù)篩去合數(shù):從第一個素數(shù)2開始,把它的倍數(shù)去掉;這樣2以后的第一個非0數(shù)就一定也是素數(shù),把它的倍數(shù)也刪了……重復這個刪數(shù)過程,直到在所找到的素數(shù)后再也找不到一個非0數(shù)。把所有非0數(shù)輸出。
programp2;vara:array[1..100]ofinteger;i,j,k:integer;beginfori:=1to100doa[i]:=i;a[1]:=0;i:=2;whilei<=100dobegink:=i;whilek<=100dobegink:=k+i;a[k]:=0;end;{上面將所有a[i]的倍數(shù)清0}i:=i+1;whilea[i]=0doi:=i+1;{查找接下來的第一個非0數(shù)}end;fori:=1to100doifa[i]<>0thenwrite(a[i],'');end.字符串類型:如果數(shù)組存放的是字符,則成為字符數(shù)組。例如前面提到的學生姓名:Tname可以存放20個字符。為了操作方便TurboPascal提供了字符串類型和操作函數(shù)。字符串類型:String。例如前面的學生姓名可以定義為:TypeTName=String[20];字符串定義時,如不指定長度,則按該類型的最大長度(255個字符)分配空間,使用時最大可用長度為255個;如果在中括號中給出一個具體的值(1—255之間),則按這個值的大小分配空間。使用時,最大的可用長度即為該值。字符串類型既可按數(shù)組方式輸入、輸出,也可直接輸入、輸出:readln(s);writeln(s);多個字符串輸入時以回車作為數(shù)據(jù)間的分隔符;每個readln語句只能讀入一個字符串。操作函數(shù):連接函數(shù):concat(s1,s1,…,sn),相當于:S1+S2+…+Sn截取子字符串:copy(S,I,L),從字符串S左邊第I個字符起連續(xù)截取L個字符。長度函數(shù):length(S),計算字符串S的長度。Length(S)=Ord(S[0])子串點的函數(shù):pos(P,S),返回P在S中第一次出現(xiàn)的位置。刪除子串過程:delete(S,I,L),在S中從的I個字符起刪除L個字符。插入子串函數(shù):insert(S,D,L),在D中的第I個字符位置插入字符串S。記錄類型:記錄類型由固定數(shù)量的具有不同類型的成分組成,在實際的程序設(shè)計中,這種類型非常有用,比方說學生的信息包括:學號,姓名,語文,數(shù)學,英語成績,平均分等組成,用一個簡單的數(shù)據(jù)類型無法表達。我們可以這樣定義:TypeTScore=0..100;TScores=Array[1..5]ofTScore;TStudent=RecordNO:String[5];Name:String[16];Score:TScores;Avg:Real;End;{EndTypeTStudent}TStudents=Array[1..50]ofTStudent;在程序中可以使用Varstudent:Tstudents;定義一個學生變量,可以使用student[1].Name來訪問學生的姓名。集合類型:集合是指相同類型的數(shù)據(jù)匯集在一起構(gòu)成的數(shù)據(jù)結(jié)構(gòu),如學生集合,類似于數(shù)學中的集合,但是構(gòu)成集合的數(shù)據(jù)類型必須是簡單的離散類型,如:Byte,Shortint,Longint,char,Boolean,枚舉,子界類型。定義:Type<集合數(shù)據(jù)類型標識符>=Setof<基類型>;例如:TypeUperLetters=Setof[‘A’..’Z’];TypeEvenDigits=Setof[0,2,4,6,8];集合的運算:并:+;差:-;相等:=;不等:<>;包含:>=;包含于:<=;屬于:in;具體含義參考數(shù)學中的集合運算。例4:傳說中有一個殘暴的國王,喜歡殺戮百姓。有一次,他抓到30個百姓并要一一殺掉。在這30個百姓中間有一個聰明人,他站出來對國王說:“請國王大發(fā)慈悲,赦免二人不死?!眹鯁枺骸吧饷饽亩瞬凰??”那個聰明人回答說:“我們30個人圍成一圈,從1開始報數(shù),凡數(shù)到5的人就拉出去殺掉。剩下的人繼續(xù)從1開始報數(shù),循環(huán)反復,直到剩下兩個人為止,這兩個人被赦免?!眹跻宦牶苡幸馑?,采納了聰明人的建議,赦免了兩個人,而那個聰明人就是其中之一。請你設(shè)計一個程序,由計算機判斷聰明人要站在什么位置,才能躲過這一場屠殺。問題分析:首先,設(shè)百姓的人數(shù)為M人,設(shè)數(shù)到N的人被殺掉。用數(shù)組A(M)存放M個人是否還在圈中的信息。其中,A(I)=1表示第I個人還在圈中。A(I)=0表示第I個人已被殺掉。開始時,數(shù)組A中所有的元素都是1,表示每個人都站在圈中。用K=K+A(I)來實現(xiàn)報數(shù)功能,因為只有還在圈中的人才能使K的值增加。用變量D來記錄出圈的人數(shù),當D=M時,表示所有的人都出圈了。最后出圈的兩個人就是被赦免的人。程序清單:【xoi00_05.pas】programxoi00_05;constm=100;constn=10;vara:array[1..m]ofinteger;i,d,k,p:integer;beginwriteln;writeln('====================');fori:=1tomdoa[i]:=1;d:=0;k:=0;whiletruedobeginfori:=1tomdobegink:=k+a[i];ifk<>nthencontinue;write(i:4);p:=p+1;ifp>9thenbeginp:=0;writeln;end;a[i]:=0;k:=0;d:=d+1;ifd=mthenexit;end;end;{while}end.例5:輸入一個十進制數(shù),將其轉(zhuǎn)換成二進制數(shù)。輸入:[KEYBOARD]輸出:[SCREEN]255FF[問題分析]模擬手算.programbin;constmax=20;vari,j:integer;str:array[1..max]ofbyte;procedureprint;vark,r:integer;begink:=max;repeatdec(k);untilstr[k]=1;forr:=kdownto1dowrite(str[r]);writeln;end;beginwrite('Pleaseinputanintegerbetween1..32767:');readln(i);j:=0;repeatinc(j);str[j]:=imod2;i:=idiv2;untili=1;str[j+1]:=1;print;end.練習:數(shù)學黑洞6174:已知:一個任意的四位正整數(shù)。將數(shù)字重新組合成一個最大的數(shù)和最小的數(shù)相減,重復這個過程,最多七步,必得6174。即:7641-1467=6174。將永遠出不來。求證:所有四位數(shù)數(shù)字(全相同的除外),均能得到6174。輸出掉進黑洞的步數(shù)。隨機產(chǎn)生20個三位數(shù),將這20個數(shù)按從小到大的順序排列,要求在排列中,用盡可能少的交換次數(shù)。輸入10個學生的姓名,編一程序?qū)⑺鼈儼醋帜傅捻樞蚺帕小S幸唤M數(shù),其排列形式如下:11,19,9,12,5,20,1,18,4,16,6,10,15,2,17,3,14,7,13,8,且尾部8和頭部11首尾相連,構(gòu)成環(huán)形的一組數(shù),編程找出相鄰的4個數(shù),其相加之和最大,并給出它們的起始位置。有一組數(shù)其排列順序如下:(設(shè)有N個)3,6,11,45,23,70,67,34,26,89,90,15,56,50,20,10。編一程序交換這組數(shù)中任意指定的兩段。有M個猴子圍成一圈,每個有一個編號,編號從1到M。打算從中選出一個大王。經(jīng)過協(xié)商,決定選大王的規(guī)則如下:從第一個開始,每隔N個,數(shù)到的猴子出圈,最后剩下來的就是大王。要求:從鍵盤輸入M,N,編程計算哪一個編號的猴子成為大王。請你設(shè)計一個程序,讓計算機找出40個自然數(shù)來,使得其中任意兩個數(shù)之差均不相等。問題分析:首先,開辟一個數(shù)組S(I),準備存放這40個數(shù),再開辟一個數(shù)組CHA(I),用來存放兩個數(shù)的差。尋找某一個滿足條件的自然數(shù)的過程如下:把1和2放進數(shù)組S中;把1放進數(shù)組CHA中;當尋找下一個自然數(shù)時,要把這個自然數(shù)與數(shù)組S中的每一個數(shù)相減,再判斷所得的差是否在數(shù)組CHA中;如果所得的差不在數(shù)組CHA中,說明又找到一個滿足條件的自然數(shù)。把這個自然數(shù)放進數(shù)組S中,同時把這個自然數(shù)與數(shù)組S中原有的每一個自然數(shù)的差記錄在數(shù)組S中去。如果所得的差與數(shù)組CHA中的某一個數(shù)重復,說明這個自然數(shù)不符合條件,繼續(xù)尋找下一個自然數(shù)。重復步驟(3),直到找到40個自然數(shù)為止。第七節(jié)常用函數(shù)Pascal中的數(shù)學函數(shù)求絕對值函數(shù)abs(x)定義:functionAbs(X):(Sametypeasparameter);
說明:X可以是整型,也可以是實型;返回值和X的類型一致
例子:
var
r:Real;
i:Integer;
begin
r:=Abs(-2.3);{2.3}
i:=Abs(-157);{157}
end.取整函數(shù)int(x)
定義:functionInt(X:Real):Real;
注意:X是實型數(shù),返回值也是實型的;返回的是X的整數(shù)部分,也就是說,X被截尾了(而不是四舍五入)
例子:
varR:Real;
begin
R:=Int(123.567);{123.0}
R:=Int(-123.456);{-123.0}
end.截尾函數(shù)trunc(x)
定義:functionTrunc(X:Real):Longint;
注意:X是實型表達式.Trunc返回Longint型的X的整數(shù)部分
例子:
begin
Writeln(1.4,'becomes',Trunc(1.4));{1}
Writeln(1.5,'becomes',Trunc(1.5));{1}
Writeln(-1.4,'becomes',Trunc(-1.4));{-1}
Writeln(-1.5,'becomes',Trunc(-1.5));{-1}end.四舍五入函數(shù)round(x)定義:functionRound(X:Real):Longint;
注意:X是實型表達式.Round返回Longint型的X的四舍五入值.如果返回值超出了Longint的表示范圍,則出錯.
例子:
begin
Writeln(1.4,'roundsto',Round(1.4));{1}
Writeln(1.5,'roundsto',Round(1.5));{2}
Writeln(-1.4,'roundsto',Round(-1.4));{-1}
Writeln(-1.5,'roundsto',Round(-1.5));{-2}
end.取小數(shù)函數(shù)frac(x)定義:functionFrac(X:Real):Real;
注意:X是實型表達式.結(jié)果返回X的小數(shù)部分;也就是說,F(xiàn)rac(X)=X-Int(_X).
例子:
var
R:Real;
begin
R:=Frac(123.456);{0.456}
R:=Frac(-123.456);{-0.456}
end.
求平方根函數(shù)sqrt(x)和平方函數(shù)sqr(x)
定義:平方根:functionSqrt(X:Real):Real;
注意:X是實型表達式.返回實型的X的平方根.
平方:functionSqr(X):(Sametypeasparameter);
注意:X是實型或整型表達式.返回值的類型和X的類型一致,大小是X的平方,即X*X.
例子:
beginWriteln('5squaredis',Sqr(5));{25}Writeln('Thesquarerootof2is',Sqrt(2.0));{1.414}end.字符串函數(shù)求長度length
定義:functionLength(S:String):Integer;
例子:
var
S:String;
begin
Readln(S);
Writeln('"',S,'"');
Writeln('length=',Length(S));
end.復制子串copy
定義:functionCopy(S:String;Index:Integer;Count:Integer):String;
注意:S是字符串類型的表達式。Index和Count是整型表達式。Copy返回S中從Index開始,Count個字符長的一個子串。
例子:
varS:String;
begin
S:='ABCDEF';
S:=Copy(S,2,3);{'BCD'}
end.插入子串insert
定義:procedureInsert(Source:String;varS:String;Index:Integer);
注意:Source是字符串類型的表達式。S是任意長度字符串類型變量。Index是整型表達式。Insert把Source插在S中Index處。如果結(jié)果字符串的長度大于255,那么255之后的字符將被刪除。
例子:
var
S:String;
begin
S:='HonestLincoln';
Insert('Abe',S,8);{'HonestAbeLincoln'}
end.刪除子串delete
定義:procedureDelete(varS:String;Index:Integer;Count:Integer);
注意:S是字符串類型變量。Index和Countare是整型表達式。Delete刪除S中從Index開始的Count個字符。如果Index大于S的長度,則不刪除任何字符;如果Count大于S中從Index開始的實際字符數(shù),則刪除實際的字符數(shù)。
例子:
var
s:string;
begin
s:='HonestAbeLincoln';
Delete(s,8,4);
Writeln(s);{'HonestLincoln'}
Delete(s,9,10);
Writeln(s);{'HonestL'}
end.字符串轉(zhuǎn)為數(shù)值val
定義:procedureVal(S;varV;varCode:Integer);
在這里:
S是由一系列數(shù)字字符構(gòu)成的字符串類型變量;。
V是整型或?qū)嵭妥兞浚?/p>
Code是Integer型變量
注意:Val將S轉(zhuǎn)為它的數(shù)值形式。
例子:
vars:string;I,Code:Integer;
begin
s:='1234';
val(s,i,code);
writeln(i);{1234}
end.數(shù)值轉(zhuǎn)為字符串str
定義:procedureStr(X[:Width[:Decimals]];varS:string);
注意:將數(shù)值X轉(zhuǎn)成字符串形式。
例子:
var
S:string[11];
begin
Str(I,S);
IntToStr:=S;
end;
begin
Writeln(IntToStr(-5322));
Readln;
end.求子串起始位置pos
定義:functionPos(Substr:String;S:String):Byte;
注意:Substr和S字符串類型表達式。Pos在S中搜索Substr并返回一個integer值。這個值是Substr的第一個字符在S中的位置。如果在S中沒有找到Substr,則Pos返回0。
例子:
varS:String;
begin
S:='123.5';
{Convertspacestozeroes}
whilePos('',S)>0do
S[Pos('',S)]:='0';
end.字符完全串連+
定義:操作符+把兩個字符串聯(lián)在一起。
例子:
vars1,s2,s:string;
begin
s1:='Turbo';
s2:='pascal';
s:=s1+s2;{'Turbopascal'}
end.字符串壓縮空格串連-
定義:操作符-去掉第一個字符串最后的空格后,將兩個字符串聯(lián)在一起。
例子:
vars1,s2,s:string;
begin
s1:='Turbo';
s2:='pascal';
s:=s1-s2;{'Turbopascal'}
end.第八節(jié)指針指針的動態(tài)變量1.定義指針類型在TurboPascal中,指針變量中存放的某個存儲單元的地址,即指針變量指向某個存儲單元。一個指針變量僅能指向某一種類型的存儲單元,這種數(shù)據(jù)類型是在指針類型的定義中確定的,稱為指針類型的基類型。指針類型定義如下:類型名=^基類型名;例如:typeq=^integer;vara,b,c:q;說明q是一指向整型存儲單元的指針類型,其中"^"為指針符。a,b,c均定義為指針變量,分別可以指向一個整型存儲單元。上例也可定義為:vara,b,c:^integer;指針也可以指向有結(jié)構(gòu)的存儲單元。例如:typeperson=recordname:string[10];sex:(male,female);age:20..70end;varpt:^person;pt為指向記錄類型person的指針變量。2.動態(tài)變量應用一個指針指向的動態(tài)存儲單元即動態(tài)變量的形式如下:指針變量名^例如:p^、q^、r^指針變量p和它所指向的動態(tài)變量^p之間有如下關(guān)系:P->P'以下語句把整數(shù)5存放到p所指向的動態(tài)變量p^中去:p^:=5;以下語句把p所指向的p^中的值賦給整型變量i:i:=p^;如果指針變量p并未指向任何存儲單元,則可用下列賦值語句:p:=nil;其中nil是TurboPascal保留字,表示“空”,相當于C里面的null對動態(tài)變量的操作在TurobPascal程序中,動態(tài)變量不能由var直接定義而是通過調(diào)用標準過程new建立的。過程形式為:new(指針變量名);如果有下列變量定義語句:varp:^integer;僅僅說明了p是一個指向整型變量單元的指針變量,但這個整型單元并不存在,在指針變量p中還沒有具體的地址值。在程序中必須通過過程調(diào)用語句:new(p);才在內(nèi)存中分配了一個整型變量單元,并把這個單元的地址放在變量p中,一個指針變量只能存放一個地址。在同一時間內(nèi)一個指針只能指向一個變量單元。當程序再次執(zhí)行new(p)時,又在內(nèi)存中新建立了一個整型變量單元,并把新單元的地址存放在p中,從而丟失了舊的變量單元的地址。為了節(jié)省內(nèi)存空間,對于一些已經(jīng)不使用的現(xiàn)有動態(tài)變量,應該使用標準過程dispose予以釋放。過程形式為:dispose(指針變量名);為new(指針變量名)的逆過程,其作用是釋放由指針變量所指向的動態(tài)變量的存儲單元。例如在用了new(p)后在調(diào)用dispose(p),則指針p所指向的動態(tài)變量被撤銷,內(nèi)存空間還給系統(tǒng),這時p的值為nil。例:輸入兩個數(shù),要求先打印大數(shù)后打印小數(shù)的方式輸出,用動態(tài)變量做。programdongtai;typeintepter=^integer;varp1,p2:intepter;procedureswap(var,q1,q2:intepter);varp:integer;beginp:=q1;q1:=q2;q2:=p;end;beginnew(p1);new(p2);writeln('input2data:');readln(p1^,p2^);ifp1^thenwriteln('output2data:',p1^:4,p2^:$);end.第九節(jié)文件操作類型文件按數(shù)據(jù)的二進制代碼形式存放時的文件稱為類型文件。如果再按照組成類型文件的元素數(shù)據(jù)結(jié)構(gòu)分,又可以分為有類型文件和無類型文件。其定義為:type類型名=fileof基類型;{有類型文件}類型名=file;{無類型文件}例如:varf:fileofinteger;說明f為名的變量對應文件將用于存放整數(shù)。varg:file;說明g為名的變量對應文件的數(shù)據(jù)無任何規(guī)定。TurboPascal有關(guān)類型文件的函數(shù)和過程(1)assign過程形式:assign(f,str);功能:將文件名字符串str賦給文件變量f,程序?qū)ξ募兞縡的操作代替對文件str的操作。(2)rewrite過程形式:rewrite(f);功能:建立并打開一個新的允許寫磁盤文件,其文件名必須先由assign過程賦給變量f。這時,指向文件元素的指針指向第一個元素,rewrite過程所建立的文件為空文件。(3)reset過程形式:reset(f);功能:打開一個已經(jīng)存在的磁盤文件,其文件名必須先由assign過程賦給變量f,該文件只能讀,指向文件元素的指針指向第一個元素。(4)read過程形式:read(f,var表);功能:從磁盤文件f中,將數(shù)據(jù)依次讀到var表表示的各個變量中。(5)write過程形式:write(f,var表);功能:將var表所表示的各個變量的值依次寫到磁盤文件f上。(6)close過程形式:close(f);功能:關(guān)閉和f關(guān)聯(lián)的磁盤文件,在寫操作時自動產(chǎn)生一個文件結(jié)束標志。(7)seek過程形式:seek(f,n);功能:把文件指針移到f指明文件的第n個元素。(8)eof函數(shù)形式:eof(f);功能:若文件指向文件尾,則返回true,否則返回false。對有類型文件的寫操作步驟為:assign(f,str);rewrite(f);write(f,var表);close(f);對有類型文件的讀操作步驟為:assign(f,str);reset(f);read(f,var表);close(f);例:在磁盤上建立一個1~50的平方數(shù)的數(shù)據(jù)文件zhoufei.dat。要求以一個數(shù),這個數(shù)的平方數(shù)的格式寫入。programzhoufei;varf:fileofinteger;i:integer;beginassign(f,'zhoufei.dat');rewrite(f);fori:=1to50dowrite(f,i,sqr(i));close(f)end.文本文件文本文件的內(nèi)容有ASCII字符集中的字符組成,因此文本文件也稱ASCII碼文件,它可以用DOS中的type命令列出內(nèi)容。文本文件具體是由一系列行組成,每一行可以包括0個或多個字符型成分,并以也行結(jié)束符結(jié)尾,文本文件類型TXT和類型文件fileofchar區(qū)別在于后者不包含行結(jié)束符。文本文件和類型文件在讀寫上的差別在于前者只能按次序順序讀寫,而后者可以不按照次序讀寫。適用文本文件的函數(shù)和過程除了用于類型文件操作的過程和函數(shù)外主要還有:(1)readln過程形式:readln(f,var表);或readln(f);功能:從磁盤文件f中,將數(shù)據(jù)依次讀到var表表示的各變量中(其中readln(f)只讀數(shù)據(jù)),并將文件指針移到行結(jié)束符后,就是下一行開頭。(2)writeln過程形式:writeln(f,var表)或writeln(f);功能:將var表所表示的各個變量的值依次寫到磁盤文件f上去(writeln(f)不寫值),然后再寫一個行結(jié)束符。(3)append過程形式:append(f);功能:打開一個已經(jīng)存在的磁盤文件,其文件名必須和assign過程中的變量名f相對應,該文件只能寫,此時文件指針指向文件尾。(4)eoln函數(shù)形式:eoln(f);功能:若文件指針指向行結(jié)束符或文件結(jié)束符,則返回true,否則返回false。對文本文件的寫操作步驟:assign(f,str);rewrite(f);或append(f);write(f,var表);或writeln(f);close(f);對文本文件的讀操作步驟:assign(f,str);reset(f);readln(f,var表);或readln(f);close(f);例:隨機產(chǎn)生30個隨機整數(shù)存放于文本文件zhoufei.txt中programzhoufei;constn=30;varra:text;i:integer;beginrandomize;assign(ra,'zhouf
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 室務室衛(wèi)生管理制度
- 濮陽理發(fā)店衛(wèi)生制度
- 衛(wèi)生院消毒物品管理制度
- 衛(wèi)生院消防巡查管理制度
- 衛(wèi)生院處方管理制度
- 衛(wèi)生院健康驛站管理制度
- 衛(wèi)生院消防安全工作制度
- 旅店布草間衛(wèi)生管理制度
- 衛(wèi)生院醫(yī)保內(nèi)控制度
- 中學生心理衛(wèi)生制度
- GB/T 10454-2025包裝非危險貨物用柔性中型散裝容器
- pvc地膠施工方案
- (正式版)DB15∕T 3227-2023 《集中供熱單位產(chǎn)品能耗限額》
- 蘇教版數(shù)學三年級上冊備課計劃
- 大采高綜采工作面操作規(guī)程
- 保密車間出入管理制度
- 鐵路勞動安全 課件 第四章 機務勞動安全
- 脊柱與四肢檢查課件
- 2024年河北省供銷合作總社招聘筆試參考題庫附帶答案詳解
- 宅基地及地上房屋確權(quán)登記申請審批表
- 醫(yī)療衛(wèi)生輿情課件
評論
0/150
提交評論