使用C语言制作计算器

时间:2014-02-20 13:49:08

标签: c string calculator

您好我正在尝试制作一个计算器,用户将练习(放入一个字符串)并转移到乘法除法加法和减法的四个函数中,我的函数已经准备就绪,但我有两个主要问题需要我你的帮助。

所以这是我的第一个问题是,当我把我的函数(char函数)我的程序崩溃但是当我运行相同的函数(在主函数中)时,它没有问题。所以我很想知道为什么会这样,以及如何解决它。

第二个问题是如何让所有功能让自己多次(递归),所以如果你能帮助我做一个功能来做到这一点,我很感激。

另一个小问题如果你可以帮助我并让函数将原始字符串返回(返回)到下一个函数,我会很高兴。

我的代码 -

#include <stdio.h>
#include <string.h>

char multiplication(char str[]);

int main()
{
    char str[99] = "3-5+5*7";
    multiplication(str);
    return(0);
}

char multiplication(char str[])
{
    char strp[99];
    char str1[99] = {0};
    char str2[99];
    char mul[99] = "*";
    char old[99];
    char *rev;
    int i, k, j = 0, aPos, zPos, len;
    int sum,sum1,sum2;
    static char buffer[4096];
    char *p;

    len = strlen(str);
    strcpy (strp, str);
    aPos = zPos = -1;

    for(i =0; i<len; i++)
    {
        if(str[i] ==  '+' )
        {
            aPos = i;
        }
        else if(str[i] == '*')    
        {
            zPos = i;
            break;
        }
    }

    if(aPos != -1 && zPos != -1)
    {
        for(k=0, i=zPos-1;i>aPos;--i,++k)
        {
            str1[k]=str[i];
        }
    }

    rev = strrev(str1);

    for(i = 0; i<10; i++)
    {
        if(strp[i] == '*')
        {
            while(strp[i+1] != '+' || '\0')
            {
                str2[j++] = strp[++i];
            }
        }
    }

    old[0] = '\0';
    strcat(old,str1);
    strcat(old,mul);
    strcat(old,str2);

    sum1 = atoi (str1);
    sum2 = atoi (str2);
    sum = sum1 * sum2;  

    str2[j] = '\0'; 
    sprintf(str2,"%d",sum);

    if(!(p = strstr(str, old)))
        printf("%s",str);
    strncpy(buffer, str, p-str); // Copy characters from 'str' to the new string
    buffer[p-str] = '\0';
    sprintf(buffer+(p-str), "%s%s", str2, p+strlen(old));
    printf("%s",buffer);
}

感谢任何可以帮助我的人,我非常感激

1 个答案:

答案 0 :(得分:0)

此问题的最佳方法通常是将Shunting Yard Algorithim转换为infix notationReverse Polish Notation。我想你会发现this blog有助于理解分流码算法的一些实现来创建这种求解器。我还建议您阅读shunting yard algorithmRPN上的维基百科页面。

使用这些资源,您会发现将infix notation转换为RPN的最有效方法是使用shunting yard algorithm。然后,在代码中评估您的RPN等式(使用堆栈数据结构......继续阅读)是微不足道的。为了完成所有这些,我建议您了解stack data structure及其在C / C ++中的实现检查this implementation of a stack at cprogramming.comthis implementation from the cs department at MITthis implementation from the cs department at Boston University

cprogramming.com reference更像是C ++实现,因为它使用模板。如果您只想要代码,请查看link from MIT