2016-12-22 2 views
1

У меня есть программа. Это простой калькулятор. Он оценивает числа, которые приведены в форме 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); 
     } 
} 
+4

Действительно ли необходимо буферизировать все, пока не будут прочитаны все строки? Для большинства целей лучше читать строку, выводить результат и повторять ее до EOF. Можете ли вы объяснить, почему это невозможно с вашей заявкой? – Ctx

+0

Как сказал @Ctx, в большинстве случаев это совсем не обязательно. А также, если входы известны заранее, вы можете вставить всю последовательность ввода в консоль. В этом случае вход идет первым, а затем выходы. – lU5er

+0

@Ctx Это хорошая идея. Интересно, как я мог реализовать это в своей программе. Я должен использовать функцию sscanf? –

ответ

0

Вам нужно создать 2D-массив вашей строки, чтобы принять несколько выражений, как:

char string[10][200]; 

Цикл по ваш массив выражений и оценить с помощью ваших функций оценки и сохранить результаты в любом массиве 1D.

Чтобы сделать оценку с нулевым делением, сделайте проверку в своем isValidExpression() и получите ответ if ops[0]=='/' and f2==0.

Смежные вопросы