Notenberechnung: Unterschied zwischen den Versionen

Aus Fachschaft_Informatik
Zur Navigation springen Zur Suche springen
Keine Bearbeitungszusammenfassung
K (Bot: Kosmetische Änderungen)
 
(6 dazwischenliegende Versionen von 5 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
== Diplom ==
=== Beschreibung ===
Für Diplomer berechnet sich die Endnote wie folgt:
Für Diplomer berechnet sich die Endnote wie folgt:


Zeile 11: Zeile 13:
Dasselbe Verfahren kommt für die Berechnung der Endnote zur Anwendung.
Dasselbe Verfahren kommt für die Berechnung der Endnote zur Anwendung.


Beispiel:
=== Beispiel ===
* Grundlagen von Informatiksystemen
* Grundlagen von Informatiksystemen
** Technische Informatik - DKR - 2.3
** Technische Informatik - DKR - 2.3
Zeile 40: Zeile 42:
* Endnote (2.6 + 1.9 + 2.3 + 3.1 + 1.8) / 5 = 11.7/5 = 2.34000 = 2.3
* Endnote (2.6 + 1.9 + 2.3 + 3.1 + 1.8) / 5 = 11.7/5 = 2.34000 = 2.3


=== Textform ===
Am Ende wird diese numerische Endnote noch in Textform übersetzt:
Am Ende wird diese numerische Endnote noch in Textform übersetzt:
* 1.0 bis 1.0 - ausgezeichnet
* 1.0 bis 1.0 - ausgezeichnet
Zeile 48: Zeile 51:




Implementierung:
=== Implementierung ===
==== Calc ====
 
Ein Spreadsheet mit einem Chart, dass die Spreizung der moeglichen Note zeigt, gibt es hier: [[Medium:DPO98-Noten-Chart.ods]]
==== Perl ====
<code>
<code>
  #!/usr/bin/perl
  #!/usr/bin/perl
Zeile 71: Zeile 78:
  );
  );
   
   
  print "$endnote\n";
  print "$endnote (".('ausgezeichnet','sehr gut','gut','befriedigend','ausreichend')[int((int((int($endnote * 10) - 6) / 5) * 3 + 4) / 5)].")\n";
</code>
</code>
==== Python ====
<pre>
#!/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)
</pre>
== Bachelor ==
=== Beschreibung ===
FIXME!
=== Beispiel ===
==== PHP ====
<pre>
<?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;
}
</pre>
=== Implementierung ===
* Quelle: https://www.fb18.de/mybb/showthread.php?tid=9878
* 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]