Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Locale;
- public class Sum extends Node {
- List<Node> args = new ArrayList<>();
- Sum(){}
- Sum(Node n1, Node n2){
- args.add(n1);
- args.add(n2);
- }
- Sum add(Node n){
- args.add(n);
- return this;
- }
- Sum add(double c){
- args.add(new Constant(c));
- return this;
- }
- Sum add(double c, Node n) {
- Node mul = new Prod(c,n);
- args.add(mul);
- return this;
- }
- @Override
- double evaluate() {
- double result =0;
- //oblicz sumę wartości zwróconych przez wywołanie evaluate skłądników sumy
- for (int i = 0; i < args.size(); i++) {
- result += args.get(i).evaluate();
- }
- return sign*result;
- }
- int getArgumentsCount(){return args.size();}
- public String toString(){
- StringBuilder b = new StringBuilder();
- if(sign<0)b.append("-(");
- for (int i = 0; i < args.size(); i++) {
- if (i > 0) b.append(" + ");
- b.append(args.get(i).toString());
- }
- if(sign<0)b.append(")");
- return b.toString();
- }
- static void buildAndPrint(){
- Variable x = new Variable("x");
- Node exp = new Sum()
- .add(2.1,new Power(x,3))
- .add(new Power(x,2))
- .add(-2,x)
- .add(7);
- System.out.println(exp.toString());
- }
- static void buildAndEvaluate() {
- Variable x = new Variable("x");
- Node exp = new Sum()
- .add(new Power(x, 3))
- .add(-2, new Power(x, 2))
- .add(-1, x)
- .add(2);
- for (double v = -5; v < 5; v += 0.1) {
- x.setValue(v);
- double result = exp.evaluate();
- System.out.printf(Locale.US, "f(%f)=%f", v, result);
- if (result > -0.00001 && result < 0.00001) System.out.print(" <-- Znaleziono miejsce zerowe!");
- System.out.print("\n");
- }
- }
- static void defineCircle(){
- Variable x = new Variable("x");
- Variable y = new Variable("y");
- Node circle = new Sum()
- .add(new Power(x,2))
- .add(new Power(y,2))
- .add(8,x)
- .add(4,y)
- .add(16);
- System.out.println(circle.toString());
- double xv = 100*(Math.random()-.5);
- double yv = 100*(Math.random()-.5);
- x.setValue(xv);
- y.setValue(yv);
- double fv = circle.evaluate();
- System.out.print(String.format("Punkt (%f,%f) leży %s koła %s",xv,yv,(fv<0?"wewnątrz":"na zewnątrz"),circle.toString()));
- }
- static void pointsInCircle() {
- Variable x = new Variable("x");
- Variable y = new Variable("y");
- Node circle = new Sum()
- .add(new Power(x, 2))
- .add(new Power(y, 2))
- .add(8, x)
- .add(4, y)
- .add(16);
- System.out.println(circle.toString());
- int found = 0;
- while (found < 100) {
- double xv = 100 * (Math.random() - .5);
- double yv = 100 * (Math.random() - .5);
- x.setValue(xv);
- y.setValue(yv);
- double fv = circle.evaluate();
- if (fv < 0) {
- found++;
- System.out.print(String.format("%d. Punkt (%f,%f)\n", found, xv, yv));
- }
- }
- }
- public static void main(String[] args) {
- buildAndPrint();
- buildAndEvaluate();
- defineCircle();
- pointsInCircle();
- }
- }
- abstract public class Node {
- int sign=1;
- Node minus(){
- sign = -1;
- return this;
- }
- Node plus(){
- sign = 1;
- return this;
- }
- int getSign(){return sign;}
- /**
- * Oblicza wartość wyrażenia dla danych wartości zmiennych
- * występujących w wyrażeniu
- */
- abstract double evaluate();
- /**
- *
- * zwraca tekstową reprezentację wyrażenia
- */
- public String toString(){return "";}
- /**
- *
- * Zwraca liczbę argumentów węzła
- */
- int getArgumentsCount(){return 0;}
- }
- import java.text.DecimalFormat;
- import java.text.DecimalFormatSymbols;
- import java.util.Locale;
- public class Constant extends Node {
- double value;
- Constant(double value){
- this.sign = value<0?-1:1;
- this.value = value<0?-value:value;
- }
- @Override
- double evaluate() {
- return sign*value;
- }
- @Override
- public String toString() {
- String sgn=sign<0?"-":"";
- // return sgn+Double.toString(value);
- DecimalFormat format = new DecimalFormat("0.#####",new DecimalFormatSymbols(Locale.US));
- return sgn+format.format(value);
- }
- }
- public class Variable extends Node {
- String name;
- Double value;
- Variable(String name){
- this.name = name;
- }
- void setValue(double d){
- value = d;
- }
- @Override
- double evaluate() {
- return sign*value;
- }
- @Override
- public String toString() {
- String sgn=sign<0?"-":"";
- return sgn+name;
- }
- }
- public class Power extends Node {
- double p;
- Node arg;
- Power(Node n,double p){
- arg = n;
- this.p = p;
- }
- @Override
- double evaluate() {
- double argVal = arg.evaluate();
- return Math.pow(argVal,p);
- }
- int getArgumentsCount(){return 1;}
- @Override
- public String toString() {
- StringBuilder b = new StringBuilder();
- if(sign<0)b.append("-");
- int argSign = arg.getSign();
- int cnt = arg.getArgumentsCount();
- boolean useBracket = false;
- if(argSign<0 ||cnt>1)useBracket = true;
- String argString = arg.toString();
- if(useBracket)b.append("(");
- b.append(argString);
- if(useBracket)b.append(")");
- b.append("^");
- b.append(p);
- return b.toString();
- }
- }
- import java.util.ArrayList;
- import java.util.List;
- public class Prod extends Node {
- List<Node> args = new ArrayList<>();
- Prod(){}
- Prod(Node n1){
- args.add(n1);
- }
- Prod(double c){
- //wywołaj konstruktor jednoargumentowy przekazując new Constant(c)
- this(new Constant(c));
- }
- Prod(Node n1, Node n2){
- args.add(n1);
- args.add(n2);
- }
- Prod(double c, Node n){
- this(new Constant(c), n);
- }
- Prod mul(Node n){
- args.add(n);
- return this;
- }
- Prod mul(double c){
- args.add(new Constant(c));
- return this;
- }
- @Override
- double evaluate() {
- double result =1;
- for (int i = 0; i < args.size(); i++) {
- result *= args.get(i).evaluate();
- }
- return sign*result;
- }
- int getArgumentsCount(){return args.size();}
- public String toString(){
- StringBuilder b = new StringBuilder();
- if(sign<0)b.append("-");
- for (int i = 0; i < args.size(); i++) {
- if (i == 0){
- int argSign = args.get(0).getSign();
- if(argSign < 0) b.append("(");
- b.append(args.get(0).toString());
- if(argSign < 0) b.append(")");
- } else {
- b.append("*");
- b.append(args.get(i).toString());
- }
- }
- return b.toString();
- }
- }
Add Comment
Please, Sign In to add comment