Okorosso

Задача №1916. Вещественное число

May 7th, 2021 (edited)
157
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.39 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. string toLower(string in) { // приведение строки к нижнему регистру
  8.     for (int i = 0; i < in.length(); i++) {
  9.         if (in[i] <= 'Z' && in[i] >= 'A')
  10.             in[i] = in[i] - ('Z' - 'z');
  11.     }
  12.     return in;
  13. }
  14.  
  15. int main() {
  16.     string toCheck;
  17.     cin >> toCheck;
  18.     toCheck = toLower(toCheck);
  19.  
  20.     // создание машины состояний на двумерном массиве
  21.     vector<vector<int>> steps;
  22.     for (int i = 0; i < 8; ++i) {
  23.         vector<int> a(5, 0);
  24.         steps.push_back(a); // закидываем массив длинной 5, заполненный нулями в основной массив
  25.     }
  26.     // ВАЖНО: мы используем в [x][4] чифру 0 для проверки,
  27.     // т.к мы не можем использовать ноль нигде больше, кроме первого шага
  28.  
  29.  
  30.     // если мы еще ничего не обработали 1 цифра/буква в веденной строке
  31.     steps[0][0] = 2; // если встречаем число
  32.     steps[0][1] = -1; // если встречаем "е"
  33.     steps[0][2] = -1; // если встречаем "."
  34.     steps[0][3] = 1; // если встречаемм знак + или -
  35.     steps[0][4] = 2; // используем для проверки, если число кончилось, можно замениь на -1
  36.  
  37.     // если на предыдущем шаге встретили знак +-
  38.     steps[1][0] = 2; // если число
  39.     steps[1][1] = -1; // если встречаем экспоненту
  40.     steps[1][2] = -1; // если встречаем точку
  41.     steps[1][3] = -1; // если знак +-
  42.     steps[1][4] = -1; // проверка на выходе (у нас не может число иметь вид "-" или "+")
  43.  
  44.     // если встретили число на предыдущем шаге
  45.     steps[2][0] = 2; // если число
  46.     steps[2][1] = 5; // если экспонента
  47.     steps[2][2] = 3; // точка
  48.     steps[2][3] = -1; // +-
  49.     steps[2][4] = 0; // проверка (0, т.к число может оканчиваться на цифру)
  50.  
  51.     // если на предыдущем шаге встретили точку
  52.     steps[3][0] = 4; // если встречаем число
  53.     steps[3][1] = -1; // если экспоненту
  54.     steps[3][2] = -1; // если точка
  55.     steps[3][3] = -1; // если +-
  56.     steps[3][4] = -1; // число не может оканчиватьсяна точку, поэтому -1
  57.  
  58.     // если у нас была встречина последовательность из точки и числа типа "хх1.Y",
  59.     // где х - некоторое кол-во валидных знаков, Y - текущий символ
  60.     steps[4][0] = 4; // если число
  61.     steps[4][1] = 5; // если экспонента
  62.     steps[4][2] = -1; // если точка
  63.     steps[4][3] = -1; // если +-
  64.     steps[4][4] = 0; // 0, т.к пример "123.3" - верное
  65.  
  66.     // если встретили экспоненту и перед ней все верно
  67.     steps[5][0] = 7; // если число
  68.     steps[5][1] = -1; // если экспонента
  69.     steps[5][2] = -1; // если точка
  70.     steps[5][3] = 6; // если -+
  71.     steps[5][4] = -1; //число не может заканчиваться на "е"
  72.  
  73.     // если встретили "е" и знак -+ и перед ними все валидно,
  74.     // то мы дальше могут идти только числа, поэтому -1 везде, кроме того момента, когда встречается число
  75.     steps[6][0] = 7;
  76.     steps[6][1] = -1;
  77.     steps[6][2] = -1;
  78.     steps[6][3] = -1;
  79.     steps[6][4] = -1;
  80.  
  81.     // если встретили все, что возможно и нам остается только проверять, чтобы были ТОЛЬКО цифры
  82.     steps[7][0] = 7;
  83.     steps[7][1] = -1;
  84.     steps[7][2] = -1;
  85.     steps[7][3] = -1;
  86.     steps[7][4] = 0; // если закончили проверять и все верно
  87.  
  88.     int currentStep = 0;
  89.     string deg = "1234567890";
  90.     string sign = "+-";
  91.  
  92.     for (auto ch:toCheck) {
  93.         if (deg.find(ch) != -1 and steps[currentStep][0] != -1) { // проверка на цифру
  94.             currentStep = steps[currentStep][0];
  95.         } else if (ch == 'e' and steps[currentStep][1] != -1) { // если экспонента
  96.             currentStep = steps[currentStep][1];
  97.         } else if (ch == '.' and steps[currentStep][2] != -1) { // если точка
  98.             currentStep = steps[currentStep][2];
  99.         } else if (sign.find(ch) != -1 and steps[currentStep][3] != -1) { // если знак
  100.             currentStep = steps[currentStep][3];
  101.         } else { // если никуда не зашли, значит, что мы встретили не валидное число
  102.             cout << "NO";
  103.             return 0;
  104.         }
  105.     }
  106.  
  107.     if (steps[currentStep][4] == 0) { // если полностью прошли число и не вышли в ошибку
  108.         cout << "YES";
  109.     } else {
  110.         cout << "NO";
  111.     }
  112. }
  113.  
  114.  
  115.  
Add Comment
Please, Sign In to add comment