Notenberechnung: Unterschied zwischen den Versionen

Aus Fachschaft_Informatik
Zur Navigation springen Zur Suche springen
(+ Calc)
K (Bot: Kosmetische Änderungen)
 
Zeile 52: Zeile 52:


=== Implementierung ===
=== Implementierung ===
====Calc====
==== Calc ====


Ein Spreadsheet mit einem Chart, dass die Spreizung der moeglichen Note zeigt, gibt es hier: [[Media:DPO98-Noten-Chart.ods]]
Ein Spreadsheet mit einem Chart, dass die Spreizung der moeglichen Note zeigt, gibt es hier: [[Medium:DPO98-Noten-Chart.ods]]
==== Perl ====
==== Perl ====
<code>
<code>
Zeile 350: Zeile 350:
if(count($faecher) == 0){
if(count($faecher) == 0){
   $str.="    <tr><td colspan=5>\n";
   $str.="    <tr><td colspan=5>\n";
   $str.="      <i>F&uuml;r diesen Studiengang wurden noch keine Module,<br />\n";
   $str.="      <i>Für diesen Studiengang wurden noch keine Module,<br />\n";
   $str.="      Leistungspunkte und Gewichtungen eingetragen.<br />\n";
   $str.="      Leistungspunkte und Gewichtungen eingetragen.<br />\n";
   $str.="      Du kannst die Daten raussuchen und im <a href=\"https://www.fb18.de/mybb/showthread.php?tid=9878\">fb18</a> posten.</i>\n";
   $str.="      Du kannst die Daten raussuchen und im <a href=\"https://www.fb18.de/mybb/showthread.php?tid=9878\">fb18</a> posten.</i>\n";
Zeile 374: Zeile 374:
$str.="    <tr><td colspan=3>Schlechteste moegliche Note</td><td align=right>".$grenzen['untere']."</td></tr>\n";
$str.="    <tr><td colspan=3>Schlechteste moegliche Note</td><td align=right>".$grenzen['untere']."</td></tr>\n";
$str.="    <tr><td colspan=3>Laufende Note</td><td align=right>".$grenzen['laufend']."</td></tr>\n";
$str.="    <tr><td colspan=3>Laufende Note</td><td align=right>".$grenzen['laufend']."</td></tr>\n";
$str.="    <tr><td colspan=5 align=center>[alle angaben - wie immer - ohne gew&auml;hr - feher<!--sic--></td></tr>\n";
$str.="    <tr><td colspan=5 align=center>[alle angaben - wie immer - ohne gewähr - feher<!--sic--></td></tr>\n";
$str.="    <tr><td colspan=5 align=center>und &auml;nderungsw&uuml;nsche kannst du im <a href=\"https://www.fb18.de/mybb/showthread.php?tid=9878\">fb18</a> posten]</td></tr>\n";
$str.="    <tr><td colspan=5 align=center>und änderungswünsche kannst du im <a href=\"https://www.fb18.de/mybb/showthread.php?tid=9878\">fb18</a> posten]</td></tr>\n";
$str.="  </table>\n</form>\n</body></html>";
$str.="  </table>\n</form>\n</body></html>";


Zeile 416: Zeile 416:


=== Implementierung ===
=== Implementierung ===
*Quelle: https://www.fb18.de/mybb/showthread.php?tid=9878
* Quelle: https://www.fb18.de/mybb/showthread.php?tid=9878
*Online: http://ebase.dyndns.info/calc.php
* Online: http://ebase.dyndns.info/calc.php

Aktuelle Version vom 8. Juni 2012, 17:35 Uhr

Diplom[Bearbeiten]

Beschreibung[Bearbeiten]

Für Diplomer berechnet sich die Endnote wie folgt:

Es gibt insgesamt 5 Prüfungen, die zu gleichen Teilen in die Endnote einfließen:

  • Grundlagen von Informatik-Systemen
  • Theoretische Informatik
  • Schwerpunkt
  • Ergänzungsfach
  • Diplomarbeit

Um die Note in einer dieser Prüfungen zu ermitteln, wird aus den ungerundeten Noten der jeweiligen Teilprüfungen das arithmetische Mittel gebildet und nach der ersten Nachkommastelle abgeschnitten (abgerundet). Dasselbe Verfahren kommt für die Berechnung der Endnote zur Anwendung.

Beispiel[Bearbeiten]

  • Grundlagen von Informatiksystemen
    • Technische Informatik - DKR - 2.3
    • Angewandte Informatik - CGB - 2.0
    • Praktische Informatik - SNN - 3.7
    • Mittelwert ist 8.0/3 = 2.6666666 = 2.6
  • Theoretische Informatik
    • LOS - 1.7
    • AUK - 2.3
    • PNL - 1.7
    • Mittelwert ist 5.7/3 = 1.90000 = 1.9
  • Schwerpunkt
    • Prüfung - 2.3
    • Mittelwert ist 2.3/1 = 2.30000 = 2.3
  • Ergänzungsfach
    • 1. Prüfung = 4.0
    • 2. Prüfung = 2.3
    • Mittelwert ist 6.3/2 = 3.15000 = 3.1
  • Diplomarbeit
    • Erstgutachter - 1.7
    • Zweitgutachter - 2.0
    • Mittelwert ist 3.7/2 = 1.85000 = 1.8
  • Endnote (2.6 + 1.9 + 2.3 + 3.1 + 1.8) / 5 = 11.7/5 = 2.34000 = 2.3

Textform[Bearbeiten]

Am Ende wird diese numerische Endnote noch in Textform übersetzt:

  • 1.0 bis 1.0 - ausgezeichnet
  • 1.1 bis 1.5 - sehr gut
  • 1.6 bis 2.5 - gut
  • 2.6 bis 3.5 - befriedigend
  • 3.6 bis 4.0 - ausreichend


Implementierung[Bearbeiten]

Calc[Bearbeiten]

Ein Spreadsheet mit einem Chart, dass die Spreizung der moeglichen Note zeigt, gibt es hier: Medium:DPO98-Noten-Chart.ods

Perl[Bearbeiten]

#!/usr/bin/perl

sub mittel {
  my $note = 0;
  my $n = 0;
  foreach my $teilnote (@_) {
    $note += $teilnote;
    $n += 1;
  }
  $note = int($note * 10 / $n) / 10;
  return $note;
}

my $endnote = mittel(
  mittel(2.3, 2.0, 3.7),
  mittel(1.7, 2.3, 1.7),
  mittel(2.3),
  mittel(4.0, 2.3),
  mittel(1.7, 2.0)
);

print "$endnote (".('ausgezeichnet','sehr gut','gut','befriedigend','ausreichend')[int((int((int($endnote * 10) - 6) / 5) * 3 + 4) / 5)].")\n";

Python[Bearbeiten]

#!/usr/bin/env python
# Copyright: 2011 Tobias Mueller <4tmuelle@informatik.uni-hamburg.de>
# License: GPLv3+
import math

def gerundeter_schnitt(*noten):
    schnitt = (1.0 * sum(noten)/len(noten))
    gerundet = int(math.floor(schnitt * 10))
    return gerundet/10.0

def get_dipl_noten_text(dipl_note):
    translations = (
     (1.0, 1.0, "Ausgezeichnet"),
     (1.1, 1.5, "Sehr Gut"),
     (1.6, 2.5, "Gut"),
     (2.6, 3.5, "Befriedigend"),
     (3.6, 4.0, "Ausreichend"),
    )
    
    for upper, lower, text in translations:
        if upper <= dipl_note <= lower:
            return text
    raise RuntimeError("Couldn't translate note %s with %s", dipl_note, translations)

def diplomnote(a, p, t, th1, th2, th3, sp, ef, dipl):
    theorie = gerundeter_schnitt (th1, th2, th3)
    theorie_msg=r'''
    Th1: %2.1f    \
    Th2: %2.1f     = %2.1f
    Th3: %2.1f    /
    ''' % (th1, th2, theorie, th3)
    print theorie_msg
    
    gris    = gerundeter_schnitt (a, p, t)
    gris_msg=r'''
    A  : %2.1f    \
    P  : %2.1f     = %2.1f
    T  : %2.1f    /
    ''' % (a,p, gris, t)
    print gris_msg

    dipl_note = gerundeter_schnitt (theorie, gris, sp, ef, dipl)
    dipl_noten_text = get_dipl_noten_text(dipl_note)
    rest_msg=r'''
    Nebenfach:     %2.1f
    Schwerpunkt:   %2.1f
    Diplomarbeit:  %2.1f
    ====================
    Gesamt:        %2.1f %s
    ''' % (ef, sp, dipl, dipl_note, dipl_noten_text)
    print rest_msg
        
    return dipl_note

if __name__ == '__main__':
    import sys
    noten = [float(arg) for arg in sys.argv[1:]]
    a, p, t, th1, th2, th3, sp, ef, dipl = noten
    print diplomnote(*noten)

Bachelor[Bearbeiten]

Beschreibung[Bearbeiten]

FIXME!

Beispiel[Bearbeiten]

PHP[Bearbeiten]

<?php
// original quellcode von X3K6A2 aus
// https://www.fb18.de/mybb/showthread.php?tid=9878&pid=99910#pid99910
// erweitert um die moeglichkeit die noten auch fuer andere studiengaenge zu berechnen

// scp calc.php ebase.dyndns.info:htdocs/calc.php

$str='';
$studiengaenge = array(
    "Informatik_Bachelor" =>
      array(
        array("SE1",6,1),
        array("SE2",6,1),
        array("SE3",6,1),
        array("AD",6,1),
        array("GDB",6,1),
        array("GSS",6,1),
        array("RS",9,1),
        array("FGI1",9,1),
        array("FGI2",9,1),
        array("IKON",6,1),
        array("Praktikum",3,1),
        array("Seminar",1.5,2),
        array("Projekt",4.5,2),
        array("DM",9,1),
        array("ALA",9,1),
        array("Stochastik",9,1),
        array("WahlPflicht1",9,2),
        array("WahlPflicht2",9,2),
        array("WahlPflicht3",9,2),
        array("Wahl1",9,1),
        array("Wahl2",9,1),
        array("BacArbeit",12,4)
        ),
    "Informatik_Bachelor_2010" =>
       array(),
    "Informatik_Bachelor_2011" =>
       array(),
    "CIS_Biochemie_Bachelor" =>
      array(
        array("SE1",6,1),
        array("SE2",6,1),
        array("AC",9,1),
        array("OC",9,1),
        array("PC1",4.5,1),
        array("PC2",4.5,1),
        array("Einf. BC",3,1),
        array("Strukt. BC",3,1),
        array("BC",6,1),
        array("BC Praktikum",6,1),        
        array("Mathe1",9,1),
        array("Mathe2",9,1),
        array("FGI1",9,1),
        array("Mathe3/FGI2",9,1),
        array("STO",9,1),
        array("Numerik",9,1),                
        array("AD",6,1),
        array("GDB",6,1),
        array("ASE",3,1),
        array("CiS-Prog",6,1),
        array("CiS Biochemie",6,1),
        array("Wahlpflicht1",9,1),
        array("Wahlpflicht2",9,1), 
        array("Projekt",6,1),
        array("Seminar",3,1),
        array("BacArbeit",12,3)    
      ),
    "CIS_Chemie_Bachelor" =>
      array(
        array("SE1",6,1),
        array("SE2",6,1),
        array("AC",9,1),
        array("OC",9,1),
        array("PC1",4.5,1),
        array("PC2",4.5,1),
        array("PC3",9,1),
        array("Ausgw. Kapitel der Chemie",6,1),        
        array("Mathe1",9,1),
        array("Mathe2",9,1),
        array("FGI1",9,1),
        array("Mathe3/FGI2",9,1),
        array("STO",9,1),
        array("Numerik",9,1),
        array("AD",6,1),
        array("GDB",6,1),
        array("CiS-Prog",6,1),
        array("CiS Chemie",6,1),
        array("Wahlpflicht1",9,1),
        array("Wahlpflicht2",9,1),
        array("Wahlplicht Chemie",6,1), 
        array("Projekt",6,1),
        array("Seminar",3,1),
        array("BacArbeit",12,3)    
      ),
    "CIS_Physik_Bachelor" =>
      array(
        array("SE1",6,1),
        array("SE2",6,1),
        array("Physik1",12,1),
        array("Physik2",12,1),
        array("Physikpraktikum",9,1),
        array("Theoretische Physik2",9,1),        
        array("Mathe1",9,1),
        array("Mathe2",9,1),
        array("FGI1",9,1),
        array("Mathe3/FGI2",9,1),
        array("STO",9,1),
        array("Numerik",9,1),
        array("AD",6,1),
        array("GDB",6,1),
        array("CiS Physik",6,1),
        array("CiS-Prog",6,1),
        array("Wahlpflicht1",9,1),
        array("Wahlpflicht2",9,1),
        array("Wahlpflicht Physik",6,1), 
        array("Projekt",6,1),
        array("Seminar",3,1),
        array("BacArbeit",12,3)    
      ),
  "MCI_Bachelor" =>
      array(
        array("SE1",6,1),
        array("SE2",3,1),
        array("SE3",6,1),
        array("GDB",6,1),
        array("FGI1",9,1),
        array("IKON",6,1),
        array("DM",9,1),
        array("EP",3,1),
        array("AP1",6,1),
        array("AP2",6,1),
        array("AuO",6,1),
        array("QM1",5,1),
        array("QM2",5,1),
        array("Soz-/BioP",6,1),
        array("Entw-/PaedagP",6,1),
        array("GWV",9,2),
        array("ID",9,2),
        array("MCI-Praktikum",3,1),
        array("Seminar",1.5,2),
        array("Projekt",4.5,2),
        array("Wahlbereich",33,1),
        array("BacArbeit",12,3)
        ),
    "SSE_Bachelor" => array(),
    "Informatik_Master" =>
      array(
        array("FGI3",9,1),
        array("WahlPflicht1",9,1),
        array("WahlPflicht2",9,1),
        array("WahlPflicht3",9,1),
        array("Wahl1",6,1),
        array("Wahl2",6,1),
        array("Wahl3",6,1),
        array("Vertiefung1",6,1),
        array("Vertiefung2",6,1),
        array("Vertiefung3",6,1),
        array("Projekt",12,1),
        array("FreierWahlBereich",6,1),
        array("Masterarbeit",30,1),
      ), 
    "Quellcode" => array()
);
$studiengang = key($studiengaenge); //gibt den ersten key zurueck
if(array_key_exists($_REQUEST["Studiengang"], $studiengaenge)){
  $studiengang = $_REQUEST["Studiengang"];
}

if($studiengang == "Quellcode")
{
  header("Content-Disposition: attachment; filename=calc.php");
  header("Content-Type: text/php; charset=utf-8");
  $str = file_get_contents(__FILE__);
  echo $str;
  exit;
}
$faecher = $studiengaenge[$studiengang];

$str.="<html><body>\n<form target=\".$_SERVER[PHP_SELF].\" method=\"GET\">\n";
$str.="  <table>\n    <tr><td colspan=4>\n";
$str.="      <select name=\"Studiengang\">\n";
foreach($studiengaenge as $studg => $null){
  if($studiengang == $studg){
    $str.="        <option selected>$studg</option>\n";
  }
  else
  {
    $str.="        <option>$studg</option>\n";
  }
}
$str.="      </select>\n    </td><td>\n      <input type=submit name=submit value=calc>\n    </td></tr>\n";
$str.="    <tr><th>Fach</th><th>Note</th><th>LP</th><th>Faktor</th><th>Gewicht</th></tr>\n";


$total_gewicht=0;
for($i=0; $faecher[$i] ; $i++){
  $total_gewicht += $faecher[$i][1] * $faecher[$i][2];
}

if(count($faecher) == 0){
  $str.="    <tr><td colspan=5>\n";
  $str.="      <i>Für diesen Studiengang wurden noch keine Module,<br />\n";
  $str.="      Leistungspunkte und Gewichtungen eingetragen.<br />\n";
  $str.="      Du kannst die Daten raussuchen und im <a href=\"https://www.fb18.de/mybb/showthread.php?tid=9878\">fb18</a> posten.</i>\n";
  $str.="    </td></tr>\n";
}

for($i=0; $faecher[$i] ; $i++)
{
        $preset = 0;
        if(array_key_exists($faecher[$i][0], $_REQUEST)){
            $preset = str_replace(",", ".", $_REQUEST[$faecher[$i][0]]);
        }
        $lp = $faecher[$i][1];
        $faktor = $faecher[$i][2];
        $gewicht = ($faktor * $lp);
        $str.="    <tr><td>".$faecher[$i][0]."</td><td><input name='".$faecher[$i][0]."' size='2' value='".$preset."'></td><td align=right>$lp</td><td align=right>$faktor</td><td align=right>$gewicht/$total_gewicht</td></tr>\n";
}
//$str.="    <tr><td colspan=3><input type=submit name=submit value=calc></td></tr>\n";

$grenzen = calc_range($faecher, $_REQUEST);

$str.="    <tr><td colspan=3>Beste moegliche Note</td><td align=right>".$grenzen['obere']."</td><td rowspan=3><input type=submit name=submit value=calc></td></tr>\n";
$str.="    <tr><td colspan=3>Schlechteste moegliche Note</td><td align=right>".$grenzen['untere']."</td></tr>\n";
$str.="    <tr><td colspan=3>Laufende Note</td><td align=right>".$grenzen['laufend']."</td></tr>\n";
$str.="    <tr><td colspan=5 align=center>[alle angaben - wie immer - ohne gewähr - feher<!--sic--></td></tr>\n";
$str.="    <tr><td colspan=5 align=center>und änderungswünsche kannst du im <a href=\"https://www.fb18.de/mybb/showthread.php?tid=9878\">fb18</a> posten]</td></tr>\n";
$str.="  </table>\n</form>\n</body></html>";

echo $str;

function calc_range($faecher, $notes)
{
    $gNotenBekannt=0;
    $gGewichtBekannt=0;
    $gesamtGewicht=0;
    
    for($i=0;$faecher[$i];$i++)
    {
        $gesamtGewicht+=($faecher[$i][1]*$faecher[$i][2]);
        $note = str_replace(",", ".", $notes[$faecher[$i][0]]);
        if($note>0)
        {
            $gNotenBekannt+=($note*$faecher[$i][1]*$faecher[$i][2]);
            $gGewichtBekannt+=($faecher[$i][1]*$faecher[$i][2]);
        }
    }    
    
    $grenzen=array(
                                obere=>0,
                                untere=>0,
                                laufend=>0
                                );
    if($gesamtGewicht != 0){
      $grenzen['obere']=round(($gNotenBekannt+($gesamtGewicht-$gGewichtBekannt)*1)/$gesamtGewicht, 2);
      $grenzen['untere']=round(($gNotenBekannt+($gesamtGewicht-$gGewichtBekannt)*4)/$gesamtGewicht, 2);
    }
    if($gGewichtBekannt != 0){
      $grenzen['laufend']=round($gNotenBekannt/$gGewichtBekannt, 2);
    }
    //print_r($grenzen);
    //echo $gNotenBekannt.';'.$gGewichtBekannt.';'.$gesamtGewicht;
    return $grenzen;
}

Implementierung[Bearbeiten]