Для цикла, дающего неожиданные результаты в C - PullRequest
0 голосов
/ 31 октября 2018

Я только начал изучать курс cs50, но у меня возникли проблемы с первым листом проблем. Цель состоит в том, чтобы произвести выровненные по правому краю шаги (шаги, которые вы используете в Mario непосредственно перед завершением уровня и прыжок на флагшток).

Код, который я написал, производит шаги, но не выровнен по правому краю.

Но почему мой код производит шаги? Не должно ли условие для второго цикла for всегда быть ложным, поскольку i = j при выполнении второго цикла for?

Извините, если на этот вопрос уже был дан ответ, но у меня возникли проблемы с формулировкой моего вопроса.

#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 голосов
/ 31 октября 2018

Скопируйте и вставьте это в codechef.com/ide, используя GCC 6.3. Есть несколько образцов прямидов, слева направо и вверх и вниз. Чтобы ответить на ваш конкретный вопрос, j присваивается 0 во втором (вложенном) цикле for, поэтому 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");
    }

}
0 голосов
/ 31 октября 2018

Хорошая попытка; однако вам нужно будет напечатать серию пробелов перед вашими шагами, чтобы произвести выравнивание по правому краю. Это не обязательно очевидно, поскольку пробелы невидимы (и не нужны для выровненного по левому краю треугольника).

Формула для количества печатаемых пробелов равна 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):

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

Попробуйте!

...