Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- #include <stdio.h>
- #include <ctype.h>
- /*enum это именованые перечисления
- это тип который может содержать значения указанные программистом.
- Целочисленные именованные константы могут быть определены как члены перечисления.
- */
- enum states //состояния
- {
- NORMAL,
- SIGN,
- INTPART,
- FRACPART,
- EPART,
- END
- };
- /*Структура — это агрегатный тип данных, так как может содержать в себе разнотипные элементы.*/
- struct stack
- {
- char v[100], *p; /* *p указатель на следующий элемент */
- };
- int main(void)
- {
- //константная строка для распознавания
- const char *str = "-65.045; +785.34; 457.7#", *p;
- enum states s; //обьявляю в методе main перечисления, для использования состояний
- int c;
- struct stack stack;
- stack.p = stack.v;
- /*P.s. Стек наглядно выглядит как детская пирамидка, по принципу последним пришел первым ушел*/
- s = NORMAL;//задаю изначальное состояние
- for (p = str; (c = (unsigned char)*p) != '\0'; p++) //цикл пока строка не закончится.
- //p является указателем на элемент строки в данный момент времени
- switch (s)
- {
- case NORMAL:
- if (c == '+' || c == '-') //если встречен знак то переходим в состояние знак(sign)
- {
- *stack.p++ = c; //в слеющий элемент стека вписываем знак
- s = SIGN;
- }
- else
- if (isdigit(c)) //иначе если встречена цифра
- {
- p--;
- s = INTPART; //то идем в состояние INTPART
- }
- else
- if (c == '#') //если встречен символ # то завершаем считывание
- s = END;
- break;
- case SIGN:
- if (isdigit(c)) //у нас до этого был введен знак, далее смотрим если встречен символ - цифра
- {
- p--;
- s = INTPART; //то переходим в кейс работы с числом
- }
- else
- {
- p--;
- stack.p = stack.v;
- s = NORMAL;
- }
- break;
- case INTPART:
- if (isdigit(c))
- *stack.p++ = c;
- else if (c == '.') {
- *stack.p++ = c;
- s = FRACPART; //перехожу к разделу после запятой
- }
- else
- if (c == '#') //если встречен символ # то завершаем считывание
- s = END;
- else
- {
- p--;
- stack.p = stack.v;
- s = NORMAL;
- }
- break;
- case FRACPART:
- if ((c == 'E') || (c == 'e'))
- s = EPART;
- else
- if (isdigit(c))
- *stack.p++ = c;
- else
- if (c == ';' || c == '#') {
- if (stack.p > stack.v)
- {
- /*Если мы дошли до сюда то это значит, что у нас прошла целая часть числа
- соответственно если мы встречаем разделение ; или конец # то мы выводим это число как
- распознаное*/
- printf("%.*s\n", stack.p - stack.v, stack.v);
- stack.p = stack.v;
- }
- s = (c == ';') ? NORMAL : END; //тернарный оператор если встречаемый символ = ; то переходим
- //в исходное состояние для проверки числа, иначе конец, присваивает s соответствующее состояние
- }
- else
- {
- p--;
- stack.p = stack.v;
- s = NORMAL;
- }
- break;
- case EPART:
- if ((c == 'E') || (c == 'e'))
- *stack.p++ = c;
- break;
- case END:
- break;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement