Задача
Напишите программу, которая считывает строку и проверяет, содержит ли она действительное число. Действительное число может содержать десятичную точку или показатель степени (начинающийся с $ 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 |
Код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#include <iostream> using namespace std; bool isdigit(char x) { // проверка, является ли символ числом return (x >= '0' && x <= '9'? 1: 0); } bool isreal(char* x) { // сама функция синтаксического анализа if ((!isdigit(*x))||(*x == '+' || *x == '-' && !isdigit(*++x))) return 0; while (isdigit(*x)) ++x; // счетчик сдвигает указатель до символа, отличного от числа if (*x == '.' && !isdigit(*++x)) return 0; while (isdigit(*x))++x; if ((*x == 'e' || *x == 'E')&&((*++x == '+' || *x == '-')&&(!isdigit(*++x)))) return 0; while (isdigit(*x)) ++x; return *x == 0; // закончилось ли число } int main() { char x[1001]; int n; cin >> n; for (int i = 0;i < n;i++) { // сама проверка cin >> x; // ввод игнорирует пробелы, которые по условию могут быть до и после числа cout << (isreal(x) ? "LEGAL" : "ILLEGAL") << "\n"; } return 0; } |
Решение
Для решения задачи нам понадобится функция idigit() проверки того, является ли символ цифрой. В STL существует одноименная функция, которая выполняет ту же самую задачу, однако для практики, я написал свою. В функции анализа вещественных чисел isreal() нужно указать условия, при которых синтаксис будет нарушен. Т.е. не будут выполнены условия, описанные в задаче. Затем, если в символьном массиве не было замечено ошибок — возвратить trueв основную функцию. Важно то, что в числе не должно по условию быть других символов кроме «e», «E», «.», «+», «-» и цифр. Что касается окаймляющих пробелов, то при вводе строки через cin они игнорируются.
Ссылки
Условие задачи на e-olymp
Код программы на ideone.com
Засчитанное решение на e-olymp
Здравствуйте.
1. Так как isdigit(), isnum() и isreal() это функции, которые принимают аргументы, то в описании кода вам следует поставит скобки.
2. Испольуйте LaTex и для цифр.
Спасибо, исправил недочеты
Здравствуйте.
1. Так как isdigit(), isnum() и isreal() это функции, которые принимают аргументы, то в описании кода вам следует поставить скобки.
2. Используйте LaTex и для цифр.
Благодарю, также исправил все недочеты.
Молодец. Теперь можно смотреть код.
Спасибо, учел ваши правки и постарался улучшить текст руководствуясь ими, надеюсь сейчас текст приемлем.
Спасибо, исправил.
Оказалось, что приведенный в Вашей работе код отличается от того, что прошел тесты. Исправьте, пожалуйста.
Спасибо, исправил недочеты
Я понял, что за один раз у нас не получится всему научиться по оформлению. Но научиться нужно обязательно — Вам еще писать курсовые и дипломные работы. Я переделал пояснение и удалил оценочные суждения, внес небольшие исправления в код. Посмотрите, пожалуйста, различия от предыдущей версии.
Учиться дальше будем на задаче 8185.
Спасибо большое, как говорится, и Рим не сразу строился. Буду стараться.
Вы меня этим Римом прямо успокоили.
Я всё переживал, что у меня не хватило терпения и способностей объяснить Вам все проблемные места Вашего текста.
P.S. Раз Вы так оптимистично все восприняли, я набрался смелости и выделил в Вашем предыдущем комментарии текст «буду стараться» в отдельное предложение.