2

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

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

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

抱歉,如果之前已经回答过这个问题,但我无法表达我的问题。

#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");
    }
}
4

2 回答 2

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):

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

尝试一下!

于 2018-10-31T19:04:00.183 回答
0

使用 GCC 6.3 将其复制并粘贴到 codechef.com/ide。有一些示例金字塔,左右中间颠倒和右侧向上。为了回答您的具体问题, j 在第二个(嵌套)for 循环中被分配给 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");
    }

}
于 2018-10-31T19:14:22.250 回答