CS50 Mario (более удобный) Ошибка. почему мои пирамиды не выравниваются должным образом? - PullRequest
0 голосов
/ 11 февраля 2020

что не так с моим кодом? когда я запускаю оба из них по отдельности, пирамиды выравниваются правильно, но после того, как я уберу знак //, чтобы запустить их вместе, мои пирамиды облажаются. Пожалуйста, что я делаю не так?

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

int main(void)
{
    int H;
    //Ask for Height of Pyramid
    do {
        H = get_int("Height Please: ");

    } while (H<=0 || H > 8);
    for (int x=0;  x < H; x++)
        {
        // Create left Aligned Pyramid
           for (int y = 0; y < H; y++)
                   if (x + y < H - 1)
                      printf(" "); 
                  else 
                      printf("#");
                      printf("\n");

        // Create Right Aligned Pyramid
           for (int y = 0; y < H; y++)
                if (x-y>=0) 

                       printf(" "); //Space in Between both Pyramids
                       printf("#");

                 else 
                      printf(" ");                  
                     printf("\n");          
    }

}

1 Ответ

1 голос
/ 11 февраля 2020

Давайте начнем с первой проблемы: вам действительно следует использовать фигурные скобки, чтобы явно инкапсулировать ваши циклы и операторы if-else, иначе только последующий оператор будет частью этого. Например:

if (condition)
    goto fail;
    goto fail;

Только первая goto fail; является частью оператора if; вторая на самом деле является отдельной сущностью, даже если она имеет отступ, как если бы она была частью оператора if. (См. Это для разбивки реальной ошибки в коде Apple, на которой основан этот пример: https://dwheeler.com/essays/apple-goto-fail.html)

Так что исправьте правильные скобки и сделайте отступ правильно, чтобы код делал то, что похоже, что он делает.

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

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

int main(void)
{
    int H;
    //Ask for Height of Pyramid
    do {
        H = get_int("Height Please: ");

    } while (H<=0 || H > 8);

    for(int x = 0; x < H; x++) {
        // Create left Aligned Pyramid
        for(int y = 0; y < H; y++) {
            if (x + y < H - 1) {
                printf(" ");
            }
            else {
                printf("#");
            }
        }

        printf(" ");    // With the curly braces and indentation fixed, we can clearly see this is not part of the logic of the first pyramid, but rather between the first and second pyramids where a space should be

        // Create Right Aligned Pyramid
        for(int y = 0; y < H; y++) {
            if (x - y >= 0) {
                printf("#");
                // remove the space character that did not belong here and was causing compile errors when you failed to use curly braces
            }
            else {
                printf(" ");
            }
        }

        printf("\n");   // Much easier to see where this logic comes into play with curly braces and indentation fixed.

    }
}

Пример вывода (в жестком коде H = 4):

   # #   
  ## ##  
 ### ### 
#### ####
...