Dreiecke < Java < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 11:51 Mi 30.11.2011 | Autor: | dennis2 |
Aufgabe | Hallo, es geht um ein Programm, das die Winkel eines Dreiecks berechnet, wenn man die 3 Seiten kennt. |
An sich würde ich einfach sagen, daß man
die Klasse Math importiert (wobei das glaube ich nichtmal eigens importiert werden muß, da das Paket java.lang inklusive aller Unterpakete, hier: java.lang.Math, automatisch importiert wird) und dann einfach berechnet:
alpha=acos((a * a - b * b - c * c) / (-2 * b * c));
beta= acos((b * b - c * c - a * a) / (-2 * c * a));
gamma=acos((c * c - a * a - b * b) / (-2 * a * b));
Aber das kann es ja nicht schon sein?
Sind noch irgenwelche Voraussetzungen an die Seiten mit einzubeziehen, die man mit irgendwelchen if-Bedingungen abfangen muss oder sowas?'
Ansonsten käme mir die Aufgabe zu einfach vor (zumal obige Formeln sogar schon als Kommentare vorgegeben sind).
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 12:12 Mi 30.11.2011 | Autor: | dennis2 |
Ich glaube, ich müsste eine if-Bedingung "vorschalten":
if(a+b-c>0 && a+c-b>0 && b+c-a>0){
alpha=... ;
beta=... ;
gamma=... ;
}
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 14:16 Mi 30.11.2011 | Autor: | leduart |
Hallo
wenn es um ein Prigramm geht steht da ja keines, sondern nur die 3 zeilen mathe, die sicher richtig sind. alles drum rum, um ein Programm zum laufen zu bringen fehlt.
Beim lernen von programmieren gehts aber nur nebenbei um nath, formeln
gruss leduart
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 14:18 Mi 30.11.2011 | Autor: | dennis2 |
Naja, also es geht um Folgendes:
@return true, if there exists exactly one valid triangle for the given parameters
Und dann habe ich mir überlegt:
private boolean BerechneDreieckBei3BekanntenSeiten() {
double a=0.0;
double b=0.0;
double c=0.0;
double alpha;
double beta;
double gamma;
if(a+b-c>0 && a+c-b>0 && b+c-a>0){
alpha= Math.acos((a * a - b * b - c * c) / (-2 * b * c));
beta= Math.acos((b * b - c * c - a * a) / (-2 * c * a));
gamma= Math.acos((c * c - a * a - b * b) / (-2 * a * b));
return true;
}
return false;
}
Wäre das richtig so?
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 14:43 Mi 30.11.2011 | Autor: | leduart |
Hallo
Was sind denn die gegebenen Parameter? Wenn die a,b,c sind, warum dann die Winkel ausrechnen?
Wenn die Winkel zusätzlich angegeben sind, woher weisst du welchen Ecken sie zugeordnt sin?
Also gib wirklich an, was gefragt ist. etwa gibt es ein Dreick mit den Winkeln... und den Seiten ....
dann ist dein programm nicht ausreichend.
du prüfst ja nur ob die seitensummen möglich sind. und rechnest winkel aus, die mit den eingegebenen nichts zu tun haben müssen.
wenn die Winkel berechnet werden sollen, gibst du sie nicht aus.
Gruss leduart
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 14:47 Mi 30.11.2011 | Autor: | dennis2 |
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Also es ist so, daß ein Interface bereitgestellt wurde.
Da kann man dann jeweils genau drei Werte eingeben.
Hier: 3 Seitenlängen.
Und dann sollen die fehlen Angaben (hier die drei Winkel) berechnet werden.
Aber ich weiß nicht, wie ich die Werte, die man in das Interface eingibt, in der Methode, die ich hier implementieren soll, benutzen kann.
Das Interface:
import java.awt.BorderLayout;
import javax.swing.JFrame;
public class Uebung4{
AbstractTriangle triangle;
public Uebung4(){
triangle= new TriangleCalculation();
}
private void initGUI() {
JFrame frame = new JFrame("Dreiecksberechnung");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new BorderLayout());
frame.getContentPane().add(triangle.getParamPanel(), BorderLayout.WEST);
frame.getContentPane().add(triangle.getDrawPanel(), BorderLayout.CENTER);
frame.getContentPane().add(triangle.getCommentLabel(), BorderLayout.SOUTH);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
final Uebung4 ueb4= new Uebung4();
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
ueb4.initGUI();
}
});
}
}
Die zu vervollständigende Klasse:
/**
* The Class TriangleCalculation.
*/
public class TriangleCalculation extends AbstractTriangle {
/**
* Instantiates a new TriangleCalculation.
*/
public TriangleCalculation(){
super();
}
/* (non-Javadoc)
* @see AbstractTriangle#calculateTriangle()
*/
@Override // Note: "@Override" notes that we implement respectively override a method which is declared in a superclass
public boolean calculateTriangle() {
System.out.println("try calculate triangle now...");
boolean calculationPossible= false;
// Gültige Seiten und Winkel zählen ...
int countSides= 0;
int countAngles= 0;
for (int i=0; i<3; i++){
if (isSideValid(i)) countSides++;
if (isAngleValid(i)) countAngles++;
}
if (countSides+countAngles==3) {
if (countSides==3) {
calculationPossible= calculateTriangleKnowing3Sides();
}
else if (countAngles==2) {
calculationPossible= calculateTriangleKnowing2AnglesAnd1Side();
}
else if (countSides==2) {
calculationPossible= calculateTriangleKnowing2SidesAnd1Angle();
}
else {
setComment("Can not calculate triangle with three angles!");
}
} else {
setComment("We need exactly three values!");
}
setResultsValid(calculationPossible);
if (calculationPossible) setComment("");
drawPanel.repaint();
return calculationPossible;
}
////////////////////////////////////////////////////////////////////////////
//////// Nur die folgenden Methoden müssen implementiert werden ... ////////
////////////////////////////////////////////////////////////////////////////
/**
* TODO:
* Calculate triangle knowing (at least) tree sides.
*
* @return true, if there exists exactly one valid triangle for the given parameters
*/
private boolean calculateTriangleKnowing3Sides() {
double a=0.0;
double b=0.0;
double c=0.0;
double alpha;
double beta;
double gamma;
dreieck=new AbstractTriangle;
if(a+b-c>0 && a+c-b>0 && b+c-a>0){
alpha= Math.acos((a * a - b * b - c * c) / (-2 * b * c));
beta= Math.acos((b * b - c * c - a * a) / (-2 * c * a));
gamma= Math.acos((c * c - a * a - b * b) / (-2 * a * b));
return true;
}
return false;
}
/**
* TODO:
* Calculate triangle knowing (at least) two angles and one side.
*
* @return true, if there exists exactly one valid triangle for the given parameters
*/
private boolean calculateTriangleKnowing2AnglesAnd1Side() {
// W3 = 180° - W1 - W2
// Falls a bekannt ist:
// b = a * sin(β) / sin(α)
// c = a * sin(γ) / sin(α)
// Falls b bekannt ist:
// c = b * sin(γ) / sin(β)
// a = b * sin(α) / sin(β)
// Falls c bekannt ist:
// a = c * sin(α) / sin(γ)
// b = c * sin(β) / sin(γ)
// calculateTriangleKnowing3Sides
return false;
}
/**
* TODO:
* Calculate triangle knowing (at least) two sides and one angle.
*
* @return true, if there exists exactly one valid triangle for the given parameters
*/
private boolean calculateTriangleKnowing2SidesAnd1Angle() {
// Wenn SsW (S>s)
// β = asin(b * sin(α) / a), falls a, b und α gegeben sind; nur eindeutig berechenbar wenn a>=b
// γ = asin(c * sin(β) / b), falls b, c und β gegeben sind; nur eindeutig berechenbar wenn b>=c
// α = asin(a * sin(γ) / c), falls c, a und γ gegeben sind; nur eindeutig berechenbar wenn c>=a
// calculateTriangleKnowing2AnglesAnd1Side
// Wenn WsS (S>s)
// γ = asin(c * sin(α) / a), falls a, c und α gegeben sind; nur eindeutig berechenbar wenn a>=c
// α = asin(a * sin(β) / b), falls b, a und β gegeben sind; nur eindeutig berechenbar wenn b>=a
// β = asin(b * sin(γ) / c), falls c, b und γ gegeben sind; nur eindeutig berechenbar wenn c>=b
// calculateTriangleKnowing2AnglesAnd1Side
// SWS
// Berechne fehlende Seite mit
// a = √(b * b + c * c - 2 * b * c * cos(α))
// b = √(c * c + a * a - 2 * c * a * cos(β))
// c = √(a * a + b * b - 2 * a * b * cos(γ))
// calculateTriangleKnowing3Sides
return false;
}
Mir geht es erstmal um die erste zu implementierende Methode.
Wie kann ich die Werte aus dem Interface zum Rechnen in der Methode verwenden?
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 14:53 Mi 30.11.2011 | Autor: | dennis2 |
Achso! Für die Bearbeitung wurde noch Folgendes zur Verfügung gestellt:
import java.awt.Dimension;
import java.awt.GridLayout;
import javax.swing.JComponent;
import javax.swing.JPanel;
import javax.swing.JTextField;
// TODO: Auto-generated Javadoc
/**
* The Class AbstractTriangle.
*/
abstract class AbstractTriangle {
// Konstanten für die Seiten (entsprechende Indizes für das Array)
/** The Constant [mm] SIDE_A. [/mm] */
public final static int [mm] SIDE_A [/mm] = 0;
/** The Constant [mm] SIDE_B. [/mm] */
public final static int [mm] SIDE_B [/mm] = 1;
/** The Constant [mm] SIDE_C. [/mm] */
public final static int [mm] SIDE_C [/mm] = 2;
// Konstanten für die Winkel (entsprechende Indizes für das Array)
/** The Constant ALPHA. */
public final static int ALPHA = 0;
/** The Constant BETA. */
public final static int BETA = 1;
/** The Constant GAMMA. */
public final static int GAMMA = 2;
/** The sides a, b and c. */
Parameter[] sides; // Die Geraden a, b und c
/** The angles alpha, beta and gamma. */
AngleParameter[] angles; // Die Winkel alpha, beta und gamma
JPanel paramPanel;
TrianglePanel drawPanel;
JTextField commentLabel;
/**
* Initializes all attributes of the class.
*/
protected AbstractTriangle(){
paramPanel= new JPanel();
paramPanel.setLayout(new GridLayout(0,3));
paramPanel.setPreferredSize(new Dimension(250,150));
sides= new Parameter[3];
angles= new AngleParameter[3];
sides[0]= new Parameter("a", paramPanel, this);
sides[1]= new Parameter("b", paramPanel, this);
sides[2]= new Parameter("c", paramPanel, this);
angles[0]= new AngleParameter("alpha", paramPanel, this);
angles[1]= new AngleParameter("beta", paramPanel, this);
angles[2]= new AngleParameter("gamma", paramPanel, this);
drawPanel= new TrianglePanel(this);
drawPanel.setPreferredSize(new Dimension(350,250));
commentLabel= new JTextField("");
commentLabel.setEditable(false);
//commentLabel.setMinimumSize(new Dimension(30, 30));
//commentLabel.setBackground(Color.WHITE);
}
/////////////
// Getters //
/////////////
/**
* Gets the length of sides[index%3]. (For side a index%3 must be 0; For side b index%3 must be 1; For side c index%3 must be 2)
*
* @param index the index of the side
* @return the length
*/
public double getSide(int index){
return sides[index%3].getValue();
}
/**
* Checks if side sides[index%3] is valid. (For side a index%3 must be 0; For side b index%3 must be 1; For side c index%3 must be 2)
*
* @param index the index of the side
* @return true, if the side is valid (length > 0 and not NaN)
*/
public boolean isSideValid(int index){
return sides[index%3].isValid();
}
/**
* Gets the angle of angles[index%3]. (For side a index%3 must be 0; For side b index%3 must be 1; For side c index%3 must be 2)
*
* @param index the index of the angle
* @return the angle
*/
public double getAngle(int index){
return angles[index%3].getValue();
}
/**
* Gets the angle as radian of angles[index%3]. (For angle alpha index%3 must be 0; For angle beta index%3 must be 1; For angle gamma index%3 must be 2)
*
* @param index the index of the angle
* @return the angle as radian
*/
public double getAngleAsRadian(int index){
return angles[index%3].getValueAsRadian();
}
/**
* Checks if angle angles[index%3] is valid. (For angle alpha index%3 must be 0; For angle beta index%3 must be 1; For angle gamma index%3 must be 2)
*
* @param index the index of the angle
* @return true, if the angle is valid (0 < angle < 180 and not NaN)
*/
public boolean isAngleValid(int index){
return angles[index%3].isValid();
}
/**
* Gets the length of side a.
*
* @return the length
*/
public double a(){
return sides[0].getValue();
}
/**
* Gets the length of side b.
*
* @return the length
*/
public double b(){
return sides[1].getValue();
}
/**
* Gets the length of side c.
*
* @return the length
*/
public double c(){
return sides[2].getValue();
}
/**
* Gets the angle of alpha as degree.
*
* @return the angle in degree
*/
public double alpha(){
return angles[0].getValue();
}
/**
* Gets the angle of beta as degree.
*
* @return the angle in degree
*/
public double beta(){
return angles[1].getValue();
}
/**
* Gets the angle of gamma as degree.
*
* @return the angle in degree
*/
public double gamma(){
return angles[2].getValue();
}
/**
* Gets the angle of alpha as radian.
*
* @return the angle as radian
*/
public double alphaR(){
return angles[0].getValueAsRadian();
}
/**
* Gets the angle of beta as radian.
*
* @return the angle as radian
*/
public double betaR(){
return angles[1].getValueAsRadian();
}
/**
* Gets the angle of gamma as radian.
*
* @return the angle as radian
*/
public double gammaR(){
return angles[2].getValueAsRadian();
}
/**
* Checks if side a is valid.
*
* @return true, if the side is valid (length > 0 and not NaN)
*/
public boolean aValid(){
return sides[0].isValid();
}
/**
* Checks if side b is valid.
*
* @return true, if the side is valid (length > 0 and not NaN)
*/
public boolean bValid(){
return sides[1].isValid();
}
/**
* Checks if side c is valid.
*
* @return true, if the side is valid (length > 0 and not NaN)
*/
public boolean cValid(){
return sides[2].isValid();
}
/**
* Checks if angle alpha is valid.
*
* @return true, if the angle is valid (0 < angle < 180 and not NaN)
*/
public boolean alphaValid(){
return angles[0].isValid();
}
/**
* Checks if angle beta is valid.
*
* @return true, if the angle is valid (0 < angle < 180 and not NaN)
*/
public boolean betaValid(){
return angles[1].isValid();
}
/**
* Checks if angle gamma is valid.
*
* @return true, if the angle is valid (0 < angle < 180 and not NaN)
*/
public boolean gammaValid(){
return angles[2].isValid();
}
/**
* Sets a comment.
*
* @param comment a comment
*/
public void setComment(String comment){
System.out.println(comment);
commentLabel.setText(comment);
}
/**
* Gets the param panel.
*
* @return the param panel
*/
public JComponent getParamPanel() {
return paramPanel;
}
/**
* Gets the draw panel.
*
* @return the draw panel
*/
public JComponent getDrawPanel() {
return drawPanel;
}
/**
* Gets the comment label.
*
* @return the comment label
*/
public JComponent getCommentLabel() {
return commentLabel;
}
/////////////
// Setters //
/////////////
/**
* Sets the length of sides[index%3]. (For side a index%3 must be 0; For side b index%3 must be 1; For side c index%3 must be 2)
*
* @param index the index of the side
* @param val the length
*/
public void setSide(int index, double val){
sides[index%3].setValue(val);
}
/**
* Sets the angle of angles[index%3]. (For angle alpha index%3 must be 0; For angle beta index%3 must be 1; For angle gamma index%3 must be 2)
*
* @param index the index of the angle
* @param angleInDegree the angle in degree
*/
public void setAngle(int index, double angleInDegree){
angles[index%3].setValue(angleInDegree);
}
/**
* Sets the angle of angles[index%3] as radian. (For angle alpha index%3 must be 0; For angle beta index%3 must be 1; For angle gamma index%3 must be 2)
*
* @param index the index of the angle
* @param angleAsRadian the angle as radian
*/
public void setAngleAsRadian(int index, double angleAsRadian){
angles[index%3].setValueAsRadian(angleAsRadian);
}
/**
* Sets the length of side a.
*
* @param val the new length
*/
public void setA(double val){
sides[0].setValue(val);
}
/**
* Sets the length of side b.
*
* @param val the new length
*/
public void setB(double val){
sides[1].setValue(val);
}
/**
* Sets the length of side c.
*
* @param val the new length
*/
public void setC(double val){
sides[2].setValue(val);
}
/**
* Sets the angle alpha.
*
* @param angleInDegree the new angle in degree
*/
public void setAlpha(double angleInDegree){
angles[0].setValue(angleInDegree);
}
/**
* Sets the angle beta.
*
* @param angleInDegree the new angle in degree
*/
public void setBeta(double angleInDegree){
angles[1].setValue(angleInDegree);
}
/**
* Sets the angle gamma.
*
* @param angleInDegree the new angle in degree
*/
public void setGamma(double angleInDegree){
angles[2].setValue(angleInDegree);
}
/**
* Sets the angle alpha.
*
* @param angleAsRadian the new angle as radian
*/
public void setAlphaAsRadian(double angleAsRadian){
angles[0].setValueAsRadian(angleAsRadian);
}
/**
* Sets the angle beta.
*
* @param angleAsRadian the new angle as radian
*/
public void setBetaAsRadian(double angleAsRadian){
angles[1].setValueAsRadian(angleAsRadian);
}
/**
* Sets the angle gamma.
*
* @param angleAsRadian the new angle as radian
*/
public void setGammaAsRadian(double angleAsRadian){
angles[2].setValueAsRadian(angleAsRadian);
}
/**
* Clears all sides and angles (output).
*/
protected void clearOutput() {
for (int i=0; i<3; i++){
setSide(i, Double.NaN);
setAngle(i, Double.NaN);
}
}
/**
* Clears all sides and angles (input).
*/
protected void clearInput() {
for (int i=0; i<3; i++){
sides[i].clearInput();
angles[i].clearInput();
}
}
/**
* All sides and angles with valid input values get set as output values.
*/
public void setInputValuesAsOutput(){
double buf;
for (int i=0; i<3; i++){ // ...
if ((buf= sides[i].getInputValue())>0) {
//countSides++;
setSide(i, buf); // ... gültige Werte (sowohl Seiten als auch ...
} else {
setSide(i, Double.NaN);
}
if ((buf= angles[i].getInputValue())>0 && buf<180) {
//countAngles++;
setAngle(i, buf); // ... Winkel) übertragen.
} else {
setAngle(i, Double.NaN);
}
}
}
public boolean isAngleNearlyEquals(int index, double expected){
return angles[index%3].valueNearlyEquals(expected);
}
public boolean isSideNearlyEquals(int index, double expected){
return sides[index%3].valueNearlyEquals(expected);
}
/**
* Sets the Result as valid (black) or invalid (red).
*
* @param valid the new results valid
*/
protected void setResultsValid(boolean valid) {
for (int i=0; i<3; i++){
sides[i].setResultValid(valid);
angles[i].setResultValid(valid);
}
}
/**
* Sets the given values (use Double.NaN for values which should not be set).
*
* @param a side a
* @param b side b
* @param c side c
* @param alpha angle alpha
* @param beta angle beta
* @param gamma angle gamma
*/
public void setValues(double a, double b, double c, double alpha, double beta, double gamma) {
setA(a);
setB(b);
setC(c);
setAlpha(alpha);
setBeta(beta);
setGamma(gamma);
}
/**
* Tests your implementation of the calculation. Before you call
* this method you must call setValues(double a, double b, double c, double alpha, double beta, double gamma)
*
* @return true, if calculateTriangle() returns true and triangle is valid
*/
public boolean testCalculation() {
if (!calculateTriangle()) return false;
return isValid();
}
/**
* Checks if triangle is valid.
* Therefore:
* 1) all side and angle values (output) must be set and valid
* 2) all given Input must be equals to the value of the output
* 3) using the given sides we calculate all angles and compare them with the angles set (angles must be nearly equals)
*
* @return true, if valid
*/
public boolean isValid() {
double buf;
for (int i=0; i<3; i++){
if (!isSideValid(i)) return false;
else {
buf= sides[i].getInputValue();
if (buf>0 && !isSideNearlyEquals(i, buf)) return false;
}
if (!isAngleValid(i)) return false;
else {
buf= angles[i].getInputValue();
if (buf>0 && !isAngleNearlyEquals(i, buf)) return false;
}
}
for (int i=0; i<3; i++){
double s1= getSide(i);
double s2= getSide(i+1);
double s3= getSide(i+2);
double angle= Math.toDegrees(Math.acos((s1*s1 - s2*s2 - s3*s3) / (-2 * s2*s3)));
if (!isAngleNearlyEquals(i, angle)) return false;
}
return true;
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
@Override
public String toString(){
return "sides: " + a() + ", " + b() + ", " + c() + "; angles: " + alpha() + "," + beta() + "," + gamma();
}
/**
* calculateTriangle() should try to calculate the unknown sides and angles of the triangle.
*
* Note:
* "When an abstract class is subclassed, the subclass usually provides
* implementations for all of the abstract methods in its parent class."
* (see: http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html)
*
* @return true, if there exists exactly one valid triangle for the given parameters
*/
public abstract boolean calculateTriangle();
}
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 15:27 Mi 30.11.2011 | Autor: | dennis2 |
Also, ich hab nochmal ein bisschen darüber nachgedacht.
Ich habe das jetzt so verstanden:
In dem Interface gibt man zum Beispiel für a,b,c Werte ein.
Die werden (automatisch) in einem Array abgespeichert.
Außerdem wird ein Array für die Winkel angelegt.
Und in der Methode, die die fehlenden Winkel berechnet, muss man jetzt zugreifen auf diese Arrays. Das kann man wohl mitHilfe der Methoden, die die Klasse AbstractTriangle bereitstellt...
Also für den Winkel alpha habe ich mir das so gedacht:
private boolean calculateTriangleKnowing3Sides() {
if(a+b-c>0 && a+c-b>0 && b+c-a>0){
}
alpha=setAngleasRadian(int 0, double Math.cosa(getSide(0)*getSide(0)-getSide(1)*getSide(1)-getSide(2)*getSide(2))/(-2*getSide(1)*getSide(2)))
....
}
Was haltet ihr davon?
|
|
|
|
|
Hallo dennis2,
> Also, ich hab nochmal ein bisschen darüber nachgedacht.
>
> Ich habe das jetzt so verstanden:
>
> In dem Interface gibt man zum Beispiel für a,b,c Werte
> ein.
>
> Die werden (automatisch) in einem Array abgespeichert.
> Außerdem wird ein Array für die Winkel angelegt.
>
> Und in der Methode, die die fehlenden Winkel berechnet,
> muss man jetzt zugreifen auf diese Arrays. Das kann man
> wohl mitHilfe der Methoden, die die Klasse AbstractTriangle
> bereitstellt...
>
>
> Also für den Winkel alpha habe ich mir das so gedacht:
>
>
> private boolean calculateTriangleKnowing3Sides() {
>
>
> if(a+b-c>0 && a+c-b>0 && b+c-a>0){
>
>
> }
>
> alpha=setAngleasRadian(int 0, double
> Math.cosa(getSide(0)*getSide(0)-getSide(1)*getSide(1)-getSide(2)*getSide(2))/(-2*getSide(1)*getSide(2)))
>
> ....
>
>
> }
>
>
>
> Was haltet ihr davon?
Das ist zu unübersichtlich.
Dann besser so:
a=getSide(0);
b=getSide(1);
c=getSide(2);
alpha=Math.cosa((a*a-b*b-c*c)/(-2*b*c));
setAngleasRadian(0,alpha);
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 15:53 Mi 30.11.2011 | Autor: | dennis2 |
Ich habe eine Frage an Dich.
Ist es egal, ob man beispielsweise
a=this.a();
oder
a=getSide(0);
nimmt?
[Das mit dem this kenne ich gar nicht.]
|
|
|
|
|
Hallo dennis2,
> Ich habe eine Frage an Dich.
>
> Ist es egal, ob man beispielsweise
>
> a=this.a();
>
> oder
>
> a=getSide(0);
>
> nimmt?
>
Ja, das ist egal.
>
> [Das mit dem this kenne ich gar nicht.]
this ist die aktuelle Instanz der Klasse.
Gruss
MathePower
|
|
|
|
|
Hallo dennis2,
> private boolean calculateTriangleKnowing3Sides() {
>
>
> double a=0.0;
> double b=0.0;
> double c=0.0;
> double alpha;
> double beta;
> double gamma;
>
> dreieck=new AbstractTriangle;
>
Diese Anweisung ist unnötig,
da eine abstrakte Klasse nicht instantiiert wird.
>
> if(a+b-c>0 && a+c-b>0 && b+c-a>0){
>
> alpha= Math.acos((a * a - b * b - c * c) / (-2 * b * c));
>
> beta= Math.acos((b * b - c * c - a * a) / (-2 * c * a));
>
> gamma= Math.acos((c * c - a * a - b * b) / (-2 * a * b));
>
> return true;
> }
>
>
> return false;
>
> }
>
>
> Mir geht es erstmal um die erste zu implementierende
> Methode.
>
> Wie kann ich die Werte aus dem Interface zum Rechnen in der
> Methode verwenden?
Da musst Du die get-Methoden verwenden:
a=this.a();
b=this.b();
c=this.c();
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 16:04 Mi 30.11.2011 | Autor: | dennis2 |
Danke.
Dann habe ich jetzt Folgendes:
private boolean calculateTriangleKnowing3Sides() {
a=getSide(0);
b=getSide(1);
c=getSide(2);
if(a+b-c>0 && a+c-b>0 && b+c-a>0){
alpha=Math.cosa((a*a-b*b-c*c)/(-2*b*c));
setAngleAsRadian(0, alpha);
beta=Math.acos((b * b - c * c - a * a) / (-2 * c * a));
setAngleAsRadian(1, beta);
gamma=Math.acos((c * c - a * a - b * b) / (-2 * a * b));
setAngleAsRadian(2, gamma);
return true;
}
return false;
}
Ist das richtig?
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 16:05 Mi 30.11.2011 | Autor: | dennis2 |
43 errors kommen da..
Die meisten sind dieser Art:
cannot find symbol b
|
|
|
|
|
Hallo dennis2,
> Danke.
>
> Dann habe ich jetzt Folgendes:
>
>
> private boolean calculateTriangleKnowing3Sides() {
>
> a=getSide(0);
> b=getSide(1);
> c=getSide(2);
>
> if(a+b-c>0 && a+c-b>0 && b+c-a>0){
>
> alpha=Math.cosa((a*a-b*b-c*c)/(-2*b*c));
>
> setAngleAsRadian(0, alpha);
>
> beta=Math.acos((b * b - c * c - a * a) / (-2 * c * a));
>
> setAngleAsRadian(1, beta);
>
> gamma=Math.acos((c * c - a * a - b * b) / (-2 * a *
> b));
>
> setAngleAsRadian(2, gamma);
>
>
>
> return true;
>
> }
>
>
>
>
> return false;
>
> }
>
>
> Ist das richtig?
Ja.
Poste doch die Fehlermeldungen, die Du erhältst.
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 16:10 Mi 30.11.2011 | Autor: | dennis2 |
Das sind 43 Stück, kann ich hier einen Screenshot hochladen? Abtippen wäre ein bisschen schwer.
Bevor der Screenshot freigeschaltet wird:
Eigentlich sind alle Fehlermeldungen so:
"cannot find symbol
symbol: variable a
location: TriangleCalculation
alpha=..."
Dateianhänge: Anhang Nr. 1 (Typ: png) [nicht öffentlich]
|
|
|
|
|
Hallo dennis2,
> Das sind 43 Stück, kann ich hier einen Screenshot
> hochladen? Abtippen wäre ein bisschen schwer.
>
> Bevor der Screenshot freigeschaltet wird:
>
> Eigentlich sind alle Fehlermeldungen so:
>
> "cannot find symbol
> symbol: variable a
> location: TriangleCalculation
> alpha=..."
>
Die Variablen a,b,c,alpha,beta,gamma müssen
natürlich in der Methode deklariert werden.
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 16:21 Mi 30.11.2011 | Autor: | dennis2 |
So:
double a=getSide(0);
double b=getSide(1);
double cc=getSide(2);
double alpha;
double beta;
double gamma;
?
Dann kommen noch 16 Fehlermeldungen.
Screenshot kommt gleich wieder.
Dateianhänge: Anhang Nr. 1 (Typ: png) [nicht öffentlich]
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 16:27 Mi 30.11.2011 | Autor: | dennis2 |
Sorry, hatte einmal cc statt c geschrieben.
Dann bleibt nur noch 1 Fehlermeldung übrig, nämlich:
cannot find symbol
symbol: method cosa(double)
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 16:36 Mi 30.11.2011 | Autor: | dennis2 |
Ach, wie blöd und ungeschickt von mir.
Ja, jetzt kommt keine Fehlermeldung mehr.
Ich danke Dir sehr! (Sehr!!)
Ich weiß nicht, inwiefern Du Dir die Aufgabe als Ganze angeschaut hast, aber wenn ich jetzt wieder das Interface öffne, sprich
java Uebung4
und dann 3 Werte für die Seiten a,b und c eingebe, die der Bedingung genügen:
Werden dann die Winkel angezeigt im Interface oder wenigstens in der Konsole berechnet ausgegeben?
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 16:42 Mi 30.11.2011 | Autor: | dennis2 |
Sorry, ich habe mal wieder zu voreilig gefragt, statt es selbst auszutesten.
Also bei mir wird dann in dem Interface angezeigt, wie die Winkel sind (neben den Eingabefeldern für die Winkel).
Die Anzeige ist nicht gerade schön, weil da zum Beispiel anstatt 60° steht: 60 ° (was immer das heißen mag). Aber naja. Das ist ein Schönheitsfehler.
|
|
|
|
|
Hallo dennis2,
> Ach, wie blöd und ungeschickt von mir.
> Ja, jetzt kommt keine Fehlermeldung mehr.
>
> Ich danke Dir sehr! (Sehr!!)
>
>
> Ich weiß nicht, inwiefern Du Dir die Aufgabe als Ganze
> angeschaut hast, aber wenn ich jetzt wieder das Interface
> öffne, sprich
>
> java Uebung4
>
> und dann 3 Werte für die Seiten a,b und c eingebe, die der
> Bedingung genügen:
>
> Werden dann die Winkel angezeigt im Interface oder
> wenigstens in der Konsole berechnet ausgegeben?
Es wird weder auf Konsole noch im Interface etwas ausgegeben.
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 16:48 Mi 30.11.2011 | Autor: | dennis2 |
Bei mir schon. Neben den Eingabefeldern für die Winkel:
Screenshot.
Wie kommt das?
Dateianhänge: Anhang Nr. 1 (Typ: png) [nicht öffentlich]
|
|
|
|
|
Hallo dennis2,
> Bei mir schon. Neben den Eingabefeldern für die Winkel:
>
> Screenshot.
>
> Wie kommt das?
>
Dann ist irgendwo in dem Programm eine Anweisung,
die das bewerkstelligt.
Gruss
MathePower
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 16:58 Mi 30.11.2011 | Autor: | dennis2 |
Danke nochmal!
Ohne Deine geduldige Hilfe hätte ich das nicht hinbekommen.
Ich versuche mich jetzt noch an der Implementierung der anderen Fälle und poste das hier dann wieder.
Vielleicht hast Du ja Lust und Zeit das dann nochmal anzusehen. Es wäre eine große Hilfe für mich.
Einen schönen Abend wünsche ich noch!
Dennis
|
|
|
|
|
Hallo dennis2,
> So:
>
> double a=getSide(0);
> double b=getSide(1);
> double cc=getSide(2);
> double alpha;
> double beta;
> double gamma;
>
> ?
>
>
> Dann kommen noch 16 Fehlermeldungen.
>
>
> Screenshot kommt gleich wieder.
>
Den Schreibfehler hast Du ja in Deiner Mitteilung korrigiert.
Die Methode, die Du zum Ausrechen der Winkel benötigst, lautet: Math.acos
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 17:36 Mi 30.11.2011 | Autor: | dennis2 |
Also jetzt kümmere ich mich um den Fall, daß zwei Winkel und eine Seite bekannt sind bzw. in das Interface eingegeben werden.
Dann berechne ich den dritten Winkel (W3), indem ich rechne:
W3=180-W1-W2.
Da kann es nun drei Fälle geben:
1.) alpha und beta bekannt
2.) alpha und gamma bekannt
3.) beta und gamma bekannt
Ich überlege gerade, wie ich diese "Fallunterscheidung" in die Methode einbauen könnte.
Als Erstes kam mir eine switch-Anweisung in den Sinn.
Wäre das eine Möglichkeit?
switch(double, double){
case alpha, beta: gamma=180-alpha-beta; setAngle(2, gamma); break;
case alpha, gamma: beta=180-alpha-gamma; setAngle(1, beta); break;
case beta, gamma: alpha=180-beta-gamma; setAngle(0,alpha); break;
}
?
Wobei man vorher setzt:
double alpha=getAngle(0);
double beta=getAngle(1);
double gamma=getAngle(2);
|
|
|
|
|
Hallo dennis2,
> Also jetzt kümmere ich mich um den Fall, daß zwei Winkel
> und eine Seite bekannt sind bzw. in das Interface
> eingegeben werden.
>
> Dann berechne ich den dritten Winkel (W3), indem ich
> rechne:
>
> W3=180-W1-W2.
>
>
> Da kann es nun drei Fälle geben:
>
> 1.) alpha und beta bekannt
> 2.) alpha und gamma bekannt
> 3.) beta und gamma bekannt
>
>
> Ich überlege gerade, wie ich diese "Fallunterscheidung" in
> die Methode einbauen könnte.
>
> Als Erstes kam mir eine switch-Anweisung in den Sinn.
>
> Wäre das eine Möglichkeit?
>
>
> switch(double, double){
>
> case alpha, beta: gamma=180-alpha-beta; setAngle(2, gamma);
> break;
>
> case alpha, gamma: beta=180-alpha-gamma; setAngle(1, beta);
> break;
>
> case beta, gamma: alpha=180-beta-gamma; setAngle(0,alpha);
> break;
>
> }
>
>
> ?
>
> Wobei man vorher setzt:
>
> double alpha=getAngle(0);
> double beta=getAngle(1);
> double gamma=getAngle(2);
Ich weiss nicht, was getAngle(index) zurückgibt,
wenn das zugehörige Eingabefeld leer ist.
Dann ist erst zu prüfen, welches Eingabefeld leer ist.
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 18:06 Mi 30.11.2011 | Autor: | dennis2 |
Hm, ich verstehe zwar, was Du meinst, aber ich wüsste nicht, wie ich das jetzt umsetzen kann.
Angenommen, man gibt bei alpha und beta Werte ein. Dann wäre das Eingabefeld bei gamma leer.
Was bedeutet denn ein leeres Eingabefeld?
if((getAngle(0)&&getAngle(1)!=0) && getAngle(2)=0)
?
Das macht wenig Sinn.
Aber ich weiß nicht, wie ich die Fälle nterscheiden kann, welche zwei Winkel gegeben sind.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:17 Mi 30.11.2011 | Autor: | dennis2 |
Vielleicht:
if(((0<getAngle(0)<180) && (0<getAngle(1)<180)) && (gammaValid()==false)){...
}
|
|
|
|
|
Hallo dennis2,
> Hm, ich verstehe zwar, was Du meinst, aber ich wüsste
> nicht, wie ich das jetzt umsetzen kann.
>
> Angenommen, man gibt bei alpha und beta Werte ein. Dann
> wäre das Eingabefeld bei gamma leer.
>
> Was bedeutet denn ein leeres Eingabefeld?
>
keine Eingabe.
> if((getAngle(0)&&getAngle(1)!=0) && getAngle(2)=0)
>
> ?
>
>
> Das macht wenig Sinn.
>
> Aber ich weiß nicht, wie ich die Fälle nterscheiden kann,
> welche zwei Winkel gegeben sind.
Maßgebend sind doch die Methoden alphaValid(), betaValid(), gammaValid()
Darauf baust Du Deine Abfragen auf.
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 18:38 Mi 30.11.2011 | Autor: | dennis2 |
Ah!
Dann war meine Idee in der Mitteilung ja doch ganz passabel!
Also dann würde ich das so machen:
alpha=getAngle(0);
beta=getAngle(1);
gamma=getAngle(2);
if(alphaValid()==true&&betaValid()==true && gammaValid()==false){
gamma=180-alpha-beta;
setAngle(2, gamma);
}
Und analog für die anderen beiden Fälle.
|
|
|
|
|
Hallo dennis2,
> Ah!
>
> Dann war meine Idee in der Mitteilung ja doch ganz
> passabel!
>
> Also dann würde ich das so machen:
>
> alpha=getAngle(0);
> beta=getAngle(1);
> gamma=getAngle(2);
>
> if(alphaValid()==true&&betaValid()==true &&
> gammaValid()==false){
>
> gamma=180-alpha-beta;
> setAngle(2, gamma);
> }
>
> Und analog für die anderen beiden Fälle.
>
So kann man das machen.
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 19:10 Mi 30.11.2011 | Autor: | dennis2 |
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Die zwei fehlenden Seite berechne ich so (dies ist mein Code dafür):
// Berechnung der zwei fehlenden Seiten
// Falls a bekannt ist:
// b = a * sin(β) / sin(α)
// c = a * sin(γ) / sin(α)
double a=getSide(0);
double b=getSide(1);
double c=getSide(2);
if(aValid()==true && bValid()==false && cValid()==false){
b=a*Math.sin(beta)/Math.sin(alpha);
setB(b);
c=a*Math.sin(gamma)/Math.sin(alpha);
setC(c);
}
// Falls b bekannt ist:
// c = b * sin(γ) / sin(β)
// a = b * sin(α) / sin(β)
if(bValid()==true && aValid()==false & cValid()==false){
c=b*Math.sin(gamma)/Math.sin(alpha);
setC(c);
a=b*Math.sin(alpha)/Math.sin(beta);
setA(a);
}
// Falls c bekannt ist:
// a = c * sin(α) / sin(γ)
// b = c * sin(β) / sin(γ)
if(aValid()==false && bValid()==false && cValid()==true){
a=c*Math.sin(alpha)/Math.sin(gamma);
setA(a);
b=c*Math.sin(beta)/Math.sin(gamma);
setB(b);
Komischerweise kommt bei einer Seite eine negative Länge heraus. Was ist da falsch?
Ansonsten scheint es aber zu stimmen.
Wie ist das mit dem false und true?
Es soll ja true zurückgegeben werden, wenn alles stimmt.
Wird das hier getan?
|
|
|
|
|
Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Hallo dennis2,
> Eingabefehler: "{" und "}" müssen immer paarweise
> auftreten, es wurde aber ein Teil ohne Entsprechung
> gefunden (siehe rote Markierung)
>
> Die zwei fehlenden Seite berechne ich so (dies ist mein
> Code dafür):
>
> // Berechnung der zwei fehlenden Seiten
>
> // Falls a bekannt ist:
> // b = a * sin(β) / sin(α)
> // c = a * sin(γ) / sin(α)
> double a=getSide(0);
> double b=getSide(1);
> double c=getSide(2);
>
>
> if(aValid()==true && bValid()==false &&
> cValid()==false){
>
> b=a*Math.sin(beta)/Math.sin(alpha);
>
> setB(b);
>
> c=a*Math.sin(gamma)/Math.sin(alpha);
>
> setC(c);
> }
>
> // Falls b bekannt ist:
> // c = b * sin(γ) / sin(β)
> // a = b * sin(α) / sin(β)
> if(bValid()==true && aValid()==false &
> cValid()==false){
>
> c=b*Math.sin(gamma)/Math.sin(alpha);
>
> setC(c);
>
> a=b*Math.sin(alpha)/Math.sin(beta);
>
> setA(a);
> }
>
> // Falls c bekannt ist:
> // a = c * sin(α) / sin(γ)
> // b = c * sin(β) / sin(γ)
> if(aValid()==false && bValid()==false &&
> cValid()==true){
>
> a=c*Math.sin(alpha)/Math.sin(gamma);
>
> setA(a);
>
> b=c*Math.sin(beta)/Math.sin(gamma);
>
> setB(b);
>
>
>
> Komischerweise kommt bei einer Seite eine negative Länge
> heraus. Was ist da falsch?
>
Die Winkel musst Du vorher in Radiant umrechnen,
falls noch nicht geschehen.
> Ansonsten scheint es aber zu stimmen.
>
>
> Wie ist das mit dem false und true?
>
> Es soll ja true zurückgegeben werden, wenn alles stimmt.
>
> Wird das hier getan?
Als Rückgabewert gibst Du den überprüften Wert der fehlenden Seite zurück.
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 19:35 Mi 30.11.2011 | Autor: | dennis2 |
> Die Winkel musst Du vorher in Radiant umrechnen,
> falls noch nicht geschehen.
Warum ist das nötig?
> Als Rückgabewert gibst Du den überprüften Wert der
> fehlenden Seite zurück.
Das verstehe ich nicht.
Zu Beginn der Methode steht als Kommentar:
"
@return true, if there exists exactly one valid triangle for the given parameters"
Und die Methode ist ja auch boolean, also muss ich ja true oder false zurückgeben.
Im Moment wird doch false zurückgegeben?
|
|
|
|
|
Hallo dennis2,
>
> > Die Winkel musst Du vorher in Radiant umrechnen,
> > falls noch nicht geschehen.
>
> Warum ist das nötig?
>
Weil die trigonometrischen Funktion in java.lang.math
mit Argumenten im Bogenmaß arbeiten.
>
>
> > Als Rückgabewert gibst Du den überprüften Wert der
> > fehlenden Seite zurück.
>
> Das verstehe ich nicht.
>
> Zu Beginn der Methode steht als Kommentar:
>
> "
> @return true, if there exists exactly one valid triangle
> for the given parameters"
>
> Und die Methode ist ja auch boolean, also muss ich ja true
> oder false zurückgeben.
>
> Im Moment wird doch false zurückgegeben?
Das ist abhängig von den nicht umgewandelten WInkeln.
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 19:48 Mi 30.11.2011 | Autor: | dennis2 |
Seltsam, also ich habe jetzt Folgendes für die Methode:
private boolean calculateTriangleKnowing2AnglesAnd1Side() {
// Berechnung des fehlenden Winkels W3 (entweder alpha, beta oder gamma)
double alpha=getAngle(0);
double beta=getAngle(1);
double gamma=getAngle(2);
setAlphaAsRadian(alpha);
setBetaAsRadian(beta);
setGammaAsRadian(gamma);
if(alphaValid()==true && betaValid()==true && gammaValid()==false){
gamma=180-alpha-beta;
setAngle(2, gamma);
}
if(alphaValid()==true && betaValid()==false && gammaValid()==true){
beta=180-alpha-gamma;
setAngle(1, beta);
}
if(alphaValid()==false && betaValid()==true && gammaValid()==true){
alpha=180-beta-gamma;
setAngle(0, alpha);
}
// Berechnung der zwei fehlenden Seiten (Fallunterscheidung)
double a=getSide(0);
double b=getSide(1);
double c=getSide(2);
if(aValid()==true && bValid()==false && cValid()==false){
b=a*Math.sin(beta)/Math.sin(alpha);
setB(b);
c=a*Math.sin(gamma)/Math.sin(alpha);
setC(c);
}
if(bValid()==true && aValid()==false & cValid()==false){
c=b*Math.sin(gamma)/Math.sin(alpha);
setC(c);
a=b*Math.sin(alpha)/Math.sin(beta);
setA(a);
}
if(aValid()==false && bValid()==false && cValid()==true){
a=c*Math.sin(alpha)/Math.sin(gamma);
setA(a);
b=c*Math.sin(beta)/Math.sin(gamma);
setB(b);
}
return false;
}
Bevor die Winkel in Radian umgewandelt habe, erschien bei allen fehlenden Angaben im Interface der Wert, jetzt nicht mehr.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 19:50 Mi 30.11.2011 | Autor: | dennis2 |
Ich bin ja auch doof!
Du meintest, ich muss die Winkel in Radian umrechnen NICHT am Anfang der Methode (wo ich den Winkel berechne), sondern, bevor ich die Seiten berechne (da wird ja erst sin benutzt)..
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 19:56 Mi 30.11.2011 | Autor: | dennis2 |
Jetzt habe ich schon wieder Bockmist gebaut!
private boolean calculateTriangleKnowing2AnglesAnd1Side() {
// Berechnung des fehlenden Winkels W3 (entweder alpha, beta oder gamma)
double alpha=getAngle(0);
double beta=getAngle(1);
double gamma=getAngle(2);
if(alphaValid()==true && betaValid()==true && gammaValid()==false){
gamma=180-alpha-beta;
setAngle(2, gamma);
}
if(alphaValid()==true && betaValid()==false && gammaValid()==true){
beta=180-alpha-gamma;
setAngle(1, beta);
}
if(alphaValid()==false && betaValid()==true && gammaValid()==true){
alpha=180-beta-gamma;
setAngle(0, alpha);
}
// Berechnung der zwei fehlenden Seiten (Fallunterscheidung)
double a=getSide(0);
double b=getSide(1);
double c=getSide(2);
setAlphaAsRadian(alpha);
setBetaAsRadian(beta);
setGammaAsRadian(gamma);
if(aValid()==true && bValid()==false && cValid()==false){
b=a*Math.sin(beta)/Math.sin(alpha);
setB(b);
c=a*Math.sin(gamma)/Math.sin(alpha);
setC(c);
}
if(bValid()==true && aValid()==false & cValid()==false){
c=b*Math.sin(gamma)/Math.sin(alpha);
setC(c);
a=b*Math.sin(alpha)/Math.sin(beta);
setA(a);
}
if(aValid()==false && bValid()==false && cValid()==true){
a=c*Math.sin(alpha)/Math.sin(gamma);
setA(a);
b=c*Math.sin(beta)/Math.sin(gamma);
setB(b);
}
return false;
}
Und jetzt kommen da ganz abstruse Winkelwerte heraus...
Und immer noch Minuswerte für einzelne Seitenlängen.
|
|
|
|
|
Hallo dennis2,
> Jetzt habe ich schon wieder Bockmist gebaut!
>
> private boolean calculateTriangleKnowing2AnglesAnd1Side()
> {
>
> // Berechnung des fehlenden Winkels W3 (entweder alpha,
> beta oder gamma)
>
> double alpha=getAngle(0);
> double beta=getAngle(1);
> double gamma=getAngle(2);
>
>
>
> if(alphaValid()==true && betaValid()==true &&
> gammaValid()==false){
>
> gamma=180-alpha-beta;
> setAngle(2, gamma);
> }
>
> if(alphaValid()==true && betaValid()==false &&
> gammaValid()==true){
>
> beta=180-alpha-gamma;
> setAngle(1, beta);
> }
>
> if(alphaValid()==false && betaValid()==true &&
> gammaValid()==true){
>
> alpha=180-beta-gamma;
> setAngle(0, alpha);
> }
>
> // Berechnung der zwei fehlenden Seiten
> (Fallunterscheidung)
>
> double a=getSide(0);
> double b=getSide(1);
> double c=getSide(2);
>
> setAlphaAsRadian(alpha);
> setBetaAsRadian(beta);
> setGammaAsRadian(gamma);
>
>
> if(aValid()==true && bValid()==false &&
> cValid()==false){
>
> b=a*Math.sin(beta)/Math.sin(alpha);
>
> setB(b);
>
> c=a*Math.sin(gamma)/Math.sin(alpha);
>
> setC(c);
> }
>
>
> if(bValid()==true && aValid()==false & cValid()==false){
>
> c=b*Math.sin(gamma)/Math.sin(alpha);
>
> setC(c);
>
> a=b*Math.sin(alpha)/Math.sin(beta);
>
> setA(a);
> }
>
>
> if(aValid()==false && bValid()==false &&
> cValid()==true){
>
> a=c*Math.sin(alpha)/Math.sin(gamma);
>
> setA(a);
>
> b=c*Math.sin(beta)/Math.sin(gamma);
>
> setB(b);
>
> }
>
>
>
> return false;
> }
>
>
> Und jetzt kommen da ganz abstruse Winkelwerte heraus...
> Und immer noch Minuswerte für einzelne Seitenlängen.
Die Methode getAngle() wird hier nicht gebraucht.
Gebraucht werden die Methoden alphaR(), betaR(), gammaR().
Gruss
MathePower
|
|
|
|
|
Hallo dennis2,
> Seltsam, also ich habe jetzt Folgendes für die Methode:
>
> private boolean calculateTriangleKnowing2AnglesAnd1Side()
> {
>
> // Berechnung des fehlenden Winkels W3 (entweder alpha,
> beta oder gamma)
>
> double alpha=getAngle(0);
> double beta=getAngle(1);
> double gamma=getAngle(2);
>
> setAlphaAsRadian(alpha);
> setBetaAsRadian(beta);
> setGammaAsRadian(gamma);
>
Zur Umwandlung gibt es die Methoden alphaR(), betaR(), gammaR()
>
> if(alphaValid()==true && betaValid()==true &&
> gammaValid()==false){
>
> gamma=180-alpha-beta;
> setAngle(2, gamma);
> }
>
> if(alphaValid()==true && betaValid()==false &&
> gammaValid()==true){
>
> beta=180-alpha-gamma;
> setAngle(1, beta);
> }
>
> if(alphaValid()==false && betaValid()==true &&
> gammaValid()==true){
>
> alpha=180-beta-gamma;
> setAngle(0, alpha);
> }
>
> // Berechnung der zwei fehlenden Seiten
> (Fallunterscheidung)
>
> double a=getSide(0);
> double b=getSide(1);
> double c=getSide(2);
>
>
> if(aValid()==true && bValid()==false &&
> cValid()==false){
>
> b=a*Math.sin(beta)/Math.sin(alpha);
>
> setB(b);
>
> c=a*Math.sin(gamma)/Math.sin(alpha);
>
> setC(c);
> }
>
>
> if(bValid()==true && aValid()==false & cValid()==false){
>
> c=b*Math.sin(gamma)/Math.sin(alpha);
>
> setC(c);
>
> a=b*Math.sin(alpha)/Math.sin(beta);
>
> setA(a);
> }
>
>
> if(aValid()==false && bValid()==false &&
> cValid()==true){
>
> a=c*Math.sin(alpha)/Math.sin(gamma);
>
> setA(a);
>
> b=c*Math.sin(beta)/Math.sin(gamma);
>
> setB(b);
>
> }
>
>
>
> return false;
> }
>
>
> Bevor die Winkel in Radian umgewandelt habe, erschien bei
> allen fehlenden Angaben im Interface der Wert, jetzt nicht
> mehr.
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 20:12 Mi 30.11.2011 | Autor: | dennis2 |
Hoffentlich letzte Frage:
Dann habe ich jetzt
private boolean calculateTriangleKnowing2AnglesAnd1Side() {
// Berechnung des fehlenden Winkels W3 (entweder alpha, beta oder gamma)
double alpha=getAngle(0);
double beta=getAngle(1);
double gamma=getAngle(2);
if(alphaValid()==true && betaValid()==true && gammaValid()==false){
gamma=180-alpha-beta;
setAngle(2, gamma);
}
if(alphaValid()==true && betaValid()==false && gammaValid()==true){
beta=180-alpha-gamma;
setAngle(1, beta);
}
if(alphaValid()==false && betaValid()==true && gammaValid()==true){
alpha=180-beta-gamma;
setAngle(0, alpha);
}
// Berechnung der zwei fehlenden Seiten (Fallunterscheidung)
double a=getSide(0);
double b=getSide(1);
double c=getSide(2);
if(aValid()==true && bValid()==false && cValid()==false){
b=a*Math.sin(betaR())/Math.sin(alphaR());
setB(b);
c=a*Math.sin(gammaR())/Math.sin(alphaR());
setC(c);
}
if(bValid()==true && aValid()==false & cValid()==false){
c=b*Math.sin(gammaR())/Math.sin(alphaR());
setC(c);
a=b*Math.sin(alphaR())/Math.sin(betaR());
setA(a);
}
if(aValid()==false && bValid()==false && cValid()==true){
a=c*Math.sin(alphaR())/Math.sin(gammaR());
setA(a);
b=c*Math.sin(betaR())/Math.sin(gammaR());
setB(b);
}
return false;
}
Und man kann (muss aber nicht)
double alpha=getAngle(0);
double beta=getAngle(1);
double gamma=getAngle(2);
also weglassen?
-------------------
Und wie ist das nun mit dem
return false;
Am Ende, das habe ich leider immer noch nicht verstanden.
Muss ich nicht dafür sorgen, dass true zurückgegeben wird?
|
|
|
|
|
Hallo dennis2,
> Hoffentlich letzte Frage:
>
> Dann habe ich jetzt
>
> private boolean calculateTriangleKnowing2AnglesAnd1Side()
> {
>
> // Berechnung des fehlenden Winkels W3 (entweder alpha,
> beta oder gamma)
>
> double alpha=getAngle(0);
> double beta=getAngle(1);
> double gamma=getAngle(2);
>
>
>
> if(alphaValid()==true && betaValid()==true &&
> gammaValid()==false){
>
> gamma=180-alpha-beta;
> setAngle(2, gamma);
> }
>
> if(alphaValid()==true && betaValid()==false &&
> gammaValid()==true){
>
> beta=180-alpha-gamma;
> setAngle(1, beta);
> }
>
> if(alphaValid()==false && betaValid()==true &&
> gammaValid()==true){
>
> alpha=180-beta-gamma;
> setAngle(0, alpha);
> }
>
> // Berechnung der zwei fehlenden Seiten
> (Fallunterscheidung)
>
> double a=getSide(0);
> double b=getSide(1);
> double c=getSide(2);
>
>
> if(aValid()==true && bValid()==false && cValid()==false){
>
> b=a*Math.sin(betaR())/Math.sin(alphaR());
>
> setB(b);
>
> c=a*Math.sin(gammaR())/Math.sin(alphaR());
>
> setC(c);
> }
>
>
> if(bValid()==true && aValid()==false & cValid()==false){
>
> c=b*Math.sin(gammaR())/Math.sin(alphaR());
>
> setC(c);
>
> a=b*Math.sin(alphaR())/Math.sin(betaR());
>
> setA(a);
> }
>
>
> if(aValid()==false && bValid()==false &&
> cValid()==true){
>
> a=c*Math.sin(alphaR())/Math.sin(gammaR());
>
> setA(a);
>
> b=c*Math.sin(betaR())/Math.sin(gammaR());
>
> setB(b);
>
> }
>
>
>
> return false;
> }
>
>
>
>
> Und man kann (muss aber nicht)
>
> double alpha=getAngle(0);
> double beta=getAngle(1);
> double gamma=getAngle(2);
>
> also weglassen?
>
So wie die Methode jetzt geschrieben ist,
kannst Du Initialieserung der Winkel weglassen.
Andererseits, wenn Du deklarierst:
double alpha=alphaR();
double beta=betaR();
double gamma=gammaR();
Dann brauchst bei der vorher geschriebenen Methode nicht viel ändern.
In der aktuellen Version der Methode
hast Du alle alpha's, beta's und gamma's ersetzen müssen.
>
> -------------------
>
> Und wie ist das nun mit dem
>
> return false;
>
> Am Ende, das habe ich leider immer noch nicht verstanden.
> Muss ich nicht dafür sorgen, dass true zurückgegeben
> wird?
>
Da die Methode jetzt richtig funktionieren sollte,
sollte die natürlich auch "zurückgeben".
Du kannst auch als Rückgabewert, den geprüfen Wert der fehlenden Seite zurückgeben. Hier also: aValid(), bValid() oder cValid();
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 20:34 Mi 30.11.2011 | Autor: | dennis2 |
> Da die Methode jetzt richtig funktionieren sollte,
> sollte die natürlich auch "zurückgeben".
> Du kannst auch als Rückgabewert, den geprüfen Wert der
> fehlenden Seite zurückgeben. Hier also: aValid(), bValid()
> oder cValid();
Wie muss ich meine Methode also ergänzen?
Tut mir leid, wenn ich das NOCHMAL fragen muss.
Ist mir schon fast peinlich.
|
|
|
|
|
Hallo dennis2,
> > Da die Methode jetzt richtig funktionieren sollte,
> > sollte die natürlich auch "zurückgeben".
>
> > Du kannst auch als Rückgabewert, den geprüfen Wert der
> > fehlenden Seite zurückgeben. Hier also: aValid(), bValid()
> > oder cValid();
>
>
> Wie muss ich meine Methode also ergänzen?
Nun, wenn die fehlende Seite berechnet und gesetzt wurde,
dann gibst Du die entsprechende Valid-Methode zurück.
z.B. fehlende Seite a: return aValid();
>
> Tut mir leid, wenn ich das NOCHMAL fragen muss.
>
> Ist mir schon fast peinlich.
>
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 20:44 Mi 30.11.2011 | Autor: | dennis2 |
JETZT ist der Groschen gefallen!!
Natürlich, das sind ja boolean-Methoden.
Ich weiß gar nicht, wie ich Dir danken soll.
Wenn ich mal irgendwas für DICH tun kann (obwohl ich nicht glaube, daß ich irgendwas beherrsche, was Du nicht auch könntest und das noch viel besser...), sag es bitte!!!
Und zum Schluss (für heute ) noch eine Frage zu diesem Thread:
Ist es eigentlich möglich, daß man den für eine gewisse Zeit "unsichtbar" macht? Ich möchte nicht, daß der Tutor nach der Abgabe dann das Internet durchforstet und mir dann vorwirft, ich hätte abgeschrieben, obwohl ich es mir so hart mit Deiner Hilfe selbst erarbeitet habe.
Geht sowas??
|
|
|
|
|
Hallo dennis2,
> JETZT ist der Groschen gefallen!!
>
> Natürlich, das sind ja boolean-Methoden.
>
Und wenn keine if-Abfrage durchlaufen wird,
dann gibt die Methode natürlich "false" zurück.
> Ich weiß gar nicht, wie ich Dir danken soll.
>
> Wenn ich mal irgendwas für DICH tun kann (obwohl ich nicht
> glaube, daß ich irgendwas beherrsche, was Du nicht auch
> könntest und das noch viel besser...), sag es bitte!!!
>
>
> Und zum Schluss (für heute ) noch eine Frage zu diesem
> Thread:
>
> Ist es eigentlich möglich, daß man den für eine gewisse
> Zeit "unsichtbar" macht? Ich möchte nicht, daß der Tutor
> nach der Abgabe dann das Internet durchforstet und mir dann
> vorwirft, ich hätte abgeschrieben, obwohl ich es mir so
> hart mit Deiner Hilfe selbst erarbeitet habe.
>
Ich glaube nicht, daß der Tutor Dir das vorwirft.
Wenn doch, dann kannst Du ja sagen, dass dieser
Benutzername zu Dir gehört.
>
> Geht sowas??
Sicherlich ist so was möglich, ist aber nicht im Sinne dieses Forums.
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 20:57 Mi 30.11.2011 | Autor: | dennis2 |
Ja, im Sinne des Forums ist es nicht, das sehe ich ein.
Ich habe halt nur, wie gesagt, Sorge, daß es dann so aussieht, als habe ich irgendwo abgeschrieben.
Vielleicht muß ich den Tutor einfach mal fragen, wie sowas gehandhabt wird.
Immerhin ist dies ja eine Hilfe-Forum und daß da (im besten Falle, so wie hier) am Ende eines Threads Lösungen entstanden sind, die man dann abgibt, ist ja eigentlich logisch.
Ich habe da auch noch nie so drüber nachgedacht.
Aber ich denke, daß einige Mitstudenten wohl auch auf diesen Thread stoßen könnten und vielleicht ihrerseits abschreiben und das am Ende vllt. auch an mir hängen bleiben könnte.
Hm, irgendwie eine heikle Angelegenheit.
Nichtsdestotrotz gibt es keinen dankbareren User als mich. Das ist eine Riesenhilfe für mich.
Und vllt. kann ja doch eine Ausnahme gemacht werden, sodaß dieser Thread sozusagen für eine oder zwei Woche(n) im Keller bleibt und dann wieder normal sichtbar ist?
|
|
|
|
|
Hallo dennis2,
> Ja, im Sinne des Forums ist es nicht, das sehe ich ein.
>
> Ich habe halt nur, wie gesagt, Sorge, daß es dann so
> aussieht, als habe ich irgendwo abgeschrieben.
>
> Vielleicht muß ich den Tutor einfach mal fragen, wie sowas
> gehandhabt wird.
>
> Immerhin ist dies ja eine Hilfe-Forum und daß da (im
> besten Falle, so wie hier) am Ende eines Threads Lösungen
> entstanden sind, die man dann abgibt, ist ja eigentlich
> logisch.
>
>
> Ich habe da auch noch nie so drüber nachgedacht.
> Aber ich denke, daß einige Mitstudenten wohl auch auf
> diesen Thread stoßen könnten und vielleicht ihrerseits
> abschreiben und das am Ende vllt. auch an mir hängen
> bleiben könnte.
>
>
> Hm, irgendwie eine heikle Angelegenheit.
>
Du kannst ja Deine selbstentwickelten Methoden
verständlicher machen, d.h. Kommentare an
geeigneter Stelle einfügen.
>
>
> Nichtsdestotrotz gibt es keinen dankbareren User als mich.
> Das ist eine Riesenhilfe für mich.
>
>
>
> Und vllt. kann ja doch eine Ausnahme gemacht werden, sodaß
> dieser Thread sozusagen für eine oder zwei Woche(n) im
> Keller bleibt und dann wieder normal sichtbar ist?
Dann musst Du Dich an den webmaster wenden.
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 15:28 Do 01.12.2011 | Autor: | dennis2 |
Da bin ich wieder!
Jetzt habe ich mal bei dem Fall weitergemacht, daß man 2 Seiten kennt und einen Winkel und hier den Fall WsS mit S>s.
double a=getSide(0);
double b=getSide(1);
double c=getSide(2);
double alpha=getAngle(0);
double beta=getAngle(1);
double gamma=getAngle(2);
if(alphaValid()==true && cValid()==true && aValid()==true && a>c){
gamma=Math.asin( c*Math.sin(alphaR())/a );
setAngleAsRadian(2, gamma);
beta=180-alpha-gamma;
setAngle(1, beta);
b=c*Math.sin(betaR())/Math.sin(gammaR());
setB(b);
return bValid();
}
if(betaValid()==true && aValid()==true && bValid()==true && b>a){
alpha=Math.asin( a*Math.sin(betaR())/b );
setAngleAsRadian(0, alpha);
gamma=180-alpha-beta;
setAngle(2, gamma);
c=a*Math.sin(gammaR())/Math.sin(alphaR());
setC(c);
return gammaValid();
}
if(gammaValid()==true && bValid()==true && cValid()==true && c>b){
beta=Math.asin( b*Math.sin(gammaR())/c );
setAngleAsRadian(1, beta);
alpha=180-beta-gamma;
setAngle(0, alpha);
a=b*Math.sin(alphaR())/Math.sin(betaR());
setA(a);
return aValid();
}
Ich denke, daß der Code an sich okay ist. Jedoch bekomme ich nicht die richtigen Werte heraus.
Wenn ich zum Beispiel:
gamma=137
b=23
c=27
eingebe, so erhalte ich
a=26,7
alpha=42,4
beta=35,5
Und es sttimmt nur beta.
Ich nehme an, daß ich irgendwo Grad und Radian falsch habe bzw. vertauscht habe.
Ich sehe aber nicht, wo.
|
|
|
|
|
Hallo dennis2,
> Da bin ich wieder!
>
> Jetzt habe ich mal bei dem Fall weitergemacht, daß man 2
> Seiten kennt und einen Winkel und hier den Fall WsS mit
> S>s.
1: | > if(gammaValid()==true && bValid()==true && cValid()==true
| 2: | > && c>b){
| 3: | >
| 4: | > beta=Math.asin( b*Math.sin(gammaR())/c );
| 5: | >
| 6: | > setAngleAsRadian(1, beta);
| 7: | >
| 8: | > alpha=180-beta-gamma;
| 9: | >
| 10: | > setAngle(0, alpha);
| 11: | >
| 12: | > a=b*Math.sin(alphaR())/Math.sin(betaR());
| 13: | >
| 14: | > setA(a);
| 15: | >
| 16: | > return aValid();
| 17: | >
| 18: | > } |
>
> Ich denke, daß der Code an sich okay ist. Jedoch bekomme
> ich nicht die richtigen Werte heraus.
>
Ja, der Code ist ok.
> Wenn ich zum Beispiel:
>
> gamma=137
>
> b=23
>
> c=27
>
> eingebe, so erhalte ich
>
> a=26,7
>
> alpha=42,4
>
> beta=35,5
>
>
> Und es sttimmt nur beta.
>
>
> Ich nehme an, daß ich irgendwo Grad und Radian falsch habe
> bzw. vertauscht habe.
>
> Ich sehe aber nicht, wo.
>
"beta" ist in Radiant errechnet worden, gamma ist in Grad gegeben.
Bei der Berechnung vom fehlenden Winkel wird
Grad und Radiant vermischt, so daß das
unten genannte Ergebnis herauskommt.
Richtig muss es deshalb heissen:
[mm]alpha=180-beta\left\red{(}\right\red{)}-gamma;[/mm]
Ähnlich ist es in den anderen if-Abfragen.
Den Programmcode, den Du hier postet,
kannst Du zwischen "[mm][code ][/mm]" und "[mm][/code][/mm]" platzieren.
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 16:18 Do 01.12.2011 | Autor: | dennis2 |
Was meinst Du mit beta ()?
Soll das betaR() heißen?
|
|
|
|
|
Hallo dennis2,
> Was meinst Du mit beta ()?
>
>
> Soll das betaR() heißen?
Nein, das ist schon richtig: "beta()".
Das ist eine Funktion, die den Winkel beta von Radian nach Grad umwandelt.
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 16:25 Do 01.12.2011 | Autor: | dennis2 |
Danke.
Dann muss ich nochmal auf Aufgabe 1 zurückkommen, damit ich das mit dem Radian und dem Grad verstehe, dort habe ich ja:
1: |
| 2: | private boolean calculateTriangleKnowing3Sides() {
| 3: |
| 4: | double a=getSide(0);
| 5: | double b=getSide(1);
| 6: | double c=getSide(2);
| 7: | double alpha;
| 8: | double beta;
| 9: | double gamma;
| 10: |
| 11: | if(a+b-c>0 && a+c-b>0 && b+c-a>0){
| 12: |
| 13: | alpha=Math.acos((a*a-b*b-c*c)/(-2*b*c));
| 14: |
| 15: | setAngleAsRadian(0, alpha);
| 16: |
| 17: | beta=Math.acos((b * b - c * c - a * a) / (-2 * c * a));
| 18: |
| 19: | setAngleAsRadian(1, beta);
| 20: |
| 21: | gamma=Math.acos((c * c - a * a - b * b) / (-2 * a * b));
| 22: |
| 23: | setAngleAsRadian(2, gamma);
| 24: |
| 25: |
| 26: | return true;
| 27: |
| 28: | }
| 29: |
| 30: | return false;
| 31: |
| 32: | } |
Eigentlich müssten hier die Winkel doch als Radian im Interface ausgegeben werden, wieso werden sie aber doch (so, wie es sein soll) in Grad ausgegeben?
|
|
|
|
|
Hallo dennis2,
> Danke.
>
> Dann muss ich nochmal auf Aufgabe 1 zurückkommen, damit
> ich das mit dem Radian und dem Grad verstehe, dort habe ich
> ja:
>
> 1: |
| 2: | > private boolean calculateTriangleKnowing3Sides() {
| 3: | >
| 4: | > double a=getSide(0);
| 5: | > double b=getSide(1);
| 6: | > double c=getSide(2);
| 7: | > double alpha;
| 8: | > double beta;
| 9: | > double gamma;
| 10: | >
| 11: | > if(a+b-c>0 && a+c-b>0 && b+c-a>0){
| 12: | >
| 13: | > alpha=Math.acos((a*a-b*b-c*c)/(-2*b*c));
| 14: | >
| 15: | > setAngleAsRadian(0, alpha);
| 16: | >
| 17: | > beta=Math.acos((b * b - c * c - a * a) / (-2 * c * a));
| 18: | >
| 19: | > setAngleAsRadian(1, beta);
| 20: | >
| 21: | > gamma=Math.acos((c * c - a * a - b * b) / (-2 * a *
| 22: | > b));
| 23: | >
| 24: | > setAngleAsRadian(2, gamma);
| 25: | >
| 26: | >
| 27: | > return true;
| 28: | >
| 29: | > }
| 30: | >
| 31: | > return false;
| 32: | >
| 33: | > } |
>
> Eigentlich müssten hier die Winkel doch als Radian im
> Interface ausgegeben werden, wieso werden sie aber doch
> (so, wie es sein soll) in Grad ausgegeben?
Ich nehme an, das steht in der Klasse "AngleParameter".
Leider liegt mir diese Klasse nicht vor.
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 16:33 Do 01.12.2011 | Autor: | dennis2 |
Achso, jetzt verstehe ich.
Am ende wird quasi automatisch dafür gesorgt, daß IMMER in Grad ausgegeben wird.
Bei den Berechnungen hier muss man lediglich dafür sorgen, daß man
1.) bei Methoden wie sin Radian nimmt
2.) ansonsten einheitlich entweder bei Grad oder bei Radian bleibt.
Ich muss also nicht dafür sorgen, daß am Ende Grad ausgegeben wird, sondern nur, daß richtig berechnet wird.
|
|
|
|
|
Hallo dennis2,
> Achso, jetzt verstehe ich.
>
> Am ende wird quasi automatisch dafür gesorgt, daß IMMER
> in Grad ausgegeben wird.
>
> Bei den Berechnungen hier muss man lediglich dafür sorgen,
> daß man
>
> 1.) bei Methoden wie sin Radian nimmt
>
> 2.) ansonsten einheitlich entweder bei Grad oder bei Radian
> bleibt.
>
>
> Ich muss also nicht dafür sorgen, daß am Ende Grad
> ausgegeben wird, sondern nur, daß richtig berechnet wird.
Ja.
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 11:25 Fr 02.12.2011 | Autor: | dennis2 |
Hallo, ich denke, daß ich die Methoden nun vollständig implementiert habe und es auch soweit korrekt ist.
Nun geht es darum, für die Methoden gewisse Tests ausführen zu lassen. Dafür wurde eine Klasse Tests zur Verfügung gestellt, die eine zu ergänzende Methode test() enthält:
1: |
| 2: | public class Tests {
| 3: |
| 4: | AbstractTriangle triangle;
| 5: |
| 6: | public Tests(){
| 7: | triangle= new TriangleCalculation();
| 8: | }
| 9: |
| 10: | private boolean test(){
| 11: | boolean pass= true;
| 12: | final double n= Double.NaN;
| 13: |
| 14: | // Zunächst testen wir unsere Berechnungen für Dreiecke mit drei bekannten Seiten
| 15: | System.out.println("\n");
| 16: | triangle.setValues(10, 10, 10, n, n, n); // sollte gültiges Dreieck ergeben
| 17: | pass= pass & assert_true(triangle.toString(),
| 18: | triangle.testCalculation(), triangle.toString());
| 19: |
| 20: | System.out.println("\n");
| 21: | triangle.setValues(15, 19, 7, n, n, n);
| 22: | pass= pass & assert_true(triangle.toString(), // sollte gültiges Dreieck ergeben
| 23: | triangle.testCalculation(), triangle.toString());
| 24: |
| 25: | System.out.println("\n");
| 26: | triangle.setValues(10, 10, 20, n, n, n); // Grenzfall: a + b = c: sollte kein gültiges Drieck ergeben
| 27: | pass= pass & assert_false(triangle.toString(),
| 28: | triangle.testCalculation(), triangle.toString());
| 29: |
| 30: | System.out.println("\n");
| 31: | triangle.setValues(10, 10, 30, n, n, n); // a + c > c: sollte kein gültiges Dreieck ergeben
| 32: | pass= pass & assert_false(triangle.toString(),
| 33: | triangle.testCalculation(), triangle.toString());
| 34: |
| 35: | // ............
| 36: |
| 37: | return pass;
| 38: | }
| 39: |
| 40: |
| 41: | private boolean assert_true(String message, boolean expression, String message2) {
| 42: | System.out.print( message + " : Expect true: ");
| 43: | if (message2!=null) System.out.print("\n" + message2 + ": ");
| 44: | if ( expression ) {
| 45: | System.out.println( "[PASS]" );
| 46: | return true;
| 47: | } else {
| 48: | System.out.println( "[FAIL]" );
| 49: | return false;
| 50: | }
| 51: | }
| 52: |
| 53: | private boolean assert_false(String message, boolean expression, String message2) {
| 54: | System.out.print( message + " : Expect false: ");
| 55: | if (message2!=null) System.out.print("\n" + message2 + ": ");
| 56: | if ( !expression ) {
| 57: | System.out.println( "[PASS]" );
| 58: | return true;
| 59: | } else {
| 60: | System.out.println( "[FAIL]" );
| 61: | return false;
| 62: | }
| 63: | }
| 64: |
| 65: | public static void main(String[] args) {
| 66: | Tests test= new Tests();
| 67: | System.out.println("All tests passed: " + test.test());
| 68: | }
| 69: |
| 70: | }
|
Zeile 14-33 testen die implementierte Methode
calculateTriangleKnowing3Sides.
Soweit habe ich das verstanden.
Allerdings ist mir nicht klar, wo ich da nun etwas ergänzen muss, damit ich teste, ob ich diese Methode richtig implementiert habe.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 11:38 Fr 02.12.2011 | Autor: | dennis2 |
Meine Idee ist es, daß ich zwischen die Zeilen 16 und 17 einfüge:
triangle.testCalculation();
Und ebenso zwischen die Zeilen 21/22, 26/27 und 31/32.
Allerdings scheint das nicht korrekt zu sein: s. Screenshot
Dateianhänge: Anhang Nr. 1 (Typ: png) [nicht öffentlich]
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 12:01 Fr 02.12.2011 | Autor: | dennis2 |
Füge ich stattdessen zwischen die Zeilen 16/17, 21/22, 26/27 und 31/32 Folgendes ein:
triangle.isValid();
bekomme ich Folgendes: s. Screenshot.
Das scheint doch korrekt zu sein?
Dateianhänge: Anhang Nr. 1 (Typ: png) [nicht öffentlich]
|
|
|
|
|
Hallo dennis2,
> Hallo, ich denke, daß ich die Methoden nun vollständig
> implementiert habe und es auch soweit korrekt ist.
>
> Nun geht es darum, für die Methoden gewisse Tests
> ausführen zu lassen. Dafür wurde eine Klasse Tests zur
> Verfügung gestellt, die eine zu ergänzende Methode test()
> enthält:
>
> 1: |
| 2: | > public class Tests {
| 3: | >
| 4: | > AbstractTriangle triangle;
| 5: | >
| 6: | > public Tests(){
| 7: | > triangle= new TriangleCalculation();
| 8: | > }
| 9: | >
| 10: | > private boolean test(){
| 11: | > boolean pass= true;
| 12: | > final double n= Double.NaN;
| 13: | >
| 14: | > // Zunächst testen wir unsere Berechnungen für Dreiecke
| 15: | > mit drei bekannten Seiten
| 16: | > [mm] System.out.println("\n");[/mm]
| 17: | > triangle.setValues(10, 10, 10, n, n, n); // sollte
| 18: | > gültiges Dreieck ergeben
| 19: | > pass= pass & assert_true(triangle.toString(),
| 20: | > triangle.testCalculation(), triangle.toString());
| 21: | >
| 22: | > [mm] System.out.println("\n");[/mm]
| 23: | > triangle.setValues(15, 19, 7, n, n, n);
| 24: | > pass= pass & assert_true(triangle.toString(), // sollte
| 25: | > gültiges Dreieck ergeben
| 26: | > triangle.testCalculation(), triangle.toString());
| 27: | >
| 28: | > [mm] System.out.println("\n");[/mm]
| 29: | > triangle.setValues(10, 10, 20, n, n, n); // Grenzfall: a
| 30: | > + b = c: sollte kein gültiges Drieck ergeben
| 31: | > pass= pass & assert_false(triangle.toString(),
| 32: | > triangle.testCalculation(), triangle.toString());
| 33: | >
| 34: | > [mm] System.out.println("\n");[/mm]
| 35: | > triangle.setValues(10, 10, 30, n, n, n); // a + c > c:
| 36: | > sollte kein gültiges Dreieck ergeben
| 37: | > pass= pass & assert_false(triangle.toString(),
| 38: | > triangle.testCalculation(), triangle.toString());
| 39: | >
| 40: | > // ............
| 41: | >
| 42: | > return pass;
| 43: | > }
| 44: | >
| 45: | >
| 46: | > private boolean assert_true(String message, boolean
| 47: | > expression, String message2) {
| 48: | > System.out.print( message + " : Expect true: ");
| 49: | > if (message2!=null) [mm]System.out.print("\n"[/mm] + message2 +
| 50: | > ": ");
| 51: | > if ( expression ) {
| 52: | > System.out.println( "[PASS]" );
| 53: | > return true;
| 54: | > } else {
| 55: | > System.out.println( "[FAIL]" );
| 56: | > return false;
| 57: | > }
| 58: | > }
| 59: | >
| 60: | > private boolean assert_false(String message, boolean
| 61: | > expression, String message2) {
| 62: | > System.out.print( message + " : Expect false: ");
| 63: | > if (message2!=null) [mm]System.out.print("\n"[/mm] + message2 +
| 64: | > ": ");
| 65: | > if ( !expression ) {
| 66: | > System.out.println( "[PASS]" );
| 67: | > return true;
| 68: | > } else {
| 69: | > System.out.println( "[FAIL]" );
| 70: | > return false;
| 71: | > }
| 72: | > }
| 73: | >
| 74: | > public static void main(String[] args) {
| 75: | > Tests test= new Tests();
| 76: | > System.out.println("All tests passed: " + test.test());
| 77: | > }
| 78: | >
| 79: | > }
| 80: | > |
>
> Zeile 14-33 testen die implementierte Methode
>
> calculateTriangleKnowing3Sides.
>
>
> Soweit habe ich das verstanden.
>
> Allerdings ist mir nicht klar, wo ich da nun etwas
> ergänzen muss, damit ich teste, ob ich diese Methode
> richtig implementiert habe.
>
Für die anderen Fälle 2 Seiten - 1 Winkel bzw. 2 Winkel - 1 Seite
müssen ebenfalls noch Tests gefahren werden.
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 14:33 Fr 02.12.2011 | Autor: | dennis2 |
Ja, also da habe ich mir jetzt willkürlich Beispiele ausgedacht, zum Beispiel dieses:
1: |
| 2: | System.out.println("\n");
| 3: | triangle.setValues(n, 0, n, n, 35, 47);
| 4: |
| 5: | triangle.isValid();
| 6: |
| 7: | pass= pass & assert_false(triangle.toString(),
| 8: | triangle.testCalculation(), triangle.toString());
|
Erwartet wird also: false (weil b=0) und das scheint auch alles zu stimmen, jedenfalls wird PASS angezeigt.
----------------
Das einzige Problem hatte ich bei folgendem willkürlichen Beispiel, bei dem ich nicht weiß, wieso FAIL am Ende angezeigt wird:
1: |
| 2: | System.out.println("\n");
| 3: | triangle.setValues(n, 23, n, 79, n, 20);
| 4: |
| 5: | triangle.isValid();
| 6: |
| 7: | pass= pass & assert_true(triangle.toString(),
| 8: | triangle.testCalculation(), triangle.toString());
|
Da wird seltsamerweise FAIL angezeigt.
Ich habe schon versucht herauszufinden, wieso, aber nichts Fehlerhaftes entdeckt.
|
|
|
|
|
Hallo dennis2,
> Ja, also da habe ich mir jetzt willkürlich Beispiele
> ausgedacht, zum Beispiel dieses:
>
> 1: |
| 2: | > [mm]System.out.println("\n");[/mm]
| 3: | > triangle.setValues(n, 0, n, n, 35, 47);
| 4: | >
| 5: | > triangle.isValid();
| 6: | >
| 7: | > pass= pass & assert_false(triangle.toString(),
| 8: | > triangle.testCalculation(), triangle.toString());
| 9: | > |
>
> Erwartet wird also: false (weil b=0) und das scheint auch
> alles zu stimmen, jedenfalls wird PASS angezeigt.
>
>
> ----------------
>
> Das einzige Problem hatte ich bei folgendem willkürlichen
> Beispiel, bei dem ich nicht weiß, wieso FAIL am Ende
> angezeigt wird:
>
> 1: |
| 2: | > [mm]System.out.println("\n");[/mm]
| 3: | > triangle.setValues(n, 23, n, 79, n, 20);
| 4: | >
| 5: | > triangle.isValid();
| 6: | >
| 7: | > pass= pass & assert_true(triangle.toString(),
| 8: | > triangle.testCalculation(), triangle.toString());
| 9: | > |
>
> Da wird seltsamerweise FAIL angezeigt.
>
> Ich habe schon versucht herauszufinden, wieso, aber nichts
> Fehlerhaftes entdeckt.
Um den Fehler zu lokalisieren,
poste den Code der Methode calculateTriangleKnowing2AnglesAnd1Side().
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 15:29 Fr 02.12.2011 | Autor: | dennis2 |
Okay!
1: |
| 2: | private boolean calculateTriangleKnowing2AnglesAnd1Side() {
| 3: |
| 4: | // Berechnung des fehlenden Winkels
| 5: |
| 6: | double alpha=getAngle(0);
| 7: | double beta=getAngle(1);
| 8: | double gamma=getAngle(2);
| 9: |
| 10: |
| 11: |
| 12: | if(alphaValid()==true && betaValid()==true && gammaValid()==false){
| 13: |
| 14: | gamma=180-alpha-beta;
| 15: |
| 16: | setAngle(2, gamma);
| 17: | }
| 18: |
| 19: | if(alphaValid()==true && betaValid()==false && gammaValid()==true){
| 20: |
| 21: | beta=180-alpha-gamma;
| 22: |
| 23: | setAngle(1, beta);
| 24: | }
| 25: |
| 26: | if(alphaValid()==false && betaValid()==true && gammaValid()==true){
| 27: |
| 28: | alpha=180-beta-gamma;
| 29: |
| 30: | setAngle(0, alpha);
| 31: | }
| 32: |
| 33: | // Berechnung der zwei fehlenden Seiten
| 34: |
| 35: | double a=getSide(0);
| 36: | double b=getSide(1);
| 37: | double c=getSide(2);
| 38: |
| 39: |
| 40: | if(aValid()==true && bValid()==false && cValid()==false){
| 41: |
| 42: | b=a*Math.sin(betaR())/Math.sin(alphaR());
| 43: |
| 44: | setB(b);
| 45: |
| 46: | c=a*Math.sin(gammaR())/Math.sin(alphaR());
| 47: |
| 48: | setC(c);
| 49: |
| 50: | return bValid();
| 51: | }
| 52: |
| 53: |
| 54: | if(bValid()==true && aValid()==false & cValid()==false){
| 55: |
| 56: | c=b*Math.sin(gammaR())/Math.sin(alphaR());
| 57: |
| 58: | setC(c);
| 59: |
| 60: | a=b*Math.sin(alphaR())/Math.sin(betaR());
| 61: |
| 62: | setA(a);
| 63: |
| 64: | return aValid();
| 65: | }
| 66: |
| 67: |
| 68: | if(aValid()==false && bValid()==false && cValid()==true){
| 69: |
| 70: | a=c*Math.sin(alphaR())/Math.sin(gammaR());
| 71: |
| 72: | setA(a);
| 73: |
| 74: | b=c*Math.sin(betaR())/Math.sin(gammaR());
| 75: |
| 76: | setB(b);
| 77: |
| 78: | return cValid();
| 79: |
| 80: | }
| 81: |
| 82: |
| 83: |
| 84: | return false;
| 85: | }
| 86: | |
|
|
|
|
|
Hallo dennis2,
> Okay!
>
> 1: |
| 2: | > private boolean calculateTriangleKnowing2AnglesAnd1Side()
| 3: | > {
| 4: | >
| 5: | > // Berechnung des fehlenden Winkels
| 6: | >
| 7: | > double alpha=getAngle(0);
| 8: | > double beta=getAngle(1);
| 9: | > double gamma=getAngle(2);
| 10: | >
| 11: | >
| 12: | >
| 13: | > if(alphaValid()==true && betaValid()==true &&
| 14: | > gammaValid()==false){
| 15: | >
| 16: | > gamma=180-alpha-beta;
| 17: | >
| 18: | > setAngle(2, gamma);
| 19: | > }
| 20: | >
| 21: | > if(alphaValid()==true && betaValid()==false &&
| 22: | > gammaValid()==true){
| 23: | >
| 24: | > beta=180-alpha-gamma;
| 25: | >
| 26: | > setAngle(1, beta);
| 27: | > }
| 28: | >
| 29: | > if(alphaValid()==false && betaValid()==true &&
| 30: | > gammaValid()==true){
| 31: | >
| 32: | > alpha=180-beta-gamma;
| 33: | >
| 34: | > setAngle(0, alpha);
| 35: | > }
| 36: | >
| 37: | > // Berechnung der zwei fehlenden Seiten
| 38: | >
| 39: | > double a=getSide(0);
| 40: | > double b=getSide(1);
| 41: | > double c=getSide(2);
| 42: | >
| 43: | >
| 44: | > if(aValid()==true && bValid()==false && cValid()==false){
| 45: | >
| 46: | > b=a*Math.sin(betaR())/Math.sin(alphaR());
| 47: | >
| 48: | > setB(b);
| 49: | >
| 50: | > c=a*Math.sin(gammaR())/Math.sin(alphaR());
| 51: | >
| 52: | > setC(c);
| 53: | >
| 54: | > return bValid();
| 55: | > }
| 56: | >
| 57: | >
| 58: | > if(bValid()==true && aValid()==false & cValid()==false){
| 59: | >
| 60: | > c=b*Math.sin(gammaR())/Math.sin(alphaR());
| 61: | >
| 62: | > setC(c);
| 63: | >
| 64: | > a=b*Math.sin(alphaR())/Math.sin(betaR());
| 65: | >
| 66: | > setA(a);
| 67: | >
| 68: | > return aValid();
| 69: | > }
| 70: | >
| 71: | >
| 72: | > if(aValid()==false && bValid()==false &&
| 73: | > cValid()==true){
| 74: | >
| 75: | > a=c*Math.sin(alphaR())/Math.sin(gammaR());
| 76: | >
| 77: | > setA(a);
| 78: | >
| 79: | > b=c*Math.sin(betaR())/Math.sin(gammaR());
| 80: | >
| 81: | > setB(b);
| 82: | >
| 83: | > return cValid();
| 84: | >
| 85: | > }
| 86: | >
| 87: | >
| 88: | >
| 89: | > return false;
| 90: | > }
| 91: | > |
Bei den if-Abfragen muss Du jeweils "true" zurückgeben.
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 15:41 Fr 02.12.2011 | Autor: | dennis2 |
Du meinst bei den if-Abfragen zur Berechnung des jeweils fehlenden Winkels?
|
|
|
|
|
Hallo dennis2,
> Du meinst bei den if-Abfragen zur Berechnung des jeweils
> fehlenden Winkels?
Nein, bei den if-Abfragen zur Berechung der fehlenden Seiten.
Demnach in der Methode calculateTriangleKnowing2AnglesAnd1Side().
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 16:04 Fr 02.12.2011 | Autor: | dennis2 |
Aber da gebe ich doch schon true zurück, indem ich
bValid();
aValid();
cValid();
zurückgebe.
|
|
|
|
|
Hallo dennis2,
> Aber da gebe ich doch schon true zurück, indem ich
>
> bValid();
>
> aValid();
>
> cValid();
>
Das ist richtig, gibt aber nur im Fall, daß c die gegebene Seite ist, true zurück.
> zurückgebe.
Gruss
MathePower
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 16:12 Fr 02.12.2011 | Autor: | dennis2 |
Verstehe, dann ersetze ich
bValid();
aValid();
cValid();
also jeweils durch
return true;
?
Und dann ist's okay?
|
|
|
|
|
Hallo dennis2,
> Verstehe, dann ersetze ich
>
> bValid();
>
> aValid();
>
> cValid();
>
> also jeweils durch
>
> return true;
>
> ?
>
>
> Und dann ist's okay?
>
Ja.
Gruss
MathePower
|
|
|
|