# Boolean??



## Tombery (25. Okt 2009)

Hi! 

wir haben ein neues arbeitsblatt und jetzt müssen wir bei der 1. aufgabe "boolean" benutzen. aber in unserem buch steht garnicht, WIE man das genau benutzt, also anwendet. 
der compiler zeigt mir den fehler bei boolean. 


```
public class RabattRechner {
public static void main (String[]args){
double preis_normal = Double.parseDouble(args[0]);
boolean onlinekauf = Boolean.parseBoolean(args[1]);
double i = preis_normal;
if(boolean onlinekauf = true){
if(i<=20.00){
i = (preis_normal*0.979);
}else if(i>20.00&&i<=50.00){
i = (preis_normal*0.957);
}else if(i>50.00&&i<=100.00){
i = (preis_normal*0.935);
}else{
i = (preis_normal*0.9125);
}
System.out.println("Preis normal: ",preis_normal);
System.out.println("Onlinekauf");
System.out.printf("Preis mit Rabatt: %g",i);
}else{
System.out.println("Preis normal: ",preis_normal);
System.out.println("kein Onlinekauf");
System.out.println("Leider keine Ermäßigung möglich");
}
}
}
```

Freue mich auf Antworten!


----------



## eRaaaa (25. Okt 2009)

hi,

also:

1.) 
if(boolean onlinekauf = true){ 

onlinekauf ist ein boolean, das hast du vorher doch schon gesagt.
es reicht also
if (onlinekauf==true) oder besser if(onlinekauf){ ....

du schreibst ja auch nicht
int zahl = 6;
if(int zahl == 6) ...

2.)
System.out.println("Preis normal: ",preis_normal);
geht so nicht :
System.out.println("Preis normal: " + preis_normal);

muss es heißen. das selbe in zeile 20.


----------



## Ark (25. Okt 2009)

Lass mich raten: Der Compiler meldet, dass onlinekauf schon einmal deklariert wurde!? Aber mal ne ganz andere Frage: Was versprichst du dir von [c]if(boolean onlinekauf = true)[/c]?

Ark


----------



## Schrubber (25. Okt 2009)

Sehe ich das falsch, oder kann sich "onlinekauf" nicht auf true / false ändern sondern bleibt beim standartwert?


----------



## Tombery (25. Okt 2009)

aso....stimmt. das boolean braucht man ja nicht nochmal hinzuschreiben. leichtigkeitsfehler.

der compiler schimpft immernoch...stimmt irgendwas mit den ausgaben nicht?
also "system.out.println"....müsste aber eigentlich für alle passen. nur bei dem %g habe ich "system.out.printf"...aber ich glaube schon dass man verschiedene system.out´s mischen darf. 

wieso eigentlich muss man bei der ausgabe immer dieses "+" vor den Variablen-wörtern schreiben? weil er des immer als "zahlen" sehen will?


```
public class RabattRechner {
public static void main (String[]args){
double preis_normal = Double.parseDouble(args[0]);
boolean onlinekauf = Boolean.parseBoolean(args[1]);
double i = preis_normal;
if(onlinekauf==true){
if(i<=20.00){
i = (preis_normal*0.979);
}else if(i>20.00&&i<=50.00){
i = (preis_normal*0.957);
}else if(i>50.00&&i<=100.00){
i = (preis_normal*0.935);
}else{
i = (preis_normal*0.9125);
}
System.out.println("Preis normal: ", + preis_normal);
System.out.println("Onlinekauf");
System.out.printf("Preis mit Rabatt: %g",i);
}else{
System.out.println("Preis normal: ", + preis_normal);
System.out.println("kein Onlinekauf");
System.out.println("Leider keine Ermäßigung möglich");
}
}
}
```


----------



## DamienX (25. Okt 2009)

Doppelpost?!

also vorweg..


```
...
if(boolean onlinekauf = true){
...
```

wäre ne neue deklaration. Somit würdeste auch nie einen anderen Wert darin stehen haben als true!
Das denke ich sollte man erwähnen!

Muss also ...


```
...
if(onlinekauf == true){
...
```

..heißen. Zu erkennen ist dass man vergleiche immer mit "==" und nicht mit "=" macht!

Und das "+" macht man deshalb weil System.out.println() alles zwischen den klammern als einen
String behandelt. Sprich "Blub " + string oder "Blub" + obj.toString().

Die C Variante die du haben willst gibts es in Java auch allerdings hab ich das gerade
nicht im Kopf. 

Mfg Alex


----------



## Tombery (25. Okt 2009)

wieso doppelpost? ???:L

ok danke ^^

aber komischerweise will das der compiler immernoch nicht annehmen. er zeigt immer wieder auf dieses System.out.println....cannot find symbol...symbol => println......hm......


----------



## eRaaaa (25. Okt 2009)

NIMM das komma weg !!!!

bzw, du hast 2 möglichkeiten


```
System.out.println("Preis normal: " + preis_normal);   // println 1 argument => kein komma
	System.out.printf("Preis normal: %f" , preis_normal); // printf , argument nach dem komma, ersetzt deinen platzhalter %f. 
//%f, kann halt auch %.3f, %g, %.3g und und und sein, entsprechend gewünschter formatierung
```


----------



## Tombery (25. Okt 2009)

habs verstanden...jetzt mal ein kniffliges rätsel:

Schaltjahre:

alle Jahre, die durch 4 teilbar sind, sind Schaltjahre, nicht jedoch, wenn sie auch durch 100 teilbar sind, diese Ausnahme gilt jedoch nicht, wenn das Jahr auch durch 400 teilbar ist. 

 

also ich verstehe soweit:

wenn jahr%4=0 ist, ist es ein Schaltjahr,
wenn jahr%4=0 && jahr%100=0 ist, ist es KEIN schaltjahr,
wenn aber jahr%4=0 && jahr%100=0 && jahr%400=0 ist, ist es wieder ein Schaltjahr

stimmt diese überlegung so weit oder bin ich verwirrt worden?


----------



## eRaaaa (25. Okt 2009)

prüf es doch nach:

Liste der Schaltjahre


----------



## Tombery (25. Okt 2009)

ich habs jetzt so:


```
public class Schaltjahr {
public static void main (String[]args){
int jahr = Integer.parseInt(args[0]);
int durch4 = jahr%4;
int durch400 = jahr%400;
int durch100 = jahr%100;
if(durch4 == 0 || durch400 == 0){
System.out.printf("%d ist Schaltjahr",jahr);
}
else if(durch100 == 0){
System.out.printf("%d ist kein Schaltjahr",jahr);
}
else{
System.out.printf("%d ist kein Schaltjahr",jahr);
}
}
}
```

der wirft mir trotzdem die falschen ergebnisse um die ohren....aber es ist ja so, dass ein schaltjahr durch 4 oder doch 400 teilbar sein muss, um ein schaltjahr zu sein. und wenn es aber durch 100 teilbar ist, ist es dann keines. der ganze rest ist auch kein schaltjahr. aber......ich glaube mein fehler liegt irgendwo in der klammersetzung...sodass er nicht alle bedingungen durchgeht.....


----------



## Ark (25. Okt 2009)

Visuell hat gesagt.:


> also ich verstehe soweit:
> 
> wenn jahr%4=0 ist, ist es ein Schaltjahr,
> wenn jahr%4=0 && jahr%100=0 ist, ist es KEIN schaltjahr,
> ...


Stell die Sache lieber auf den Kopf, das ist einfacher. Wenn die Jahreszahl durch 400 teilbar ist, dann ist sie sowieso auch schon durch 100 und durch 4 teilbar, insofern sind die ersten beiden Tests der letzten Zeile überflüssig. Gleiches gilt für den ersten Test der zweiten Zeile.

Ark


----------



## Tombery (25. Okt 2009)

jetzt verstehe ich garnix mehr....

hm.....
also mache ich es mal umgedreht....
if zahl durch 400 teilbar => schaltjahr
else if zahl durch 4 teilbar => schaltjahr
else => kein schaltjahr


----------



## Ark (25. Okt 2009)

Da fehlt noch die Überprüfung, ob die Jahreszahl durch 100 teilbar ist ...

Ark


----------



## Tombery (25. Okt 2009)

wartet mal kurz....wieso ist 2100 kein schaltjahr? es ist doch durch 4 teilbar...ups...und durch 100....also...muss ich 100 VORHER testen lassen....

jaaaaaaa!! ich habs! :toll:


```
public class Schaltjahr {
public static void main (String[]args){
int jahr = Integer.parseInt(args[0]);
int durch4 = jahr%4;
int durch400 = jahr%400;
int durch100 = jahr%100;
if(durch400 == 0){
System.out.printf("%d ist Schaltjahr",jahr);
}
else if(durch100 == 0){
System.out.printf("%d ist kein Schaltjahr",jahr);
}
else if(durch4 == 0 && durch400 == 0){
System.out.printf("%d ist Schaltjahr",jahr);
}
else if(durch4 == 0){
System.out.printf("%d ist Schaltjahr",jahr);
}
else{
System.out.printf("%d ist kein Schaltjahr",jahr);
}
}
}
```


----------



## Schandro (25. Okt 2009)

wie wärs hiermit:

```
if( jahr%4==0 && !(jahr%100==0 && jahr%400!=0)){
    System.out.println("ist eins");
}
```


----------



## Tombery (25. Okt 2009)

ähm.......das was ich gemacht habe ist eine verschachtelte if-anweisung oder??

denn jetzt bei aufgabe 3b)...soll ich dasselbe programm nochmal machen...aber anders:

"Verwenden Sie diesmal zur Implementierung des Algorithmus eine einfache if-Anweisung sowie logische und relationale Operatoren zur Formulierung der Bedingung."

doll 

ich glaube nicht, dass man das noch kürzer machen kann...mit einer einzigen einfachen if-anweisung...


----------



## eRaaaa (25. Okt 2009)

doch, siehe schandros lösung 

ansonsten gibts noch(ist klar dass du das hier wahrscheinlich nicht benutzen sollst) 


```
GregorianCalendar cal = new GregorianCalendar();
if(cal.isLeapYear(jahr)).....
```

damit kannst du ja evtl. testen ob du richtig liegst


----------



## Tombery (25. Okt 2009)

ich habe schandros lösung etwas zu spät gesehen 

wow.....alles in einer zeile.

das ! steht für "nicht" aber...was bedeutet "!="?


----------



## eRaaaa (25. Okt 2009)

==  --> wenn gleich

! --> nicht

!= --> wenn nicht gleich --> ungleich ??


----------



## Tombery (25. Okt 2009)

aber hm....fehlt da nicht die bedingung für "jahr%400 == 0 ist Schaltjahr"?

ach ne......ist dabei...aber da ist nicht dabei, dass wenn die zahl NICHT durch 400 teilbar ist...sondern NUR durch 4.......


----------



## eRaaaa (25. Okt 2009)

nein.
beispiel:

2000%100 == 0 // true
2000%400 != 0 // false 

true && false = false

!false = true 



es geht übrigens dann auch

[c]if (jahr % 4 == 0 & (jahr % 100 != 0 | jahr % 400 == 0))[/c]

was ich persönlich besser lesbar finde :bae:

/edit: zu deinem edit: waah??


----------



## Tombery (25. Okt 2009)

ach, hab mich vertan *abwink*
habe nochmal überlegt...und ja, das geht mit 2000. stimmt schon. 


```
public class SchaltjahrLogOp {
public static void main (String[]args){
int jahr = Integer.parseInt(args[0]);
if(jahr%4 == 0 && !(jahr%100 == 0 && jahr%400!=0)){
System.out.printf("%d ist Schaltjahr",jahr);
}
else{
System.out.printf("%d ist kein Schaltjahr",jahr);
}
}
}
```


----------



## Tombery (26. Okt 2009)

wieso will es nicht funktionieren, dass das programm bei einem winkel über 360° eine Fehlermeldung raushaut?? ???:L


```
public class Kreisausschnitt {
public static void main (String[]args){
//der Winkel des Kreisausschnitts wird von der Kommandozeile eingelesen
int winkel = Integer.parseInt(args[0]);
//der Radius des Kreisausschnitts wird von der Kommandozeile eingelesen
double radius = Double.parseDouble(args[1]);
//die Werte der Kommandozeile werden in die Flächeninhaltsformel für den Kreisausschnitt eingesetzt
if(winkel<=360){
double i = ((radius*radius)*Math.PI*winkel)/360;
System.out.printf("Winkel: %d Grad %n",winkel);
//Ausgabe des eingegebenen Radius mit 2 Dezimalstellen
System.out.printf("Kreisradius: %.2f cm %n",radius);
//Ausgabe des Ergebnisses der Formel mit 2 Dezimalstellen
System.out.printf("Die Fläche des Kreisausschnitts ist %.2f cm2",i);
}
else{
System.out.println("Winkel ist ungültig");
}
}
```


----------



## eRaaaa (26. Okt 2009)

tut es das nicht? bei mir kommt 

"Winkel ist ungültig"

so wie es soll ??


----------



## Tombery (26. Okt 2009)

eeeeeeeeeeeecht??? :shock:

bei mir kommt die meldung: 

"Kreisausschnitt.java:23: reached end of file while parsing
}->"


----------



## eRaaaa (26. Okt 2009)

```
public class Kreisausschnitt {
public static void main (String[]args){
//der Winkel des Kreisausschnitts wird von der Kommandozeile eingelesen
int winkel = Integer.parseInt(args[0]);
//der Radius des Kreisausschnitts wird von der Kommandozeile eingelesen
double radius = Double.parseDouble(args[1]);
//die Werte der Kommandozeile werden in die Flächeninhaltsformel für den Kreisausschnitt eingesetzt
if(winkel<=360){
double i = ((radius*radius)*Math.PI*winkel)/360;
System.out.printf("Winkel: %d Grad %n",winkel);
//Ausgabe des eingegebenen Radius mit 2 Dezimalstellen
System.out.printf("Kreisradius: %.2f cm %n",radius);
//Ausgabe des Ergebnisses der Formel mit 2 Dezimalstellen
System.out.printf("Die Fläche des Kreisausschnitts ist %.2f cm2",i);
}
else{
System.out.println("Winkel ist ungültig");
}
}
```

ganz am ende fehlt bei dir eine klammer }

a) dachte ich das hättest du nur hier falsch kopiert 
b) wenn du deinen code mal formatieren würdest, hätte man das gleich sehen können


----------



## Tombery (26. Okt 2009)

achsooooooooooooooooooo, hast recht.
ich hatte da bei dem else ne klammer vergessen (komisch...ich dachte ich hätte eine hin)! 

tss, immer diese leichtigkeitsfehler


----------

