Создание калькулятора на С - PullRequest
0 голосов
/ 13 ноября 2010

Как я могу создать калькулятор в C без использования if else и switch case?

Вот код на данный момент:

void main()

{

    int a,b,sum,sub,pro,divide; /** sum is for addition,,sub is for subtraction,,pro is for product,,divide is for division**/
    char operator;
    clrscr();      
    printf("enter a value:");
    scanf("%d",&a);      
    printf("enter another value:");
    scanf("%d",&b);
    printf("enter a operator:");
    scanf("%c",&operator);

    operator=='+';
    sum=a+b;
    printf("\nAnswer=%d",sum);
    operator=='-'
   sub=a-b;
    printf("\nAnswer=%d",sub);
    operator=='*';
    pro=a*b;
    prinf("\nAnswer=%d",pro);
    operator=='/';
    printf("\nAnswer=%d",divide);
    getch();  

}

Ответы [ 7 ]

4 голосов
/ 13 ноября 2010

Следующее должно сделать трюк. Он избегает использования if else и switch, используя тот факт, что сравнение оператора с +, -, * или / вернет 1 только для одного из сравнений 0 для остальных. Следовательно, результатом является сумма этих сравнений, умноженная на математическое выражение, соответствующее каждому оператору:

#include<stdio.h>

main(){
    float a,b,result;
    char oper [2];
    printf("enter a value:");
    scanf("%f",&a);
    printf("enter another value:");
    scanf("%f",&b);
    printf("enter an operator:");
    scanf("%1s", oper);
    result = (oper[0] == '+') * (a + b) +
             (oper[0] == '-') * (a - b) +
             (oper[0] == '*') * (a * b) +
             (oper[0] == '/') * (a / b);
    printf("%4.2f %s %4.2f = %4.2f\n", a, oper, b, result);
}

При сохранении в файл с именем calculator.c скомпилирует его следующая команда:

gcc calculator.c

Вывод будет называться a.out, и его можно запустить так:

./a.out
enter a value:24
enter another value:4
enter an operator:/
24.00 / 4.00 = 6.00

Я использовал gcc (GCC) 4.4.1 20090725 (Red Hat 4.4.1-2), но я уверен, что другие версии будут работать так же хорошо.

Дайте мне знать, если я выполню ваше задание; -)

2 голосов
/ 14 ноября 2010

На самом деле, я думал о решении, которое удовлетворяет условию назначения и не является полностью запаздывающим.

Вы можете создать функцию для каждой операции;он принимает два входа в качестве аргументов и возвращает результат.Затем вы можете создать таблицу указателей на эти функции, проиндексированную символом оператора.

Затем вы можете выполнить функцию через указатель.

int multiply(int a, int b)
{
  return a * b;
}

/**
 * do the same for add, subtract, and divide
 */

int main(void)
{
  int a, b;
  char op;
  /** 
   * create an array of pointers to functions indexed by 
   * character values; we will only be using four of these entries,
   * but this allows us to index the array using the operator
   * character directly instead of having to do any mapping.
   * We're trading some unused space for simplicity.
   */
  int (*func_table[128])(int, int);

  /**
   * Set the table entries for each operator.
   */
  func_table['*'] = multiply;
  /**
   * Do the same for each of '-', '+', '/'
   */
  ... 

  /**
   * After reading in a, b, and the operator, execute
   * the function through the lookup table
   */
  result = (*func_table[op])(a, b);

Presto;нет контрольных структур.

Я не хотел размещать это по нескольким причинам.Во-первых, это в основном раздает магазин.Во-вторых, я сомневаюсь, что вы уже обсуждали функциональные указатели в классе.Я понятия не имею, что ожидает ваш инструктор;Я сомневаюсь, что это так.

1 голос
/ 13 ноября 2010

Как отмечается в комментариях, код сталкивается с проблемами.Попробуйте это простое switch-case утверждение:

switch(op) {
    case '*': printf("%d",a*b); break;
    case '/': printf("%d",a/b); break;
    case '+': printf("%d",a+b); break;
    case '-': printf("%d",a-b); break;
    default: printf("Unknown operator."); break;
}

Все остальное вы будете обрабатывать, верно?

[РЕДАКТИРОВАТЬ]

ОК, я думал, что это ПРЕДЛОЖЕНО для использованияa switch-case.

Как насчет этого:

int result = 0;
result = (op == '*') ? a * b : result;
result = (op == '/') ? a / b : result;
result = (op == '+') ? a + b : result;
result = (op == '-') ? a - b : result;
printf("%d",result);

Нет if-else или switch-case :) Вы также можете вкладывать операторы, если хотите (но это невозможно прочитать).

1 голос
/ 13 ноября 2010

Вы должны быть в состоянии решить эту проблему, поместив оператор и значения в стек, а затем просто "выполните" стек.

Поскольку это, вероятно, домашнее задание, я оставляю вам задачу выполнить его:)

0 голосов
/ 23 ноября 2010

я думаю, что это тоже будет работать

# include "stdio.h"
# include "conio.h"
 void main()
    {
float a , b;
char c;

printf("Value 1:");
scanf("%f",&a);
printf("value 2:");
scanf("%f",&b);
printf("Enter a operator[ + - * /]\n");
c=getche();

(c=='+')&&(printf("\nAnswer is:%3.2f",a+b));
(c=='-')&&(printf("\nAnswer is:%3.2f",a-b));
(c=='*')&&(printf("\nAnswer is:%3.2f",a*b));
(c=='/')&&(printf("\nAnswer is:%3.2f",a/b));
getch();
    }
0 голосов
/ 21 ноября 2010
void main()

{

    int a,b,sum,sub,pro,divide; /** sum is for addition,,sub is for subtraction,,pro is for product,,divide is for division**/
    char operator;
    clrscr();      
    printf("enter a value:");
    scanf("%d",&a);      
    printf("enter another value:");
    scanf("%d",&b);
    printf("enter a operator:");
    scanf("%c",&operator);

    operator=='+'? printf("%d,a+b"): ;
    //same goes for all the other operators

    getch();  

}
0 голосов
/ 13 ноября 2010

В C сравнения имеют значение.1, если истина, 0, если ложь.Может быть, вы можете использовать это вместо запрещенного if

(operator == '+') /* this is either 0 or 1 */
(operator == '-') /* this is either 0 or 1 */
(operator == '*') /* this is either 0 or 1 */
(operator == '/') /* this is either 0 or 1 */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...