【问题标题】:easier way to write loops编写循环的更简单方法
【发布时间】:2012-10-20 07:51:59
【问题描述】:

你好写了一个比这个更重要的程序;

0

01

012

0123

01234

012345

01234

0123

012

01

0

我很确定我的方法又长又笨,这就是它的样子

#include <stdio.h>

int main(void)
{

int first = -1, second = -1, third = -1, fourth = -1, fifth = -1, sixth = -1, seventh = -1, eight = -1, nine = -1, ten = -1, elleven = -1;

while(first < 0){
first += 1; 
printf("%d\n", first);

while(second < 1){
second += 1;
printf("%d", second);
}
printf("\n");
while(third < 2 ){
third += 1;
printf("%d", third);
}
printf("\n");
while(fourth < 3){
fourth += 1;
printf("%d", fourth);
}
printf("\n");
while(fifth < 4){
fifth += 1;
printf("%d", fifth);
}
printf("\n");
while(sixth < 5){
sixth += 1;
printf("%d", sixth);
}
printf("\n");
while(seventh < 4){
seventh += 1;
printf("%d", seventh);
}
printf("\n");
while(eight < 3){
eight += 1;
printf("%d", eight);
}
printf("\n");
while(nine < 2) {
nine += 1;
printf("%d", nine);
}
printf("\n");
while(ten < 1){
ten += 1;
printf("%d", ten);
}
printf("\n");
while(elleven < 0){
elleven += 1;
printf("%d", elleven); 
}
}

return 0;
}

如果有人愿意告诉我如何更容易地做到这一点? :)

【问题讨论】:

  • 属于代码审查。太糟糕了,我不能投票将它迁移到那里。但是,我可以将其迁移到特定于 LaTeX 的 SO,这对于此处提出的许多问题非常有帮助...
  • 不太清楚你的意思:)
  • 还有另一个站点codereview.stackexchange.com,专门用于解决此类问题。这个网站是关于修复不起作用的代码(或找到问题的解决方案)。
  • 好的,谢谢,我不知道!

标签: c loops while-loop


【解决方案1】:

这是一个使用 while 循环的版本。

#include <stdio.h>
#define MAX 5

int main()
{
    int j=0, m=0, dec=0;
    while( m>=0 && m<=MAX)
    {
        for (j = 0; j <= m; j++)
             printf("%d", j);
        printf("\n");

        if (m==MAX)
            dec = 1; // once hit MAX, chg inc to dec

        (dec)? m--: m++;
    }
}

【讨论】:

    【解决方案2】:

    这些产生三角形输出的问题在数学上总是最简单的。考虑绝对值函数(例如:|x|abs(x))。

    #include <stdio.h>
    #include <stdlib.h>
    #define LARGEST_NUMBER (5)
    #define MAX_VAL (LARGEST_NUMBER+1)
    
    int main(void) {
       int i,j;
       for(i=0; i<2*MAX_VAL; i++) {
          for(j=0; j<MAX_VAL-abs(MAX_VAL-i); j++) {
             printf("%d",j);
          }
          printf("\n");
       }
       return 0;
    }
    

    输出:

    0
    01
    012
    0123
    01234
    012345
    01234
    0123
    012
    01
    0
    

    我觉得这是解决这类问题在数学上最简洁的方法。我过去曾向学生提供过这个确切的问题,并坚持使用abs() 函数的解决方案,以便该函数尽可能多地使用factored(即:最少数量的循环、变量、代码行和函数调用)。

    这是关于数学函数本身的 wiki 文章:

    http://en.wikipedia.org/wiki/Absolute_value#Absolute_value_function

    享受吧!

    【讨论】:

      【解决方案3】:

      这是我的尝试:

      int main()
      {
          int i, j;
          for (i = 0; i <= 5; ++i) {
              for (j = 0; j <= i; ++j)
                  printf("%d", j);
      
              printf("\n");
          }
      
      
          for (i = 4; i >= 0; --i) {
              for (j = 0; j <= i; ++j)
                  printf("%d", j);
      
              printf("\n");
          }
      
          return 0;
      }
      

      【讨论】:

        【解决方案4】:

        好吧,我注意到您有一个长度从 1 到 6 不等的字符串,然后又返回,其中包含从 0 到其长度被排除的符号。

        所以我们可以用两个循环来做到这一点,一个升序,一个降序,都嵌套以获取所有符号。

            int i, j;
        
            for (i = 0; i < 6; i++)
            {
                    for (j = 0; j <= i; j++)
                            printf("%d", j);
                    printf("\n");
            }
            for (i = 5; i > 0; i--)
            {
                    for (j = 0; j < i; j++)
                            printf("%d", j);
                    printf("\n");
            }
        

        第二个for 可以替换为while(--i),因为i 从上一个循环的末尾开始。

        输出:

        0
        01
        012
        0123
        01234
        012345
        01234
        0123
        012
        01
        0
        

        【讨论】:

        • 非常感谢,正是我想要的:)
        【解决方案5】:

        使用单个循环代替 N 循环,一旦最后一个计数器超过其限制,它就会重置其计数器和限制。当其中一个旧循环结束时,插入换行符,将计数器设置回 -1,并增加限制(您要测试计数器的变量)。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-01-26
          • 1970-01-01
          • 2023-03-03
          • 1970-01-01
          • 2022-08-23
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多