Почему мой калькулятор не работает, я пишу его на C

#c

#c

Вопрос:

Я пытаюсь использовать указатель в этом коде. но это не работает, это должно быть

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

void scan_data(char sign, float num);
float do_next_op( float num, float* sum);

int main()
{
    printf("Press enter");
    scan_data('x',1);
    return 0;
}
void scan_data(char sign, float num)
{
    char op, symbol;
    float sum;
    sum = 0;

    while (op!='q'||op!='Q') {
     scanf("%c", amp;symbol);
        printf("Enter an operator [^,*,/, ,-, q(quit)n");
        scanf("%c", amp;op);

        if(op=='q'||op=='Q')
        {
            printf("The final result is %1.2fn", sum);
            exit(0);
        }

        else
        {
            printf("Enter a number to calculate for: ");
            scanf("%f", amp;num);
            printf("%c%1.2fn",op, num);
            sum =do_next_op(num, amp;sum);
        }

}
}


float do_next_op(float num, float* sum)
{


    switch('x')
    {


        case(' '):

            *sum= *sum num;
            printf("The result so far is %1.2fn", sum);

            return *sum;
    }
}
  

Мое упражнение состоит в том, чтобы создать простой калькулятор, который может вычислять эти операторы — * / и ^ . Каждый раз, когда я даю программе число и оператор, она выдает мне результат, затем сохраняет предыдущий результат и продолжает вычислять число и оператор, пока я не нажму q.

Вот как это будет выглядеть.

  Enter operator, and an optional operand:   5.000000 
Result so far is 5.000000. 
Enter operator, and an optional operand: - 6.000000 
Result so far is -1.000000.
 Enter operator and an optional operand: * 3.000000
 Result so far is -3.000000. 
Enter operator, and an optional operand: q
Final result is: 0.083333
and here is my code which doesn't work
  

этот код может выполняться, но он не сохраняет значение операнда.
вот диалог между мной и программой

   Press enter
Enter an operator [^,*,/, ,-, q(quit)
 
Enter a number to calculate for: 5
 5.00
Enter an operator [^,*,/, ,-, q(quit)
 
Enter a number to calculate for: 5
 5.00
Enter an operator [^,*,/, ,-, q(quit)
  

Он не печатает этот код "printf("The result so far is %1.2fn", sum);" почему?

Комментарии:

1. 1) Код, который вы опубликовали, не кажется полным. Пожалуйста, не забудьте опубликовать код, который можно успешно скомпилировать и запустить. 2) switch('x') не кажется правильным 3) sum= amp;sum num; тоже не кажется правильным. 4) Вопрос: вы получаете ошибку компиляции или ошибку времени выполнения ??? 5) Пожалуйста, обновите свой пост и скопируйте / вставьте ТОЧНОЕ СООБЩЕНИЕ ОБ ОШИБКЕ .

2. измените [ sum= amp;sum num; ] на [ *sum = *sum num; ], чтобы исправить эту ошибку

3. В функции do_next_op() параметром sum является a float * . Чтобы получить доступ к значению, на которое sum указывает, вы должны использовать унарный * оператор: *sum = *sum num , например.

4. @FoggyDay что я должен изменить при переключении (‘x’)?. моя ошибка — это просто недопустимые операнды для binary (имеют ‘float *’ и ‘float’) c

5. Научитесь использовать отладчик, такой как GDB

Ответ №1:

Похоже, в вашем коде есть несколько проблем

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

/* you included a library header you dont use */

void scan_data(char sign, float num);
/* pass symbol char to do_next_op so you can test which symbol was 
entered and test against in the function */
float do_next_op( float num, float* sum, char symbol);

int main()
{
    printf("Press enter");
    scan_data('x',1);
    return 0;
}
void scan_data(char sign, float num)
{
    char op, symbol;
    float sum;
    sum = 0;

    while (op!='q'||op!='Q') {
        scanf("%c", amp;symbol);
        printf("Enter an operator [^,*,/, ,-, q(quit)] ");
        scanf("%c", amp;op);

        if(op=='q'||op=='Q')
        {
            printf("The final result is %1.2fn", sum);
            exit(0);
        }

        else
        {
            printf("Enter a number to calculate for: ");
            scanf("%f", amp;num);
            printf("you eneterd symbol: %c and number is:%1.2fn",op, num);
            sum  = do_next_op(num, amp;sum, symbol);
   /* sum is a cumlative operation use  = not = */
        }
    }
}

float do_next_op(float num, float* sum, char symbol) {
 /*  you use switch statment with a char which i dont know why or how it can be used use if statements instead to see which symbol entered 
as a result pass symbol to do_next_op function */
    if (symbol == ' ') {
/* also use  = instead of = as sum is cumaltive process you don't want to overwrite previous result */
/* also dereference pointer first as function is accepting pointers to floats not floats itself 
dereference is done by * not amp;(this give address not value pointed by address)*/
        *sum  = (*sum   num);
        printf("The result so far is %1.2fn", sum);
        return *sum;
    }
}
  

Я попытался отметить некоторые ошибки в коде, чтобы вы могли знать его место. небольшое примечание, что вывод (сумма) отображается при выходе только в виде опубликованного вами кода, а код имеет дело только с операциями

Комментарии:

1. Спасибо за помощь, но когда я запускаю этот код, он не вычисляет предыдущий результат, если я не нажму q, чтобы завершить цикл следующим образом Нажмите enter Введите оператор [^, ,/, ,-, q (выйти)] Введите число для вычисления: 5 вы вводите символ: и число:5.00 Введите оператор [^, ,/, ,-, q (выйти)] Введите число для вычисления: 5 вы вводите символ: и число:5.00 Введите оператор [^,*,/, ,-, q (выйти)] q Конечный результат равен 10.00

2. @BonPrasertsuwan это может быть добавлено простым printf после вашего вызова do_next_op , main я не хотел добавлять, так как я пытался сосредоточиться на ошибках, а не на улучшениях, но в любом случае это простое решение.используйте printf("sum now is: %fn", sum); место после sum = do_next_op(num, amp;sum, symbol);