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

标签 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;
  ang=atan(k);

  printf("polar co-ordinates r=%d,ang=%f",r,ang);
  return 0;
}

最佳答案

在您的情况下,您应该使用double数字,而不是int。阅读 atan(3) 的文档, atan2(3) - 它适用于弧度。并以 \n 结束每个 printf 或调用 fflush(3) ;另外,更好地测试 scanf(3) 的结果。初始化变量是一个好习惯(因为以后你的代码会变得更加复杂,并且你不想要未初始化的值)。

#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;
}

最后,使用所有警告和调试信息进行编译,例如与

 gcc -Wall -g angconv.c -o angconv

如果使用GCC

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

使用 gcc -Wall 编译时,您会收到大多数未初始化变量的警告。

此外,您可以避免使用 rang 并使用 sqrt(x*x + y*y) atan2(y,x) 表达式直接在 printf 中。

请注意,atan2atan 更好,因为如果 x 为 0.0,则不会被零除。

关于c - 如何在C程序中使用atan()函数求角度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24966687/

相关文章:

c - 数组声明 : C Segmentation fault

连接功能时常失效?

c - 如何在 C 中创建到空格字符的 #define 映射?

c++ - 如果未设置clock_settime,clock_gettime() 是否有效?

c - 什么会将空字符串复制到另一个字符串?

c++ - psinfo_t solaris 在其字段中不包含完整的进程名称

c - 在 gdb 中使用 STDOUT

c - 用于多个子部分加法的流程 API

c++ - 如何使用带有变量名称的字符串获取变量地址?

c - 如何将 kernel_entry 函数放置在文本部分的开头