Написание ООП с 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");
}
}
начать с дизайна, затем программы;
Представлять ваши Equation
s (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
сделать их пригодными для использования из любого места, потому что они ни к чему конкретно не привязаны. Я хотел, чтобы все было просто и свал все в одном месте, и поскольку в одном файле не может быть двух открытых классов, другой должен был быть защищен пакетом (уровень видимости по умолчанию).