C语言计算器 (支持复杂表达式、括号、函数)

//可以使用四则运算、括号和math.h中的一些函数。
//不能包含空格 3(4)会算成4,要写成3*(4)
//使用了 math.h 编译时加上 -lm 参数
//运用了后缀表达式的相关知识
//例 1+sqrt(4)*3 =7.000000
//例 2*(2+3) =10.000000

#include<math.h>
#include<stdio.h>


//compute函数使用
#define FNX0 3//常数数组
#define FNX1 8//指向有一个参数的函数的指针的数组
#define FNX2 1//指向有二个参数的函数的指针的数组
//xin为表达式字符串,length为长度,错误时 *error为零。
double compute(char *xin,int length,int *error);
int main(){
    int error=1;
    char qus[200]={0};
    for(;;){
        scanf("%s",qus);
        printf("=%lf \n",compute(qus,-1,&error));
        fflush(stdout);
        if(error==0) printf("error\n");
        error=1;
     }
    return 0;
}
char *fn0[FNX0]={"pi","e","m"};
double fx0[FNX0]={3.14159265358979323846,2.71828182845904523536,0};

char *fn1[FNX1]={"acos","asin","atan","cos","sin","tan","ln","sqrt"};
double (*fx1[FNX1])(double)={acos,asin,atan,cos,sin,tan,log,sqrt};

char *fn2[FNX2]={"pow"};
double (*fx2[FNX2])(double,double)={pow};


//计算算式字符串的值
double compute(char *xin,int length,int *error){//算式字符串,字符串长度,错误信息
	signed char o[3]={0};//运算符栈 +-*/ 为1234 0为空
	signed char s[3]={1,1,1};//数字栈符号
	short Now0=0;//运算符下标
	short Now1=0;//数
  • 11
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个使用栈实现括号C语言计算器的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <ctype.h> // 定义栈结构 typedef struct stack { int top; int capacity; int* array; } Stack; // 创建一个新的空栈 Stack* createStack(int capacity) { Stack* stack = (Stack*)malloc(sizeof(Stack)); stack->top = -1; stack->capacity = capacity; stack->array = (int*)malloc(sizeof(int) * capacity); return stack; } // 判断栈是否为空 int isEmpty(Stack* stack) { return stack->top == -1; } // 判断栈是否已满 int isFull(Stack* stack) { return stack->top == stack->capacity - 1; } // 入栈 void push(Stack* stack, int item) { if (isFull(stack)) { printf("栈已满\n"); return; } stack->array[++stack->top] = item; } // 出栈 int pop(Stack* stack) { if (isEmpty(stack)) { printf("栈已空\n"); return -1; } return stack->array[stack->top--]; } // 查看栈顶元素 int peek(Stack* stack) { if (isEmpty(stack)) { printf("栈已空\n"); return -1; } return stack->array[stack->top]; } // 计算表达式 int evaluateExpression(char* expression) { Stack* stack = createStack(strlen(expression)); int i, num = 0, result = 0; char ch; for (i = 0; expression[i]; i++) { ch = expression[i]; if (isdigit(ch)) { num = num * 10 + (int)(ch - '0'); } else if (ch == '(') { push(stack, result); push(stack, ch); result = 0; } else if (ch == ')') { num = result; result = pop(stack); if (peek(stack) == '(') { pop(stack); } } else if (ch == '+' || ch == '-' || ch == '*' || ch == '/') { if (ch == '+') { result += num; } else if (ch == '-') { result -= num; } else if (ch == '*') { result *= num; } else if (ch == '/') { result /= num; } num = 0; } } return result + num; } // 主函数 int main() { char expression[100]; printf("请输入表达式:"); scanf("%s", expression); int result = evaluateExpression(expression); printf("计算结果为:%d\n", result); return 0; } ``` 这个示例代码中,我们定义了一个 `Stack` 结构体来实现栈的功能,同时定义了一些常用的栈操作函数,如 `createStack`、`isEmpty`、`isFull`、`push`、`pop`、`peek` 等。在 `evaluateExpression` 函数中,我们遍历输入的表达式,逐个处理其中的数字、括号和运算符,同时使用栈来保存计算过程中的结果和括号位置,最终得到表达式的计算结果。在主函数中,我们获取用户输入的表达式,并调用 `evaluateExpression` 函数来计算结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值