Advertisement
Guest User

Untitled

a guest
Nov 14th, 2018
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.08 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <stdio.h>
  3. #include <ctype.h>
  4.  
  5.  
  6. /*enum это именованые перечисления
  7. это тип который может содержать значения указанные программистом.
  8. Целочисленные именованные константы могут быть определены как члены перечисления.
  9.  */
  10.  
  11. enum states //состояния
  12. {
  13.     NORMAL,
  14.     SIGN,
  15.     INTPART,
  16.     FRACPART,
  17.     EPART,
  18.     END
  19. };
  20.  
  21.  
  22. /*Структура — это агрегатный тип данных, так как может содержать в себе разнотипные элементы.*/
  23. struct stack
  24. {
  25.     char v[100], *p; /* *p указатель на следующий элемент  */
  26. };
  27.  
  28.  
  29.  
  30.  
  31. int main(void)
  32. {
  33.     //константная строка для распознавания
  34.     const char *str = "-65.045; +785.34; 457.7#", *p;
  35.  
  36.     enum states s; //обьявляю в методе main перечисления, для использования состояний
  37.     int c;
  38.  
  39.  
  40.    
  41.     struct stack stack;
  42.     stack.p = stack.v;
  43.    
  44.     /*P.s. Стек наглядно выглядит как детская пирамидка, по принципу последним пришел первым ушел*/
  45.  
  46.     s = NORMAL;//задаю изначальное состояние  
  47.  
  48.     for (p = str; (c = (unsigned char)*p) != '\0'; p++) //цикл пока строка не закончится.
  49.         //p является указателем на элемент строки в данный момент времени
  50.  
  51.         switch (s)
  52.         {
  53.  
  54.         case NORMAL:
  55.             if (c == '+' || c == '-') //если встречен знак то переходим в состояние знак(sign)
  56.             {
  57.                 *stack.p++ = c; //в слеющий элемент стека вписываем знак
  58.                 s = SIGN;  
  59.             }
  60.                 else
  61.             if (isdigit(c)) //иначе если встречена цифра
  62.             {
  63.                 p--;
  64.                 s = INTPART; //то идем в состояние INTPART
  65.             }
  66.                 else
  67.             if (c == '#') //если встречен символ # то завершаем считывание
  68.             s = END;
  69.             break;
  70.  
  71.         case SIGN:
  72.             if (isdigit(c)) //у нас до этого был введен знак, далее смотрим если встречен символ - цифра
  73.             {
  74.                 p--;
  75.                 s = INTPART; //то переходим в кейс работы с числом
  76.             }
  77.                 else
  78.             {
  79.                 p--;
  80.                 stack.p = stack.v;
  81.                 s = NORMAL;
  82.             }
  83.             break;
  84.  
  85.         case INTPART:
  86.             if (isdigit(c))
  87.                 *stack.p++ = c;
  88.             else if (c == '.') {
  89.                 *stack.p++ = c;
  90.                 s = FRACPART; //перехожу к разделу после запятой
  91.             }
  92.             else
  93.                 if (c == '#') //если встречен символ # то завершаем считывание
  94.                 s = END;
  95.             else
  96.             {
  97.                 p--;
  98.                 stack.p = stack.v;
  99.                 s = NORMAL;
  100.             }
  101.             break;
  102.  
  103.         case FRACPART:
  104.  
  105.             if ((c == 'E') || (c == 'e'))
  106.                 s = EPART;
  107.             else
  108.             if (isdigit(c))
  109.                 *stack.p++ = c;
  110.                 else
  111.             if (c == ';' || c == '#') {
  112.                 if (stack.p > stack.v)
  113.                 {
  114.                     /*Если мы дошли до сюда то это значит, что у нас прошла целая часть числа
  115.                     соответственно если мы встречаем разделение ; или конец # то мы выводим это число как
  116.                     распознаное*/
  117.                     printf("%.*s\n", stack.p - stack.v, stack.v);
  118.                     stack.p = stack.v;
  119.                 }
  120.                 s = (c == ';') ? NORMAL : END; //тернарный оператор если встречаемый символ = ; то переходим
  121.                 //в исходное состояние для проверки числа, иначе конец, присваивает s соответствующее состояние
  122.             }
  123.                 else
  124.             {
  125.                 p--;
  126.                 stack.p = stack.v;
  127.                 s = NORMAL;
  128.             }
  129.             break;
  130.  
  131.         case EPART:
  132.             if ((c == 'E') || (c == 'e'))
  133.                 *stack.p++ = c;
  134.             break;
  135.  
  136.         case END:
  137.             break;
  138.  
  139.         }
  140.  
  141.     return 0;
  142. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement