我必须用c ++在广场内画方形

时间:2015-07-30 12:47:18

标签: c++ loops drawing

我的任务是在广场内的广场内画广场。看起来像这样。对于10号投票,我们必须绘制:

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

我成功编写了这个代码:

int n;
std::cin>>n;


for(int i=0;i<n;i++) 
   std::cout<<"*";

std::cout<<std::endl <<"*";

for(int i=0;i<n-2;i++) 
    std::cout<<" ";

std::cout<<"*"<<std::endl <<"*";

for(int i=0;i<n-2;i++)
   std::cout<<" ";

std::cout<<"*"<<std::endl;

for(int i=0;i<n;i++)
    std::cout<<"*";

std::cout<<std::endl;

return 0;
}

,我必须在重复空格和&#34; *&#34;之间使用一些联系,我知道我必须使用数学表达式和布尔的代数&gt;我只需要一个提示,不要解决这个问题。我应该尝试将这个形状分成4或2个部分(最大的问题是这个最小的正方形或空白区域。它重复偶数和奇数,但对于偶数smoetimes它的balnk空间,有点像它的小方块。我希望你了解我的英语,并希望会有某种暗示或帮助......:D

1 个答案:

答案 0 :(得分:0)

这样做的一种方法是:

#include <iostream>
#include <algorithm>    // for std::min()

int dist (int dim, int r, int c)
{
    return std::min(std::min(r, dim-1-r), std::min(c, dim-1-c));
}

char char_at_point (int dim, int r, int c)
{
    if ((dist(dim, r, c) % 2) == 0) return '*';
    else return ' ';
}

int main() {
    int dim = 0;
    std::cin >> dim;

    for (int r = 0; r < dim; ++r)
    {
        for (int c = 0; c < dim; ++c)
            std::cout << char_at_point(dim, r, c);
        std::cout << std::endl;
    }
    return 0;
}

基本上,做这样的事情的最简单方法是有一个函数(在数学意义上),它告诉你是否需要在某个坐标处填充一个点。如果你有这个功能,你只需循环遍历整个方块的坐标,并使用该函数来决定是在那里打印星号还是空格字符。

在你的情况下,这个功能很容易构建;你可以确定每个点距离最外面正方形周长的距离,并且当且仅当距离可以被2整除时才填充该坐标。