我的代码:
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
这样的问题适合递归。由于您没有定义有多少变化"几个变化">,我保留了您对A
的定义,并扔掉了其他所有内容:
#include <stdio.h>
char A[3][6] = {
"ABCDE",
"FGHIJ",
"KLMNO"
};
void do_it(int from, int to)
{
if (to <= 15)
{
int count = to - from;
int padding = 2 * (5 - count);
printf("%*s", padding, "");
for (int i = from; i < to; i++) printf("%c ", A[i/5][i%5]);
printf("n");
do_it(to, to + count + 1);
printf("%*s", padding, "");
for (int i = to - 1; i >= from; i--) printf("%c ", A[i/5][i%5]);
}
printf("n");
}
int main()
{
do_it(0, 1);
}
输出:
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
解释:
do_it
函数在字母表中取两个索引。这些是线性索引,稍后将转换为查找字符串。通过除以5来选择字符串,通过对5取模来选择字符。填充使用了一个技巧,您可以使用
printf
宽度指定符%*s
指定字符串的总宽度。然后传递padding
作为宽度,后跟要填充的空字符串。这意味着你不需要写循环。输出的对称性是通过在函数中间进行递归调用来处理的。在调用之后,输出相同的数据,但顺序相反。
与Learning的做法类似:(在线代码:https://www.mycompiler.io/view/6UttAcD3qsI)
在本例中,我们创建了两个循环,并在第二个循环中颠倒了for的逻辑,但是代码的主要逻辑仍然是
int main() {
char A[3][6] = {
"ABCDE",
"FGHIJ",
"KLMNO"
};
int i, j, x, y, tx, limit, t; // t is for twist
x = 0;
y = 1;
limit = 4;
for(t = 0; t<=1; t++){
if(t){
y = limit + 1;
printf("n");
}
// if it the second round of twist, invert the logic
for ( !t? (i=0) : (i=2) ; !t?i<=2:i>=0; !t?i++:i--) {
for ( !t? (j=0) : (j=limit); !t?j<=limit:j>=0; !t?j++:j--) {
if(x == 0){ // print spaces by axis x
for(tx = 0; tx<=(limit-y); ++tx)
printf(" ");
}
printf("%c ", A[i][j]);
x++;
if (x == y) {
printf("n");
!t? y++ : y--;
x=0;
}
}
}
}
}