Informatik Material Portal Portfolio Präsentation Grafik Tabellenkalkulation Informatik56 9 10 11 12 13 Messen, Steuern, Regeln Linux Theorie Didaktik Open Source Spiele Wettbewerbe Netzbetreuung intern Literatur Links Energie corewar UNIX/Linux
Pfad: Startseite / Fächer / Informatik
Autor: be
21.09.2005 10:52
516

Punkteverteilung - Lösung

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.