Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <vector>
- using namespace std;
- string toLower(string in) { // приведение строки к нижнему регистру
- for (int i = 0; i < in.length(); i++) {
- if (in[i] <= 'Z' && in[i] >= 'A')
- in[i] = in[i] - ('Z' - 'z');
- }
- return in;
- }
- int main() {
- string toCheck;
- cin >> toCheck;
- toCheck = toLower(toCheck);
- // создание машины состояний на двумерном массиве
- vector<vector<int>> steps;
- for (int i = 0; i < 8; ++i) {
- vector<int> a(5, 0);
- steps.push_back(a); // закидываем массив длинной 5, заполненный нулями в основной массив
- }
- // ВАЖНО: мы используем в [x][4] чифру 0 для проверки,
- // т.к мы не можем использовать ноль нигде больше, кроме первого шага
- // если мы еще ничего не обработали 1 цифра/буква в веденной строке
- steps[0][0] = 2; // если встречаем число
- steps[0][1] = -1; // если встречаем "е"
- steps[0][2] = -1; // если встречаем "."
- steps[0][3] = 1; // если встречаемм знак + или -
- steps[0][4] = 2; // используем для проверки, если число кончилось, можно замениь на -1
- // если на предыдущем шаге встретили знак +-
- steps[1][0] = 2; // если число
- steps[1][1] = -1; // если встречаем экспоненту
- steps[1][2] = -1; // если встречаем точку
- steps[1][3] = -1; // если знак +-
- steps[1][4] = -1; // проверка на выходе (у нас не может число иметь вид "-" или "+")
- // если встретили число на предыдущем шаге
- steps[2][0] = 2; // если число
- steps[2][1] = 5; // если экспонента
- steps[2][2] = 3; // точка
- steps[2][3] = -1; // +-
- steps[2][4] = 0; // проверка (0, т.к число может оканчиваться на цифру)
- // если на предыдущем шаге встретили точку
- steps[3][0] = 4; // если встречаем число
- steps[3][1] = -1; // если экспоненту
- steps[3][2] = -1; // если точка
- steps[3][3] = -1; // если +-
- steps[3][4] = -1; // число не может оканчиватьсяна точку, поэтому -1
- // если у нас была встречина последовательность из точки и числа типа "хх1.Y",
- // где х - некоторое кол-во валидных знаков, Y - текущий символ
- steps[4][0] = 4; // если число
- steps[4][1] = 5; // если экспонента
- steps[4][2] = -1; // если точка
- steps[4][3] = -1; // если +-
- steps[4][4] = 0; // 0, т.к пример "123.3" - верное
- // если встретили экспоненту и перед ней все верно
- steps[5][0] = 7; // если число
- steps[5][1] = -1; // если экспонента
- steps[5][2] = -1; // если точка
- steps[5][3] = 6; // если -+
- steps[5][4] = -1; //число не может заканчиваться на "е"
- // если встретили "е" и знак -+ и перед ними все валидно,
- // то мы дальше могут идти только числа, поэтому -1 везде, кроме того момента, когда встречается число
- steps[6][0] = 7;
- steps[6][1] = -1;
- steps[6][2] = -1;
- steps[6][3] = -1;
- steps[6][4] = -1;
- // если встретили все, что возможно и нам остается только проверять, чтобы были ТОЛЬКО цифры
- steps[7][0] = 7;
- steps[7][1] = -1;
- steps[7][2] = -1;
- steps[7][3] = -1;
- steps[7][4] = 0; // если закончили проверять и все верно
- int currentStep = 0;
- string deg = "1234567890";
- string sign = "+-";
- for (auto ch:toCheck) {
- if (deg.find(ch) != -1 and steps[currentStep][0] != -1) { // проверка на цифру
- currentStep = steps[currentStep][0];
- } else if (ch == 'e' and steps[currentStep][1] != -1) { // если экспонента
- currentStep = steps[currentStep][1];
- } else if (ch == '.' and steps[currentStep][2] != -1) { // если точка
- currentStep = steps[currentStep][2];
- } else if (sign.find(ch) != -1 and steps[currentStep][3] != -1) { // если знак
- currentStep = steps[currentStep][3];
- } else { // если никуда не зашли, значит, что мы встретили не валидное число
- cout << "NO";
- return 0;
- }
- }
- if (steps[currentStep][4] == 0) { // если полностью прошли число и не вышли в ошибку
- cout << "YES";
- } else {
- cout << "NO";
- }
- }
Add Comment
Please, Sign In to add comment