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

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

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

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


Новичок
*

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

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


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


Гуру
*****

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

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


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


Новичок
*

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

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


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


Гость






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


Новичок
*

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

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


Ткните пальцем
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
BSS
сообщение 18.04.2010 23:44
Сообщение #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 - 18.04.2010 23:45
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 19.04.2010 2:30
Сообщение #7


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

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

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


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


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


Новичок
*

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

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


Спасибо, но я не пойму, как мне в файле определить, что отрицательное число стоит перед положительным?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Ozzя
сообщение 19.04.2010 9:13
Сообщение #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я - 19.04.2010 9:15
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
BSS
сообщение 19.04.2010 9:39
Сообщение #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 
 К началу страницы 
+ Ответить 
TarasBer
сообщение 19.04.2010 10:13
Сообщение #11


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

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

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


Цитата
Код

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


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


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


Гуру
*****

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

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


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

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


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

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

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


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


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


Гуру
*****

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

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


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


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

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


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

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

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


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

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

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

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


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


Гуру
*****

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

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


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

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

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


Гость






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

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


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

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

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


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

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

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

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

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

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


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Lapp
сообщение 19.04.2010 19:53
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 19.04.2010 21:52
Сообщение #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 >
 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 18.05.2024 5:28
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"