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