Неточные ответы на программу-калькулятор на C

Итак, я немного изучаю C и сделал простой калькулятор, который будет выполнять некоторые базовые вычисления в зависимости от того, что вводит пользователь. Программа использует структуру переключателей, и это все. Каждый раз, когда я ввожу расчет, я получаю 0,000000. Ошибок нет, просто неправильные ответы. Программа была создана с использованием VS Code. Программа:

/*
The problem is to write a simple calculator that can add, subtract, multiply, divide, and find the 
remainder when one
number is divided by another. The program must allow the calculation that is to be performed to be 
keyed in a natural
way, such as 5.6 * 27 or 3 + 6.
*/

#include<stdio.h>

int main(int argc, char* argv[])
{
  //declare and initialise objects
  double num1 = 0.0; //1st operand value
  double num2 = 0.0; //2nd operand value
  char operation; //operations that will be performed: +, -, *, /, %

  //user input
  printf("Enter the calculation: ");
  scanf("%1f %c %1f", &num1, &operation, &num2);

  //calculations
  switch (operation)
  {
    case '+':
        printf(" = %1f\n", num1 + num2);
        break;
    
    case '-':
        printf(" = %1f\n", num1 - num2);
        break;

    case '*':
        printf(" = %1f\n", num1*num2);
        break;

    case '/':
        if (num2 == 0) //can't divide by zero
        {
            printf("\n\nDivision by zero error!\n");
        }
        else
        {
                printf(" = %1f\n", num1/num2);
        }
        break;
        
    case '%':
        if ((long)num2 == 0) //can't divide by zero
        {
            printf("\n\nDivision by zero error!\n");
        }
        else
        {
                printf(" = %1ld\n", (long)num1 % (long)num2);
        }
        break;

    default:
        printf("\n\naIllegal Operation!"); //operation is illegal if we get to here
        break;
        
}
//end of program
return 0;
}

Пример:

Enter the calculation: 4.7-3.2
= 0.000000

Я чувствую, что проблема очень проста, однако Google подвел меня, потому что мой «поиск» кажется слишком конкретным. Любой, у кого есть представление о том, что здесь происходит, будет очень признателен.

Показать пример ввода. Проверьте возвращаемое значение scanf().

underscore_d 18.12.2020 18:35

Пожалуйста, включите предупреждения компилятора и попытайтесь понять, что они означают. Есть 3 предупреждения, которые очень связаны с этой проблемой.

Random Davis 18.12.2020 18:42

Если вы компилируете с помощью GCC , используйте gcc -Wall -Wextra -g, а затем GDB

Basile Starynkevitch 18.12.2020 18:57

Теперь у вас есть %1f, но должно быть %lf. Это строчная буква L, а не цифра.

Nate Eldredge 18.12.2020 18:57
Почему в Python есть оператор &quot;pass&quot;?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
1
4
156
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы обязательно должны использовать и понимать предупреждения компилятора. Если бы вы поняли их причины, а затем обратились к ним, не было бы необходимости писать здесь. Это предупреждения, которые я получаю при компиляции кода, который вы изначально опубликовали:

main.c:12:11: warning: format ‘%f’ expects argument of type ‘float *’, but argument 2 has type ‘double *’ [-Wformat=]                                                              
main.c:12:17: warning: format ‘%f’ expects argument of type ‘float *’, but argument 4 has type ‘double *’ [-Wformat=]                                                              
main.c:47:30: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long int’ [-Wformat=]

Предупреждения о нарушениях находятся в вашем scanf, а printf в случае '%' для печати уравнения.

Чтобы прочитать значение double через scanf, спецификатором формата является %lf, а не %f.

См.: Чтение двойных значений с помощью scanf в c

Чтобы распечатать значение long int через printf, спецификатором формата является %ld, а не %d.

Смотрите: Каков аргумент для printf, который форматирует длинное?

Итак, ваш код должен иметь:

scanf("%lf %c %lf", &num1, &operation, &num2);

И (по сравнению с тем, что было в вашем исходном посте, в котором только что было %1d):

printf(" = %1ld\n", (long)num1 % (long)num2);

Другие вопросы по теме