На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Название темы должно быть информативным !
Прежде чем задать вопрос, воспользуйтесь Поиском. и проверьте в FAQ (ЧАВО) Паскаля
Чтобы получить вразумительный ответ, подробно опишите проблему: что надо сделать, что не получается и номер ошибки (если есть), которую выводит компилятор.
Для вставки кода ваших программ используйте, пожалуйста, кнопку СODE=pas или выпадающий список СODE для других языков (подсветка синтаксиса).
[!] Как правильно задавать вопросы | Руководство по языку B.Pascal 7 & Objects/LR | Borland Pascal. Руководство пользователя
Модераторы: volvo877
  
> Типизированные файлы
    Помогите пожалуйста: Дан файл целых чисел, неравных нулю. число положительных = числу отрицательных. Используя вспомогательный файл, создать новый файл, чтобы не было двух соседних чисел с одним знаком. :'( Задача на паскале.

    Добавлено
    Я просто не очень понимаю типизированные файлы :(
      Работа с файлами (сообщение #299329)
      Да и вобще про работу с файлами почитать полезно Работа с файлами
        Ты по ссылкам ходил? Или ждешь, что тебе тут на блюдечке выложат готовое решение?

        Тогда тебе в раздел "Работа", здесь помогают, но только тогда, когда ты сам ЧТО-ТО делаешь...
          Да, я искал но нужного не нашел.:unsure:
          Я думаю, надо сначала проверить есть ли файл на диске через IO rezult; если он есть на диске то работать с ним, если не имеется, то создать файл.
          Проверку на количество вводимых положительных и отрицательных чисел я сделал
          ExpandedWrap disabled
            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

          я думаю, что без массива здесь не обойтись.
          мне приходила мысль, что вспомогательный файл для того и используется, чтобы переписать например все отрицательные числа, а в данном оставить все положительные . А потом брать по одному элементу по очереди из файлов. Но тогда вопорс: ведь в задании не указано, какое число должно быть первым: положительное или отрицательное.
            Цитата Рей @
            Проверку на количество вводимых положительных и отрицательных чисел я сделал

            Вобще-то не сделал. Насколько я поняла есть уже готовый типизированный файл с целыми числами, и надо проверить действительно ли там все правильно. А ты проверил просто вводимые с клавитауры значения.
              Просто я подумал, что надо вводить с клавиатуры числа и потом проверять их. Я не могу понять, как организовать запись в новый файл чисел так , чтобы положительные числа чередовались с отрицательными.
                Цитата Рей @
                Просто я подумал, что надо вводить с клавиатуры числа и потом проверять их

                У тебя же в задании написано русским языком
                Цитата Рей @
                Дан файл целых чисел


                Цитата Рей @
                Я не могу понять, как организовать запись в новый файл чисел так , чтобы положительные числа чередовались с отрицательными.

                Запиши положительные и отрицательные числа в два массива и поочередно записывай в файл под одному значению из каждого.
                  А как поочередно записать в файл по одному значению из каждого массива
                  Сообщение отредактировано: Рей -
                    Так, стоп. Еще раз читаем задание. Массив не нужен, нужен вспомогательный файл.
                    Тогда ты сам себе уже ответил.
                    Цитата Рей @
                    мне приходила мысль, что вспомогательный файл для того и используется, чтобы переписать например все отрицательные числа, а в данном оставить все положительные . А потом брать по одному элементу по очереди из файлов.

                    Ты можешь например использовать вспомогательный файл, для хранения там, например, только отрицальных чисел. То есть из исходного файла их удалять, а во вспомогательный вписывать. А потом в результирующий файл записывать по одному числу.
                    Дерзай. Ссылки с примерами в теме уже есть.
                      ты об этом???
                      ExpandedWrap disabled
                        for int i:=0 to nmax do begin
                           writeln(f,chetn[i]);
                           writeln(f,nechetn[i]);
                        end;
                      вы сударь вообще с массивами знакомы?
                        Цитата Рей @
                        создать новый файл, чтобы не было двух соседних чисел с одним знаком.

                        Два числа типа LongInt - файловые указатели, одно хранит позицию последнего переписанного в файл-результат отрицательного числа, второе - позицию положительного...

                        Дальше - вот в таком духе:

                        ExpandedWrap disabled
                          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.

                        (вместо вывода на экран просто добавляй значения в доп. файл, а потом удалишь исходный файл и переименуешь дополнительный...)
                          Цитата volvo877 @
                          ExpandedWrap disabled
                              until (pos = filesize(f)) or (neg = filesize(f));

                          Можно заменить на:
                          ExpandedWrap disabled
                              until error;

                          ;)
                            volvo877, я тут вернулся к этой задаче, ты можешь пояснить, как осуществляется вывод на экран чисел с противоположными знаками?
                              Цитата Рей @
                              как осуществляется вывод на экран чисел с противоположными знаками?

                              вывод любых чисел на экран осуществляется с помощью процедуры writeln.
                                Цитата Рей @
                                непонятно почему выводятся поочереди числа с противоположными знаками

                                Потому, что ЭТО и требовалось в задании... Давай, ты будешь задавать вопросы как следует?

                                Вот это - корректная постановка вопроса: "я исправил программу вот так: (...), данные ввел эти: (...), должно получиться вот это: (...), а получается вот что: (...) Почему? Как поправить?"

                                А вот это - не очень: "Почему у меня печатаются числа с противоположными знаками?" А что ты ждал? Что будет имя твое печататься? Или год рождения?
                                  Хорошо,извиняюсь. Мне просто непонятно,как я понял: первый writeln в тексте программы выводит первое число в множестве. Далее цикл repeat, к примеру первое чило положительное, снова открываем repeat присваиваем pos:=pos+1; указатель seek перемещаем на pos и считываем его в next. пока next не будет отрицательным. Если число отрицательное то снова открываем цикл repeat.
                                  вывод чисел на экран writeln(next); моя просьба,собственно,пояснить: не могу понять как происходит чередование положительных и отрицательных чисел?
                                  Сообщение отредактировано: Рей -
                                    Цитата Рей @
                                    не могу понять как происходит чередование положительных и отрицательных чисел?

                                    Ударение, как я понял, на слове "чередование"? :)

                                    Смотри:
                                    ExpandedWrap disabled
                                        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));
                                      volvo, извини, что надоедаю тебе с этим заданием. Не подскажешь, можно ли изменить эту программу так, чтобы массив не использовался. :unsure:
                                      Сообщение отредактировано: Рей -
                                        Цитата Рей @
                                        можно ли изменить эту программу так, чтобы массив не использовался.

                                        А он и не используется... Мне просто удобнее было отлаживать программу НЕ внося данные с клавиатуры, а читая их из массива... Теперь можешь его смело удалить, и вместо
                                        ExpandedWrap disabled
                                            for i := 1 to n do write(f, arr[i]);
                                        написать что-нибудь вроде
                                        ExpandedWrap disabled
                                            for i := 1 to n do begin
                                              write('Введите число №', i, ' : '); readln(X)
                                              write(f, X);
                                            end;
                                        ... Введешь все числа с клавиатуры, и будет тебе БЕЗ массива... Сразу предупреждаю: без файла сделать нельзя !!!
                                          я правильно понял? получается, что надо записывать в другой файл все отрицательный числа, а в третий все положительные и потом поочередно записывать их в исходный файл и исходный текст программы уже не годится.
                                            Блин... <_< Какой другой? Какой третий? Ты программу ВООБЩЕ запускал? Сколько файлов она создает, видел?

                                            Больше я ничего пережевывать в третий раз не буду - внеси те изменения, что я показал, и запусти программу... Если (при тех же исходных данных) результат будет другой - тогда продолжишь эту тему...

                                            P.S. Кстати, я, например, вообще не понимаю, почему МОЯ программа должна создавать этот самый файл? У тебя по заданию что?
                                            Цитата Рей @
                                            Дан файл целых чисел, неравных нулю. число положительных = числу отрицательных.
                                            Дан - это значит, что он УЖЕ есть, а не создается, и программа должна просто ОТКРЫТЬ его... Вот ТЫ его и создай предварительно, потом прикрепи сюда, и продолжим разговор...
                                              Не злись, все я уже сообразил. Закрываю тему и больше к ней не возвращаюсь. Спасибо.
                                              Сообщение отредактировано: Рей -
                                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                              0 пользователей:


                                              Рейтинг@Mail.ru
                                              [ Script execution time: 0,0887 ]   [ 15 queries used ]   [ Generated: 13.12.24, 00:06 GMT ]