![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
1nSAnder |
![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 8 Пол: Мужской Репутация: ![]() ![]() ![]() |
Здравствуйте! Помогите, если можете, решить простую (IMHO) задачку на работу с файлом.
Вот условие. _Ввести с клавиатуры файл действительных чисел. _Переместить в нём все нули в конец, сохраняя порядок следования остальных компонент. _ДОПОЛНИТЕЛЬНЫЙ ФАЙЛ ИЛИ МАССИВ НЕ СОЗДАВАТЬ! _Выдать результирующий файл или сообщение, что это невозможно... Заранее премного благодарен. |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата(1nSAnder @ 3.03.05 17:32) Помогите, если можете, решить простую (IMHO) задачку на работу с файлом. Ну если она простая, чего же сами не решаете? В принципе, ничего сложного. Просто читаем данные из файла последовательно, и храним индексы для чтения следующего элемента и для записи следующего элемента... Перезаписываем, естественно, только ненулевые элементы. Остаток файла забиваем нулями. Примерно вот так: Код const n = 10; var f: file of double; var i: integer; x: double; f_read, f_write: longint; begin assign(f, 'test.ttt'); rewrite(f); for i := 1 to n do begin write('x(', i, ') = '); readln(x); write(f, x) end; reset(f); { устанавливаем начальные значения указателей } while { есть что читать } do begin { прочитать следующий элемент в X и передвинуть указатель для чтения } if x <> 0 then { записать X в файл и передвинуть указатель для записи } end; { до конца файла перезаписать компоненты нулями } WriteLn('Проверка:'); reset(f); while not eof(f) do begin read(f, x); writeln(x:8:4) end; close(f) end. |
1nSAnder |
![]()
Сообщение
#3
|
Группа: Пользователи Сообщений: 8 Пол: Мужской Репутация: ![]() ![]() ![]() |
Спасибо. Нет, дело не в том, что я из лени, что ли, не хочу решать, а в том ч, что задачи-то можно решить разными способами...
Я, например, решал (вернее, пробовал) её много др. способом. |
Altair |
![]()
Сообщение
#4
|
![]() Ищущий истину ![]() ![]() ![]() ![]() ![]() ![]() Группа: Модераторы Сообщений: 4 824 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
Ну-ка подробнее.... расскажите как вы ее пробовали решать, мне интересно...
-------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
1nSAnder |
![]()
Сообщение
#5
|
Группа: Пользователи Сообщений: 8 Пол: Мужской Репутация: ![]() ![]() ![]() |
Вот...
Это всё, что я нарешал... Код Program P2_3_FILE; Type tf= file of integer; Var f: tf; siz:longint; {Ввод файла=================================================} Procedure InputF (var ff:tf); Var x:integer; Begin writeln ('Создание файла. Конец файла = 777'); rewrite (ff); write ('Ввод компоненты '); readln (x); while x<>777 do begin write (ff,x); write ('Ввод компоненты '); readln (x) end; close (ff); End; {Вывод файла================================================} Procedure OutputF (var ff:tf); Var x: integer; Begin writeln ('Вывод файла '); reset (ff); while not eof (ff) do begin read (ff,x); write (x, ' ') end; writeln; close (ff); writeln ('Вывод закончен'); End; {Удаление нулей=============================================} Procedure DelOf0 (var ff:tf); Var x,y: integer; n: byte; fs: longint; Begin reset (ff); fs:= filesize (ff); while not eof (ff) do begin read (ff,x); if x=0 then begin n:= filepos (ff)-1; for i:=n to fs do begin seek (ff,i); read (ff,x); seek (ff, i-1); write (ff,x) end end end; close (ff) End; {Добавление нулей===========================================} Procedure Add0 (var ff:tf; var fs:longint; q: integer); Begin reset (ff); seek (ff, filesize (ff)); while filesize (ff)<=fs do begin write (ff,q) end; close (ff) End; {Основная программа=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=} BEGIN Assign (f, 'fx.d'); InputF (f); OutputF (f); DelOf0 (f); Add0 (f,siz,0); OutputF (f) END. Тут где-то ошибка намбер 100: Диск рид еррор!!! Найдите, пож-та, если не трудно. З.Ы. Прогу проверял мой препод по информатике. На первый взгляд ничего не сказал. И на второй тоже. Сказал просто: "Сам думай!" (А ведь прав!!!) |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Цитата(1nSAnder @ 18.03.05 17:23) Тут где-то ошибка намбер 100: Диск рид еррор!!! Найдите, пож-та, если не трудно. А самому найти? Как мы ее искать будем? Точно так же и попробуйте: F7 - пошаговый прогон. Даст Вам точное местоположение ошибки... Преподаватель информатики совершенно прав: "Сам думай!" |
Guest |
![]()
Сообщение
#7
|
Гость ![]() |
Ну, узазал мне TP на строчку:
Код {Удаление нулей=============================================} Procedure DelOf0 (var ff:tf); Var x,y: integer; n: byte; fs: longint; Begin reset (ff); fs:= filesize (ff); while not eof (ff) do begin read (ff,x); if x=0 then begin n:= filepos (ff)-1; for i:=n to fs do begin seek (ff,i); read (ff,x); { *** Здесь *** } seek (ff, i-1); write (ff,x) end end end; close (ff) End; А в чём загвоздка-то? Вроде всё правильно! |
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
Цитата(Guest @ 18.03.05 18:00) А в чём загвоздка-то? Вроде всё правильно! Да нет, не все правильно... Тут происходит чтение за концом файла ... А это - ошибка №100... Исправляйте... |
Guest |
![]()
Сообщение
#9
|
Гость ![]() |
Про чтение понял, а что исправить - недопетрил...
Может намёк потолще мне поможет? |
volvo |
![]()
Сообщение
#10
|
Гость ![]() |
Код for i:=n to fs - 1 do Что-то типа этого ... ![]() |
Людмила |
![]()
Сообщение
#11
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 43 Пол: Женский Репутация: ![]() ![]() ![]() |
Цитата(volvo @ 18.03.05 23:02) Код for i:=n to fs - 1 do Что-то типа этого ... ![]() volvo, мне показалось или у него переменная i нигде не описана? -------------------- хороших людей мало... полезных ещё меньше....
|
1nSAnder |
![]()
Сообщение
#12
|
Группа: Пользователи Сообщений: 8 Пол: Мужской Репутация: ![]() ![]() ![]() |
Вот всё, что я надумал и исправил!!!
А прога всё равно не пахает!!! Исходный код Program P2_3_FILE; Type tf= file of integer; Var f: tf; siz:longint; {Ввод файла=================================================} Procedure InputF (var ff:tf); Var x:integer; Begin writeln ('Создание файла. Конец файла = 777'); rewrite (ff); write ('Ввод компоненты '); readln (x); while x<>777 do begin write (ff,x); write ('Ввод компоненты '); readln (x) end; close (ff); End; {Вывод файла================================================} Procedure OutputF (var ff:tf); Var x: integer; Begin writeln ('Вывод файла '); reset (ff); while not eof (ff) do begin read (ff,x); write (x, ' ') end; writeln; close (ff); writeln ('Вывод закончен'); End; {Удаление нулей=============================================} Procedure DelOf0 (var ff:tf); Var x,y: integer; n,i: byte; fs: longint; Begin reset (ff); fs:= filesize (ff); while not eof (ff) do begin read (ff,x); if x=0 then begin n:= filepos (ff)-1; for i:=n to fs-1 do begin seek (ff,i); read (ff,x); seek (ff,i-1); write (ff,x) end end; seek (ff,fs-1); truncate (ff) end; close (ff) End; {Добавление нулей===========================================} Procedure Add0 (var ff:tf; var fs:longint; q: integer); Begin reset (ff); seek (ff, filesize (ff)); while filesize (ff)<=fs do begin write (ff,q) end; close (ff) End; {Основная программа=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=} BEGIN Assign (f, 'fx.d'); InputF (f); OutputF (f); DelOf0 (f); Add0 (f,siz,0); OutputF (f) END. |
volvo |
![]()
Сообщение
#13
|
Гость ![]() |
Ну и кто из нас учится? Я?
Держи (только прежде чем сказать, что и это НЕ работает, учти, что прога прошла около 200 тестов...) Прикрепленные файлы ![]() |
1nSAnder |
![]()
Сообщение
#14
|
Группа: Пользователи Сообщений: 8 Пол: Мужской Репутация: ![]() ![]() ![]() |
Это , конечно, хорошо, но мне бы хотелось разобраться со своей задачей, т.к. она решена ч-з процедуры, как требует мой преподаватель...
З.Ы. Да, наверное, будете смеяться, но прога всё равно не пахает... Чё за ошибка 116. Может я че недопетрил? |
volvo |
![]()
Сообщение
#15
|
Гость ![]() |
Вот это извините... Я в ЭТО не верю...
А ошибка 116 - это у Вас среда неправильно настроена... 1-ой строкой в программу добавьте {$N+} |
1nSAnder |
![]()
Сообщение
#16
|
Группа: Пользователи Сообщений: 8 Пол: Мужской Репутация: ![]() ![]() ![]() |
А не, всё правильно... Вернее почти всё: потребовалось (после рытья в учебнике) заменить все даблы на интежеры. Прога пашет!!! Спасибо!
Но... давайте всё же попробуем разобраться с моей программой... |
volvo |
![]()
Сообщение
#17
|
Гость ![]() |
Нет... С вашей программой (с такими знаниями - "заменить Double на Integer", Вы условие-то свое сами читали???) Вы будете разбираться сами...
Это все, что я могу предложить (она тоже работает с процедурами): Исходный код const n = 10; type freal = file of real; var f: freal; var i: integer; x: real; f_read, f_write: longint; procedure read_file(var f: freal); begin rewrite(f); for i := 1 to n do begin write('x(', i, ') = '); readln(x); write(f, x) end; close(f) end; procedure move_zeroes(var f: freal); begin reset(f); f_write := 0; f_read := 0; while f_read <> filesize(f) do begin seek(f, f_read); read(f, x); f_read := filepos(f); if x <> 0 then begin seek(f, f_write); write(f, x); f_write := filepos(f); end; end; seek(f, f_write); x := 0; for i := 1 to filesize(f) - f_write do write(f, x); close(f) end; procedure out_f(var f: freal); begin reset(f); while not eof(f) do begin read(f, x); writeln(x:8:4) end; close(f) end; begin assign(f, 'test.ttt'); read_file(f); writeln('before:'); out_f(f); move_zeroes(f); writeln('after:'); out_f(f) end. |
![]() ![]() |
![]() |
Текстовая версия | 20.07.2025 12:51 |