Member 13999874 Ответов: 2

Запустите переключатель для символов (=, -, *, /, %) в цикле while


Я пытаюсь написать программу для проекта класса, которая создает работающий общий калькулятор, который принимает +,-,*,/,%. У меня есть оператор switch, который вычисляет значение для оператора. Я борюсь с тем, чтобы включить переключатель в оператор while или do while, чтобы запустить его в цикле.
Изначально я не могу получить условие для вставки в оператор while (то есть while (num < 0)). Калькулятор должен уметь принимать все целые числа, как положительные, так и отрицательные, но не должен работать для поплавков.
Моя теория состоит в том, чтобы запустить начальный оператор switch для начального пользовательского выражения (т. е. 6 + 7), который будет вычислять это выражение. Затем я хочу сохранить это значение во временное целое число. Затем запустите цикл while, который вызывает функцию switch. Таким образом, пользователь может ввести что-то вроде * 8, которое будет оценено с предыдущим итогом. Калькулятор должен работать непрерывно до тех пор, пока не будет получен неверный ввод.
Я не могу придумать другого способа запустить этот калькулятор, но я также не могу заставить его работать.
Это действительно грубый код. Я действительно Новичок в C, поэтому я знаю, что он не идеален.

Что я уже пробовал:

#include <stdio.h>
int calculator(int num1, char operator, int num2);

int secondCalculator(int temp, char operator, int num2);

int main(void) {
  int num1 = 0;
  int num2 = 0;
  int temp = 0;
  int result = 0;
  char operator;

  scanf("%d %c %d", &num1, &operator, &num2);

  while(0 <= num1 || num1 < 0) {
    int calculator(int num1, char operator, int num2);

    //temp = temp;

    scanf("%c %d", &operator, &num2);

    int secondCalculator(int temp, char operator, int num2);

  }

  return 0;
}
int calculator(int num1, char operator, int num2) {
  switch(operator) {
  case '+':
    printf("%d ", num1 + num2);
    break;

  case '-':
    printf("%d ", num1 - num2);
    break;

  case '*':
    printf("%d ", num1 * num2);
    break;

  case '/':
    printf("%d ", num1 / num2);
    break;

  case '%':
    printf("%d ", num1 % num2);
    break;

  default:
    printf("Thank you for using the COP2220 calculator.");
return num2;
}
int secondCalculator(int temp, char operator, int num2) {
  switch(operator) {
  case '+':
    printf("%d ", temp + num2);
    break;

  case '-':
    printf("%d ", temp - num2);
    break;

  case '*':
    printf("%d ", temp * num2);
    break;

  case '/':
    printf("%d ", temp / num2);
    break;

  case '%':
    printf("%d ", temp % num2);
    break;

  default:
    printf("Thank you for using the COP2220 calculator.");
return num2;
}
}
}

2 Ответов

Рейтинг:
8

Richard MacCutchan

Вы могли бы сделать что-то вроде:

#include <stdio.h>
#include <stdlib.h>

int calculate(int num1, char op, int num2)
{
    int answer = 0;
    switch (op)
    {
    case '+':
        answer = num1 + num2;
        break;
    case '-':
        answer = num1 - num2;
        break;
    // ... other operations follow
    }

    return answer;
}

int main()
{
    int num1, num2;
    char op;
    
    do
    {
        int count = scanf("%d %c %d", &num1, &op, &num2);
        if (op == '0')
            break;
        // call the calculator and display the result
        int result = calculate(num1, op, num2);
        printf("result of %d %c %d is %d\n", num1, op, num2, result);
    } while (1); // repeat until user types 0 0 0
}


Member 13999874

Я попробовал это сделать, но ничего не вышло. Он выполняет сканирование, но ничего не выводит. Это похоже на то, что он не войдет в функцию переключателя.

Richard MacCutchan

См. раздел обновленное решение.

Рейтинг:
2

OriginalGriff

Посмотри на свою петлю:

while(0 <= num1 || num1 < 0)
так что если num1 отрицательно, тест проходит. Или, если num1 нуль он проходит. В противном случае, если он положительный, он проходит. Так что в основном это так:
while(true)


Но... этот код не будет компилироваться.
secondCalculator не возвращает значение во всех случаях, потому что ваш return заявление внутри выключателя, а не снаружи.
calcuator делает то же самое, за исключением secondCalculator объявляется внутри него, что не допускается в с.
И вообще, почему у вас есть две одинаковые функции с разными именами?

Во-первых, закомментируйте все функции калькулятора и вызовы к ним.
Измените свой цикл, чтобы он имел некоторый смысл, и используйте возвращаемое значение из scanf для проверки ошибок ввода.
Затем просто распечатайте значения, которые Вы читаете внутри цикла, чтобы проверить работу цикла.

Затем начните раскомментировать свои функции и исправьте проблемы, о которых я упоминал. И получите правильный отступ - это делает чтение кода намного проще!


Member 13999874

Я не знаю, что означает ваш код. Я никогда не видел ничего подобного в своем классе. Мой отступ-это то, что требует мой профессор, так что это единственный способ, которым я знаю, как отступать.
Причина, по которой у меня есть два отдельных калькулятора, заключается в том, что пользователь сначала вводит полное выражение (5 + 9), но затем после этого использует только ввод оператора и одно число ( + 9), которое будет добавлено к сумме с первого ввода. Насколько я могу судить, это единственный способ заставить программу работать правильно.
Возврат должен быть вне функции переключателя? Когда мы рассматривали функции в классе, возврат должен был быть внутри }.

OriginalGriff

Посмотрите на свой код: он заканчивается тремя близкими фигурными скобками в одном столбце - это хороший признак того, что ваш отступ где - то испорчен!

Каждый раз, когда вы пишете { перемещение следующего кода вплоть до закрытия }.
Простой.
Мне все равно, какой стиль отступа вы используете (даже если он настолько плох, как требует Ваш репетитор), пока он согласован во всем приложении. Это не так, и это проблема!

Ну да - но они же одинаковые! Измените имена параметров, и они будут абсолютно идентичны.
Вам нужен только один: просто назовите его с разными значениями.