Параметр функции получает целое число «b», но выдает случайное число (функция, вызывающая функцию) - PullRequest
0 голосов
/ 19 мая 2018

Я прокомментировал, где проблема в коде ниже, когда вызывается функция pow, параметр exp сходит с ума.Цель кода - получить пользовательский ввод и решить это выражение x / (1 + t) ^ n.

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

float val();
float pow();

float val(float x, int n, float t) {

    float res = 0;

    for (int i = 0; i < n; i++) {
        printf("exp = %d\n", i+1); // real value exp start equals 1
        res += x / pow(1 + t, i+1);
    }
    return res;
}

float pow(float base, int exp) {
    int i = 0;
    float res = 1;
    printf("exp = %d", exp); // here starts the problem 
    if (exp == 1) {
        return base;

    }
    while (i < exp) {
        res *= base;
        i++;
        printf("i = %d\n", i);
        printf("exp = %d\n", exp);
        getchar();
    }
    return res;
}

main() {
    int n;
    float x, t, res;

    printf("type x,n,t\n");
    scanf("%f %d %f", &x, &n, &t);
    res = val(x, n, t);
    printf("VAL = %f\n", res);


}

Вывод:

type x,n,t
6
2
2
exp = 1
exp = 1074266112i = 1
exp = 1074266112
i = 2
exp = 1074266112

Что происходит, ребята?спасибо за внимание :) 1007 *

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

pow:

float pow(float base, int exp) 
{

    float res = 1;
    if (exp > 0)
    {
         while(exp --)
         {
            res *= base;
         }
    }
    else
    {
        while(exp ++)
        {
            res /= base;
        }
    }

    return res;
}

main() 
{
    int i;
    for (i = -5; i <= 5; i++)
    {
        printf("5 ^^ %d = %f\n", i, pow(5.0f,i));
    }
}

и завершено

#include <stdio.h>

float power(float base, int exp) 
{

    float res = 1;
    if (exp > 0)
    {
    while(exp --)
    {
            res *= base;
    }
    }
    else
    {
    while(exp ++)
    {
        res /= base;
    }
    }

    return res;
}

float eq(float x, float t, int n)
{
    return x / power(1 + t, n); 
}

int main() 
{
    float x,t;
    int i,n;

    for (i = -5; i <= 5; i++)
    {
        printf("5 ^^ %d = %f\n", i, power(5.0f,i));
    }

    scanf("%f %f %d\n", &x, &t, &n);
    printf("x = %f, t = %f, n = %d\n", x, t, n);
    printf("1/(1+t)^^n = %f", eq(x, t, n));
}
0 голосов
/ 19 мая 2018

Не используйте устаревшие не прототипированные предварительные объявления устаревшего стиля:

float val();    /* This syntax should never be used */
float pow();

Когда вы объявляете функцию, объявляете ее полный прототип:

float val(float x, int n, float t);
float pow(float base, int exp);

Также рассмотрите возможность использованияdouble, а не float.


Как можно догадаться из первоначальных результатов, ваша программа продемонстрировала неопределенное поведение;в этом случае вы вызываете pow с типом аргумента, несовместимым с его типом параметра.В устаревшем стиле объявления

float pow();

не указывается, какие типы параметров pow или сколько их ожидают.По сути, он говорит компилятору: «Поверьте мне, я предоставлю аргументы правильного типа».

Но тогда выполнить это обещание невозможно, поскольку pow ожидает float в качестве егопервый аргумент, и компилятор выполняет продвижение по умолчанию для всех аргументов, переданных функциям, объявленным без прототипа.Одно из продвижений по умолчанию превращает float в double, поэтому невозможно предоставить аргумент float.Если бы вы использовали double с вместо float с, вы бы не столкнулись с этой конкретной проблемой и, вероятно, продолжали бы использовать синтаксис, который не поощрялся в течение почти 30 лет.

Кстатиэта проблема не возникала в val, потому что определение val встречается до его использования.Разумеется, определение определяет типы параметров, которые заполняют информацию, опущенную в предварительном объявлении без прототипов.

Но нижняя строка - это простой совет, приведенный выше: не используйте объявления функций старого стиля,Каждая функция должна быть объявлена ​​с полным прототипом, указывающим типы всех ее параметров.(Если вам нужно объявить функцию без параметров, используйте специальный список параметров (void) вместо пустого списка параметров.)

...