Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C程序中用atan()函数求角度?_C - Fatal编程技术网

如何在C程序中用atan()函数求角度?

如何在C程序中用atan()函数求角度?,c,C,我写了一个程序来寻找极坐标,如果笛卡尔坐标是给定的。但我不能得到正确的角度,请帮助 #include<math.h> #include<stdio.h> int main() { int x,y,z,r,ang; float k; printf("enter the cartesian co-ordinates:"); scanf("%d%d",&x,&y); z=x*x+y*y; r=sqrt(z); k=y/x; a

我写了一个程序来寻找极坐标,如果笛卡尔坐标是给定的。但我不能得到正确的角度,请帮助

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

int main()
{
  int x,y,z,r,ang;
  float k;
  printf("enter the cartesian co-ordinates:");
  scanf("%d%d",&x,&y);

  z=x*x+y*y;
  r=sqrt(z);
  k=y/x;
  ang=atan(k);

  printf("polar co-ordinates r=%d,ang=%f",r,ang);
  return 0;
}
您应该使用双精度数字,而不是int。阅读的文档,-它与弧度一起工作。并以\n或else调用结束每个printf;此外,更好地测试测试的结果。初始化变量是一个好习惯,因为以后代码会变得更复杂,并且不需要未初始化的值

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

int main() {
  double x=0.0,y=0.0,r=0.0,ang=0.0;
  printf("enter the cartesian co-ordinates:\n");
  if (scanf("%f %f",&x,&y)<2) 
     { fprintf(stderr,"bad input\n"); exit(EXIT_FAILURE);} ;

  r=sqrt(x*x + y*y);
  ang=atan2(y, x);

  printf("polar co-ordinates r=%f, ang=%f\n",r,ang);
  return 0;
}
如果使用

如前所述,在特定情况下,0.0的初始化赋值是无用的。但您可能会改进和扩展代码库,因此以后它们可能会很有用。这是一个习惯问题,我通常总是初始化变量,编译器会对其进行优化,如果不需要,则将其删除。它们使代码更具确定性,如果你在调试器中一步一步地运行你的程序,例如gdb,你会更好地理解它

当使用gcc-Wall进行编译时,对于大多数未初始化的变量,您会得到一个警告

另外,您可以避免使用r和ang,直接在printf中使用sqrtx*x+y*y和atan2y,x表达式


注意,atan2比atan好,因为如果x为0.0,则不会被零除。

最后我找到了程序的解决方案。谢谢你的建议

    #include<math.h>
    #include<stdio.h>
    #define PI 3.14159265

  int main()
{
  float x,y,z,r;
  double ang,val;

  printf("enter the cartesian co-ordinates:\n");
  scanf("%f%f",&x,&y);

  z=x*x+y*y;
  r=sqrt(z);

  val=180.0/PI;
  ang=atan2(y,x)*val;

  printf("polar co-ordinates r=%f,ang=%1f",r,ang);

  return 0;

  }

最好包括一些细节,比如您使用了哪些输入、您期望的输出以及实际发生的情况。。k=y/r;ang需要修改x的值。我不明白为什么这个问题被降级了?所有这些初始化都有点毫无意义;第一次使用变量时,它们是通过scanf设置x和y,通过赋值设置r和ang,因此不可能在未初始化的情况下滥用它们,因为您检查了scanf的返回值。有人甚至可能会争辩说,在完成赋值之前不应该定义r和ang:double r=sqrtx*x+y*y;双ang=atan2y,x;。对于接近2k+1的角度,atan2也更精确。atan2与atan的主要原因是,atan2提供了机器-pi到pi范围,而atan提供了-pi/2到pi/2范围的一半。如果x,y->0,0,这两种方法都有问题。虽然不完全好,但几乎。您应该使用中已经定义的M_PI,无需定义您的PIhypot比sqrtx*x+y*y具有优势,因为它的范围限制较少。
    #include<math.h>
    #include<stdio.h>
    #define PI 3.14159265

  int main()
{
  float x,y,z,r;
  double ang,val;

  printf("enter the cartesian co-ordinates:\n");
  scanf("%f%f",&x,&y);

  z=x*x+y*y;
  r=sqrt(z);

  val=180.0/PI;
  ang=atan2(y,x)*val;

  printf("polar co-ordinates r=%f,ang=%1f",r,ang);

  return 0;

  }