更改程序以使用多行

时间:2016-12-22 13:51:22

标签: c function if-statement

我有一个程序。这是一个简单的计算器。它评估以1 + 3形式给出的数字。我有一个问题。我需要修改程序以使用多行。我应该这样:

1 + 3  //input 
1 * 9  //input in another line
6 / 2  //input in another line
ctrl+z

result first 
result second
result third

但我不知道如何修改它。我尝试了diffrend方式,但都失败了。我也有问题除以0.我不知道如何对它进行例外处理。

main.c

#include <stdio.h>
#include "tools.h"

int main(void) {
    char string[100];
    int result;
    result = InterCalc(string, sizeof(string));
    Calc(result, string);
    return 0;
}

tools.c

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <float.h>
#include "tools.h"

static float f1, f2;
static char op;

int isValidExpression(const char *str)
{
    int res;
    char ops[10];
    res=sscanf(str, "%f %s %f", &f1, ops, &f2);
    if (res==3) {
        if (ops[0]=='+' || ops[0]=='-' || ops[0]=='^' || ops[0]=='*' || ops[0]=='/')
            {
                op=ops[0];
                return 1;
            }
            else return 0;
    }
    else return 0;
}

int getOperator()
{
    return(op);
}

float getFstOperand()
{
    return(f1);
}

float getSecOperand()
{
    return(f2);
}

float getExprValue(void) {
    switch (getOperator()) {
    case '+':
        return getFstOperand() + getSecOperand();
    case '-':
        return getFstOperand() - getSecOperand();
    case '/':
        return getFstOperand() / getSecOperand();
    case '*':
        return getFstOperand() * getSecOperand();
    case '^':
        return pow(getFstOperand(), getSecOperand());
    default:
        return 0;
    }
}

int InterCalc(char *my_string, size_t size) {
    if (fgets(my_string, size, stdin) == NULL ||  strcmp(my_string, "exit\n") == 0) {
        printf("Program ended\n");
        return 0;
    } else
    if (isValidExpression(my_string) == 0) {
        printf("Expression error\n");
        return 0;
    } else {
        return 1;
    }
}

void Calc(int a, char *str)
{
    float calculation_value;
        if (a==1) {
            calculation_value = getExprValue();
            printf("The result of %s is %f.\n", str, calculation_value);
        }
}

1 个答案:

答案 0 :(得分:1)

您需要创建字符串的2D数组以接受多个表达式,例如:

char string[10][200];

遍历表达式数组并使用您的评估函数进行评估,并将结果存储在任何一维数组中。

要进行零分检查,您可以检查isValidExpression()并返回错误if ops[0]=='/' and f2==0