сортировка символов во втором массиве при замене их на '*' в старом массиве - PullRequest
0 голосов
/ 14 мая 2019

Мне нужно создать программу, которая заполняет массив символами Upcase, а затем сортирует эти символы во втором массиве.Он должен изменить каждый символ в старом массиве с помощью '*', а затем поместить его во второй массив (сортировка идет от самого низкого кода 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 Ответ

1 голос
/ 14 мая 2019

Давайте посмотрим на алгоритм сортировки. В цикле вы всегда начинаете с первого элемента в массиве T1 и сравниваете его с остальными.

Принимая во внимание, что если я не ставлю первый символ как самый низкий, он отлично работает ...

Теперь, что произойдет, когда первый символ будет самым низким? Да, он будет заменен на *, а остальная часть сортировки завершится неудачно, поскольку вы сравните со значением Ord('*'), которое меньше, чем любое символьное значение в алфавите.


Чтобы исправить алгоритм, сравните его с символом индекса цикла и поменяйте местами младший символ со значением индекса цикла в конце. Это будет держать символы '*' вне цикла и необходимость сравнивать их.

for i := 1 to n do begin    
  o := Ord(T1[i]);  // Pick actual loop index value
  p := i;  // Store index
  for k := i+1 to n do begin  // Search for lowest character
    if (Ord(T1[k]) < o) then begin
      o := ord (T1[k]);
      p := k;
    end;
  end;      
  // Swap the p and i index value, to put the * into the i index position
  if (i <> p) then 
    T1[p] := T1[i];
  T1[i] := '*';
  T2[i] := Chr(o);
end;
...