Работа с файлами Pascal

Задание: Дан файл f компоненты которого являются целыми числами. Никакой из компонентов файла не равен нулю. Файл f содержит столько негативных чисел, сколько и положительных. Используя вспомогательный файл h, переписать компоненты файла f в файл g так, чтобы в файле g числа шли в следующем порядке: два положительных, два отрицательных, два положительных, два отрицательных и т.д. (предполагается, что число компонентов в файле f делится на 4).

Небольшое объяснение от препода: В файле должно быть такое КОЛИЧЕСТВО чисел, чтобы делилось на 4, например 8, 12, 16 и .д. Это для того, чтобы в новый файл можно было написать 2 положительных числа, два отрицательных и т.д.

Не понятна сама логика этого задания, и зачем нужен вспомогательный файл h, так же не непонятно как сортировать числа на 2 положительных и 2 отрицательных. Вот весь код до которого я додумался и в котором я сам мало что понял, подскажите как это можно реализовать, и через что.

Главный вопрос, как мне отсортировать числа на первые 2 положительных, вторые 2 отрицательных, приме: У нас есть 8 чисел: 4,8,12,16,-20,-24,-26,-28. И должен быть такой порядок: 4, -20, 8, -24 и т.д Скорей всего надо в файл h записать, например, - числа. Потом брать из файла f число, если оно + писать в файл g (2 шт ), а потом - писать из файла h (2шт). И так чередовать

var
  i,s:integer;
  f,g,h:text;
  begin
    assign(f,'start.txt');
    reset(f);
    assign(h,'prom.txt');
    rewrite(h);
    i:=0;
    while not EOF(f) do begin
      readln(f,s);
      i:=i+1;
      if s mod 4 then writeln(h,s)
    end;
    close(f);
  end.

Ответы (1 шт):

Автор решения: Владимир Клыков

Не уверен что это полностью соответствует условиям, но вот результат верный....

var
  s:integer;
  itm:array[0..1] of List<integer>;
  i:integer;
  
  f,g,h:text;
  begin
    assign(f,'start.txt');
    reset(f);
    assign(h,'out.txt');
    rewrite(h);
    itm[0] := new List<integer>;
    itm[1] := new List<integer>;
    while not EOF(f) do 
    begin
      read(f,s);
      itm[s shr ((sizeof(integer)*8)-1) and 1].Add(s);
    end;
    close(f);
    s:=0;
    if((itm[0].Count = itm[1].Count) and (itm[1].Count and 1=0)) then
      while s<itm[0].Count do
      begin
      for i:=0 to 3 do
          write(h,itm[i shr 1].Item[s + (i and 1)],' ');
        s:=s+2;
      end;
      close(h);
  end.

Ввод:

1 2 -5 -7 -8 4 -3 2 -1 -1 -1 -1 2 3 4 5

вывод:

1 2 -5 -7 4 2 -8 -3 2 3 -1 -1 4 5 -1 -1 
→ Ссылка