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


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0391 ]   [ 15 queries used ]   [ Generated: 16.05.21, 05:52 GMT ]