C语言 让机器理解计算表达式

输入一个合法不含括号的常整数表达式字符串:

2+3*4+5%2

计算这个结果

输入:

2+3*4+5%2

输出:

15

注:所有输入均为半角字符,字符串中无空格。仅仅包含+ - * / % 五个运算符号,且都是整数。

c

4个回答

如果肯采纳本回答,可以帮你按照你的要求改好。

caozhy
回答这么多问题就耍赖把我的积分一笔勾销了 回复wwdzyx: 好了
接近 3 年之前 回复
wwdzyx
wwdzyx 已采纳,请尽快提交程序,谢谢!
接近 3 年之前 回复
caozhy
回答这么多问题就耍赖把我的积分一笔勾销了 稍等
接近 3 年之前 回复
caozhy
回答这么多问题就耍赖把我的积分一笔勾销了 回复wwdzyx: 请点右边的采纳按钮,然后帮你修改。
接近 3 年之前 回复
wwdzyx
wwdzyx 谢谢,我可以采纳答案,只要你帮我直接写好程序,就是直接可以提交那种。
接近 3 年之前 回复

var a = new System.Data.DataTable().Compute(表达式, "");试试看看这个可不可以啊

http://blog.csdn.net/zwt0112/article/details/54562469
参考这个例子,稍微修改,加上%就可以了。

 // expcalc.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"


/*****************************************************  
File name:calculator  
Author:???    Version:1.0    Date: 2016-6-12  
Description:??????????,???,?,?,?,????????  
Calls : 1.insert_operand ()     ????  
        2.insert_oper()         ?????  
        3.compare()             ????????  
        4.deal_date()           ??????  
*****************************************************/  

#include <stdio.h>                          /*?????*/  
#include <stdlib.h>

#define MAX_SIZE 1024                       /*????*/  

int insert_operand(int *operand , int * top_num ,int num)           /*???????*/  
{  
    (*top_num) ++;  
    operand[*top_num] = num;                    /*????*/  

    return 0;                           /*????*/  
}  

int insert_oper (char * oper , int *top_oper , char ch)             /*????????*/  
{  
    (*top_oper)++;  
    oper[*top_oper] = ch;                       /*?????*/  

    return 0;                           /*????*/  
}  

int compare(char *oper , int *top_oper , char ch)                   /*????????*/  
{     

    if((oper[*top_oper] == '-' || oper[*top_oper] == '+')           /*???????????????????*/  
            && (ch == '*' || ch == '/' || ch == '%'))  
    {  
        return 0;                      /*??????*/   
    }  

    else if(*top_oper == -1 || ch == '('   
            || (oper[*top_oper] == '(' && ch != ')'))       /*??????????;????                                                               ????'('*/  
    {  
        return 0;                       /*??????*/  
    }  

    else if (oper[*top_oper] =='(' && ch == ')' )       /*???????????????*/  
    {  
        (*top_oper)--;  
        return 1;                       /*?()????*/  
    }  

    else  
    {  
        return -1;                                          /*????????*/  
    }  

}  

int deal_date(int *operand ,char *oper ,int *top_num, int *top_oper)    /*??????*/  
{  
    int num_1 = operand[*top_num];              /*??????????*/  
    int num_2 = operand[*top_num - 1];  

    int value = 0;  

    if(oper[*top_oper] == '+')                  /*????*/  
    {  
        value = num_1 + num_2;  
    }  

    else if(oper[*top_oper] == '-')             /*????*/  
    {  
        value = num_2 - num_1;  
    }  

    else if(oper[*top_oper] == '*')             /*????*/  
    {  
        value = num_2 * num_1;  
    }  

    else if(oper[*top_oper] == '/')             /*????*/  
    {  
        value = num_2 / num_1;  
    }  

    else if(oper[*top_oper] == '%')             /*????*/  
    {  
        value = num_2 % num_1;  
    }  


    (*top_num) --;                              /*?????????*/  
    operand[*top_num] = value;                  /*??????????*/  
    (*top_oper) --;                             /*??????????*/  

  return value;
}  

int main()  
{  
    int operand[MAX_SIZE] = {0};                /*???,???*/  
    int  top_num = -1;  

    char oper[MAX_SIZE] = {0};                  /*????,???*/  
    int top_oper = -1;  

    char *str = (char *) malloc (sizeof(char) * 100);               /*?????(??=)*/  
    scanf("%s",str);  

    char* temp;  
    char dest[MAX_SIZE];  
    int num = 0;  

    int i = 0;  
    while(*str != '\0')  
    {  
        temp = dest;  

        while(*str >= '0' && *str <= '9')           /*???????*/  
        {  
            *temp = *str;  
            str ++;  
            temp ++;                  
        }                               /*??????*/  

        if(*str != '(' && *(temp - 1) != '\0')      /*???????'('*/  
        {  
            *temp = '\0';  

            num = atoi(dest);               /*????????*/  
            insert_operand(operand, &top_num,num);      /*????????*/  
        }  

         while(1)  
         {  
             i = compare(oper,&top_oper,*str);      /*????????*/  

            if(i == 0)  
            {  
                insert_oper(oper,&top_oper,*str);   /*?????*/  
                break;  
            }  

            else if(i == 1)                         /*?????????????*/  
            {  
                str++;  
            }  

            else if(i == -1)                        /*??????*/  
            {  
                deal_date(operand,oper,&top_num,&top_oper);  
            }  

         }  

        str ++;                 /*??????????*/  
    }  

    printf("num = %d\n",operand[0]);        /*????*/  

    return 0;                       /*????*/  
}  
caozhy
回答这么多问题就耍赖把我的积分一笔勾销了 回复wwdzyx: 解决了么?
接近 3 年之前 回复
wwdzyx
wwdzyx 很感谢
接近 3 年之前 回复
wwdzyx
wwdzyx 他说我是新用户,不能提交回答里的图片。。。
接近 3 年之前 回复
wwdzyx
wwdzyx 好的
接近 3 年之前 回复
wwdzyx
wwdzyx haode
接近 3 年之前 回复
caozhy
回答这么多问题就耍赖把我的积分一笔勾销了 回复wwdzyx: 如果还有问题,如果是编译问题,贴出你的错误提示截图和使用的编译器软件和版本,如果是运行问题,贴出你输入的表达式和运行截图。明天我来看。先睡了。
接近 3 年之前 回复
caozhy
回答这么多问题就耍赖把我的积分一笔勾销了 回复wwdzyx: 如果你是在线oj,去掉inlude stdafx,并且,printf("num = %d\n",operand[0]);,去掉num = 。
接近 3 年之前 回复
caozhy
回答这么多问题就耍赖把我的积分一笔勾销了 回复wwdzyx: 发给你了。
接近 3 年之前 回复
wwdzyx
wwdzyx 测试的时候不管输入什么 都输出@
接近 3 年之前 回复
wwdzyx
wwdzyx Test case input* 1+2+3*4-5 Test case output* 10 Standard output* @
接近 3 年之前 回复
wwdzyx
wwdzyx 回复caozhy: 1741831676@qq.com
接近 3 年之前 回复
caozhy
回答这么多问题就耍赖把我的积分一笔勾销了 回复wwdzyx: 什么问题?我这里可以运行,看下图。留下邮箱,发你完整的项目
接近 3 年之前 回复
wwdzyx
wwdzyx 谢谢,但是测试有问题啊。。。
接近 3 年之前 回复

图片说明

立即提问