对第二个数组中的字符进行排序,同时用旧数组中的“*”替换它们
sorting characters in an second array while replacing them with '*' in the old array
我需要编写一个程序,用 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.
让我们看看排序算法。在循环中,您始终从 T1
数组中的第一项开始并将其与其余项进行比较。
Whereas if I don't put the first char as the lowest it works perfectly ...
现在,当第一个字符最低时会发生什么?是的,它将被替换为 *
,其余排序将失败,因为您将与 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;
我需要编写一个程序,用 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.
让我们看看排序算法。在循环中,您始终从 T1
数组中的第一项开始并将其与其余项进行比较。
Whereas if I don't put the first char as the lowest it works perfectly ...
现在,当第一个字符最低时会发生什么?是的,它将被替换为 *
,其余排序将失败,因为您将与 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;