OOP Daten addieren sich bei GUI-Eingabe

Kivas

Mitglied
Hallo Zusammen,
wir haben die Aufgabe über die GUI 5 Punktzahlen einzugeben woraus der Mittelwert berechnet wird und dann eine Note vergeben nach einem festgelegten Notenspiegel. Das wird dann in eine SQL-Datenbank übertragen.
Eingabe, Berechung und Übertragung klappen. Das Problem ist: nach dem Senden werden die JTextfields geleert, so dass man einen neuen Datensatz eingeben kann. Nach dem ausführen werden wird aber die Berechung nicht neu ausgeführt und gesendet, sondern die alte einfach mit der alten addiert und dann übertragen. Sogar wenn ich keine Eingabe tätige und ausführe werden wird einfach die erste Berechnung an die DB gesendet.
Ich hab schon versucht alles was zur Berechnung da ist auf 0 zu setzen, aber dann wird nur eine 0 gesendet beim zweiten ausführen.
Ich weiss einfach nicht wo da der Fehler in der Logik ist :confused:
Danke schon mal.

Hauptklasse:
Java:
package notengui;

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class Programm extends JPanel {
   
    static JLabel status = new JLabel("Status");
    static JTextField in_punkte1 = new JTextField();
    static JTextField in_punkte2 = new JTextField();
    static JTextField in_punkte3 = new JTextField();
    static JTextField in_punkte4 = new JTextField();
    static JTextField in_punkte5 = new JTextField();
   
    public Programm() {
       
        setLayout(new GridLayout(10, 2));
       
        String module[] = {"BWL", "Systempflege", "Netzwerktechnik", "Prozedurale Programmierung", "OOP"};
        JLabel vorname = new JLabel("Vorname:");
        JTextField in_vorname = new JTextField();
        JLabel nachname = new JLabel("Nachname:");
        JTextField in_nachname = new JTextField();
        JLabel modul = new JLabel("Modul");
        JComboBox in_modul = new JComboBox(module);
        JLabel punkte1 = new JLabel("Klausur1:");
        JLabel punkte2 = new JLabel("Klausur2:");
        JLabel punkte3 = new JLabel("Klausur3:");
        JLabel punkte4 = new JLabel("Klausur4:");
        JLabel punkte5 = new JLabel("Klausur5:");
        JButton senden = new JButton("Senden");
        JButton anzeigen = new JButton("Daten anzeigen");
       
        add(vorname);
        add(in_vorname);
        add(nachname);
        add(in_nachname);
        add(modul);
        add(in_modul);
        add(punkte1);
        add(in_punkte1);
        add(punkte2);
        add(in_punkte2);
        add(punkte3);
        add(in_punkte3);
        add(punkte4);
        add(in_punkte4);
        add(punkte5);
        add(in_punkte5);
        add(senden);
        add(anzeigen);
       
        senden.addActionListener(new ActionListener() {
           
            @Override
            public void actionPerformed(ActionEvent arg0) {
               
                Datenbank.neuVorname = in_vorname.getText();
                Datenbank.neuNachname = in_nachname.getText();
                in_punkte1.getText();
                in_punkte2.getText();
                in_punkte3.getText();
                in_punkte4.getText();
                in_punkte5.getText();
                Berechnung.prozent();
                Datenbank.neupunkte = Berechnung.punkte;
                Berechnung.note();
                Datenbank.neunote = Berechnung.note;
                Datenbank.neumodul = in_modul.getSelectedItem().toString();
                Datenbank.neudurchschnitt = Berechnung.durchschnitt;
               
                try {
                    Datenbank.erstelleDatensatz();
                    if(Datenbank.erfolg = true) {
                        add(status);
                        status.setText("Erfolgreich");
                        status.setBackground(Color.green);
                       
                    }else {
                        add(status);
                        status = new JLabel("Fehler bei der Übertragung");
                        status.setBackground(Color.red);
                    }
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                       
                   
                }
               
                in_vorname.setText(null);
                in_nachname.setText(null);
                in_punkte1.setText(null);
                in_punkte2.setText(null);
                in_punkte3.setText(null);
                in_punkte4.setText(null);
                in_punkte5.setText(null);
                Berechnung.zwischen = null;
               
            }
        });
       
        anzeigen.addActionListener(new ActionListener() {
           
       
            public void actionPerformed(ActionEvent arg0) {
                try {
                    Tabelle.main(null);
                   
                } catch(Exception e) {
                    e.printStackTrace();
                }
               
            }
        });
    }
   
   
   
   
   
    public static void main(String[] args) {
       
       
        JFrame grundgeruest = new JFrame("Eingabe Daten");
        grundgeruest.add(new Programm());
       
       
//        grundgeruest.setSize(300, 150);
        grundgeruest.pack();
        grundgeruest.setVisible(true);
        grundgeruest.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

}

Klasse Berechnung
Java:
package notengui;

import java.text.NumberFormat;



public class Berechnung {
   
    static int zwischen[] = {Integer.parseInt(Programm.in_punkte1.getText()), Integer.parseInt(Programm.in_punkte2.getText()), Integer.parseInt(Programm.in_punkte3.getText()), Integer.parseInt(Programm.in_punkte4.getText()), Integer.parseInt(Programm.in_punkte5.getText()) };
    static int punkte;
    static double prozent;
    static int durchschnitt;
    static String note;
   
   
    static public double prozent() {
       
        for (int i=0;i < 5;i++) {   
           
            punkte += zwischen[i] ;
           
        }
       
        durchschnitt = punkte / 5;
        NumberFormat n = NumberFormat.getInstance();
        n.setMaximumFractionDigits(2);
       
        double max = 100.00;
       
        prozent = (double)durchschnitt / max;
       
        n.format(prozent);
       
           
        return prozent;
    }
   
   
    static public String note() {
       
        if(prozent >= 0.95) {
            note = "1,0";
        }
        if(prozent <= 0.94 && prozent >= 0.89) {
            note = "1,3";
        }
        if(prozent <= 0.88 && prozent >= 0.85) {
            note = "1,7";
        }
        if(prozent <= 0.84 && prozent >= 0.81) {
            note = "2,0";
        }
        if(prozent <= 0.80 && prozent >= 0.77) {
            note = "2,3";
        }
        if(prozent <= 0.76 && prozent >= 0.73) {
            note = "2,7";
        }
        if(prozent <= 0.72 && prozent >= 0.69) {
            note = "3,0";
        }
        if(prozent <= 0.68 && prozent >= 0.65) {
            note = "3,3";
        }
        if(prozent <= 0.64 && prozent >= 0.60) {
            note = "3,7";
        }
        if(prozent <= 0.59 && prozent >= 0.55) {
            note = "4,0";
        }
        if(prozent <= 0.54 && prozent >= 0.50) {
            note = "4,3";
        }
        if(prozent <= 0.49) {
            note = "nicht bestanden";
        }
       
       
        return note;
    }
   
   
   
   

}

Verbindung zur Datenbank
Java:
package notengui;

import java.sql.*;
import java.util.Scanner;
import javax.swing.*;

public class Datenbank extends Programm{
   
    static Statement befehl = null;
    static ResultSet ausgabe = null;
    static String neuVorname;
    static String neuNachname;
    static String neumodul;
    static double neupunkte;
    static double neudurchschnitt;
    static String neunote;
    static boolean erfolg;

       
    public static Connection erstelleVerbindung() throws Exception {
       
        try {
            String treiber = "com.mysql.cj.jdbc.Driver";
           
            Class.forName(treiber);
           
            Connection verbindung = DriverManager.getConnection("jdbc:mysql://localhost:3306/notengui?useSSL=false&serverTimezone=UTC" , "root" , "");
           
            System.out.println("Verbindung zur Datenbank comcave erstellt.");
           
            return verbindung;
           
        }catch(Exception abbruch){
           
            abbruch.printStackTrace();
           
        }//ENDE catch
       
        return null;
       
    }//ENDE erstelleVerbindung()
   
   
   
   
    public static void erstelleDatensatz() throws Exception{
       
               
       
        try {
           
            Connection verbindung = erstelleVerbindung();
           
            befehl = verbindung.createStatement();
           
            String sql_insert = "INSERT INTO `noten`(`vorname` , `nachname` , `modul`, `punkte`, `durchschnitt`, `note`) VALUEs ('" + neuNachname + "', '" + neuVorname + "' , '" + neumodul + "' , '"+ neupunkte  + "' , '" + neudurchschnitt + "' , '" + neunote + "')";
                   
            befehl.executeUpdate(sql_insert);
           
            erfolg = true;
           
            verbindung.close();
           
           
        }catch(Exception ausnahmeinfo){
            erfolg = false;
            ausnahmeinfo.printStackTrace();
        }//ENDE catch
       
    }//ENDE erstelleDatensatz
       
       
   
    public static void zeigeDatensatz() throws Exception {
       
        try {
        Connection verbindung = erstelleVerbindung();
       
        befehl = verbindung.createStatement();
       
        ausgabe = befehl.executeQuery("SELECT * FROM teilnehmer");
       
               
        while(ausgabe.next()) {
           
           
            System.out.println("\n" + ausgabe.getInt("id") + " " + ausgabe.getString("vorname") + " " + ausgabe.getString("nachname")
                    + " " + ausgabe.getString("modul") + " " + ausgabe.getDouble("punkte") + " " + ausgabe.getDouble("durchschnitt") + " " + ausgabe.getDouble("note"));
           
       
           
        }//ENDE while
       
        System.out.println("\n" + "\n" + "Datenbankabfrage erfolgreich abgeschlossen");
       
        verbindung.close();
       
    }catch(Exception ausnahmeinfo){
        System.out.println("Ausnahmefall eingetreten: " );
        ausnahmeinfo.printStackTrace();
    }//ENDE catch
       
    }//ENDE zeigeDatensatz()
   
   

}//ENDE class
 

Kivas

Mitglied
Dann kannst Du doch bestimmt erklären, wofür diese Zeilen da sind:
Java:
                in_punkte1.getText();
                in_punkte2.getText();
                in_punkte3.getText();
                in_punkte4.getText();
                in_punkte5.getText();

Den Text aus den JTexfield rausholen. Ja ich weis, es ist doppelt gemoppelt (weil ja in der Berechnung schon). Macht aber keinen Unterschied, auch wenn ich das rausmache ist das ergebnis das gleiche. Hab auch schon das Array entfernt und in der Hauptklasse variablen erstellt (zahl1, zahl2... usw), darin die JTextfield eingelesen und diese Variablen an das Array in Berechung übergeben.
Daher auch noch der Codeschnippsel, hab echt alles möglich durchprobiert.
 

Hutzli

Aktives Mitglied
Hallo

Vermutlich verstehst du die Bedeutung von "static" nicht ganz.
Das Problem, welches du schilderst, ist darauf zurückzuführen.
Siehe dir die Klasse "Berechnung" an:
Java:
static int zwischen[] = {Integer.parseInt(Programm.in_punkte1.getText()), Integer.parseInt(Programm.in_punkte2.getText()), Integer.parseInt(Programm.in_punkte3.getText()), Integer.parseInt(Programm.in_punkte4.getText()), Integer.parseInt(Programm.in_punkte5.getText()) };
Diese Zuweisung wird zu Beginn der Applikation einmal auf Klassenebene getätigt.
Ich würde das ein wenig umschreiben, wenn du unbeding "static" verwenden willst (Merke dir, so wenig static wie möglich):
Code:
public class Calculation {

    public static double calculatePercentage(int... values) {
        double points = Arrays.stream(values).mapToDouble(Double::valueOf).sum();
        return points / values.length;
    }

     public static String note(double percentage) {
       if(prozent >= 0.95) {
            note = "1,0";
        }
        if(prozent <= 0.94 && prozent >= 0.89) {
            note = "1,3";
        }
        if(prozent <= 0.88 && prozent >= 0.85) {
            note = "1,7";
        }
        if(prozent <= 0.84 && prozent >= 0.81) {
            note = "2,0";
        }
        if(prozent <= 0.80 && prozent >= 0.77) {
            note = "2,3";
        }
        if(prozent <= 0.76 && prozent >= 0.73) {
            note = "2,7";
        }
        if(prozent <= 0.72 && prozent >= 0.69) {
            note = "3,0";
        }
        if(prozent <= 0.68 && prozent >= 0.65) {
            note = "3,3";
        }
        if(prozent <= 0.64 && prozent >= 0.60) {
            note = "3,7";
        }
        if(prozent <= 0.59 && prozent >= 0.55) {
            note = "4,0";
        }
        if(prozent <= 0.54 && prozent >= 0.50) {
            note = "4,3";
        }
        if(prozent <= 0.49) {
            note = "nicht bestanden";
        }
        return note;
     }
}

Der Aufruf sieht dann folgendermassen aus:
Java:
senden.addActionListener(new ActionListener() {
         
            @Override
            public void actionPerformed(ActionEvent arg0) {
             
                Datenbank.neuVorname = in_vorname.getText();
                Datenbank.neuNachname = in_nachname.getText();
              try {
                  int points1 = Integer.parseInt(in_punkte1.getText());
                 int points2 = Integer.parseInt(in_punkte2.getText());
                int points3 = Integer.parseInt(in_punkte3.getText());
               int points4 = Integer.parseInt(in_punkte4.getText());
                int points5 = Integer.parseInt(in_punkte5.getText());
                double prozent = Calculation.calculatePercentage(points1, points2, points3, points4, points5);
                String note = Calculation.note(prozent);
              } catch(NumberFormatException exc) {
                   // Meldung ? Logging ?
               }
             
                // usw.
        }
}

Der obige Code von mir ist ebenfalls alles andere als schön, aber ich muss langsam weiterarbeiten, haben noch viel zu fixen ;)
Hoffe aber, dass ich dir einigermassen helfen konnte.
 
Zuletzt bearbeitet:

Kivas

Mitglied
Hab es mal so geändert:

Code:
package notengui;

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Arrays;

import javax.swing.*;

public class Programm extends JPanel {
   
    static JLabel status = new JLabel("Status");
   
    static int zahl1, zahl2, zahl3, zahl4, zahl5;
   
    public Programm() {
       
        setLayout(new GridLayout(10, 2));
       
        String module[] = {"BWL", "Systempflege", "Netzwerktechnik", "Prozedurale Programmierung", "OOP"};
        JLabel vorname = new JLabel("Vorname:");
        JTextField in_vorname = new JTextField();
        JLabel nachname = new JLabel("Nachname:");
        JTextField in_nachname = new JTextField();
        JLabel modul = new JLabel("Modul");
        JComboBox in_modul = new JComboBox(module);
        JLabel punkte1 = new JLabel("Klausur1:");
        JLabel punkte2 = new JLabel("Klausur2:");
        JLabel punkte3 = new JLabel("Klausur3:");
        JLabel punkte4 = new JLabel("Klausur4:");
        JLabel punkte5 = new JLabel("Klausur5:");
        JTextField in_punkte1 = new JTextField();
        JTextField in_punkte2 = new JTextField();
        JTextField in_punkte3 = new JTextField();
        JTextField in_punkte4 = new JTextField();
        JTextField in_punkte5 = new JTextField();
        JButton senden = new JButton("Senden");
        JButton anzeigen = new JButton("Daten anzeigen");
       
        add(vorname);
        add(in_vorname);
        add(nachname);
        add(in_nachname);
        add(modul);
        add(in_modul);
        add(punkte1);
        add(in_punkte1);
        add(punkte2);
        add(in_punkte2);
        add(punkte3);
        add(in_punkte3);
        add(punkte4);
        add(in_punkte4);
        add(punkte5);
        add(in_punkte5);
        add(senden);
        add(anzeigen);
       
        senden.addActionListener(new ActionListener() {
           
            @Override
            public void actionPerformed(ActionEvent arg0) {
               
                Datenbank.neuVorname = in_vorname.getText();
                Datenbank.neuNachname = in_nachname.getText();
                in_punkte1.getText();
                in_punkte2.getText();
                in_punkte3.getText();
                in_punkte4.getText();
                in_punkte5.getText();
                zahl1 = Integer.parseInt(in_punkte1.getText());
                zahl2 = Integer.parseInt(in_punkte2.getText());
                zahl3 = Integer.parseInt(in_punkte3.getText());
                zahl4 = Integer.parseInt(in_punkte4.getText());
                zahl5 = Integer.parseInt(in_punkte5.getText());
                Berechnung.prozent();
                Datenbank.neupunkte = Berechnung.punkte;
                Berechnung.note();
                Datenbank.neunote = Berechnung.note;
                Datenbank.neumodul = in_modul.getSelectedItem().toString();
                Datenbank.neudurchschnitt = Berechnung.durchschnitt;
               
                try {
                    Datenbank.erstelleDatensatz();
                    if(Datenbank.erfolg = true) {
                        add(status);
                        status.setText("Erfolgreich");
                        status.setBackground(Color.green);
                       
                    }else {
                        add(status);
                        status = new JLabel("Fehler bei der Übertragung");
                        status.setBackground(Color.red);
                    }
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                       
                   
                }
               
                in_vorname.setText(null);
                in_nachname.setText(null);
                in_punkte1.setText(null);
                in_punkte2.setText(null);
                in_punkte3.setText(null);
                in_punkte4.setText(null);
                in_punkte5.setText(null);
                Datenbank.neudurchschnitt = 0.0;
                Datenbank.neupunkte = 0.0;
                Datenbank.neunote = null;
            }
        });
       
        anzeigen.addActionListener(new ActionListener() {
           
       
            public void actionPerformed(ActionEvent arg0) {
                try {
                    Tabelle.main(null);
                   
                } catch(Exception e) {
                    e.printStackTrace();
                }
               
            }
        });
    }
   
   
   
   
   
    public static void main(String[] args) {
       
       
        JFrame grundgeruest = new JFrame("Eingabe Daten");
        grundgeruest.add(new Programm());
       
       
       
//        grundgeruest.setSize(300, 150);
        grundgeruest.pack();
        grundgeruest.setVisible(true);
        grundgeruest.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

}

Java:
package notengui;

import java.text.NumberFormat;
import java.util.Arrays;



public class Berechnung extends Programm{
   
    static int punkte = Programm.zahl1 + Programm.zahl2 + Programm.zahl3 + Programm.zahl4 + Programm.zahl5;
    static double prozent;
    static int durchschnitt;
    static String note;
   
   
    static public double prozent() {
       
       
       
               
        durchschnitt = punkte / 5;
        NumberFormat n = NumberFormat.getInstance();
        n.setMaximumFractionDigits(2);
       
        double max = 100.00;
       
        prozent = (double)durchschnitt / max;
       
        n.format(prozent);
                           
        return prozent;
    }
   
   
    static public String note() {
       
        if(prozent >= 0.95) {
            note = "1,0";
        }
        if(prozent <= 0.94 && prozent >= 0.89) {
            note = "1,3";
        }
        if(prozent <= 0.88 && prozent >= 0.85) {
            note = "1,7";
        }
        if(prozent <= 0.84 && prozent >= 0.81) {
            note = "2,0";
        }
        if(prozent <= 0.80 && prozent >= 0.77) {
            note = "2,3";
        }
        if(prozent <= 0.76 && prozent >= 0.73) {
            note = "2,7";
        }
        if(prozent <= 0.72 && prozent >= 0.69) {
            note = "3,0";
        }
        if(prozent <= 0.68 && prozent >= 0.65) {
            note = "3,3";
        }
        if(prozent <= 0.64 && prozent >= 0.60) {
            note = "3,7";
        }
        if(prozent <= 0.59 && prozent >= 0.55) {
            note = "4,0";
        }
        if(prozent <= 0.54 && prozent >= 0.50) {
            note = "4,3";
        }
        if(prozent <= 0.49) {
            note = "nicht bestanden";
        }
       
       
        return note;
    }
   
   
   
   

}

Ergebnis ist: Trotzdem wird der erste eingegebene Wert an die DB gesendet, egal was man als 2tes und 3tes eingibt. Und wenn ich das static raushaue kann ich aus der jeweils anderen klasse nicht mehr direkt auf die Variablen zugreifen, dann meckert Eclipse es soll static sein.
 

Kivas

Mitglied
Hallo

Vermutlich verstehst du die Bedeutung von "static" nicht ganz.
Das Problem, welches du schilderst, ist darauf zurückzuführen.
Siehe dir die Klasse "Berechnung" an:
Java:
static int zwischen[] = {Integer.parseInt(Programm.in_punkte1.getText()), Integer.parseInt(Programm.in_punkte2.getText()), Integer.parseInt(Programm.in_punkte3.getText()), Integer.parseInt(Programm.in_punkte4.getText()), Integer.parseInt(Programm.in_punkte5.getText()) };
Diese Zuweisung wird zu Beginn der Applikation einmal auf Klassenebene getätigt.
Ich würde das ein wenig umschreiben, wenn du unbeding "static" verwenden willst (Merke dir, so wenig static wie möglich):
Code:
public class Calculation {

    public static double calculatePercentage(int... values) {
        double points = Arrays.stream(values).mapToDouble(Double::valueOf).sum();
        return points / values.length;
    }

     public static String note(double percentage) {
       if(prozent >= 0.95) {
            note = "1,0";
        }
        if(prozent <= 0.94 && prozent >= 0.89) {
            note = "1,3";
        }
        if(prozent <= 0.88 && prozent >= 0.85) {
            note = "1,7";
        }
        if(prozent <= 0.84 && prozent >= 0.81) {
            note = "2,0";
        }
        if(prozent <= 0.80 && prozent >= 0.77) {
            note = "2,3";
        }
        if(prozent <= 0.76 && prozent >= 0.73) {
            note = "2,7";
        }
        if(prozent <= 0.72 && prozent >= 0.69) {
            note = "3,0";
        }
        if(prozent <= 0.68 && prozent >= 0.65) {
            note = "3,3";
        }
        if(prozent <= 0.64 && prozent >= 0.60) {
            note = "3,7";
        }
        if(prozent <= 0.59 && prozent >= 0.55) {
            note = "4,0";
        }
        if(prozent <= 0.54 && prozent >= 0.50) {
            note = "4,3";
        }
        if(prozent <= 0.49) {
            note = "nicht bestanden";
        }
        return note;
     }
}

Der Aufruf sieht dann folgendermassen aus:
Java:
senden.addActionListener(new ActionListener() {
        
            @Override
            public void actionPerformed(ActionEvent arg0) {
            
                Datenbank.neuVorname = in_vorname.getText();
                Datenbank.neuNachname = in_nachname.getText();
              try {
                  int points1 = Integer.parseInt(in_punkte1.getText());
                 int points2 = Integer.parseInt(in_punkte2.getText());
                int points3 = Integer.parseInt(in_punkte3.getText());
               int points4 = Integer.parseInt(in_punkte4.getText());
                int points5 = Integer.parseInt(in_punkte5.getText());
                double prozent = Calculation.calculatePercentage();
                String note = Calculation.note(prozent);
              } catch(NumberFormatException exc) {
                   // Meldung ? Logging ?
               }
            
                // usw.
        }
}

Der obige Code von mir ist ebenfalls alles andere als schön, aber ich muss langsam weiterarbeiten, haben noch viel zu fixen ;)
Hoffe aber, dass ich dir einigermassen helfen konnte.

Da ist bisschen Zeug drin was ich noch nicht gesehen habe, aber ich werde mich mal damit beschäftigen, vielen Dank :)
Und ja, static hat der Lehrer nicht wirklich erklärt, ich hab es vor allem gemacht, da Eclipse es von mir wollte. Try&Error...
 

mihe7

Top Contributor
Und wenn ich das static raushaue kann ich aus der jeweils anderen klasse nicht mehr direkt auf die Variablen zugreifen,
Ja, das ist Sinn und Zweck der Sache :)

Und ja, static hat der Lehrer nicht wirklich erklärt, ich hab es vor allem gemacht, da Eclipse es von mir wollte.
Gut, wenn der Lehrer es erst gar nicht einführt.

In OO geht es darum, ein Problem durch das Zusammenspiel von Objekten zu lösen. Objekte "unterhalten" sich mit anderen Objekten und tauschen dabei wieder andere Objekte untereinander aus. Die static-Geschichten haben aber nichts mit Objekten zu tun, sondern existieren zusammen mit der Klasse. Letztlich programmierst Du prozedural und täuscht darüber hinweg, indem Du Schlüsselwörter wie class verwendest.

Noch was: was passiert denn, wenn als Schnitt 0.765 rauskommt?
 

MoxxiManagarm

Top Contributor
In note() sind die ganzen if's unschön. Besser: zumindest elseif oder eine Lösung per Map, wie hier: https://stackoverflow.com/questions/1314650/using-java-map-for-range-searches
Diese Map hingegen dürfte gerne auch static sein. Das Beispiel ist doch schöner als das ganze if-Gewurschtel oder nicht?

Java:
package javaforum.org.noten;

import java.util.Arrays;
import java.util.NavigableMap;
import java.util.TreeMap;
import java.util.stream.Collectors;


public class NotenSpiegel {
    private static final NavigableMap<Double, String> NOTE_MAPPING
            = new TreeMap<>();
    static {
        NOTE_MAPPING.put(0.00, "Nicht bestanden");
    
        NOTE_MAPPING.put(0.50, "4,3");
        NOTE_MAPPING.put(0.55, "4,0");
        NOTE_MAPPING.put(0.60, "3,7");
        NOTE_MAPPING.put(0.65, "3,3");
        NOTE_MAPPING.put(0.69, "3,0");
        NOTE_MAPPING.put(0.73, "2,7");
        NOTE_MAPPING.put(0.77, "2,3");
        NOTE_MAPPING.put(0.81, "2,0");
        NOTE_MAPPING.put(0.85, "1,7");
        NOTE_MAPPING.put(0.89, "1,3");
        NOTE_MAPPING.put(0.95, "1,0");
    }
 
    public static void main(String... arg) {
        double prozentPunkte= Arrays.asList(6, 20, 20, 20, 16).stream()
                .collect(Collectors.summingInt(Integer::valueOf)) / 100.0;
    
        System.out.println("Durchschnitt: " + prozentPunkte);
    
        System.out.println("Bedeudet Note:"
                + NOTE_MAPPING.floorEntry(prozentPunkte).getValue());
    }
}

@Kivas: Ja du musst unbedingt die ganzen static Werte loswerden und du solltest das Geheimnisprinzip wahren. Per [code=java]//code[/code] kannst du übrigens auch den code Java formatiert darstellen, was das Lesen erleichtert. Auf diese Weise ist die Chance für viele Antworten größer.
 
Zuletzt bearbeitet:

MoxxiManagarm

Top Contributor
Nachtrag: In meinem Beispiel würde für die Fehlerbehandlung vermutlich noch der Key 1.1 fehlen. Denn dann hätte der Schüler/Student mehr als 100 Punkte erreicht. Durchschnitt in der Ausgabe ist ein schlechtes Wort an der Stelle, hatte mich von vorangegangen Beiträgen irritieren lassen.

Und für Kivas zur Erläuterung, warum das Mapping hier static sein darf und ggf. sollte: Dein Programm erstellt potenziell mehrere Notenspiegel für eine unbestimmte Anzahl n Schüler. Du solltest für jeden Schüler einen neuen Notenspiegel machen um etwaige Probleme zu vermeiden. Allerdings ist die Mappingtabelle an der Stelle Teil der Semantik, ändert sich im Nachhinein nicht und brauch nicht mehrmals geladen werden. Sie wird nur einmal zu Programmstart in den Speicher geladen und ist dann für alle Notenspiegel, welche du bearbeitest, verfügbar.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Mehrere Klassen mit den selben Daten Allgemeine Java-Themen 5
padde479 Collections Daten in Dreiecksform Allgemeine Java-Themen 13
V Umgang mit fehlenden Daten in einer Java-Datenanalyseanwendung Allgemeine Java-Themen 5
torresbig Url nach Webseiten-Login auslesen & Daten an Webseite senden Allgemeine Java-Themen 9
A Hartgecodete Daten auslagern Allgemeine Java-Themen 4
F Laden von bestimmten Daten aus TAR Archiv Allgemeine Java-Themen 23
S Webservices für binäre Daten? Allgemeine Java-Themen 5
OnDemand Daten in RAM zwischenspeichern oder lieber aus DB holen? Allgemeine Java-Themen 24
J Daten über serielle Schnittstelle empfangen Allgemeine Java-Themen 4
J JSON Daten von einer Webseite erhalten Allgemeine Java-Themen 2
S Entities aus XML - Daten. Allgemeine Java-Themen 1
M Schnelleres Speichern von XML-Daten über URLConnection Allgemeine Java-Themen 4
kodela Klasse mit "gezipten" Daten Allgemeine Java-Themen 6
M Daten aus MatLab Datei lesen Allgemeine Java-Themen 8
N Daten einer JCoTable in JTextArea anzeigen Allgemeine Java-Themen 7
kodela Klassen Klasse "vergisst" ihre Daten Allgemeine Java-Themen 2
C Daten für Klassifikationsverfahren gewinnen Allgemeine Java-Themen 6
J Daten von Quelltext Allgemeine Java-Themen 5
J Jasper Reports - Daten vom Hoster Allgemeine Java-Themen 2
kodela Daten während Laufzeit zugriffsbereit Allgemeine Java-Themen 15
J Millisekunde zwischen 2 Daten Allgemeine Java-Themen 6
Q Selbständig ActionEvent auslösen zum Daten senden über serielle Schnittstelle Allgemeine Java-Themen 7
J Daten aus Website-Quelltext auslesen Allgemeine Java-Themen 62
R Android Daten online senden Allgemeine Java-Themen 0
P Datenbank-MiniGUI fügt keine Daten ein Allgemeine Java-Themen 4
K Gespeicherte Daten von einer LinkedList auf vier LinkedList verteilen Allgemeine Java-Themen 6
Q-bert Daten von Java Programm speichern Allgemeine Java-Themen 4
K Datei (CSV-ähnlich) in Java einlesen & mit teil der Daten Graphen erstellen Allgemeine Java-Themen 9
A Erste Schritte Daten aus einer Website auslesen Allgemeine Java-Themen 7
OnDemand Desktop-Applikation schreiben, wie daten persistent? Allgemeine Java-Themen 9
S Erste Schritte Fehlender Gedanken-Ansatz bei Interpretation von Daten Allgemeine Java-Themen 1
J Auslesen Daten Java/HTML Allgemeine Java-Themen 15
K Große Mengen an Daten speichern Allgemeine Java-Themen 9
D Daten in MySQL-Datenbank schreiben Allgemeine Java-Themen 13
A Swing FileWriter schreibt keine Daten in Datei Allgemeine Java-Themen 13
M Daten aus anderen Programmen auslesen Allgemeine Java-Themen 2
D Best Practice Login-Daten: Wie am besten abrufen? Allgemeine Java-Themen 6
L Best Practice Log Dateien analysieren und eventuell passende Daten am Chart darstellen Allgemeine Java-Themen 1
J Serial Port Daten empfangen Allgemeine Java-Themen 5
H Daten via COM Schnittstelle erhalten Allgemeine Java-Themen 2
J Daten persistent speichern Allgemeine Java-Themen 14
S Allgemeine parallelisierte Loesung um Daten im Hintergrund zu laden..? Allgemeine Java-Themen 6
L Daten ohne Datenbank richtig abspeichern Allgemeine Java-Themen 5
G Daten aus Website auslesen Allgemeine Java-Themen 7
J Daten aus GUI auslesen und in Objekte umwandeln Allgemeine Java-Themen 6
O Serial Port Daten als Tastaturanschlag senden Allgemeine Java-Themen 0
N Zeitabstand zwischen 2 Daten(Mehrzahl von Datum) Allgemeine Java-Themen 3
T Input/Output Daten in eine Datei schreiben Allgemeine Java-Themen 4
Z daten bindung Allgemeine Java-Themen 1
A Datentypen Gregorian Calendar - 2 Daten sind gleich?? Allgemeine Java-Themen 3
L Vergleich-Xml-Daten Allgemeine Java-Themen 3
vandread Daten verschlüsseln mit Java oder Datenbank Allgemeine Java-Themen 15
A Daten in Formularen/Vorlagen erstellen und ausdrucken Allgemeine Java-Themen 3
C HtmlUnit Daten einer Tabelle bekommen ohne, dass diese eine ID aufweist Allgemeine Java-Themen 1
T Daten über port abfangen mit proxy server Allgemeine Java-Themen 12
Todesbote Excel Blattschutz aufheben und Daten einfügen Allgemeine Java-Themen 3
T Mit Apache Poi Daten aus einer Excel Tabelle kopieren und in Word einfügen Allgemeine Java-Themen 1
OnDemand PC identifizieren / Daten auslesen Allgemeine Java-Themen 15
G Combobox füllen mit daten aus einer Tabelle Allgemeine Java-Themen 4
J Maven .war enthält veraltete Daten Allgemeine Java-Themen 3
N Daten aus Jar laden Allgemeine Java-Themen 10
P Datentypen String-Daten zu Byte-Zahlen konvertieren - Komme nicht weiter nach vielem versuchen :-/ Allgemeine Java-Themen 7
K Input/Output Daten speichern / laden Allgemeine Java-Themen 2
M Best Practice: Daten aufnehmen-speichern-bereitstellen Allgemeine Java-Themen 8
T Daten effizient verwalten Allgemeine Java-Themen 4
B JTable eigene Daten Add Methode Allgemeine Java-Themen 2
S OOP Apache Commons Math - Verwendung von Genetics - Wie werden Daten in Chromosomen gespeichert? Allgemeine Java-Themen 4
C Daten über URL an PHP verschicken Allgemeine Java-Themen 4
R Daten aus DB auslesen in ein formular (JSP) Allgemeine Java-Themen 13
S Library fuer Internet-Text-Daten-Quellen..? Allgemeine Java-Themen 8
H OOP Daten über TCP Allgemeine Java-Themen 5
H Input/Output Binäre Daten konvertieren, Output hat Zeilenumbrüche?? Allgemeine Java-Themen 9
D Daten eines User auslesen. Allgemeine Java-Themen 5
B Input/Output Einbinden von Daten in Java Allgemeine Java-Themen 3
L Einbinden von Daten in ausführbare Jar Allgemeine Java-Themen 6
N Methoden Einzelne Daten aus "Person" auslesen Allgemeine Java-Themen 3
R SerialPort auslesen und Daten verarbeiten Allgemeine Java-Themen 23
ARadauer Wo liegen die Daten der Preferences Klasse Allgemeine Java-Themen 3
Madlip Erste Schritte Java speichert Daten im Programm?!? Allgemeine Java-Themen 9
S JDialog Daten ins JFrame übergeben Allgemeine Java-Themen 5
F Threads synchronisierung des Zugriffes auf daten Allgemeine Java-Themen 4
O Amazon S3 Anmelden / Daten downloaden Allgemeine Java-Themen 2
A Daten aufbereiten Allgemeine Java-Themen 11
P Daten kopieren mit nio - Zugriff verweigert Allgemeine Java-Themen 8
L Speichern von Daten in JKS Allgemeine Java-Themen 5
K JFreeCharts - Dummy für fehlende Daten Allgemeine Java-Themen 6
M Daten aus doc, pdf .... auslesen Allgemeine Java-Themen 12
Z Daten von einer Klasse in eine andere übertragen Allgemeine Java-Themen 8
A Login-Daten Formular automatisch ausfüllen Allgemeine Java-Themen 10
C Daten speichern und verwalten Allgemeine Java-Themen 3
Z Daten aus einer Internetseite auslesen? Allgemeine Java-Themen 2
E BlueJ Daten in Textdatei schreiben Allgemeine Java-Themen 21
T Gleichzeitige Zugriffe auf Daten auf dem Server Allgemeine Java-Themen 11
ruutaiokwu META-INF-daten bei ungepackten library-projekten während der entwicklung mit einbeziehen...? Allgemeine Java-Themen 2
K Server Daten Visualisieren Allgemeine Java-Themen 3
F HashMap überschreibt Daten von anderen HashMap Allgemeine Java-Themen 5
A Java Projekt (Daten Eingeben, Speichern und in Listen Ausgeben) Allgemeine Java-Themen 6
L Sicherstellen das 2x die gleichen Daten unter bestimmten Keys enthalten sind. Allgemeine Java-Themen 6
A XML-Daten komprimieren Allgemeine Java-Themen 6
W Datei auslesen und die Daten weiter verarbeiten Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben