C函数之输出数字菱形
题目如下:
利用数字输出如下菱形图案,输入line即表示菱形中心的数字,如下为line = 4 的情形
下面,就依次讲解思路吧。
一、分析题目
如图,可发现:
- 该菱形左右两侧都是空的,因为C语言不允许凭空镂空,所以,左侧一定有字符,比如“空字符”;
- 中心即line = 4 可看出此时也是该行数是4的情况;
- 菱形可拆分成上下两部分;
- 对于上三角,每一行数字的前一部分是不断循环输出,从1增加,且循环数不会超过该行的中心数大小;
- 而每一行数字的后一部分,也应该是不断循环输出,从此行中心数减少,直到减少到1为止;
- 执行上述操作后,即可在大循环的基础上,输出换行;
- 对于下三角,执行的操作与上三角大致相同,无非就是从哪开始,每行输出的数字不断减少而已;
- 最后,前面提到的空字符,在上三角区,每行减一个,同时该行数字的会增加若干个,但这样最左侧数字一定是1,遂空字符在上三角区每行减一,在下三角区每行加一,整体上保证了菱形的轮廓;
二、函数大体
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");
}
3.1 第一个for循环(造轮廓)
3.2 第二个for循环(数前部分)
3.3 第三个for循环(数后部分)
四、下三角区
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");
}
4.1 第一个for循环(造轮廓)
4.2 第二个for循环(数前部分)
4.3 第三个for循环(数后部分)
补充下:
以上循环都是在前一个循环后进行的,才显示的结果,而所有循环都在最初的大循环(即上三角区或者下三角区)内进行的。
五、全部代码
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");
}
}
5.1 运行结果
六、最终结果
将星形字符*修改为空字符后,即得到题目要求的结果:
至此,全部结束了,需要注意的是,上三角循环和下三角循环直接有个过渡变化的space += 2,为的就是使下一行星形符号前后不一致,保证菱形的整体轮廓。
讲起来或许比较抽象,多试着理解每个循环在搞什么就好了。
==================== END ====================