日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言画谢宾斯基三角形

發布時間:2023/12/20 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言画谢宾斯基三角形 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

謝賓斯基三角形是一個有意思的圖形,(英語:Sierpinski triangle)是一種分形,由波蘭數學家謝爾賓斯基在1915年提出,它是一種典型的自相似集。

先畫一個三角形,然后呢,取三角形的中點,組成一個新的三角形,把新的三角形挖空。

依次遞歸,就出現了后面的那個圖形。

如果用C語言來畫一個這樣的三角形,我們需要怎么畫呢?

我們先看看這樣一段代碼,思路還是跟之前一樣,在屏幕上畫出一個矩形,x行和y列。

#include?<stdio.h> #include?<time.h> #include?<sys/select.h>#define?SIZE?(1?<<?5)/*64*//*?毫秒級?延時?*/ void?msleep(int?ms) {struct?timeval?delay;delay.tv_sec?=?0;delay.tv_usec?=?ms?*?1000;?//?20?msselect(0,?NULL,?NULL,?NULL,?&delay); }int?main() {int?x,?y,?i;printf("%d\n",SIZE);/*y用來控制列數*/for?(y?=?SIZE?-?1;?y?>=?0;?y--,?msleep(20),putchar('\n'))?{/*控制行輸出*/for?(i?=?0;?i?<?y;?i++)?{msleep(20);putchar('^');}}return?0; }

代碼輸出

為了方便大家觀看,我做了一些調整

為了測試,我把代碼改成這樣,方便大家看到輸出。

#include?<stdio.h>#define?SIZE?(1?<<?3) int?main() {int?x,?y,?i;printf("%d\n",SIZE);/*y用來控制列數*/for?(y?=?SIZE?-?1;?y?>=?0;?y--,putchar('\n'))?{/*控制行輸出*/for?(i?=?0;?i?<?y;?i++)?{putchar('^');}for?(x?=?0;?x?+?y?<?SIZE;?x++){putchar('#');}}return?0; }

代碼輸出

weiqifa@bsp-ubuntu1804:~/c$?gcc?shengdanshu.c?&&?./a.out 8 ^^^^^^^# ^^^^^^## ^^^^^### ^^^^#### ^^^##### ^^###### ^####### ######## weiqifa@bsp-ubuntu1804:~/c$

這里可以好好分析一下

y 長度是用來控制輸出多少行,可以看到一共有 8 行。

i ?的長度是用來輸出?^ 字符的,這個字符隨著 y的減少也會相應減小。

x 也受到y 的限制,主要是在另一半輸出?# 號字符。

知道了上面,我們來看看核心代碼

#include?<stdio.h>#define?SIZE?(1?<<?3) int?main() {int?x,?y,?i;printf("%d\n",SIZE);/*y用來控制列數*/for?(y?=?SIZE?-?1;?y?>=?0;?y--,putchar('\n'))?{/*控制行輸出*/for?(i?=?0;?i?<?y;?i++)?{putchar('^');}for?(x?=?0;?x?+?y?<?SIZE;?x++){printf((x?&?y)???"?"?:?"*");}}return?0; }

代碼輸出

8 ^^^^^^^* ^^^^^^** ^^^^^*?* ^^^^**** ^^^*???* ^^**??** ^*?*?*?* ********

已經有了我們題目上所的三角形的模樣了,這里只要再稍微修改下,就可以得到我們題目中所的那樣的三角形了。不對稱的原因主要是因為字符高度是寬度的兩倍。

代碼修改成這樣

#include?<stdio.h>#define?SIZE?(1?<<?3) int?main() {int?x,?y,?i;printf("%d\n",SIZE);/*y用來控制列數*/for?(y?=?SIZE?-?1;?y?>=?0;?y--,putchar('\n'))?{/*控制行輸出*/for?(i?=?0;?i?<?y;?i++)?{putchar('^');}for?(x?=?0;?x?+?y?<?SIZE;?x++){printf((x?&?y)???"??"?:?"*?");}}return?0; }

代碼輸出

weiqifa@bsp-ubuntu1804:~/c$?gcc?shengdanshu.c?&&?./a.out 8 ^^^^^^^* ^^^^^^*?* ^^^^^*???* ^^^^*?*?*?* ^^^*???????* ^^*?*?????*?* ^*???*???*???* *?*?*?*?*?*?*?* weiqifa@bsp-ubuntu1804:~/c$

然后我們把?^?字符替換成空格,也就是我們想要的東西了。

然后空格和 * 的字符輸出,主要是靠 x & y 來控制的,他們又是如何控制的呢?

我們計算一下上面的算法

綠色的地方是我們輸出?* 字符的位置,藍色的 是我們輸出?空格的位置,空格是兩個空格,所以就出現了我們看到的那樣。

我們再修改下代碼

#include?<stdio.h>#define?SIZE?(1?<<?5) int?main() {int?x,?y,?i;printf("%d\n",SIZE);/*y用來控制列數*/for?(y?=?SIZE?-?1;?y?>=?0;?y--,putchar('\n'))?{/*控制行輸出*/for?(i?=?0;?i?<?y;?i++)?{putchar(' ');}for?(x?=?0;?x?+?y?<?SIZE;?x++){printf((x?&?y)???"??"?:?"*?");}}return?0; }

代碼輸出

weiqifa@bsp-ubuntu1804:~/c$?gcc?shengdanshu.c?&&?./a.out 32**?**???**?*?*?**???????**?*?????*?**???*???*???**?*?*?*?*?*?*?**???????????????**?*?????????????*?**???*???????????*???**?*?*?*?????????*?*?*?**???????*???????*???????**?*?????*?*?????*?*?????*?**???*???*???*???*???*???*???**?*?*?*?*?*?*?*?*?*?*?*?*?*?*?**???????????????????????????????**?*?????????????????????????????*?**???*???????????????????????????*???**?*?*?*?????????????????????????*?*?*?**???????*???????????????????????*???????**?*?????*?*?????????????????????*?*?????*?**???*???*???*???????????????????*???*???*???**?*?*?*?*?*?*?*?????????????????*?*?*?*?*?*?*?**???????????????*???????????????*???????????????**?*?????????????*?*?????????????*?*?????????????*?**???*???????????*???*???????????*???*???????????*???**?*?*?*?????????*?*?*?*?????????*?*?*?*?????????*?*?*?**???????*???????*???????*???????*???????*???????*???????**?*?????*?*?????*?*?????*?*?????*?*?????*?*?????*?*?????*?**???*???*???*???*???*???*???*???*???*???*???*???*???*???*???* *?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?*?* weiqifa@bsp-ubuntu1804:~/c$

這樣看起來是不是很酷了。

我在我的另一個號里面用這樣方法畫了一個圣誕樹,我覺得也挺有意思的,喜歡的同學可以看看,當時寫那個代碼的時候是圣誕夜,我們剛好在開會,覺得有點無聊。

鏈接如下

如何用 C 語言畫一個「圣誕樹」?

知乎上的大神畫圣誕樹,基礎理論也是基于這個,后續剖析一下,我覺得非常有意思。

附上幾張謝賓斯基三角形的圖片

參考:

[1]https://www.cnblogs.com/lfri/p/10128073.html

[2]https://codegolf.stackexchange.com/questions/6281/draw-a-sierpinski-triangle/6292#6292

推薦閱讀:

專輯|Linux文章匯總

專輯|程序人生

專輯|C語言

我的知識小密圈

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的c语言画谢宾斯基三角形的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。