Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > Pascal > Типизированные файлы |
Автор: Рей 01.03.07, 10:57 |
Помогите пожалуйста: Дан файл целых чисел, неравных нулю. число положительных = числу отрицательных. Используя вспомогательный файл, создать новый файл, чтобы не было двух соседних чисел с одним знаком. Задача на паскале. Добавлено Я просто не очень понимаю типизированные файлы |
Автор: SeaGirl 01.03.07, 11:02 |
Работа с файлами (сообщение #299329) Да и вобще про работу с файлами почитать полезно Работа с файлами |
Автор: volvo877 01.03.07, 18:56 |
Ты по ссылкам ходил? Или ждешь, что тебе тут на блюдечке выложат готовое решение? Тогда тебе в раздел "Работа", здесь помогают, но только тогда, когда ты сам ЧТО-ТО делаешь... |
Автор: Рей 02.03.07, 08:57 |
Да, я искал но нужного не нашел. Я думаю, надо сначала проверить есть ли файл на диске через IO rezult; если он есть на диске то работать с ним, если не имеется, то создать файл. Проверку на количество вводимых положительных и отрицательных чисел я сделал <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> type file_type= file of integer; var f: file_type; r,k:Integer; begin writeln(' vvedite elementyu faila, okonchanie 0'); assign(f, 'data.doc'); rewrite(f); k:=0; repeat readln(r); if r<>0 then begin write(f,r); if r>0 then k:=k+1; if r<0 then k:=k-1; end; until r=0; if k<>0 then write('osibka') else begin я думаю, что без массива здесь не обойтись. мне приходила мысль, что вспомогательный файл для того и используется, чтобы переписать например все отрицательные числа, а в данном оставить все положительные . А потом брать по одному элементу по очереди из файлов. Но тогда вопорс: ведь в задании не указано, какое число должно быть первым: положительное или отрицательное. |
Автор: SeaGirl 02.03.07, 09:09 |
Вобще-то не сделал. Насколько я поняла есть уже готовый типизированный файл с целыми числами, и надо проверить действительно ли там все правильно. А ты проверил просто вводимые с клавитауры значения. |
Автор: Рей 02.03.07, 10:13 |
Просто я подумал, что надо вводить с клавиатуры числа и потом проверять их. Я не могу понять, как организовать запись в новый файл чисел так , чтобы положительные числа чередовались с отрицательными. |
Автор: SeaGirl 02.03.07, 10:29 |
У тебя же в задании написано русским языком Цитата Рей @ Я не могу понять, как организовать запись в новый файл чисел так , чтобы положительные числа чередовались с отрицательными. Запиши положительные и отрицательные числа в два массива и поочередно записывай в файл под одному значению из каждого. |
Автор: Рей 02.03.07, 10:53 |
А как поочередно записать в файл по одному значению из каждого массива |
Автор: SeaGirl 02.03.07, 11:19 |
Так, стоп. Еще раз читаем задание. Массив не нужен, нужен вспомогательный файл. Тогда ты сам себе уже ответил. Цитата Рей @ мне приходила мысль, что вспомогательный файл для того и используется, чтобы переписать например все отрицательные числа, а в данном оставить все положительные . А потом брать по одному элементу по очереди из файлов. Ты можешь например использовать вспомогательный файл, для хранения там, например, только отрицальных чисел. То есть из исходного файла их удалять, а во вспомогательный вписывать. А потом в результирующий файл записывать по одному числу. Дерзай. Ссылки с примерами в теме уже есть. |
Автор: Anykey 02.03.07, 11:26 |
ты об этом??? <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> вы сударь вообще с массивами знакомы? for int i:=0 to nmax do begin writeln(f,chetn[i]); writeln(f,nechetn[i]); end; |
Автор: volvo877 02.03.07, 11:52 |
Два числа типа LongInt - файловые указатели, одно хранит позицию последнего переписанного в файл-результат отрицательного числа, второе - позицию положительного... Дальше - вот в таком духе: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> const n = 10; arr: array[1 .. n] of integer = ( 1, -2, 3, 4, -5, -6, -7, 8, -9, 10 ); var f: file of integer; i, X, next: integer; pos, neg, curr: longint; error: boolean; begin assign(f, 't_i.dat'); rewrite(f); for i := 1 to n do write(f, arr[i]); close(f); reset(f); pos := 0; neg := 0; read(f, X); writeln('value = ', X); repeat if X < 0 then begin repeat inc(pos); error := (pos >= filesize(f)); if error then break; seek(f, pos); read(f, next); until next > 0; end else begin repeat inc(neg); error := (neg >= filesize(f)); if error then break; seek(f, neg); read(f, next); until next < 0; end; if not error then begin writeln('value = ', next:4); X := next; end; until (pos = filesize(f)) or (neg = filesize(f)); writeln; writeln('finished') end. (вместо вывода на экран просто добавляй значения в доп. файл, а потом удалишь исходный файл и переименуешь дополнительный...) |
Автор: Bug Hunter 05.03.07, 16:26 |
Цитата volvo877 @ <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> until (pos = filesize(f)) or (neg = filesize(f)); Можно заменить на: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> until error; |
Автор: Рей 08.03.07, 05:39 |
volvo877, я тут вернулся к этой задаче, ты можешь пояснить, как осуществляется вывод на экран чисел с противоположными знаками? |
Автор: Romtek 08.03.07, 08:19 |
вывод любых чисел на экран осуществляется с помощью процедуры writeln. |
Автор: volvo877 08.03.07, 09:31 |
Потому, что ЭТО и требовалось в задании... Давай, ты будешь задавать вопросы как следует? Вот это - корректная постановка вопроса: "я исправил программу вот так: (...), данные ввел эти: (...), должно получиться вот это: (...), а получается вот что: (...) Почему? Как поправить?" А вот это - не очень: "Почему у меня печатаются числа с противоположными знаками?" А что ты ждал? Что будет имя твое печататься? Или год рождения? |
Автор: Рей 08.03.07, 11:20 |
Хорошо,извиняюсь. Мне просто непонятно,как я понял: первый writeln в тексте программы выводит первое число в множестве. Далее цикл repeat, к примеру первое чило положительное, снова открываем repeat присваиваем pos:=pos+1; указатель seek перемещаем на pos и считываем его в next. пока next не будет отрицательным. Если число отрицательное то снова открываем цикл repeat. вывод чисел на экран writeln(next); моя просьба,собственно,пояснить: не могу понять как происходит чередование положительных и отрицательных чисел? |
Автор: volvo877 08.03.07, 11:32 |
Ударение, как я понял, на слове "чередование"? Смотри: <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> repeat if X < 0 then begin { Если предыдущее число - отрицательное, то теперь ищем положительное... } repeat ... until next > 0; end else begin { Если же предыдущее число было положительным, то теперь ищется отрицательное... } repeat ... until next < 0; end; if not error then begin writeln('value = ', next:4); X := next; { Обновляем: теперь ЭТО - предыдущее число, а следующее будет искаться в зависимости от его знака } end; until (pos = filesize(f)) or (neg = filesize(f)); |
Автор: Рей 15.03.07, 10:48 |
volvo, извини, что надоедаю тебе с этим заданием. Не подскажешь, можно ли изменить эту программу так, чтобы массив не использовался. |
Автор: volvo877 15.03.07, 11:34 |
А он и не используется... Мне просто удобнее было отлаживать программу НЕ внося данные с клавиатуры, а читая их из массива... Теперь можешь его смело удалить, и вместо <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> написать что-нибудь вроде for i := 1 to n do write(f, arr[i]); <{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}> ... Введешь все числа с клавиатуры, и будет тебе БЕЗ массива... Сразу предупреждаю: без файла сделать нельзя !!! for i := 1 to n do begin write('Введите число №', i, ' : '); readln(X) write(f, X); end; |
Автор: Рей 15.03.07, 11:49 |
я правильно понял? получается, что надо записывать в другой файл все отрицательный числа, а в третий все положительные и потом поочередно записывать их в исходный файл и исходный текст программы уже не годится. |
Автор: volvo877 15.03.07, 12:08 |
Блин... Какой другой? Какой третий? Ты программу ВООБЩЕ запускал? Сколько файлов она создает, видел? Больше я ничего пережевывать в третий раз не буду - внеси те изменения, что я показал, и запусти программу... Если (при тех же исходных данных) результат будет другой - тогда продолжишь эту тему... P.S. Кстати, я, например, вообще не понимаю, почему МОЯ программа должна создавать этот самый файл? У тебя по заданию что?Дан - это значит, что он УЖЕ есть, а не создается, и программа должна просто ОТКРЫТЬ его... Вот ТЫ его и создай предварительно, потом прикрепи сюда, и продолжим разговор... |
Автор: Рей 15.03.07, 12:18 |
Не злись, все я уже сообразил. Закрываю тему и больше к ней не возвращаюсь. Спасибо. |