ehsan_faal
سه شنبه 28 بهمن 1393, 23:26 عصر
سلام دوستان.من یه برنامه نوشتم که معادله چند جمله ای رو از کاربر به عنوان رشته میگیره و ضرایب و درجه رو و هم چنین مقدار چند جمله ای رو توی نقطه ای که خودمون تعییین میکنیم برمیگردونه.
محدودیتی که داره اینه که حتما باید معادله رو به صورت استاندارد وارد کنیم یعنی جمله ای با بزرگترین توان اول بیاد بعد به ترتیب توانها کم بشن.
من یه مقدار راهنمایی میخوام که چطور :
1- اون محدودیت رو وردارم؟
2- چطور میتونم کاری کنم که اگه یه توانی دو بار یا بیشتر تکرار شد اتوماتیک ضرایب اون جمله ها با هم جمع بشن؟
package Priest;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
public class Equation {
private String Eq;
private final String[] C;
private int Deg;
private final String EqHolder;
public Equation(String Equation) {
this.Eq = Equation;
EqHolder = Equation;
Eq = Eq.replaceAll("[^0-9\\-\\.]+", " ");
Eq = Eq.replaceAll("-", " -");
this.C = Eq.split(" ");
}
public String SourceEquation() {
return EqHolder.toUpperCase().replaceAll("\\*", "").replaceAll("[a-zA-Z]", "\\*(X)").replaceAll("\\+", "\\ + ").replaceAll("\\-", "\\ - ");
}
public List<BigDecimal> CaptureCoeff() {
getDegree();
List<BigDecimal> Temp = new ArrayList<>();
for (String S : C) {
Temp.add(new BigDecimal(S));
}
int Location = Temp.indexOf(BigDecimal.valueOf(Deg));
List<BigDecimal> Coeffs = new ArrayList<>();
for (int Counter = Location - 1; Counter < Temp.size(); Counter += 2) {
Coeffs.add(Temp.get(Counter));
}
return Coeffs;
}
public int getDegree() {
int Degree = 0;
for (int Counter = 0; Counter < C.length; Counter += 2) {
if ((new Double(C[Counter])) != 0) {
Degree = new Integer(C[Counter + 1]);
this.Deg = Degree;
break;
}
}
return Degree;
}
public BigDecimal Evaluate(List<BigDecimal> Coefficients, int EvalPoint) {
BigDecimal Output = BigDecimal.ZERO;
for (int Index = 0; Index < Coefficients.size(); Index++) {
Output = Output.add(Coefficients.get(Index).multiply(BigDec imal.valueOf(EvalPoint).pow(Deg--)));
}
return Output;
}
}
کلاس اصلی:
package Priest;
public class MainClass {
public static void main(String[] args) {
String Str = "12.6x^4+6x^3+12*x^2-6*x^1-91";
Equation E = new Equation(Str);
System.out.println("Equation is: " + E.SourceEquation());
System.out.println("Coefficients :" + E.CaptureCoeff());
System.out.println("Polynomial Degree: " + E.getDegree());
int Target = 4;
System.out.println("Equation @ (X:" + Target + ")= " + E.Evaluate(E.CaptureCoeff(), Target));
}
}
اینم جوابی که میگیرم:
run:
Equation is: 12.6*(X)^4 + 6*(X)^3 + 12*(X)^2 - 6*(X)^1 - 91
Coefficients :[12.6, 6, 12, -6, -91]
Polynomial Degree: 4
Equation @ (X:4)= 3686.6
BUILD SUCCESSFUL (total time: 0 seconds)
با تشکر
محدودیتی که داره اینه که حتما باید معادله رو به صورت استاندارد وارد کنیم یعنی جمله ای با بزرگترین توان اول بیاد بعد به ترتیب توانها کم بشن.
من یه مقدار راهنمایی میخوام که چطور :
1- اون محدودیت رو وردارم؟
2- چطور میتونم کاری کنم که اگه یه توانی دو بار یا بیشتر تکرار شد اتوماتیک ضرایب اون جمله ها با هم جمع بشن؟
package Priest;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
public class Equation {
private String Eq;
private final String[] C;
private int Deg;
private final String EqHolder;
public Equation(String Equation) {
this.Eq = Equation;
EqHolder = Equation;
Eq = Eq.replaceAll("[^0-9\\-\\.]+", " ");
Eq = Eq.replaceAll("-", " -");
this.C = Eq.split(" ");
}
public String SourceEquation() {
return EqHolder.toUpperCase().replaceAll("\\*", "").replaceAll("[a-zA-Z]", "\\*(X)").replaceAll("\\+", "\\ + ").replaceAll("\\-", "\\ - ");
}
public List<BigDecimal> CaptureCoeff() {
getDegree();
List<BigDecimal> Temp = new ArrayList<>();
for (String S : C) {
Temp.add(new BigDecimal(S));
}
int Location = Temp.indexOf(BigDecimal.valueOf(Deg));
List<BigDecimal> Coeffs = new ArrayList<>();
for (int Counter = Location - 1; Counter < Temp.size(); Counter += 2) {
Coeffs.add(Temp.get(Counter));
}
return Coeffs;
}
public int getDegree() {
int Degree = 0;
for (int Counter = 0; Counter < C.length; Counter += 2) {
if ((new Double(C[Counter])) != 0) {
Degree = new Integer(C[Counter + 1]);
this.Deg = Degree;
break;
}
}
return Degree;
}
public BigDecimal Evaluate(List<BigDecimal> Coefficients, int EvalPoint) {
BigDecimal Output = BigDecimal.ZERO;
for (int Index = 0; Index < Coefficients.size(); Index++) {
Output = Output.add(Coefficients.get(Index).multiply(BigDec imal.valueOf(EvalPoint).pow(Deg--)));
}
return Output;
}
}
کلاس اصلی:
package Priest;
public class MainClass {
public static void main(String[] args) {
String Str = "12.6x^4+6x^3+12*x^2-6*x^1-91";
Equation E = new Equation(Str);
System.out.println("Equation is: " + E.SourceEquation());
System.out.println("Coefficients :" + E.CaptureCoeff());
System.out.println("Polynomial Degree: " + E.getDegree());
int Target = 4;
System.out.println("Equation @ (X:" + Target + ")= " + E.Evaluate(E.CaptureCoeff(), Target));
}
}
اینم جوابی که میگیرم:
run:
Equation is: 12.6*(X)^4 + 6*(X)^3 + 12*(X)^2 - 6*(X)^1 - 91
Coefficients :[12.6, 6, 12, -6, -91]
Polynomial Degree: 4
Equation @ (X:4)= 3686.6
BUILD SUCCESSFUL (total time: 0 seconds)
با تشکر