制作计算器

时间:2015-04-21 20:34:33

标签: c calculator

如果我除以2个数字(10/2/2),它将为我提供正确的解决方案。另外,当一个数字除以另一个数字时,如何找到余数。

  

我如何能够除以2个或更多数字?使用if-else语句。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>

void main()
{
    char operation = 0;
    double num1=0.0 ;
    double num2=0.0 ;
    printf("Enter the calculation\n");
    scanf("%f %c %f", &num1, &operation, &num2);

    switch (operation) {
    case '+':
        printf("= %f\n", num1 + num2);
        break;
    case '-':
        printf("= %f\n", num1 - num2);
        break;
    case '*':
        printf("= %f\n", num1*num2);
        break;
    case '/': 
        printf("= %f\n", num1 /(double)num2);
        break;
    case '%':
        printf("= %f\n", num1 % (double)num2);
        break;
    default:
        printf("Error!\n");
        break;
    }
    system("pause");
}

3 个答案:

答案 0 :(得分:1)

您可以使用%运算符

获取余数
  case '%':
        printf("= %d\n", (int)num1 %(int)num2);
        break;

对于多次划分数字,您需要改进输入解析,创建循环以执行多个操作并保存结果(可能为num1)。

答案 1 :(得分:1)

要获得您正在寻找的剩余部分,您必须将双方都投向int

    printf("= %d\n", (int)num1 % (int)num2);

要解析复杂的表达式,您需要完全不同的东西。现在你的代码只执行一次操作,因此可以忽略运算符的预测。但是当你进行连锁操作时,你需要注意这一点。与1 - 2 * 3一样,您的代码应该执行2*3,然后添加1。最简单的方法是使用递归的解析器:http://en.wikipedia.org/wiki/Recursive_descent_parser

以下是基本/简单的规则概念:

line       -> expression <EOF>
expression -> factor + expression 
              factor - expression
              factor
factor     -> term * factor
              term / factor
              term % factor
              term
term       -> ( expression )
              <number>

然后,每个规则的代码看起来都像这样:

double read_factor(...) {
    double first = read_term(...);
    double second = 0.0;
    switch(peek_next_symbol()) {
    case '*': 
        consume_symbol();
        second = read_term();
        return first * second;
    case '/': 
        consume_symbol();
        second = read_term();
        if (second == 0)
            throw std::logic_error("div/0");
        return first / second;
    case '%': 
        consume_symbol();
        second = read_term();
        if (second == 0)
            throw std::logic_error("mod/0");
        return (double)((int)first % (int)second);
    default:
        return first;
    }
}

然后术语看起来像这样:

double read_term() {
    double first = 0.0;
    switch(peek_next_symbol()) {
    case '(':
        consume_symbol();
        first = read_expression();
        if (peek_next_symbol() != ')')
            throw std::logic_error("missing )");
        consume_symbol();
    default:
        return read_number();
    }
}

我引用的每个函数都相对复杂,并且有大量的状态被传递。现在我已经简要地解释了这个理论,这是一个很小的工作样本:http://ideone.com/wVqRw

答案 2 :(得分:0)

剩余和modulo相似,但通常略有不同。

在C中,%是除法后的余数。在C中,modulo没有为整数定义。

FP编号存在

fmod(),它也是“x/y的浮点余数。”

要获得浮点“余数运算符”,代码可以使用

case '%':
        {
        printf("= %f\n", fmod(num1, num2));
        break;
        }

在数学中,模运算的结果通常被定义为欧几里德分裂的余数。如果代码想要Euclidean division来获取模数:

case 'M':
        {
        double quot = floor(num1/num2);
        double rem = num1 - quot * num2;
        printf("= %f\n", rem);
        break;
        }

注意:建议使用"%g""%e"进行打印。