Не могу обернуть голову вокруг проблемы буквенной пирамиды - PullRequest
0 голосов
/ 16 апреля 2020
// Letter Pyramid
// Written by Frank J. Mitropoulos

#include <iostream>
#include <string>


int main()
{
    std::string letters{};

    std::cout << "Enter a string of letters so I can create a Letter Pyramid from it: ";
    getline(std::cin, letters);

    size_t num_letters = letters.length();

    int position {0};

    // for each letter in the string
    for (char c: letters) {

        size_t num_spaces = num_letters - position;
        while (num_spaces > 0) {
            std::cout << " ";
            --num_spaces;
        }

        // Display in order up to the current character
        for (size_t j=0; j < position; j++) {
            std::cout << letters.at(j);
        }

        // Display the current 'center' character
        std::cout << c;

        // Display the remaining characters in reverse order
        for (int j=position-1; j >=0; --j) {
            // You can use this line to get rid of the size_t vs int warning if you want
            auto k = static_cast<size_t>(j);
            std::cout << letters.at(k);
        }

        std::cout << std::endl; // Don't forget the end line
        ++position;
    }

    return 0;
}

Здравствуйте, я изучаю C ++ как новичка, и я не могу, кажется, gr asp лог c этой программы. Так, например, если я введу AB C, результат будет:

    A
   ABA
  ABCBA

как num_spaces дает мне пробелы? Также дисплей в порядке до текущего символа. Он создал для l oop, но если я правильно читаю, j не будет 0, а position будет 0, так как 0 <0? и что при этом имеет отношение к letters.at (j). Я очень смущен большинством программ, если кто-то может мне это объяснить, это было бы здорово! </p>

1 Ответ

0 голосов
/ 16 апреля 2020

Позвольте мне объяснить вам, как работает программа.

Сначала переменная "letters" определяется как std::string. Он инициализируется с пустой инициализированной скобкой по умолчанию и, следовательно, пуст.

Все varaible должны быть инициализированы во время определения.

Затем мы просим пользователя программы ввести тест строка, используя оператор вставки для записи текста в консоль (std :: cout).

Далее мы читаем полную строку от пользователя. Итак, все, что он печатает, пока не нажмет, вводит.

С помощью size_t num_letters = letters.length(); мы получаем количество символов, введенных пользователем. Включая пробелы, бит без окончания "\ n" (производится командой enter).

Длина строки важна для построения пирамиды. Положение переменной определяется и инициализируется 0. Это индикатор строки, над которой работает программа. Он будет увеличиваться на 1 в конце каждого запуска l oop (из диапазона, основанного на l oop).

Итак, он начинается с 0, а затем в следующем l oop это будет один, затем 2 и так далее. Поскольку l oop работает так же, как у нас есть буквы в данной строке, "position" будет равна длине строки.

OK, nect для for l oop. Для каждого символа в строке у нас будет один l oop пробег.

И теперь, наиболее важным для вас является следующая строка.

size_t num_spaces = num_letters - position;

Для строки "AB C "num_letters всегда равно 3. position для первого l oop 0, затем 1, а затем 2.

Итак, num_spaces будет первым: 3, затем 2 и затем 1.

В то время как l oop напечатает num_spaces пробелов в этой строке. В первом ряду будет напечатано 3 пробела, в следующем ряду 2, а затем 1 пробел.

И после этого он напишет правильное письмо.

С помощью этого механизма мы получим эффект памиды.

Следующий l oop будет печатать буквы из оригинальная строка. В первом l oop: Ничего, потому что j равно 0, а позиция - 0. В следующем l oop он напечатает затем A и затем B.

Следующий оператор напечатает текущий символ. Итак, сначала A, затем B, а затем C.

А затем все остальное будет напечатано в обратном порядке.

В конце мы получим новую строку, а затем переменную позицию увеличиваем, чтобы начать новую строку.

Надеюсь, это поможет -

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...