题目如下:
利用数字输出如下菱形图案,输入line即表示菱形中心的数字,如下为line = 4 的情形
下面,就依次讲解思路吧。
如图,可发现:
void PrintNumers(int line)
{
int i, j, k;
// 空字符数量,大概超过line大小即可,可自定义
int space = 16;
// 上三角区代码……
// space实现输出的空格使得从上三角到下三角实现跨越式转换
space += 2;
// 下三角区代码……
}
for(i = 0; i < line; i ++)
{
// 输出空格,为了直观,故改空格为星形符号*
for(j = space; j > 0; j --)
printf("*");
// 输出前一部分1,2,3……
for(k = 0; k < i + 1; k ++)
printf("%d",k + 1);
// 在当前基础上,重利用k的值,输出后一部分2,1,没0
for(k = k - 1;k > 0; k --)
printf("%d", k);
// 每输出完一行内容,就减去一个占用空位,也就是星形符号
space --;
// 每输出完一行就换行
printf("\n");
}
for(int i = line - 1; i > 0; i --)
{
// 输出空格,为了直观,故改空格为星形符号*
for(j = space; j > 0; j --)
printf("*");
// 输出前一部分1,2,3……
for(k = 0; k < i; k ++)
printf("%d",k + 1);
// 输出后一部分2,1,没0
for(k = k - 1;k > 0; k --)
printf("%d", k);
// 每输出完一行内容,就增加一个占用空位,也就是星形符号
space ++;
// 每输出完一行就换行
printf("\n");
}
补充下:
以上循环都是在前一个循环后进行的,才显示的结果,而所有循环都在最初的大循环(即上三角区或者下三角区)内进行的。
void PrintNumers(int line)
{
int i, j, k;
int space = 16;
// 上三角行循环,由于line与行数相关,故可直接使用line作为范围
for(i = 0; i < line; i ++)
{
// 输出空格,为了直观,故改空格为星形符号*
for(j = space; j > 0; j --)
printf("*");
// 输出前一部分1,2,3……
for(k = 0; k < i + 1; k ++)
printf("%d",k + 1);
// 在当前基础上,重利用k的值,输出后一部分2,1,没0
for(k = k - 1;k > 0; k --)
printf("%d", k);
// 每输出完一行内容,就减去一个空位,也就是星形符号,以便下一行可以新增一个数字
space --;
// 每输出完一行就换行
printf("\n");
}
// 在当前基础上,重利用space的值,因为上一步最后space--了,所以这次利用需要对space加两次,若加一次则和上三角最后的行等长
space += 2;
// 下三角行循环
for(int i = line - 1; i > 0; i --)
{
// 输出空格,为了直观,故改空格为星形符号*
for(j = space; j > 0; j --)
printf("*");
// 输出前一部分1,2,3……
for(k = 0; k < i; k ++)
printf("%d",k + 1);
// 输出后一部分2,1,没0
for(k = k - 1;k > 0; k --)
printf("%d", k);
// 每输出完一行内容,就增加一个空位,也就是星形符号,以便下一行可以减少一个数字
space ++;
// 每输出完一行就换行
printf("\n");
}
}
将星形字符*修改为空字符后,即得到题目要求的结果:
至此,全部结束了,需要注意的是,上三角循环和下三角循环直接有个过渡变化的space += 2,为的就是使下一行星形符号前后不一致,保证菱形的整体轮廓。
讲起来或许比较抽象,多试着理解每个循环在搞什么就好了。
==================== END ====================