Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Делфи _ Delphi. Перемешиваем строки.

Автор: NEFFboy 6.05.2007 15:26

есть текстый файл, который содержит текст, его нужно открыть, перемешать строки текста в нём в произвольном порядке и сохранить в другом файле.

кусок кода:

Код

begin
Edit1.Text; // сдесь исходный файл, в котором берём строки.
//тут нужен код который пермешивает строки.
Edit2.Text; // здесь сохраняем перемешанный текст.

Автор: klem4 6.05.2007 15:38

читаешь строки в массив, а потом делаешь что-то вроде этого:


// читаем строки в массив arr
randomize;
mix_count := random(50); // количество рандомных перестановок
for i := 1 to mix_count do begin
p := random(n) + 1; // n - количество строк, прочитанных из файла в массив
q := random(n) + 1;
T := arr[ p ];
arr[ p ] := arr[ q ];
arr[ q ] := T;
end;
// пишем массив в новый файл


Добавлено через 3 мин.
ну или заюзать для работы TStrings всесто массива.

Автор: NEFFboy 7.05.2007 12:25

Цитата(klem4 @ 6.05.2007 12:38) *

ну или заюзать для работы TStrings всесто массива.

не подскажешь как заюзать TSrings?
приложение без TMemo.

Автор: hardcase 7.05.2007 16:07

Цитата(NEFFboy @ 7.05.2007 9:25) *

не подскажешь как заюзать TSrings?
приложение без TMemo.
TStringList есть наследник TStrings, klem4 имел в виду его.
Код
var s: TStringList;
s := TStringList;
s.LoadFromFile('filename.txt');
// далее можно работать с s[]

Автор: klem4 9.05.2007 14:31

procedure TForm1.Button1Click(Sender: TObject);
var
s: TStringList;
swap_count, p, q: Integer;
begin
s := TStringList.Create;
s.LoadFromFile('C:\text.txt');
swap_count := 50;
while (swap_count > 0) do begin
p := random(s.Count); q := random(s.Count);
s.Exchange(p, q);
dec(swap_count);
end;
s.SaveToFile('c:\text.txt');
s.Free;
end;

Автор: NEFFboy 9.05.2007 20:29

спасибо за помощь...
разобрался сам, сделал, то что мне нужно


var
a:TStringList;
i,first,last:integer;
s:widestring;
begin
randomize;
a:=TStringList.Create;
a.LoadFromFile(Edit1.Text);
for i:=0 to a.Count-1 do
begin
first:=random(a.Count-1);
last:=random(a.Count-1);
s:=a.Strings[first];
a.Strings[first]:=a.Strings[last];
a.Strings[last]:=s;
end;
a.SaveToFile(Edit2.Text);
a.Free;
end;

Автор: klem4 9.05.2007 21:31

Ну в принципе тоже что и я написал, только у тебя

Цитата
random(a.Count-1);


Единицу вычитать не надо, ибо random(x) возвращает случайное значение в интервале от 0 до X - 1

Автор: NEFFboy 11.05.2007 0:03

Цитата(klem4 @ 9.05.2007 11:31) *


swap_count := 50;




А почему именно 50?

Автор: klem4 11.05.2007 0:10

Ну вот захотелось мне 50 smile.gif Это количество перестановок которые будут совершены ... Ставь любое положительное число.