記得大一剛學C語言的時候,書後有道列印三角形的題,記得當時做了一個多小時才做出來,相信大家初學編程也做過類似的問題,今天突發奇想想列印個特殊曲線,於是把目標鎖定為列印一個橢圓,大家都知道程式設計語言列印輸出一個圖形,如果它是單調遞增或者單調遞減是非常容易的,如果非單調的函數就得費一些周折。橢圓不是單調函數應該怎麼快速列印呢首先因為圓是特殊的橢圓,所以我們先想想如何列印圓形,我們可以先想把圓分成1/4,一個1/4圓當然是單調的嘛,利用x*x + y*y = r*r這個圓的標準方程列印輸出,代碼如下:
#include <stdio.h>int main(){int R = 10;int x,y;for(y = 0; y <= R; y++){for(x = 0; x <= R; x++){if(x*x + y*y < R*R)printf("*");elseprintf(" ");}printf("\n");}}
列印結果:
誒媽呀,咋出個這個畸形?我們仔細看會發現,原因是圓的行間距和列間距不同造成的,解決方案是把列印一個星‘*’,改成列印兩個星‘**’就成了,代碼如下:
#include <stdio.h>int main(){int R = 15;double x,y;for(y = 0; y <= R; y++){for(x = 0; x <= R; x++){if(x*x + y*y < R*R)printf("**");elseprintf(" ");}printf("\n");}return 0;}
列印結果:
哈,這次看起來像那麼回事,現在我們想想怎麼打一個完整的圓?我們列印a quarter of circle是因為圓心在(0,0)處,接下來我們只要把圓心放到(R,R)處,同時把x,y的遍曆範圍擴大到2R就可以啦。代碼如下:
#include <stdio.h>int main(){int R = 15;int x,y;for(y = 0; y <= 2*R; y++){for(x = 0; x <= 2*R; x++){if((x-R)*(x-R) + (y-R)*(y-R) < R*R)printf("**");elseprintf(" ");}printf("\n");}return 0;}
列印結果:
我去,這個形- -! 我們看看代碼,問題出在我們把星號改成兩個,空格同時也得列印兩個,修改之後代碼如下:
#include <stdio.h>int main(){int R = 15;int x,y;for(y = 0; y <= 2*R; y++){for(x = 0; x <= 2*R; x++){if((x-R)*(x-R) + (y-R)*(y-R) < R*R)printf("**");elseprintf(" ");//列印兩個空格 }printf("\n");}return 0;}
列印結果:
這次終於列印完美了(由於精度問題,不可能列印出標準的圓),暗爽^.^
接下來我們來講我們的主題了,由於有之前的經驗,問題時候很好解決橢圓的標準方程為 我們只要把標準方程的圓心改成(a,b),方程為(x-a)*(x-a)/(a*a) + (y-b)*(y-b)/(b*b)=1,並把圓中的變數R換成a,b變數就行了,為了美觀我們把前面的倆星倆空格都換成一個代碼如下:
#include <stdio.h>int main(){int a,b;int x,y;a = 5;b= 8;for(y = 0; y <= 4*a; y++){for(x = 0; x <= 2*b; x++){if((x-a)*(x-a)/(a*a) + (y-b)*(y-b)/(b*b)< 1)printf("*");elseprintf(" ");}printf("\n");}return 0;}
列印結果:
額。。。忘了橢圓方程中有除法,應該把int x,y改成double x,y 代碼如下:
#include <stdio.h>int main(){int a,b;double x,y;a = 5;b= 8;for(y = 0; y <= 4*a; y++){for(x = 0; x <= 2*b; x++){if((x-a)*(x-a)/(a*a) + (y-b)*(y-b)/(b*b)< 1)printf("*");elseprintf(" ");}printf("\n");}return 0;}
列印結果:
大功告成!\( ̄) ̄)>
大家也可用同樣的原理,列印出雙曲線,拋物線甚至常態分佈等函數,感興趣的可以試試。
福利:這是高手的代碼列印出的心形圖案
代碼如下:
#include <stdio.h>#include <math.h>int main(){ double x,y; int H = 3; for(y = -4;y <= 0;y += 0.3) { for(x = -4; x <= 4; x+= 0.2) if(fabs(sqrt(x*x+y*y) - H*sin(2*atan(y/x))) <= 1 ||fabs(sqrt(x*x+y*y) - H*sin(2*atan(-y/x))) <= 1) printf("*"); else printf(" "); printf("\n"); } for(y=-1;y<=0;y+=0.2) { for(x=-4;x<=4;x+=0.2) if(fabs(y)-0.65*x*x>=0.2) printf("*"); else printf(" "); printf("\n"); };return 0;}
==================================================================================================
作者:nash_ 歡迎轉載,與人分享是進步的源泉!
轉載請保留原文地址:http://blog.csdn.net/nash_/article/details/8215279
===================================================================================================