Как исправить мой код для CS50 PSET 1 Марио менее комфортно - PullRequest
0 голосов
/ 01 февраля 2019

Мое решение cs50 pset 1 (mario менее комфортно) не распечатывает пирамиду.Вместо этого он просто печатает один #.Я пробовал это несколько раз, но все, что я получаю, - это ошибки при попытке компилировать, говоря, что он не идентифицирует int i или что точку с запятой следует переместить на новую строку.Как только я перешел на этот код, ошибки наконец-то прекратились, и он правильно вводит данные, но не печатает пирамиду.

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

int main(void)
{
int height;
int spaces;
int hashes;
int row;

do
{
    printf("Height: ");
    height = get_int();
}

while (height < 0 || height > 23);

for (row = 1; row <= height; row++)
    ;
{

    for (spaces = (height - 1) - row; spaces >= 0; spaces--)
        ; 
    {
        printf(" ");
    }

    for (hashes = 2; row < hashes; hashes++)
        ;
    {
        printf("#");
    }
    printf("\n");
}

}

Это вывод в терминале

$ make mario clang -fsanitize = sign-integer-overflow -fsanitize = undefined -ggdb3 -O0 -std = c11 -Wall -Werror -Wextra -Wno-sign-сравнить -Wno-неиспользованный-параметр -Wno-неиспользованный-переменная -Wshadow mario.c -lcrypt -lcs50 -lm -o mario $ ./mario Высота: 15 #

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Пользователь Blaze alerady дал прекрасное объяснение происходящего.Я хотел бы добавить следующее для ясности:

Синтаксис оператора for примерно такой:

for ( ... ) <statement>

Где <statement> может быть любым оператором, , включая пустойоператор .

Точка с запятой - это терминатор оператора .Это указывает на конец утверждения.Если вы пишете только точку с запятой, это завершает пустой оператор .В результате ваше тело цикла состояло из пустого оператора .

(В качестве другого примера точки с запятой в качестве завершителя оператора: 2+2;, который превращает выражение в оператор.)

0 голосов
/ 01 февраля 2019

Ваша главная проблема - точки с запятой после циклов for.Они образуют тело цикла for, поэтому цикл ничего не делает.Другими словами, это здесь

for (spaces = (height - 1) - row; spaces >= 0; spaces--)
        ;
    {
        printf(" ");
    }

просто превращается в

{
    printf(" ");
}

И аналогично для двух других for циклов.Вот почему то, что вы хотите, чтобы происходило в цикле, происходит только один раз: то, что вы считали телом цикла for, на самом деле не имеет ничего общего с указанным циклом, поэтому он запускается только один раз.

Кроме того, условие цикла здесь

for (hashes = 2; row < hashes; hashes++)

Неверно, должно быть наоборот.Возможно, вам нужно что-то похожее на это:

for (hashes = 2; hashes < row*2; hashes++)

Наконец, int main должен возвращать int, поэтому добавьте return 0; в конец функции.

...