For循环在C中产生意外结果

时间:2018-10-31 18:50:49

标签: c loops for-loop cs50

我刚开始进行CS50课程,但是遇到第一份问题单时遇到了麻烦。目的是产生正确对齐的步骤(在完成关卡并跳到旗杆之前在Mario中使用的步骤)。

我编写的代码产生了步骤,但并没有正确对齐。

但是为什么我的代码会产生这些步骤?因为第二个for循环执行时i = j,所以第二个for循环的条件不应该总是为false吗?

很抱歉,如果以前已经回答过,但是我在表达问题时遇到了困难。

#include <stdio.h>
#include <cs50.h>

int main(){

    int height = get_int("How tall are the pyramids: ");

    for (int i = 0; i < height; i++){
        printf("##");

        for (int j = 0; j < i; j++){
            printf("#");
        }
        printf("\n");
    }
}

2 个答案:

答案 0 :(得分:2)

好尝试;但是,您需要在执行步骤之前打印一系列空格以产生右对齐。由于这些空间是不可见的(对于左对齐的三角形是不必要的),这不一定是显而易见的。

要打印的空格数的公式为height - row_number - 1,而要打印的步骤字符数的公式为row_number + 1(或column_number <= row_number)。我建议尝试这些数字并尝试产生不同的模式,这将有助于您的理解。 -1 / +1额外的偏移量是为了避免在三角形上方打印空白行。

要回答有关第二个循环终止条件的问题,只有在您打印出的行数少于行号的情况下,它才会为假,而第一个循环是相反的。

#include <stdio.h>
#include <cs50.h>

int main() { 
    int height = get_int("How tall are the pyramids: ");

    for (int i = 0; i < height; i++) {
        for (int j = 0; j < height - i - 1; j++) {
            printf(" ");
        }

        for (int j = 0; j <= i; j++) {
            printf("#");
        }

        printf("\n");
    }
}

输出(高度= 10):

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

Try it!

答案 1 :(得分:0)

使用GCC 6.3将其复制并粘贴到codechef.com/ide中。有一些示例性的pryamids,左右中间都上下颠倒,而右边向上。为了回答您的特定问题,在第二个(嵌套)循环中将j分配为0,因此在循环开始时j不等于i。

#include <stdio.h>
int main(){

    int height = 10;//get_int("How tall are the pyramids: ");

    printf("regular left justified\n");
    for (int i = 0; i < height; i++){
        printf("##");

        for (int j = 0; j < i; j++){
            printf("#");
        }
        printf("\n");
    }

    printf("Upside down left justified\n");
    for (int i = height; i >0 ; i--){
        printf("##");

        for (int j = 0; j < i; j++){
            printf("#");
        }
        printf("\n");
    }

    printf("upside down centered pryamid\n");
    for (int i = 0; i < height; i++){
        //printf("##");

        for (int j = 0; j < i; j++){
            printf(" ");
        }
        for( int j=i; j<height; j++){
            printf("##");    
        }
        printf("\n");
    }

    printf("regular centered pryamid\n");
    for (int i = 0; i < height; i++){
        //printf("##");

        for (int j = height; j > i; j--){
            printf(" ");
        }
        for( int j=height; j>=height-i; j--){
            printf("##");    
        }
        printf("\n");
    }

    printf("regular right justified\n");
    for (int i = 0; i < height; i++){
        //printf("##");

        for (int j = height; j > i; j--){
            printf(" ");
        }
        for( int j=height; j>=height-i; j--){
            printf("#");    
        }
        printf("\n");
    }

    printf("upside down right justified\n");
    for (int i = 0; i < height; i++){
        //printf("##");

        for( int j=height; j>=height-i; j--){
            printf(" ");    
        }

        for (int j = height; j > i; j--){
            printf("#");
        }

        printf("\n");
    }

}