2016-09-11 12 views
0

このプログラムは、ユーザー入力から整数を取り出してコレクションに入れます。次に、正の値を最初に出力し、次に負の値を出力し、繰り返し数を出力しません。これは、ユーザーが0に入ると、ここで入力を求めて停止したコードです:このJavaプログラムの適切な印刷方法の開発を手助けする必要があります

public class Intcoll2 
{ 
    private int[] c; 
    private int[] d; 
    private int howmany = 0; 

    public Intcoll2() 
    { 
     c = new int[500]; 
    } 

    public Intcoll2(int i) 
    { 
     c = new int[i] 
    } 

    public void insert(int i) 
    { 
     if (i > 0) 
     { 
      int j = 0; 
      while ((j <= howmany) && (c[j] != i)) j++; 
      if (j == howmany) 
      { 
        if (j == c.length - 1) 
        { 
         d = new int[2*c.length]; 
         for (int k = 0; k<c.length; i++){ 
          d[k] = c[k]; 
         } 
         c = d; 
        } 
        c[j] = i; c[j + 1] = 0; 
      } 
      howmany++; 
     } 
    } 

    public int get_howmany() 
    { 
      int j=0, howmany=0; 

      while (c[j]!=0) {howmany++; j++;} 
      return howmany; 
    } 

今私の現在の印刷方法は、次のようになります。

public void print() 
    { 
     int j = 0; 
     System.out.println(); 
     while (j <= howmany) 
     { 
      System.out.println(c[j]); j++; 
     } 
    } 

しかし、私は私のクライアントにそれを使用しようとすると、ゼロを出力するだけです。私が間違っていることを助けてくれれば幸いです。

+0

私が見ることができる1つのことは、配列 'c'に' insert'の引数を決して加えないことです。あなたのforループも 'cであれば無限に実行されます。'k 'をインクリメントしないので長さは0です。 –

+0

' c [j] = i'で待ちます。通常は 'i'がインデックスなので混乱します。 'i'の名前を' toInsert'のように変更して読みやすくすることができます。 –

+0

'insert(int i)'メソッドを呼び出すことはありますか? –

答えて

1

私はあなたのクラスを見て、読みやすいように書き直しました。私はそれをテストしなかったが、私はそれが動作すると確信しています。あなたはそれをチェックアウトし、うまくいけば何が起こっているのか理解することができます。お役に立てれば!

public class IntCollection2 { 

    private int[] collection; // A large allocation, not neccessarily filled up. 
    private int currentSize; // The number of spots currently filled in the collection. 

    public IntCollection2() { 

     collection = new int[500]; 
     currentSize = 0; 

    } 

    public IntCollection2(int size) { 

     collection = new int[size]; 
     currentSize = 0; 

    } 

    /** 
    * Inserts a new element into the internal array. If the current array is filled up, 
    * a new array double the size of the current one is allocated. 
    * @param element An int to insert into the collection. Must not be '0'. 
    * @return True if the element was successfully inserted, false if the element was 
    *   equal to '0' and was ignored. 
    */ 
    public boolean insert(int element) { 

     if (element != 0) { 

      if (currentSize < collection.length - 1) { 

       collection[currentSize] = element; 

      } else { 

       int[] newCollection = new int[collection.length * 2]; 

       for (int i = 0; i < currentSize; i++) { 

        newCollection[i] = collection[i]; 

       } 

       newCollection[currentSize] = element; 
       collection = newCollection; 

      } 

      currentSize++; 
      return true; 

     } else { 

      return false; 

     } 

    } 

    /** 
    * Not actually necessary because the class automatically updates its currentSize 
    * every time a new element is inserted. 
    * @return The current number of filled spots in the internal array. 
    */ 
    public int getCurrentSize() { 

     int size = 0; 

     for (int i = 0; i < collection.length && collection[i] != 0; i++) { 
      size++; 
     } 

     return size; 

    } 

    /** 
    * Prints out all the elements currently in the collection, one on each line. 
    */ 
    public void print() { 

     System.out.println(); 

     for (int i = 0; i < currentSize; i++) { 

      System.out.println(collection[i]); 

     } 

    } 

} 

FYI:このクラスは、コレクション内のすべての要素を順番に印刷します。あなたは正と負の値を印刷することについて言及しましたが、私はあなたにそれを残します。

編集:私はあなたがプログラミングに真新しいと思っているので、コレクションが何であるかを明確にしたいだけです。 の配列は、要素の順序付きリストです。配列を作成すると、コンピュータは、指示した要素の数を正確に保持するために少しのメモリを確保します。既存の配列のサイズを変更することはできません。 A コレクションは基本的に配列のラッパーです。それは要素を保持するのに必要なより大きな配列を作成し、配列がいっぱいになると、より多くの要素を保持できる新しい大きな要素を割り当てます。

3

おそらくあなたが探していなかった答えがまだ唯一の本当のあなたが気にするべきである答え。

あなたの問題は、そのコードのどこかにバグが隠れているということではありません。

  • いけない単一文字の変数名を使用します。問題は、あなたのコードが限界を超えてを混乱であるということです。
  • intを取るコンストラクタは、が空の配列を作成します。
  • 配列を使用しているときは「コレクション」とは言いません。
  • フィールドとローカル変数には、と同じという名前を付けないでください。

真剣に:あなたは読みは難しいコードを書いたので、この混乱を理解することは、主に複雑かつ困難です。

あなたは(あなたが作った作者である)そのような複雑なコードをデバッグするように他の人に依頼しています。

代わりに、この全体を投げ捨てるかもしれません。それをゆっくり書き直してください。しかし読者に全く混乱しない方法で。

+0

このアドバイスをいただきありがとうございます。私はそれが混乱するコードであることに同意し、それは私の教授が私によって作られたいくつかの微調整で書かれました。また、私は小さな編集を行いました:コンストラクタは空の配列を作成すべきではありません、int iで作成する必要があります。 –

+0

私は参照してください。ヒント:単純にSystem.out.println()ステートメントを使用して、配列に変更を加えるたびに印刷するなどです。 – GhostCat

+0

さらに、配列を繰り返し処理するたびにfor-loopsを使用します。 whileループは、ロード中の画面を更新するメソッドのように、条件が満たされている間に何かが連続して発生する場合にのみ使用してください。たとえば、print()メソッドでは、for(int j = 0; j

関連する問題