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

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

Форум «Всё о Паскале» _ Задачи _ сортировка текста

Автор: Mavra 12.11.2008 2:53

есть текстовый файл-список вида:
....
*:OMAA = Abu Dhabi
*:BIAR = Акорейри
*:DABB = Аннаба
*:EHAM = Amsterdam
*:LTAC = Ankara
*:LIPY = Ancona
*:LGAT = Athens-H
*:EKBI = Billund
*:EDKB = Bon
.....
и так далее.
в списке города и их коды.
нужно упорчдочить список в алфавитном порядке A..YZАБ..Я
оставив при этом такую же систему с кодом....

вот что я тут понапыталась написать....что-то не оч получилось

begin
assign(ffirst,E1);
assign(f2,E2);
assign(fnew1,E3);
assign(fnew2,E4);
{$I-}Reset(ffirst);{$I+}
If IOResult<>0 then
Writeln ('Fajl ne moget byt otkryt...') ;
{$I-}Reset(f2);{$I+}
If IOResult<>0 then
Writeln ('Fajl ne moget byt otkryt...') ;
rewrite(fnew1);
rewrite(fnew2);
p:=0; q:=0;
while not Eof(ffirst) do
begin
read(ffirst,snew);
p:=p+1;
sm:=snew;
Delete(sm, 1, 9);
while not eof(f2) do
begin
read(ffirst,snew1);
q:=q+1;
sb:=snew1;
delete(sb,1,9);
if p<>q then
if (sb<sm)and(sb[1]<>' ')and(sm[1]<>' ') then
begin
sm:=sb;
snew:=snew1;
end;
writeln(fnew1,snew);
end;
writeln(fnew1,snew);
end;
close(ffirst);
close(f2);
close(fnew1);
close(fnew2);
end.

Автор: samec 12.11.2008 3:24

Список нужно упорядочить по КОДАМ или по НАЗВАНИЯМ городов?
А где объявления переменных в твоей программе? Данные хранятся в одном файле?
Использовать массив (для чтения в него из файла информации) можно? Или нет?
Что делает приведенная тобою программа - я не совсем понял.

Автор: Mavra 12.11.2008 3:31

Цитата(samec @ 11.11.2008 23:24) *

Список нужно упорядочить по КОДАМ или по НАЗВАНИЯМ городов?
А где объявления переменных в твоей программе? Данные хранятся в одном файле?
Использовать массив (для чтения в него из файла информации) можно? Или нет?
Что делает приведенная тобою программа - я не совсем понял.

по названиям

const E1='D:\mom\ishodnik.txt';
E2='D:\mom\ishodnik2.txt';
E3='D:\mom\fnew1.txt';
E4='D:\mom\fnew2.txt';
var p,q,i:integer;
var ffirst, fnew1, fnew2,f2: Text;
var snew,snew1, sb,sm:string;


данные в одном файле. использовать можно все что угодно.

сравнивает строки и записывает в новый файл

Автор: volvo 12.11.2008 4:49

Вот тут: http://forum.pascal.net.ru/index.php?s=&showtopic=20686&view=findpost&p=115778 лежит процедура сортировки текстового файла слиянием. Чуть-чуть видоизменяем ее (упрощаем и добавляем нужную тебе функциональность), и получаем:

procedure sort_file(var f: text);

var
f1, f2: text;
b, b1, b2: string;
i, i1, i2, p: Boolean;
k: integer;

function split(s: string): string;
begin
split := copy(s, pos('=', s) + 2, 255);
end;

function more_less(const x,y: string; ord: Boolean):Boolean;
begin
more_less := ord = (split(x) < split(y));
end { more_less};

function read_str(var t: text; var buf: string): boolean;
var s: string;
begin
s := buf; readln(t, buf);
read_str := (buf <> s) and more_less(buf, s, true);
end {read_str};

procedure write_str(var t:text;buf:string;var int:Boolean);
begin
if not int then writeln(f,buf);
if eof(t) then int:=true
end { write_str};

procedure get_s(var f: text; var s: string; var b: boolean);
begin

if not eof(f) then begin
if read_str(f, s) then p := not p; b := false
end
else p:=not p

end;


BEGIN {sort_file}
assign(f1,'F1'); assign(f2,'F2');
repeat { разделение на 2 файла }
reset(f); rewrite(f1); rewrite(f2);

k := 1; readln(f, b); writeln(f1, b);
while not eof(f) do begin

if read_str(f,b) then inc(k);
if odd(k) then writeln(f1,b) else writeln(f2,b)

end;{ конец разделения }

p := true; i1 := false; i2 := false;
if k > 1 then begin { слияние файлов }

rewrite(f); reset(f1); reset(f2);
readln(f1,b1); readln(f2,b2);

if more_less(b1, b2, p) then
write_str(f1,b1,i1)
else write_str(f2,b2,i2);

repeat

if more_less(b1, b2, p) then
get_s(f1, b1, i1)
else get_s(f2, b2, i2);

if more_less(b1, b2, p) then
write_str(f1, b1, i1)
else write_str(f2, b2, i2);

until (i1 and i2);
end { конец слияния файлов };

until k <= 2; { разделения на 2 файла }

close(f); close(f1); close(f2);
erase(f1); erase(f2);
END{sort_file};

var
f: text;
begin
assign(f,'D:\mom\ishodnik.txt');
sort_file(f);
end.

Это все, что нужно сделать... Файл будет отсортирован по названиям городов...