Mo Logo [Home] [Lexikon] [Aufgaben] [Tests] [Kurse] [Begleitmaterial] [Hinweise] [Mitwirkende] [Publikationen]

Mathematik-Online-Aufgabensammlung: Lösung zu

Aufgabe 1512: Klausurauswertung


A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

Erzeugen Sie aus einer Strukturliste Studierende mit den Feldern Name und Matrikelnummer und einer Strukturliste Klausur mit den Feldern Name und Punkte (Vektor mit Punkten der einzelnen Aufgaben) eine Matrix, in der jede Zeile die Matrikelnummer und die Note eines Studierenden enthält, der an der Klausur teilgenommen hat.

Dabei soll eine 1.0 (4.0) ab 95% (40%) der maximal erreichten Punktzahl vergeben werden. Die Punktzahlen für die dazwischenliegenden Noten (1.3,1.7,2.0,...,3.7) sollen linear interpoliert werden.

Mit dem Programm Listen.m können Sie Listen zum Testen erzeugen lassen (Die darin verwendeten Namen entstammen der alphabetischen Liste von ,,The MacTutor History of Mathematics``, zu finden unter http://www-history.mcs.st-andrews.ac.uk/history/index.html).


Die erste Version berechnet die Ausgabe mit Hilfe von sortierten Einzellisten und einer Schleife:


% nach Namen sortieren
[tmp, ind] = sort({Studierende(:).Name});
Studierende = Studierende(ind);
[tmp, ind] = sort({Klausur(:).Name});
Klausur = Klausur(ind);

% Klausurteilnehmer in Studentenliste finden 
% Matrikelnummer und Punktesumme in Vektoren schreiben 
k_S = 1; 
for k=1:length(Klausur);
   while ~strcmp(Studierende(k_S).Name, ... 
      Klausur(k).Name)
      k_S = k_S + 1;
   end;
   MatNr(k) = Studierende(k_S).Matrikelnummer;
   Pkt(k) =  sum(Klausur(k).Punkte);
   k_S = k_S + 1;
end;

% Notengrenzen bestimmen 
p4 = .4*max(Pkt); p1 = .95*max(Pkt); 

% Notenindex berechnen (1: 1.0, ..., 11: 5.0) 
NotenIndex = ceil(1+9*(Pkt-p1)/(p4-p1));

% Korrektur der Randfälle
NotenIndex( NotenIndex < 1 ) = 1;
NotenIndex( NotenIndex >= 11 ) = 13;

% Noten berechnen und ausgeben
Pkt = round( (20+NotenIndex*10) / 3)/10;
Erg=[MatNr,Pkt];
fprintf('%7d %3.1f\n', sortrows(Erg)');

Die zweite Version der berechnet die Ausgabe durch aneinanderhängen der Namenslisten ohne Schleife:


% Daten erzeugen
[Studierende,Klausur]=Listen(100,10*ones(1,5));

% Anzahl von Studierenden, Teilnehmer der Klausur und Aufgaben
Anz_S=length(Studierende);
Anz_K=length(Klausur);
Anz_A=length(Klausur(1).Punkte);

% Namen aneinanderhängen und sortieren
[S_Liste,index]=sortrows(strvcat({Studierende(:).Name,Klausur(:).Name}));

% Doppelte Namen haben an der Klausur teilgenommen
doppelt=find(sum(abs(diff(S_Liste)),2)==0);

% Matrikelnummern aus Studierendenfeld holen
Ergebnisse(1:Anz_K,1)=[Studierende(index(doppelt(:))).Matrikelnummer];

% Punkte aus Klausurfeld holen richtig umsortieren und aufsummieren
Pkt=sum(reshape([Klausur(index(doppelt(:)+1)-Anz_S).Punkte],Anz_A,Anz_K));

% Notengrenzen bestimmen 
p4 = .4*max(Pkt); p1 = .95*max(Pkt); 

% Notenindex berechnen (1: 1.0, ..., 11: 5.0) 
Notenindex = ceil(1+9*(Pkt-p1)/(p4-p1));

% Korrektur der Randfälle
Notenindex( Notenindex < 1 ) = 1;
Notenindex( Notenindex >= 11 ) = 13;

% Noten berechnen und ausgeben
Ergebnisse(:,2) = round( (20+NotenIndex*10) / 3)/10;
fprintf('%7d %3.1f\n', sortrows(Ergebnisse)');


[Zurück zur Aufgabe]

  automatisch erstellt am 4.  5. 2007