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

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

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

 
Closed Topic Открыть новую тему 
> Задача на работу с файлами., Сортировка файла.
сообщение
Сообщение #1





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

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


Здравствуйте! Помогите, если можете, решить простую (IMHO) задачку на работу с файлом.
Вот условие.
_Ввести с клавиатуры файл действительных чисел.
_Переместить в нём все нули в конец, сохраняя порядок следования остальных компонент.
_ДОПОЛНИТЕЛЬНЫЙ ФАЙЛ ИЛИ МАССИВ НЕ СОЗДАВАТЬ!
_Выдать результирующий файл или сообщение, что это невозможно...
Заранее премного благодарен.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3





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

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


Спасибо. Нет, дело не в том, что я из лени, что ли, не хочу решать, а в том ч, что задачи-то можно решить разными способами...
Я, например, решал (вернее, пробовал) её много др. способом.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Ищущий истину
******

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

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


Ну-ка подробнее.... расскажите как вы ее пробовали решать, мне интересно...


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5





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

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


Вот...
Это всё, что я нарешал...
Код

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: Диск рид еррор!!!
Найдите, пож-та, если не трудно.
З.Ы. Прогу проверял мой препод по информатике. На первый взгляд ничего не сказал. И на второй тоже. Сказал просто: "Сам думай!" (А ведь прав!!!)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Цитата(1nSAnder @ 18.03.05 17:23)
Тут где-то ошибка намбер 100: Диск рид еррор!!!
Найдите, пож-та, если не трудно.

А самому найти? Как мы ее искать будем? Точно так же и попробуйте: F7 - пошаговый прогон. Даст Вам точное местоположение ошибки... Преподаватель информатики совершенно прав: "Сам думай!"
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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;

А в чём загвоздка-то? Вроде всё правильно!
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Гость






Цитата(Guest @ 18.03.05 18:00)
А в чём загвоздка-то? Вроде всё правильно!

Да нет, не все правильно... Тут происходит чтение за концом файла ... А это - ошибка №100... Исправляйте...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






Про чтение понял, а что исправить - недопетрил...
Может намёк потолще мне поможет?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Гость






Код
            for i:=n to fs - 1 do

Что-то типа этого ... smile.gif
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Новичок
*

Группа: Пользователи
Сообщений: 43
Пол: Женский

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


Цитата(volvo @ 18.03.05 23:02)
Код
            for i:=n to fs - 1 do

Что-то типа этого ... smile.gif


volvo, мне показалось или у него переменная i нигде не описана?


--------------------
хороших людей мало... полезных ещё меньше....
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12





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

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


Вот всё, что я надумал и исправил!!!
А прога всё равно не пахает!!!
Исходный код
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.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Гость






Ну и кто из нас учится? Я?
Держи (только прежде чем сказать, что и это НЕ работает, учти, что прога прошла около 200 тестов...)


Прикрепленные файлы
Прикрепленный файл  __INSA.PAS ( 810 байт ) Кол-во скачиваний: 236
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14





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

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


Это , конечно, хорошо, но мне бы хотелось разобраться со своей задачей, т.к. она решена ч-з процедуры, как требует мой преподаватель...
З.Ы. Да, наверное, будете смеяться, но прога всё равно не пахает... Чё за ошибка 116. Может я че недопетрил?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Гость






Вот это извините... Я в ЭТО не верю...
А ошибка 116 - это у Вас среда неправильно настроена...

1-ой строкой в программу добавьте {$N+}
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16





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

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


А не, всё правильно... Вернее почти всё: потребовалось (после рытья в учебнике) заменить все даблы на интежеры. Прога пашет!!! Спасибо!
Но... давайте всё же попробуем разобраться с моей программой...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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.
 К началу страницы 
+ Ответить 

Closed Topic Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 10.05.2024 9:25
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name