![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
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 825 Пол: Мужской Реальное имя: Олег Репутация: ![]() ![]() ![]() |
Ну-ка подробнее.... расскажите как вы ее пробовали решать, мне интересно...
-------------------- Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С) |
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. |
![]() ![]() |
![]() |
Текстовая версия | 22.04.2025 20:10 |