2016-08-15 2 views
3

Я просматриваю онлайн-курс Harvard CS50, и одна из проблем - создать «пирамиду стиля марио», используя пробелы и хэши. У меня есть пространство, но хеши дают мне проблемы. Вот код:Создание «пирамиды стиля Марио»

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

int main(void) 
{ 
    //get height between 1 and 23 
    int height; 
    do 
    { 
     printf("Please enter a height: "); 
     height = GetInt(); 
    } 
    while (height < 1 || height > 23); 

    //build pyramid 
    for (int i = 0; i < height ; i++) 
    { 
     //add spaces 
     for (int space = height - 1 - i; space >= 0; space--) 
      printf(" "); 

     //add hashtags 
     for (int hash = 2 + i; hash <= height; hash++) 
      printf("#"); 

     printf("\n"); 
    } 
} 

Когда я запустить его в терминале с высоты 5 я получаю это:

 #### 
    ### 
    ## 
    # 
    <-- space here also 

, когда я хочу это:

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

Любая обратная связь был бы признателен, спасибо

+3

Если вы посмотрите на другие вопросы, отмеченные CS50, есть множество проблем, связанных с этой же проблемой - возможно, на e тех вопросов и ответов поможет. Введите '[cs50] mario' в поле поиска. –

+0

вы смешиваете себя с противоположными петлями. один уменьшается, один увеличивается.просто пойдите с двумя увеличивающимися петлями. второй (хеши) основывается на том, сколько пробелов было выпущено в первом. –

+0

Для себя я бы использовал один цикл и локальную константу, инициализированную 21 пробелом, за которой следуют 23 хэша (SO не позволит мне вставлять itas, это сжимает пробелы). Я оставлю детали для читателя :) Это выиграло ' t дайте вам пирамиду, но рампу – kdopen

ответ

6

Просто попробуйте его со следующим кодом:

int main(void) 
{ 
    int height; 
    printf("Please enter a height: "); 
    scanf("%d", &height); 

    //build pyramid 
    for (int i = height; i >= 1; i--) 
    { 
     //add spaces 
     for (int space = 1; space < i; space++) 
      printf(" "); 

     //add hashtags 
     for (int hash = height; hash >= i-1; hash--) 
      printf("#"); 

     printf("\n"); 
    } 
} 

когда значение height является , вы получите желаемый результат:

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

ВИДЕТЬ Working Fiddle.


В коде, когда значение i является в:

for (int i = 0; i < height ; i++) 
     ^^^^^^ 

других контуров выполняется следующим образом:

for (int space = height - 1 - i; space >= 0; space--) 
    printf(" "); 

здесь, цикл инициализирует пространство = 4 (когда height -), и условие цикла действует до space >= 0, поэтому оно печатает первые 4 символа как " ".

И, наконец, когда дело доходит до этого цикла:

for (int hash = 2 + i; hash <= height; hash++) 
    printf("#"); 

здесь, цикл инициализирует хэш = 2(i был в первом цикле, помните?) и условия цикла продолжаются до hash <= height. Так, он печатает следующие 4 символа в "#" как выше условие оценивается 2,3,4,5 в:

(int hash = 2; hash <= 5; hash++) 
      ^^^  ^^^ 

и остальная часть кода осуществляет и производит вывод, как:

 #### 
    ### 
    ## 
    # 

Если вы сможете понять вышеприведенную логику, тогда вы также сможете расшифровать мое решение :)

+5

Вы должны объяснить, что не так с исходным кодом и как ваш ответ исправляет его. Он не узнает, если вы просто напишете ответ за него. – Barmar

+0

@ Бармар, спасибо. Надеюсь, это дает ясное объяснение :) –

+1

очень полезное объяснение, спасибо! – roncook

Смежные вопросы