Задача
Напишите программу, которая считывает строку и проверяет, содержит ли она действительное число. Действительное число может содержать десятичную точку или показатель степени (начинающийся с $ 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