Entwickler-Ecke

Sonstiges (Delphi) - Probl. Noten mit Random erzeugen im Array mit such funktion


SkyX - Mo 01.02.10 12:58
Titel: Probl. Noten mit Random erzeugen im Array mit such funktion
Hallo Liebes Delphi Forum,
Also ich bin gerade dabei bisschen mit einem Dynamischen Array zu üben mit Suchfunktion.
Das Programm selber funktioniert so:
- Eingabe der Anzahl der Noten die erzeugt werden sollen
- Klick auf Noten erzeugen(1-6) und sollen in eine Liste eingetragen werden.
- eingabe der gesuchten Zahl
- Suchen Klick soll in einer Showmessage Ausgeben wieviel mal diese Zahl gefunden wurde.

Erstes Problem das bisher auf tratt war ein Overlow. Ich weiß das es mit der Endschlosschelife zutun hat, jedoch komme ich nicht dahinter wieso es zu einem Overflow kommt.
Suchfunktion habe ich eine Lineare Suche eingebaut jedoch keien Ahnung wie er erkennen soll ob es doppelte oder mehrere Einträge geben soll.
Hier der Code
Oberfläche

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, {Variants,} Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls,klasse_oop;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    P_Out: TPanel;
    B_Schnitt: TButton;
    B_Noten: TButton;
    B_Anzahl: TButton;
    E_Anzahl: TEdit;
    su_in: TEdit;
    suche: TButton;
    procedure B_NotenClick(Sender: TObject);
    procedure B_SchnittClick(Sender: TObject);
    procedure FormActivate(Sender: TObject);
    procedure B_AnzahlClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure sucheClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  Note : TNoten;


  implementation

{$R *.dfm}

procedure TForm1.B_AnzahlClick(Sender: TObject);
begin
  Note.SetAnzahl(StrToInt(E_Anzahl.Text));
end;


procedure TForm1.B_NotenClick(Sender: TObject);
Var i : Integer;
begin

    ListBox1.Clear;
    Note.Noten;
    for i:= 1 to (Note.GetAnzahl) do
    Listbox1.Items.Add(IntToStr(Note.GetNoten(i)));

end;


procedure TForm1.B_SchnittClick(Sender: TObject);
begin
Note.schnitt;
P_Out.Caption:=FloatToStr(Note.Getdurchschnitt);
end;


procedure TForm1.FormActivate(Sender: TObject);
begin
  randomize;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Note := TNoten.Create;
end;

procedure TForm1.sucheClick(Sender: TObject);
begin
Note.SetSuche(StrToInt(su_in.Text));
Note.Suche;
Showmessage(Note.GetMeldung);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
note.Destroy;
end;

end.

OOP

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
unit klasse_oop;

interface

type

 TNoten = class (TObject)
   private
     FAnzahl : integer;
     FNoten : array of integer;
     FSchnitt : double;
     FSuche : integer;
     FMeldung: String;
   public
     constructor create;
     procedure Noten;
     procedure schnitt;
     procedure Suche;
     procedure SetAnzahl(A:integer);
     procedure SetSuche(S:integer);
     function Getdurchschnitt:double;
     function GetNoten(i:integer): integer;
     function GetAnzahl:integer;
     function GetMeldung:string;

end;

implementation

constructor TNoten.create;
begin
  inherited create;

end;

procedure TNoten.schnitt;
var Summe,i: integer;
begin
  summe := 0;
  For i:= 1 to FAnzahl do summe := (summe + FNoten[i]);
  FSchnitt := summe/FAnzahl;
end;

procedure TNoten.Noten;
var i : integer;
begin
SetLength(FNoten,FAnzahl);
   for i:=1 to FAnzahl do
    begin
      FNoten[i] := random(6)+1;
    end;
end;

procedure TNoten.SetAnzahl(A:integer);
begin
  FAnzahl:= A;

end;

function TNoten.Getdurchschnitt:double;
begin
 result:= FSchnitt;
end;

function TNoten.GetNoten(i:integer):integer;
begin
  result:= FNoten[i];
end;

function TNoten.GetAnzahl: integer;
begin
  result:=FAnzahl;
end;

procedure TNoten.SetSuche(S:integer);
begin
  FSuche:=S;
end;

function TNoten.GetMeldung:string;
begin
 result:= FMeldung;
end;

procedure TNoten.Suche;
var i: integer;
begin
  FMeldung:= 'false';
  i:=0;
  repeat
  if FNoten[i] = FSuche then FMeldung:= 'true';
  inc(i);
  until {(result= true)}   (i=FAnzahl);
end;

end.


Bin noch in den Anfängen was Delphi angeht, jedoch komme ich schon teilweiße sehr gut zurecht.
Danke SkyX

PS.
bin gerade selber drauf gekommen=
ein Array fängt ja bei 0 an jedoch haben meine schleifen bei 1 angefangen und haben falsch runtergezählt:

Delphi-Quelltext
1:
for i:= 0 to (Note.GetAnzahl)-1 do                    


martin300 - Mo 01.02.10 17:00

Hallo,
nur ein Beispiel wie die suche nach gleichen Noten gemacht werden könnte:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
procedure TForm1.Button1Click(Sender: TObject);
const
  SchulNotenArray : array[0..16of Integer = (1,1,2,1,2,1,3,2,3,4,5,5,5,4,5,3,1);
var
  Note : Integer;
  i : Integer;
  Treffer : Integer;
begin
  // Input: Array von Integer, Note die gesucht wird
  // Output: Anzahl der Vorkommnisse der gesuchten Note
  Treffer := 0;
  Note := 2;

  // Bestimme Anzahl der gleichen Noten
  for i := 0 to length(SchulNotenArray) do
  begin
    if SchulNotenArray[i] = Note then
    begin
      //Treffer
      Treffer := Treffer +1;
    end;
  end;

  // Ausgabe
  Showmessage(inttostr(Treffer));
end;