statistischer Javarechner

S

SvenLindner

Gast
Hallo,

ich schreibe ein Programm, bei dem eine beliebige Anzahl an Werten eingegeben wird, mit denen dann statistische Berechnungen durchgeführt werden, nämlich :

Mittelwert, maximaler Wert, minimaler Wert und die Summe.

Ich hab soweit dann die while Schleife erstellt, die immer wieder fragt, ob der Nutzer noch weitere Werte eingeben will. Die eingegeben werte hab ich in einer Array Liste gespeichert. Jetzt komm ich aber bei der ersten Rechenoperation schon nicht weiter. Ich will den Mittelwert berechnen. Bis jetzt hab ich

Java:
package eins;
import javax.swing.JOptionPane;
import java.util.*;


public class Statistikrechner {


	
	public static void main(String[] args) {

	  

		List<Double> list1 = new ArrayList<Double>();
		  
		int s = Integer.parseInt(JOptionPane.showInputDialog ("Was soll berechnet werden: Mittelwert = 1, maximalerWert = 2, minimaler Wert = 3, Summe = 4"));
		
		int reply = JOptionPane.YES_OPTION; 
		 
		double e = Double.parseDouble(JOptionPane.showInputDialog ("Wert"));
		 
		list1.add( e );
		 
		while (reply == JOptionPane.YES_OPTION )
		
		{
		
	     double f = Double.parseDouble(JOptionPane.showInputDialog ("Wert"));
	     
	     list1.add(f);
	     
		 reply = JOptionPane.showConfirmDialog(null , "Wollen Sie einen weiteren Wert eingeben?");
		 
	    }
		
		
		
         int x	= list1.size();
		
				if ( reply == JOptionPane.CANCEL_OPTION);
				{ 
							System.exit (0);}
					
	if ( reply == JOptionPane.NO_OPTION);
					
	                    { if ( s == 1 )
	                    	
	                    {  Iterator it = list1.iterator()   
	                    	
	                    	double i; 
	                    	double summe =0 ; 
	                    	
	                    	for ( i=0; i<=x; it.hasNext()   )
	                   
	                    	{ summe = it.hasNext()+summe; 	
	                    
	                    }
	                            
	                    
	                    ;
	                    }
	                         	
					 
					{ 
					}
					}
	}

}
 

Noctarius

Top Contributor
Hier mal ein Source der wenigstens kompilieren würde. Auf weitere Fehler nicht geprüft (außer den ganzen Semikolons bei den If-Abfragen entfernt):

Java:
package eins;

import javax.swing.JOptionPane;
import java.util.*;

public class Statistikrechner {

	public static void main(String[] args) {
		List<Double> list1 = new ArrayList<Double>();

		int s = Integer
				.parseInt(JOptionPane
						.showInputDialog("Was soll berechnet werden: Mittelwert = 1, maximalerWert = 2, minimaler Wert = 3, Summe = 4"));

		int reply = JOptionPane.YES_OPTION;

		double e = Double.parseDouble(JOptionPane.showInputDialog("Wert"));

		list1.add(e);

		while (reply == JOptionPane.YES_OPTION) {

			double f = Double.parseDouble(JOptionPane.showInputDialog("Wert"));

			list1.add(f);

			reply = JOptionPane.showConfirmDialog(null,
					"Wollen Sie einen weiteren Wert eingeben?");

		}

		int x = list1.size();

		if (reply == JOptionPane.CANCEL_OPTION) {
			System.exit(0);
		}

		if (reply == JOptionPane.NO_OPTION) {
			if (s == 1) {
				Iterator<Double> it = list1.iterator();

				double i;
				double summe = 0;

				for (i = 0; i <= x; it.hasNext()) {
					summe = it.next() + summe;
				}
			}
		}
	}
}
 

SvenLindner

Mitglied
Danke für die schnelle Antwort, heißt schonmal, dass ich nicht alleine bin, was Hoffnung macht.

Also, du hast jetzt nur ein bisschen aufgeräumt, oder?

Mein Hauptproblem, oder erstes großes Problem ist, dass ich den Mittelwert der eingegebenen Werte berechnen möchte. Kannst du mir, oder jemand anderes, da helfen?
 

Noctarius

Top Contributor
Ich hab mal die groben Fehler korrigiert aber mir die Logik der Berechnung jetzt nicht angeschaut.

Mittelwert:
Java:
package eins;
 
import javax.swing.JOptionPane;
import java.util.*;
 
public class Statistikrechner {
 
    public static void main(String[] args) {
        List<Double> list1 = new ArrayList<Double>();
 
        int s = Integer
                .parseInt(JOptionPane
                        .showInputDialog("Was soll berechnet werden: Mittelwert = 1, maximalerWert = 2, minimaler Wert = 3, Summe = 4"));
 
        int reply = JOptionPane.YES_OPTION;
 
        double e = Double.parseDouble(JOptionPane.showInputDialog("Wert"));
 
        list1.add(e);
 
        while (reply == JOptionPane.YES_OPTION) {
 
            double f = Double.parseDouble(JOptionPane.showInputDialog("Wert"));
 
            list1.add(f);
 
            reply = JOptionPane.showConfirmDialog(null,
                    "Wollen Sie einen weiteren Wert eingeben?");
 
        }
 
        int x = list1.size();
 
        if (reply == JOptionPane.CANCEL_OPTION) {
            System.exit(0);
        }
 
        if (reply == JOptionPane.NO_OPTION) {
            if (s == 1) {
                Iterator<Double> it = list1.iterator();
 
                double i;
                double summe = 0;
 
                while (it.hasNext()) {
                    summe += it.next();
                }

                double mittelwert = summe / list1.size();
            }
        }
    }
}
 

SvenLindner

Mitglied
ja, oder halt
Java:
    double mittelwert = summe / x;
den ich oben schon definiert hatte. Danke.

Wie man die Summe berechnet wäre dann ja auch klar!

Bleiben noch das Maximum und das Minimum.
 

Noctarius

Top Contributor
man kann es sich auch schwer machen!
wenn man sauber einrückt hilft das enorm..

Sag ja hab's schon sauber gemacht ;)


@Max / Min:

Java:
double min = Double.MAX_VALUE;
double max = Double.MIN_VALUE;
while (it.hasNext()) {
    double value = it.next();

    if (value > max) {
        max = value;
    }

    if (value < min) {
        min = value;
    }
}


Das hat aber nicht wirklich was mit Java zu tun sondern reine mathematische Überlegung ;)
 

SvenLindner

Mitglied
Sag ja hab's schon sauber gemacht ;)


@Max / Min:

Java:
double [COLOR="Red"]min [/COLOR]= Double.[COLOR="#ff0000"]MAX[/COLOR]_VALUE;
double max = Double.MIN_VALUE;
while (it.hasNext()) {
    double value = it.next();

    if (value > max) {
        max = value;
    }

    if (value < min) {
        min = value;
    }
}


Das hat aber nicht wirklich was mit Java zu tun sondern reine mathematische Überlegung ;)

Gewollt oder vertippt?! Wenn ja, bitte erklären. Ich versteh auch nicht, wieso das die logische mathematische Überlegung ist.
 

SvenLindner

Mitglied
ok, also ich schreib mal was ich "verstehe" was du geschrieben hast.
Java:
double min = Double.MAX_VALUE; //Du erstellst die double Zahl "min" die = der kleinsten als Double darstellbaren Zahl ist
double max = Double.MIN_VALUE; // Du erstellst die double Zahl "max" die = der größten als Double darstellbaren Zahl ist
while (it.hasNext()) {                    // Du erstellst eine Schleife, die solange ausgeführt wird, wie es einen weiteren Wert innerhalb der List gibt
    double value = it.next(); // Du erstellst das double value, welches den "nächsten" Wert der Liste hat ...
 
    if (value > max) { // und prüfst, ob dieser wert größer als die größte als Double darstellbare Zahl ist? was versteh ich da falsch?
        max = value;
    }
 
    if (value < min) {
        min = value;
    }
}
 

Noctarius

Top Contributor
Naja du gehst alle Werte durch und schaust immer ob der aktuelle Wert kleiner ist (dann als neues min setzen) oder größer ist (dann das neue max setzen). Das ist rein mathematisch. Suchst du nach einem Minimum schaust du welcher der kleinste Wert ist, also fängst du mit dem größten möglichen Wert an und das ist das Max von Double.
 

SvenLindner

Mitglied
Java:
package eins;
 
import javax.swing.JOptionPane;
import java.util.*;
 
public class Statistikrechner {
 
    public static void main(String[] args) {
        List<Double> list1 = new ArrayList<Double>();
 
        int s = Integer
                .parseInt(JOptionPane
                        .showInputDialog("Was soll berechnet werden: Mittelwert = 1, maximalerWert = 2, minimaler Wert = 3, Summe = 4"));
 
        int reply = JOptionPane.YES_OPTION;
 
        double e = Double.parseDouble(JOptionPane.showInputDialog("Wert"));
 
        list1.add(e);
 
        while (reply == JOptionPane.YES_OPTION) {
 
            double f = Double.parseDouble(JOptionPane.showInputDialog("Wert"));
 
            list1.add(f);
 
            reply = JOptionPane.showConfirmDialog(null,
                    "Wollen Sie einen weiteren Wert eingeben?");
 
        }
 
        int x = list1.size();
        Iterator<Double> it = list1.iterator();
        
        
        if (reply == JOptionPane.CANCEL_OPTION) {
            System.exit(0);
        }
 
        if (reply == JOptionPane.NO_OPTION) {
            if (s == 1) {
                
 
                double i;
                double summe = 0;
 
                while (it.hasNext()) {
                    summe += it.next();
                }
 
                double mittelwert = summe / list1.size();
                JOptionPane.showMessageDialog ( null, "Der Mittelwert der eingegebenen Werte beträgt:" +  mittelwert  );
                
                		}
            else;
            
            double min = Double.MAX_VALUE;
            double max = Double.MIN_VALUE;
            while (it.hasNext()) {
                double value = it.next();
             
                if (value > max) {
                    max = value;}
             
                if (value < min) {
                    min = value;}
                
                if (s == 2){  
                	 JOptionPane.showMessageDialog ( null, "Der maximale Wert der eingegebenen Werte beträgt:" +  max  );
            }
                if (s == 3){
                	 JOptionPane.showMessageDialog ( null, "Der minimale Wert der eingegebenen Werte beträgt:" + min  );
                }
                
                if (s == 4){  
                    double i;
                    double summe = 0;
     
                    while (it.hasNext()) {
                        summe += it.next();
                        JOptionPane.showMessageDialog ( null, "Die Summe der eingegebenen Werte beträgt:" +  summe  );
                    }
            }
        }
    }
}}
soweit.

Könntest du

Java:
  if (s == 1) {
                Iterator<Double> it = list1.iterator();
 
                double i;
                double summe = 0;
 
                for (i = 0; i <= x; it.hasNext()) {
                    summe = it.next() + summe;
                }
eventuell noch in Worten erklären?
 

Noctarius

Top Contributor
Oo Summe aufaddieren? Was gibt es da zu erklären?

Btw: Min / Max hast du erst hinter der Schleife und nicht bei jedem Durchlauf.
 

SvenLindner

Mitglied
ok, die Summe werd ich schon verstehen, wenn ich mir das nochmal anschaue.

Die Summenberechnung klappt auch noch nicht. Wo hab ich da was falsch gemacht? "Hab ich erst hinter der Schleife" -> meinst du damit, das hab ich sollte ich aber nicht, oder das sollte ich haben, hab ich aber nicht?
 

Noctarius

Top Contributor
Java:
            double min = Double.MAX_VALUE;
            double max = Double.MIN_VALUE;
            while (it.hasNext()) {
                double value = it.next();
             
                if (value > max) {
                    max = value;}
             
                if (value < min) {
                    min = value;}
                
                if (s == 2){  
                     JOptionPane.showMessageDialog ( null, "Der maximale Wert der eingegebenen Werte beträgt:" +  max  );
            }
                if (s == 3){
                     JOptionPane.showMessageDialog ( null, "Der minimale Wert der eingegebenen Werte beträgt:" + min  );
                }
                
                if (s == 4){  
                    double i;
                    double summe = 0;
     
                    while (it.hasNext()) {
                        summe += it.next();
                        JOptionPane.showMessageDialog ( null, "Die Summe der eingegebenen Werte beträgt:" +  summe  );
                    }
            }

So habe ich das nicht gepostet. Und du solltest dringend über deine Klammereinrückung nachdenken. So hat man null Überblick wo welcher Codeblock aufhört.
 

SvenLindner

Mitglied
Java:
 double min = Double.MAX_VALUE;
            double max = Double.MIN_VALUE;
            while (it.hasNext()) {
                double value = it.next();
             
                if (value > max) {
                    max = value;
                }
             
                if (value < min) {
                    min = value;
                }
            }// bis hierhin was du gepostet hast und dann schau ich, ob ganz am Anfang "2" eingegeben wurde, wenn dem so ist, dann geb ich den maximalen Wert aus. Min für "3"
      
                
                if (s == 2){  
                	 JOptionPane.showMessageDialog ( null, "Der maximale Wert der eingegebenen Werte beträgt:" +  max  );}
                if (s == 3){
                	 JOptionPane.showMessageDialog ( null, "Der minimale Wert der eingegebenen Werte beträgt:" + min  );}
 

SvenLindner

Mitglied
Java:
package x;
 
import javax.swing.JOptionPane;
import java.util.*;
 
public class y {
 
    public static void main(String[] args) {
        List<Double> list1 = new ArrayList<Double>();
 
        int s = Integer
                .parseInt(JOptionPane
                        .showInputDialog("Was soll berechnet werden: Mittelwert = 1, maximalerWert = 2, minimaler Wert = 3, Summe = 4"));
 
        int reply = JOptionPane.YES_OPTION;
 

 
        while (reply == JOptionPane.YES_OPTION) {
 
            double f = Double.parseDouble(JOptionPane.showInputDialog("Wert"));
 
            list1.add(f);
 
            reply = JOptionPane.showConfirmDialog(null,
                    "Wollen Sie einen weiteren Wert eingeben?");
 
        }
 
        int x = list1.size();
        Iterator<Double> it = list1.iterator();
        
        
        if (reply == JOptionPane.CANCEL_OPTION) {
            System.exit(0);
        }
 
        if (reply == JOptionPane.NO_OPTION) {
            if (s == 1) {
                
 
                double i;
                double summe = 0;
 
                while (it.hasNext()) {
                    summe += it.next();}
 
                double mittelwert = summe / list1.size();
                JOptionPane.showMessageDialog ( null, "Der Mittelwert der eingegebenen Werte beträgt:" +  mittelwert  );
                
                		}
            else;
            
            double min = Double.MAX_VALUE;
            double max = Double.MIN_VALUE;
            while (it.hasNext()) {
                double value = it.next();
             
                if (value > max) {
                    max = value; }
             
                if (value < min) {
                    min = value; }
            }
                      
                if (s == 2){  
                	 JOptionPane.showMessageDialog ( null, "Der maximale Wert der eingegebenen Werte beträgt:" +  max  );}
                if (s == 3){
                	 JOptionPane.showMessageDialog ( null, "Der minimale Wert der eingegebenen Werte beträgt:" + min  );}
                
                if (s == 4){  
                    double summe = 0;
     
                    while (it.hasNext()) {
                        summe += it.next();}
                    JOptionPane.showMessageDialog ( null, "Die Summe der eingegebenen Werte beträgt:" +  summe  );}
        }
    }
}


soweit ich das seh klappt jetzt alles bis auf die Berechnung der Summe!
 

SvenLindner

Mitglied
Frag doch nicht so, als ob ich dir darauf jetzt eine sinnvolle Antwort geben könnte :p
Ist weg und es will dennoch keine Summe machen ( sind Javaanwendungen sächlich?)
 

SvenLindner

Mitglied
Warum wird hieraus anscheinend korrekt die Summe gebildet,
Java:
 if (s == 1) {
                
 
                double summe = 0;
 
                while (it.hasNext()) {
                    summe += it.next();}

hieraus aber nicht:
Java:
 if (s == 4){  
                    double summe = 0;
                         while (it.hasNext()) {
                        summe += it.next();}
 

Noctarius

Top Contributor
Tja ein wenig sollte man seinen Code schon verstehen. Mach doch erstmal einen Teil und schau das der funktioniert.

edit:
Vielleicht weil der Iterator schon am Ende ist ;)
 

SvenLindner

Mitglied
Der ist doch noch garnicht benutzt worden vorher bei s==4
edit: oder muss ich quasi einen "neuen" machen? Aber das Programm prüft doch, ob s = 1 ist, wenn dem nicht so ist wird der Zeiger ja auch nicht benutzt, wieso ist er dann schon "abgelaufen"?
Java:
package x;
 
import javax.swing.JOptionPane;
import java.util.*;
 
public class y {
 
    public static void main(String[] args) {
        List<Double> list1 = new ArrayList<Double>();
 
        int s = Integer
                .parseInt(JOptionPane
                        .showInputDialog("Was soll berechnet werden: Mittelwert = 1, maximalerWert = 2, minimaler Wert = 3, Summe = 4"));
 
        int reply = JOptionPane.YES_OPTION;
 

 
        while (reply == JOptionPane.YES_OPTION) {
 
            double f = Double.parseDouble(JOptionPane.showInputDialog("Wert"));
 
            list1.add(f);
 
            reply = JOptionPane.showConfirmDialog(null,
                    "Wollen Sie einen weiteren Wert eingeben?");
 
        }
 
        Iterator<Double> it = list1.iterator();
        
        
        if (reply == JOptionPane.CANCEL_OPTION) {
            System.exit(0);
        }
 
        if (reply == JOptionPane.NO_OPTION) {
            if (s == 1) {
                
 
                double summe = 0;
 
                while (it.hasNext()) {
                    summe += it.next();}
 
                double mittelwert = summe / list1.size();
                JOptionPane.showMessageDialog ( null, "Der Mittelwert der eingegebenen Werte beträgt:" +  mittelwert  );
                
                		}
                   
            double min = Double.MAX_VALUE;
            double max = Double.MIN_VALUE;
            while (it.hasNext()) {
                double value = it.next();
             
                if (value > max) {
                    max = value; }
             
                if (value < min) {
                    min = value; }
            }
                      
                if (s == 2){  
                	 JOptionPane.showMessageDialog ( null, "Der maximale Wert der eingegebenen Werte beträgt:" +  max  );}
                if (s == 3){
                	 JOptionPane.showMessageDialog ( null, "Der minimale Wert der eingegebenen Werte beträgt:" + min  );}
                
                if (s == 4){  
                    double summe = 0;
                         while (it.hasNext()) {
                        summe += it.next();}
                         
                    JOptionPane.showMessageDialog ( null, "Die Summe der eingegebenen Werte beträgt:" +  summe  );}
        }
    }
}
 
Zuletzt bearbeitet:

Noctarius

Top Contributor
Doch ist er, bei der min/max Berechnung - Nochmal, setz mal deine Klammern richtig und nutze saubere Einrückung, dann siehst du das auch.
 

SvenLindner

Mitglied
Java:
   if (reply == JOptionPane.NO_OPTION) 
        { if (s == 1) {
               double summe = 0;
 
                while (it.hasNext()) {
                    summe += it.next();}
 
                double mittelwert = summe / list1.size();
                JOptionPane.showMessageDialog ( null, "Der Mittelwert der eingegebenen Werte beträgt:" +  mittelwert  );}

falls JOptionPane Nein als Antwort hat wird geschaut ob es sich bei s um 1 handelt. Wenn das nicht so ist wird alles was hinter { if (s == 1) { steht ignoriert und diese Klammer schließt sich erst wieder ganz am Ende dessen was ich gepostet hab.

Was verstehe ich nicht?
 

SvenLindner

Mitglied
Java:
 package x;
 
import javax.swing.JOptionPane;
import java.util.*;
 
public class y {
 
    public static void main(String[] args) {
        List<Double> list1 = new ArrayList<Double>();
 
        int s = Integer
                .parseInt(JOptionPane
                        .showInputDialog("Was soll berechnet werden: Mittelwert = 1, maximalerWert = 2, minimaler Wert = 3, Summe = 4"));
 
        int reply = JOptionPane.YES_OPTION;
 

 
        while (reply == JOptionPane.YES_OPTION) {
 
            double f = Double.parseDouble(JOptionPane.showInputDialog("Wert"));
 
            list1.add(f);
 
            reply = JOptionPane.showConfirmDialog(null,
                    "Wollen Sie einen weiteren Wert eingeben?");
 
        }
 
        Iterator<Double> it = list1.iterator();
        
        
        if (reply == JOptionPane.CANCEL_OPTION) {
            System.exit(0);
        }
 
        if (reply == JOptionPane.NO_OPTION) 
        { if (s == 1) {
               double summe = 0;
 
                while (it.hasNext()) {
                    summe += it.next();}
 
                double mittelwert = summe / list1.size();
                JOptionPane.showMessageDialog ( null, "Der Mittelwert der eingegebenen Werte beträgt:" +  mittelwert  );}
                   
            double min = Double.MAX_VALUE;
            double max = Double.MIN_VALUE;
            while (it.hasNext()) {
                double value = it.next();
             
                if (value > max) {
                    max = value; }
             
                if (value < min) {
                    min = value; }
            }
                      
                if (s == 2){  
                	 JOptionPane.showMessageDialog ( null, "Der maximale Wert der eingegebenen Werte beträgt:" +  max  );}
                if (s == 3){
                	 JOptionPane.showMessageDialog ( null, "Der minimale Wert der eingegebenen Werte beträgt:" + min  );}
            
                Iterator<Double> i = list1.iterator();
                
                if (s == 4){  
                    double summe = 0;
                         while (i.hasNext()) {
                        summe += i.next();}
                         
                    JOptionPane.showMessageDialog ( null, "Die Summe der eingegebenen Werte beträgt:" +  summe  );}
        }
    }
}

Also das ist nicht schön, aber so gehts. Ich geh jetzt schlafen. Gesucht ist immernoch, wie man das ganze schreiben kann ohne einen neuen Iterator vor (if s== 4) setzen zu müssen!
 

Noctarius

Top Contributor
Mach die If-Abfragen und Min/Max Berechnung an die richtigen Positionen ;)

edit: Und damit du noch ein wenig trial&error basteln kannst geh ich jetzt ins Bett :D
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Jein. Erstens finde ich, dass das eine schöne kompakte Schreibweise ist, und zweitens könnte der (subtile) Unterschied in manchen Anwendungen relevant sein: Math.min(float,float) kümmert sich auch um NaNs ...
 

SvenLindner

Mitglied
Doch, wie die Summe und das Minimum und das Maximum berechnet werden, so wie du es mir gezeigt hast, hab ich jetzt verstanden.
Konnte da gestern Abend nichtmehr wirklich drüber nachdenken. Gehirn.Overflow nachdem ich seit acht Uhr morgens irgendwas gelernt habe.
 

Neue Themen


Oben