什么原因导致函数调用(sinx/cosx)返回值0 [关闭]

dgjrabp2  于 2023-10-16  发布在  其他
关注(0)|答案(3)|浏览(94)

已关闭此问题为not reproducible or was caused by typos。它目前不接受回答。

此问题是由打印错误或无法再重现的问题引起的。虽然类似的问题可能是on-topic在这里,这一个是解决的方式不太可能帮助未来的读者。
2个月前关闭。
Improve this question
我试图调用一个函数来计算sinx()cosx(),但由于某种原因,sinx()每次都返回值0

// homework 4, part 1,
#include <stdio.h>
#include <math.h>
#include <stdlib.h>

// function call for factorial.
int factorial(int n) {
  int temp = n;
  int sum = 1;
  while (temp > 0) {
    sum *= temp;
    temp -= 1;
  }
  return sum;
}

// function call for numenator.
numenator(int n) {
  int numenator = pow(-1, n);
  return numenator;
}

// function call for powX.
powX(int x, int n) {
  int powX = pow(x, n);
  return powX;
}

// function call for x & n inputs.
/* function is not working */
int getInputs(int x, int n) {
  printf("Enter integer as degree: ");
  scanf(" %d", &x);
  printf("Enter integer as degree: ");
  scanf(" %d", &n);
  if (x == 'E' || n == 'E') {
    exit(EXIT_FAILURE);
  }
}

// function call to find sine.
double sinx(int x, int n) {
  double sine;
  double temp = 0.0;
  while (n > 0) {
    // program -n yapınca 2*n+1 değişiyor
    // temp üzerinden değişiklik yapınca, aynı döngü...
    // ...temp 0 olana kadar devam ediyor.
    sine = numenator(n) / factorial(2*n+1) * powX(x, 2*n+1);
    temp += sine;
    printf("sin(%d) where n is %d = %f\n", x, n, temp);
    n -= 1;
  }
}

// function call to find cosine.
double cosx(int x, int n) {
  double cosine = 0.0;
  double temp = 0.0;
  while (n > 0) {
    cosine = numenator(n) / factorial(2*n) * powX(x, 2*n);
    temp += cosine;
    n -= 1;
    printf("\ncos(%d) where n is %d = %f", x, n, temp);
  }
}

// main section of program.
int main() {
  int x = 30, n = 4;
  //getInputs(x, n);
  sinx(x, n);
  cosx(x, n);
  return 0;
}

我试着看看问题是从哪里来的,所以一个接一个地写下每个函数,看看它是否正常工作,但我在函数sinxcosx上失去了跟踪。
下面是我在子函数上使用的公式(numenator/factorial/powX):

mqkwyuun

mqkwyuun1#

在我看来,这两个函数都应该得到奇怪的结果(未定义的行为),因为sinxcosx都不会返回值。
在这两种情况下,都应该返回temp的值,但是一旦累加了序列中的所有项,就不用它的值了。

7xzttuei

7xzttuei2#

计算结果给予令人惊讶的结果,因为对于许多表达式,您使用整数运算而不是浮点运算:

  • x应定义为double,而不是mainsinxcosxpowX中的int
  • sinxcosx应该返回结果。
  • powX应该有一个返回类型double
  • numenator应该有一个返回类型int,并重命名为numerator
  • 在函数numenator中,你定义了一个与函数同名的局部变量:这让人困惑。此外,您应该使用if (n % 2 == 1) return -1; else return 1;而不是pow(-1, n)
  • int getInputs(int x, int n)应该接受指向目标变量的指针。
  • x应通过%f转换读取
  • temp应该用于术语,而不是结果。
  • 对于cosxtemp的初始值应该是1.0。如编码的那样,cosx缺少第一项。
tvokkenx

tvokkenx3#

至少这些问题:

保存时间启用所有警告
函数缺少返回值
浮点运算

numenator(n) / factorial(2*n+1是整数除法与整数商。使用浮点除法。

1.0 * numenator(n) / factorial(2*n+1)

考虑在更多地方使用double,例如

// double sinx(int x, int n)
double sinx(double x, int n)
// powX(int x, int n) {
double powX(double x, int n) {
...

相关问题