首先,你输出的不是正弦图像,而是反正弦图像。
#include
#include
int main(){
double y;
int x,m,i;
printf("y=sin(x) [0
if(y>=0){
m=asin(y)*10; //反正弦函数,确定空格的数量,最大值为15
for(x=1;x
printf("*");//注意此时不换行,因为后面还有一个点
for(;x<31-m;x++)printf(" ");//输出第二个点,并换行
printf("*\n");}
else{//同理输出y小于0的点
m=-1*asin(y)*10;
for(i=0;i<32;i++)printf(" ");
for(x=1;x
printf("*");
for(;x<31-m;x++)printf(" ");
printf("*\n",m);
}
}
getchar();
return 0;
}
简单点这么说吧。。
正弦函数图像是对称的,所以在每行打印两个星号。
用反正弦函数asin()得出各点的坐标关系。
而for(y=1;y>=-1;y-=0.1)就是从 0开始描点到 2π。
m=asin(y)*10; 是图像放大10倍、
至于for(;x<31-m;x++)是因为把图像分成了31列。。
算法细节的话LZ好好琢磨下吧。。
我调试的时候是一个,运行的时候有两个。
完整的调试了一边,发现是精度的问题,到最后y的值不是-1而是-0.999.....87,所以它才输出了最后的*
,
你把y!=
-1改成y>=
-0.999,就正常了
double
y=0.0
=>
y-0.1=
-0.100...1
,所以double型的不要使用整数来作为参照点