IT-Academy Logo
Sign Up Login Help
Home - Programmieren - Python - Ein einfacher Notenrechner in Python



Ein einfacher Notenrechner in Python

Dieses kurze Python-Skript unterstützt Schüler beim Ausrechnen ihres Notendurchschnitts. Als Eingabe werden erstens die bisher erreichten Noten erwartet, woraus dann der aktuelle Notendurchschnitt berechnet werden kann. Zweitens gibt man die Durchschnittsnote an, die man am Ende des Semesters erreichen möchte. Das Skript berechnet dann, welche Note man in der nächsten (bzw. letzten) Prüfung des Semesters erreichen muss, damit der gewünschte Durchschnitt erreicht werden kann. Das Skript ist auf das Schweizer Bildungssystem ausgelegt; wo die Note 6 die Beste und 1 die Schlechteste ist.


Autor: Patrick Bucher (paedubucher)
Datum: 03-01-2008, 16:52:04
Referenzen: keine
Schwierigkeit: Anfänger
Ansichten: 9955x
Rating: Bisher keine Bewertung.

Hinweis:

Für den hier dargestellte Inhalt ist nicht der Betreiber der Plattform, sondern der jeweilige Autor verantwortlich.
Falls Sie Missbrauch vermuten, bitten wir Sie, uns unter missbrauch@it-academy.cc zu kontaktieren.

[Druckansicht] [Als E-Mail senden] [Kommentar verfassen]



Zunächst das vollständige Skript (unter GPLv3 lizenziert):

Der Quellcode

#!/usr/bin/env python
# -*- coding: utf-8 -*-
    
# Notenrechner - unterstützt Schüler beim Ausrechnen ihres Notendurchschnitts
# Copyright (C) 2008  Patrick Bucher

# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.

# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.

# You should have received a copy of the GNU General Public License
# along with this program.  If not, see .

# Initialisierung
print "\nNotenprogramm\n", '-' * len("Notenprogramm")
noten = []

# Bisher erreichte Noten einlesen
while True:
  tmp = float(raw_input("Geben Sie eine Note ein (1 bis 6, 0 = Abbruch):\t"))
  if 1 <= tmp <= 6:
    noten.append(tmp)
  elif tmp == 0:
    break
  else:
    print "Falsche Eingabe!\n"

if not len(noten):
  exit()

# Durchschnitt ausgeben
notensumme = 0.0
for tmp in noten:
  notensumme += tmp

durchschnitt = notensumme / len(noten)
print "\nIhr aktueller Durchschnitt: %.2f\n" % durchschnitt

# Ziel-Durchschnittsnote einlesen
while True:
  target = float(raw_input("Geben Sie Ihre Ziel-Durchschnittsnote ein:\t"))
  if 1 <= target <= 6:
    break
  else:
    print "Falsche Eingabe!\n"

# Bei der nächsten Prüfung zu erreichende Note ausrechnen
todo = target * (len(noten) + 1) - notensumme

# Ausgabe
if todo > 6:
  maximal = (notensumme + 6) / (len(noten) + 1)
  print "\nZiel unerrreichbar! Maximaler Durchschnitt (mit Note 6): %.2f\n" % maximal
elif todo < 1:
  minimal = (notensumme + 1) / (len(noten) + 1)
  print "\nZiel unerreichbar!: Minimaler Durchschnitt (mit Note 1): %.2f \n"  % minimal
else:
  print "\nBei der nächsten Prüfung müssen Sie die Note %.2f erreichen!\n" % todo

raw_input()

Das ganze Skript umfasst (ohne Kommentare) ungefähr 50 Zeilen.

Shebang-Zeile und Kodierung

Bei der ersten Zeile (#!/usr/bin/env python) handelt es sich um eine sog. Shebang-Zeile. Diese ist nur für Unix-ähnliche Systeme (Linux, BSD, usw.) von Belang. Wird die Skriptdatei gestartet, weiss die Shell wo sie den Interpreter zur Ausführung dieses Skripts finden kann. Genauer wird das Programm env verwendet, um den Python-Interpreter zu finden. Die Shebang-Zeile muss mit dem Rautezeichen eingeleitet werden, da sie so als Python-Kommentar gilt. Für weitere Informationen zur Shebang-Zeile, siehe den entsprechenden Wikipedia-Artikel.

In der zweiten Zeile (# -*- coding: utf-8 -*-) wird die Kodierung der Quelltextdatei angegeben. Dies ist notwendig, da im Skript Umlaute wie ä, ö und ü verwendet werden. Es folgt die Lizenzerklärung (GPLv3), die hier aus Platzgründen weggelassen wurde.

Initialisierung

Da Python keine Variablendeklaration erfordert, fällt dieser Teil recht kurz aus:

# Initialisierung
print "\nNotenprogramm\n", '-' * len("Notenprogramm")
noten = []

Die erste Zeile gibt zuerst den Titel aus. Dieser besteht aus dem Wort "Notenprogramm", welchem ein Zeilenumbruch vor- und nachgestellt ist. Der Titel wird mit dem Zeichen - unterstrichen. Es sind genau so viele - notwendig, wie die Länge des Wortes "Notenprogramm" beträgt. Des weiteren wird die Liste noten erstellt, damit diese im folgenden Abschnitt befüllt werden kann.

Eingabe der Noten

Nun geht es ans Eingemachte, der Benutzer gibt seine Noten ein:

# Bisher erreichte Noten einlesen
while True:
  tmp = float(raw_input("Geben Sie eine Note ein (1 bis 6, 0 = Abbruch):\t"))
  if 1 <= tmp <= 6:
    noten.append(tmp)
  elif tmp == 0:
    break
  else:
    print "Falsche Eingabe!\n"

if not len(noten):
  exit()

Zunächst wird eine Endlosschleife formuliert, der Benutzer kann somit beliebig viele Noten eingeben. Als Noten können Werte zwischen 1.0 und 6.0 angegeben werden, 0 beendet die Eingabeaufforderung. Eingelesen wird mit der Funktion raw_input(), der eingelesene String muss dann in eine Fliesskommazahl umgewandelt werden. Liegt die Eingabe im Bereich von 1 bis 6, so wird die Note der Liste angefügt. Hat der Benutzer 0 eingegeben, wird die Schleife verlassen (break-Anweisung). Andere Eingaben werden mit der Meldung "Falsche Eingabe" quittiert.

Nach der Schleife wird geprüft, ob der Benutzer überhaupt Noten eingegeben hat. Entspricht die Länge der Notenliste 0, so wird das Skript mit der exit()-Funktion verlassen.

Durchschnitt ausrechnen und ausgeben

Der Benutzer ist nach der Eingabe seiner einzelnen Noten warscheinlich an seinem bisherigen Durchschnitt interessiert. Dieser soll im also nun berechnet und ausgegeben werden:

# Durchschnitt ausgeben
notensumme = 0.0
for tmp in noten:
  notensumme += tmp

durchschnitt = notensumme / len(noten)
print "\nIhr aktueller Durchschnitt: %.2f\n" % durchschnitt

Zuerst wird die Variable notensumme mit dem Wert 0.0 vorbelegt, damit sie zur Verfügung steht. Nun wird mittels for-Schleife über die eingelesenen Noten (genauer über die Liste noten) iteriert, die Summe wird in der Variablen notensumme gespeichert. Der Durchschnitt wird nun mit der Formel Notensumme / Anzahl Noten errechnet. Letzteres wird mit der Funktion len() in Erfahrung gebracht. Der Durchschnitt wird dem Benutzer mit zwei Kommastellen genau ausgegeben (%.2f).

Ziel des Benutzers einlesen

Der Benutzer kennt nun seinen Durchschnitt und kann sich ein (hoffentlich realistisches) Notenziel ausdenken und dieses sogleich eingeben. Der Notendurchschnitt wird vorher ausgegeben um dem Benutzer Illusionen auf einen guten Durchschnitt zu nehmen ;-)

# Ziel-Durchschnittsnote einlesen
while True:
  target = float(raw_input("Geben Sie Ihre Ziel-Durchschnittsnote ein:\t"))
  if 1 <= target <= 6:
    break
  else:
    print "Falsche Eingabe!\n"

Diese (Endlos-)Schleife ähnelt derjenigen weiter oben, hier muss jedoch nur ein Wert eingegeben werden. Es wird so lange iteriert, bis der Benutzer einen gültigen Wert (im Bereich 1 bis 6) eingegeben hat.

Zu erreichende Note ausrechnen

Nun kommt die eigentliche Kernanweisung des Skripts; die Berechnung der zu erreichenden Note:

# Bei der nächsten Prüfung zu erreichende Note ausrechnen
todo = target * (len(noten) + 1) - notensumme

Der Durchschnitt wird bekanntlich mit der Formel Notensumme / Anzahl Noten berechnet. Mathematisch kann die Problematik nun folgendermassen dargestellt werden (x entspricht der Note, die bei der nächsten Prüfung erreicht werden muss):

Durchschnitt = (Note1 + Note2 + ... + x) / (Anzahl Noten + 1)

Der Ausdruck (Anzahl Noten + 1) kommt daher, dass die Note x nocht nicht als erreichte Note gilt, die Anzahl der Noten muss somit um den Wert 1 erhöht werden. Diese Gleichung muss nun auf x aufgelöst werden:

Durchschnitt = (Note1 + Note2 + ... + x) / (Anzahl Noten + 1)		| multipliziere mit (Anzahl Noten + 1)
Durchschnitt * (Anzahl Noten + 1) = (Note1 + Note2 + ... + x)		| subtrahiere (Note1 + Note2 + ...)
Durchschnitt * (Anzahl Noten + 1) - (Note1 + Note2 + ...) = x		| vertausche die beiden Seiten
x = Durchschnitt * (Anzahl Noten + 1) - (Note1 + Note2 + ...)

Bestätigen wir diese Formel noch anhand eines kleinen Beispiels. Der Schüler hat bisher die Noten 6.0 und 4.0 erreicht. Dies ergibt einen aktuellen Durchschnitt von 5.0. Als Ziel-Durchschnitt wurde 5.2 angegeben. Die Formel sieht mit eingesetzten Werten nun folgendermassen aus:

x = 5.2 * (2 + 1) - (6.0 + 4.0)
x = 5.2 * 3 - 10
x = 15.6 - 10
x = 5.6

Der bemittleidenswerte Schüler muss somit in der nächsten Prüfung die Note 5.6 erreichen, um den angestrebten Durchschnitt von 5.2 verwirklichen zu können. Die Rückwärtsrechnung bestätigt das:

5.2 = (6.0 + 4.0 + 5.6) / 3
5.2 = 15.6 / 3
5.2 = 5.2
>> korrekt

Ausgabe der zu erreichenden Note

Nun können wir dem Benutzer mitteilen, welche Note er zu erreichen hat. Dabei gibt es jedoch drei Fälle:

  1. Normalfall: Wir geben dem Benutzer die zu erreichende Note an
  2. Sonderfall 1: Der Benutzer ist ein Tiefstapler und strebt nacht einer Durchschnittsnote, auf die er nicht mehr sinken kann.
  3. Sonderfall 2: Der Benutzer ist ein Träumer und möchte eine Durchschnittsnote erreichen, die nicht einmal mit der Bestnote 6.0 zu erreichen wäre.

Im ersten Fall geben wir einfach die entsprechende Note aus (wie immer mit zwei Nachkommastellen). Beim ersten Sonderfall (unerreichbar schlechte Note), geben wir an, welchen Durchschnitt er im Minimum (d.h. wenn er bei der nächsten Prüfung auf die Note 1.0 kommt) erreichen kann. Beim zweiten Sonderfall (unerreichbar gute Note) geben wir an, welchen Durchschnitt er mit der Bestnote (6.0) noch bestenfalls erreichen kann. Formuliert in Python-Code sieht dies dann so aus:

# Ausgabe
if todo > 6:
  maximal = (notensumme + 6) / (len(noten) + 1)
  print "\nZiel unerrreichbar! Maximaler Durchschnitt (mit Note 6): %.2f\n" % maximal
elif todo < 1:
  minimal = (notensumme + 1) / (len(noten) + 1)
  print "\nZiel unerreichbar!: Minimaler Durchschnitt (mit Note 1): %.2f \n"  % minimal
else:
  print "\nBei der nächsten Prüfung müssen Sie die Note %.2f erreichen!\n" % todo

raw_input()

Die letzte Anweisung (raw_input()) dient nur dazu, das Konsolenfenster offen zu behalten. Das Skript gelangt an sein Ende, sobald der Benutzer mit der Taste Return bestätigt.

Links



paedubucher
Professonial
Beitrag vom:
13-02-2008, 16:35:06

Kurzschreibweise

Gratuliere, du hast gerade eine von vielen Schönheiten der Python-Programmiersprache entdeckt.

if 1 <= tmp <= 6: ist "ausgeschrieben"

if 1 <= tmp and tmp <= 6:

oder

if tmp >= 1 and tmp <= 6:

Aber warum kompliziert, wenn es auch einfach geht?

-----------------------------------------------------


paedubucher
Professonial
Beitrag vom:
13-02-2008, 16:34:45

Kurzschreibweise

Gratuliere, du hast gerade eine von vielen Schönheiten der Python-Programmiersprache entdeckt.

if 1 <= tmp <= 6: ist "ausgeschrieben"

if 1 <= tmp and tmp <= 6:

oder

if tmp >= 1 and tmp <= 6:

Aber warum kompliziert, wenn es auch einfach geht?

-----------------------------------------------------


VuuRWerK
Junior-Member
Beitrag vom:
11-02-2008, 14:18:39

Frage zu den If-Statements

Hallo Patrick,

schöner Artikel, zumal ich selber gerade dabei bin mich in Python einzuarbeiten.

Mir ist bei Deinen If-Statements aufgefallen das Du vergleiche bspw. so schreibst: if 1 <= tmp <= 6:
Jetzt meine Fragen: Ist das nur eine Kurzschreibweise für eine Auswahl-Abfrage? Wie würde man es "ausgeschrieben" schreiben( Auch mit || )? Habe auch schon mal fix ins Python-Tutorial geschaut aber da wurden bisher nur Vergleiche durchgeführt mit nur einer Bedingung.

Vielen Dank schonmal, vllt beteilige ich mich ja demnächst auch an ein paar Python-Artikeln mein erstes Buch ist schon auf der dem Weg zu mir :)

Gut Schuß
VuuRWerK ;)

-----------------------------------------------------
- Seit 06.07.07 20:07 stolzer Pappa meiner Tochter Lena! - braincompiler.de - groowe.org


paedubucher
Professonial
Beitrag vom:
03-01-2008, 17:41:42

Verbesserungsvorschläge

Der Code stammt zugegebenermassen von einem Python-Anfänger (sprich von mir). Verbesserungsvorschläge wären also durchaus willkommen.

-----------------------------------------------------


[back to top]



Userdaten
User nicht eingeloggt

Gesamtranking
Werbung
Datenbankstand
Autoren:04512
Artikel:00815
Glossar:04116
News:13565
Userbeiträge:16552
Queueeinträge:06248
News Umfrage
Ihre Anforderungen an ein Online-Zeiterfassungs-Produkt?
Mobile Nutzung möglich (Ipone, Android)
Externe API Schnittstelle/Plugins dritter
Zeiterfassung meiner Mitarbeiter
Exportieren in CSV/XLS
Siehe Kommentar



[Results] | [Archiv] Votes: 1158
Comments: 0