Как сделать так, чтобы пирамида (программа CS50 Mario), сформированная этим кодом, была выровнена по правому краю?

Пожалуйста, помогите мне правильно создать пирамиду с высотой "n", используя хэши и пробелы, выровненные по правому краю. Я разместил сам код ниже. Программа правильно запрашивает ввод данных пользователем, но не строит пирамиду по правому краю. Если кто-то может исправить это, пожалуйста, помогите.

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

int main(void)
{
    int i=0;
    int n=0;

    do
    {
        printf("Height:");
        n=GetInt();
    } while (n<0 || n>23);

    for (i=0; i<n; i++)
    {
        printf(" ");
        for (int x=0; x<i+2; x++)
        {
            printf("#");
        }
        printf("\n");
    }

    return 0;
}

person SKammala    schedule 31.08.2015    source источник
comment
Интересно, что происходит, когда вы ищете на сайте вопросы C, содержащие пирамиду... stackoverflow.com/search?q= %5Bc%5D+пирамида   -  person paddy    schedule 31.08.2015


Ответы (12)


Вот одно из правильных решений!

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

void buildPyramid(int height);

int main(void)
{
    // Initialize the variable height
    int height;

    // Run the loop to get a value of height between 1 and 8, inclusive, from the user
    do
    {
        height = get_int("Height: ");
    }
    while (height < 1 || height > 8);

    // Call the function and pass height to it as a parameter
    buildPyramid(height);
}

// Declare the function buildPyramid
void buildPyramid(int height)
{
    // Loop to add a new line
    for (int i = 0; i < height; i++)
    {
        // Loop to add spaces
        for (int k = height - i; k > 1; k--)
        {
            printf(" ");
        }
        // Loop to add hashes
        for (int j = 0; j <= i; j++)
        {
            printf("#");
        }
        printf("\n");
    }
} 
person harshdeeply    schedule 24.05.2020

Внутри вашего основного цикла у вас есть:

// Instruction for printing 1 space
// Sub loop for printing x+1 number of hashes
// Instruction for printing a new line

Таким образом, каждый раз, когда он зацикливается, он правильно рисует хэши и новую строку, но вы не говорите ему рисовать не более 1 пробела каждый раз, поскольку, в отличие от подцикла для хэшей, инструкция не увеличивается с каждым проходом.

person Philip Burgess    schedule 23.09.2015
comment
это не решение проблемы; это похоже на псевдокод. - person rags2riches; 10.05.2020

Вот как я решил версию этой проблемы с обеими сторонами, но вы можете заставить ее работать только с одной, просто используйте 2 цикла for вместо трех.

Если нам нужно взять число от 1 до 8 в качестве входных данных, которое является высотой нашей пирамиды, мы можем использовать один цикл for для вывода каждой строки пирамиды.

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

А так как нам нужна и другая сторона пирамиды, мы будем использовать всего три петли внутри нашего основного цикла.

Почему три петли, а не четыре? Потому что на самом деле нам не нужно печатать место на правой стороне пирамиды.

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

Эти циклы for работают в противоположном направлении, то есть чем больше у нас пробелов, тем меньше хэшей мы печатаем, и наоборот.

Итак, окончательное решение CS50 Pset 1 Mario More выглядит именно так:

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

int main(void)
{
int height;

do {
    height = get_int("Height: ");
}
while (height < 1 || height > 8);

if (height > 0 || height < 9) {
    int counter = 0;
    for (int row=0; row<height; row++) {
        if (counter != height) {
            for (int spaces = (height-1) - counter; spaces > 0; spaces--) {
                printf(" ");
            }
            for (int hashes = 0; hashes <= counter; hashes++) {
                printf("#");
            }

  //ignore this block below if you want only one side

            printf("  "); 

            for (int hashes = 0; hashes <= counter; hashes++) {
                printf("#");
            }

  //##################################################

            printf("\n");
            counter++;
        }
    }     
}       
}

Я даже сделал сообщение в блоге об этом, так как Мне нравится делать заметки на случай, если вам понадобится дополнительная информация.

person Goran Spasojevic    schedule 02.08.2019

Вот как я заставил его работать на Марио более комфортно.

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

int main(void)
{
    int n;
    do
    {
        n = get_int("Height: ");
    }
    while (n < 1 || n > 25);
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (i + j < n - 1)
                printf(" ");
            else
                printf("#");  
        }
            printf("  ");
            for (int j = 0; j < n; j++)
                {
                    if (n - i < j + 2)
                        printf("#");
                }       
                printf("\n");
    }
}
person james    schedule 12.03.2020

Я думаю, что ваш код не будет работать должным образом в последнем необработанном виде, для этого второй цикл начинается с автоматического добавления пустого блока для каждой i-й итерации, однако последняя i-итерация для построения базового необработанного файла не имеет пустых блок, а только #s. Код должен выглядеть примерно так:

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

int main(void)
{   int height;
    do {
    height = get_int("height: ");
}
    while (height<1 || height>8);
int i, j;
for ( i = 0; i < height; i++) {
    for ( j = 0; j < height; j++) {
        if (j + i < height - 1) {
            printf(" ");
         } else {
            printf("#");
         }         
    } 
    printf("\n");
}
}
person Sal    schedule 15.09.2020

Можно ли решить вышеуказанную проблему с помощью так называемой программы width.c из книги C Primer Plus Стивена Прата?

/* width.c -- field widths */
#include <stdio.h>
#define PAGES 959
int main(void)
{
printf("*%d*\n", PAGES);
printf("*%2d*\n", PAGES);
printf("*%10d*\n", PAGES);
printf("*%-10d*\n", PAGES);
return 0;
}
person Splendid Digital Solutions    schedule 04.08.2021

int main(void)
{
    do
    {
        height = get_int("Height: "); //Requesting input from user for height.
    }

    while (height < 0 || height > 8); //Limits user input to between 0 and 8.

    for (int rows = 1; rows <= height; rows++)
    {
        for (int spaces = 0; spaces < (height - rows); spaces++) //Based on the row number, there will be a certain amount of spaces. E.g. If the height is 8 and it is row 1, there are 7 spaces.
        {
            printf(" ");
        }

        for (int hashes = 0; hashes < rows; hashes++) //Based on which row it is, the number of hashes printed is equal to the row number. E.g. row 1 has 1 hash.
        {
            printf("#");
        }

        printf("  ");

        for (int hashes = 0; hashes < rows; hashes++) //This prints the right side of the pyramid. No need to print the spaces.
        {
            printf("#");
        }
        printf("\n");
    }

Надеюсь, этот код достаточно разумен, чтобы его прочитать, и надеюсь, что он поможет!

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

person papiChulis    schedule 19.12.2020

person    schedule
comment
Добро пожаловать в Stack Overflow! Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и/или как этот код отвечает на вопрос, повышает его ценность в долгосрочной перспективе. - person Jonathan Leffler; 30.07.2016
comment
@JonathanLeffler контекста нет, потому что это решение потенциально копируется и вставляется из репозиторий github за 2014 год... - person rags2riches; 10.05.2020

person    schedule
comment
Было бы полезно добавить некоторое объяснение того, что вы сделали, чтобы исправить это. - person Raf; 08.05.2020

person    schedule
comment
Добро пожаловать в Stack Overflow! Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и/или как этот код отвечает на вопрос, повышает его ценность в долгосрочной перспективе. - person Ajean; 20.05.2016
comment
Не решает проблему. Вы пропустили требование ввести действительный номер, прежде чем что-либо печатать. - person James; 21.01.2017

person    schedule
comment
Добро пожаловать в Stack Overflow! Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, почему и/или как этот код отвечает на вопрос, повышает его ценность в долгосрочной перспективе. - person Jonathan Leffler; 30.07.2016

person    schedule
comment
Вы не должны просто вставлять кучу кода, вы должны объяснить это - person rafaelcpalmeida; 30.06.2016