我需要一些帮助来创建某种形状/图案

时间:2019-09-05 09:31:50

标签: c++

我正在尝试制作这种图案

enter image description here

但是我似乎无法掌握它。

我做的第一部分是我的代码

这是我目前的输出

输入行数:4

   *
  ***
 *****
*******

*******
 *****
  ***
   *

这是我当前的输出,我只需要在它们之间添加中间部分。我需要一些帮助。感谢您的帮助。 我当前的输出与间距有点偏离。

1 个答案:

答案 0 :(得分:0)

您应该将代码拆分为功能。然后您的主要功能应如下所示:

int main() {
    const auto rows = []() {std::size_t r; std::cin >> r; return r;}();
    printHeader(rows);
    printDashes(rows);
    printMid(rows);
    printDashes(rows);
    printFooter(rows);
    return 0;
}

可以用

打印第一个金字塔
void printStarsLine(const std::size_t row, const std::size_t rows) {
    const std::size_t stars = 1 + 2 * row;
    const std::size_t spaces = 2 * rows - row;

    std::cout << std::string(spaces, ' ')
              << std::string(stars, '*')
              << std::string(spaces, ' ')
              << '\n';
}

void printHeader(const std::size_t rows) {
    for (std::size_t i {0}; i < rows; ++i) {
        printStarsLine(i, rows);
    }
}

底部金字塔是还原后的顶部金字塔

void printFooter(const std::size_t rows) {
    for (std::size_t i {rows}; i > 0; --i) {
        printStarsLine(i - 1, rows);
        std::cout << '\n';
    }
}

破折号是简单的破折号

void printDashes(const std::size_t rows) {
    const std::size_t dashes = 2 * rows + 1;

    std::cout << std::string(rows, ' ')
              << std::string(dashes, '-')
              << std::string(rows, ' ')
              << '\n';
}

并且中间部分可以用

打印
void printMidLine(const std::size_t row, const std::size_t rows) {
    const std::size_t spaces = rows - 1 - row;

    std::cout << std::string(spaces, ' ')
              << std::string(row + 1, '*')
              << '|'
              << std::string(2 * rows - 1, '*')
              << '|'
              << std::string(row + 1, '*')
              << std::string(spaces, ' ')
              << '\n';
}

void printMid(const std::size_t rows) {
    for (std::size_t i {0}; i < rows; ++i) {
        printMidLine(i, rows);
    }
    for (std::size_t i {1}; i < rows; ++i) {
        printMidLine(rows - i - 1, rows);
    }
}

整个代码是

#include <cstddef>
#include <iostream>
#include <string>

void printStarsLine(const std::size_t row, const std::size_t rows) {
    const std::size_t stars = 1 + 2 * row;
    const std::size_t spaces = 2 * rows - row;

    std::cout << std::string(spaces, ' ')
              << std::string(stars, '*')
              << std::string(spaces, ' ')
              << '\n';
}

void printHeader(const std::size_t rows) {
    for (std::size_t i {0}; i < rows; ++i) {
        printStarsLine(i, rows);
    }
}

void printFooter(const std::size_t rows) {
    for (std::size_t i {rows}; i > 0; --i) {
        printStarsLine(i - 1, rows);
    }
}

void printDashes(const std::size_t rows) {
    const std::size_t dashes = 2 * rows + 1;

    std::cout << std::string(rows, ' ')
              << std::string(dashes, '-')
              << std::string(rows, ' ')
              << '\n';
}

void printMidLine(const std::size_t row, const std::size_t rows) {
    const std::size_t spaces = rows - 1 - row;

    std::cout << std::string(spaces, ' ')
              << std::string(row + 1, '*')
              << '|'
              << std::string(2 * rows - 1, '*')
              << '|'
              << std::string(row + 1, '*')
              << std::string(spaces, ' ')
              << '\n';
}

void printMid(const std::size_t rows) {
    for (std::size_t i {0}; i < rows; ++i) {
        printMidLine(i, rows);
    }
    for (std::size_t i {1}; i < rows; ++i) {
        printMidLine(rows - i - 1, rows);
    }
}

int main() {
    const auto rows = []() {std::size_t r; std::cin >> r; return r;}();
    printHeader(rows);
    printDashes(rows);
    printMid(rows);
    printDashes(rows);
    printFooter(rows);
    return 0;
}

printMid(rows);

可以替换为

for (int i {0}; i < rows; ++i) {
    const int spaces = rows - 1 - i;
    for (int j {0}; j < spaces; ++j) {
        std::cout << ' ';
    }
    for (int j {0}; j < i + 1; ++j) {
        std::cout << '*';
    }
    std::cout << '|';
    for (int j {0}; j < 2 * rows - 1; ++j) {
        std::cout << '*';
    }
    std::cout << '|';
    for (int j {0}; j < i + 1; ++j) {
        std::cout << '*';
    }
    for (int j {0}; j < spaces; ++j) {
        std::cout << ' ';
    }
    std::cout << '\n';
}
for (int i {1}; i < rows; ++i) {
    const int spaces = i;
    for (int j {0}; j < spaces; ++j) {
        std::cout << ' ';
    }
    for (int j {0}; j < rows - i; ++j) {
        std::cout << '*';
    }
    std::cout << '|';
    for (int j {0}; j < 2 * rows - 1; ++j) {
        std::cout << '*';
    }
    std::cout << '|';
    for (int j {0}; j < rows - i; ++j) {
        std::cout << '*';
    }
    for (int j {0}; j < spaces; ++j) {
        std::cout << ' ';
    }
    std::cout << '\n';
}