最近看到一本C趣味编程的书,感觉还挺有趣的,就在这记记吧
1、用“*”绘制0°~360°的余弦曲线。
咋一看这个题目有点傻眼,这怎么绘制,简单考虑,在纸上画了下余弦曲线,发现曲线是0~180°和180°~360°对称的。
本来每一行需要画两个点,由于对称,只需算出一个点的位置,然后对称过去画出就可以了
假设列宽位62,360°=2π≈6.2,我想大家都懂得。
然后我们就可以编程啦
#include <stdio.h>
#include <math.h>
int main(void)
{
double y;
int x,m;
for (y=1;y>=-1;y-=0.1) //y从1到-1就不解释了吧
{
m=acos(y)*10; //根据y算出x 10是放大系数
for (x=1;x<m;x++)
printf(" ");
printf("*");
for ( ;x<62-m;x++) //做对称处理
printf(" ");
printf("*\n");
}
return 0;
}
得到的图形是这个样子的
下面是思考时间:
怎么来画sin x的图像?
来,同样的,先画画标准图像。
我的思路是这样子的。0°~90°,90°到180°是对称的,和上面一样的画法。
由于asin()函数算出的x值是在-180°~180°之间的(反三角函数,高中数学没学好的自闭去),所以可以考虑吧-180°~0°图像移到90°的后面就行了。
我写的程序是这样子的:
#include <stdio.h>
#include <math.h>
int main(void)
{
double y;
int x,m;
for (y=1;y>=0;y-=0.1)
{
m=asin(y)*10;
for (x=1;x<m;x++)
printf(" ");
printf("*");
for ( ;x<31-m;x++)
printf(" ");
printf("*\n");
}
for (y=0;y>=-1;y-=0.1)
{
m=asin(y)*-10+31+2;
for (x=1;x<m;x++)
printf(" ");
printf("*");
for(;x<62+33-m;x++)
printf(" ");
printf("*\n");
}
return 0;
}
图形是:
画sin其实还可以考虑图形的中心对称,有另外的思路,我就不阐述了