4

澄清一下,这是一个家庭作业。我只是在寻找建议,我不是在找人为我做功课。

我已经完成了前半部分。它使用两个数组来打印 Asterisk 设计(在这种情况下,是字母“S”。效果很好。然后,我跳过两行并打印设计但翻转了(所以每行都颠倒了)。它似乎工作正常,但是当我运行程序时,它会打印两个 S 并且第二个没有反转。关于我做错了什么的任何想法?

public class Design {
   public static void main (String [] args) {
       char [] array = new char [150];
       for (int index = 0; index < array.length; index ++) 
       {
         array [index] = '#';
       }
       int [] indexNumbers = {
           0,1,2,3,4,5,6,7,8,9,10,20,30,40,50,
           60,70,71,72,73,74,75,76,77,78,79,89,99,109,119,129,139,140,
           141,142,143,144,145,146,147,148,149
       };
       for (int i = 0; i < indexNumbers.length; i++) 
       {
         array [indexNumbers[i]] = ' ';
       }
      for (int index = 0; index < array.length; index ++)
      {
         if (index % 10 == 0 && index > 0) 
         System.out.println();
         System.out.print (array[index]);
      }

      //Now, to reverse the letter

      System.out.println();
      System.out.println();

      int lines = 5;
      for (int i = 0; i< array.length; i++){
        if (i >= lines)
          lines += 10;
        char temp = array [i];
        array [i] = array [lines - i - 1];
        array [lines - i - 1] = temp;
      }
      for (int index = 0; index < array.length; index ++)
      {
        if (index % 10 == 0 && index > 0) 
          System.out.println();
          System.out.print (array[index]);
      }
    }
  }

编辑:是的......设计在空间中,其他一切都是星号。

4

3 回答 3

1

你的倒车有点混乱......如果你在两个循环中做它会更容易。

for (int row = 0; row < (array.Length / 10); row++)
{
    for (int col = 0; col < 5; col++)
    {
        int rowStart = row * 10;
        int rowEnd = rowStart + 9;
        char temp = array[rowStart + col];                    
        array[rowStart + col] = array[rowEnd - col];
        array[rowEnd - col] = temp;
    }
}
于 2013-04-22T21:46:09.513 回答
1

首先,你为什么不使用String[]or char[][]?相反,您正在使用一个简单的数组在其中放置多行。这会使您的代码混乱和脆弱。

要交换数组,规则通常很简单:获取第一行和最后一行并交换它们。得到第二个和倒数第二个,然后交换它们,得到第三个和倒数第三个,然后交换它们......直到你到达中间。String[]如果您有一个每个元素都是一行的数组(例如在 an 中或在 an 中) ,这将容易得多char[][]

如果您需要保持char[]每个 10 字符块是一行的简单概念,只需像我上面所说的那样交换每个 10 字符块。

如果您不想更改程序的一般行为,这是有问题的块:

  int lines = 5;
  for (int i = 0; i< array.length; i++){
     if (i >= lines)
        lines += 10;
    char temp = array [i];
    array [i] = array [lines - i - 1];
    array [lines - i - 1] = temp;
  }

您不是在此处交换行,而是在交换字符。这样,您的 if 不是检查和跳过行,而是检查和跳过字符。

这个更好:

  int lines = array.length / 10;
  for (int i = 0; i<= lines / 2; i++){
      for (int j = 0; j < 10; j++) {
          char t = array[i * 10 + j];
          array[i * 10 + j] = array[(lines - i - 1) * 10 + j];
          array[(lines - i - 1) * 10 + j] = t;
      }
  }
于 2013-04-22T21:30:34.567 回答
0

所以..

首先,首先打印'#'而不是' ',而'.'不是'#'。你会更清楚地看到发生了什么。

其次,你逆向有问题,你实际上并没有逆向任何东西,你计算指数的方式lines - i - 1是错误的。好办法是(i / 10) * 10 + (10 - (i % 10)) -1。是的,有点可怕,但如果你想在一行中使用一维数组,那就是它。现在由您来理解它,并将其集成到您的代码中;)

于 2013-04-22T22:14:31.610 回答