У меня есть программа. Это простой калькулятор. Он оценивает числа, которые приведены в форме 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
Но я не знаю, как его изменить. Я пробовал разные способы, и все терпит неудачу. У меня также проблема с делением на 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);
}
}
Действительно ли необходимо буферизировать все, пока не будут прочитаны все строки? Для большинства целей лучше читать строку, выводить результат и повторять ее до EOF. Можете ли вы объяснить, почему это невозможно с вашей заявкой? – Ctx
Как сказал @Ctx, в большинстве случаев это совсем не обязательно. А также, если входы известны заранее, вы можете вставить всю последовательность ввода в консоль. В этом случае вход идет первым, а затем выходы. – lU5er
@Ctx Это хорошая идея. Интересно, как я мог реализовать это в своей программе. Я должен использовать функцию sscanf? –