Работа с файлами 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