記得大一剛學C語言的時候,書後有道打印三角形的題,記得當時做了一個多小時才做出來,相信大家初學編程也做過類似的問題,今天突發奇想想打印個特殊曲線,於是把目標鎖定為打印一個橢圓,大家都知道編程語言打印輸出一個圖形,如果它是單調遞增或者單調遞減是非常容易的,如果非單調的函數就得費一些周折。橢圓不是單調函數應該怎麼快速打印呢首先因為圓是特殊的橢圓,所以我們先想想如何打印圓形,我們可以先想把圓分成1/4,一個1/4圓當然是單調的嘛,利用x*x + y*y = r*r這個圓的標准方程打印輸出,代碼如下: [cpp #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("*"); else printf(" "); } printf("\n"); } } 打印結果: 诶媽呀,咋出個這個畸形?我們仔細看會發現,原因是圓的行間距和列間距不同造成的,解決方法是把打印一個星‘*’,改成打印兩個星‘**’就成了,代碼如下: [cpp] #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("**"); else printf(" "); } printf("\n"); } return 0; } 打印結果: 哈,這次看起來像那麼回事,現在我們想想怎麼打一個完整的圓?我們打印a quarter of circle是因為圓心在(0,0)處,接下來我們只要把圓心放到(R,R)處,同時把x,y的遍歷范圍擴大到2R就可以啦。代碼如下: [cpp] #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("**"); else printf(" "); } printf("\n"); } return 0; } 打印結果: 我去,這個形- -! 我們看看代碼,問題出在我們把星號改成兩個,空格同時也得打印兩個,修改之後代碼如下: [cpp] #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("**"); else printf(" ");//打印兩個空格 } printf("\n"); } return 0; } 打印結果: 這次終於打印完美了(由於精度問題,不可能打印出標准的圓),暗爽^.^ 接下來我們來講我們的主題了,由於有之前的經驗,問題時候很好解決橢圓的標准方程為 我們只要把標准方程的圓心改成(a,b),方程為(x-a)*(x-a)/(a*a) + (y-b)*(y-b)/(b*b)=1,並把圓中的變量R換成a,b變量就行了,為了美觀我們把前面的倆星倆空格都換成一個代碼如下: [cpp] #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("*"); else printf(" "); } printf("\n"); } return 0; } 打印結果: 額。。。忘了橢圓方程中有除法,應該把int x,y改成double x,y 代碼如下: [cpp] #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("*"); else printf(" "); } printf("\n"); } return 0; } 打印結果: 大功告成!\( ̄) ̄)> 大家也可用同樣的原理,打印出雙曲線,拋物線甚至正態分布等函數,感興趣的可以試試。 福利:這是高手的代碼打印出的心形圖案 上圖代碼如下: [cpp] #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; }