For 循环在 C 中产生意想不到的结果

For loop producing unexpected results in C

我刚开始学习 cs50 课程,但遇到第一个问题 sheet。目的是生成右对齐的步骤(您在马里奥中使用的步骤,就在完成关卡并跳上旗杆之前)。

我编写的代码生成了步骤但未右对齐。

但为什么我的代码会产生这些步骤?由于 i = j 执行第二个 for 循环时,第二个 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");
    }
}

很好的尝试;但是,您需要在步骤之前打印一系列空格以产生右对齐。这不一定很明显,因为空格是不可见的(对于左对齐的三角形来说是不必要的)。

要打印的空格数公式为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!

将其复制并粘贴到 codechef 中。com/ide 使用 GCC 6.3。有一些样品金字塔,左右中心上下颠倒。为了回答您的特定问题,在第二个(嵌套的)for 循环中将 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");
    }

}