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

时间:2017-12-09 08:04:28

标签: c do-while cs50

目标:

实施一个程序,打印出一个指定高度的双半金字塔,按照下面的内容。

$ ./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

预期结果:

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

实际结果:

无限循环打印功能。

2 个答案:

答案 0 :(得分:1)

你的循环结束就像:

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

所以r始终领先于p,因为您正在增加两者。这是你的无限循环。

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

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

所以仍然有点调整,你就在这里。另一个问题是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 ++代码”自动添加代码也很便宜

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

答案 1 :(得分:1)

您的研究的较短实施

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 之前的
  • #个空格 {li> j<h+2 && j>=h #
  • 之间的空格
  • ?:运算符:C ? A : B转换为如果C为真,则为A,否则为B