最近看到一本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其實還可以考慮圖形的中心對稱,有另外的思路,我就不闡述了