4

明確にするために、これは宿題です。私はただアドバイスを求めているだけで、宿題をやってくれる人を探しているわけではありません。

前半はもうやった。2 つの配列を使用して、アスタリスク デザイン (この場合、文字 'S') を印刷します。これで問題なく動作します。次に、2 行をスキップしてデザインを反転して印刷します (したがって、各行が反転します)。正常に機能しているようです。 、しかし、プログラムを実行すると、2 つの S が出力され、2 番目の 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

あなたの逆転は少し混乱しています.... 2つのループで行うと簡単になります。

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

まず、なぜ or を使わないのですString[]char[][]?代わりに、単純な配列を使用して複数の行を配置しています。これにより、コードが混乱し、脆弱になります。

配列を交換するためのルールは一般的に単純です。最初と最後の行を取得してそれらを交換します。2番目と最後から2番目を取得して交換し、3番目と最後から3番目を取得して交換します... 真ん中に到達するまで。これは、各要素が行である配列がある場合 (String[]や のようにchar[][])、はるかに簡単になります。

各 10 文字のブロックが 1 つの行である単純なアイデアを維持する必要がある場合char[]は、上記のように各 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. ええ、ちょっとひどいですが、1 次元配列を使用して 1 行で表示したい場合は、ここにあります。それを理解し、コードに統合するのはあなた次第です;)

于 2013-04-22T22:14:31.610 に答える