在第二个数组中排序字符,同时在旧数组中将它们替换为“ *”

时间:2019-05-13 22:01:33

标签: delphi pascal freepascal

我需要制作一个用Upcase字符填充数组的程序,然后将这些字符排序到另一个数组中。它必须用'*'更改旧数组中的每个字符,然后将其放在第二个数组中(从最低的ASCII码到最高的ASCII码排序)。

我做了第一部分,直到现在为止只有一个问题。当我用具有最小ascii代码的第一个项目(例如'A','C','E','F','G')填充数组时,我的工作无法正常工作。该命令的输出为T2[1] = A,T2数组的其余部分填充有星星。

如果我不将第一个字符设置为最低字符,那么它可以完美工作 像:'E','A','K'....

program XD;
uses wincrt;
type 
  tab = array[1..100] of char;
var 
  t1,t2:tab;
  i,n ,k,p,o,v: integer;
begin
  repeat
    begin
      writeln('Donnez la taille T ');
      Readln(n);
    end;
  until(n in [5..20]);
  for i := 1 to n do 
    begin
      repeat
        begin
          writeln('Donnez T1[',i,']');
          readln(T1[i]);
        end;            
      until(UPCASE(T1[i]) = T1[i]);  
    end;
  for i := 1 to n do Begin    
    o := ord(T1[1]);
    for k := 2 to n do begin
      if (T1[K] <> '*') AND (ord(T1[k]) < o) then
        begin
          o := ord (T1[k]);
          p := k;
        End;
    end;
    T1[p] := '*';
    T2[v] := chr(o);
    v := v+1;
  end;
  for i := 1 to n do Begin    
    writeln('T2[',i,']=', T2[i]);
  end;
end.

1 个答案:

答案 0 :(得分:1)

让我们看一下排序算法。在循环中,您总是从aList = [3, 5, 2, 5, 8, 12] x_prev = 0 for i, x_val in enumerate(aList): aList[i] -= x_prev x_prev = x_val print(aList) 数组中的第一项开始,然后将其与其余项进行比较。

  

如果我不将第一个字符设置为最低字符,那么它就可以正常工作...

现在,当第一个字符最低时会发生什么?正确,它将被替换为T1,并且其余排序将失败,因为您将与*值进行比较,该值低于字母表中的任何字符值。


要修复该算法,请与循环索引字符进行比较,并将最低字符与循环索引值交换到最后。这样可以将Ord('*')字符排除在循环之外,并且无需与它们进行比较。

'*'