![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
BSS |
![]()
Сообщение
#1
|
Новичок ![]() Группа: Пользователи Сообщений: 12 Пол: Мужской Реальное имя: Серёга Репутация: ![]() ![]() ![]() |
Помогите пожалуйста решить задачу:
В файле целых чисел, если перед положительным числом стоит отрицательное, то удалить это отрицательное число |
Ozzя |
![]()
Сообщение
#2
|
![]() Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 220 Пол: Мужской Репутация: ![]() ![]() ![]() |
Ну, сначала, наверное, прочитать литературу по этой теме, например тут - http://zeus.sai.msu.ru:7000/programming/bp70_lr/lr14.shtml#2
Затем, попробовать написать свой вариант. И, тогда, если будут какие-то непонятки. ;) Уже и спросить. |
BSS |
![]()
Сообщение
#3
|
Новичок ![]() Группа: Пользователи Сообщений: 12 Пол: Мужской Реальное имя: Серёга Репутация: ![]() ![]() ![]() |
Спасибо за полезную информацию, но хотелось бы видеть грамотное решение, чтобы его потом детально разобрать
|
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Цитата хотелось бы видеть грамотное решение, чтобы его потом детально разобрать Да не надо тебе ничего разобрать, не болтай. Сдать тебе надо решение, вот и весь сказ... Я вон вижу, как ты изо всех решений, которые существуют в сети, выбрал самые бредовые для соседней темы (про Фибоначчи). Разобраться ему надо... Сейчас прям... Чего ж там не разбирался? Уж что-что, а тема чисел Фибоначчи замусолена так, что не найти грамотную рекурсивную реализацию может только слепой. |
BSS |
![]()
Сообщение
#5
|
Новичок ![]() Группа: Пользователи Сообщений: 12 Пол: Мужской Реальное имя: Серёга Репутация: ![]() ![]() ![]() |
Ткните пальцем
|
BSS |
![]()
Сообщение
#6
|
Новичок ![]() Группа: Пользователи Сообщений: 12 Пол: Мужской Реальное имя: Серёга Репутация: ![]() ![]() ![]() |
ну как реализовать проверку и удаление?
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 - |
Lapp |
![]()
Сообщение
#7
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
ну как реализовать проверку и удаление? Заведи два файла: f1 и f2. Один для чтения, а во второй пиши по мере чтения (используй для него временное имя, типа 'file.tmp'). Когда встретится отрицательное перед положительным - пропускай запись. В конце удали входной файл, а временный переименуй в него. Можно это проделать и с одним файлом, но так проще.-------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
BSS |
![]()
Сообщение
#8
|
Новичок ![]() Группа: Пользователи Сообщений: 12 Пол: Мужской Реальное имя: Серёга Репутация: ![]() ![]() ![]() |
Спасибо, но я не пойму, как мне в файле определить, что отрицательное число стоит перед положительным?
|
Ozzя |
![]()
Сообщение
#9
|
![]() Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 220 Пол: Мужской Репутация: ![]() ![]() ![]() |
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я - |
BSS |
![]()
Сообщение
#10
|
Новичок ![]() Группа: Пользователи Сообщений: 12 Пол: Мужской Реальное имя: Серёга Репутация: ![]() ![]() ![]() |
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-й и предпоследний элементы. Возможные косяки ищите сами. Спасибо |
TarasBer |
![]()
Сообщение
#11
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата Код while not eof(f) do begin seek(f,i); seek(f,i+1); ... inc(i) end Ну так-то уж не надо издеваться... -------------------- |
Ozzя |
![]()
Сообщение
#12
|
![]() Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 220 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата Ну так-то уж не надо издеваться... А в каком месте издевательство? |
TarasBer |
![]()
Сообщение
#13
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
Файл - это кусок данных с последовательным доступом.
seek, насколько я знаю это ведь отнюдь не переход по массиву, особенно если файл фрагментирован. Хорошо, если запоминаются текущая и предыдущая позиции и они не вычисляются, но так ли это? Не скрыт ли тут алгоритм маляра? -------------------- |
Ozzя |
![]()
Сообщение
#14
|
![]() Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 220 Пол: Мужской Репутация: ![]() ![]() ![]() |
Исходное задание гласит:
Цитата В файле целых чисел Цитата Файл - это кусок данных с последовательным доступом. seek, насколько я знаю это ведь отнюдь не переход по массиву, особенно если файл фрагментирован. Литературу читать не пробовали? Тут, например: http://zeus.sai.msu.ru:7000/programming/bp70_lr/lr14.shtml#2 |
TarasBer |
![]()
Сообщение
#15
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
> Литературу читать не пробовали?
Пробовал, не помогает. > Однако к типизированным и нетипизированным файлам можно организовать прямой доступ с помощью стандартной процедуры Sееk, которая перемещает текущую позицию файла к заданному элементу. И чё? Я этого не знаю? Так вот, как выглядит этот самый процесс перемещения к заданному элементу для фрагментированного файла? Файл - это не кусок оперативной памяти, к которому сразу можно обратиться по адресу. -------------------- |
Ozzя |
![]()
Сообщение
#16
|
![]() Гуру ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 220 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата Так вот, как выглядит этот самый процесс перемещения к заданному элементу для фрагментированного файла? А я откуда знаю? И Паскаль этого не знает. Точнее, ему это поровну. Вызывает соответствующую функцию ОС. Цитата Файл - это не кусок оперативной памяти, к которому сразу можно обратиться по адресу. К любой компоненте типизированного файла можно обратиться по её номеру. |
volvo |
![]()
Сообщение
#17
|
Гость ![]() |
TarasBer, не бери на себя функции ОС, договорились? Это ее прерогатива, и она без тебя как-нибудь (получше, чем ты, поверь) разберется, как именно ей организовать переход к следующей записи файла. А то вот таких советов понаслушаются, и начинают писать "оптимизированные" программы. Которые потом, с выходом новой ФС, либо тормозят, либо вообще валятся. Потому что "то что было хорошо для FAT, для NTFS - смерть..." (почти С)
И не надо придумывать и додумывать задание. Там ничего не говорилось о степени фрагментированности файла и его размерах. Иначе я тебе дам вводную, при которой ты можешь даже и не пытаться решить эту задачу. Хочешь? Или поверишь на слово? |
TarasBer |
![]()
Сообщение
#18
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
> А я откуда знаю? И Паскаль этого не знает.
Тогда почему вы так уверены в том, что это достаточно эффективный метод? > К любой компоненте типизированного файла можно обратиться по её номеру. Это к массиву так можно, за несколько тактов. А к файлу? Я, знаешь ли, могу тоже самое сказать про связный список - типа к каждому его элементу можно обратиться по номеру. Ну да, можно, не спорю, но нужно ли? Файл по структуре к чему ближе - к массиву или к связному списку? Я не знаю. > TarasBer, не бери на себя функции ОС, договорились? А я не беру. И даже стараюсь использовать по минимуму. Просто я не понимаю, зачем каждый раз вызывать сложную операцию перехода к другой позиции. Меня не устраивает подход "работает же вроде, чё ещё надо", потому что с таким подходом надо идти на АвтоВАЗ работать. Я не знаю, как система делает переход к позиции, возможно, что разработчики системы посчитали лишним запоминать предыдущее положение, и каждый вызов Seek будет делать прогон всех фрагментов файла с самого начала, и я не знаю, работает ли Seek за O(1) или за O(n), я не хочу об этом думать. Я лучше отдельно запомню предыдущую переменную, и не буду думать про эти вещи. И я не знаю, как оно работает, и вы не знаете, но я не такой доверчивый. Я предпочитаю сначала узнать, что это за хрень и что и как она делает, а потом уже применять. -------------------- |
Lapp |
![]()
Сообщение
#19
|
![]() Уникум ![]() ![]() ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 6 823 Пол: Мужской Реальное имя: Лопáрь (Андрей) Репутация: ![]() ![]() ![]() |
Я в принципе согласен с Тарасом. Зачем постоянно позиционировать, если можно просто читать подряд и запоминать предыдущее значение?..
![]() 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);
Я что-то упускаю?.. -------------------- я - ветер, я северный холодный ветер
я час расставанья, я год возвращенья домой |
volvo |
![]()
Сообщение
#20
|
Гость ![]() |
Цитата Я что-то упускаю?.. Исходный файл:0, -3, 11, -2, 1, 0, -3, 10, 1, -3, 5 После прогона твоего алгоритма: Running "f:\programs\test.exe" Упускаешь... Я делал так (запись в файл заменена, для тестирования, на вывод на консоль): 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... |
![]() ![]() |
![]() |
Текстовая версия | 22.04.2025 0:49 |