如何用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');// 换行
}
以上就思路啦,赶紧去试一试吧~
以上内容只是说明了思路,大家还有什么好方法呢?一起来聊聊吧~
我是一名程序员,更多精彩请关注:空心小窝头Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有