Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2011, 19:24   #1
torah
Пользователь
 
Регистрация: 02.11.2010
Сообщений: 19
Сообщение Нетипизированный файл. Нужно оптимизировать

В задании требуется поменять местами в файле 2 блока размером N байт, начинающийся с m1 и m2 байта. Если блоки пересекаются, выдать сообщение об ошибке.

Код:
program project1;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes
  { you can add units after this };

{$IFDEF WINDOWS}{$R project1.rc}{$ENDIF}
var
  filename: string;
  f: file;
  m1, m2, n: integer;
  buf1, buf2: integer;
  i: integer;
begin
write('Enter file name: '); readln(fileName);
write('Enter begin of first block: '); readln(m1);
write('Enter begin of second block: '); readln(m2);
write('Enter size of blocks (bytes): '); readln(n);
if (abs(m1 - m2) < n) then begin writeln('Blocks are crossing.'); readln; exit; end;
assign(f, fileName);
reset(f, 1);
for i:= 0 to n - 1 do
begin
  seek(f, m1 + i);
  BlockRead(f, buf1, 1);

  seek(f, m2 + i);
  BlockRead(f, buf2, 1);

  seek(f, m2 + i);
  BlockWrite(f, buf1, 1);

  seek(f, m1 + i);
  BlockWrite(f, buf2, 1);

end;
close(f);
writeln('Press any key to continue....'); readln;
end.
оптимизация заключается в том, что мне нужно заменить цикл,
Код:
for i:= 0 to n - 1 do
begin
  seek(f, m1 + i);
  BlockRead(f, buf1, 1);

  seek(f, m2 + i);
  BlockRead(f, buf2, 1);

  seek(f, m2 + i);
  BlockWrite(f, buf1, 1);

  seek(f, m1 + i);
  BlockWrite(f, buf2, 1);
точнее сделать код без нее. Мне посоветовали задать буфер через массив. Помогите доделать программу, пожалуйста.
torah вне форума Ответить с цитированием
Старый 06.05.2011, 21:02   #2
torah
Пользователь
 
Регистрация: 02.11.2010
Сообщений: 19
По умолчанию

подскажите, пожалуйста.
torah вне форума Ответить с цитированием
Старый 06.05.2011, 21:47   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

примерно так:
Код:
var 
  Buf1, Buf2 : array[1..N] of byte;
.....
  if (m2=m1) then begin WriteLn('Блоки совпадают. Выходим..');
    Exit;
  end;
  if ((m2>m1) and (m2<(m1+N))) 
     or
     ((m1>m2) and (m1<(m2+N)))  then begin 
        WriteLn('Блоки пересекаются. Выходим..');
    Exit;
  end;

  seek(f, m1)
  BlockRead(f, buf1, N);
  seek(f, m2)
  BlockRead(f, buf2, N);
  seek(f, m1)
  BlockWrite(f, buf2, N);
  seek(f, m2)
  BlockWrite(f, buf1, N);
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.05.2011, 22:41   #4
torah
Пользователь
 
Регистрация: 02.11.2010
Сообщений: 19
По умолчанию

В принципе, считает, как и раньше. Если данная оптимизация будет удачной, буду очень рада.
Спасибо, что хоть кто-то ответил на мою просьбу!
torah вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Объявить какой-либо заранее созданный файл как нетипизированный и вывести все четные учетверенные слова. anurid Помощь студентам 3 13.05.2010 17:06
Объявить какой-либо заранее созданный файл как нетипизированный anurid Паскаль, Turbo Pascal, PascalABC.NET 4 24.04.2010 20:00
нетипизированный файл amandra Общие вопросы Delphi 6 07.10.2008 07:44
[Pascal]Нетипизированный файл Fuaran8989 Помощь студентам 1 13.05.2008 09:14
Нетипизированный файл OrdJONY Общие вопросы Delphi 10 03.10.2007 18:39