C, PHP, VB, .NET

Дневникът на Филип Петров


* Изходен код от упражнение 6, 2015

Публикувано на 30 октомври 2015 в раздел ПИК3 Java.

Трябва да се напише програма, която решава различни типове математически уравнения. Реализирайте следната йерархия:

Задача 1. Дефинирайте интерфейс Solvable с действия:

  • solve()
  • printSolution()

Типа на връщаните стойности ще прецените самите вие в процеса на работа.

Задача 2. Дефинирайте изключение SolutionException като наследник на Exception. Съобщението за грешка по подразбиране да е „няма решение“.

Задача 3. Дефинирайте абстрактен клас Equation, имплементиращ интерфейс Solvable, представляващ уравнение от неизвестен тип. Неговите коефициенти ще се записват като член променлива масив от тип double. Забележете, че едно уравнение може да има повече от едно решение – например едно квадратно уравнение има две решения. Затова метод solve не трябва да връща една единствена стойност. Реализирайте метод “getUserCoefficientsFromConsole()”, в който масива с коефициентите се обхожда и за всеки един елемент се прочита стойност от клавиатурата. Този метод може да хвърли InputMismatchException ако въведената стойност за даден коефициент не е числова.

Задача 4. Направете два класа наследяващи Еquation – LinearEquation и QuadraticEquation. Те моделират съответно линейно уравнение ax+b=0 (два коефициента и едно решение) и квадратно уравнение ax2+bx+c=0 (три коефициента и две решения). При реализацията на solve внимавайте с вариантите, когато коефициента a==0:

  • При линейното уравнение се проверява дали и b==0 и:
    • Ако да, да се хвърли SolutionException със съобщение “всяко x е решение”;
    • Ако не, да се хвърли SolutionException със стандартно съобщение за грешка.
  • При квадратното уравнение решението се свежда до решение на линейно уравнение. Тук е удачно да създадете нов обект от клас LinearEquation и просто да му подадете коефициентите b и c от квадратното като a и b в линейното.

И в двата класа реализирайте конструктор по подразбиране, в които коефициентите се четат от клавиатурата (да хвърля InputMismatchException ако прочитането от клавиатурата е проблемно, например очаквате число, а потребителя подаде букви). Употребете удобния за целта метод getUserCoefficientsFromConsole() от базовия клас.

И в двата класа да има конструктор с подаден параметър масив с коефициенти. Ако размерностите на този масив не са 2 (за линейно) или 3 (за квадратно) да се хвърля IllegalArgumentException със подходящо съобщение за грешка.

И в двата класа да има конструктор и подадени параметри кофициенти – две числа a и b за линейно и три числа a, b и c за квадратно уравнение. Тези конструктори не хвърлят изключение.

Задача 5. Създайте клас с main метод, в който въвеждате и решавате два типа уравнения. Изведете решенията на екрана.

Решение:

import java.util.Scanner;
import java.util.InputMismatchException;

public class EquationsProgram{
  public static void main(String[] args){
    Equation eq1 = new LinearEquation(2.0,3.0);
    try{
      eq1.printSolution();
    }
    catch(SolutionException e){
      System.out.println(e.getMessage());
    }
    Equation eq2;
    try{
      eq2 = new QuadraticEquation();
      eq2.printSolution();
    }
    catch(SolutionException err){
      System.out.println(err.getMessage());
    }
    catch(InputMismatchException err2){
      System.out.println("You entered an invalid coefficient value");
    }
  }
}

interface Solvable{
  double[] solve() throws SolutionException;
  void printSolution() throws SolutionException;
}

class SolutionException extends Exception{
  SolutionException(){
    super("No solution");
  }
  SolutionException(String msg){
    super(msg);
  }
}

abstract class Equation implements Solvable{
  double[] coefficients;
  Equation(double...coefficients){
    this.coefficients = coefficients;
  }
  public void printSolution() throws SolutionException{
    double[] solution = this.solve();
    System.out.println("The solution is:");
    for(int i=0; i<solution.length; i++){
      System.out.println("X"+i+" = "+solution[i]);
    }
  }
  void getCoefficientsFromConsole() throws InputMismatchException{
    Scanner sc = new Scanner(System.in);
    for(int i=0; i<this.coefficients.length; i++){
      System.out.print((char)('a'+i)+" = ");
      this.coefficients[i]=sc.nextDouble();
    }
  }
  public abstract double[] solve() throws SolutionException;
}

class LinearEquation extends Equation{
  LinearEquation() throws InputMismatchException{
    super.coefficients = new double[2];
    super.getCoefficientsFromConsole();
  }
  LinearEquation(double[] coefficients) throws InputMismatchException{
    super(coefficients);
    if(coefficients.length!=2) throw new InputMismatchException("Linear Equation has two coefficients");
  }
  LinearEquation(double a, double b){
    super(a, b);
  }
  public double[] solve() throws SolutionException{
    if(super.coefficients[0]==0){
      if(super.coefficients[1]==0) throw new SolutionException("All x are solutions");
      else throw new SolutionException();
    }
    return new double[]{super.coefficients[0]/super.coefficients[1]};
  }
}

class QuadraticEquation extends Equation{
  QuadraticEquation(){
    super.coefficients = new double[3];
    super.getCoefficientsFromConsole();
  }
  QuadraticEquation(double[] coefficients) throws InputMismatchException{
    super(coefficients);
    if(coefficients.length!=3) throw new InputMismatchException("Quadratic Equation has three coefficients");
  }
  QuadraticEquation(double a, double b, double c){
    super(a, b, c);
  }
  public double[] solve() throws SolutionException{
    if(super.coefficients[0]==0){
      LinearEquation le = new LinearEquation(super.coefficients[0], super.coefficients[1]);
      return le.solve();
    }
    double discriminant = super.coefficients[1]*super.coefficients[1]-4*super.coefficients[0]*super.coefficients[2];
    if(discriminant<0){
      throw new SolutionException("No real solutions");
    }
    else{
      double[] solution = new double[2];
      solution[0] = (-super.coefficients[1]+Math.sqrt(discriminant))/(2*super.coefficients[0]);
      solution[1] = (-super.coefficients[1]-Math.sqrt(discriminant))/(2*super.coefficients[0]);
      return solution;
    }
  }
}

 



Добави коментар

Адресът на електронната поща няма да се публикува


*