Преобразовать файл чтобы соседние числа имели разные знаки - Pascal
Формулировка задачи:
собсно задание:
ну для начала я написал подобную программу для массива:
программа работает, отлично... теперь делаю практически тоже самое, но с файлом:
понятно что эта программа не обрезает файл, но и без этого или ошибка 100 (чтение из полностью прочитанного файла) или неправильно сортирует.
Дан файл, компоненты которого являются целыми числами, не равными нулю. Преобразовать файл таким образом, чтобы соседние компоненты имели разные знаки. Если количество положительных и отрицательных чисел разные, то оставшиеся числа одного знака удалить из файла.
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.
Решение задачи: «Преобразовать файл чтобы соседние числа имели разные знаки»
textual
Листинг программы
while (sign(b)=sign(c)) and (j<=filesize(f)-2) do
Объяснение кода листинга программы
- В цикле while выполняется условие, пока значение переменной b и c имеют одинаковый знак.
- Переменная j указывает на текущую позицию в файле, она не может быть больше размера файла минус 2.
- Цикл while выполняется до тех пор, пока не будет выполнено условие.