




已阅读5页,还剩53页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
算法详解及练习题目 录第一讲 穷举法 - 1第二讲 字符与字符串处理 - 16第三讲 不同进制转换 - 25第四讲 高精度计算 - 26第五讲 数据排序 - 30第六讲 约瑟夫问题(纸牌问题)- 34第七讲 矩阵(递推问题)- 40第八讲 排列组合 - 43第九讲 贪心算法 - 47第十讲 递归算法 - 56第一讲 穷举法一、穷举法的基本概念穷举方法是基于计算机特点而进行解题的思维方法。一般是在一时找不出解决问题的更好途径(即从数学上找不到求解的公式或规则)时,可以根据问题中的的部分条件(约束条件)将所有可能解的情况列举出来,然后通过一 一验证是否符合整个问题的求解要求,而得到问题的解。这样解决问题的方法我们称之为穷举算法。穷举算法特点是算法简单,但运行时所花费的时间量大。有些问题所列举出来的情况数目会大得惊人,就是用高速的电子计算机运行,其等待运行结果的时间也将使人无法忍受。因此,我们在用穷举方法解决问题时,应尽可能将明显的不符合条件的情况排除在外,以尽快取得问题的解。二、算法模式 问题解的可能搜索的范围: 用循环或循环嵌套结构实现,写出符合问题解的条件。能使程序优化的语句,以便缩小搜索范围,减少程序运行时间。三、使用穷举法设计算法例1:百钱买百鸡问题:有一个人有一百块钱,打算买一百只鸡。到市场一看,大鸡三块钱一只,小鸡一块钱三只,不大不小的鸡两块钱一只。现在,请你编一程序,帮他计划一下,怎么样买法,才能刚好用一百块钱买一百只鸡?算法分析:此题很显然是用枚举法,我们以三种鸡的个数为枚举对象(分别设为x,y,z),以三种鸡的总数(x+y+z)和买鸡用去的钱的总数(x*3+y*2+z)为判定条件,穷举各种鸡的个数。下面是解这个百鸡问题的程序var x,y,z:integer;beginfor x:=0 to 100 do for y:=0 to 100 dofor z:=0 to 100 do枚举所有可能的解if (x+y+z=100)and(x*3+y*2+z div 3=100)and(z mod 3=0)then writeln(x=,x,y=,y,z=,z); 验证可能的解,并输出符合题目要求的解end.上面的条件还有优化的空间,三种鸡的和是固定的,我们只要枚举二种鸡(x,y),第三种鸡就可以根据约束条件求得(z=100-x-y),这样就缩小了枚举范围,请看下面的程序:var x,y,z:integer;begin for x:=0 to 100 dofor y:=0 to 100-x dobegin z:=100-x-y; if (x*3+y*2+z div 3=100)and(z mod 3=0)then writeln(x=,x,y=,y,z=,z);end;end.未经优化的程序循环了1013 次,时间复杂度为O(n3);优化后的程序只循环了(102*101/2)次 ,时间复杂度为O(n2)。从上面的对比可以看出,对于枚举算法,加强约束条件,缩小枚举的范围,是程序优化的主要考虑方向。在枚举算法中,枚举对象的选择也是非常重要的,它直接影响着算法的时间复杂度,选择适当的枚举对象可以获得更高的效率。如下例:例2、将1,2.9共9个数分成三组,分别组成三个三位数,且使这三个三位数构成1:2:3的比例,试求出所有满足条件的三个三位数.例如:三个三位数192,384,576满足以上条件.(NOIP1998pj)算法分析:这是1998年全国分区联赛普及组试题(简称NOIP1998pj,以下同)。此题数据规模不大,可以进行枚举,如果我们不加思地以每一个数位为枚举对象,一位一位地去枚举:for a:=1 to 9 do for b:=1 to 9 dofor i:=1 to 9 do这样下去,枚举次数就有99次,如果我们分别设三个数为x,2x,3x,以x为枚举对象,穷举的范围就减少为93,在细节上再进一步优化,枚举范围就更少了。程序如下:var t,x:integer; s,st:string; c:char;begin for x:=123 to 329 do枚举所有可能的解 begin t:=0; str(x,st);把整数x转化为字符串,存放在st中 str(x*2,s); st:=st+s; str(x*3,s); st:=st+s; for c:=1 to 9 do枚举9个字符,判断是否都在st中 if pos(c,st)0 then inc(t) else break;如果不在st中,则退出循环if t=9 then writeln(x, ,x*2, ,x*3); end;end.在枚举法解题中,判定条件的确定也是很重要的,如果约束条件不对或者不全面,就穷举不出正确的结果,我们再看看下面的例子。例3:古希腊人认为因子的和等于它本身的数是一个完全数(自身因子除外),例如28的因子是1、2、4、7、14,且1+2+4+7+14=28,则28是一个完全数,编写一个程序求21000内的所有完全数。分析:本题是一个搜索问题,搜索范围 21000,找出该范围内的完全数;完全数必须满足的条件:因子的和等于该数据的本身。问题关键在于将该数的因子一一寻找出来,并求出因子的和。程序如下:Program p3_1 ; Var a,b,s :integer ;Begin For a:=2 to 1000 do Begin s:=0 ; For b:=1 to a -1 do If a mod b =0 then s:=s+b ; 分解因子并求和 If a=s then begin Write( a, = ,1, );打印 a=1 For b:=2 to a -1 do If a mod b=0 then write( +, b );打印加法式子 Writeln ; End; End;End.当程序运行后,输出结果: 6 = 1 + 2 + 3 28 = 1 + 2 + 4 + 7 + 14 496 =1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248例4:(第七届全国青少年信息学(计算机)奥林匹克分区联赛初赛试题)在A,B两个城市之间设有N个路站(如下图中的S1,且N100),城市与路站之间、路站和路站之间各有若干条路段(各路段数20,且每条路段上的距离均为一个整数)。A,B的一条通路是指:从A出发,可经过任一路段到达S1,再从S1出发经过任一路段,最后到达B。通路上路段距离之和称为通路距离(最大距离1000)。当所有的路段距离给出之后,求出所有不同距离的通路个数(相同距离仅记一次)。例如:上图所示是当N=1时的情况:从A到B的通路条数为6,但因其中通路5+5=4+6,所以满足条件的不同距离的通路条数为5。算法说明:本题采用穷举算法。数据结构:(1)N:记录A,B间路站的个数;(2)数组D(I,0)记录第I-1到第I路站间路段的个数;(3)D(I,1),D(I,2),记录每个路段距离;(4)数组G记录可取到的距离。PROGRAM CHU7_6;VAR I,J,N,S:INTEGER; B:ARRAY0.100OF INTEGER; D:ARRAY0.100,0.20OF INTEGER; G :ARRAY0.1000OF 0.1;BEGINREADLN(N);FOR I:=1 TO N+1 DOBEGINREADLN(DI,0);FOR J:=1 TO DI,0DO READLN(DI,J);END;D0,0:=1;FOR I:=1 TO N+1 DO BI:=1;B0:=0;FOR I:=0 TO 1000 DO GI:=0;WHILEDOBEGINS:=0;FOR I:=1 TO N+1 DOS:=GS:=1; J:=N+1;WHILE DO J:=J-1;BJ:=BJ+1;FOR I:=J+1 TO N+1 DO BI:=1;END;S:=0;FOR I:=1 TO 1000 DO;WRITELN(S);READLN;END. 答案: B0=0 S+DI,BI; BJ=DJ,0 S:=S+GI例5(第八届全国青少年信息学奥林匹克联赛(NOIP2002)试题)将n个整数分成k组(kn,要求每组不能为空),显然这k个部分均可得到一个各自的和s1,s2,sk,定义整数P为:P=(S1-S2)2+(S1一S3)2+(S1-Sk)2+(s2-s3)2+(Sk-1-Sk)2问题求解:求出一种分法,使P为最小(若有多种方案仅记一种)程序说明:数组:a1,a2,.AN存放原数 s1,s2,.,sK存放每个部分的和 b1,b2,.,bN穷举用临时空间 d1,d2,.,dN存放最佳方案程序:programexp4; Vari,j,n,k:integer; a:array1.100ofinteger; b,d:array0.100ofinteger; s:array1.30ofinteger; begin readln(n,k); forI:=1tondoread(aI); forI:=0tondobI:=1; cmin:=1000000; while(b0=1)do begin forI:=1tokdo forI:=1tondo sum:=0; forI:=1tok-1do forj:= sum:=sum+(sI-sj)*(sI-sj); ifthen begin cmin:=sum; forI:=1tondodI:=bI; end; j:=n; whiledoj:=j-1; bj:=bj+1; forI:=j+1tondo end; writeln(cmin); forI:=1tondowrite(dI:40); writeln;end.四、穷举算法的深入应用实例一:一根29厘米长的尺子, 只允许在上面刻七个刻度, 要能用它量出 129 厘米的各种长度。试问这根尺的刻度应该怎样选择?分析:(1) 从 129 厘米中选择七个刻度的所有可能情况数是:C(7,29)= 29282726252423 /1234567= 299265223= 29262390= 1560780 (2) 对于每一组刻度的选择都需要判断是否能将 129 厘米的各种刻度量出来, 例如选择的刻度为: a1,a2,a3,a4,a5a,6,a7 那么能量出的刻度为: a1, 29-a1; 2 a2, a2-a1, 29-a2; 3 a3, a3-a1 ,a3-a2, 29-a3 ; 4 a4, a4-a1, a4-a2, a4-a3, 29-a4; 5 a5, a5-a1, a5-a2, a5-a3, a5-a4, 29-a5; 6 a6, a6-a1, a6-a2, a6-a3, a6-a4, a6-a5, 29-a6; 7 a7-a1, a7-a2, a7-a2, a7-a3, a7-a4, a7-a5, a7-a6, 29-a7; 8共可量出 2+3+4+5+6+7+8 种刻度, 即 35 种刻度, 事实上其中有许多刻度是重复的, 不可能复盖 129。例如: 取 a1, a2, a3, a4, a5, a6, a7为1, 3, 6, 10, 15, 21, 28能量出的刻度为: 1 , 28 3, 2, 26 6, 5, 3, 23 10, 9, 7, 4, 19 15, 14, 12, 9, 5, 14 21, 20, 18, 15, 11, 6, 8 28, 27, 25, 22, 18, 13, 7, 1缺 16,17,24 ( 29 即尺子长度 )如果找出了刻度a1, a2, a3, a4, a5, a6, a7 那么我们可以利用其对称性 29-a1,29-a2,29-a3,29-a4,29-a5,29-a6,29-a7, 也是一组解, 所以求解过程中可仅考虑 a1a2a3a4a5a6a7 的情况。很显然要使1,28 两种刻度能量出来, 则在七个刻度就必须有 1 或 28; 这样就可设a1=1 ( 或 a1=28 )。本题就变成了只要在 227 中选取六个刻度问题了。其刻度选择的数目为 C(6 26)= 262524232221 = 26523117 = 230230 123456这样解的范围就从百万变成了十万的数量级, 大大减少运行次数。因此,我们在用穷举法求问题解时,应注意程序的优化,尽可能减少搜索时间。 程序优化 (3) 为了判定七个刻度是否能够度量129的所有长度, 可以用集合的方法, 也可以用数组的0,1数据判断。下面的程序使用了数组的0,1方法。Program p12_2 ; Const n=29 ; m=1; Var a:array 1.7 of integer; b:array 1.n of 0.1 ; 记录能量的刻度 f:Boolean ; I , j : integer ; BEGIN a1:=m; for a2:=2 to n-7 do for a3:=a2+1 to n-6 do for a4:=a3+1 to n-5 do for a5:=a4+1 to n-4 do for a6:=a5+1 to n-3 do for a7:=a6+1 to n-2 do begin for i:=1 to 29 do bi:=0;for i:=1 TO 7 do begin bai:=1; bn-ai:=1; bn:=1 ; 初始化 for j:=i+1 TO 7 do babs(aj-ai):=1 end; j: =0; for i;=1 to n do j:=j + bi; if j=n then begin for i:=1 to 7 do write (ai:4); writeln ; end ; end; end. 运行程序的结果: 当 m=1 时得出两组刻度 1 2 14 18 21 24 27 1 4 10 17 22 24 27 m=28 时也可获得两组刻度 28 2 5 7 13 19 25 28 2 5 8 11 15 27这两组刻度实际上是 m=1 的对称情况, 所以问题的解实质上为两组结果。如果调整n=30 可以发现在这样的情况下程序无解, 这说明取 30cm 长的尺子, 若仍取七个刻度, 要能量出 130cm 的各种长度, 是不可能的。实例二:邮局发行一套票面有四种不同值的邮票,如果每封信所贴邮票张数不超过三枚,存在整数,使得用不超过三枚的邮票,可以贴出连续的整数、,来,找出这四种面值数,使得值最大。分析:本题知道每封信邮票数的范围(=3 ),邮票有四种类型,编程找出能使面值最大邮票。其算法是:(1) 面值不同的四种邮票,每封信所贴邮票不超过 3 张。(2) 用这四种邮票贴出连序的整数,并且使值最大。(3) 用穷举法,找出所有符合条件的解。(4) 本题用集合的方法统计邮票的面值,提高判重的速度。设邮票的面值分别为:A ,B ,C ,D ,根据题意设:A B C D,因此 A=1,用循环语句完成搜索。Program p12_3 ; var a, b , c , d : integer ; x, x0, x1 , x2 , x3, x4 : integer ; st1 : set of 1 100 ; Function number( a, b, c, d : integer ) : integer ; var n1, n2, n3 ,n4 , sum :integer ; begin st1:= ; for n1:= 0 to 3 do 每种邮票所取的张数 for n2:= 0 to 3-n1 do for n3:= 0 to 3-n1- n2 do for n4:= 0 to 3-n1-n2-n3 do begin if n1+n2+n3+n4 x0 then begin x0:=x; x1:=a ; x2:=b ; x3:=c ; x4:=d 保存最大面值邮票 write( x1:5, x2:5, x3:5, x4:5 );writeln( :10, x0=, x0 );end; end; end.程序运行后,其输出结果是: 1 2 3 4 x0=12 解答结果有11 组 1 2 3 5 x0=13.1 3 6 10 x0=23 1 4 7 8 x0=24实例三:如图所示的8个格子中放入18八个数字,使得相邻的和对角线的数字之差不为1。编程找出所有放法。我们先不考虑后一条件,只考虑第一个条件,即把18八个数字放入8个格子中。这是容易做到的,就是8个数字的全排列,共有8!=40320种放法。然后对这8!个可行解用后一个条件加以检验,输出符合条件的解。对于后一个条件中“相邻”的判断,可以建立一个邻接表来解决: i 1 2 3 4 5 6 7 8 9 10 11 12 13 14 j 1 1 1 1 2 2 2 3 3 3 4 5 5 6 7 2 2 3 4 3 5 6 4 6 7 7 6 8 7 8表中表示哪两个格子是相邻的,linki,1和linki,2是相邻的格子的编号。全排列的产生,可以用八重循环,也可以用专门的算法,程序留给同学们自己去完成。利用穷举策略编制的程序,其运算量一般是很大的,因此如何提高算法效率是穷举算法一个很重要的问题。一般应尽量减少可行解的个数,使得第二步的检验运算量尽可能地少。例如对于例5-1,如何来优化算法呢?如果注意到b3和b6两个格子,与它们“相邻”的格子有6个,也就是说,放入这两个格子中的数,必须和6个数不连续,仅可以和一个数是连续的,这样的数只有2个,即1和8。这样,b1,b3,b6,b8;4个格子中数的放法仅有两种可能:2、8、1、7和7、1、8、2。而b2、b4、b5、b7四个格子中的数仅需在36四个数中选择。经过上述优化,可行解仅有:24!48个,大大减少了计算量。并且检验是否符合要求,也只需检查(1,2),(1,4),(2,5),(4,7),(5,8),(7,8)这6对数之差就可以了。按改进的算法编制的PASCAL程序如下: program exampleb; uses Crt: const link:array1.6,1.2 of integer= (1,2),(1,4),(2,5),(4,7),(5,8),(7,8); var b:array1.8 of integer; procedure print; begin writeln( ,b1:2); writeln(b2:2,b3:2,b4:2); writeln(b5:2,b6:2,b7:2); writeln(,b8) end; function choose:boolean; var i: integer; begin choose:= false; fori:=1 to 6 do if abs(blinki, 1 - blinki ,2) = 1 then exit; choose := true end; procedure try; begin for b2:=3 to 6 do for b4:= 3 to 6 do if b2<>b4 then for b5:= 3 to 6 do if (b5<>b2) and (b5<>b4) then begin b7:= 18 - b2 - b4 - b5; if choose then print; end; end; main program begin clrscr; b1:=2;b3:=8;b6:= 1;b8:=7; try; b1:=7;b3:=1 ;b6:=8;b8:=2; try; readlnend.上面优化算法的方法是尽可能减少可行解的数目,也称为“剪枝”,即把明显不符合条件的可行解尽可能地剪去,减少穷举的计算量。经典习题1.破碎的项链 (精典奥赛试题34页)你有一条由N个红色的,白色的,或蓝色的珠子组成的项链(3=N=350),珠子是随意安排的。这里是 n=29 的二个例子: 1 2 1 2 r b b r b r r b r b b b r r b r r r w r b r w w b b r r b b b b b b r b r r b r b r r r b r r r r r r b r b r r r w 图片 A 图片 B r 代表 红色的珠子 b 代表 蓝色的珠子 w 代表 白色的珠子 第一和第二个珠子在图片中已经被作记号。 图片 A 中的项链可以用下面的字符串表示: brbrrrbbbrrrrrbrrbbrbbbbrrrrb . 假如你要在一些点打破项链,展开成一条直线,然后从一端开始收集同颜色的珠子直到你遇到一个不同的颜色珠子,在另一端做同样的事。(颜色可能与在这之前收集的不同) 确定应该在哪里打破项链来收集到最大多数的数目的子。 Example 举例来说,在图片 A 中的项链,可以收集到8个珠子,在珠子 9 和珠子 10 或珠子 24 和珠子 25 之间打断项链。 在一些项链中,包括白色的珠子如图片 B 所示。当收集珠子的时候,一个被遇到的白色珠子可以被当做红色也可以被当做蓝色。 表现项链的字符串将会包括三符号 r , b 和 w 。写一个程序来确定从一条被供应的项链最大可以被收集珠子数目。 PROGRAM NAME: beads样例输入:第 1 行: N, 珠子的数目 29 第2行:一串度为N的字符串, 每个字符是r,b或w。 wwwbbrwrbrbrrbrbrwrwwrbwrwrrb 样例输出:单独的一行包含从被供应的项链可以被收集的珠子数目的最大值。 112.等差数列Arithmetic Progressions一个等差数列是一个能表示成a, a+b, a+2b,., a+nb (n=0,1,2,3,.)的数列。在这个问题中a是一个非负的整数,b是正整数。写一个程序来找出在双平方数集合(双平方数集合是所有能表示成p2q2的数的集合)S中长度为n的等差数列。格式TIME LIMIT: 5 秒PROGRAM NAME: ariprogINPUT FORMAT:(file ariprog.in)第一行: N(3= N=25),要找的等差数列的长度。第二行: M(1= M=250),搜索双平方数的上界0 = p,q 125000 then exit(false); for i:=1 to n-1 do if not ax+i*y then exit(false); exit(true); end; procedure swap(var x,y:longint); var temp:longint; begin temp:=x;x:=y;y:=temp; end; procedure qsort(l,r:longint); var i,j,x,y:longint; begin i:=l;j:=r;y:=random(r-l)+l;x:=by,2;y:=by,1; while i=j do begin while (bi,2x) or (bi,2=x) and (bi,1x) or (bj,2=x) and (bj,1y) do dec(j); if i=j then begin swap(bi,1,bj,1);swap(bi,2,bj,2); inc(i);dec(j); end; end; if lj then qsort(l,j); if ir then qsort(i,r); end;begin assign(input,ariprog.in);reset(input); assign(output,ariprog.out);rewrite(output); readln(n,m); fillchar(a,sizeof(a),false); for i:=0 to m do for j:=0 to m do ai*i+j*j:=true; for i:=0 to 2*m*m-(n-1) dobegin if ai=false then continue; for j:=1 to (m*m*2)div(n-1) do if check(i,j) then begin inc(num);bnum,1:=i;bnum,2:=j; end; end;if num=0 then begin writeln(NONE);close(input);close(output);halt;end; qsort(1,num); for i:=1 to num do writeln(bi,1, ,bi,2); close(input);close(output);end.3.环形公路春天是一个万物复苏的季节,迎着春风,伴随着生命的生长,河北大学ACM校队决定去保定郊区春游。某景区是环形的,校队决定租一辆中型客车绕行该景区一圈,欣赏沿途的风景。围绕着环形景区的是一条环形公路,公路上有N个汽车站(按逆时针方向依次编号为1, 2, . ,n),每一站存有若干数量的汽油(其中有的站可能不存)。假定客车可以从任何一个汽车站出发,且出发时客车恰好是没有汽油的,然后带上出发站所有的汽油开始按逆时针顺序行使,之后每到一站都把该站所有的汽油全都带上(可以认为客车的油箱足够大)。试求:从哪几站出发可以使汽车从该站出发环行一周,不致在中途缺油而停车。Input:请从road.in中读取数据,数据包含三行。第一行仅包含一个正整数N,表示环形公路上有N个汽车站。第二行有N个实数m1 , m2 , ., mN ,以空格分隔,mi表示编号为i的汽车站的存油数。第三行也有N个实数w1 , w2 , . ,wN ,以空格分隔,wi表示从第i站到第i+1站汽车耗油量,特别地,wN表示从第N站到第一站的耗油量。Output:请把输出结果写入road.out文件中。如果存在可以环形一周的出发点,则以站点为关键字升序输出可出发点的编号。若不存在可出发的站点,则输出一个整数-1。Sample Input52.4 3.1 4.0 5.5 4.23.0 2.3 1.6 5.9 3.9Sample Output2 34.问题描述:Farmer John 的奶牛们喜欢看书,并且Farmer John 发现在他的奶牛们稍微看了些有关于自然科学的书时,会产出更多的牛奶。他决定更新牛棚里的图书馆,把原廉价的小说换成算术和数学的课本。不幸的是,有些新书掉到了泥浆里面,现在它们的ISBN号码很难分辨出来了。ISBN(国际标准图书编号)是由十个阿拉伯数字组成的编码,用来唯一地标识一本书。前九个阿拉伯数字描述这本书的一些信息,最后一个数字用来验证ISBN码是否正确。要验证ISBN码的正确性,你要把第一个数字乘以十,你要把第二个数字乘以九,你要把第三个数字乘以八直到最后一个数字乘上一,再把这些积累加起来。如果所得的和可以被11整除的话,那么这就是一个合法的ISBN码。比如说 0201103311 是一个合法的ISBN,因为10*0+9*2+8*0+7*1+6*1+5*0+4*3+3*3+2*1+1*1=55前九个数字都在0到9之间。有时候,最后一个数字需要取到10,那么我们就把最后一个数字写成大写X(这时就不叫数字了,呵呵)。比如156881111X也是一个合法的ISBN码。你的任务就是在给你丢失了一个数字的ISBN码之后,确定那个丢失的数字。丢失数字的地方用?输入格式:总共1行,一个十个数字组成的ISBN码,其中包含用?表示的一个丢失的数字。输出格式:总共1行:就是那个丢失的数码(0.9或大写X)。如果标有的?的位置上没有数字可以使之成为一个合法的ISBN码的话,就输出-1。5.求数组元素问题描述给出任意一个自然数N (N100),输出满足下列条件的数组元素及不同方案数,条件是:数组元素由各不相同自然数组成;数组元素的最后一个元素必为N;每一个数组元素都不小于它前面一个元素的平方 (第一个元素除外);数组中包含的元素个数可不相同,但至少要有一个元素。例如: N=1 输入: N (不用判错) 数组 (1) 输出: 一个 (不同方案数) K=1 (以K记录不同的方案数) 又如: N=5 数组 (5) (1,5) (1,2,5) (2,5) K=4第二讲 字符与字符串处理一、字符、字符串类型的使用(一)字符类型。字符类型为由一个字符组成的字符常量或字符变量 。字符常量定义:Const 字符常量=字符字符变量定义: Var 字符变量:char;字符类型是一个有序类型, 字符的大小顺序按其ASC代码的大小而定。函数succ、pred、ord适用于字符类型。例如:后继函数:succ(a)=b前继函数:pred(B)=A序号函数:ord(A)=65 ord(a)=97 ord(0)=48例1 按字母表顺序和逆序每隔一个字母打印。即打印出:a c e g I k m o q s u w yz x r v t p n l j h f d b程序如下:program ex8_1;var letter:char;beginfor letter:=a to z doif (ord(letter)-ord(a)mod 2=0 then write(letter:3);writeln;for letter:=z downto a doif (ord(letter)-ord(z)mod 2 =0 then write(letter:3);writeln;end.分析:程序中,我们利用了字符类型是顺序类型这一特性,直接将字符类型变量作为循环变量,使程序处理起来比较直观。(二)字符串类型字符串是由字符组成的有穷序列。字符串类型定义: type =stringn;var字符串变量: 字符串类型标识符;其中:n是定义的字符串长度,必须是0255之间的自然整数,第0号单元中存放串的实际长度,程序运行时由系统自动提供,第1n号单元中存放串的字符。若将stringn写成string,则默认n值为255。例如:type man=string8;line=string;varname:man;screenline:line;另一种字符类型的定义方式为把类型说明的变量定义合并在一起。例如:VARname:STRING8; screenline:STRING;Turbo Pascal中,一个字符串中的字符可以通过其对应的下标灵活使用。例如:var name:string;beginreadln(nsme);for i:=1 to ord(name0)dowriteln(namei);end.语句writeln(namei)输出name串中第i个字符。例2 求输入英文句子单词的平均长度.程序
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- Unit 2 Section A 3a-3c说课稿 2024-2025学年人教版八年级英语下册
- 第4章 《利用正比例函数与一次函数的定义求字母参数值》 说课稿 -2024-2025学年北师大版八年级数学上册
- 装配式建筑项目的施工组织与管理策略
- 空间规划与碳排放监测技术协同发展路径
- 工程管理考试题及答案解析
- 《2025合同法下违约金适用的实务指南》
- 高级幼师考试题目及答案
- 2025仿真树木护栏购销合同
- 赣州地理中考试题及答案
- 2025年出国留学人员的合法权益应依法保障-该案合同是学习合同还是服务合同
- 普通高中国家助学金申请表
- 2024年辽宁省抚顺市五十中学九年级数学第一学期开学质量跟踪监视模拟试题【含答案】
- 无机及分析化学-第1章-物质的聚集状态
- 母婴保健技术考试题
- 中国骨折内固定术后感染诊断与治疗专家共识
- JT-T-1258-2019港口能源计量导则
- 2024年急性胰腺炎急诊诊治专家共识解读课件
- 食品安全与日常饮食智慧树知到期末考试答案章节答案2024年中国农业大学
- 烘焙与甜点制作
- T-CRHA 028-2023 成人住院患者静脉血栓栓塞症风险评估技术
- 线路光缆施工方案
评论
0/150
提交评论