Использование циклов while вместо pow: что означает эта ошибка? - PullRequest
1 голос
/ 02 апреля 2019

Я пытаюсь создать некоторый код с программированием на C, который может показывать число с определенной степенью с обоими значениями, указанными пользователем. Я хочу использовать pow для первой части и цикл while для второй. Тем не менее, я столкнулся с ошибкой в ​​этом текущем коде, от которой я не могу избавиться.

Вот ошибка, с которой я не знаком:

error: invalid operands to binary * (have ‘int (*)(int,  int)’ and ‘int’)
       result2 = result2 * base;

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

Я пытался исследовать "long", но у меня еще не было опыта в этом учебнике C, поэтому я хотел бы воздержаться от его использования, если это возможно.

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

int result2(int base, int exponent);

int main(void)
{
    double base;
    double exponent;
    double result1;

    puts("Please enter a value as the base and another as the exponent.");
    scanf("%lf%lf", &base, &exponent);

    result1 = pow(base, exponent);

    printf("Library solution: %lf\n", result1);

    printf("My solution: %d\n", result2(base, exponent));
}

int result2(int base, int exponent)
{
    int i;


    for(i=1; i<=exponent; i++)
    {
        result2 = result2 * base;
    }
    return;
}

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

Ответы [ 2 ]

2 голосов
/ 02 апреля 2019
int result2(int base, int exponent)
{
    int i;

    for(i=1; i<=exponent; i++)
    {
        result2 = result2 * base;
    }
    return;
}

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

int result2(int base, int exponent)
{
    int i;
    int result = 1;

    for(i=1; i<=exponent; i++)
    {
        result = result * base;
    }
    return result;
}

Еще лучше, дать функции другое имя. result2 звучит как имя переменной. Функция должна быть названа как-то, что указывает на то, что она делает. Поскольку pow взято, как насчет power?

int power(int base, int exponent)
{
    int result = 1;

    for (int i=1; i<=exponent; i++)
    {
        result *= base;
    }

    return result;
}

Некоторые другие небольшие улучшения объявляют int i внутри цикла for и используют result *= base в качестве сокращения для result = result * base.

0 голосов
/ 02 апреля 2019

Я сделал несколько изменений в вашем коде.

1) Переименованная функция result2 в my_exp. result2 звучит как переменная.

2) Измените типы для функции от my_exp до int, чтобы она соответствовала типам переменных main.

3) Добавьте переменную result в my_exp для хранения частичного результата цикла for.

4) Объявлено i внутри for декларации.

5) позвоните pow и my_exp внутри printf и удалите result1 больше не нужно.

6) Изменен способ вычисления result в более компактном виде.

большинство этих изменений косметические, за исключением изменений типов.

int my_exp(int base, int exponent);

int main(void)
{
    int base;
    int exponent;

    puts("Please enter a value as the base and another as the exponent.");
    scanf("%i", &base);
    scanf("%i", &exponent);

    printf("Library solution: %i\n", pow(base, exponent));
    printf("My solution: %i\n", my_exp(base, exponent));
}

int my_exp(int base, int exponent)
{
    //int i;
    int result;
    result = 1;

    for(int i=1; i<=exponent; i++)
    {
        result *= base;
    }
    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...