e-olymp 5041. Синтаксический анализ вещественных чисел

Задача

Напишите программу, которая считывает строку и проверяет, содержит ли она действительное число. Действительное число может содержать десятичную точку или показатель степени (начинающийся с $ e $ или $ E $), или и то и то одновременно. Также число может содержать обыкновенный набор десятичных цифр. Если число содержит десятичную точку, то должна присутствовать хотя бы одна цифра с каждой стороны точки. Перед числом или экспонентой может находиться плюс или минус (или одновременно и там и там) (без пробелов после знака). Экспонентой является целое число (не содержит десятичной запятой). Пробелы могут присутствовать до или после числа, но не внутри него. Обратите внимание, что границ диапазона входных чисел не существует, но для простоты будем предполагать, что входные строки содержат не более $ 1000 $ символов.

Входные данные

Первая строка содержит количество тестов $ t $. Дальше следует $ t $ строк, каждая из которых содержит одно число.

Выходные данные

Вывести $ t $ строк, каждая из которых содержит слово $ LEGAL $ или $ ILLEGAL $.

Тесты

Входные данные Выходные данные
1. 2
1.5e+2
3.
LEGAL
ILLEGAL
2. 4
752.45e+24
0.762e.
-0.355.6432e
LEGAL
ILLEGAL
ILLEGAL
3. 1
-652.32e+45
LEGAL
4. 3
542.512e+3
123.456E+42
123.456.789
LEGAL
LEGAL
ILLEGAL

Код

Решение

Для решения задачи нам понадобится функция idigit() проверки того, является ли символ цифрой. В STL существует одноименная функция, которая выполняет ту же самую задачу, однако для практики, я написал свою. В функции анализа вещественных чисел isreal() нужно указать условия, при которых синтаксис будет нарушен. Т.е. не будут выполнены условия, описанные в задаче. Затем, если в символьном массиве не было замечено ошибок — возвратить trueв основную функцию. Важно то, что в числе не должно по условию быть других символов кроме «e», «E», «.», «+», «-» и цифр. Что касается окаймляющих пробелов, то при вводе строки через cin они игнорируются.

Ссылки

Условие задачи на e-olymp
Код программы на ideone.com
Засчитанное решение на e-olymp

14 thoughts on “e-olymp 5041. Синтаксический анализ вещественных чисел

  1. Здравствуйте.
    1. Так как isdigit(), isnum() и isreal() это функции, которые принимают аргументы, то в описании кода вам следует поставит скобки.
    2. Испольуйте LaTex и для цифр.

  2. Здравствуйте.
    1. Так как isdigit(), isnum() и isreal() это функции, которые принимают аргументы, то в описании кода вам следует поставить скобки.
    2. Используйте LaTex и для цифр.

    • Сделайте правильные отступы.
    • Даже не пытайтесь пересказать в объяснении всё условие одним предложением. Это не только бесполезно, но и ненужно.
    • Функция isdigit() проверяет, является ли символ десятичной цифрой. Называть её isnum() неправильно. Поскольку число и цифра разные вещи. Хотите сделать свою функцию — пожалуйста. Но в чем смысл менять название?
    • Поставьте, пожалуйста, пробел перед открывающей скобкой в тексте своей биографии.
    • «проверки на то» — лучше убрать «на то».
    • Благодарю, также исправил все недочеты.

    • Молодец. Теперь можно смотреть код.

      • Оказалось, что приведенный в Вашей работе код отличается от того, что прошел тесты. А ссылка на ideoe показывает третий вариант, отличный от двух предыдущих. Исправьте, пожалуйста.
      • «Счетчик идет пока не встретит…» Счетчики — это те, кто что-то считает (например гласные буквы). Вы сдвигаете указатель.
      • И сделайте название по общему шаблону.
      • Вы что-то запутанное накрутили в определении цифры. Почему не написать просто return (x >= '0' && x <= '9'? 1: 0);?
      • Здесь и в других подобных местах нужно оставить только один условный оператор, объединив условия:

      • Много важных моментов осталось без объяснения. Например, куда девались окаймляющие пробелы о которых пишут в условии? Или что делает эта проверка: return *x == 0;. Такие места лучше сопроводить комментарием.
      • И наоборот. Вы подробно объясняете в комментариях «Заводим массив над главной функцией, чтобы заполнить нулями», хотя никакие нули в массиве Вам не понадобятся. Можно спокойно описать и внутри функции.
      • Да, я говорил, что можно и даже полезно заключать в фигурные скобки даже единственный оператор. Однако в Вашем случае это увеличило размер кода в два раза. Я бы перед тем как публиковать уже работающий код вычистил его для большей компактности и удобства чтения.
      • Комментарии, которые вставляются после // в конце строки не являются полноценными предложениями. Там не нужны большие буквы и точки. Это лучше использовать в многострочных комментариях /* ... */.
    • Спасибо, учел ваши правки и постарался улучшить текст руководствуясь ими, надеюсь сейчас текст приемлем.

    • Функция возвращает логическое значение, а вы пишите «возвращает 1 или 0 в зависимости от того, закончилось ли число». Давайте оставим три последних слова?
    • В русском, украинском и других естественных языках есть определенные правила использования пробела. Для таких знаков препинания как точка, запятая, точка с запятой, двоеточие, восклицательный знак в вопросительный знак пробел ставят после знака а не перед ним. Это предотвращает автоматический перенос этих знаков на другую строку. Если разделительный знак можно и переносить, и оставлять на предыдущей строке, пробелы делают с обеих сторон. Например — тире. А вот кавычки и различные скобки нельзя отрывать от текста, находящегося в них. Поэтому пробел ставят перед открытием, и после закрытия. Исправите, пожалуйста, текст в соответствии с этими правилами. Примечание: Насколько я знаю, только во французском языке перед знаком вопроса принято ставить пробел. Но это неразрывный пробел — перенос по нему невозможен. Ну, французы они такие. Если остались вопросы, изучите эту статью.
    • Здесь и в других подобных местах нужно оставить только один условный оператор, объединив условия:
    • Вы пишите «Важно то, что в функции не может по задаче быть других букв». Каких других букв? В какой функции?
  3. Я понял, что за один раз у нас не получится всему научиться по оформлению. Но научиться нужно обязательно — Вам еще писать курсовые и дипломные работы. Я переделал пояснение и удалил оценочные суждения, внес небольшие исправления в код. Посмотрите, пожалуйста, различия от предыдущей версии.
    Учиться дальше будем на задаче 8185.

    • Спасибо большое, как говорится, и Рим не сразу строился. Буду стараться.

    • Вы меня этим Римом прямо успокоили.
      Я всё переживал, что у меня не хватило терпения и способностей объяснить Вам все проблемные места Вашего текста.
      P.S. Раз Вы так оптимистично все восприняли, я набрался смелости и выделил в Вашем предыдущем комментарии текст «буду стараться» в отдельное предложение.

Добавить комментарий