IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Файлы.Удаление отрицательного числа, В файле целых чисел, если перед положительным числом стоит отрицательн
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Мужской
Реальное имя: Серёга

Репутация: -  0  +


Помогите пожалуйста решить задачу:
В файле целых чисел, если перед положительным числом стоит отрицательное, то удалить это отрицательное число
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гуру
*****

Группа: Пользователи
Сообщений: 1 220
Пол: Мужской

Репутация: -  16  +


Ну, сначала, наверное, прочитать литературу по этой теме, например тут - http://zeus.sai.msu.ru:7000/programming/bp70_lr/lr14.shtml#2
Затем, попробовать написать свой вариант. И, тогда, если будут какие-то непонятки. ;)
Уже и спросить.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Мужской
Реальное имя: Серёга

Репутация: -  0  +


Спасибо за полезную информацию, но хотелось бы видеть грамотное решение, чтобы его потом детально разобрать
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






Цитата
хотелось бы видеть грамотное решение, чтобы его потом детально разобрать
Да не надо тебе ничего разобрать, не болтай. Сдать тебе надо решение, вот и весь сказ... Я вон вижу, как ты изо всех решений, которые существуют в сети, выбрал самые бредовые для соседней темы (про Фибоначчи). Разобраться ему надо... Сейчас прям... Чего ж там не разбирался? Уж что-что, а тема чисел Фибоначчи замусолена так, что не найти грамотную рекурсивную реализацию может только слепой.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Мужской
Реальное имя: Серёга

Репутация: -  0  +


Ткните пальцем
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Мужской
Реальное имя: Серёга

Репутация: -  0  +


ну как реализовать проверку и удаление?
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.


Сообщение отредактировано: BSS -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Цитата(BSS @ 19.04.2010 0:44) *
ну как реализовать проверку и удаление?
Заведи два файла: f1 и f2. Один для чтения, а во второй пиши по мере чтения (используй для него временное имя, типа 'file.tmp'). Когда встретится отрицательное перед положительным - пропускай запись. В конце удали входной файл, а временный переименуй в него. Можно это проделать и с одним файлом, но так проще.


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Мужской
Реальное имя: Серёга

Репутация: -  0  +


Спасибо, но я не пойму, как мне в файле определить, что отрицательное число стоит перед положительным?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гуру
*****

Группа: Пользователи
Сообщений: 1 220
Пол: Мужской

Репутация: -  16  +


 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);

Проверено на последовательности:
0 -3 1 -2 1 0 -3 1 1 -3
Ответы:
1 1
То есть, найдены 3-й и предпоследний элементы. Возможные косяки ищите сами.

Сообщение отредактировано: Ozzя -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 12
Пол: Мужской
Реальное имя: Серёга

Репутация: -  0  +


Цитата(Ozzя @ 19.04.2010 10:13) *

 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);

Проверено на последовательности:
0 -3 1 -2 1 0 -3 1 1 -3
Ответы:
1 1
То есть, найдены 3-й и предпоследний элементы. Возможные косяки ищите сами.

Спасибо
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Цитата
Код

while not eof(f) do
   begin
     seek(f,i);
     seek(f,i+1);
     ...
     inc(i)
  end


Ну так-то уж не надо издеваться...


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Гуру
*****

Группа: Пользователи
Сообщений: 1 220
Пол: Мужской

Репутация: -  16  +


Цитата
Ну так-то уж не надо издеваться...

А в каком месте издевательство?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Файл - это кусок данных с последовательным доступом.
seek, насколько я знаю это ведь отнюдь не переход по массиву, особенно если файл фрагментирован.
Хорошо, если запоминаются текущая и предыдущая позиции и они не вычисляются, но так ли это? Не скрыт ли тут алгоритм маляра?


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Гуру
*****

Группа: Пользователи
Сообщений: 1 220
Пол: Мужской

Репутация: -  16  +


Исходное задание гласит:
Цитата
В файле целых чисел


Цитата
Файл - это кусок данных с последовательным доступом.
seek, насколько я знаю это ведь отнюдь не переход по массиву, особенно если файл фрагментирован.

Литературу читать не пробовали?
Тут, например:
http://zeus.sai.msu.ru:7000/programming/bp70_lr/lr14.shtml#2
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> Литературу читать не пробовали?

Пробовал, не помогает.

> Однако к типизированным и нетипизированным файлам можно
организовать прямой доступ с помощью стандартной процедуры Sееk,
которая перемещает текущую позицию файла к заданному элементу.

И чё? Я этого не знаю?
Так вот, как выглядит этот самый процесс перемещения к заданному элементу для фрагментированного файла? Файл - это не кусок оперативной памяти, к которому сразу можно обратиться по адресу.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Гуру
*****

Группа: Пользователи
Сообщений: 1 220
Пол: Мужской

Репутация: -  16  +


Цитата
Так вот, как выглядит этот самый процесс перемещения к заданному элементу для фрагментированного файла?

А я откуда знаю? И Паскаль этого не знает. Точнее, ему это поровну. Вызывает соответствующую функцию ОС.
Цитата
Файл - это не кусок оперативной памяти, к которому сразу можно обратиться по адресу.

К любой компоненте типизированного файла можно обратиться по её номеру.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






TarasBer, не бери на себя функции ОС, договорились? Это ее прерогатива, и она без тебя как-нибудь (получше, чем ты, поверь) разберется, как именно ей организовать переход к следующей записи файла. А то вот таких советов понаслушаются, и начинают писать "оптимизированные" программы. Которые потом, с выходом новой ФС, либо тормозят, либо вообще валятся. Потому что "то что было хорошо для FAT, для NTFS - смерть..." (почти С)

И не надо придумывать и додумывать задание. Там ничего не говорилось о степени фрагментированности файла и его размерах. Иначе я тебе дам вводную, при которой ты можешь даже и не пытаться решить эту задачу. Хочешь? Или поверишь на слово?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> А я откуда знаю? И Паскаль этого не знает.

Тогда почему вы так уверены в том, что это достаточно эффективный метод?

> К любой компоненте типизированного файла можно обратиться по её номеру.

Это к массиву так можно, за несколько тактов. А к файлу? Я, знаешь ли, могу тоже самое сказать про связный список - типа к каждому его элементу можно обратиться по номеру. Ну да, можно, не спорю, но нужно ли?
Файл по структуре к чему ближе - к массиву или к связному списку? Я не знаю.

> TarasBer, не бери на себя функции ОС, договорились?

А я не беру. И даже стараюсь использовать по минимуму. Просто я не понимаю, зачем каждый раз вызывать сложную операцию перехода к другой позиции. Меня не устраивает подход "работает же вроде, чё ещё надо", потому что с таким подходом надо идти на АвтоВАЗ работать.
Я не знаю, как система делает переход к позиции, возможно, что разработчики системы посчитали лишним запоминать предыдущее положение, и каждый вызов Seek будет делать прогон всех фрагментов файла с самого начала, и я не знаю, работает ли Seek за O(1) или за O(n), я не хочу об этом думать. Я лучше отдельно запомню предыдущую переменную, и не буду думать про эти вещи.
И я не знаю, как оно работает, и вы не знаете, но я не такой доверчивый. Я предпочитаю сначала узнать, что это за хрень и что и как она делает, а потом уже применять.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Уникум
*******

Группа: Пользователи
Сообщений: 6 823
Пол: Мужской
Реальное имя: Лопáрь (Андрей)

Репутация: -  159  +


Я в принципе согласен с Тарасом. Зачем постоянно позиционировать, если можно просто читать подряд и запоминать предыдущее значение?.. blink.gif
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);

Я что-то упускаю?..


--------------------
я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Гость






Цитата
Я что-то упускаю?..
Исходный файл:
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);


TarasBer,
Цитата
И я не знаю, как оно работает, и вы не знаете
А что, Вам известно больше, чем мне о том, что знаю я? Я бы не стал говорить об этом. Я - не студент, который пользуется методичками преподавателей. У меня есть доступ и к более серьезной документации, работа такая...

Цитата
я не хочу об этом думать
нельзя работать ВООБЩЕ нигде, Вам не кажется? Мое мнение о Вас РЕЗКО изменилось после таких заявлений. Больше в дискуссии с Вами я вступать не намерен. Не хотите - не думайте. Bye...
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 26.04.2024 8:04
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name