我有一个程序。这是一个简单的计算器。它评估以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);
}
}
答案 0 :(得分:1)
您需要创建字符串的2D数组以接受多个表达式,例如:
char string[10][200];
遍历表达式数组并使用您的评估函数进行评估,并将结果存储在任何一维数组中。
要进行零分检查,您可以检查isValidExpression()
并返回错误if ops[0]=='/' and f2==0
。