# If in System.out.println



## osion (14. Jan 2013)

Hallo :lol:

Ich habe das Problem das 
	
	
	
	





```
System.out.println("Das Auto ist " + if(zeit<zeit2){zeit2-=zeit;} else{zeit-=zeit2;} + " zu schnell gefahren.");
```
 ich das nicht machen kann.

Bitte keine Lösungen sondern eher Tipps, da ich erst seid kurzem Java lerne.




```
package auto;

public class Auto {
	public int benzienstand = 100;
	public int benzienstand2;
	public int geschwindigkeit = 100;
	public int geschwindigkeit2;
	public int zeit = 60;
	public int zeit2;
	public int geschwindigkeit_;

	public Auto(int benzienstand_, int geschwindigkeit_, int zeit_) {
		benzienstand2 = benzienstand_;
		zeit2 = zeit_;
		geschwindigkeit2 = geschwindigkeit_;
	}

	public void auswertung() 
	{
		System.out.println("Das Auto hat für 100 km " + zeit2 + " min gebraucht");
		System.out.println("Das Auto hat für 100 km " + (benzienstand-benzienstand2) + "Liter gebraucht");
		System.out.println("Das Auto ist " + if(zeit<zeit2){zeit2-=zeit;} else{zeit-=zeit2;} + " zu schnell gefahren.");

	}
}
```

Fehlermeldung



> Exception in thread "main" java.lang.Error: Unresolved compilation problems:
> Syntax error on token(s), misplaced construct(s)
> Syntax error on token "}", ( expected after this token
> The left-hand side of an assignment must be a variable
> ...



Warum kann ich keine IF-Anweisung einfügen? Geht das grundsätzlich nicht?


Danke :applaus:


----------



## faetzminator (14. Jan 2013)

Nein, das geht nicht.
Es gibt aber der ternären Operator:

```
"blablubb" + (zeit < zeit2 ? zeit2 - zeit : zeit - zeit2) + "blubb"
```


----------



## HimBromBeere (14. Jan 2013)

Naja, überleg doch mal... wenn du was zurückgeben willst, brauchst du eine Methode. if ist aber keine Funktion, sondern ein Statement. Wenn du ´nen Rückgabewert haben willst, such mal nach dem sogenannten ternären Operator...
oder teile deine Ausgabe halt auf i

```
if (...) {System.out.println(...);
else System.out.println(...);
```


----------



## Camill (14. Jan 2013)

osion hat gesagt.:


> [...]
> Geht das grundsätzlich nicht?
> [...]


Richtig erkannt.

Vielleicht hilft dir jedoch der ternäre Operator.


----------



## Spin (14. Jan 2013)

Hallo,

du kannst in Java keine If's mit einem String konkatenieren, da sie keinen Return Type haben. Sie geben nichts zurück.

Es gibt andere Sprache, da redet man von if expresision.

```
// scala , like tenärer operator
println("hallo " + {if(1 == 1) "a" else "b"})
```

grüße spin


----------



## JohannisderKaeufer (14. Jan 2013)

```
System.out.println("Das Auto ist " + if(zeit<zeit2){zeit2-=zeit;} else{zeit-=zeit2;} + " zu schnell gefahren.");
```

In diesem Falle hätte es auch ein 
	
	
	
	





```
|zeit-zeit2|
```
 getan.


```
System.out.println("Das Auto ist " + java.lang.Math.abs(zeit-zeit2) + " zu schnell gefahren.");
```


----------



## TKausL (14. Jan 2013)

Die Sache ist nur, dass du selbst wenn du 20 KM/H fährst (bei 60 KM/H Max) 40 KM/H zu schnell fährst ^^


----------



## osion (15. Jan 2013)

hallo 

Der code hat gar nicht richtig gerechnet...nicht so schlimm...habe ich jetzt korrigiert :lol: im ernst :lol:

Der Tipp mit den  ternäre Operator war sehr hilfreich danke :applaus:


Ich habe noch eine andere Frage. Es geht um die gleiche Übung, aber um die Hauptklasse.


```
package auto;

import java.util.Scanner;

public class Hauptklasse {

	public static void main(String[] args) {

		Scanner eingabe = new Scanner(System.in);

		int anzahlDim = 10;
		int anzahl = 1;

		System.out.println("Wieviele Autos sollen berechnet werden?");
		anzahlDim = eingabe.nextInt();
		anzahlDim++;

		Auto autos[] = new Auto[anzahlDim];

		for (int i = 0; i < autos.length; i++) {
			autos[i] = new Auto(
					(int) ((Math.random() * 100)),
					(int) ((Math.random() * 100)));
		}

		for (int i = 1; i < anzahlDim; i++) {
			System.out.println(anzahl + ". Auto");
			autos[i].auswertung();
			anzahl++;
		}
	}
}
```

Der Teil:


```
for (int i = 1; i < anzahlDim; i++) {
			System.out.println(anzahl + ". Auto");
			autos[i].auswertung();
			anzahl++;
```

ganz genau:


```
System.out.println(anzahl + ". Auto");
			autos[i].auswertung();
```

Kann ich System.out.....mit autos_.auswertung() verbinden? ???:L


gruss :lol:_


----------



## Master1991 (15. Jan 2013)

Hey,

ich glaube da ist mehr als nur ein Fehler drin:



```
System.out.println("Wieviele Autos sollen berechnet werden?");
		anzahlDim = eingabe.nextInt();
		anzahlDim++;
```

warum rechnest du anzahlDim++? Rein logisch betrachtet passt das nicht zu deinem Input befehl:
Ein Array mit 5 Elementen läuft von Index 0-4. beeinhaltet also trotz das es bei 0 anfängt 5 Elemente.
Bei deiner Rechnung wird dein Array immer 1 grösser als Eingegeben wurde, ist das gewollt?

Ansonsten kommt es bei 


```
for (int i = 1; i < anzahlDim; i++) {
            System.out.println(anzahl + ". Auto");
            autos[i].auswertung();
            anzahl++;
        }
```

auf den Rückgabewert der Methode Auswertung an, wenn es sich um einen String handelt kannst du ihn auch bei System.out mit unterbringen. Mir fällt hier gerade auf das du bei i=1 anfängst zu zählen. Ich nehm also mal an das mit dem Array von oben war tatsächlich gewollt.


```
for (int i = 1; i < anzahlDim; i++) {
            System.out.println(i + ". Auto" + autos[i].auswertung());
            // Ich habe "anzahl" durch i ersetzt, da du in deiner main Methode die variable anzahl  überhaupt nicht benutzt ausser in der Ausgabeschleife und der Wert identisch mit i ist;)
        }
```


EDIT// Bei der Erzeugung der Autos hingegen fängst du mit Laufindex 0 an. Du Erzeugst ein Auto im Index 0 was du nie Ausgibst da du in der Ausgabe erst bei 1 anfängt, ist dir das bewusst?


----------



## osion (16. Jan 2013)

Master1991 hat gesagt.:


> EDIT// Bei der Erzeugung der Autos hingegen fängst du mit Laufindex 0 an. Du Erzeugst ein Auto im Index 0 was du nie Ausgibst da du in der Ausgabe erst bei 1 anfängt, ist dir das bewusst?



Ja, war ein denkfehler ^^ in der letzten Aufgabe sollte ich Array 0/0 nicht ausgeben.

In der Klasse Auto (code weiter unten), habe ich das Problem dass er mir nicht die ganze Ausgabe gibt, falls die Variable Zeit2 (wie lange braucht das Auto für 100 km), grösser ist als Zeit (was wäre zulässig).

Die Ausgabe sieht dann so aus:



> 1. Auto
> Variable:Zeit47.0
> Das Auto hat für 100 km 47.0 min gebraucht.
> Das Auto hat für 100 km 55 Liter verbraucht.
> ...



Aber ist Zeit2 grösser als Zeit so geht alles ganz normal. Ich habe den Debugger gestartet und festgestellt, dass er einfach den Rest überspring



> Das Auto ist 28 km zu schnell gefahren.
> 
> Variable:Zeit84.0



Ich glaube entweder hat es mit (int) zu tun oder mit den Klammern, aber es ist nicht möglich zu sehen wie er die Klammer auflöst und ein Fehler vom Programm gibt es auch nicht.


```
package auto;

public class Auto {
	public int benzienstand = 100;
	public int benzienstand2;
	public double geschwindigkeit = 100.00;
	public double zeit = 60.00;
	public double zeit2;

	public Auto(int benzienstand_, int zeit_) {
		benzienstand2 = benzienstand_;
		zeit2 = zeit_;
	}

	public void auswertung() {
		System.out.println("Variable:Zeit"+zeit2);
		System.out.println("Das Auto hat für 100 km " + zeit2
				+ " min gebraucht.");
		System.out.println("Das Auto hat für 100 km "
				+ (benzienstand - benzienstand2) + " Liter verbraucht.");
		System.out
				.printf("Das Auto ist "
						+ ((zeit > zeit2) ? (int) ((100/( (zeit2 / 60)))-geschwindigkeit) : ((int) (geschwindigkeit-(100/((zeit2 / 60)))))
						+ " km"
						+ ((zeit < zeit2) ? " zu schnell " : " längsamer als  erlaubt ") + "gefahren.\n\n"));
		System.out.println("\nVariable:Zeit 2 "+zeit2+ "\n\n");
	}
}
```

Genauer:


```
+ (benzienstand - benzienstand2) + " Liter verbraucht.");
		System.out
				.printf("Das Auto ist "
						+ ((zeit > zeit2) ? (int) ((100/( (zeit2 / 60)))-geschwindigkeit) : ((int) (geschwindigkeit-(100/((zeit2 / 60)))))
						+ " km"
						+ ((zeit < zeit2) ? " zu schnell " : " längsamer als  erlaubt ") + "gefahren.\n\n"));
```


----------



## suckerpunch (16. Jan 2013)

Prüfe mal deine "()" Setzung dann kommst auch auf das richtige raus, würde da eh bei sovielen Klammern auf varibalen zurückgreifen


```
int schnell = (int) Math.round((100 / (zeit2/60)) - geschwindigkeit);
            int langsam =  (int) Math.round(geschwindigkeit - (100 / (zeit2 / 60)));
            System.out.printf("Das Auto ist "
                    + (zeit > zeit2 ?  schnell : langsam)
                    + " km"
                    + (zeit < zeit2 ? " zu schnell " : " längsamer als  erlaubt ") + "gefahren.\n\n");
```

EDIT: Kannst auch gleich anstatt überall double float benutzen wenn du den double adressraum nicht brauchst das würde auch das cast auf int ersparen im fall von Math.round :rtfm:


----------



## osion (16. Jan 2013)

suckerpunch hat gesagt.:


> Prüfe mal deine "()" Setzung dann kommst auch auf das richtige raus, würde da eh bei sovielen Klammern auf varibalen zurückgreifen
> 
> 
> ```
> ...



Danke...habe den Code noch angepasst


----------

