Написание ООП с Java

Мой профессор хочет, чтобы я написал объектно-ориентированную программу на Java, которая решает какое-то квадратное уравнение столько раз, сколько args[0] определяется, например computer-:Desktop User$ java program_name 3 будет повторять программы 3 раз.(Я надеюсь, что это достаточно ясно).

У меня есть все, кроме "объектно-ориентированной программы", я не понимаю, как я могу сделать ее объектно-ориентированной, инструкции не оставляют мне слишком много места для работы (кроме как с помощью метода конструктора).

Я пытался сделать это:

public class assignment {
assignment(double method_inp){
    double coeff = method_inp;
}
public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    int input_number = Integer.parseInt(args[0]);

    if (input_number > 0) {
        for (int i = 0; i < input_number; i++) {

            // isn't this object oriented?
            assignment a = new assignment(readCoeff(input));
            assignment b = new assignment(readCoeff(input));
            assignment c = new assignment(readCoeff(input)); 

(readCoeff(input) просто идет в сканер и позволяет пользователю ввести значение. но, кажется, я не могу использовать a, b а также c в качестве переменных. и не конвертируйте их в переменные, потому что они не могут быть конвертированы в double. Что я могу сделать? Есть ли лучший способ сделать мою программу объектно-ориентированной?

Изменить: я не могу использовать глобальные переменные

Изменить: содержание readCoeff(input) является:

static double readCoeff(Scanner inn) {
    System.out.print("Please enter coefficient of a quadratic equation: ");
    return inn.nextDouble();

4 ответа

Решение

Каждый раз, когда вы используете слово static, вы "вообще" не находитесь в модели ООП.

Зачем?

Потому что static поднимает состояние (в смысле дизайна) из контекста объекта в контекст модуля. Все ваше программирование происходит внутри статического метода (за исключением решателя).

Вот что я люблю делать

public class Program
{
  public static void main(String[] args) {
     Parser p = new MyCommandlineParser();
     Options op = p.Parse(args);

     Solver solver = new Solver();
     s.SolveVariables(op.getTimesToSolve());
     System.out.println("Done.  OOP is about design not programming");
  }
}

начать с дизайна, затем программы;

Представлять ваши Equations (Quadratic), используя отдельный класс. Определите определение операции в классе, который вы хотите выполнить над операцией. Эти операции будут доступны с использованием экземпляра уравнения.

Основной класс assignment примет количество уравнений и создаст экземпляр в массиве уравнений.

import java.util.Scanner;

class Equation {
  double a, b, c;
  Equation(double a, double b, double c) {
    this.a = a;
    this.b = b;
    this.c = c;
  }
  // Perform the operation on equation using specific methods.
}

public class assignment {

  public static void main(String[] args) {
    Scanner input = new Scanner(System.in);
    int input_number = Integer.parseInt(args[0]);
    Equation objects[];
    double inputA, inputB, inputC;
    if (input_number > 0) {
      objects = new Equation[input_number];
      for (int i = 0; i < input_number; i++) {
        inputA = readCoeff(input);
        inputB = readCoeff(input);
        inputC= readCoeff(input);
        objects[i] = new Equation(inputA, inputB, inputC);
      }
    }
  }
  static double readCoeff(Scanner inn) {
    System.out.print("Please enter coefficient of a quadratic equation: ");
    return inn.nextDouble();
  }
}
import java.util.Scanner;

/**
 * Created by EpicPandaForce on 2015.09.20..
 */
public class Main {
    public static void main(String[] args) {
        int iterationCount;
        if (args.length > 0) {
            iterationCount = Integer.parseInt(args[0]);
        } else {
            iterationCount = 1;
        }
        new Main().execute(iterationCount);
    }

    private Scanner scanner;

    public Main() {
        scanner = new Scanner(System.in);
    }

    public void askForCoefficientInput() {
        System.out.println("Please enter the three coefficients");
    }

    public double readCoefficient() {
        return scanner.nextDouble();
    }

    public void execute(int iterationCount) {
        double inputA, inputB, inputC;
        if (iterationCount > 0) {
            for (int i = 0; i < iterationCount; i++) {
                askForCoefficientInput();
                inputA = readCoefficient();
                inputB = readCoefficient();
                inputC = readCoefficient();
                Equation equation = new Equation(inputA, inputB, inputC);
                equation.printResults();
            }
        }
    }

    public static class Equation {
        private double a;
        private double b;
        private double c;

        private double result1;
        private double result2;
        private boolean hasResult;

        public Equation(double a, double b, double c) {
            this.a = a;
            this.b = b;
            this.c = c;
            calculate();
        }

        protected final void calculate() {
            if (a != 0) {
                if ((b * b - 4 * a * c) >= 0) {
                    this.result1 = ((-1) * b + Math.sqrt(b * b - 4 * a * c)) / (2 * a);
                    this.result2 = ((-1) * b - Math.sqrt(b * b - 4 * a * c)) / (2 * a);
                    this.hasResult = true;
                }
            } else {
                if (b != 0) {
                    this.result1 = ((-1) * c) / b;
                    this.result2 = ((-1) * c) / b;
                    this.hasResult = true;
                } else {
                    if (c == 0) {
                        this.result1 = 0;
                        this.result2 = 0;
                        this.hasResult = true;
                    }
                }
            }
        }

        public void printResults() {
            System.out.println(
                    "The equation [" + a + "x^2 " + (b >= 0 ? "+" + b : b) + "x " + (c >= 0 ? "+" + c : c) + "] had " + (this.hasResult() ? "" : "no ") + "results" + (this.hasResult() ? ", these are: [" + this
                            .getFirstResult() + "] and [" + this.getSecondResult() + "]." : "." + "\n"));
        }

        public double getFirstResult() {
            return this.result1;
        }

        public double getSecondResult() {
            return this.result2;
        }

        public boolean hasResult() {
            return this.hasResult;
        }
    }
}

Результат:

>> Executing quadratic.Main

Please enter the three coefficients
1 -8 12
The equation [1.0x^2 -8.0x +12.0] had results, these are: [6.0] and [2.0].

Please enter the three coefficients
3 8 12
The equation [3.0x^2 +8.0x +12.0] had no results.

Process finished with exit code 0

Выполнение чего-то, что может быть сделано намного более эффективно и чисто без каких-либо объектов путем принудительной ООП, является своего рода задержкой. Но есть такие учителя (я тоже знаю нескольких). Итак, вот как я бы это сделал:

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int inputNumber = Integer.parseInt(args[0]);

        if (inputNumber > 0) {
            for (int i = 0; i < inputNumber; i++) {
                int[] coefficients;
                //read coefficients into the array
                QuadraticEquation equation = new QuadraticEquation(coefficients);
                System.out.println(equation.solve());
            }
        }
    }
}


class QuadraticEquation {
    private int[] coefficients;

    QuadraticEquation(int[] coefficients) {
        this.coefficients = coefficients;
    }

    double solve() {
        //solve the equation using coefficients and return the result
    }
}

Замените имена переменных / полей чем-то более разумным, если это необходимо. Кроме того, имена классов всегда должны быть в верхнем регистре. Компилятор не будет жаловаться, но это широко распространенное соглашение.

Теперь, что на самом деле происходит в приведенном выше коде, это то, что мы определяем класс с именем QuadraticEquation который определяется его коэффициентами, и мы передаем их в конструктор. Теперь, когда объект обладает всей необходимой информацией, мы можем вызвать solve() на самом деле сделать что-то, то есть дать нам результат, который мы распечатаем (вы также можете сохранить все результаты в массиве и распечатать их в конце).

Также обратите внимание, что у нас есть два класса. Вы можете поместить все в одно, но я не думаю, что вы должны. Каждый класс должен представлять объект, который может работать самостоятельно (Main класс на самом деле бессмыслен, когда смотришь под этим углом; это просто, чтобы предотвратить main(String[]) загрязнять другие вещи).

В идеале вы должны создать отдельный файл с именем QuadraticEquation, менять class QuadraticEquation в public class QuadraticEquation и префикс конструктор и методы с public сделать их пригодными для использования из любого места, потому что они ни к чему конкретно не привязаны. Я хотел, чтобы все было просто и свал все в одном месте, и поскольку в одном файле не может быть двух открытых классов, другой должен был быть защищен пакетом (уровень видимости по умолчанию).

Другие вопросы по тегам