-1

好的,所以我正在为我的 Comp Programming 课程编写一个程序,我需要制作一个程序来获取行数,并通过将 2 添加到每行来打印一个金字塔。视觉效果如下所示:鉴于行的输入是:5

所以输入是 5,如您所见,它有 5 行,并且每行向下添加 2 个 *。好吧,我不确定如何使*的数量以 2 为增量增加。到目前为止,这是我的代码:

public static void pyramid(){

    System.out.println("Columns:");
    rows = input.nextInt();

    for(int s = 0; s <= rows; s++){

        for(){

        }
    }

}

我在第一个循环中开始了另一个 for 循环,因为我知道我需要它来完成这项工作。我的问题是,我将如何让它在它下降的每一行中添加 2 *。

4

6 回答 6

2

每行中 *s 的数量是2*s + 1,对吗?所以这很容易计算,只需在每个循环中循环到那个数字,每次都输出一个*

你还需要在每组 *s 之前写下正确数量的空格 - 这也是s- 尝试一些数字,看看你是否能弄清楚这个函数。一旦你得到了正确的函数,只需在你的主循环中循环到那个数字,每次都添加空格。

于 2013-01-07T20:42:14.147 回答
2

如果您使用迭代方法来查看问题(如我所推荐的那样)。您会发现您正在寻找的并不是在循环中的每个 int 中添加三个。

让我们先让金字塔的一半正确。这样做需要一个简单的循环。(我将在 Python 中运行它,使它有点像伪代码):

def pyramid(rows):
    for row_num in range(1,rows+1):
        print '*' * row_num

这为我们提供了 5 的以下输出:

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

我们已经完成了一半,我们现在真正需要的是从另一侧金字塔的中间开始的镜像。

对于初学者,我们可以计算出每行的星数,如果我们看看它总是小于两倍行数的事实。(1、3、5、7等)

这给了我们以下代码:

def pyramid(rows):
    for row_num in range(1,rows+1):
        num_stars = (row_num * 2) - 1
        print '*' * num_stars

产生以下输出:

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

现在我们唯一缺少的是对齐。为了计算每行正确缩进所需的空格数,我们可以再次查看模式。在这种情况下,为了使线条居中,我们需要将每条线偏移一个以每行一个减少的值的值。

第一行开始之前需要四个空格,第二行需要三个空格,等等。那么,该值与什么相关?行数本身。

我们可以从这个模式中看出,偏移输出所需的空格数实际上等于行数减去 row_num。这给了我们以下代码:

def pyramid(rows):
    for row_num in range(1,rows+1):
        num_stars = (row_num * 2) - 1
        offset = rows - row_num
        print (' ' * offset) + ('*' * num_stars)

现在我们得到最终结果:

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

而且……我们完成了!

为简洁起见,我在此代码示例中使用了 Python。由于您使用的是较低级别的语言,因此您无法将字符相乘以生成字符串。

很多人会说“写一些嵌套循环”。我,我相信最好编写一个模仿高级语言所需功能的函数。

如果您可以创建一个函数来为您执行字符串乘法,那么您可以使用相同的代码两次!

如果 Python 没有内置的字符串乘法,您可以轻松地创建一个函数,例如:

def multiply_char(char,number_of_times):
    s = ''
    for i in range(number_of_times):
        s += char
    return s

现在,您可以在此分配中使用该函数两次,并且在没有嵌套循环的情况下保持代码看起来更干净(它提供了稍后函数调用不会提供的可读性)。

我们在头脑中分解这些小程序的方式是编写好代码的一半。你的老师正试图让你分析问题并将其分解成更小的部分。最好从做某事的代码开始,然后对其进行迭代,直到它功能完整。

快乐编码!

于 2013-01-07T21:09:35.913 回答
1

这里有一些提示:

对于n行,您需要以(n - 1)空格开头。要么在一个简单的嵌套循环中自己输出这些空格,要么用于Arrays.fill(chars, '0')创建一个可以传递给的字符数组new String()。您可以使用substring()在每次迭代中删除一个空格。

你需要从一个开始*。对于后续行,您可以这样做,s = s + "**"尽管使用 aStringBuffer更有效。

FWIW,这是我现在能想到的最好的:

static void pyramid(int n) {

    // create first line
    StringBuffer out = new StringBuffer(2 * n + 1);
    for (int i = 0; i < n - 1; ++i) {
        out.append(' ');
    }
    out.append('*');

    // repeatedly remove a space and add two stars
    while (n-- > 0) {
        System.out.println(out);
        out.deleteCharAt(0);
        out.append("**");
    }
};
于 2013-01-07T20:45:49.430 回答
1

要执行此任务,您需要两个嵌套循环。第一个计算当前行所需的星数。在打印空间内循环(制作“好看的树”)并打印星星

public static void pyramid(int numberOfRows){

    int curentAmountOfStars = 1; // first row has one star
    for(int i = 0; i < numberOfRows; i++){

        for(int j=0; j<numberOfRows-i-1;j++){ // this for prints spaces
            System.out.print(" ");
        }

        for(int j= curentAmountOfStars; j>0; j--){ //this one prints stars
            System.out.print("*");
        }
        System.out.println(); //go to new row
        curentAmountOfStars += 2; // increase amount of stars
    }

}

结果你有一棵美丽的树!

      *
     ***
    *****
   *******
  *********
 ***********
************* 
于 2013-01-07T20:45:50.463 回答
0

有几种方法可以做到这一点

  1. 在循环中,将 2 加到一个累加变量上。
  2. 通过根据行推导长度公式来计算该变量的整个值。

第一种方法很可能是您将使用的方法,但第二种方法更有可能在未来的工作中变得更加健壮。由于这个程序可能没有太多的未来(这是一个常见的 CS 101 类型的家庭作业问题),我猜你会选择 #1。

int numAsterisks = 1;
for (row = 0; ...) {
  doStuff();
  numAsterisks += 2;
}

第二种方法是意识到你要为每一行添加两个

numAsterisks = 2*row + 1;

最后一种技术的主要优点是 numAsterisks 的后续值不会出错,即使不适当的因素弄乱了 numAsterisks 的中间值之一。一个较小的优势是您不需要存储 numAsterisks 的中间值,因此您可能还会得到运行速度更快的代码(只有分析才能确定)。

于 2013-01-07T20:53:18.943 回答
-1

我知道你是如何尝试这个的,但可能一个 while 循环会更容易,然后只需使用字符串操作来创建你想要的每一行。

   public static void pyramid(){
        line=1;
        i=1;
        while(line <= 5){
                      System.out.println("*"*i);
                      i +=2;
                      line +=1;
                     }
    }

另外我不知道您的意思是“将星星增加 3 颗”是指每行的星星数会变为 (1,4,7,10) 还是加速 3 颗,例如 num+2, num+5, num +8 喜欢 (1,3,8,16)。

如果您想以第二种方式进行操作,则应该可以。

public static void pyramid(){
            line=1;
            i=1;
            a=3;
            while(line <= 5){
                          System.out.println("*"*i);
                          i += 2+a*(i-1);
                          line +=1;
                         }
        }
于 2013-01-07T20:41:22.483 回答