diff options
author | Camil Staps | 2015-04-18 13:44:44 +0200 |
---|---|---|
committer | Camil Staps | 2015-04-18 13:44:44 +0200 |
commit | 6a44b074f0169a1b0f9e92347af929c5e471746e (patch) | |
tree | ae5663fe7c69881bf4ecfedbef99c2505f8ec964 /Week7 Polynomials/src/polynomial | |
parent | Added copyright to docs (diff) |
Reorganised projects
Diffstat (limited to 'Week7 Polynomials/src/polynomial')
-rw-r--r-- | Week7 Polynomials/src/polynomial/Polynomial.java | 189 | ||||
-rw-r--r-- | Week7 Polynomials/src/polynomial/Term.java | 145 |
2 files changed, 334 insertions, 0 deletions
diff --git a/Week7 Polynomials/src/polynomial/Polynomial.java b/Week7 Polynomials/src/polynomial/Polynomial.java new file mode 100644 index 0000000..c87b96a --- /dev/null +++ b/Week7 Polynomials/src/polynomial/Polynomial.java @@ -0,0 +1,189 @@ +package polynomial; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Scanner; + +/** + * A class for representing Polynomials + * + * @author Sjaak Smetsers + * @date 10-03-2015 + * + * @author Camil Staps, s4498062 + * @date 17-03-2015 + */ +public class Polynomial { + + /** + * A polynomial is a sequence of terms here kept in an List. + * The assignment tells us 'it's handy' when terms are ordered by exponent. + * We don't seem to need that though, so there's no need to implement it. + */ + List<Term> terms; + + /** + * A constructor for creating the zero Polynomial zero is presented as an + * empty list of terms and not as a single term with 0 as a coefficient + */ + public Polynomial() { + terms = new ArrayList<>(); + } + + /** + * A Constructor creating a polynomial from the argument string. + * + * This implementation, in contrast to the given implementation, allows for + * entering polynomials with two or more terms with the same exponent. Even + * though this is strictly not necessary and these inputs aren't legit, this + * behaviour is always better than the behaviour of the given implementation + * which would happily add two terms with the same exponent to our list. + * + * This implementation also directly checks that the coefficient unequals 0, + * which is also not need-to-have, but still nice-to-have. + * + * Both changes to the given implementation do not change the behaviour on + * legit input but do allow a user to mess up in some cases. + * + * @param s a String representing a list of terms which is converted to a + * scanner and passed to scanTerm for reading each individual term + */ + public Polynomial( String s ) { + terms = new ArrayList<>(); + Scanner scan = new Scanner(s); + + for (Term t = Term.scanTerm(scan); t != null; t = Term.scanTerm(scan)) + if (t.getCoef() != 0) + plus(t); + } + + /** + * The copy constructor for making a deep copy + * + * @param p the copied polynomial + */ + public Polynomial( Polynomial p ) { + terms = new ArrayList<>(p.terms.size()); + for (Term t : p.terms) { + terms.add(new Term(t)); + } + } + + /** + * A straightforward conversion of a Polynomial into a string based on the + * toString for terms + * + * @return a readable string representation of this + */ + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + boolean not_first = false; + for (Term t : terms) { + if (not_first && t.getCoef() >= 0) + sb.append("+"); + sb.append(t); + not_first = true; + } + return sb.toString(); + } + + /** + * Add a polynomial to this polynomial + * @param b the polynomial to add + */ + public void plus(Polynomial b) { + for (Term t : b.terms) + plus(t); + } + + /** + * Add a term + * @param t the term to add + */ + private void plus(Term t) { + if (t.getCoef() == 0) + return; + + Iterator<Term> iter = terms.iterator(); + while (iter.hasNext()) { + Term this_t = iter.next(); + if (this_t.getExp() == t.getExp()) { + this_t.plus(t); + if (this_t.getCoef() == 0) + iter.remove(); + return; + } + } + terms.add(new Term(t)); + } + + /** + * Subtract a polynomial from this polynomial + * @param p the polynomial to subtract + */ + public void minus(Polynomial p) { + Polynomial temp = new Polynomial(p); + temp.times(new Polynomial("-1 0")); + plus(temp); + } + + /** + * Multiply a polynomial with this polynomial + * @param p the polynomial to multiply with + */ + public void times(Polynomial p) { + Polynomial result = new Polynomial(); + for (Term that_t : p.terms) + for (Term this_t : terms) + result.plus(new Term(that_t.getCoef() * this_t.getCoef(), that_t.getExp() + this_t.getExp())); + terms = result.terms; + } + + public void divide(Polynomial b) { + } + + /** + * Check equality + * @param other_poly the object to check with + * @return true iff other_poly represents the same polynomial as this instance + */ + @Override + public boolean equals(Object other_poly) { + if (other_poly == null || other_poly.getClass() != getClass()) + return false; + + Polynomial that = new Polynomial((Polynomial) other_poly); // We need to copy because later we'll remove elements + if (terms.size() != that.terms.size()) + return false; + for (Term this_t : terms) { + Iterator<Term> that_iter = that.terms.iterator(); + boolean found = false; + while (that_iter.hasNext()) { + if (this_t.equals(that_iter.next())) { + found = true; + that_iter.remove(); + break; + } + } + if (!found) { + return false; + } + } + return true; + } + + /** + * Apply the polynomial to a concrete variable + * @param x the variable + * @return the result of the polynomial applied on x + */ + public double apply(double x) { + double result = 0; + for (Term t : terms) + result += t.apply(x); + return result; + } + +} diff --git a/Week7 Polynomials/src/polynomial/Term.java b/Week7 Polynomials/src/polynomial/Term.java new file mode 100644 index 0000000..60c6381 --- /dev/null +++ b/Week7 Polynomials/src/polynomial/Term.java @@ -0,0 +1,145 @@ +package polynomial; + +import java.util.Scanner; + +/** + * For representing terms in a polynomial. + * + * @author Sjaak Smetsers + * @version 1.0 + * @date 15-02-2012 + * + * @author Camil Staps, s4498062 + * @date 17-03-2015 + */ +public class Term { + + /** + * Each term consists of a coefficient and an exponent + */ + private double coefficient; + private int exponent; + + /** + * a get-method for the exponent + * + * @return exponent + */ + public int getExp() { + return exponent; + } + + /** + * a get-method for the coefficient + * + * @return coefficient + */ + public double getCoef() { + return coefficient; + } + + /** + * A two-argument constructor + * + * @param c the value for the coefficient + * @param e the value for the exponent + */ + public Term(double c, int e) { + coefficient = c; + exponent = e; + } + + /** + * A copy-constructor + * + * @param t the term to be copied + */ + public Term(Term t) { + this(t.coefficient, t.exponent); + } + + /** + * For adding two terms with equal exponents + * + * @param t the term added to this + * @require exponent == t.exponent + */ + public void plus(Term t) { + coefficient += t.coefficient; + } + + /** + * For multiplying two terms + * + * @param t the multiplier + */ + public void times(Term t) { + exponent += t.exponent; + coefficient *= t.coefficient; + } + + /** + * Converts a term into a readable representation the standard format is + * %fx^%d + * I changed the implementation to remove trailing zeroes from the coefficient. + * + * @return the string representing the term + */ + @Override + public String toString() { + String nice_coefficient = Double.toString(coefficient); + if (Math.round(coefficient) == coefficient) + nice_coefficient = Integer.toString((int) coefficient); + if (exponent == 0) { + return String.format("%s", nice_coefficient, exponent); + } else if (exponent == 1) { + return String.format("%sx", nice_coefficient, exponent); + } else { + return String.format("%sx^%d", nice_coefficient, exponent); + } + } + + /** + * Standard implementation of equality + * @param may_be_term the object to check equality with + * @return true iff may_be_term represents the same term as this term + */ + @Override + public boolean equals(Object may_be_term) { + if (may_be_term == null || getClass() != may_be_term.getClass()) { + return false; + } else { + Term term = (Term) may_be_term; + return exponent == term.exponent + && coefficient == term.coefficient; + } + } + + /** + * Apply a term to a concrete variable + * @param x the variable to apply the term to + * @return the result of the application of the term to x + */ + public double apply(double x) { + return coefficient * Math.pow(x, exponent); + } + + /** + * A static method for converting scanner input into a term. The expected + * format is two numbers (coef, exp) separated by whitespaces. The coef + * should be either an integer or a decimal number. The exp is an integer. + * + * @param s the scanner providing the input + * @return null if no term could be found, the found term otherwise + */ + public static Term scanTerm(Scanner s) { + String coef_patt = "\\-?\\d+(\\.\\d+)?"; + if (s.hasNext(coef_patt)) { + String coef = s.next(coef_patt); + int exp = s.nextInt(); + return new Term(Double.parseDouble(coef), exp); + } else { + return null; + } + } +} |