2

Worker と MachineWorker クラスをプログラムしました。それはうまく準拠しています。しかし、私がそれを実行すると、3つの連続したステートメントの後、プログラムが停止します。問題が見つかりません。また、'instanceof' をいつ、どのように使用すればよいかわかりません。私は以下の質問をすべてのクラスで書いています...

質問:- (i) 最大 5 つのWorkerまたはMachineWorkerオブジェクトの参照を格納できる配列を宣言します。a) ユーザーがオブジェクトのタイプとそのタイプのオブジェクトのデータを入力できるようにします (Worker の場合は 3 つの値、MachineWorker の場合は 4 つの値)。b) 参照を共通配列に格納する適切なオブジェクトを構築します。

ii) ユーザーが毎週のデータを繰り返し入力できるようになりました。Workerオブジェクトの場合、ユーザーは ID と勤務時間を入力する必要があります。MachineWorkerオブジェクトの場合、ユーザーは ID、hoursWorked、pieces を入力する必要があります。これらの値が読み込まれたら、 addWeekly()を呼び出す前に、指定された ID を持つオブジェクトを見つけるために配列を検索します。 addWeeklyに渡される引数の数 (1 または 2) は、参照されるオブジェクトのタイプによって異なります。参照されているオブジェクトのタイプ ( Worker または MachineWorker ) を判別するには、 instanceof演算子を使用できます。

以下のコードを参照してください:-

 //Worker.java
    public class Worker { 
            public final double bonus=100;    
            protected String name, workerID;
            protected double hourlyRate, totalHoursWorked,tax,grossSalary,netSalary;

            public Worker(){

        }
    public Worker(String name, String workerID, double hourlyRate){
        this.name = name;
        this.workerID = workerID;
        this.hourlyRate = hourlyRate;

        }

    public void addWeekly(double hoursWorked){
        this.totalHoursWorked = this.totalHoursWorked + hoursWorked;
        }

    public double gross(){
        grossSalary = (totalHoursWorked*hourlyRate);
                if(totalHoursWorked>=150){
            grossSalary = grossSalary +100;
            }
            return  grossSalary;
            }
    public double netAndTax(){
        netSalary = grossSalary;
        if(grossSalary>500){
            tax = (grossSalary - 500) *0.3;
            netSalary = (grossSalary - tax);

        }
        return netSalary;
     }
    public String getName(){
        return this.name;
    }

    public String getWorkerID(){
        return this.workerID;
    }

    public double getHourlyRate(){
        return this.hourlyRate;
    }

    public double getTotalHours(){
        return totalHoursWorked;
    }

    public double getGrossSalary(){
        return grossSalary;
        }

    public void addToGross(double amt){
        grossSalary = grossSalary + amt;
    }
    public void displaySalary(){
        System.out.print("Name: " +getName() + "\nID :" + getWorkerID() 
                + "\nHourly Rate: " + getHourlyRate()+ "\nTotalHours Worked" + getTotalHours() + 
                "\nGross pay" + getGrossSalary() + "\nTax: " + netAndTax() + 
                "\nNet Pay: " + netAndTax());
    }

    }




//MachineWorker.java
    public class MachineWorker extends Worker{

        private double targetAmount;
        private double totalPieces, productivityBonus;

        public MachineWorker(String workerName, String workerID, double hourlyRate, double targetAmount)
        {
            super(workerName, workerID, hourlyRate);
            //this.productivityBonus = productivityBonus;
            this.targetAmount = targetAmount;

        }

        public void addWeekly(double hoursWorked, double weeklyAmount)
        {
            totalHoursWorked = hoursWorked + totalHoursWorked;
            totalPieces = weeklyAmount + totalPieces;
        }


        public double productivityBonus()
        {
            productivityBonus = 100 + (totalPieces - targetAmount);
            return productivityBonus;
        }

        public double gross()
        {
            grossSalary = (totalHoursWorked * hourlyRate) + productivityBonus;
            if(totalHoursWorked >= 150)
            {
                grossSalary = grossSalary + bonus;
            }
            return  grossSalary;
        }

        public void addToGross(double amt)
        {
            amt = productivityBonus;
            grossSalary = grossSalary + amt;
        }


        public void displaySalary()
        {

        System.out.println("Name    " + super.name + "\nID  " + 
        super.workerID + "\nHourly rate " + super.hourlyRate + "\nTotal Hours Worked    " + 
        super.totalHoursWorked + "\nGross Pay   $" + super.grossSalary + "\nTax $" + super.tax + "\nNetpay  $" + super.netSalary);
            System.out.println("Productivity Bonus  " + productivityBonus);
        }   
    }





  //Polymorphism PolyWorker.java

import java.util.*;
        public class PolyWorkers
    {
        public static void main(String args[])
        {
            Scanner input = new Scanner(System.in);

            Worker[] a = new Worker[5];
            MachineWorker[] b = new MachineWorker[5];

            char option = '0';
            String choice;
            boolean nChar = false;

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

                System.out.print("\tType of object " + (i+1) + " [W/M]: ");
                choice = input.nextLine();

                if (choice.length() == 1)
                {
                    option = choice.charAt(0); //pick the first character

                    if (option == 'w' || option == 'W')
                    {
                        System.out.println("\n\tEnter name, ID and hours:   ");
                        String name = input.nextLine();
                        System.out.print("  ");
                        String id = input.nextLine();
                        System.out.print("  ");
                        double hours = input.nextDouble();

                        a[i] = new Worker(name, id, hours);
                        System.out.println();

                    }
                    if (option == 'm' || option == 'M')
                    {
                        System.out.print("\n\tEnter name, ID, hours and pieces: ");
                        String name = input.nextLine();
                        System.out.print("  ");
                        String id = input.nextLine();
                        System.out.print("  ");
                        double hours = input.nextDouble();
                        System.out.print("  ");
                        double pieces = input.nextDouble();

                        b[i] = new MachineWorker(name, id, hours, pieces);
                        System.out.println();
                    }
                System.out.print("\tType of object " + (i+1) + " [W/M]: ");
                choice = input.nextLine();
                }


                a[i].displaySalary();
                b[i].displaySalary();
                b[i].productivityBonus();

            }

        }
    }
4

3 に答える 3

1

すでに作成したループの後に、ユーザーがワーカーの時間を入力できるようにする別のループが必要です。これはおそらく、while継続的に入力を要求するループになります。次に、ループを終了するような入力を選択します。ループ内で何時間も要求し、2つまたは3つの引数を取ります。

現時点では、Workers/MachineWorkersを保存していません。それらを格納する配列を作成する必要があります。また、両方が拡張/実装する基本クラスまたはインターフェースのいずれかを作成する必要があります。これにより、すべてを格納する単一の配列を作成できます。

次に、Workers / MachineWorkersの配列をループし、一致するIDを見つけたら、を使用instanceofして1つまたは2つの引数を渡す必要があるかどうかを判断します。MachineWorkerの場合は、そのようにキャストしてから、2つの引数を使用して適切なメソッドを呼び出す必要があります。

于 2012-10-15T17:10:45.433 に答える
1

あなたの質問は、参照を共通の配列に保存する必要があると述べています.2つの異なる配列ab. オブジェクトの種類ごとに異なる配列があるため、instanceOf演算子を使用する必要はありません。instanceOf の詳細については、こちらを参照してください。

また、給与またはボーナスを出力する際に​​ null をチェックしません。ループのどの時点でも、1 つのタイプのオブジェクトのみが作成され、a[i] または b[i] のいずれかが確実に null になり、NullPointerException が発生します。

于 2012-10-15T17:06:50.170 に答える
1

オーバーライドされたメソッド readfromInput と displaySalary を使用して、Worker と Machinworker の動作を区別することができます。異なる動作は、呼び出し元の Polyworker クラスではなく、クラス内で実装する必要があります。Machineworker の displaySalary がボーナスを表示する場合、これを MachineWorker の displaySalary で呼び出す必要があります。

以下の変更されたコードを参照してください

//Worker.java
import java.util.Scanner;

/**
 * a generic worker
 */
public class Worker {
    public final double bonus = 100;
    protected String name, workerID;
    protected double hourlyRate, totalHoursWorked, tax, grossSalary, netSalary;


    public void addWeekly(double hoursWorked) {
        this.totalHoursWorked = this.totalHoursWorked + hoursWorked;
    }

    public double gross() {
        grossSalary = (totalHoursWorked * hourlyRate);
        if (totalHoursWorked >= 150) {
            grossSalary = grossSalary + 100;
        }
        return grossSalary;
    }

    public double netAndTax() {
        netSalary = grossSalary;
        if (grossSalary > 500) {
            tax = (grossSalary - 500) * 0.3;
            netSalary = (grossSalary - tax);

        }
        return netSalary;
    }

    public String getName() {
        return this.name;
    }

    public String getWorkerID() {
        return this.workerID;
    }

    public double getHourlyRate() {
        return this.hourlyRate;
    }

    public double getTotalHours() {
        return totalHoursWorked;
    }

    public double getGrossSalary() {
        return grossSalary;
    }

    public void addToGross(double amt) {
        grossSalary = grossSalary + amt;
    }

    public void displaySalary() {
        System.out.print("Name: " + getName() + "\nID :" + getWorkerID()
                + "\nHourly Rate: " + getHourlyRate() + "\nTotalHours Worked"
                + getTotalHours() + "\nGross pay" + getGrossSalary() + "\nTax: "
                + netAndTax() + "\nNet Pay: " + netAndTax());
    }

    public void readFromInput(Scanner input) {
        name = input.nextLine();
        System.out.print("  ");
        this.workerID= input.nextLine();
        System.out.print("  ");
        this.totalHoursWorked = input.nextDouble();
        System.out.println();
    }

} // Worker

//MachineWorker.java
import java.util.Scanner;
public class MachineWorker extends Worker {

    private double targetAmount;
    private double totalPieces, productivityBonus;

    public void addWeekly(double hoursWorked, double weeklyAmount) {
        totalHoursWorked = hoursWorked + totalHoursWorked;
        totalPieces = weeklyAmount + totalPieces;
    }

    public double productivityBonus() {
        productivityBonus = 100 + (totalPieces - targetAmount);
        return productivityBonus;
    }

    public double gross() {
        grossSalary = (totalHoursWorked * hourlyRate) + productivityBonus;
        if (totalHoursWorked >= 150) {
            grossSalary = grossSalary + bonus;
        }
        return grossSalary;
    }

    public void addToGross(double amt) {
        amt = productivityBonus;
        grossSalary = grossSalary + amt;
    }

    @Override
    public void displaySalary() {
        super.displaySalary();
        System.out.println("Productivity Bonus  " + productivityBonus);
    }

    @Override
    public void readFromInput(Scanner input) {
        super.readFromInput(input);
        this.totalPieces = input.nextDouble();
    }
}

//Polymorphism PolyWorker.java

import java.util.*;

public class PolyWorkers {
    public static void main(String args[]) {
        Scanner input = new Scanner(System.in);
        Worker[] workers = new Worker[5];

        char option = '0';
        String choice;

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

            System.out.print("\tType of object " + (i + 1) + " [W/M]: ");
            choice = input.nextLine();

            if (choice.length() == 1) {
                option = choice.toLowerCase().charAt(0); // pick the first character
                switch (option) {
                case 'w': {
                    workers[i] = new Worker();
                    System.out.println("\n\tEnter name, ID and hours:   ");
                }
                    break;
                case 'm': {
                    System.out.print("\n\tEnter name, ID, hours and pieces: ");
                }
                    break;
                } // switch
                workers[i].readFromInput(input);
            }

            workers[i].displaySalary();
        }

    }
}
于 2012-10-15T18:08:03.400 に答える