【问题标题】:Printing out characters in an X pattern using for loops使用 for 循环以 X 模式打印出字符
【发布时间】:2014-11-28 19:53:59
【问题描述】:

我正在尝试打印这个大 X 图案:

 x       x
  x     x
   x   x
    x x
     x
    x x
   x   x
  x     x
 x       x

我无法弄清楚实现它的算法。我刚刚开始 C 编程并陷入困境。

到目前为止我所拥有的是

#include <stdio.h>
int main()
{
    int j,i;
    char ch[] = "$";
    for(int j = 5; j >= 0 ; --j)
    {
        for(i = 5; i>=0; --i)
        {
            if(j%2 == 1)
            {
                 printf("%s",ch);
            }

        }
    printf("\n");
    }
    return 0;
}

我也发现了模式,

0  5  0
1  3  1 
2  1  2
3  0  3
2  1  2
1  3  1
0  5  0 

边缘的数字是应该出现 * 的位置。中间的数字是应该出现空格的地方。我错过了什么?

【问题讨论】:

  • 编译所有警告和调试信息(例如gcc -Wall -Wextra -g)。然后,学习使用调试器(例如gdb)。这是一项必不可少的技能!
  • 你忘了画空格,例如使用putchar(' ');
  • 是的,我首先试图让算法正确,但我无法弄清楚。我知道这与 for 循环有关..
  • 如果你有一些笛卡尔几何知识,你可以使用它。
  • 我只是一个初学者,:)

标签: c for-loop spacing


【解决方案1】:

为了一点乐趣:

int main (void)
{
    int i;
    int w = 7;
    for (i=1;i<=w*(w+1);i++)
        printf (
            "%c",
            i % (w+1) == 0 ? '\n' : 
            i % (w) == 0 || i % (w+2) == 1 ? '*' : ' ');

}

【讨论】:

    【解决方案2】:

    对上述交叉的一个好的解决方案进行轻微扩展,最终不仅仅是交叉 x:

    #include <stdio.h>
    
    int main(){
        int n = 4 - 1;
        char ch[] = "x";
        int i = 0, dx = 1;
    
        printf ("\n  __\n  ||----------------------------\n");
        do {
            printf ("  %s %*s%*.*s %*c\n", "||", 4*i+1, ch, 8*(n-i), 8*(n-i), ch, 4*i+1, '|');
            if ((i += dx)==n)
                dx = -dx;
        } while (i>=0);
        printf ("  ||----------------------------\n");
        for (i = 0; i < 10; i++)
            printf ("  ||\n");
        printf ("------\n\n");
    
        return 0;
    }
    

    输出:

    $ ./bin/flag
    
      __
      ||----------------------------
      || x                       x |
      ||     x               x     |
      ||         x       x         |
      ||             x             |
      ||         x       x         |
      ||     x               x     |
      || x                       x |
      ||----------------------------
      ||
      ||
      ||
      ||
      ||
      ||
      ||
      ||
      ||
      ||
    ------
    

    【讨论】:

      【解决方案3】:
      #include <stdio.h>
      
      int main(){
          int n = 5 - 1;
          char ch[] = "x";
          int i = 0, dx = 1;
      
          do{
              printf("%*s%*.*s\n", i+1, ch, 2*(n-i),2*(n-i), ch);
              if((i += dx)==n)
                  dx = -dx;
          }while(i>=0);
          return 0;
      }
      

      for(;;){
          printf("%*s%*.*s\n", i+1, ch, 2*(n-i),2*(n-i), ch);
          if((i += dx)==n)
              dx = -dx;
          else if(i < 0)
              break;
      }
      

      int n = 5 - 1;
      char ch[] = "x";
      int i = 0;
      
      for(; i < n ; ++i){
          printf("%*s%*.*s\n", i+1, ch, 2*(n-i),2*(n-i), ch);
      }
      for(; i >=0 ; --i){
          printf("%*s%*.*s\n", i+1, ch, 2*(n-i),2*(n-i), ch);
      }
      

      【讨论】:

        【解决方案4】:

        这是您的程序,只需进行最少的修改即可完成您想要的操作:

        #include <stdio.h>
        int main()
        {
          int j,i;
          char ch[] = "x";               // (1)
          int sz = 8;                    // (2)
          for( j = sz; j >= 0 ; --j)
            {
              for(i = sz; i>=0; --i)
                {
                  if(sz-j == i || i == j)// (3) 
                  {
                     printf("%s",ch);
                  } else {
                     printf(" ");        // (4)
                  }
                }
              printf("\n");
            }
          return 0;
        }
        

        解释:

        (1) 首先,如果你想要 x,你应该打印 x :)

        (2) 使用一个变量作为大小,这样你就可以玩它了...

        (3) 您必须每行打印两个 x,即在内循环中的两个位置。

        这些位置位于两条对角线上,其中 x == y(这里 i == j), 或者 x == 8 - y (这里 i == sz -j)

        (4) 否则必须打印空格

        请看这里:https://eval.in/228155

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-07-06
          • 2020-02-04
          • 2011-09-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-17
          • 1970-01-01
          相关资源
          最近更新 更多