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

    Добавлено
    Я просто не очень понимаю типизированные файлы :(
      Работа с файлами (сообщение #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.
                                Цитата Рей @
                                непонятно почему выводятся поочереди числа с противоположными знаками

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

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

                                А вот это - не очень: "Почему у меня печатаются числа с противоположными знаками?" А что ты ждал? Что будет имя твое печататься? Или год рождения?
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,1345 ]   [ 15 queries used ]   [ Generated: 12.12.24, 23:55 GMT ]