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

      Более, того, процедуры read[ln] и val воспринимают и такие числа: '.5', о вот компилятор TP/BP по какой-то причине нет :(
        YaSonka
        Сегодня узнавал у нашего препода насчет этого вопроса. Говорит что это не число которое воспинимает Паскаль(кстати работу засчитала). Но даже если это и число все можно легко исправить убрав строку
        ExpandedWrap disabled
          if (s[i] in p)and(s[i+1] in ost) then b:=false;
        Сообщение отредактировано: Bush3000 -
          Цитата Bush3000 @
          Сегодня узнавал у нашего препода насчет этого вопроса. Говорит что это не число которое воспинимает Паскаль

          Ну, если преподаватель сказала, то тогда конечно! :D

          А это ничего, что Турбо Паскаль вот такую строчку:
          ExpandedWrap disabled
            const test = 5.;

          спокойно воспринимает? ;)

          Цитата Bush3000 @
          (кстати работу засчитала)

          И это при том, что программа твоя воспринимает как правильное такое число: "1e". И вот такое: "1e-". И даже вот такое: "-e". :D

          Впрочем, с учетом предыдущего абзаца это не удивительно. ;)
            Bug Hunter
            Подумаешь. Всего лишь и надо добавить проверку принадлежности последнего символа к множествам ost, p и z и если принадлежит то b присвоить значение false. В конце концов я только учусь программированию.
              Так кто нить может показать финальную прогу?
                Вряд ли такая прога вообще может существовать, т.к. исходная постановка задачи, IMHO, трижды некорректна.

                Напомню:
                Цитата Bush3000 @
                Програма вводит строку символов и проверяет может ли эта строка быть записью числа в языке Паскаль.
                (Подразумевается, что вывод нужно сделать, анализируя строку, а не переводя число из символьного представления в двоичное)

                Во-первых, Паскалей много, хороших и разных, и понятия допустимого символьного представления числа в них могут несколько отличаться;
                Во-вторых, даже если ограничиться Турбо Паскалем, то, как отмечалось выше, он придерживается то ли дуализма мнений, то ли политики двойных стандартов по отношению к незначащим нулям перед и после десятичной точки;
                В-третьих, Турбо Паскаль считает такую вот запись 1.1e4932 допустимым числом, а 1.1e4933 и 1.2e4932 - уже нет. Различить эти записи, анализируя строку, конечно, можно, если сильно запариться, но уж точно нафиг не нужно.

                2ALL: Но потанцевать таки можно!

                Если поставить задачу так:
                ExpandedWrap disabled
                  Написать программу, которая вводит строку и проверяет, является ли она записью
                  числа вида:
                    [+|-]ddd[.ddd][E|e[+|-]ddd]
                  где число десятичных цифр в мантисе и порядке может быть любым (лишь бы, для
                  простоты, сама запись в обычную строку string влезало)

                Я это к тому что в этой задаче есть заковыка, реальный способ преодоления которой никто таки не предложил, да и я сам нашел решение только со второй попытки. И не уверен, что оно самое эффективное (предполагается, что задача решается через множества типа set of char в качестве упражнения). Так что есть повод пободаться!

                А еще можно немного усложнить(?) задачу, потребовав, чтобы решение не использовало по крайней мере "больших" множест типа set of char|byte и их подмножеств (решения, использующие эмуляцию множеств через булев массив или битовые карты длинной больше чем одно слово тоже не принимаются) - это уже действительно неплохой этюд может получиться.

                Ну, что, будем бодаться?

                За себя: Battle!!! (Х/ф "Майкл)
                Сообщение отредактировано: Bug Hunter -
                  Вот что у меня получилось:

                  ExpandedWrap disabled
                      program alexpr2;
                      type
                        t = set of char;
                      var
                        s: string;
                        i, s1, s2, posl : integer;
                        fl : integer;
                        n, z, ost, all, p : t;
                     
                      begin
                     
                       begin
                        repeat
                         writeln(' Vvedite text, zakanch. "!"');
                         write(' s = ');
                         readln(s);
                         if ( s[length(s)]<>'!' ) then
                            writeln(' !!  Oshibka vvoda  !!')
                        until s[length(s)]='!'
                       end;
                     
                       posl:=length(s)-1;
                       fl:=0;
                       n:=['0'..'9'];
                       z:=['+','-'];
                       ost:=['e','E'];
                       p:=['.'];
                       all:=['0'..'9','+','-','.','e','E'];
                     
                       if (s[1] in p+ost) or (s[posl] in p+ost+z) then fl:=1;
                     
                       s1:=0;
                       s2:=0;
                       i:=1;
                     
                       while ( i<=posl ) and (fl=0) do
                        begin
                          if not(s[i] in all) then fl:=1;
                            begin
                             if (s[i] in n) and (s[i+1] in z) then fl:=1;
                             if (s[i] in p) and (s[i+1] in z) then fl:=1;
                             if (s[i] in ost) and (s[i+1] in p) then fl:=1;
                             if (s[i] in p) and (s[i+1] in p) then fl:=1;
                             if (s[i] in z) and (s[i+1] in z) then fl:=1;
                             if s[i] in p then s1:=s1+1;
                             if s[i] in ost then s2:=s2+1;
                             if s1>1 then fl:=1;
                             if s2>1 then fl:=1;
                            end;
                       inc(i);
                        end;
                       if s1+s2=0 then fl:=1;
                       if fl=0 then writeln(' !! Ok !!') else writeln(' !! Error !!');
                       readln
                      end.

                  Условие задачи следующее: определить, является ли введенный текст, заканч. "!" правильной записью вещественного числа (либо в форме с фиксированной точкой, либо в форме с плавающей точкой).
                  Задачу приняли, проверял на косяки - вроде всё норм.

                  Про теги не забывай...
                  Сообщение отредактировано: volvo877 -
                    Цитата Bug Hunter @
                    Если поставить задачу так:
                    ExpandedWrap disabled
                      Написать программу, которая вводит строку и проверяет, является ли она записью
                      числа вида:
                        [+|-]ddd[.ddd][E|e[+|-]ddd]
                      где число десятичных цифр в мантисе и поряде может быть любым (лишь бы, для
                      простоты, сама запись в обычную строку string влезало)

                    Я на всякий случай уточню, для тех, кто не сразу просек, что данная спецификация предполагает, что перед и после десятичной точки (если она есть) обязательно должно быть хотя бы по одной цифре (хотя бы незначащие нули) и мантиса не может быть пустой или состоять из одного знака (иначе как понять, "-E10" - это число или имя переменной с унарным минусом). Хотя желающие принять участие в соревновании могут написать дополнительно вариант, который распознает и записи числа вида ".5", "5.", ".5E10", "5.E10" и т.п. (число ".", я думаю, надо запретить).

                    Цитата AlexPR @
                    Вот что у меня получилось:
                    ExpandedWrap disabled
                        ...

                    Условие задачи следующее: определить, является ли введенный текст, заканч. "!", правильной записью вещественного числа ...

                    Не вдаваясь особо в подробности, сразу скажу, что это решение несколько другой, весьма искусственной задачи.

                    Is there no one else? (Что, больше никого? (англ.)) (Х/ф "Троя")
                    Сообщение отредактировано: Bug Hunter -
                      Цитата AlexPR @
                      Задачу приняли, проверял на косяки - вроде всё норм.

                      Плохо проверял:
                      ExpandedWrap disabled
                         Vvedite text, zakanch. "!"
                         s = 123e4.5!
                         !! Ok !!

                      :D
                        Гек-тор! Гек-тор!!! (Х/ф "Троя")
                          Bug Hunter, давай не будем поднимать темы, которые никому не интересны? <_< Было бы интересно - ответили б уже... Что, обязательно закрывать, чтоб не флудили?
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0439 ]   [ 16 queries used ]   [ Generated: 22.06.21, 21:21 GMT ]