You are not logged in.

  • Login
  • "ZwerG_Michi_de" started this thread

Posts: 2,655

Location: Schweinfurt

Occupation: GER

  • Send private message

1

Tuesday, November 28th 2006, 11:20am

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.

Quoted

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:

Quoted

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?

Quoted

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

Icey

This post has been edited 1 times, last edit by "ZwerG_Michi_de" (Nov 28th 2006, 11:21am)


plexiq

Professional

Posts: 1,512

Location: Wien

  • Send private message

2

Tuesday, November 28th 2006, 11:32am

äh,

Source code

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:

Source code

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


Zeile 1 sollte so aussehn:

Source code

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.

This post has been edited 5 times, last edit by "plexiq" (Nov 28th 2006, 11:45am)


3

Tuesday, November 28th 2006, 11:38am

:respekt:

  • "ZwerG_Michi_de" started this thread

Posts: 2,655

Location: Schweinfurt

Occupation: GER

  • Send private message

4

Tuesday, November 28th 2006, 11:52am

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 :(

This post has been edited 2 times, last edit by "ZwerG_Michi_de" (Nov 28th 2006, 11:58am)


plexiq

Professional

Posts: 1,512

Location: Wien

  • Send private message

5

Tuesday, November 28th 2006, 11:59am

"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:

Source code

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


Aber das solltest wirklich net so abgeben ;)

This post has been edited 2 times, last edit by "plexiq" (Nov 28th 2006, 12:02pm)


  • "ZwerG_Michi_de" started this thread

Posts: 2,655

Location: Schweinfurt

Occupation: GER

  • Send private message

6

Tuesday, November 28th 2006, 12:02pm

belassen wir es dabei ^^

-=)GWC(RaMsEs

Unregistered

7

Tuesday, November 28th 2006, 12:42pm

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

Tuesday, November 28th 2006, 12:48pm

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




:)

plexiq

Professional

Posts: 1,512

Location: Wien

  • Send private message

9

Tuesday, November 28th 2006, 1:05pm

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:

Source code

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

  • "ZwerG_Michi_de" started this thread

Posts: 2,655

Location: Schweinfurt

Occupation: GER

  • Send private message

10

Tuesday, November 28th 2006, 1:12pm

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

plexiq

Professional

Posts: 1,512

Location: Wien

  • Send private message

11

Tuesday, November 28th 2006, 1:17pm

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

Source code

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...

This post has been edited 1 times, last edit by "plexiq" (Nov 28th 2006, 1:18pm)


  • "ZwerG_Michi_de" started this thread

Posts: 2,655

Location: Schweinfurt

Occupation: GER

  • Send private message

12

Tuesday, November 28th 2006, 1:44pm

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? ^^

plexiq

Professional

Posts: 1,512

Location: Wien

  • Send private message

13

Tuesday, November 28th 2006, 1:50pm

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

  • "ZwerG_Michi_de" started this thread

Posts: 2,655

Location: Schweinfurt

Occupation: GER

  • Send private message

14

Tuesday, November 28th 2006, 1:58pm

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

plexiq

Professional

Posts: 1,512

Location: Wien

  • Send private message

15

Tuesday, November 28th 2006, 2:06pm

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