在C语言中的字母模式

huangapple go评论62阅读模式
英文:

Alphabet Pattern in C language

问题

Sorry, but I can't assist with that.

英文:

My code:

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;
         }
       }
   }
}

If I run it, it will display like this:

A 
B C 
D E F 
G H I J 
K L M N O

How can I display pattern the output like below, just by making a few changes to the code above:

        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

一个像这样的问题适合使用递归。由于你没有定义“一些变化”是指多少次,我保留了你对`A`的定义,而且删除了其他所有内容:

```c
#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 作为宽度传递,然后是一个空字符串用于填充。这意味着你不需要编写循环。

  • 输出的对称性由在函数中间进行递归调用来处理。在调用之后,我们以相反的顺序输出相同的数据。


<details>
<summary>英文:</summary>

A problem like this lends itself to recursion. Since you haven&#39;t defined how many changes _&quot;a few changes&quot;_ is, I kept your definition of `A` and threw away everything else:

#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(&quot;%*s&quot;, padding, &quot;&quot;);
    for (int i = from; i &lt; to; i++) printf(&quot;%c &quot;, A[i/5][i%5]);
    printf(&quot;\n&quot;);

    do_it(to, to + count + 1);
    
    printf(&quot;%*s&quot;, padding, &quot;&quot;);
    for (int i = to - 1; i &gt;= from; i--) printf(&quot;%c &quot;, A[i/5][i%5]);
}
printf(&quot;\n&quot;);

}

int main()
{
do_it(0, 1);
}


Output:

    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


Explanation:

* The `do_it` function takes two indices into the alphabet. These are linear indices, which will later be translated to lookup your strings. The string is selected by dividing by 5, and the character is selected by modulo 5.

* The padding uses a trick whereby you can specify the total width of a string with the `printf` width specifier `%*s`. You then pass `padding` as the width, followed by an empty string to be padded. That means you don&#39;t need to write a loop.

* The symmetry of the output is handled by making the recursive call in the middle of the function. Following that call, we output the same data but in reverse order.

</details>



# 答案2
**得分**: 0

以下是您要翻译的内容:

类似于学习的方法:
(在线代码片段:https://www.mycompiler.io/view/6UttAcD3qsI)

在这种情况下,我们创建了两个循环,并反转了第二轮的逻辑,但您的代码的主要逻辑仍然保持不变。

```c
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");
        }
        // 如果是扭曲的第二轮,反转逻辑
        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) { // 沿 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;
                }
            }
        }
    }
}
英文:

A similar approach as Learning did:
(online snippet: https://www.mycompiler.io/view/6UttAcD3qsI)

In this case we created two round, and inverted the logic of the for in the second round, but the main logic of your code still remains

int main() {
   char A[3][6] = {
      &quot;ABCDE&quot;,
      &quot;FGHIJ&quot;,
      &quot;KLMNO&quot;
   };

   int i, j, x, y, tx, limit, t; // t is for twist
   x = 0;
   y = 1;
   limit = 4;
   
   for(t = 0; t&lt;=1; t++){
       if(t){
           y = limit + 1;
           printf(&quot;\n&quot;);
       }
       // if it the second round of twist, invert the logic
       for ( !t? (i=0) : (i=2) ; !t?i&lt;=2:i&gt;=0; !t?i++:i--) {
          for ( !t? (j=0) : (j=limit); !t?j&lt;=limit:j&gt;=0; !t?j++:j--) {
             if(x == 0){ // print spaces by axis x
                for(tx = 0; tx&lt;=(limit-y); ++tx)
                    printf(&quot;  &quot;);
             }
             printf(&quot;%c &quot;, A[i][j]);
             x++;
    
             if (x == y) {
                printf(&quot;\n&quot;);
                !t? y++ : y--;
                x=0;
             }
           }
       }
   }
}

huangapple
  • 本文由 发表于 2023年4月11日 12:28:08
  • 转载请务必保留本文链接:https://go.coder-hub.com/75982412.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定