如果给定笛卡尔坐标,我编写了一个程序来查找极坐标。但我无法获得正确的角度,请帮忙?
#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
编译时,您会收到大多数未初始化变量的警告。
此外,您可以避免使用 r
和 ang
并使用 sqrt(x*x + y*y)
和 atan2(y,x)
表达式直接在 printf
中。
请注意,atan2
比 atan
更好,因为如果 x
为 0.0,则不会被零除。
关于c - 如何在C程序中使用atan()函数求角度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24966687/