Sie sind nicht angemeldet.

  • Anmelden

1

28.11.2006, 11:20

Java-hilfe @ programmierer

Bin im ersten semester wirtschaftsinfo an einer fh. Wir lernen java.

Habe mal ein übungsblatt durchgearbeitet und bin bei einer aufgabenstellung wo ich etwas einfach nicht nachvollziehen kann (es geht um typ umwandlungen).

Es soll eine methode geschrieben werden, die einen übergebenen integer wert (sehr wichtig: Integer) überprüft oder die zahl gerade ist oder nicht.

An und für sich funktioniert mein programm.

Zitat

public static void main (String [] args)
{
double y ;
StdEingabe instream_ref = new StdEingabe () ;
boolean x ;

y = instream_ref.liesDoubleN ("Zahl eingeben: ") ;

x = istUngerade (y) ;

System.out.println (x) ;
} //endmain




public static boolean istUngerade (int zahl)
{
boolean gerade ;
double zahl2 ;

zahl2 = zahl ;

zahl2 = (zahl2/2*10) % 10 ;
if (zahl2 == 5)
gerade = false ;
else
gerade = true ;
return gerade ;
} //end istUngerade


(ja, natürlich könnte man das ganze nun weniger umständlich machen, aber das war mein erster ansatz und es hat geklapt ;) )
Das problem ist: der methode istUngerade wird ein int übergeben, ich brauche aber einen float/double wert um durch 2 teilen zu können und zu ermitteln ob hinter dem komma 0 oder 5 steht (bei 0 = zahl grade, bei 5 = zahl ungerade). Wenn ich aber bei der rechnung nicht die double variable zahl2 verwenden würde und das ganze versuchen würde mit einer expliziten typumwandlung (double) zu machen meckert mein compiler. Er sagt dass er einen int wert erwartet. O_o
Ich dachte man kann int in double problemlos umwandeln?
Konkret würde meine methode dann so aussehen dann:

Zitat

public static boolean istUngerade (int zahl)
{
boolean gerade ;

zahl = (double) (zahl/2*10) % 10 ;
if (zahl2 == 5)
gerade = false ;
else
gerade = true ;
return gerade ;
} //end istUngerade

Aber dann meckert der compiler.... wieso?

Zitat

So einmal im Monat mit den Tieren im Fluß waschen wenn es "dein Herr" befiehlt Ragna?

Icey

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »ZwerG_Michi_de« (28.11.2006, 11:21)


2

28.11.2006, 11:32

äh,

Quellcode

1
2
3
4
public static boolean istUngerade(int zahl)
{
    return zahl%2==1;
}


Wenn du unbedingt bei deinem Ansatz bleiben willst (was net zu empfehlen ist ;)):

Das Problem bei deinem Code:

Quellcode

1
2
 zahl = (double) (zahl/2*10) % 10 ;
 if (zahl2 == 5)


Zeile 1 sollte so aussehn:

Quellcode

1
zahl = (10*((int)((double)zahl)/2.0))%10;


in Zeile 2 verwendest "zahl2" (nicht definiert?), dürfte vermutlich dafür verantwortlich sein, dass Javac meckert.

PS: Verwend eclipse oder netbeans dafür, die zeigen dir deine Fehler schon während des Schreibens.

Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von »plexiq« (28.11.2006, 11:45)


4

28.11.2006, 11:52

plexiq ich liebe dich :love:

Deine lösung ist genial kurz. Aber was genau passiert da? Das mit dem modulo dings hab ich schon von kollegen gehört, dass es einfacher sein soll. Aber wieso ==1? Is für mich anscheinend noch viel zu hoch ^^
Hab von programmieren nur sehr wenig ahnung bis jetzt.

Arg, jetzt hör ma auf deinen beitrag zu editieren ^^

Was ich ein wenig seltsam finde: erst ist es ein double und wird durch 2 geteilt, schön. Dann die umwandlung in int. Nicht schön, da geht doch alles verloren? Ich teste das mal kurz...

/e:
achja, zahl2 is natürlich nicht definiert. Das is noch ein fehler den ich aus der obigen lösung mitgenommen habe. Der quelltext stimmt bei mir aber sonst.

/e2:
leider hilft es nicht wenn ich es so mache wie du vorschlägst. Der compiler sagt dann immernoch "possible loss of precision. found: double . requiered: int." Dann noch ein pfeil auf das %.

Btw. laut dozent sollen wir kein netbeans oder ähnliches verwenden :(

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »ZwerG_Michi_de« (28.11.2006, 11:58)


5

28.11.2006, 11:59

"a % b" bzw.
"a mod b"

Kannst du dir merken als "Wieviel Rest bleibt wenn man a durch b teilt"?

Das is bei geraden Zahlen logischerweise 0, und bei ungeraden eben 1 ;)


Und ja, bei der anderen Variante gehört die *10 natürlich bevor dem int-cast gemacht:

Zeile 1 sollte so aussehn:

Quellcode

1
zahl = Math.round(10.0*((double)zahl)/2.0)%10;


Aber das solltest wirklich net so abgeben ;)

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »plexiq« (28.11.2006, 12:02)


6

28.11.2006, 12:02

belassen wir es dabei ^^

-=)GWC(RaMsEs

unregistriert

7

28.11.2006, 12:42

ahm ryu, noch was.

" die einen übergebenen integer wert (sehr wichtig: Integer) überprüft "

deine funktion bekommt aber int und nicht Integer als Variable übergeben. Das ist ein Unterschied. Integer kann z.b. null werden weils ein Objekt ist, int ist immer definiert und mit 0 vorbelegt.

8

28.11.2006, 12:48

Wir können ja jetzt jedes Wort auf die Goldwaage legen^^



Aber selbstverständlich ist int ein Integer, was den sonst ?

Ein Integer ist eine ganze Zahl


int steht für einen Integer als Basistyp mit einem gewissen Wertebereich, vordefinierten Operatoren usw., und Integer für einen Integer als Wrapperklasse, von der Objekte angelegt werden können




:)

9

28.11.2006, 13:05

Korrekter Weise solltest du eigentlich eine "liesInteger" statt "liesDouble" verwenden, falls es sowas gibt in eurer Übungs-lib.

Da solltest vielleicht auch gleich mal schaun ob der Rückgabe-Typ der liesXXX-Funktionen int/double oder Integer/Double ist. (Java 5.0+ macht dir die Typumwandlungen zwischen Integer<->int / double<->Double automatisch, dh du würdest nicht unbedingt ne Fehlermeldung bekommen.)

Die Umwandlung (int->)Integer->int solltest dann jedenfalls explizit machen, wenn das Thema schon "Typumwandlungen" heisst.

Abhängig davon wie der Rückgabetyp von liesXXX is, würd das in etwa so aussehn:

Quellcode

1
2
3
4
Integer i = instream_ref.liesIntegerN ("Zahl eingeben: ") ;
//evtl null-check?
boolean isungerade = (i.intValue()%2==1);
...

10

28.11.2006, 13:12

Die obere methode ist nicht von belang. Die dient nur dazu zu testen ob es denn auch funktioniert. War in der aufgabe nicht verlangt.

11

28.11.2006, 13:17

In dem Fall solltest deine Methode dann aber jedenfalls mit Typ Integer schreiben. Geforderter Rückgabe-Typ is boolean oder Boolean?

Quellcode

1
2
3
4
5
6
7
Boolean isUngerade(Integer i)
{
if(i==null)
 return null;

return new Boolean(i.intValue()%2==1);
}


kA, das hängt dann halt von der genauen Aufgabenstellung ab. Dachte ihr müsstet das wirklich von StdIn lesen & Ergebnis auf StdOut ausgeben...

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »plexiq« (28.11.2006, 13:18)


12

28.11.2006, 13:44

Hab meine lektion gelernt und werde nächstes mal jedes winzigste detaill dazuschreiben.

"Schreiben Sie eine Methode namens istUngerade, die überprüft, ob eine übergebene int-Zahl ungerade ist oder nicht. Das Resultat liefert die Methode in Form eines booleschen Wertes zurück."
Ok? ^^

13

28.11.2006, 13:50

Na dann hat meine allererste Version eh gepasst. Nur versteh ich net wo in der Übung Typ-Umwandlungen vorkommen. Aber ok ;)

14

28.11.2006, 13:58

Mein problem war meine lösung die auch typumwandlungen braucht.

15

28.11.2006, 14:06

Merk grad dass ich einfach nur dein erstes Posting missverstanden hab. (Ich dachte das ganze Übungsblatt läuft unter dem Kapitel "Typ-Umwandlungen",...)

Ok, nun is aber alles klar :D