一个无法不奇怪的问题?给出错误原因和语法技巧或者其他的方安给分:大大 都进来:(40分)

  • 主题发起人 主题发起人 waderlym
  • 开始时间 开始时间
W

waderlym

Unregistered / Unconfirmed
GUEST, unregistred user!
我想把一个字符串按编码大小的顺序排列起来:用的是冒泡排序,试了在字符串中排列字符或者转为数组来做结果2个结果都错 转出来的还不一样请教原因:
procedure TForm1.Button1Click(Sender: TObject);//在字符串中排
var i,j,l:integer;
ss:string;
ff:char;
begin
if memo1.Lines.Count>0 then
begin
ss:='';
for i:=0 to memo1.Lines.Count-1 do
begin
ss:=ss+memo1.Lines.Strings;
end;

ff:=char(0);
for j:=1 to length(ss) do
begin
for l:=1 to (length(ss)-1-j) do
begin
if word(ss[l])>word(ss[l+1]) then
ff:=ss[l];
ss[l]:=ss[l+1];
ss[l+1]:=ff;
end;
end;
memo2.Lines.Add(ss);
end;
end;

procedure TForm1.Button2Click(Sender: TObject);//转为数组后排列
var i,j,l,t:integer;
ss:string;
ff:char;
aa:array of char;
begin
if memo1.Lines.Count>0 then
begin
ss:='';
for i:=0 to memo1.Lines.Count-1 do
begin
ss:=ss+memo1.Lines.Strings;
end;

ff:=char(0);
setlength(aa,length(ss));
for t:=0 to length(ss)-1 do
begin
aa[t]:=ss[t+1];
end;

for j:=low(aa) to high(aa) do
begin
for l:=low(aa) to (high(aa)-1-j) do
begin
if word(aa[l])>word(aa[l+1]) then
ff:=aa[l];
aa[l]:=aa[l+1];
aa[l+1]:=ff;
end;
end;

for t:=0 to length(ss)-1 do
begin
ss[t+1]:=aa[t];
end;
memo2.Lines.Add(ss);
end;
end;

1.在MEMO1输入 'acdvdfbdfbdfbgfbsgfbfg'
第一个转出来是:fffgsffgffffffffvv
第2个转出来是:gfffgsffgffffffffvv
2.输入:'我爱你才怪猪'
第一个转出来是:峙排沣鞍耙
第2个转出来是:砼排陪惆鞍
我自己知道肯定是编码的问题请问如何解决,如何才能得到我本意的程序:
 
乱码的情况我差不多都知道了饿 应该取2个CHAR 我改成widechar还是和第一种情况差不多 是不是我程序有问题呢?
 
汉字是WideString,不是String。
 
我知道汉字用WIDESTRING 但是效果还是和第一种情况一样有汉字重复啊>[:(]
 
我又写了一个转汉字的:
procedure TForm1.TntButton1Click(Sender: TObject);
var i,j,l:integer;
ss:widestring;
ff:widechar;
begin
if tmemo1.Lines.Count>0 then
begin
ss:='';
for i:=0 to tmemo1.Lines.Count-1 do
begin
ss:=ss+tmemo1.Lines.Strings;
end;

ff:=char(0);
for j:=1 to length(ss) do
begin
for l:=1 to (length(ss)-j) do
begin
if word(ss[l])>word(ss[l+1]) then
ff:=ss[l];
ss[l]:=ss[l+1];
ss[l+1]:=ff;
end;
end;

tmemo2.Lines.Add(ss);
end;
end;
转'我爱中华人民共和国'结果成了:'国民民民华华爱爱'
我的原意是按编码的大小由小到大的排 可是不清楚为什么会有重复的字符:请教了>
 
难到没人理会这个事情吗?[:)]
 
你必须判断第一个字符>127,那么就是汉字,然后处理。我粗略看你上面没有判断。
而且汉字是两个字节。
 
呵呵~下班了~刚看到你的问题~等下回家再看看~
 
先看下我改的程序:编译通过了:
procedure TForm1.tntButton1Click(Sender: TObject);
var i,j,l:integer;
ss:widestring;
ff:widechar;
begin
if tmemo1.Lines.Count>0 then
begin
ss:='';
for i:=0 to tmemo1.Lines.Count-1 do
begin
ss:=ss+tmemo1.Lines.Strings;
end;

for j:=1 to length(ss)-1 do
begin
l:=1;
while l<=length(ss)-j do
begin
if ord(ss[l])>ord(ss[l+1]) then
begin
ff:=ss[l];
ss[l]:=ss[l+1];
ss[l+1]:=ff;
end;
inc(l);
end;
end;

tmemo2.Lines.Add(ss);
end;
end;

应该是你循环中没控制好的问题.
 
我问的是就是JJ830104答的 谢谢
 
后退
顶部