Что не так с моим менее удобным кодом CS50 mario? - PullRequest
0 голосов
/ 11 апреля 2020

Вот копия моего кода:

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

int main(void)
{
    int height = get_int("Please enter a height between 1 and 8 (inclusive)\nHeight: ");

    if(0 < height && height < 9)
    for(int i = 0; i <= height; i++)
    {
        for(int s = (height - 1); s >= 1; s--)
        {
            printf("a");
        }

        for(int h = 1; h <= i; h++)
        {
            printf("#");
        }

        printf("\n");
    }

    else
    printf("Please try again.\n"),
    main();
}

Часть, которую я не могу понять, правильно печатает правильное количество пробелов, так как кажется, что переменная "s" не уменьшает после каждого l oop. (Я заменил пробелы буквой «а», чтобы я мог видеть, где код ошибся.) Цель кода - напечатать пирамиду #, выровненную по правому краю. Где я ошибся здесь?

Так, например, если пользователь вводит высоту 3, вывод будет:

aa

aa#

aa##

aa###

однако я хотел бы, чтобы вывод был:

aa#

a##

###

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Основная проблема является второй для l oop в вашем коде, когда вы печатаете «a». Каждый раз, когда вы нажимаете в этом конкретном l oop, вы в основном печатаете (высота - 1) раз «а». На самом деле, вы должны печатать каждый раз на одну букву «а» (и еще один хеш). Чтобы добиться этого, нам нужно настроить состояние s. Вместо этого

int s = height - 1; s >= 1

Используйте это

int s = height - i; s > 1

Так как ваш основной l oop имеет итератор i, мы можем используйте это здесь.

Вторая проблема заключается в том, что в соответствии с описанием набора проблем CS50 вы должны вывести " " (пробелы), а не "a". Для этого вам следует заменить "a" на " ".

Третий выпуск - ваш код печатает дополнительную строку с пробелами в начале. Вам нужно настроить главное для l oop с этим условием, чтобы удалить одну лишнюю строку.

i < height

И для for l oop, где вы печатаете символ #, вам нужно запустить итератор h с нуля, чтобы он печатался сразу с первой строки.

int h = 0
0 голосов
/ 12 апреля 2020

Лучшее решение - использовать встроенную функциональность printf, которая уже существует, сводя проблему к одному простому l oop.

#include <stdio.h>

int main(void) {
    int height = get_int("Please enter a height between 1 and 8 (inclusive)\nHeight: ");

    unsigned char blocks[height];
    memset(blocks, '#', height);

    for(int i=0; i<height; ++i)
    {
        printf("%*.*s\n", height, i+1, blocks);
    }
    return 0;
}

Вывод

Success #stdin #stdout 0s 4212KB
    #
   ##
  ###
 ####
#####
...