Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.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
Да, я искал но нужного не нашел.:unsure:
Я думаю, надо сначала проверить есть ли файл на диске через 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, извини, что надоедаю тебе с этим заданием. Не подскажешь, можно ли изменить эту программу так, чтобы массив не использовался. :unsure:

Автор: 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
Не злись, все я уже сообразил. Закрываю тему и больше к ней не возвращаюсь. Спасибо.

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)