函数无限循环 - do/while 个函数

Function is looping infinitely - do/while functions

目标:

执行一个程序,打印出指定高度的双半金字塔,如下所示。

$ ./mario
Height: 4
   #  #
  ##  ##
 ###  ###
####  ####

问题:

过去 3 个小时左右一直在弄乱代码。我让第一行开始工作,但除此之外的所有内容都只是 2 个由单个散列标记组成的平行支柱。目前,程序正在无限打印哈希标记。

代码:

int main (void) {
    // user gives height value for pyramid
    // h = height
    int h;
    do {
        printf (
            "How tall do you want your pyramid to be? Please type a number "
            "between 0 and 23.\n");
        h = get_int ();

    } while (h < 0 || h > 23);

    // Left side of pyramid says spaces first, followed by hashes. Two spaces
    // inbetween sides of the pyramid. Right side renders hashes first, then
    // inputs newline character.
    // r = row
    // s = space
    // p = hash
    // q = hash right
    int q;
    int p;
    int s;
    int r;
    for (r = 0; r < h; r++) {
        do {
            do {
                printf (" ");
                s++;
            } while (s < h - r);

            // says spaces

            do {
                printf ("#");
                p++;
            } while (p < r++);

            // says left hashes

            // always print 2 spaces inbetween
            printf ("  "); // two spaces

            do {
                printf ("#");
                q++;
            } while (q < r++);
            // says right hashes

            printf ("\n");
            q = 0;
            p = 0;
            s = 0;
            // reset q,p,s values

        } // end bracket of encompassing 'do' function
        while (r < h);
        //'for' function should execute once, increment 'r' by 1, and repeat
        //until row height becomes height provided by user.

    } // end bracket of for loop

} // end bracket of int main

预期结果:

程序创建由散列符号和空格组成的金字塔。

实际结果:

无限循环打印功能。

你的循环结束是这样的:

 p++;
}
while (p < r++);

所以 r 总是在 p 之前,因为你同时增加了两者。那就是你的无限循环。

我在第二个 while 内循环 r++ 之后得到了一个很好的结果,如下所示:

   #  #
  #  #
 ##  ##
###  ###

所以仍然需要一些调整,你就在这里。另一个问题是 do/while 即使条件为假也执行一次。替换为 while 循环,否则你就像上面那样:

    do
    {
        while (s < h - r)
        {
            printf(" ");
            s++;
        }
        //says spaces

        while (p < r)
        {
            printf("#");
            p++;
        }

        //says left hashes

        //always print 2 spaces inbetween
        printf("  ");

        //two spaces

        while(q < r)
        {
            printf("#");
            q++;
        }

        //says right hashes
        r++;
        printf("\n");
        q = 0;
        p = 0;
        s = 0;
        // reset q,p,s values

    }//end bracket of encompassing 'do' function
    while(r < h);

请注意,使用 "Notepad++ / TextFX / TextFX edit / Reindent C++ code"

自动缩进代码也很便宜
         #  #
        ##  ##
       ###  ###
      ####  ####
     #####  #####
    ######  ######
   #######  #######
  ########  ########
 #########  #########

一个较短的实现,供您学习

int i,j;
for (i=0 ; i<h ; i++) {            // h lines
    for(j=0 ; j < h+2+i+1 ; j++) { // cover all characters on 1 line
        printf("%s", j<h-i-1 || j<h+2 && j>=h ? " " : "#");
    }
    printf("\n");                  // end of line
}

关于j<h-i-1 || j<h+2 && j>=h ? " " : "#"

  • j<h-i-1 第一个 #
  • 前的空格
  • j<h+2 && j>=h #s
  • 之间的空格
  • ?: 运算符:C ? A : B 转换为 如果 C 为真则给 A 否则给 B