На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Название темы должно быть информативным !
Прежде чем задать вопрос, воспользуйтесь Поиском. и проверьте в FAQ (ЧАВО) Паскаля
Чтобы получить вразумительный ответ, подробно опишите проблему: что надо сделать, что не получается и номер ошибки (если есть), которую выводит компилятор.
Для вставки кода ваших программ используйте, пожалуйста, кнопку СODE=pas или выпадающий список СODE для других языков (подсветка синтаксиса).
[!] Как правильно задавать вопросы | Руководство по языку B.Pascal 7 & Objects/LR | Borland Pascal. Руководство пользователя
Модераторы: volvo877
  
> помогите с множественным типом данных
    Помогите мне. Очень прошу. Надо написать прогу на Турбопаскале. Условие такое: Програма вводит строку символов и проверяет может ли эта строка быть записью числа в языке Паскаль. Следует учесть что числами являются -6.54Е-2 или 12Е5. Это связано с темой множественного типа данных поэтому надо его использовать.
        KiRiK
        да теорию я знаю. пытался да же что то сделать но окончательно запутался в условных операторах. Очень их там много.
          ExpandedWrap disabled
            Type
              RealDigits = set of char;
             
            Const
              Digits: RealDigits  = ['0','1','2','3','4','5','6','7','8','9','.','E','e','-'];
            Var
              S:String;
              i:integer;
              flag: boolean;
            begin
              Readln(s);
              flag:=true;
              for i:=1 to Length(s) do
                if not(s[i] in Digits) then
                  begin
                    flag:=false;
                    break;
                  end;
               if flag then
                 WriteLn('Ok!')
               else
                 WriteLn('Error!');
              readln;
            end.
            YaSonka, надо бы еще проверять на повторное вхождение букв 'e' и 'E', т.е. после первого обнаружения одной из них в строке изымать обе из множества, иначе строка '1.2EE-2' будет распознаваться как число...

            Да и точка может быть только одна, так что с ней то же самое.
              volvo877
              То же самое и с минусом. Также нужно добавить в множество +. Ибо такая запись - 123E+12 вполне возможна.
                С минусом нельзя... :no:
                -1.2E-6 вполне себе нормальная запись...
                  volvo877
                  Не-а, я имел ввиду 123e--2
                    volvo877
                    А я и не думала даже. :unsure:
                    Не сообразила. :whistle:
                    Наверное, Bush3000 доделает сам.
                      YaSonka
                      Точно. И так очень сильно помогли. Огромное вам всем спасибо.
                      UPD: кстати кому интересно вот мое решение этой задачи
                      ExpandedWrap disabled
                        Type
                          T = set of char;
                        Var
                          S:String;
                          i,j,s1,s2:integer;
                          b: boolean;
                          N,Z,Ost,all,P:t;
                        begin
                          write('s=');
                          Readln(s);
                          b:=true;
                          N:=['0'..'9'];
                          Z:=['+','-'];
                          Ost:=['e','E'];
                          P:=['.'];
                          All:=['0'..'9','+','-','.','e','E'];
                          s1:=0;
                          s2:=0;
                          if (s[1] in p)or(s[1] in ost) then b:=false;
                           for i:=1 to Length(s) do
                            begin
                             if not(s[i] in All) then  b:=false;
                             if (s[i] in n)and(s[i+1] in z) then b:=false;
                             if (s[i] in p)and(s[i+1] in z) then b:=false;
                             if (s[i] in p)and(s[i+1] in ost) then b:=false;
                             if (s[i] in ost)and(s[i+1] in p) then b:=false;
                             if (s[i] in z)and(s[i+1] in z) then b:=false;
                             if s[i] in p then s1:=s1+1;
                             if s[i] in ost then s2:=s2+1
                            end;
                         if s1>1 then b:=false;
                         if s2>1 then b:=false;
                         if b then writeln('ok') else writeln('Error!');
                         readln
                        end.
                      Сообщение отредактировано: Bush3000 -
                        Bush3000
                        На такой строке 123.е-1 (123.е+1) выдает ошибку.
                        Сообщение отредактировано: YaSonka -
                          кусок спецификации паскаля по числам в прикрепленном файле... я в свое время по ней писал синтаксический анализатор... все работало...
                          просто начинаешь с самого большого куска и процедурами детализируешь разбор.
                          Сообщение отредактировано: Anykey -

                          Прикреплённый файлПрикреплённый файл1.rar (3.51 Кбайт, скачиваний: 82)
                            YaSonka
                            Не знаю, попробовал - все нормально работает. Как и положенно выдает что не является числом.
                            Кстати надо еще добавить проверку последнего символоа чтоб он не был точкой или Е., а также смотреть на взаимное расположение точки и Е а то запись типа 123Е-4.4 будет рассматриваться как число.
                            Сообщение отредактировано: Bush3000 -
                              Bush3000
                              Pascal эти числа (123.е-1 (123.е+1) воспринимает как корректные.
                                YaSonka
                                Подожди. То есть ты хочешь сказать что такие числа должны распозноваться как правильные или прога распознает их как правильные?
                                  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,0692 ]   [ 16 queries used ]   [ Generated: 19.06.21, 15:22 GMT ]