Der manuell geschriebene Quelltext ist blau hervorgehoben.
unit mPunkteverteilung;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
edMax: TEdit;
Label1: TLabel;
memNoten: TMemo;
memPunkte: TMemo;
memIntervalle: TMemo;
btOK: TButton;
edPunkte: TEdit;
Label2: TLabel;
edNote: TEdit;
btNote: TButton;
procedure btOKClick(Sender: TObject);
procedure btNoteClick(Sender: TObject);
private
{ Private-Deklarationen }
verteilung: Array[1..6] of Integer;
function note(punktzahl: Integer): Integer;
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btOKClick(Sender: TObject);
var i, anzahl, rest: Integer;
zeile: String;
begin
// Löschen der Memofelder
memNoten.Lines.Clear;
memPunkte.Lines.Clear;
memIntervalle.Lines.Clear;
// Eingabe einlesen (maximale Punktzahl +1 wegen der Null)
anzahl := StrToInt(edMax.Text) + 1;
// Array füllen für Noten 1 bis 4
for i:=1 to 4 do
verteilung[i] := Trunc(anzahl*15/100);
// Array füllen für Noten 5 und 6
for i:=5 to 6 do
verteilung[i] := Trunc(anzahl*20/100);
// Restpunkte zählen
rest := anzahl;
for i:=1 to 6 do
Dec(rest,verteilung[i]);
// Restpunkte verteilen
for i:=1 to rest do
Inc(verteilung[i]);
// Ausgabe
Dec(anzahl);
for i:=1 to 6 do
begin
// Ausgabe der Noten
memNoten.Lines.Add(IntToStr(i));
// Ausgabe der Punktzahlen pro Note
memPunkte.Lines.Add(IntToStr(verteilung[i]));
// Ausgabe der Intervalle
zeile := IntToStr(anzahl) + ' - ';
Dec(anzahl,verteilung[i]-1);
zeile := zeile + IntToStr(anzahl);
memIntervalle.Lines.Add(zeile);
Dec(anzahl);
end;
end;
procedure TForm1.btNoteClick(Sender: TObject);
var punkte: Integer;
begin
punkte := StrToInt(edPunkte.Text);
edNote.Text := IntToStr(note(punkte));
end;
function TForm1.note(punktzahl: Integer): Integer;
var i, max: Integer;
begin
// Welche Note entspricht der punktzahl?
i := 6;
max := verteilung[6]-1;
while punktzahl > max do
begin
Dec(i);
Inc(max,verteilung[i])
end;
note := i;
end;
end.