资源描述
程序设计提高班培训讲义
胡苗坤 (2007寒假)
第一讲 顺序结构程序设计
主要内容:
1、 熟练掌握赋值语句、输入输出语句的用法
2、 掌握顺序结构程序设计常用方法
3、 基本运算符的使用
4、常用函数和过程
一、赋值语句(:=)
格式:变量名:=表达式
功能:将表达式的值计算出来赋给相应的变量。
不管什么计算机语言,赋值语句都是最基本最常用的语句,通过它给变量赋值来进行各种运算、处理。
如 a:=10*5; {a的值为50}
a:=a+1;{将a的值增加1,常用此语句来进行计数}
s:=s+a; {将s的值增加a,常用类似的累加语句来进行求和}
t:=t*a; {将t的值变为原来的a后倍,常用类似的语句来进行累乘}
例题1:交换两个数值型变量a和b的值
[分析与算法选择]:
要交换两个变量的值,可以联想起现实世界中交换两个容器A和B中所装的东西,一般要先引进一个空的容器C,先将一个容器(如A)里的倒入C,再将另一个容器B的倒入A,最后将C的倒入B,从而实现A、B容器内容的互换。
[方法1]:引进第三个变量
c:=a;
a:=b;
b:=c;
[方法2]:先合并后分开
a:=a+b; {如原来a=3,b=5,执行此语句后a=8,b=5}
b:=a-b; {执行此语句后a=8,b=3}
a:=a-b; {执行此语句后a=5,b=3}
还有其它一些办法,但都没有上面的两种方法通用。如可先乘再除,这种方法对于有一个变量为0的情况就不正确了。也可能会出现除数为0的情况。
例题2:计算四个变量的乘积
[分析与算法选择]:
一般的计算,可以直接用一个表达式将运算结果给一个变量就行了。如果变量的个数不确定,或者说变量的个数很多,此时用一个表达式就不方便了,可行的方法是来一个就算一个,直到全部的都算好结束。在后面的循环中常用这种方法。
[参考程序]:
program example5_2;
var t:longint;
a,b,c,d:integer;
begin
write(‘Enter integer a,b,c,d:’);
readln(a,b,c,d);
t:=1;
t:=t*a;
t:=t*b;
t:=t*c;
t:=t*d;
writeln(‘a*b*c*c=’,t);
end.
[补充说明]:
累加时,存放累加值的变量初值一般为0;而累乘时必须将相应变量的初值赋为1。如上述程序中t的初值为1,如果没有这句,系统默认的初值为0,那么乘下来结果也是0。
二、read/readln 读取数据
格式:read(变量) 或 read(变量1,变量2,……)
readln(变量) 或 readln(变量1,变量2,……)
功能:在运行程序时读入相应数据给指定变量,直到读入的数据满足为止,这里所说的满足有两个方面的含义,一是类型的一致,二是数据的满足。
Readln跟read不同的地方就是它执行完后将到下一行。
例:read(a,b,c) ;
根据事先定义的类型由用户在运行程序时输入相应的数据给a,b,c,也可分开写成三个read语句:read(a);read(b);read(c)。
readln(a,b,c); 与read(a,b,c)不同是读完数据后另起一行,如果将它分为三个语句readln(a); readln(b); readln(c)执行时可能读入的数据跟原来不一样,自己上机去试试吧!
readln; 空读语句,一般起到让程序运行时停止由用户回车后继续或跨过一行中其余的数据,保证下一个读语句从下一行头一个数据开始读取。
三、write/writeln 输出语句
语句功能:输出指定表达式的值。
如wirte(a),write(‘Jiangshu’); 分别输出a的值和Jiangshu
(1)场宽
在输出项后用“:数字”指明输出的宽度。
如write(5:6),则输出: 5
{5的前面有5个空格,整个输出项占6个字符的位置}
对于实数类型的还可以通过“:数字1:数字2”指明输出数字的宽度和小数点后的位数。
如:write(1.2:10:5) 将输出: 1.50000
{整个输出项占10个字符位置,整数部分占4位,小数点1位,小数部分5位,其中整数部分不足的在高位补空,小数部分不足在后面补0}
如果指定的宽度比原输出项应有的宽度小呢?
对于整数或字符等类型的,将自动调整到最小所要的宽度,如write(‘ABCD’:2)仍将输出ABCD。
对于实数,小数部分会取自定的位数,将尾部去除(四舍五入),并自动适应到最少的宽度。
[思考]:
如何对小数点后指定位进行四舍五入?
[解答]:
一种方法是直接指定输出小数点后指定的位数,如对于变量a要保留到小数点后第三位并考虑四舍五入,可以直接写为write(a:0:3)。这种方法跟系统的设置有关,也就是说这样不能保证任何时候都正确。
可以对指定位加5后从这位始截尾。如要求对实型变量a要求精确到小数点后两位,对小数点后第三位进行四舍五入,可以用这样的输出语句write(a+0.005:0:2)。一般来说对于变量的处理,可以先按这种方法(即相应位加5后再去尾)通过赋值语句进行处理,输出时不进行处理,只是直接输出就行了。
四、writeln跟wirte的区别
writeln语句在输出完指定内容后另起一行,write只管输出除非真满一行后才另起一行。
空的wirteln起到一个输出空行的作用,如果它前面有write语句,则在其它输出空行(可能不满一行),保证下一个输出另起一行。在程序中经常用一个空的writeln语句起换行的作用。
五、一个语句多个输出项
一个write或writeln中可以有多个输出项,各项之间用逗号间隔。
如write(1,2,3);
它与三个write语句作用一样:write(1);write(2);write(3);
再如 writeln(1,2,3); 输出123后换行。
与它等同的分开写的形式为:write(1);write(2);writeln(3);
练习及作业:
(1) 输入三角形的三边,输出三角形的面积(假设这三边一定能构成三角形)。
计算三角形面积的公式:
p:=(a+b+c)/2
s:=sqrt(p*(p-a)*(p-b)*(p-c))
(2) 输入一个三位整数,逆向输出,如输入123,输出为321,如果个位数是零,则输出二位数,如 :320,输出为23。
(3) 输入一个10000以内的整数,输出它的位数
(4) 分钱游戏:甲、乙、丙三人共有24元钱,先由甲分钱给乙、丙两人,所分给的数与各人已有数相同;接着由乙分给甲、丙,分法同前;再由丙分钱给甲、乙,分法亦同前。经上述三次分钱之后,每个人的钱数恰好一样多。求原先各人的钱数分别为多少?
第二讲 分支结构程序设计
主要内容:
1、 掌握复合语句、基本IF语句及CASE语句语法格式和执行过程;
2、 能够根据实际情灵活运用IF语句和CASE语句
3、掌握IF语句的嵌套原则
一.复合语句
1.为什么要用复合语句
在程序中有时候要将多个语句结合起来作为一个整体,象一个语句一样来使用。这时就要用到复合语句,用begin和end将多个语句结合在一起。
2.格式:
begin
语句1;
语句2;
……
语句N;
end;
{说明:end前的最后一个分号可以不写,也可以写,相当于其后是一个空语句。}
其效果跟普通的语句一样,也就是将多个语句合并成一个语句来使用,特别是在后面的条件语句或循环语句里执行的是多个语句要像一个语句一样时就必须要使用复合语句。
二.条件语句(if---then---else)
格式1:一个分支
if 条件then 语句;
格式2:两个分支
if 条件then 语句1 else 语句2;
注意else前没有分号,否则会出错。(思考这是为什么?)
1.条件的描述
在使用条件语句时主要的难点就是条件的描述和满足条件或不满足条件时要执行的语句的描述。
条件通过布尔表达式来描述。
例:条件语句与自然语言描述的对比
(1)if a>1 then a:=a-1 else a:=a+1;
如果a大于1那么将a的值减少1,否则将a的值增加1
(2)if (a>b) and (b>c) then s:=(a-b)*(b-c);
如果a大于b并且b大于c,那么s的值为(a-b)乘以(b-c)
(3)if (a>0) or (b>0) then s:=a+b;
如果a>0或者b>0,那么s的值等于a+b
(4)if f then t:=t+1; {这里f为布尔型的变量}
如果f成立即等于true,那么t的值增加1
2.语句的选择
满足条件时执行什么、不满足条件时执行什么要先搞清楚。
当满足条件时或不满足条件时执行的是多个语句时要使用复合语句的格式。当然单个语句也使用复合语句的格式也不会错,只不过多此一举而已,并不影响程序的执行,有时先这样写是为了后来的扩充。
例:条件语句与自然语言描述
if a<0 then begin a:=a+1; s:=s+1; end;
如果a小于0,那么执行两部分:(1)a的值增加1;(2)s的值增加1。
三、多分支语句case {有时也叫多路分支}
1.格式:
case 表达式 of
值1: 语句1;
值2: 语句2;
……
[else 语句]
end;
2.示例
(1) 两个分支的情况,还不如直接用条件语句
case random(Maxint) mod 2 of
0: writeln(‘Even digit’);
1: writeln(‘Odd digit.’);
end;
{等同于 if random(maxint) mod 2=0 then writeln(‘Even digit.’)
else writeln(‘Odd digit.’);}
根据随机产生的非负整数情况来确定
偶数时:输出‘Even digit’;
奇数时:输出‘Odd digit.’
(2)根据字符型变量ch的值来确定不同的执行
case ch of
‘A’..’Z’,’a’..’z’: writeln(ch,’ is an identifier character.’);
‘0’..’9’: writeln(ch,’ is a decimal digit.’);
else writeln(ch,’ is a special character.’);
end;
{等同于:
if ((ch>=’A’) and (ch<=’Z’)) or ( (ch>=’a’) and (ch<=’z’)) then
writeln(ch,’ is an identifier character.’)
else
if (ch>=’0’) and (ch<=’9’) then writeln(ch,’ is a decimal digit.’)
else writeln(ch,’ is a special character.’);
}
3.使用注意点
当有else部分时它上面的语句的最后一行可以有分号也可以没有分号,这点跟if-then-else不一样;case语句结构中最后要有一个end作为结尾;其中的语句可以是单语句也可以是复合语句。
[练习及作业]:
1、输入三个整数,按由大到小的顺序输出。
设三个数为a,b,c,一种方法可以用条件的并列,列举出可能有的6种情况。另一种方法是用条件的嵌套,从而输出结果。
2.编写程序输入年份和月份,输出这个月的天数。
3.编一个随机产生一个100以内的四则运算题,要求先输出这个四则运算的式子,这个四则运算的式子要能确保第一个数不小于第二个数,如果是除法的话要能确保能够整除,然后让用户输入结果,如果输入的结果正确则输出“Right!”否则输出“Error!”。
[分析与提示]:
用随机函数来产生四则运算的操作数和操作符,其中操作数都是100以内的整数,所以可以直接用random(100)就行了,如果第一个数比第二个数小则交换两个数。而操作符(运算符)只有四种可能,因此先用随机函数产生出0-3间的数,再根据产生的是什么数来确定是“+、-、*、/”。其中对于除法运算要考虑除数不能为0,再要考虑能整除,所以先进行整除运算,得到一个结果,再将第一个数变为除数乘以商。
4.编程输入三角形的三条边长,输出三角形的面积,如果不能构成三角形输出错误信息。
5.期末来临了,班长小Q决定将剩余班会费,用于购买若干支钢笔奖励给一引起学习好、表现好的同学。已知商店里有三种钢笔,它们的单价为6元、5元和4元。小Q想买尽量多的笔(鼓励尽量多的同学),同时他又不想有剩余钱。请你编写一程序,帮小Q制订出一种买笔的方案。
6.编写一个评分程序,接受用户输入10位选手的得分(0—10分),然后去掉一个最高分和一个最低分,求出某选手的最后得分(平均分)。
第三讲 循环结构的程序设计
主要内容:
1、 掌握三种循环语句的格式和执行过程;
2、 掌握三种循环语句的异同,能够根据实际情况灵活运用循环语句;
3、 掌握累加器和累乘器和计数器;
4、 掌握多重循环及循环的嵌套;
5、 熟练运用循环语句解各种实际问题,如打印图形、判断素数等常用算法。
许多处理过程中有连续的重复,这时候如果还是一句句地重复写的话,既麻烦又累赘,当要重复成千上万次时,这种重复的书写几乎是不可能实现的。直接简便的方法是用循环语句来实现循环。
一.While语句(当型循环)
1.格式:
while 布尔表达式 do 语句;
2.说明:
格式中while和do都是保留字,布尔表达式表示条件,它的描述跟条件语句里的条件描述是一样的。
Do后面的语句可以是单一语句也可以是复合语句,称为循环体。只要布尔表达式成立时(即值为TRUE时)就执行循环体,如此反复直到布尔表达式不成立(值为FALSE)时停止。如果一开始就为布尔表达式就不成立(值为FALSE),那么循环体一次也不执行。
例3.1用当循环计算1+2+3+……100
[分析]:此类题也称累加,设最后结果放入变量S中,设计一指针I,让I从1开始递增,并累加到S中,当I的值等于100时,循环结束。
Var
S,I:integer;
Begin
S:=0;I:=1;
While I<=100 do
Begin
S:=s+I;
I:=I+1;
End;
Writeln(s)
End.
[注意]:
在while循环体中一定要有相应的语句使布尔表达式的值可能为false,否则就会构成死循环。
二、Repeat语句(直到型循环)
1.格式:
repeat
语句;
语句;
……;
语句;
until 布尔表达式;
2. 说明
格式中repeat和until都是保留字,其间的语句构成循环体,最后一个语句的分号可以省略;until后的布尔表达式表示条件,描述的是循环结束的条件。
3. 功能
反复执行循环体直到布尔表达式的值为true时为止。
例3.2用直到型循环解例3.1
var
s,I:integer;
begin
s:=0;
I:=1;
Repeat
S:=s+1;
I:=I+1;
Until I=100;
Writeln(s)
End.
[总结与提高]While与Repeat语句对比
while和repeat语句一般情况下可以相互替换。它们的主要区别是:
while是先判断后执行,而repeat是先执行后判断,因此while语句的循环体有可能一次也不执行,而repeat语句至少执行一次;
前者是当条件满足时执行,而后者是当条件不满足时执行;
前者的循环体是复合语句时要用begin、end,而后者却不一定要用。
三、for语句(计数循环)
1.格式:
(1)for 变量标识符:=初值表达式 to终值表达式 do 语句;
从小到大执行的格式
(2)for 变量标识符:=初值表达式 downto终值表达式 do 语句;
从大到小执行的格式
2.说明
格式中的for,to,downto,do都是保留字,to一般用在升序的计数,而downto用在降序的计数。变量标识符在这里称作是控制变量,必须是离散(有序)数据类型,如:
for i:=1 to 100 do ….
for ch:=’a’ to ‘z’ do….
3.示例
上面的例题我们可以用计数循环来实现:
begin
s:=0;
I:=1;
For I:=1 to 100 do
S:=S+I;
Writeln(s)
End.
[总结与提高]
for语句的形式简单,但它也有一定的局限性,主要是控制变量的值不能随意变化,每次只能取其后继(用to的情况)或前趋(用downto的情况),另一限制是控制变量只能用简单的有序的离散量,且循环次数已定,不能象while或repeat那样通过布尔表达式来控制循环的操作。
四.多重循环(循环的嵌套)
当程序中要用到多个循环时,如果这些循环是并列的关系,那么它们彼此之间的控制变量不相互影响。
而当一个循环的循环体中又有循环时,这就是循环的嵌套,称为多重循环。
例3.3编写程序输出如下的字母塔:
A
ABA
ABCBA
…………….
ABCD……DCBA
[分析]:
此题有两个关键:一是确定每一行前导空格符的数目;二是按一定规律输出英文大写字母,共26行。应能保证最后一行前导空格数目至少为0,设最后一行的前面空格数为10个,那么倒数第二行前面的空格数为11,倒数第三行的数目为12……,如果控制输出行的字符变量为c,则空格数为:ord(‘Z’)-ord(c)+10
var ch,c:char;
begin
for c:=’A’ to ‘Z’ do
begin
write(‘ ‘:ord(‘Z’)-ord(c)+10); {输出空格数}
for ch:=’A’ to c do write(ch); {输出一行的左半部分}
for ch:=pred(c) downto ‘A’ do write(ch); {输出一行的右半部分}
writeln; {换行}
end;
end.
[思考与提高]:
上面整个程序是个两重循环,而外循环的循环体是两个并列的循环,因此虽然程序中有三个for语句,但只是两重循环。
[练习及作业]:
一、完善程序
1.求100以内所有质数的和。
[变量说明]:h存放所有质数的和;I、j为循环检测变量
[程序清单]:
program ex7_2_1;
var i,j,h:integer;
begin
__________(1)________;
for i:=3 to 100 do
begin
j:=2;
while (i mod j>0) and (j<i) do j:=j+1;
if _____(2)_______ then h:=____(3)_______;
end;
writeln(h)
end.
1. 输出四位数以内(包括四位数)是一个质数的完全平方数的数,并输出总的个数。
[变量说明]:
n存放符合条件的数的个数;I、j是循环检测变量;K存放完全平方数。
[程序清单]:
program ex7_2_2;
var i,j,k,n:integer;
begin
n:=0;
for i:=2 to 99 do
begin
k:=____(1)_____;
j:=2;
while (i mod j>0) and (j<i) do j:=j+1;
if _____(2)_______ then
begin
write(________(3)________:5);
______(4)_______;
end
end;
writeln;
writeln('Count=',n);
end.
二、编写程序题
1. 输出下图所示的图形
*
* * *
* * * * *
* * * * * * *
* * * * * * * * *
2.编写输出“右三角的九九乘法表”的程序:
1 2 3 4 5 6 7 8 9
4 6 8 10 12 14 16 18
9 12 15 18 21 24 27
16 20 24 28 32 36
25 30 35 40 45
36 42 48 54
49 56 63
64 72
81
3.找出100以内所有被2、3、5除余数为1的整数
4.求出100~999内所有的水仙花数,所谓水仙花数是该数等于它各位上的数的立方和。例:153=13+33+53
5.求1~100内所有的素数
6. 要将一张100元的钞票换成等值的10元、5元、2元、1元的小钞票,要求每次换成40张小钞票,每种至少一张,编程输出所有可能的换法,程序应适当考虑减少重复次数。
7. 四个学生上地理课,回答我国四大淡水湖大小时这样说:
甲:“最大洞庭湖,最小洪泽湖,鄱阳湖第三。”
乙:“最大洪泽湖,最小洞庭湖,鄱阳湖第二,太湖第三。”
丙:“最小洪泽湖,洞庭湖第三。”
丁:“最大鄱阳湖,最小太湖,洪泽湖第二,洞庭湖第三。”
对于每个湖的大小,每个学生仅答对一个,请编程确定四个湖的大小。
8. 谁是小偷? 问题:警察局抓了4名嫌疑犯:A,B,C,D,其中一人是小偷,审问中A说:“我不是小偷。” B说:“C是小偷。”C说:“小偷肯定是D。”D说:“C冤枉人。”,现已知四人中三人说的是真话,一人说的是假话。问到底谁是小偷?
9. 求二个正整数的最小公倍数和最大公约数
第四讲 数组和字符串
主要内容:
1、 掌握数组类型的定义及基本操作;
2、 掌握字符串类型的定义及常用函数过程的操作;
3、 熟练掌握通过数组来实现常见的排序、查找算法;
4、 熟练掌握通过字符串来解决各种实际问题如加解密,查找子串等。
Turbo-pascal的数据类型分为三种类型:简单类型、构造类型、指针类型。前面介绍的整型、实型、布尔型以及枚举类型等都是简单类型,而构造类型有字符串、数组、记录、集合、文件类型。描述一个构造类型特征的是其成分的类型和它的构造方法。因此对于构造类型,主要去考虑如何构造即其构造方法。指针类型是一种特殊的数据类型,它涉及到动态存储分配。
一、数组
在代数上我们常常这样写:a1,a2….ai….a100(0<i<101),通过i来指明具体的ai,如i=10时代表a10,在pascal语言里我们也希望能够类似地描述。从前面的变量名里我们已经知道,a1,a2..ai彼此之间是相互独立的,并没有必然的联系。如要象代数上那样,可以使用数组。
数组其实是一组相同值类型的变量的集合,这些变量共用一个名,彼此之间通过下标来区别。如定义了数组a,它的下标可以从1到100,那么就可以直接通过a[i]来指明第i个量,如i=10,a[i]指的是a[10]。
1.数组的说明
可以先通过 type 标识符=array[下标范围] of 值类型;
然后再在变量说明里引用。
如:type array1=array[1..100] of integer;
var a,b:array1;
也可以直接在变量说明里说明:
变量名:array[下标范围] of 值类型;
如:var a,b:array[1..100] of integer;
描述下标范围一般通过离散(有序)类型,如从一个整数到另一个整数,或者从一个字符到另一个字符等。如:
var a:array[-5..5] of integer;
c:array[1..20] of char;
d:array[‘a’..’z’] of integer;
2.数组的使用
刚才我们已从代数上使用说明了数组使用的优点,特别是要保存的量比较多且这些量之间又有某种联系。如要将若干数重新根据由大到小或由小到大的顺序排序时,这些数都是要保留的,只是位置换了而已,此时用数组变可以实现。后面我们会专门介绍排序的算法的。
(1)数组元素的输入:
数组名代表的并不是一个变量,而是一批变量,因而,不能直接整个数组读入,而是要逐个数组元素读入,通常用循环结构来完成这一功能。下面是几个常用输入数组元素的例子:
for i:=1 to 10 do read(a[i]);
{————从键盘读入数组元素的值;最常用的方法}
for i:=1 to 10 do a[i]:=i;
{————数组元素a[1]到a[10]的值分别为1到10;数据赋初值}
for i:=1 to 10 do a[i]:=0;
{————数组元素清0;最常用的数据初始化的方法}
for i:=1 to 10 do a[i]:=random(100);
{————随机产生10个100以内的数,赋给各数组元素}
(2)数组元素的输出:
和数组元素的输入相同,数组元素的输出也不能由一个write语句直接完成。同样要逐个数组元素输出。通常也用循环结构来完成这一功能:
for i:=1 to 10 do write(a[i],' ');{————数组元素之间用空格分隔}
writeln;
3.二维数组
一维数组在编程中多用于描述线性的关系:如一组数;一组成绩;一组解答等。数组元素只有一个下标,表明该元素在数组中的位置。二维数组在编程中多数用于描述二维的关系:如地图、棋盘、城市街道、迷宫等等。而二维数组元素有两个下标:第一个下标表示该元素在第几行,第二个下标表示在第几列。
(1).二维数组的定义:
var
a:array[1..10,1..5] of integer;
其中:a是数组名,由程序员自定;array和of是定义数组的保留字;(这两点和一维数组定义的格式一样)中括号中的两个范围表示二维数组共有多少行、多少列(第一个范围表示行数,第二个范围表示列数);最后一个表示数组元素的类型,规定和一维数组一样。如上例,定义了一个二维数组a,共有10行5列。
(2).使用二维数组:
1、数组元素的指称:数组名[行号,列号]。如第三行第四个元素:a[3,4]。
对某一行进行处理。如累加第4行的数据。则固定行号为4。如:for i:=1 to 5 do s:=s+a[4,i];
对某一列进行处理。如累加第4列的数据。则固定列号为4。如:for i:=1 to 10 do s:=s+a[i,4];
2、二维数组的输入输出要用双重循环来控制:
for i:=1 to 10 do{————控制行数}
begin
for j:=1 to 5 do read(a[i,j]){————第一行读入5个元素}
readln;{————读入一个换行符}
end;
{————最常用的方法:从键盘读入数据初始化二维数组}
for i:=1 to 10 do
for j:=1 to 5 do a[i,j]:=0;
{————最常用的方法:将二维数组清0}
for i:=1 to 10 do
begin
for j:=1 to 5 do write(a[i,j]:4);
writeln;
end;
{————最常用的输出方法:按矩阵形式输出二维数组的值}
例:竞赛小组共有20位同学,这学期每位同学共参与了三项比赛,请统计每位同学的平均分。
分析:定义一个20行3列的二维数组来存放这些成绩。定义一个20个元素的一维数组来存放平均分。
program p1;
var
a:array [1..20,1..3] of integer;
b:array [1..20] of real;
i,j:integer;
begin
for i:=1 to 20 do
begin
for j:=1 to 3 do read(a[i,j]);
readln;
end;
{————从键盘上读入20个同学的三次竞赛成绩}
for i:=1 to 20 do b[i]:=0;
{————先将平均分数组清0}
for i:=1 to 20 do
begin
for j:=1 to 3 do b[i]:=b[i]+a[i,j];{————计算总分}
b[i]:=b[i]/3;{————计算平均分}
end;
for i:=1 to 20 do write(b[i]:5:1);
{————输出平均分}
writeln;
end.
例4_1:让计算机随机产生100个0到1000之间的整数,输出其中最大的数。
[分析与算法选择]:
随机产生数可以用其random函数,产生的100个数依次存放在a[1]到a[100]里。选最大数时可用“擂台比武”的思想,假设最大数放在变量max里,如果a[i]比max大,则取而代之,i从1到100重复此操作。
[程序清单]:
program maxdigit;
var a:array[1..100] of integer;
i,max:integer;
begin
randomize;
for i:=1 to 100 do a[i]:=random(1000);
max:=a[1];
for i:=2 to 100 do if a[i]>max then max:=a[i];
writeln(‘Max=’,max);
end.
例4_2 键盘输入40个5位以下的整数,最后分批输出其中的奇数和偶数。
[分析与算法选择]:
判定一个数是奇数或偶数比较简单,如果不是要分批输出可以一边输入一边判定,现在要分批输入所以输入跟输出的过程要分开,输入的40个数要先存放起来,通过数组很方便。
[程序清单]:
program digit;
var a:array[1..40] of integer;
i:integer;
begin
for i:=1 to 40 do read(a[i]);
writeln;
for i:=1 to 40 do if odd(a[i]) then write(a[i]:5);
writeln;
for i:=1 to 40 do if not odd(a[i]) then write(a[i]:5);
writeln;
end.
二、字符串类型定义和变量说明
1.定义
type 变量标识符=string[常数];
还可以使用不带字符串最大长度(即不用方括号)的字符串定义,此时取时大长度的缺省值255,形式为:type 变量标识符=string;
例:type
class=string[10];
name=string[20];
address=string;
定义了三个字符串类型,最大长度为别是10,20,255。
2.字符串变量说明
字符串变量与简单类型变量说明一样,有两种形式:一是先写字符串类型定义,后用其进行变量说明;二是直接将字符串类型写于变量说明之中。
曾上例子可以写出如下的字符串类型变量说明:
var
class1, class2: class;
myname, yourname,hisname: name;
heraddress: address;
也可以直接说明:
var
class1, class2: string[10];
myname, yourname, hisname: string[20];
heraddress: string;
3.字符串长度
为了记录一个字符串的实际长度即有效字符的长度,系统在所有字符串变量前保留一个不可见字符,称它为长度字节,因此turbo-pascal编译器为每一字符串变量在内存中所分配的字节数(一个字符占一个字节)是其长度加1。在长度字节中存放的是这样一个字符:其相应的ASCII序数值为该字符串变量的当前实际长度。由于系统允许对一个字符串变量进行整体访问,也可以对字符串变量中的各个字符逐个地访问,第二种访问应指定某字符在字符串中的位置即下标,如myname[1]表示字符串变量myname的第一个字符,myname[2]表示第二个字符,依次类推。因此可用myname[0]表示在长度字节中所存放的字符,而字符串的实际长度可用ord(myname[0])求得。
也可以直接用系统函数来求字符串的长度,如length(myname)。
4.字符串与字符
字符串变量和字符类型char相兼容,可把char视作长度为1的字符串类型,因而它们在字符串表达式计值时可混合使用。如‘A’可看作是字符,也可视为字符串。但字符串类型和字符类型在内存中的存储形式不同。另外允许长度为0的空串{此时字符串的存储仍然要一个字节,用来存放其长度字符},但字符类型必须也只能有一个字符。
5.字符串的常数定义与类型常数定义
可将任意字符串定义成一个常数标识符,以供程序各处引用。字符串常数定义的一般形式为:
const 常数标识符=字符串常数;
其中字符串常数是用单引号括起的字符串序列。如:
const
heading=’Difference between string variable and string typed constant’;
splitline=’-------------------------------------------------------------------------’;
分别以常数标识符heading表示一个表头信息,splitline表示分隔线。
字符串类型常数定义要规定字符串类型及所取的初始值,形式为:
const 类型标识符:字符串类型=字符串常
展开阅读全文