Python :: Aufgabe #240

2 Lösungen Lösungen öffentlich

Arrays-zweidimensional Noten Notenberechnung

Fortgeschrittener - Python von sinanoz05 - 29.01.2020 um 11:28 Uhr
In einer Klasse werden in einem Schulhalbjahr in 6 Fächern bis zu 5 Klassen arbeiten geschrieben. Es ist ein Programm zu entwickeln, mit dem ein Schüler seine je Fach erzielten Noten eingeben kann. Bei nicht geschriebenen Arbeiten wird als Note die Null gespeichert. Der Rechner soll er mitteln,wie vieleArbeitender Schüler geschriebenhat. Ferner sollder Rechner den Noten durchschnitt proFachberechnen. Nachjeder Eingabe erscheint folgender Bildschirm(im Anhang):

Hinweise zur Realisierung:  im Hauptprogramm werden folgende Funktionen aufgerufen: eingabe() unduebersicht()  eingabe(): Eingabeeiner Note Übergabeparameter: keine Rückgabe wert: n: zweidimensionales Feld vom Typ Ganzzahl  übersicht(): Ausgabeder Notenübersicht Übergabeparameter: n:zweidimensionales Feld vom Typ Ganzzahl Rückgabewert:kein

Achtung! wenninmain:
1) Feld-def.:noten[6,5]
2) Feld an Methode übergeben noten=eingabe(noten)
3) in Methode neues Feld n[3,3]  bei return (n) wird in der Aufrufzeile von main das Feld noten bzw.die Referenz auf das Feld überschrieben!!! Referenz auf noten wird durch die Referenz auf das neue Feld n überschrieben!

Lösungen:

vote_ok
von Klaus (1960 Punkte) - 06.02.2020 um 10:56 Uhr
Quellcode ausblenden Python-Code
class Grade:

    def __init__(self):
        self.data = {}
        for element in '1 2 3 4 5 6'.split():
            self.data[int(element)] = [0] * 7

    def enter_values(self):
        subject = ''
        test_number = ''
        grade = ''
        while subject not in '1 2 3 4 5 6'.split():
            subject = input('Fach-Nummer:       ')
        while test_number not in '1 2 3 4 5'.split():
            test_number = input('Arbeits-Nummer:    ')
        while grade not in '1 2 3 4 5 6'.split():
            grade = input(f'Note der Arbeit {test_number}: ')
        self.data[int(subject)][int(test_number) - 1] = int(grade)

    def __calculate_values(self):
        for subject in self.data:
            self.data[subject][5] = 5 - self.data[subject][:5].count(0)
            try:
                self.data[subject][6] = sum(self.data[subject][:5]) / self.data[subject][5]
            except ZeroDivisionError:
                self.data[subject][5] = 0

    def output(self):
        self.__calculate_values()
        line = '-'*41
        output_text = f'\n{line}\n' \
                      f'Fach  Arbeitsnummer\n' \
                      f'{line}\n' \
                      f'      1  2  3  4  5  Anzahl  Durchschnitt\n' \
                      f'{line}\n'

        for subject in self.data:
            output_text += f'  {subject}   {self.data[subject][0]}  {self.data[subject][1]}  {self.data[subject][2]}' \
                           f'  {self.data[subject][3]}  {self.data[subject][4]}    {self.data[subject][5]}' \
                           f'          {self.data[subject][6]}\n'
        output_text += f'{line}'
        print(output_text)


menue_selection = None
menue_text = f'\nBitte eine Auswahl treffen\n' \
             f'(1) - Noten erfassen\n' \
             f'(2) - Ausgabe der Übersicht\n' \
             f'(3) - Anwendung beenden\n'

g = Grade()

while menue_selection != '3':
    print(menue_text)
    menue_selection = None
    while menue_selection not in '1 2 3'.split():
        menue_selection = input('Bitte Auswahl treffen  -> ')
        if menue_selection == '1':
            further_input = None
            while further_input != 'n':
                further_input = ''
                g.enter_values()
                while further_input not in 'j n'.split():
                    further_input = input('Weitere Noten eingeben (j/n)  ->  ').lower()
        elif menue_selection == '2':
            g.output()
vote_ok
von kaschperl (400 Punkte) - 25.02.2020 um 00:28 Uhr
Quellcode ausblenden Python-Code
import numpy as np
import pandas as pd


class Notenberechnung:
    def __init__(self, anzahl_faecher, anzahl_arbeiten):
        self.anzahl_faecher = anzahl_faecher
        self.anzahl_arbeiten = anzahl_arbeiten
        self.MAX_NOTE = 6

        # Notenspiegel aufbauen
        self.nspiegel = pd.DataFrame(index=["Fach " + str(x+1) for x in range(self.anzahl_faecher)],
                                     columns=[str(x+1) for x in range(self.anzahl_arbeiten)])
        self.nspiegel['Anzahl'] = [0 * x for x in range(self.anzahl_faecher)]
        self.nspiegel['Durchschnitt'] = [0 * x for x in range(self.anzahl_faecher)]
        self.nspiegel.fillna(0, inplace=True)

        self.menu()

    def menu(self):
        while True:
            print('\n########## Menu ###########')
            print('1 - Note hinzufügen')
            print('2 - Notenspiegel anzeigen')
            print('0 - Beenden')
            menu = input('### Ihre Wahl: ')

            if menu == '1':
                self.add_Note()
            elif menu == '2':
                self.print_Notenspiegel()
            elif menu == '0':
                break
            else:
                print('ungültige Eingabe!')

            input('### weiter mit Enter')

    def add_Note(self):
        fach = int(input('Fach-Nummer: '))
        arbeit_nummer = int(input('Arbeits-Nummer: '))
        note = int(input(f'Arbeit von KA {arbeit_nummer}: '))
        self.nspiegel.iat[fach-1,arbeit_nummer-1] = note
        self.nspiegel.replace(0, np.NaN, inplace=True)
        self.nspiegel['Anzahl'] = self.nspiegel.iloc[0:6,0:5].count(axis='columns')
        self.nspiegel['Durchschnitt'] = self.nspiegel.iloc[0:6,0:5].mean(axis='columns')
        self.nspiegel.fillna(0, inplace=True)
        self.print_Notenspiegel()

    def print_Notenspiegel(self):
        print('\n### Notenspiegel ###')
        print(self.nspiegel)


if __name__ == "__main__":
    Notenberechnung(6,5)