2

TruthTable クラスを呼び出して入力を設定すると、AND ゲートの入力を設定しようとしているときに、配列内の個々のスロットにアクセスできませんか?

threeAndGates.java - エラーが発生したクラス

import java.util.Scanner;

public class threeAndGates {

   public static void main(String[] args){
      LogicGate and1 = new LogicGate(LogicGate.AND);
      LogicGate and2 = new LogicGate(LogicGate.AND);
      LogicGate and3 = new LogicGate(LogicGate.AND);

      System.out.print("What is the number of Inputs? ");
      Scanner scan = new Scanner(System.in);
      int numOfInputs = scan.nextInt();

      System.out.print("What is the number of Outputs? ");
      int numOfOutputs = scan.nextInt();

      TruthTable Table1 = new TruthTable(numOfInputs,numOfOutputs);
      Table1.PopulateTruthTable();

      //below is where it is giving me "the type of the expression must be an array type but it resolves to TruthTable"
      for(int r = 0; r<(Math.pow(2, numOfInputs)) ; r++ ){
         and1.setInput1(Table1[r][0]);
         and1.setInput2(Table1[r][1]);
         and2.setInput1(Truth1[r][2]);
         and2.setInput2(Truth1[r][3]);
         and3.setInput1(and1.getOutput());
         and3.setInput2(and2.getOutput());

         Table1[r][numOfInputs + numOfOutputs] = and3.getOutput();
      }

      Table1.printTruthTable();
   }
}

TruthTable.java

public class TruthTable {
   private int numOfInputs;
   private boolean[][] table;

   public TruthTable(int inputs, int outputs){
      this.numOfInputs = inputs;
      int rows = (int) Math.pow(2,inputs);
      int columns =  inputs + outputs;
      table = new boolean[rows][columns];
   }

   public void printTruthTable(){
      for(int r = 0 ; r < table.length ; r++){
         for(int c = 0; c < table[r].length; c++)
            System.out.printf("%-5b ", table[r][c]);
         System.out.println();
      }
   }

   public String toString(){
      String outStr = new String();
      for(int r = 0; r < table.length; r++){
         for(int c = 0; c < table[r].length; c++)
            outStr += String.format("%-5b ", table[r][c]);
         outStr += '\n';
      }

      return outStr;
   }

   public boolean[][] PopulateTruthTable(){
      String s; 
      String r ="";
      int[] Line = new int[numOfInputs];
      boolean bit;

      for ( int i= 0; i < Math.pow(2,numOfInputs) ; i++){
         int x = numOfInputs - Integer.toBinaryString(i).length();
         for(int j = 0; j<x ; j++)
            r += "0"; 
         s = r + Integer.toBinaryString(i);
         for(int k=0; k<s.length() ;k++){
           Line[k] = s.charAt(k)-48;
         }  

         for(int m=0 ; m<numOfInputs ; m++){    
           if(Line[m]==1) bit = true;
           else bit = false; 
           table[i][m] = bit;
         }
         r="";
      } 
      return table;
   }
}
4

3 に答える 3

2

あなたの TruthTable クラスは配列ではありません。配列が含まれています。get および set メソッドを TruthTable クラスに追加できます。

public boolean getValueAt(int x, int y) {
   return this.table[x][y];
}

public void setValueAt(int x, int y, boolean value) {
   this.table[x][y] = value;
}

それを使用して TruthTable 値を操作します。


これはあなたの問題とは関係ありませんが、クラスで変数に名前を付けるときは、小文字を使用するのが一般的です。たとえば、次のようなものがあります。

TruthTable Table1 = new TruthTable(numOfInputs,numOfOutputs);

のほうがいい

TruthTable table1 = new TruthTable(numOfInputs,numOfOutputs);

そしておそらく最高の

TruthTable truthTable = new TruthTable(numOfInputs,numOfOutputs);

より適切で一貫性のある名前を付けるほど、後で読みやすくなります。

于 2012-06-29T19:24:46.957 に答える
1

これは答えというよりコメントですが、もっとスペースが必要でした。

あなたのコードが後で問題を引き起こす場合、提案をしてもよろしいですか? populateTruthTable を 2 つまたは 3 つのメソッドに分割し、各ループを独自の適切な名前のメソッドに配置します。各メソッドは 1 つのことを行う必要があるためです。

また、おそらくメイン クラスから直接配列にアクセスするべきではありません。代わりに、メイン クラスの「for」ループのすべてのコードを TruthTable クラスのメソッドに入れ、メインからそのメソッドを呼び出す必要があります。そのデータを求めるのではなく、実行してください。

あなたのやり方が間違っているとか、何かを言っているわけではありません。あなたは明らかに非常にうまくやっています。重宝します。

于 2012-06-29T19:51:07.380 に答える
1

TruthTable クラスは多次元配列ではありません。多次元配列フィールドがあります。したがって、次の構文は使用できません。

tableInstance[x][y]

TruthTable のテーブル フィールドが public である場合、またはさらに良いことに、getter がある場合は、代わりにこのようなことを行うことができます...

tableInstance.getTable()[x][y]

一部の言語 (C# など) では、演算子のオーバーロードもサポートされています。これにより、[]インデックス演算子 (または+/など) を使用する動作を定義できます。これにより、インデックス作成を機能させることができます。残念ながら、Java にはこの機能がありません。

于 2012-06-29T19:25:06.020 に答える