Aufgabe Noten

Hallo,

ich muss in Java ein Programm erstellen, mit dem ich eine Tabelle mit Schulnoten und ihren Bezeichnern erstellen kann. ( Alle Methoden müssen statisch sein) Wie etwa:

1: sehr gut
2: gut
3: befriedigend
4: ausreichend
5: mangelhaft
6: ungenügend
7: ungültiger Notenwert

  1. Problem:
    Dies habe ich mit der switch-Anweisung zwar gelöst, doch kommt bei mir als Ausgabe:

sehr gut
1: gut
2: befriedigend
3: ausreichend
4: mangelhaft
5: ungenügend
6: ungültiger Notenwert
7:

Dann soll eine Methode implementiert werden, welches erlaubt eine Liste mit zufällig gewürfelten Noten zu erzeugen. Der Parameter gibt an, wie oft eine zufällige Note zwischen 1 und 6 gewürfelt und auf dem Bildschirm ausgegeben werden soll. Die Noten sollen als Notenname ausgegeben werden.

  1. Problem:
    Bei der zweiten Aufgabe stehe ich komplett auf dem Schlauch. Ich denke es wird mit Math.random() gemacht und dann mit 6 multipliziert und 1 addiert, um auf einen Wertebereich von [1; 6] zu kommen, aber ich habe keine Ahnung wie ich diese Liste erzeugen soll.

Mein bisheriger Quellcode:

	public static void notenname(int note) {
		switch(note)
		{
		case 1: System.out.println("sehr gut"); break;
		case 2: System.out.println("gut"); break;
		case 3: System.out.println("befriedigend"); break;
		case 4: System.out.println("ausreichend"); break;
		case 5: System.out.println("mangelhaft"); break;
		case 6: System.out.println("ungenügend"); break;
		default: System.out.println("ungültiger Notenwert"); break;
		}
	}
	public static void druckeTabelle() {
		System.out.println("Noten | Notennamen");
		for ( int i = 1; i<=7; i++){
			notenname(i);
			System.out.print(i + ":" + "	");
		}
	}
	public static int erzeugeNoten(int anzahl){
		return (int) (Math.random()*anzahl + 1);
	}
	public static void main(String[] args){
		Schulnoten noten = new Schulnoten();
		noten.druckeTabelle();
	}
}```

Ich bin noch Anfänger und auch neu in diesem Forum. Bitte nehmt es mir nicht übel und belehrt mich eines besseren, falls ich mit dieser Frage etwas falsch gemacht haben sollte.
Ich hoffe ihr könnt mir helfen.
Danke im Voraus

ElifOzt :)
System.out.print(i + ":" + "	"); // gibt das andere aus

die Reihenfolge hast du gesetzt, kannst ja auch umdrehen und schauen was dann wird

es ist auch kein Naturgesetz, dass die Anteile i + ":" + " " fest zusammenstehen müssen,
vielelicht zwei oder mehr Ausgaben für diese alle, manches vor, manches nach notenname()?..

eine andere Strategie kannst du auch noch überlegen:
die Methode notenname() mehr nach ihren tatsächlichen Namen agieren zu lassen
→ keine Ausgabe darin, sondern einen String zurückgeben, den der Aufrufer dann womöglich besser irgendwo in einen print-Befehl einsortieren kann

das sind die Dinge, die dazu zu bedenken sind, viel einfachere Aufgabe kann es kaum geben,
mehr als fertige Lösung könnte man kaum noch dazu posten,

willst du nicht, vielleicht nun mit neuen Tipps und Ermutigung, doch noch etwas mehr versuchen, deine Rolle als Programmierer auch wahrzunehmen und die Aufgabe zu lösen? :wink:
Versuche und Irrtümer sind nicht verboten, Joda ist hier nicht Mitglied :wink:


zur zweiten Aufgabe hast du ja auch schon richtige Ansätze,
warum nicht mit random() wie von dir angesprochen experimentieren?
deine notenname()-Methode ignorierend wäre auch schon die Ausgabe verschiedener Zufallszahlen ein guter Schritt

wenn du bei allem doch den Stand hast, dass du nicht mehr weiterkommst und nach fertigen Lösungen fragst,
dann wird die sicher bald wer posten,
ich bin gerade die nächsten Stunden nicht mehr da

Danke SlaterB,

habe jetzt beide Aufgaben hinbekommen. Mir hatte wahrscheinlich der Gedankenanstoß gefehlt. :slight_smile:

[quote=ElifOzt]Ich bin noch Anfänger und auch neu in diesem Forum. Bitte nehmt es mir nicht übel und belehrt mich eines besseren, falls ich mit dieser Frage etwas falsch gemacht haben sollte.[/quote]Das Einzige, was Du als Anfänger falsch machen kannst ist nicht zu fragen, von da her ist erstmal alles gut…

[quote=ElifOzt;124926]( Alle Methoden müssen statisch sein)[/quote]Bitte doch mal deinen Lehrer hier den Grund für diese Bedingung zu posten, auf den wäre ich wirklich gespannt…

[quote=ElifOzt;124926]Der Parameter gibt an, wie oft eine zufällige Note zwischen 1 und 6 gewürfelt und auf dem Bildschirm ausgegeben werden soll. […] Bei der zweiten Aufgabe stehe ich komplett auf dem Schlauch. Ich denke es wird mit Math.random()[/quote]Also die Aufgabe besteht ja nun selbst schon wieder aus 2 Aufgaben:
Weist Du schon, wie ein Kommandozeilen-Parameter in das Programm hinein kommt?
Math.random() ist ja schon mal die richtige Richtung.
Aber man darf die Klasse Random auch direkt verwenden und dort gibt es dann ziemlich interessante Methoden für deinen Anwendungsfall.
Das ist schon mal 'ne gute Gelegenheit, sich generell mit der API-Dokumentation auseinander zu setzen.

bye
TT

Ist zwar schon gelöst, aber trotzdem: Wie wäre es mit einem Array?

public class Schulnoten {

  private final static String[] NOTEN_NAME = {"sehr gut", "gut", "befriedigend", "ausreichend", "mangelhaft", "ungenügend","ungültiger Notenwert"};

    public static void druckeTabelle() {
        System.out.println("Noten | Notennamen");
        for ( int i = 1; i<=7; i++){
            System.out.println(i + ":	" + NOTEN_NAME[i-1]);
        }
    }
...
}

Wobei der “ungültige Notenwert” natürlich Schwachfug ist - sowas würde in der Praxis anders gelöst, etwa mit einer Ausnahme (Exception).

[QUOTE=SlaterB]
ich bin gerade die nächsten Stunden nicht mehr da[/QUOTE]

Klingt fast wie eine Androhung. :wink:

Spontan hätte ich es so geschrieben (ich hab ein paar Anmerkungen als Kommentar):

 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package testprojekt;

/**
 * @author CB
 */
public class Schulnoten {

    public static String notenname(int note) {
        switch (note) {
            case 1:
                return "Sehr gut";
            case 2:
                return "Gut";
            case 3:
                return "Befriedigend";
            case 4:
                return "Ausreichend";
            case 5:
                return "Mangelhaft";
            case 6:
                return "Ungenügend";
            case 7:
                return "ungültiger Notenwert";
            default:
                throw new AssertionError();
        }
    }

    public static void druckeTabelle() {
        System.out.println("Noten | Notennamen");
        for (int i = 1; i <= 7; i++) {
            System.out.println(i + "     | " + notenname(i));
        }
    }

    public static int erzeugeNoten(int anzahl) {
        return (int) (Math.random() * anzahl) + 1; // mit INT kann er schneller
    }

    public static void main(String[] args) {
        Schulnoten noten = new Schulnoten();
        noten.druckeTabelle(); // asccessing static method

        for (int i = 0; i < 3; i++) {
            System.out.println("Ihre Note ist: " + notenname(erzeugeNoten(7)) + ".");
        }
    }
}```

run:
Noten | Notennamen
1 | Sehr gut
2 | Gut
3 | Befriedigend
4 | Ausreichend
5 | Mangelhaft
6 | Ungenügend
7 | ungültiger Notenwert
Ihre Note ist: Ausreichend
Ihre Note ist: Sehr gut
Ihre Note ist: Sehr gut
BUILD SUCCESSFUL (total time: 0 seconds)



Manche schreiben auch: Ihre Note lautet: usw., und machen evtl. einen Punkt und Klammern dahinter. Wenn es statisch sein soll, dann nicht über das Instanz aufrufen, imho.

@CyborgBeta die Signatur deiner Methode public static int erzeugeNoten(int anzahl) würde ich nochmal anpassen, denn da ist das Anzahl finde ich uneindeutig ebenso das es die Pluralform von Note ist. Das Anzahl deutet auf eine Anzahl an Noten her. Somit müsste die Signatur dann eher sein public static List<int> erzeugeNoten(int anzahl) oder so wie du die Methode programmiert hast müsste die Signatur eher so sein public static int erzeugeNote(int maxValue). Des weiteren könnte man es weniger Speziell machen von der Nutzung her und dem entsprechen Verallgemeinern in public static int erzeugeZufahlsszahl(int maxValue)

Ansonsten würde ich es eher über Enums lösen anstelle mittels Switch-Case, aber das ist denke ich für einen Anfänger noch ein wenig zu viel :wink:

Denke ich auch.

Alle Namen/Bezeichner hab ich so wie oben übernommen, professionell nennt man sie doch eh Englisch. :wink:


Ihre Note ist: …

Ist jetzt nur ein Beispiel dafür, eine einzelne bestimmte Note kann ausgegeben/gedruckt werden, eine Notenliste kann gedruckt werden, oder eine/mehrere zufällige Noten können gedruckt werden.

Viel mehr gibt das Programm doch jetzt eh nicht her.

Ich dachte du hättest es selber geschrieben, wegen deiner Javadoc

/**
* @author CB
*/

aber OK, ja ich sehe du hast schlicht einfach Fremden Code als den Deinen Ausgegeben.
Wenn man schon solche Kommentare abgibt, wie in deinem Code, dann hätte ich das auch angepasst. Da wie dir ja schon das eine oder andere mal gesagt wurde, ist es generell schön sprechende und verständliche Bezeichnungen für Methoden, Variablen & Co zu verwenden. Weil das macht den Code leserlich und verständlich, auch wenn man dann auch nach ein paar Tagen mal sich den Code anschaut oder Fremde über den Code schauen.
Ja es wird viel in Englisch benannt, ist aber nicht zwingend nötig. So wird, z.b. von manchen Auftraggebern gewünscht es Deutsch zu benamen, vor allem bei Fachausdrücken/Fachbezeichnungen bei Deutschen Firmen, da es dann auch die Kommunikation mit der Fachabteilung einfacher macht, wenn man im Code und generell die selben Fachbegriffe für die selbe Fachlichkeit benutzt und nicht die Fachabteilung ein Wort und die Entwickler ein anderes Wort (zwar nur die Übersetzung) weil das kann leicht zu Problemen führen,…

und was soll das?

case 7:
    return "ungültiger Notenwert";
default:
    throw new AssertionError();

was ist so besonderes an der sieben?

[QUOTE=Bleiglanz]
was ist so besonderes an der sieben?[/QUOTE]

Sieben bedeutet, eine Note konnte aufgrund der Umstände x, y und z nicht ermittelt/berechnet/bestimmt werden. :wink:

Es gibt ja auch Schüler, die keine Note habn.

Im “Osten” ging es ja nur bis 5, aber ich habe von einem Fall gehört, wo auch eine 7 vergeben wurde - mit der Anmerkung “um klarzustellen, wie weit Sie noch von einer 5 entfernt sind”. Würde sich heute kein Lehrer mehr trauen…

Und wofür gibt es bitteschön die 6? Etwas DDR Literatur hab ich hier auch, aber weniger noten-historisches.

Edit: Aber Entfernung in negativen Sinne, denn sonst müsste es ja auch -1 bis … -10 geben, möchte man ausdrücken, jemand hat sich „besonders hervorgetan“. :frowning:

[QUOTE=Bleiglanz]und was soll das?

case 7:
    return "ungültiger Notenwert";
default:
    throw new AssertionError();

was ist so besonderes an der sieben?[/QUOTE]

gute Frage, im Orginalpost des TO gab es das noch nicht, das ist erst eine neue Einführung, von einem der Antworter. Bei dem TO gab es die Noten 1-6 und für alles andere, einen Ungültigen Wert.

Dann wurde nachträglich noch der Wert für die 7 von @CyborgBeta eingeführt.

Warum eher die Fachlichkeit geändert hat, ist nicht sicher, eventuell um zu Zeigen das er Weiß das es Exceptions gibt, wobei er vergessen hat diese dann auch zu behandeln. Da der Orginalpost gegen Falscheingaben stabil war und auch bei einer Noteneingabe von 8 funktioniert, fliegt das Programm von @CyborgBeta einem dann um die Ohren.

die Ehre gebührt durchaus auch Landei mit dem Array im Posting davor,
zusammen mit der sowieso schon recht deutlichen switch-Version in Posting 1 inklusive Schleife unnötig bis 7
kann nun wirklich nichts anderes herauskommen

Naja ich finde, das ist schon eine ziemlich starke Veränderung der Fachlichkeit.
Bei der einen Variante habe ich für 1-6 die bekannten Noten von “sehr Gut” bis “ungenügend” und für jeglichen anderen Wert die Aussage das “ungültiger Notenwert” ist.
Bei der neuen Variante habe ich für 1-6 die bekannten Noten von “sehr Gut” bis “ungenügend” für die 7 die Aussage das dieser Wert ein 2ungültiger Notenwert" ist und für jede andere Information eine Exception, die nicht behandelt wird und somit das Programm auch noch zum Absturz bring und nicht die Information liefert, das dieser Wert nicht ein gültiger Notenwert von 1-6 ist.
Das die Schleife in dem Orginal Posting von 1-7 geht finde ich eigentlich gut, da es dort auch den Fehlerfall mit abdeckt. Ähnlich wie bei anständigen Tests, bei denen ich auch nicht nur den Normalfall abtesten sollte, sondern auch schauen sollte, ob das Programm mit Fehleingaben des Nutzers umgehen kann.

[ot]

Das gab es im Westen auch:
Ich hatte mal einen Lateinlehrer, der jede Stunde einen Vokabeltest über 10 Vokabeln hat schreiben lassen am Anfang.
Einmal bekam jemand eine 9 zurück „weil eine 6 deiner Leistung nicht angemessen wäre“.
[/ot]

“Note nicht vergeben” - passt eher.

Aber ehrlich, es war nur eine (inhaltliche) Korrektur, Namen/Bezeichner und Literale habe ich so gelassen/ beibehalten. Es war nicht richtig, an eine Korrektur meinen Namen dranzuschreiben, aber, wtf, der Beitrag von TO stand direkt darüber, und wer nicht gerade von unten nach oben oder von links liest, dem muss das auffallen.

Sorry, aber @CyborgBeta

  • du hast den Sinn der Ausgabe geändert (hinzufügen einer neuen Note),
  • du hast dich als Autor benannt (hinzufügen von @author tag)
    und auf den Hinweis das du die Benamung undeutlich verwändet hast, meinst du, ich habe ja gar nix gemacht, du hast es ja nur kopiert, wo kommt denn dann diese gewaltige Änderung der Noten (1-7 anstelle 1-6) her?
    Ich finde es ist Deutlich mehr als nur eine inhaltliche Korrektur die du da vorgenommen hast.
    Und wenn man schon meint, man korrigiert es inhaltlich, dann würde ich erst recht sowas wie auch die Benamung von Methoden bzw Bezeichnern da drinnen aufnehmen, damit unerfahrene Nutzer verstehen, das es sehr hilfreich und nützlich ist, seinen Code Sinnvoll zu Benamen.

[QUOTE=Unregistered]
Und wenn man schon meint, man korrigiert es inhaltlich, dann würde ich erst recht sowas wie auch die Benamung von Methoden bzw Bezeichnern da drinnen aufnehmen, damit unerfahrene Nutzer verstehen, das es sehr hilfreich und nützlich ist, seinen Code Sinnvoll zu Benamen.[/QUOTE]

Nagut, ich war zu faul, die Zeichenketten zu ändern. Das ist aber ein taktischer/strategischer Vorteil für den TO, denn … . Jedenfalls kann ich deiner Argumentation (nicht) folgen. Pech aber auch.