Преобразовать файл чтобы соседние числа имели разные знаки - Pascal

Узнай цену своей работы

Формулировка задачи:

собсно задание:
Дан файл, компоненты которого являются целыми числами, не равными нулю. Преобразовать файл таким образом, чтобы соседние компоненты имели разные знаки. Если количество положительных и отрицательных чисел разные, то оставшиеся числа одного знака удалить из файла.
ну для начала я написал подобную программу для массива:
const n=8;
type arr=array[1..n] of integer;
function sign(int:integer):boolean; {возвращает true если знак числа положительный}
  begin
    if int>0 then neg:=true
    else neg:=false;
  end;
var a:arr;
    i,j:byte;
    t,c:integer;
begin
randomize;
for i:=1 to n do {заполняем массив положительными и отрицательными числами}
  begin
    c:=random(16)-random(25)+1;
    if c=0 then
      inc(c);
    a[i]:=c;
    write(a[i]:5);
  end;
for i:=1 to n-2 do {сортируем}
  if sign(a[i])=sign(a[i+1]) then {если знаки соседних равны то...}
    begin
      j:=i+2;
      while (sign(a[i+1])=sign(a[j])) and (j<>n) do {...перебираем массив пока знаки будут одинаковы}
        inc(j);
      t:=a[i+1]; {меняем местами}
      a[i+1]:=a[j];
      a[j]:=t;
    end;
writeln;
i:=n;
{далее выводим массив пока соседние числа имеют разные знаки}
while (neg(a[i])=neg(a[i-1])) and (i>0) do
  dec(i);
for j:=1 to i do
  write(a[j]:5);
end.
программа работает, отлично... теперь делаю практически тоже самое, но с файлом:
type tf=file of integer;
procedure crf(var f:tf); {процедура заполняет файл числами}
  var i,n:byte;
      l:integer;
  begin
    randomize;
    n:=8
    for i:=0 to n-1 do
      begin
         l:=random(16)-random(25)+1;
         if l=0 then
           inc(l);
        write(f,l);
      end;
    seek(f,0);
  end;
function sign(int:integer):boolean;
  begin
    if int>0 then sign:=true
    else sign:=false;
  end;
procedure swapf(var f:tf; i,j:word); {процедура меняет в файле f i-тый и j-тый элементы местами}
  var a,b:integer;
  begin
    seek(f,i);
    read(f,a);
    seek(f,j);
    read(f,b);
    seek(f,i); write(f,b);
    seek(f,j); write(f,a);
    seek(f,0);
  end;
var f:tf;
    a,b,c:integer;
    i,j:word;
begin
assign(f,'c:\num.txt');
rewrite(f);
crf(f);
while not eof(f) do {выводим содержимое файла на экран}
  begin
    read(f,a);
    write(a:5);
  end;
writeln;
seek(f,0);
while filesize(f)-filepos(f)>2do
  begin
    read(f,a); i:=filepos(f);
    read(f,b);
    if sign(a)=sign(b) then
      begin
        read(f,c); j:=filepos(f);
        while (sign(b)=sign(c)) and (j<=filesize(f)) do
          begin
            read(f,c);
            j:=filepos(f);
          end;
        swapf(f,i,j-1);
        seek(f,i);
      end;
  end;
seek(f,0);
while not eof(f) do {выводим содержимое файла на экран}
  begin
    read(f,a);
    write(a:5);
  end;
close(f);
end.
понятно что эта программа не обрезает файл, но и без этого или ошибка 100 (чтение из полностью прочитанного файла) или неправильно сортирует.

Решение задачи: «Преобразовать файл чтобы соседние числа имели разные знаки»

textual
Листинг программы
 while (sign(b)=sign(c)) and (j<=filesize(f)-2) do

Объяснение кода листинга программы

  1. В цикле while выполняется условие, пока значение переменной b и c имеют одинаковый знак.
  2. Переменная j указывает на текущую позицию в файле, она не может быть больше размера файла минус 2.
  3. Цикл while выполняется до тех пор, пока не будет выполнено условие.

Оцени полезность:

7   голосов , оценка 4 из 5
Похожие ответы