C语言实现数学表达式运算

C语言实现数学表达式运算

概述

C语言提供了一系列函数库,可以实现数学表达式的运算。本篇攻略将介绍如何使用C语言实现数学表达式的运算的方法。

函数库

在C语言中实现数学表达式计算,可以使用数学函数库<math.h>和字符串处理函数库<string.h>

<math.h>函数库

该函数库中包括了常见的数学函数,例如四则运算、幂函数、三角函数等等。

<string.h>函数库

该函数库中包括了对字符串的处理函数,例如字符串的初始化、复制、连接等等。

思路

实现数学表达式计算,需要考虑以下的几个因素:

  • 表达式的输入和存储:使用字符数组存储输入的表达式。
  • 表达式的解析:将输入的字符串解析成数字和运算符,可以用数字栈和符号栈实现。
  • 表达式的计算:根据前缀、中缀或后缀表达式计算表达式的值。

示例

下面是使用C语言计算数学表达式的两个示例。

示例一:计算中缀表达式的值

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>

#define MAX_EXPR_SIZE   100

typedef struct {
    int top;
    char data[MAX_EXPR_SIZE];
} Stack;

int is_empty(Stack* stack) {
    return (stack->top == -1);
}

int is_full(Stack* stack) {
    return (stack->top == MAX_EXPR_SIZE - 1);
}

char pop(Stack* stack) {
    if (is_empty(stack)) {
        printf("Stack is empty.\n");
        exit(1);
    } else {
        return stack->data[stack->top--];
    }
}

void push(Stack* stack, char c) {
    if (is_full(stack)) {
        printf("Stack is full.\n");
        exit(1);
    } else {
        stack->data[++(stack->top)] = c;
    }
}

char peek(Stack* stack) {
    if (is_empty(stack)) {
        printf("Stack is empty.\n");
        exit(1);
    } else {
        return stack->data[stack->top];
    }
}

int is_operator(char c) {
    return ((c == '+') || (c == '-') || (c == '*') || (c == '/') || (c == '^'));
}

int precedence(char op) {
    if ((op == '+') || (op == '-'))
        return 1;
    else if ((op == '*') || (op == '/'))
        return 2;
    else if (op == '^')
        return 3;
    else
        return 0;
}

double calculate(double opnd1, char optr, double opnd2) {
    switch (optr) {
        case '+': return opnd1 + opnd2;
        case '-': return opnd1 - opnd2;
        case '*': return opnd1 * opnd2;
        case '/': return opnd1 / opnd2;
        case '^': return pow(opnd1, opnd2);
        default : return 0.0;
    }
}

double evaluate(char* exp) {
    Stack opnd;  // 操作数栈
    Stack optr;  // 运算符栈

    opnd.top = -1;
    optr.top = -1;

    int i = 0;
    char c;

    while ((c = exp[i++]) != '\0') {
        if (isdigit(c)) {  // 如果是数字
            double d = atof(&c);
            while (isdigit(exp[i]) || (exp[i] == '.')) {
                strncat(&c, &exp[i++], 1);  // 将连续的数字字符拼接成浮点数
            }
            push(&opnd, d);
        } else if (is_operator(c)) {  // 如果是运算符
            while ((!is_empty(&optr)) && (precedence(c) <= precedence(peek(&optr)))) {
                double opnd2 = pop(&opnd);
                double opnd1 = pop(&opnd);
                push(&opnd, calculate(opnd1, pop(&optr), opnd2));
            }
            push(&optr, c);
        } else if (c == '(') {  // 如果是左括号
            push(&optr, c);
        } else if (c == ')') {  // 如果是右括号
            while (peek(&optr) != '(') {
                double opnd2 = pop(&opnd);
                double opnd1 = pop(&opnd);
                push(&opnd, calculate(opnd1, pop(&optr), opnd2));
            }
            pop(&optr);
        } else {  // 如果是空格或其他非法字符,忽略
            continue;
        }
    }

    while (!is_empty(&optr)) {
        double opnd2 = pop(&opnd);
        double opnd1 = pop(&opnd);
        push(&opnd, calculate(opnd1, pop(&optr), opnd2));
    }

    return pop(&opnd);
}

int main() {
    char expression[MAX_EXPR_SIZE];

    printf("Please enter an infix expression: ");
    fgets(expression, MAX_EXPR_SIZE, stdin);

    double result = evaluate(expression);

    printf("The result of the expression is: %lf\n", result);

    return 0;
}

示例二:计算后缀表达式的值

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>

#define MAX_EXPR_SIZE   100

typedef struct {
    int top;
    double data[MAX_EXPR_SIZE];
} Stack;

int is_empty(Stack* stack) {
    return (stack->top == -1);
}

int is_full(Stack* stack) {
    return (stack->top == MAX_EXPR_SIZE - 1);
}

double pop(Stack* stack) {
    if (is_empty(stack)) {
        printf("Stack is empty.\n");
        exit(1);
    } else {
        return stack->data[stack->top--];
    }
}

void push(Stack* stack, double d) {
    if (is_full(stack)) {
        printf("Stack is full.\n");
        exit(1);
    } else {
        stack->data[++(stack->top)] = d;
    }
}

double evaluate(char* exp) {
    Stack stack;  // 操作数栈

    stack.top = -1;

    int i = 0;
    char c;

    while ((c = exp[i++]) != '\0') {
        if (isdigit(c)) {  // 如果是数字
            double d = atof(&c);
            while (isdigit(exp[i]) || (exp[i] == '.')) {
                strncat(&c, &exp[i++], 1);  // 将连续的数字字符拼接成浮点数
            }
            push(&stack, d);
        } else if (c == ' ') {  // 如果是空格,忽略
            continue;
        } else {  // 如果是运算符
            double opnd2 = pop(&stack);
            double opnd1 = pop(&stack);
            switch (c) {
                case '+': push(&stack, opnd1 + opnd2); break;
                case '-': push(&stack, opnd1 - opnd2); break;
                case '*': push(&stack, opnd1 * opnd2); break;
                case '/': push(&stack, opnd1 / opnd2); break;
                case '^': push(&stack, pow(opnd1, opnd2)); break;
                default : printf("Unknown operator: %c\n", c); exit(1);
            }
        }
    }

    return pop(&stack);
}

int main() {
    char expression[MAX_EXPR_SIZE];

    printf("Please enter a postfix expression: ");
    fgets(expression, MAX_EXPR_SIZE, stdin);

    double result = evaluate(expression);

    printf("The result of the expression is: %lf\n", result);

    return 0;
}

结论

以上就是使用C语言实现数学表达式的运算的完整攻略。涵盖了表达式的输入和存储、解析以及计算,同时提供了两个示例:中缀表达式和后缀表达式的计算。对于实现数学表达式的计算功能的使用者来说,只需根据自己的需求使用不同的表达式,就可以获得自己想要的计算结果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言实现数学表达式运算 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • SpringBoot @Retryable注解方式

    当我们使用Spring Boot开发应用程序的时候,很有可能会碰到一些需要重试的异常错误,例如数据库连接超时等问题。这时候,我们可以使用Spring Boot提供的@Retryable注解来处理这些异常,并在重试后继续执行程序。 下面是使用@Retryable注解的具体步骤: 第一步:添加依赖 在Spring Boot应用程序中使用@Retryable注解,…

    C 2023年5月23日
    00
  • C 语言简单加减乘除运算

    以下是关于C语言简单加减乘除运算的攻略: 标题 1. 加减乘除运算 C语言中,加减乘除运算的符号分别是: 运算符 含义 + 加 – 减 * 乘 / 除 2. 基本语法 C语言中的加减乘除运算的基本语法如下: int a = 10, b = 5; int r = a + b; // 加法运算 r = a – b; // 减法运算 r = a * b; // 乘…

    C 2023年5月23日
    00
  • 在Python 中将类对象序列化为JSON

    序列化(Serialization)指的是将数据结构或对象状态转换为可以存储或传输的格式的过程。其中,将数据转换成JSON格式是常见的序列化方式之一。Python 中提供了通用的序列化模块 json 来实现将数据转换为JSON格式,其中也包括对象的序列化操作。 下面是将 Python 类对象序列化为 JSON 的完整操作步骤: 导入 JSON 模块 json…

    C 2023年5月23日
    00
  • 深入分析javascript中的错误处理机制

    深入分析JavaScript中的错误处理机制 在JavaScript中,错误处理是一个非常重要的话题。良好的错误处理可以帮助我们更好地调试和优化程序,提高程序的稳定性和可靠性。本文将介绍JavaScript中的错误处理机制,包括错误类型、错误捕获和处理方式等。 错误类型 在JavaScript中,有三种错误类型: 语法错误(SyntaxError):由于编写…

    C 2023年5月23日
    00
  • C语言动态顺序表实例代码

    接下来我将详细讲解 C 语言动态顺序表的实现过程。首先我们需要先了解顺序表的概念,顺序表是一种线性表的存储结构,它在物理上采用一组连续的内存空间来存储线性表的数据元素,并且对于顺序表的元素,我们可以按照元素下标进行随机存取。接下来我们就可以开始进行动态顺序表的实现了。 动态顺序表的实现 初步设计 首先我们需要先建立一个动态顺序表结构体,它包含了以下几个基本成…

    C 2023年5月30日
    00
  • springcloud feign服务之间调用,date类型转换错误的问题

    下面我就来详细讲解一下“Spring Cloud Feign服务之间调用,date类型转换错误的问题”的完整攻略。 背景 在使用 Spring Cloud Feign 服务之间调用时,有些服务可能会返回 Date 类型的数据。在接收返回数据时,如果没有配置比较完善的解决方案,就会出现 Date 类型的解析错误。 问题描述 Spring Cloud Feign…

    C 2023年5月23日
    00
  • 计时器的time_t和clock_t 的两种实现方法(推荐)

    计时器的time_t和clock_t的两种实现方法(推荐) 计时器是一个非常实用的工具,在很多应用场景中都得到了广泛的应用。time_t和clock_t是两种常见的计时器类型,它们都可以用于测量时间的长度。本文将详细介绍这两种类型的实现方法,以供大家参考。 time_t的实现方法 time_t是标准C库中的一种数据类型,它代表了从1970年1月1日零时整到给…

    C 2023年5月23日
    00
  • 将Emacs打造成强大的Python代码编辑工具

    当你选择使用 Emacs 作为 Python 的编辑器时,你会拥有一个非常强大的工具,Emacs 配合一些插件和定制的设置,可以满足你对 Python 编辑器的所有需求。 下面是将 Emacs 打造成强大的 Python 代码编辑工具的攻略: 安装 Python 模式 首先,你需要安装一个称为“Python 模式”的软件包。该软件包提供了一些有用的功能,如代…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部