• Задача: В типизированном файле поменять местами две записи.
    То есть дан номер маршрута 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;

Ответы 8

  • короче я не знаю как провести сортировку в типиз файле
  • видишь я нахожу строку с "маршрутом 11", но далее не знаю, как ее переставить со следующей
  • то есть если строка с "маршрутом 11" 1-ая, то мне ее надо переставить со 2-ой, т.е. поменять местами
  • интересный вариант решения, но не самый практичный, но все равно спасибо!
    • Автор:

      dearamci
    • 6 лет назад
    • 0
  • Можно и более практично, конечно. Просто кажется, что с двумя файлами алгоритм понятнее.
    • Автор:

      tatumle
    • 6 лет назад
    • 0
  • Второй код точно работает! Спасибо огромное!
    • Автор:

      noodle
    • 6 лет назад
    • 0
  • поясни по нормальней
  • Здесь нужно использовать вспомогательный типизированный файл и, соответственно, вторую файловую переменную (fr2). Сделать это можно так:while not eof(fr) and (kol=0) dobeginread(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') thenbeginwriteln('... ');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;
  • Добавить свой ответ

Войти через Google

или

Забыли пароль?

У меня нет аккаунта, я хочу Зарегистрироваться

How much to ban the user?
1 hour 1 day 100 years