Помогите пожалуйста решить задачу:
В файле целых чисел, если перед положительным числом стоит отрицательное, то удалить это отрицательное число
Ну, сначала, наверное, прочитать литературу по этой теме, например тут - http://zeus.sai.msu.ru:7000/programming/bp70_lr/lr14.shtml#2
Затем, попробовать написать свой вариант. И, тогда, если будут какие-то непонятки. ;)
Уже и спросить.
Спасибо за полезную информацию, но хотелось бы видеть грамотное решение, чтобы его потом детально разобрать
Ткните пальцем
ну как реализовать проверку и удаление?
program p11;
uses crt;
var
f: file of integer;
s:string;
x,n,i:integer;
Begin
writeln('input name of file:');
readln(s);
Assign (f,s);
rewrite(f);
writeln('input amount of numbers:');
readln(n);
for i:=1 to n do
begin
readln(x);
write(f,x);
end;
close(f);
reset(f);
while not eof(f) do
begin
read(f,x);
if x<0
//
//
end;
end.
Спасибо, но я не пойму, как мне в файле определить, что отрицательное число стоит перед положительным?
reset(f);
i:=0;
while not eof(f) do
begin
seek(f,i);
read(f,x);
seek(f,i+1);
read(f,n);
if (x>0) and (n<0) then
writeln(x);
i:=i+1;
end;
close(f);
reset(f);
i:=0;
while not eof(f) do
begin
seek(f,i);
read(f,x);
seek(f,i+1);
read(f,n);
if (x>0) and (n<0) then
writeln(x);
i:=i+1;
end;
close(f);
Файл - это кусок данных с последовательным доступом.
seek, насколько я знаю это ведь отнюдь не переход по массиву, особенно если файл фрагментирован.
Хорошо, если запоминаются текущая и предыдущая позиции и они не вычисляются, но так ли это? Не скрыт ли тут алгоритм маляра?
Исходное задание гласит:
> Литературу читать не пробовали?
Пробовал, не помогает.
> Однако к типизированным и нетипизированным файлам можно
организовать прямой доступ с помощью стандартной процедуры Sееk,
которая перемещает текущую позицию файла к заданному элементу.
И чё? Я этого не знаю?
Так вот, как выглядит этот самый процесс перемещения к заданному элементу для фрагментированного файла? Файл - это не кусок оперативной памяти, к которому сразу можно обратиться по адресу.
TarasBer, не бери на себя функции ОС, договорились? Это ее прерогатива, и она без тебя как-нибудь (получше, чем ты, поверь) разберется, как именно ей организовать переход к следующей записи файла. А то вот таких советов понаслушаются, и начинают писать "оптимизированные" программы. Которые потом, с выходом новой ФС, либо тормозят, либо вообще валятся. Потому что "то что было хорошо для FAT, для NTFS - смерть..." (почти С)
И не надо придумывать и додумывать задание. Там ничего не говорилось о степени фрагментированности файла и его размерах. Иначе я тебе дам вводную, при которой ты можешь даже и не пытаться решить эту задачу. Хочешь? Или поверишь на слово?
> А я откуда знаю? И Паскаль этого не знает.
Тогда почему вы так уверены в том, что это достаточно эффективный метод?
> К любой компоненте типизированного файла можно обратиться по её номеру.
Это к массиву так можно, за несколько тактов. А к файлу? Я, знаешь ли, могу тоже самое сказать про связный список - типа к каждому его элементу можно обратиться по номеру. Ну да, можно, не спорю, но нужно ли?
Файл по структуре к чему ближе - к массиву или к связному списку? Я не знаю.
> TarasBer, не бери на себя функции ОС, договорились?
А я не беру. И даже стараюсь использовать по минимуму. Просто я не понимаю, зачем каждый раз вызывать сложную операцию перехода к другой позиции. Меня не устраивает подход "работает же вроде, чё ещё надо", потому что с таким подходом надо идти на АвтоВАЗ работать.
Я не знаю, как система делает переход к позиции, возможно, что разработчики системы посчитали лишним запоминать предыдущее положение, и каждый вызов Seek будет делать прогон всех фрагментов файла с самого начала, и я не знаю, работает ли Seek за O(1) или за O(n), я не хочу об этом думать. Я лучше отдельно запомню предыдущую переменную, и не буду думать про эти вещи.
И я не знаю, как оно работает, и вы не знаете, но я не такой доверчивый. Я предпочитаю сначала узнать, что это за хрень и что и как она делает, а потом уже применять.
Я в принципе согласен с Тарасом. Зачем постоянно позиционировать, если можно просто читать подряд и запоминать предыдущее значение?..
Read(f,i);
while not EoF(f) do begin
Read(f,j);
if (i>=0)or(j<=0) then Write(g,i)
end;
Write(g,j);
0, -3, 11, -2, 1, 0, -3, 10, 1, -3, 5
Running "f:\programs\test.exe"
0 0 0 0 0 0 0 0 0 0 5
prev := -1;
save := false; // На всякий случай, если будет пустой файл.
// Не люблю оставлять ВОЗМОЖНОСТЬ для ошибки
while not eof(f) do
begin
save := true;
read(f, next);
if (prev < 0) and (next >= 0) then
else writeln('file -> ', prev);
prev := next;
end;
if save then writeln('file -> ', prev);
Read(f,i);
while not EoF(f) do begin
Read(f,j);
if (i>=0)or(j<=0) then Write(g,i);
i:=j // вот это
end;
Write(g,j);
Read(f,i);
while not EoF(f) do begin
Read(f,j);
if (i>=0)or(j<=0) then Write(g,i);
i:=j // вот это
end;
Write(g,j);