C语言字母图案输出调整:如何修改代码实现指定对称缩进图案?
问题描述
现有如下C语言代码:
int main() { char A[3][6] = { "ABCDE", "FGHIJ", "KLMNO" }; int i, j, x, y; x = 0; y = 1; for (i=0; i<=2; i++) { for (j=0; j<=4; j++) { printf("%c ", A[i][j]); x++; if (x == y) { printf("\n"); y++; x=0; } } } }
运行后输出结果为:
A B C D E F G H I J K L M N O
要求仅对上述代码做少量修改,实现如下带缩进的正序及倒序对称字母图案输出:
A B C D E F G H I J K L M N O O N M L K J I H G F E D C B A
实现方案
我们可以分正序图案和倒序图案两部分调整,核心是控制每行缩进、字符输出顺序,保证对称对齐:
1. 正序图案修改
原代码已经实现了按1、2、3、4、5个字符的节奏输出,只需给每行添加对应缩进即可。缩进规则为:每行空格数 = (5 - 当前行字符数) * 2(比如第一行1个字符,需要8个空格缩进)。
修改后的正序部分代码:
// 正序图案 for (i=0; i<=2; i++) { for (j=0; j<=4; j++) { // 每行第一个字符前输出对应缩进 if (x == 0) { printf("%*s", (5 - y) * 2, ""); } printf("%c ", A[i][j]); x++; if (x == y) { printf("\n"); y++; x=0; } } }
关键修改:用printf("%*s", (5 - y)*2, "")实现动态缩进,%*s是格式化宽度控制,第一个参数指定空格的总宽度,第二个参数为空字符串,以此生成对应数量的空格。
2. 倒序图案修改
倒序需要从最后一个字符开始反向遍历,同时调整缩进逻辑(每行空格数 = (当前行字符数 - 1) * 2,和正序缩进对称)。
完整的最终代码(包含正序+倒序):
#include <stdio.h> int main() { char A[3][6] = { "ABCDE", "FGHIJ", "KLMNO" }; int i, j, x, y; x = 0; y = 1; // 正序图案 for (i=0; i<=2; i++) { for (j=0; j<=4; j++) { if (x == 0) { printf("%*s", (5 - y) * 2, ""); } printf("%c ", A[i][j]); x++; if (x == y) { printf("\n"); y++; x=0; } } } // 空行分隔正序与倒序 printf("\n"); // 倒序图案 y = 5; x = 0; int idx = 14; // 总共有15个字符,索引范围0-14,从最后一个字符开始遍历 while (y >= 1) { // 输出当前行缩进 printf("%*s", (y - 1) * 2, ""); // 输出y个反向字符 for (int k=0; k<y; k++) { // 通过索引计算二维数组中的行和列 printf("%c ", A[idx/5][idx%5]); idx--; } printf("\n"); y--; } return 0; }
关键修改:
- 用
idx变量从最后一个字符('O',索引14)开始反向遍历,通过idx/5和idx%5计算字符在二维数组中的行、列位置。 - 倒序缩进规则为
(y-1)*2,保证和正序图案对称。 - 添加空行分隔正序与倒序输出。
内容的提问来源于stack exchange,提问作者Franky
相关产品推荐
相关产品推荐

