Рисунок проверили сетки


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

Набор Проблем

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

#include <iostream>
using std::cout;
using std::cin;


void printSmallSquares(int SquareSize, int width, bool cond) {
bool stars = cond;
    printf("%s", "\n*");
    for (int i = 0; i < width; i++) {
        for (int i = 0; i < SquareSize; i++)
        {
            printf("%s", (stars ? "*" : " "));  
        }
    stars = !stars;
}
printf("%s", "*");
}

int main() {
int Height = 8;
int Width = 16;
int SquareSize = 6;

for (int j = 0; j < Height; j++) {
    for (int i = 0; i < Width * SquareSize + 2; i++) {
        printf("%s", "*");
    }

    for (int i = 0; i < SquareSize; i++) {
        (j % 2 == 0 ? printSmallSquares(SquareSize, Width, true) : printSmallSquares(SquareSize, Width, false));
    }
    printf("%s", "\n");
}
for (int i = 0; i < Width * SquareSize + 2; i++) {
    printf("%s", "*");
}
cin >> Width;

}


397
4
задан 11 февраля 2018 в 06:02 Источник Поделиться
Комментарии
1 ответ

Есть некоторые вещи, чтобы рассмотреть:


  1. У вас уже есть using std::coutоднако вы используете printf

    for (int i = 0; i < Width * SquareSize + 2; i++) {
    std::cout << "*";
    }

  2. Правка: вижу, что std::cout берет std::string, так что вы должны включить заголовок.
    C++ в основном работает с std::string а не равнина char массивы. Теперь, если вы посмотрите на std::string есть этот конструктор string (size_t n, char c) так что вы можете сделать сейчас, это заменить петли конструктором:

    std::cout << std::string(Width * SquareSize + 2, "*");

  3. Вы передаете результат логического сравнения, логический:

    for (int i = 0; i < SquareSize; i++) {
    (j % 2 == 0 ? printSmallSquares(SquareSize, Width, true) : printSmallSquares(SquareSize, Width, false));
    }

    Просто передать сравнению напрямую:

    for (int i = 0; i < SquareSize; i++) {
    printSmallSquares(SquareSize, Width, j % 2 == 0);
    }

  4. Очевидно, вы должны использовать соответствующий класс для ваших задач:

    class DrawCheckedGrid {

    DrawCheckedGrid(const int heigth, const int width const int size)
    : Height(height)
    , Width(width)
    , SquareSize(size)
    {}
    private:
    int Height;
    int Width;
    int SquareSize;
    }

    Теперь, когда у вас есть класс, вы можете выделить все, что вам нужно

    std::string stars = std::string(SquareSize, "*");
    std::string spaces = std::string(SquareSize, " ");
    std::string separator = std::string(Width * SquareSize + 2, "#") + "\n";

    Также вы можете просто создать некоторые вспомогательные методы, рисовать сетку, а не сантехники все в main():

    void drawLines(bool starsFirst) const {
    for (int line = 0; line < Width; ++line) {
    drawLine(starsFirst);
    }
    std::cout << separator;
    }

    void drawLine(bool starsFirst) const {
    const int offset = starsFirst ? 0 : 1;
    for (int square= offset; square < Width + offset; ++square) {
    std::cout << (square % 2 == 0 ? stars : spaces);
    }
    std::cout << "\n";
    }

    void drawGrid() const {
    std::cout << separator;
    for (int i = 0; i < Height; ++i) {
    drawLines(i%2 == 0);
    }
    }

    Увидев, что я создал несколько маленьких помощников, которые делают одно дело за раз, а не одна большая функция.

    class DrawCheckedGrid {
    DrawCheckedGrid(const int heigth, const int width const int size)
    : Height(height)
    , Width(width)
    , SquareSize(size)
    {
    stars = std::string(SquareSize, "*");
    spaces = std::string(SquareSize, " ");
    separator = std::string(Width * SquareSize + 2, "#") + "\n";
    }

    void drawGrid() const {
    std::cout << separator;
    for (int i = 0; i < Height; ++i) {
    drawLines(i%2 == 0);
    }
    }
    private:

    void drawLines(bool starsFirst) const {
    for (int line = 0; line < Width; ++line) {
    drawLine(starsFirst);
    }
    std::cout << separator;
    }

    void drawLine(bool starsFirst) const {
    const int offset = starsFirst ? 0 : 1;
    for (int square= offset; square < Width + offset; ++square) {
    std::cout << (square % 2 == 0 ? stars : spaces);
    }
    std::cout << "\n";
    }
    int Height;
    int Width;
    int SquareSize;
    std::string stars;
    std::string spaces;
    std::string separator;
    }

    Здесь вы также можете увидеть, что все внутренние функции являются частными, поэтому мы не протекают наши внутренние органы. Вы также можете добавить функции, которые позволяют изменять параметры сетки и что-то передать drawGrid().


4
ответ дан 12 февраля 2018 в 07:02 Источник Поделиться