ASCⅡ码字符串输出
http://www.mydrs.org 1/25/2002 大榕树
一、问题描述 已知两个字符串及其长度,要求将这两个字符串按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 的输入将会显得十分烦琐,应将长度隐含在单词的输入之中。例如:可以约定单词输入后再输入一个特别约定的字符作为结束输入一个单词的标记。 相关下载:JSLT1-1.BAS
|