信息学竞赛

Pascal入门

特色教育 >>信息学竞赛 >>Pascal入门

ASCⅡ码字符串输出

来源:程军康|编辑日期:2009-11-06 12:55:14|点击数: |发布:55

ASCⅡ码字符串输出


一、问题描述
已知两个字符串及其长度,要求将这两个字符串按ASCⅡ码顺序排列输出。
二、算法设计
输入:字符串的长度可以设为 m , n ;存储的两个字符串可高为数组 A[1..m], B[1..n]。
判断方法:
i 从 1 开始,比较 A[i] 和 B[i]:
A[i] > B[i] 则 B 在前,A 在后;
A[i] < B[i] 则 A 在前,B 在后;
A[i] = B[i] 继续对 A[i+1] 和 B[i+1] 比较。
可能发生的情况是逐个字符比较时都相等,这时短的字符串便排在前面;如果两个字符相同而且长度相同,那么它们的排列顺序也无所谓谁在前,谁在后。
特殊情况是字符串长度( m 或 n )≤0 ,这种情况可以作为出错处理。
三、程序设计
比较两个字符串的顺序可以用一个过程 comp 来实现,比较结果可借助于一个变量参数 k 来存储。
例如:可以约定:
K=2 用于控制比较进行(循环控制变量)
K=-1 表示 A 在 B 前,比较结束
K=0 表示 B 在 A 前,比较结束
四、程序清单
Pascal:
PROGRAM e101;
CONST maxlen=20;
TYPE a=ARRAY[1..maxlen] OF CHAR;
VAR
m, n, i, j, k: integer;
a, b: s;
PROCEDURE comp (A, B: s; m, n: integer; VAR k: integer);
VAR i: integer;
BEGIN
i:=1;k:=2;
WHILE K=2 DO
BEGIN
IF i=m+1 THEN K:=-1
ELSE
IF i=n+1 THEN k:=1
ELSE BEGIN
IF A[i] < B[i] THEN k:=-1;
IF A[i] > B[i] THEN k;=1;
END
END
END;
BEGIN
REPEAT
writeln ('Input length two string:');
readln(m ,n);
IF (m<=0) or (n<=0) THEN writeln('Length >0!!')
UNTIL (m>0) and (n>0);
writeln('Input first string:');
FOR j:=1 to m DO read(A[j]); readln;
writeln('Input second string:');
FOR j:=1 to n DO read(B[j]); readln;
comp (A, B, m, n, k);
IF k=-1 THEN BEGIN
FOR i:=1 TO m DO write(A[i]); write(',');
FOR i:=1 TO n DO write(B[j]);writeln;
END
IF k=1 THEN BEGIN
FOR i:=1 TO m DO write(B[i]); write(',');
FOR i:=1 TO n DO write(A[j]);writeln;
END
readln
END.
 
由于在两个字符串的比较中,比较容易发现哪一个大,哪一个小,所以其算法可以简单地表示为:
QBASIC程序:
CLS
DO
INPUT "M="; m
INPUT "n="; n
IF m > 0 AND n > 0 THEN EXIT DO
LOOP
DO
INPUT "a$=", a$
INPUT "b$=", b$
IF m = LEN(a$) AND n = LEN(b$) THEN EXIT DO
LOOP
IF m < n THEN SWAP m, n:SWAP a$, b$
FOR i = 1 TO n
c$ = MID$(a$, i, 1)
d$ = MID$(b$, i, 1)
IF c$ < d$ THEN
PRINT a$; " "; b$
EXIT FOR
ELSE
IF c$ > d$ THEN
PRINT b$; " "; a$
EXIT FOR
END IF
END IF
NEXT
END
注意:若将问题中的字符串理解为英文字母组成的单词,那么输出的排列结果即为字典的顺序。要用这里设计的算法排列单词的字典顺序,算法中的字符串长度 m,n 的输入将会显得十分烦琐,应将长度隐含在单词的输入之中。例如:可以约定单词输入后再输入一个特别约定的字符作为结束输入一个单词的标记。

上一篇:

下一篇: