Java Fragen

Alles Wissenswerte über Skripte, Browser, Makros, PhP, HTML...

Moderatoren: Moderatoren, Redakteure

Nudelh0lz
Beiträge: 1036
Registriert: 09.09.2004 10:39
Persönliche Nachricht:

Java Fragen

Beitrag von Nudelh0lz »

hi, ich habe folgendes problem.
undzwar will ich mit einer for-schleife folgendes erreichen:

ich will eine zahl, (z.b. 5) hoch n berechnen
int i=5, n, z;
for(n=1; n<6; n++)
{
es soll dabei also so berechnet werden:
5^1
5^2
5^3
5^4
5^5

jetzt fehlt mir eigentlich nur noch der rechenweg
z= RECHENWEG

System.out.println("Ergeb.= " +z)}

Ps.: dieser thread wird von mir evtl öfter benutzt werden, nur mit anderen problemen hehe ;)
Benutzeravatar
Renaku
Beiträge: 471
Registriert: 13.01.2009 17:53
Persönliche Nachricht:

Beitrag von Renaku »

Code: Alles auswählen


int i, n, z;

for(n=1; n<6; n++){

z= Math.pow(5, n);                                 //Math.pow(5, n) entspricht hier 5^n

System.out.println("Ergeb.= " +z)

}
nur mal ein Logischer Lösungsansatz. Keine Ahnung obs so funktioniert. (Ich sprech zwar ein paar Programiersprachen, aber JAVA gehört noch nicht dazu)


P.S.
Google Suchzeit: 0, 23 Sekunden
Suchbegriff: Java Potenzrechnung
Benutzeravatar
|Chris|
Beiträge: 2400
Registriert: 13.02.2009 17:46
Persönliche Nachricht:

Beitrag von |Chris| »

Na wer hat denn da keine Lust Hausaufgaben zu machen ;)
Nudelh0lz
Beiträge: 1036
Registriert: 09.09.2004 10:39
Persönliche Nachricht:

Beitrag von Nudelh0lz »

|Chris| hat geschrieben:Na wer hat denn da keine Lust Hausaufgaben zu machen ;)
nachdem ich da ne halbe stunde rumprobiert habe bin ich es wohl^^
aber auf Math.pow wäre ich nie gekommen, sehe diese anweisung zum 1. mal hehe



@Renaku
hab es jetzt so
x= Math.pow(5, n);

aber da kommt immer
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Type mismatch: cannot convert from double to int

at Hochzahlen.main(File1.java:10)
???


€:
hab die lösung soweit...
System.out.println(""+Math.pow(5,n));
es geht irgendwie nur im System.out.print. wieso nicht wie vorhin?
Benutzeravatar
Zappes
Beiträge: 2532
Registriert: 09.12.2008 23:15
Persönliche Nachricht:

Beitrag von Zappes »

In der Ausgabeanweisung geht es deswegen, weil Java intern die Ausgabe von Math.pow() (die vom Typ double ist) nach String umwandelt. Wenn Du mit einer Variablen arbeiten willst, muss die schlichtweg vom richtigen Typen sein:

Code: Alles auswählen

for(int n=1; n<6; n++){

double z= Math.pow(5, n);   // z ist double, nicht int                              

System.out.println("Ergeb.= " +z)
} 
Wenn Dir die Ausgabe so nicht gefällt, werf mal einen Blick in die Doku zu Math.floor().

@Renaku

Wir sind hier doch nicht in der C-Steinzeit, die Variablen musst Du nicht vorweg deklarieren. ;)
omg-its-style
Beiträge: 918
Registriert: 10.07.2004 18:20
Persönliche Nachricht:

Beitrag von omg-its-style »

der fehler tritt auf, weil Math.pow zwei double werte erwartet, du aber integer lieferst.

mehr infos dazu findest du in der java api dokumentation: http://java.sun.com/javase/6/docs/api/j ... /Math.html
Benutzeravatar
Zappes
Beiträge: 2532
Registriert: 09.12.2008 23:15
Persönliche Nachricht:

Beitrag von Zappes »

omg-its-style hat geschrieben:der fehler tritt auf, weil Math.pow zwei double werte erwartet, du aber integer lieferst.

mehr infos dazu findest du in der java api dokumentation: http://java.sun.com/javase/6/docs/api/j ... /Math.html
Nein, der Fehler liegt daran, dass er das Ergebnis einer int-Variablen zuweisen will. Der implizite Upcast von int nach double im Parameter ist kein Problem, der Downcast von double nach int ist aber verlustbehaftet und erzeugt einen Fehler.

Wenn Deine Erklärung richtig wäre, was sie nicht ist, würde die zweite Aufrufform auch nicht funktionieren.
Benutzeravatar
Levi 
Beiträge: 44988
Registriert: 18.03.2009 15:38
Persönliche Nachricht:

Beitrag von Levi  »

lalala ... darf ich mal nen unschönen, aber logischen Vorschlag machen??

Hausaufgaben sind meist nicht darauf ausgelegt, irgend welche "unbekannten" Bibliotheken zu benutzen ;)
(PS: ich kann kein Java ;))

Code: Alles auswählen

int i=5, n, z;
for(n=1; n<6; n++)
{
  int k;
  z=i;
  for(k=1; k<n; k++)
  {
     z=z*i;
  }
  System.out.println("Ergeb.= " +z)}
}
Benutzeravatar
Kaipiranha
Beiträge: 663
Registriert: 26.11.2007 15:50
Persönliche Nachricht:

Beitrag von Kaipiranha »

ähm, wenn du Math.pow benutzt, dann brauchst du keine Schleife mehr.

Ohne Math.pow würde es so aussehen:

Code: Alles auswählen

public long getXhochN(int x, int n) {
  long ergebnis = x;

  if (n == 0) return 1; // irgendwas hoch 0 ist immer 1.

  for (int i = 1; i < n; i++) {
    ergebnis = ergebnis * x;
  }

  return ergebnis;
}


public static void main(String args[]) {
  // Ausgabe mit:
  System.out.println("Ergebnis: " + getXhochN(5, 5));
}
Schleifenablauf ist also für 5^5 so:
1: 5*5
2: 25 * 5
3: 125 * 5
4: 625 * 5
ergebnis: 3125 == 5^5

@ZappesBPD:
Wenn du die Variablen innerhalb einer Schleife deklarierst, dann wird die in jedem Schleifendurchlauf neu angelegt und damit wird der Wert jedesmal überschrieben, falls du damit weiterarbeiten würdest. Gut, machst du in dem Fall nicht, aber es macht überhaupt keinen Sinn da in einer Schleife 5^n jedesmal zu berechnen, wenn das Ergebnis eh nur 5^5 ausgeben soll.
Benutzeravatar
Zappes
Beiträge: 2532
Registriert: 09.12.2008 23:15
Persönliche Nachricht:

Beitrag von Zappes »

Levishadow hat geschrieben:Hausaufgaben sind meist nicht darauf ausgelegt, irgend welche "unbekannten" Bibliotheken zu benutzen ;
Die Klasse Math kommt aus dem java.lang-Package und gehört damit zum Kernumfang der Sprache, genau wie die Klasse "String". Sowas kann und soll man sehr wohl benutzen.
Kaipiranha hat geschrieben:@ZappesBPD:
Wenn du die Variablen innerhalb einer Schleife deklarierst, dann wird die in jedem Schleifendurchlauf neu angelegt und damit wird der Wert jedesmal überschrieben, falls du damit weiterarbeiten würdest. Gut, machst du in dem Fall nicht, aber es macht überhaupt keinen Sinn da in einer Schleife 5^n jedesmal zu berechnen, wenn das Ergebnis eh nur 5^5 ausgeben soll.
Es wird nur beim ersten Durchlauf tatsächlich Speicher reserviert, der danach genau so weiterverwendet wird, als ob man die Variable vor der Schleife deklariert und dann innerhalb der Schleife nur neue Werte zugewiesen hätte. So, wie ich es da gemacht habe, wird nur dafür gesorgt, dass der Zugriffskontext auf den Schleifenkörper begrenzt wird, was hier durchaus sinnvoll ist.

Dass hier 5^n für alle n von 1 bis 5 ausgerechnet wird, liegt nur daran, dass ich das aus dem Codefragment weiter oben kopiert habe. Ich wollte ja nicht das Programm ändern, sondern nur zeigen, warum es bei der Zuweisung eines double an eine int-Variable Probleme gibt.
omg-its-style
Beiträge: 918
Registriert: 10.07.2004 18:20
Persönliche Nachricht:

Beitrag von omg-its-style »

ZappesBPD hat geschrieben:Nein, der Fehler liegt daran, dass er das Ergebnis einer int-Variablen zuweisen will. Der implizite Upcast von int nach double im Parameter ist kein Problem, der Downcast von double nach int ist aber verlustbehaftet und erzeugt einen Fehler.

Wenn Deine Erklärung richtig wäre, was sie nicht ist, würde die zweite Aufrufform auch nicht funktionieren.
oops, völlig richtig! :)
Benutzeravatar
Renaku
Beiträge: 471
Registriert: 13.01.2009 17:53
Persönliche Nachricht:

Beitrag von Renaku »

ZappesBPD hat geschrieben: @Renaku

Wir sind hier doch nicht in der C-Steinzeit, die Variablen musst Du nicht vorweg deklarieren. ;)
Oops, Gewonheit läst grüßen. :wink:

Ich dachte eigentlich, das JAVA so flexibel ist und einen DOUBLE-Wert bei der Übergabe an eine INT-Variable rundet. (Wie bei C++). Bei den Werten, die POCK verabreiten wollte, wäre diese Rundung dann ja kein Problem gewesen (weil es eh keine Kommastelle gegeben hätte).

Da sieht man, dass ich kein JAVA spreche.
Benutzeravatar
Zappes
Beiträge: 2532
Registriert: 09.12.2008 23:15
Persönliche Nachricht:

Beitrag von Zappes »

Renaku hat geschrieben:Ich dachte eigentlich, das JAVA so flexibel ist und einen DOUBLE-Wert bei der Übergabe an eine INT-Variable rundet. (Wie bei C++). Bei den Werten, die POCK verabreiten wollte, wäre diese Rundung dann ja kein Problem gewesen (weil es eh keine Kommastelle gegeben hätte).
Der Java-Compiler geht bei impliziten Casts auf Nummer sicher - bei solchen Zuweisungen muss man explizit sagen, was man will. Auf den ersten Blick mag das manchmal lästig wirken, aber mir haben diese Checks schon mehr als ein mal das Leben gerettet. :)

Wohlgemerkt geht das Runden durchaus - wahlweise mit Math.floor() oder Math.round(). Man kann auch einfach sowas wie "int foo = (int)Math.pow(x,y)" hinschreiben, aber als impliziter Cast geht es nicht. Es wundert mich ehrlich gesagt etwas, dass das in C schon geht, aber in der Sprache bin ich wiederum nicht gerade fit.
Nudelh0lz
Beiträge: 1036
Registriert: 09.09.2004 10:39
Persönliche Nachricht:

Beitrag von Nudelh0lz »

VIELEN DANK FÜR SO VIELE ANTWORTEN^^ war schon fast zu genau *hehe*