如何用c語言for循環打出一個空心菱形?
畫圖畫圖(不畫圖難以會意)。下面是一個草圖?(找了個在線白板畫的,漂亮吧~^(* ̄(oo) ̄)^)。
如圖所示,假設要畫一個規格為2a*2b的◇。a,b分別為對應方向的中心位置。不難看出,程序一共需要打印2b+1行,2a+1列(因為第0行0列也是需要打印的,但是程序是從0開始計數的,因此最后的行列下標就是2a和2b,2a+1和2b+1是數量)。
程序打印通常會使用空格和*作為打印菱形的字符,由于基本的輸出單位是字符(相當于菱形內的所有角的大小是固定的,不論多么大的菱形都是相似的),所以2a和2b會相互制約。我想打印一個10*50的菱形時,當打印到第5行是就已經從橫向偏移量為0的位置開始打印了,第6行將會從-1列開始打印,這樣打印出的圖案將會是一個不完成的菱形,如下圖,虛線部分將不會被打印。
程序以行為輸出,因此我們不在控制y軸,只通過控制x軸方向的a來控制菱形的大小。我們不妨來歸納一下打印的規則:
第0行需要打印a個空格、打印一個*、換行。
第1行需要打印a-1個空格、打印1個*、打印1個空格、打印1個*、換行。
第2行需要打印a-2個空格、打印1個*、打印3個空格、打印1個*、換行。
第3行需要打印a-3個空格、打印1個*、打印5個空格、打印1個*、換行。
第n行需要打印a-n個空格、打印1個*、打印2n-1個空格、打印1個*、換行。
一直需要打印到n==a。打印0個空格、打印1個*、打印2a-1個空格、打印1個*、換行。
之后開始往回畫。
第a+1行需要打印1個空格、打印1個*、打印2a-3個空格、打印1個*、換行。
第a+2行需要打印2個空格、打印1個*、打印2a-5個空格、打印1個*、換行。
第a+m行需要打印m個空格、打印1個*、打印2a-(2m+1)個空格、打印1個*、換行。
當打印到2a-(2m+1)<0[2a-2m<1=>m==a]時,則只直接打印換行,結束程序。
不難計算得出,一共需要打印2a+1行(和上面的2b+1相對應)。
示例如下圖,網格里的大點點就是我們需要打印的點:
這樣,偽代碼基本就出來了:
參數:a 橫向的中心點
// 打印上半截
for(n = 0; i <= a; n ++){
// 打印一行內容
for(i = 0; i < a-n; i ++){
print(' ');//打印a-n個空格
}
print('*');//打印1個*
if((2n - 1) < 0){
print('\n');// 未打印空格直接換行
continue;
}
for(i = 0; i < (2n - 1); i ++){
print(' ');//打印2n - 1個空格
}
print('*');// 打印1個*
print('\n');// 換行
}
// 打印下半截
for(m = 1; m <=a; m ++){
for(i = 0; i < m; i ++){
print(' ');// 打印m個空格
}
print('*');// 打印1個*
if(2a-(2m+1) < 0){
print('\n');// 換行
break;// 終止程序
}
for(i = 0; i < 2a-(2m+1); i ++){
print(' ');// 打印2a-(2m+1)個空格
}
print('*');// 打印1個*
print('\n');// 換行
}
以上就思路啦,趕緊去試一試吧~
以上內容只是說明了思路,大家還有什么好方法呢?一起來聊聊吧~
我是一名程序員,更多精彩請關注:空心小窩頭