0

私はこのプログラムに数週間取り組んできました。これは私のJavaプログラミングクラスの最後のプロジェクトであり、私(および他の多くの学生)にかなりの頭痛の種を与えています。ユーザーが飛行機の速度、高度、飛行機の種類とともに新しい飛行機を入力、表示、削除できるようにするプログラムを作成する必要があります。メインクラスを他のクラスと通信させるのに最も問題がありました。このため、LinkedListが正しく機能するかどうか、またはまったく機能するかどうかはわかりません。リストにすべてのフィールドが適切に格納されないこと、およびノー​​ドが適切にコーディングされていないことが心配です。私はあなたが提供できるどんな助けやアドバイスも本当に使うことができました。コードは以下のとおりです。私はありとあらゆる提案を受け入れます。

メインクラス。これは、ユーザーがプログラムを操作する場所です。他のクラスのメソッドをこのクラスで機能させるのに苦労しています。私が見逃しているのは単純なことだと確信しています。

package airTraffic;

import java.util.*;

public class Main {

static Scanner in = new Scanner(System.in);

public static void main(String[] args) {

    do {
        try {
            System.out.println("Please enter command to proceed: ");
            System.out.println("Enter new aircraft = e");
            System.out.println("Display all aircraft = d");
            System.out.println("Show specific flight = s");
            System.out.println("Remove specific flight = r");
            String command = in.next();
            in.next(command);

            if ( (in.next(command)).equals("e") ) {
                ATControl.addToList();  // need to somehow "start" this class 

            } else if ( (in.next(command)).equals("d") ) {
                ATControl.displayAll();

            } else if ( (in.next(command)).equals("s") ){
                ATControl.showFlight();

            } else if ( (in.next(command)).equals("r") ) {
                ATControl.removeFlight();

            } else if ( (in.next(command)).equals(null) ) {
            }
        } catch (InputMismatchException exc) {
            System.out.println("Wrong entry, please try again:");
        }
    } while (true);
}
}

リンクリストとノード-私はそれを航空機と呼びました。ここにリストが保存され、作成されると思います。リストへの操作は次のクラス(ATControl)で発生します。少なくとも、そうなると思います。

package airTraffic;

import java.util.LinkedList;

public class Aircraft  {

// stores data
private static final int INITIAL_ALLOCATION = 20;
private int size = INITIAL_ALLOCATION; 

//declare LinkedList and node names
static LinkedList <String> list = new LinkedList <String> ();
private Aircraft head = new Aircraft ();
private Aircraft tail = new Aircraft ();

// tells list to add nodes
public  void addNodes (int n, LinkedList<String> s) {
    s = list;
    head.next = tail;
    tail.next = tail;
    size = n;
    Aircraft temp = head;
    for (int i= 0; i < size; ++i) {
        temp.next = new Aircraft ();
        temp = temp.next;
    }
    temp.next = tail;
}

private String value;
Aircraft craft;

public Aircraft (String v) {
    value = v;
}

public Aircraft () {

}

public String get () {
    return value;
}

public void set (String v) {
    value = v;
}

public Aircraft next = null;

//auto generated method from ATControl 
public static void add(String flight) {
    // a for or while loop might be needed here. Seems to easy to just have an empty add class

}
//auto generated method from ATControl
public static void remove() {

}
 }

ATControlクラス。これは(私が思うに)リストが操作される場所であり、ユーザーがフライトを追加、削除、表示できるようにします。

package airTraffic;

import java.util.*;

public class ATControl{

// implement Aircraft class (node) - empty argument list?? 
Aircraft aircraft = new Aircraft ();

static Scanner in = new Scanner (System.in);

// list of planes 
static String [] planeList = {"Wide-body Airliner = w", "Regional Airliner = r", "Private Plane = p", 
        "Military = m", "Cargo only: c", "Unknown = u"};

//add plane and details
public static void addToList () {
    System.out.printf("Enter flight number: ");
    String flight = in.nextLine();
    Aircraft.add(flight);

    //type of plane
    System.out.printf("Enter type of plane, ", "Choose from: " + planeList);
    String type = in.nextLine();
    try {
    if (type == "w") {
         System.out.println("Wide-body Airliner");
    }else if (type == "r") {
             System.out.println("Regional Airliner");
    }else if (type == "p") {
         System.out.println("Private Plane");
    }else if (type == "m") {
         System.out.println("Military");
    }else if (type == "c") {
         System.out.println("Cargo only");
    }else if (type == "u") {
         System.out.println("Unknown");
    } else type = null;
        }
    catch (InputMismatchException i) {
        System.out.println("You must enter valid command: " + planeList);
    }
    Aircraft.add(type);

    //plane speed
    System.out.printf("Enter current speed: ");
    String speed = in.nextLine();
    Aircraft.add(speed);

    //add Altitude 
    System.out.printf("Enter current altitude: ");
    String alt = in.nextLine();
    Aircraft.add(alt);
}

//show flight
public static void showFlight () {
    System.out.printf("Enter flight number for details: ");
    in.nextLine();
    Aircraft.get(Aircraft, index);
}

// display all flights
public static void displayAll () {
    System.out.printf("All flights: " );

}

//remove flight
public static void removeFlight () {
    System.out.printf("Enter flight number to be removed: ");
    in.nextLine();
    Aircraft.remove();
}   
}

何か案は?ありがとうございました!

4

3 に答える 3

2

ATControl を「開始」するには、ATControl の新しいインスタンスを作成する必要があります。

ATControl control = new ATControl();
control.addToList();

あなたと同じAircraftです。で新しいインスタンスを作成しnew、それらに対して などを呼び出しAdd()ます。

またScanner、新しい ATControl を使用する代わりに、 from main を新しい ATControl に渡し、それを使用して入力を読み取ることもできます。Scanner

于 2012-07-30T17:07:37.250 に答える
0
  • あなたの一般的な設計は、オブジェクト指向の原則を無視しているようです。私が思うに、航空機はそのタイプ、速度、高度を 1 つのオブジェクトにまとめる必要があります。

  • なぜ車輪を再発明するのですか?JRE には、あらかじめ作成された (十分にテストされた) コレクション クラスが多数組み込まれています (ArrayList、LinkedList など)。それらを使用して、航空機のインスタンスを保持します。

これらの 2 つの変更により、作成/保守する必要のあるコードの量が大幅に削減され、プログラム全体の複雑さが大幅に軽減されます。

于 2012-07-30T17:31:56.380 に答える
0

オブジェクト指向設計を使用するときは、オブジェクトを実際のオブジェクトの表現と考えてください。航空機クラスは、実際の航空機を表す必要があります。航空機は、それに関連付けられているものを追跡する必要があります。したがって、フライト番号、速度、高度などは、そのクラスのプロパティである必要があります。

public class Aircraft{
    private int speed;
    private int altitude;
    private int flightNum;
    //
    //Regional Airliner, Military, Private Plane, etc.
    private String type;

    public void setSpeed(int speed){
        this.speed = speed;
    }
    public int getSpeed(){
        return speed;
    }
    //
    //TODO: Getters and Setters for the rest of the aircraft properties

}

これで、ATControl クラスで他のほとんどすべてを処理する必要があります。この場合、Aircraft 型の配列リストを使用する方がはるかに論理的です。

public class ATControl{
    private ArrayList<Aircraft> currentFlights;

    //
    //Constructor gets called on initialization
    public ATControl(){
        currentFlights = new ArrayList<Aircraft>();
    }

    //
    //User input should be handled in main class and passed into this
    public void addFlight(int flightNum, int speed, int altitude){
        Aircraft newCraft = new Aircraft();

        //
        //assign the properties we just got from the user to our new aircraft
        newCraft.setFlightNumber(flightNum);
        newCraft.setSpeed(speed);
        //
        //Now add our new flight to the list of current flights
        currentFlights.add(newCraft);

    }


}

あなたのメインクラスは、あなたが持っているものとほとんど同じままにすることができます. ただし、すべてのユーザー入力をそこで処理します。

public class Main {

    static Scanner in = new Scanner(System.in);


    public static void main(String[] args) {
       ATControl denverTrafficControl = new ATControl();
       //
       //Handle user input here: get the speed, altitude, flightNum, etc..

       denverTrafficControl.addFlight(flightNum, speed, altitude);

    }
}

これは、それが行われるべき方法です。これが、オブジェクト指向設計をよりよく理解するのに役立つことを願っています。メイン クラスで I/O を処理し、他の実際の「オブジェクト」クラスでデータを処理します。幸運を。

于 2012-07-31T17:59:26.913 に答える