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

这样的问题适合递归。由于您没有定义有多少变化"几个变化">,我保留了您对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;
}
}
}
}
}

相关内容

  • 没有找到相关文章

最新更新