打印ASCII艺术钻石

时间:2009-10-09 02:07:05

标签: c++

这是我在学校编程时遇到的一个家庭作业问题,我有点迷茫,所以请帮忙。这是一个问题:

  

编写一个应用程序   打印出一颗星号(*)   屏幕。中的行数   钻石由用户提供。如   例如,如果用户请求了   钻石有7条线,如下   会显示出来。

这是我到目前为止所做的:

{
  int nlines;
  int nsp;
  cout << "enter the number of lines (must be more then one)" << endl;
  cin >> nlines;
  while((nlines)<=0)
  {
    cout << "enter the number of lines (must be more then one)" << endl;
    cin >> nlines;
  }
  nsp=(nlines - 1)/2;
  for(int currspace = 1; currspace <= nsp; currspace++)
  {
    cout << " ";
  }
  cout << "*" << endl;
  for( int currentline = 0; currentline < nlines; currentline++)
  {
    for( int currentaster = 0; currentaster <= currentline; currentaster++)
      cout << "*";
    cout << endl;
  }
  return 0;

6 个答案:

答案 0 :(得分:15)

我不会尝试给出一个完整的答案,因为它是家庭作业,但我的直接建议是尝试将任务分解为一些子任务,每个子任务都更简单一些。例如,我从一个小函数开始,该函数除了使用指定的对齐打印出一行指定长度的星号之外什么也没做。从事物的外观来看,你可以很容易地处理它,而你拥有它,其余部分则更加直接。

答案 1 :(得分:6)

由于这是家庭作业,我只会推荐一些您可能想要采取的步骤,让您享受实际写作的乐趣: - )

所以要打印钻石,我认为它会是这样的(例如5行 - 行数必须是奇数)

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

我标记了角色的位置。所以你需要做的是弄清楚你需要打印多少空间,然后计算出多少个星号。在每一行之后,根据当前行号计算出你需要添加/减去多少空格,然后计算出你需要添加/减去多少个星号。我建议的一些步骤:

  1. 编写一个计算要打印的空格数的函数,给定总行数和当前行号
  2. 为星号数写一个类似的功能
  3. 使用这两个功能逐行打印出钻石。

答案 2 :(得分:5)

也许一个好的开始是你编写一个在屏幕上写 n 空格和 m 星的函数。

答案 3 :(得分:5)

我是这样做的。检查一些样品钻石(5,7和9行):

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

第一行包含一些空格和一些星星。多少?星数总是一个,空格数取决于所需的行数:

Number of lines  |  Initial space count
-----------------+---------------------
       1         |            0
       2         |            0
       3         |            1
       4         |            1
       5         |            2
       6         |            2
       7         |            3
       8         |            3

因此,初始空格数为(#lines - 1) / 2, rounded down

你会注意到的另一件事是,在每个后续行上,空格数减少一个,星数增加两个。

直到空间数为零的点为止,然后你开始将空间增加1并将星星减少2,直到星数再次为1。

唯一的另一个特例是偶数行,你应该复制中间行。

查看您的代码,您非常关闭,您只需调整循环语句相对于正在打印的内容的位置。换句话说,外部循环用于行,然后是空间的内部循环,接着是另一个用于星形的内部循环。

我用Python编写了一个测试程序(见下文),但你真的不应该理解Python语法(该程序比我原先想象的要大得多)从这个答案中得到一些用处,所以这里有一些简化伪代码。在开始编写代码之前,您应该始终坐下来思考问题。这将有助于您培养将来能够帮助您的技能。

Main:
    Get numlines from user, check that greater than 0.
    Set numstars to 1.
    Set numspaces to int((numlines-1)/2)
    call Output (numspaces,numstars)
    while numspaces > 0:
        numspaces = numspaces - 1
        numstars = numstars + 2
        call Output (numspaces,numstars)
    if numlines is even:
        call Output (numspaces,numstars)
    while numstars > 0:
        numspaces = numspaces + 1
        numstars = numstars - 2
        call Output (numspaces,numstars)
    end.

Output(spaces,stars):
    for i = 1 to spaces:
        print " "
    for i = 1 to stars:
        print "*"
    print end-of-line
    return

最后,这是我用来测试伪代码的Python代码(因为你需要C ++而不是真的给你代码):

import sys

# Construct line based on number of spaces and stars.
def outLine (spc,str):
    # Start with empty line.
    line = ""

    # Add spaces.
    for i in range(0,spc):
        line = "%s "%(line)

    # Add stars.
    for i in range(0,str):
        line = "%s*"%(line)

    #Output line.
    print line

# Get number of lines from user and check.

numlines = input ("Enter number of lines: ")
if numlines < 1:
    print "Must be greater than zero"
    sys.exit(1);

# Calculate initial space and star count.
numspaces = int ((numlines-1)/2)
numstars = 1

# Output initial line.
outLine (numspaces,numstars)

# Output subsequent lines until middle reached.
while numspaces > 0:
    numspaces = numspaces - 1
    numstars = numstars + 2
    outLine (numspaces,numstars)

# Repeat middle if even number of lines desired.
if numlines % 2 == 0:
    outLine (numspaces,numstars)

# Output the bottom half of the diamond.
while numstars > 0:
    numspaces = numspaces + 1
    numstars = numstars - 2
    outLine (numspaces,numstars)

这是一个运行示例:

Enter number of lines: 15
       *
      ***
     *****
    *******
   *********
  ***********
 *************
***************
 *************
  ***********
   *********
    *******
     *****
      ***
       *

答案 4 :(得分:2)

其他人建议你通过开发有用的子程序来“自下而上”设计它。

另一种方法是设计一个“自上而下”的程序:首先在main中编写代码,假设有助于实现解决方案的任何/所有有用的子程序已经存在:因为这样做可以让你决定使用哪些子程序你想拥有。

例如:

int main()
{
  int nLinesTotal = getNumberOfLinesFromUser();
  int nLinesTopHalf = getHalfOf(nLinesTotal);
  //caution: using 1-based not 0-based index here
  for (int i = 1; i <= nLinesTopHalf; ++i)
  {
    int nAsterisksOnThisLine = calculateAsterisks(i);
    //following function takes nLinesTotal as a parameter because
    //that's necessary to calculate how wide the diamon is and
    //therefore how much leading whitespace there is on each line
    printAsterisks(nLinesTotal, nAsterisksOnThisLine);
  }
  ... etc for the middle line
  ... and for the bottom half of the diamond
}

这样做表明让子程序如下所示是有用的:

  • getNumberOfLinesFromUser
  • getHalfOf
  • calculateAsterisks
  • printAsterisks

答案 5 :(得分:0)

让我们举个例子。假设菱形框的高度为9.下图显示了如何在x-y坐标中排列'*****'。

alt text http://img527.imageshack.us/img527/7261/57257125.png

首先,我们需要将原点移动到钻石中心,如下所示。

alt text http://img515.imageshack.us/img515/7122/89173144.png

查找所有坐标的绝对值。然后该图如下。

alt text http://img73.imageshack.us/img73/9550/75806473.png

上图包含问题的解决方案。

Loop x and y from 0 to 8. 
Print '*' if (x+y) <= 4;  
else Print a space (' ');

现在采取一般情况。然后我们必须

loop from 0 to (Height - 1)
Print '*' if (x+y) <= (Height/2);  
else Print a space (' ');

<强>程序:

void main()
{
    int Height = 15;

    for( int y = 0; y < Height; y++ )
    {
        for( int x = 0; x < Height; x++ )
        {
            int X = abs( x - ( Height / 2 ) );
            int Y = abs( y - ( Height / 2 ) );

            if( ( X + Y ) <= ( Height / 2 ) )
                cout << '*';
            else
                cout << ' ';
        }
        cout << endl;
    }
}

<强>输出:

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