c语言画正弦函数

#include<stdio.h>#include<math.h>main(){doubley;intx,m,i;printf("y=sin(x)[0<x<2*pi]\n... #include<stdio.h>
#include<math.h>
main(){
double y;
int x,m,i;
printf("y=sin(x) [0<x<2*pi]\n");
for(y=1;y>=-1;y-=0.1){
if(y>=0){
m=asin(y)*10;
for(x=1;x<m;x++)printf(" ");
printf("*",m);
for(;x<31-m;x++)printf(" ");
printf("*\n");}
else{
m=-1*asin(y)*10;
for(i=0;i<32;i++)printf(" ");
for(x=1;x<m;x++)printf(" ");
printf("*",m);
for(;x<31-m;x++)printf(" ");
printf("*\n",m);
}
}
}

请帮忙解释每行算法的意思~~
展开
 我来答
goal000011
推荐于2016-10-21 · TA获得超过196个赞
知道答主
回答量:135
采纳率:0%
帮助的人:0
展开全部
首先,你输出的不是正弦图像,而是反正弦图像。
#include<stdio.h>
#include<math.h>
int main(){
double y;
int x,m,i;
printf("y=sin(x) [0<x<2*pi]\n");
for(y=1;y>=-1;y-=0.1){//表示y的取值范围是[-1,1]
if(y>=0){
m=asin(y)*10; //反正弦函数,确定空格的数量,最大值为15
for(x=1;x<m;x++)printf(" ");
//printf("*",m);
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<m;x++)printf(" ");
//printf("*",m);
printf("*");
for(;x<31-m;x++)printf(" ");
printf("*\n",m);
}
}
getchar();
return 0;
}
百度网友3791919
2008-11-30 · 超过22用户采纳过TA的回答
知道答主
回答量:55
采纳率:0%
帮助的人:66.9万
展开全部
简单点这么说吧。。
正弦函数图像是对称的,所以在每行打印两个星号。
用反正弦函数asin()得出各点的坐标关系。
而for(y=1;y>=-1;y-=0.1)就是从 0开始描点到 2π。
m=asin(y)*10; 是图像放大10倍、
至于for(;x<31-m;x++)是因为把图像分成了31列。。
算法细节的话LZ好好琢磨下吧。。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
创作者O3JsCa8FbE
2019-03-20 · TA获得超过4586个赞
知道大有可为答主
回答量:3108
采纳率:32%
帮助的人:181万
展开全部
我调试的时候是一个,运行的时候有两个。
完整的调试了一边,发现是精度的问题,到最后y的值不是-1而是-0.999.....87,所以它才输出了最后的*

你把y!=
-1改成y>=
-0.999,就正常了
double
y=0.0
=>
y-0.1=
-0.100...1
,所以double型的不要使用整数来作为参照点
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式