Java Anfanger: erstes Programm funktioniert nicht - warum ?

ccputer

Grünschnabel
Ich wollte ein Programm schreiben das den Wert einer Reihe (Funktion) ausgibt:
9b39eeb481262b0ba3ceb2cc2828478b.png
für s= 1. man gibt die Variable n ein und bekommt den Wert der Reihe an der Stelle n zurück.

In Blue J habe ich das hier eingegeben:

Java:
import java.util.Scanner;
public class main
{
// instance variables - replace the example below with your own

/**
* Constructor for objects of class main
*/
public static void main(String args[])
{

// initialise instance variables
float e = 1.0f; // e ist die Ergebnis-Variable
float y = 1.0f;
float v = 0.0f; // nächster Wert der Reihe wird zum alten Wert hinzu addiert
int n; // Stelle n
Scanner in = new Scanner(System.in);
System.out.println("Enter an integer for n");
n = in.nextInt();   // (s = 1) 

for ( int i = 0; i <= n ; i++)
{ e = e + v ;
y++;
v = 1.0f / y ;
}
System.out.println("Die Funktion für s=1 und n = " + n + " ergibt " + e); } 
}
Ich zerbreche mir den Kopf warum das Programm falsche Werte ausgibt:
Übersetzung in Pseudo-Prozesscode:
1. Initialisiere die Variablen e,y,v,n
2. Lese Eingabe für n aus und belege mit eingegebenen Wert
3. solange i <= n führe dieser Reihe nach aus: a) überschreibe e mit dem Wert [e (lese aktuellen Wert e aus) +(addiere) v(aktuell)]
b) erhöhe y um 1
c) überschreibe die Variable v mit 1 / y (ausgelesenen aktuellen Wert)
d) Erhöhe i um 1
e) Prüfe wie am Anfang ob i <= n wenn nicht:
4. Führe aus: System.out.println("Die Funktion für s=1 und n = " + n + " ergibt " + e);

Was mache ich falsch und wie würde das Programm korrekt funktionieren ?
 

Anhänge

  • 9b39eeb481262b0ba3ceb2cc2828478b.png
    9b39eeb481262b0ba3ceb2cc2828478b.png
    1,3 KB · Aufrufe: 9
Zuletzt bearbeitet von einem Moderator:
Hi und herzlich Willkommen im Forum!

Wo ist denn bei dir die s-te Potenz jedes Summanden?
Es heißt ja 2^s, 3^s, 4^s, ... jeweils in den Nennern.

Probiere mal folgendes:
Java:
// int s = 1

for (int i=2; i<(n+1); i++) {
  e += (1 / (Math.pow(i, s)) );
}
Somit brauchst du gar kein y mehr, da i hier gleichzeitig a) die Durchgänge mitzählt und b) auch die Basen (2, 3, 4, ...).
 
Ja das sind andere Ausdrücke, aber ich versuche die Logik des Programms zu verstehen ich erwarte folgenden Output:
n = 1 --> e = 1
n = 2 --> e = 1.5 statt wie im Programm 1.8333334
n = 3 --> e = 1,8333333 statt wie im Programm 2.0833335
n = 4 --> e = 2,166666 statt wie im Programm 2.2833335

usw. (so sollte das Programm laufen - warum tut es so nicht ?)
 
Erstmal würde ich dir empfehlen, den Code richtig einzurücken. Ist ja sonst furchtbar zu analysieren!
Java:
float e = 1.0f; // e ist die Ergebnis-Variable
float y = 1.0f;
float v = 0.0f; // nächster Wert der Reihe wird zum alten Wert hinzu addiert

int n; // Stelle n
Scanner in = new Scanner(System.in);
System.out.println("Enter an integer for n");
n = in.nextInt();   // (s = 1) 
 
for ( int i = 0; i <= n ; i++) {
  e = e + v ;
  y++;
  v = 1.0f / y ;
}
Nun würde ich auch eine Ausgabe in die for-Schleife reinbauen:
Java:
for ( int i = 0; i <= n ; i++) {
  e = e + v ;
  y++;
  v = 1.0f / y;

  System.out.println("Iteration #" + i);
  System.out.println("e          = " + e);
  System.out.println("v          = " + v);
  System.out.println("ypsilon = " + y);
}
Nun kannst du den Programmverlauf genau nachverfolgen.

n = 1 --> e = 1
n = 2 --> e = 1.5 statt wie im Programm 1.8333334
n = 3 --> e = 1,8333333 statt wie im Programm 2.0833335
n = 4 --> e = 2,166666 statt wie im Programm 2.2833335
Ist dir schon aufgefallen, dass die fett gedruckten gleich sind?
Evtl. könnte es sich bei n_3 und n_4 auch um Rundungsfehler handeln.
 
Also passt es doch :)

Jetzt sind die Ergebnisse durch noch versetzt, aber das ist nicht wirklich ein Problem!
Das liegt m.E. am Kleiner-Gleich-Operator <=, ersetze ihn mal nur duch "<".
 
Zurück