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

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

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

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

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

textual
Листинг программы
#include <stdio.h>
#define is_space(c) ((c) == ' ' || (c) == '\t' || (c) == '\n' || (c) == '\r')
#define is_digit(c) ((c) >= '0' && (c) <= '9')
#define ops_calc    1
#define ops_num    2
#define ops_start   3
#define ops_end    4
#define ops_unary  5
 
int is_math_expr(const char* s){
    const char* p;
    int st, n = 0;
    //проверка на правильность скобок
    for(p = s; *p; ++p){
        if(*p == '(')
            ++n;
        else if(*p == ')'){
            if(--n < 0)
                break;
        }
    }
    if(!*s || (n != 0))
        return 0;
 
    //проверка на правильность арифметического выражения
    for(st = ops_start; *s; ){
        if(is_space(*s)){
            ++s;
            continue;
        } else if(is_digit(*s)){
            if(st != ops_start && st != ops_calc && st != ops_unary)
                return 0;
 
            while(is_digit(*s))
                ++s;
            if(*s == '.')
                ++s;
            while(is_digit(*s))
                ++s;
            st = ops_num;
            continue;
        }
 
        switch(*s){
        case '(':
            if(st == ops_num || st == ops_end)
                return 0;
            st = ops_start;
            break;
        case ')':
            if(st == ops_start || st == ops_calc || st == ops_unary)
                return 0;
            st = ops_end;
            break;
        case '+':
        case '-':
            switch(st){
            case ops_unary:
                return 0;
            case ops_start:
            case ops_calc:
                st = ops_unary;
                break;
            case ops_num:
            case ops_end:
                st = ops_calc;
                break;
            default:
                return 0;
            }
            break;
        case '*':
        case '/':
        case '^':
            if(st == ops_start || st == ops_calc || st == ops_unary)
                return 0;
            st = ops_calc;
            break;
        default:
            return 0;
        }
        ++s;
    }
    return (st == ops_num || st == ops_end);
}
 
int main(void){
    char s[] = "-(-100 * -100/60) * +1.89";
    double n = -(-100 * -100/60) * +1.89;
 
    if(is_math_expr(s))
        puts("Good.");
    else
        puts("Error expr!");
    getchar();
    return 0;
}

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

  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
Похожие ответы