Программа для проверки корректности записи арифметического выражения - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Не могу понять даже с чего начинать писать код,может кто либо объяснить как это сделать?

Решение задачи: «Программа для проверки корректности записи арифметического выражения»

textual
Листинг программы
  1. #include <stdio.h>
  2. #define is_space(c) ((c) == ' ' || (c) == '\t' || (c) == '\n' || (c) == '\r')
  3. #define is_digit(c) ((c) >= '0' && (c) <= '9')
  4. #define ops_calc    1
  5. #define ops_num    2
  6. #define ops_start   3
  7. #define ops_end    4
  8. #define ops_unary  5
  9.  
  10. int is_math_expr(const char* s){
  11.     const char* p;
  12.     int st, n = 0;
  13.     //проверка на правильность скобок
  14.     for(p = s; *p; ++p){
  15.         if(*p == '(')
  16.             ++n;
  17.         else if(*p == ')'){
  18.             if(--n < 0)
  19.                 break;
  20.         }
  21.     }
  22.     if(!*s || (n != 0))
  23.         return 0;
  24.  
  25.     //проверка на правильность арифметического выражения
  26.     for(st = ops_start; *s; ){
  27.         if(is_space(*s)){
  28.             ++s;
  29.             continue;
  30.         } else if(is_digit(*s)){
  31.             if(st != ops_start && st != ops_calc && st != ops_unary)
  32.                 return 0;
  33.  
  34.             while(is_digit(*s))
  35.                 ++s;
  36.             if(*s == '.')
  37.                 ++s;
  38.             while(is_digit(*s))
  39.                 ++s;
  40.             st = ops_num;
  41.             continue;
  42.         }
  43.  
  44.         switch(*s){
  45.         case '(':
  46.             if(st == ops_num || st == ops_end)
  47.                 return 0;
  48.             st = ops_start;
  49.             break;
  50.         case ')':
  51.             if(st == ops_start || st == ops_calc || st == ops_unary)
  52.                 return 0;
  53.             st = ops_end;
  54.             break;
  55.         case '+':
  56.         case '-':
  57.             switch(st){
  58.             case ops_unary:
  59.                 return 0;
  60.             case ops_start:
  61.             case ops_calc:
  62.                 st = ops_unary;
  63.                 break;
  64.             case ops_num:
  65.             case ops_end:
  66.                 st = ops_calc;
  67.                 break;
  68.             default:
  69.                 return 0;
  70.             }
  71.             break;
  72.         case '*':
  73.         case '/':
  74.         case '^':
  75.             if(st == ops_start || st == ops_calc || st == ops_unary)
  76.                 return 0;
  77.             st = ops_calc;
  78.             break;
  79.         default:
  80.             return 0;
  81.         }
  82.         ++s;
  83.     }
  84.     return (st == ops_num || st == ops_end);
  85. }
  86.  
  87. int main(void){
  88.     char s[] = "-(-100 * -100/60) * +1.89";
  89.     double n = -(-100 * -100/60) * +1.89;
  90.  
  91.     if(is_math_expr(s))
  92.         puts("Good.");
  93.     else
  94.         puts("Error expr!");
  95.     getchar();
  96.     return 0;
  97. }

Объяснение кода листинга программы

  1. В начале кода определяются несколько макросов:
    • is_space(c) - проверяет, является ли символ пробелом (пробел, табуляция, перевод строки, возврат каретки).
    • is_digit(c) - проверяет, является ли символ цифрой.
    • ops_calc - операция вычисления.
    • ops_num - операция числа.
    • ops_start - начало операции.
    • ops_end - конец операции.
    • ops_unary - операция с одним операндом.
  2. Функция is_math_expr(const char* s) принимает на вход строку с математическим выражением и возвращает 1, если выражение корректно, и 0 в противном случае.
    • Сначала функция проверяет корректность скобок в выражении.
    • Затем происходит проверка на правильность арифметического выражения.
    • Если символ является пробелом, он пропускается.
    • Если символ является цифрой, проверяется, что он не находится в неправильной части выражения.
    • Если символ является оператором, проверяется его корректность в зависимости от текущего состояния.
    • В конце функция проверяет, что осталось только число или оператор.
  3. В функции main() создается строка s, содержащая математическое выражение.
    • Вычисляется значение этого выражения.
    • Затем вызывается функция is_math_expr(s), которая проверяет корректность этого выражения.
    • Если выражение корректно, выводится сообщение Good..
    • В противном случае выводится сообщение Error expr!.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4.429 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы