Erste Schritte Rundungsproblem - Berechnung Notendurchschnitt

johofmann

Mitglied
Einen schönen Sonntag,

ich habe das Glück dieses Semester zum ersten Mal in meinen Leben Java zu erlernen. Bisher ist auch alles gut, nun kommt mein erstes Problem - und zwar beim Runden.

Die Aufgabenstellung ist folgende:
public static double computeGrade(int score, int excellent, int pass)

Sie soll zu einer gegebenen Punktzahl die entsprechende Klausurnote errechnen, abh¨angig von einer Mindestpunktzahl
zum Bestehen (pass) und der Punktzahl ab der die Bestnote vergeben wird (excellent).
Die Noten sollen im deutschen Stufen-System angegeben werden:
nicht bestanden: 5.0
bestanden 4.0
Bestnote 1.0
Werte dazwischen 1.3, 1.7, 2.0 ... 3.7
Die Verteilung der Punkte zu den Noten soll durch lineare Interpolation errechnet werden. Die Notenskala
ist dabei oben durch die 1.0 und unten durch die 4.0 begrenzt (Alle Punktzahlen kleiner als pass ergeben
immer eine 5.0). Mathematische Hilfsfunktionen (z.B. round, max, min aus der Klasse Math) k¨onnen
genutzt werden.
Achtung: Es handelt sich um Notenstufen (insgesamt 11), nicht um gerundete Noten-Werte!

Java:
public static double computeGrade(int score, int excellent, int pass){

if (score >= excellent) {

return 1.0;
}

else if (score < excellent && score > pass){

int mark = ((score-excellent)*(4-1))/(pass-excellent))+1
}

else (score < pass){

return 5.0;
}

if (score == pass){

return 4.0;
}}


Das ist mein Lösungansatz. Bis dahin sollte alles stimmen - Nun sollen wir mit math.round richtig runden.
Mein Problem hierbei, wie runde ich richtig, da ja nur auf x.0/x.3 oder x.7 gerundet werden soll
 
du könntest dir mit mark%1 die nachkommastellen geben lassen und dann per if prüfen.
Java:
double frac = mark%1; // Teil nach dem Komma
int m = (int)mark; // Teil vor dem Komma
if(frac<0.15) mark = m;
else if(frac<0.5) mark = m + 0.3;
else if(frac<0.85) mark = m + 0.7;
else mark = m+1;
 
Hey! Echt ein cooler Ansatz

Habe es mal getestet. Es erscheint aber folgendes Problem

Bsp: score 78 somit m= 2.13333 somit frac<0.15
Sprich mark: 2.0

Richtig wäre jedoch 2.3
 
soll denn nicht zum nächstgelegenen gerundet werden? denn 2.1333 ist nunmal näher an 2.0 als an 2.3 dran.
Wenn du immer aufrunden willst, musst du halt die konstanten werte anpassen
 
Mhh, die Logik der Zuordnung ist nicht ganz für mich ersichtlich. Ich dachte es wird einfach gerundet.

Wie fügt man den konstante Werte hinzu? Eigentlich sollte lt. Tutor die Lösung durch Runden möglich sein, aber wie du am folgenden Bsp siehst stimmt es nicht...

Java:
 @Test
    public void testComputeGrade2() {
        // test for an exam with limits 50 and 95 (max score 100)

assertEquals(2.3, MyMath.computeGrade(78, 95, 50), 0.01);

// wie beschrieben Ergebnis sind 2.1333 - die Note ist jedoch 2.3
 
die zahlen die ich geschrieben habe sind konstante werte, also einfache literale.
Und weiterhin bleibt die frage offen, ob zum nächsten wert gerundet werden soll (wie in meinem code) oder ob du wirklich immer aufrunden willst.
 
Das ist eine gute Frage.
Nehme wir nochmal das Beispiel

(Klausur mit 100Punkten;95=Excellent;50=Pass)
2.1333 Hier muss auf 2.3 gerundet werden
2.3333 Ebenfalls auf 2.3
2.4 auf 2.7
2.7333 auf 3.0

(Klausur mit 60 Punkten;57=Excellent;30=Pass)
1.777 muss auf 2.0
1.666 auf 1.7
1.333 auf 1.3
 
Ohne deinen ganzen Code gelesen zu haben, einfach mal eine kurze Beschreibung, wie ich vorgehen würde:

- Ist dIe Punktzahl größer/gleich als "excellent", so gib 1.0 zurück
- Ist die Punktzahl kleiner als "pass", so gib 5.0 zurück.
- sonst, ermittele, in die wievielte Notenstufe die Punktzahl fällt
(bestimmte in Abhängigkeit der tatsächlich erzielten Punktzahl eine ganz Zahl k im Bereich von 1 bis 9)
und gib 1,0 + k * 1./3 (gerundet auf eine Nachkommastelle) zurück.
 
Dass 75 Punkte eine 2.3 ergibt ist schon richtig. Das kann man ja von Hand auch ganz leicht mal eben abzählen.

Dennoch würde ich, wie eben gesagt, nicht direkt die richtige "Note" ausrechnen, sondern berechnen, in welche Notenstufe die Punktzahl fällt. Da kann man leicht auf eine ganze Zahl ab- bzw aufrunden (Jenachdem, wierum du es aufziehst) und dann entsprechend in die Note "umrechnen"
 

Zurück
Oben