Regelstrecke mit Ausgleich

Status
Nicht offen für weitere Antworten.
D

Dusselchen

Gast
Hi, ich hoffe ihr könnt mir helfen...
Das Programm sollte mir eigendlich nicht nur bei Wert: 0,0 rausgeben sondern halt 0,000001 wie könnte ich das hinbekommen? habe nun schon ein float benutzt aber er setzt mir immer wieder ein 0,0 hin...
Schon mal danke für die hilfe =)
Code:
import java.io.*;
class untitled {

public static void main(String[] args) throws IOException
{
System.out.println("1");
double wert;
float d;
double t1, t2, T;
double e = 2.71828183;
double y0 = 200;
double x = 13.28;
double exp1, exp2;
for(int k = 1; k < 300000; k++)	
{	
System.out.println("1");
	float ktmp = k / 1000000;
	System.out.println("2");
	for(t1 = 1; t1 < 120; t1++)
		{
		System.out.println("3");
		for(t2 = 1; t2 < 7200; t2++)
			{			System.out.println("4");
			for(T = 0; T < 7200 ; T++)
				{
				System.out.println(" "+T);
				exp1 = exp(-(T/t1));
				exp2 = exp(-(T/t2));
				d = ktmp * y0 * (1+(t1/(t1-t2)))*exp1-(t2/(t1-t2))*exp2+x;
					System.out.println(" Wert: "+d);
					System.out.println(" k: "+ktmp);
					System.out.println(" t1: "+t2);
					System.out.println(" t2: "+t2);
			//	System.out.println(" "+ktmp +" "+ t1 +" "+ t2 +" "+ T +" "+ wert +" "+ d );
				if (d <= 10)
					{
					wert = d;
					System.out.println("joa wa: "+wert);
					bb(wert, ktmp, t1, t2);
					}
				}
			}
		}
	}
}
public static void bb(double aha, double args, double hmpf, double aua)throws IOException
	{
	System.out.println(" Wert: "+aha);
	System.out.println(" k: "+args);
	System.out.println(" t1: "+hmpf);
	System.out.println(" t2: "+aua);
	switch(eingabeint(" und nu? 1"))
		{
		case 1: ende();break;
		}
	}
public static String eingabe(String text)throws IOException 
	{ // zuständig für die eingaben..die in diesem prog getan werden
	BufferedReader reader;
	reader = new BufferedReader(new InputStreamReader(System.in));
	System.out.print(text);
	return reader.readLine();
	} // closed Klasse: eingabe
public static void ende()
	{	
	System.exit(0);
	}
public static int eingabeint(String text)throws IOException
	{ // umwandlung der eingabe in ein int
	int x = 0;
	BufferedReader reader;
	reader = new BufferedReader(new InputStreamReader(System.in));
	try
		{
		x = new Integer( eingabe(text) ).intValue();
		}
	catch (NumberFormatException e) 
		{
   	System.err.println("I/O Error: " +e.getMessage ());
		System.out.println("");
		System.out.println(" Sie werden ins Hauptmenue weitergeleitet.");
    	}
	return x;
	} // closed eingabeint
}
 

Marco13

Top Contributor
Hi

Beim ersten Überfliegen:

Code:
for(int k = 1; k < 300000; k++)
{
System.out.println("1");
   float ktmp = k / 1000000;

Dort kommt für ktmp immer 0 raus: Es wird ein int (k) durch einen anderen int (1000000) geteilt. Das Ergebnis ist wieder ein int! Und zwar 0.

Abhilfe:
float ktmp = k / 1000000.0f; // Einen float draus machen!

Ansonsten noch ein paar Punkte:
- du solltest dich für double oder float entscheiden. Der vermutlichen Anwendung nach könnte double nicht schaden
- die Laufvariablen in schleifen (for (T...)) sollten aber nach möglichkeit KEINE doubles sein, sondern immer ints. WAS genau dort berechnet wird, weiß ich nicht, aber ggf. mußt du dann, bevor du diese Werte in einer Rechnung verwendest, nach double casten:
Code:
      int t2;
      int T;

      for(t2 = 1; t2 < 7200; t2++)
         {         System.out.println("4");
         for(T = 0; T < 7200 ; T++)
            {
            System.out.println(" "+T);
            exp1 = Math.exp(-((double)T/t1)); // hier nach double casten!
- die Variablen sollten i.a. einen Möglichst kleinen scope haben. D.h. man sollte sie erst deklarieren, wenn man sie braucht:
Code:
//--- Nicht schön
float temp;
for (int i=0; i<10; i++) 
{
    temp = 1.0f/i;
    machWasMit(temp);
}
Code:
//--- Schön
for (int i=0; i<10; i++) 
{
    float temp = 1.0f/i;
    machWasMit(temp);
}

- Die Konstanten (7200) sollten nicht so im Code stehen. Stattdessen lieber eine Konstante in die Klasse
Code:
class untitled
{
    private static final int LIMIT = 7200;
...
      for(t2 = 1; t2 < LIMIT; t2++)
- Die Klasse sollte nicht "untitled" heissen. Klassennamen schreibt man groß. Trotzdem wäre "Untitled" auch nicht ideal :roll:

- Wenn man Kommandzeilenargumtene auswertet ist das vielleicht eine Ausnahme, aber sonst kann ich mir keinen Fall vorstellen, in dem die main-Methode mehr als 2 Zeilen haben müßte. Und das sollte sie auch nicht.

bye
 
D

Dusselchen

Gast
Danke =) ich glaube mit dem .0f hat mir sehr weit gebracht ;)
Die anderen tipps sind berechtigt *g*

Habe das prog heute innerhalb von ein paar minuten geschrieben und es war eher ein wett streit zw. jemandem aus meiner klasse und mir =) wer als erstes das beste ausgleichsverfahren schaft ... aber musten uns beide geschlagen geben xD

Ich werd mal weiter schaun, ob ich es denn jetzt hinbekomme.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben