profile
Опубликовано 5 лет назад по предмету Информатика от fireRising

Задача: В типизированном файле поменять местами две записи.
То есть дан номер маршрута Marshrut.NK.N, количество остановок до метро Marshrut.NK.K. Надо найти маршрут 11 и поменять его местами со след записью. Вот часть кода именной этой процедуры, помогите с сортировкой т.к. та, которая написана ниже не робит.
var
Marshrut, y: TMarshrut;
Vidtransporta: TVidtransporta;
fr: file of TMarshrut;
n, kol, k: integer;
FileName:string[80];
begin
while not eof(fr) and (kol=0) do
begin
read(fr, Marshrut);

if (Marshrut.NK.N = '11') then
begin
writeln('Маршрут: ',Marshrut.NK.N,
' Количество остановок до метро: ',Marshrut.NK.K);
inc(kol);
k:=FilePos(fr)-1;
y:=FilePos(fr);
seek (fr, 0);
write (fr, y);
seek (fr, 1);
write (fr, k);
write('В файле изменена запись номер', k+1);
write(fr, Marshrut);
end;
end;

if kol=0 then
writeln('Данные, соответствующие запросу, не найдены');

CloseFile(fr);

write('Press ENTER'); readln;
end;

  1. Ответ
    Ответ дан fourweapon
    поясни по нормальней
    1. Ответ
      Ответ дан fireRising
      короче я не знаю как провести сортировку в типиз файле
    2. Ответ
      Ответ дан fireRising
      видишь я нахожу строку с "маршрутом 11", но далее не знаю, как ее переставить со следующей
    3. Ответ
      Ответ дан fireRising
      то есть если строка с "маршрутом 11" 1-ая, то мне ее надо переставить со 2-ой, т.е. поменять местами
  2. Ответ
    Ответ дан petyaGavrikov
    Здесь нужно использовать вспомогательный типизированный файл и, соответственно, вторую файловую переменную (fr2).
    Сделать это можно так:
    while not eof(fr) and (kol=0) do
    begin
    read(fr, Marshrut);
    if (Marshrut.NK.N <> '11')
       then write(fr2,Marshrut)
       else begin inc(kol); y:=Marshrut; end;
    end;
    if not eof(fr) then
      begin
      read(fr, Marshrut);
      write(fr2,Marshrut);
      end;
    if (kol=1) then  write(fr2,y);
    Дальше нужно просто переписать оставшиеся записи из первого файла во второй. Затем оба файла закрыть, первый файл удалить, а второй переименовать (т.е. назвать его так, как назывался первый файл).

    Попробуйте ещё вот такой вариант:
    (здесь k1 и k2 - целые, а y - типа )
    if (Marshrut.NK.N = '11') then
    begin
    writeln('... ');
    inc(kol);
    y:=Marshrut;
    k1:=FilePos(fr)-1;
    k2:=FilePos(fr);
    if not eof(fr) then
     begin
     read(fr, Marshrut);
     seek (fr, k1);
     write(fr, Marshrut);
     seek (fr, k2);
     write (fr, y);
     end;

    end;
    1. Ответ
      Ответ дан fireRising
      интересный вариант решения, но не самый практичный, но все равно спасибо!
    2. Ответ
      Ответ дан petyaGavrikov
      Можно и более практично, конечно. Просто кажется, что с двумя файлами алгоритм понятнее.
    3. Ответ
      Ответ дан fireRising
      Второй код точно работает! Спасибо огромное!
Самые новые вопросы