Einzelnen Beitrag anzeigen

Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#10

AW: Arrays mit Integer-Variablen

  Alt 17. Nov 2013, 16:44
Hallo,

Zitat:
Was sind private declarations?
OOP kennt unterschiedliche Zugriffs- bzw. Sichtbarkeitsdeklarationen für Eigenschaften und Methoden innerhalb einer Klasse. Schön beschrieben (wie auch von Frank schon verlinkt) ist es z. B. hier und etwas ausführlicher hier

Zitat:
Wie kann die Prozedur Reset ausgeführt werden, wenn das Ausführen in Button1 gar nicht erwähnt wird?
Na ja, es ist schon möglich die Methode Reset in Button1Click aufzurufen. Dazu müsste allerdings geprüft werden, ob das Ende der Spielrunde erreicht ist. Also irgendwie so:
Delphi-Quellcode:
if FCurrentExercise > FMaxExercises then
  Reset
Wobei FMaxExcerises der Anzahl an Übungsrunden entspräche. Einfacher ist es doch die Methode im OnClick-Ereignis der Schaltfläche "Los" abzuarbeiten.

Zitat:
Kann ich ohne Probleme das Rechenzeichen, also * mit einer Variable Zufällig duch +, -, DIV austauschen?
Klar geht das. Dazu eignet sich z. B. Aufzählungstypen (oder ein Konstanten-Array) und Random. Also als Ansatz z. B. so (ist nicht getestet, nur im Notepad runtergetippt):
Delphi-Quellcode:
type
  TOperator = (opPlus, opMult, opMinus, opDiv);

  TForm1 = class (TForm)
    edtResidual : TEdit; // Die Eingabemöglichkeit für den Divisionsrest. Müsstest Du halt noch auf Deinem Form einfügen
    procedure FormCreate (Sender : TObject);
    procedure Button1Click (Sender : TObject);
    procedure Button2Click (Sender : TObject); // Der Button mit der Beschriftung "Los"
  private
    FCorrectAnswers : Integer;
    FCurrentExercise : Integer;
    FCurrentOperator : TOperator;
    FMaxExcerises : Integer;
    procedure DoAddUp;
    procedure DoDevide;
    procedure DoMultiply;
    procedure DoSubtract;
    procedure InitExercise;
    procedure InitOperator;
    procedure Reset;
  end;

implementation

procedure TForm1.FormCreate (Sender : TObject);
begin
  Reset
end;

procedure TForm1.Button1Click (Sender : TObject);
begin
  case FCurrentOperator of
    opPlus : DoAddUp;
    opMult : DoMultiply;
    opMinus : DoSubstract;
    opDiv : DoDivide;
  end;

  panel5.caption := IntToStr (FCorrectAnwsers);
  
  Inc (FCurrentExercise);
  if FCurrentExercise <= FMaxExcerises then
    InitExercise
end;

procedure TForm1.Button2Click (Sender : TObject);
begin
  Reset;
  InitExercise
end;

procedure TForm1.DoAddUp;
var
  a, b, c : Integer;
begin
  a := StrToInt (zahla.Caption);
  b := StrToInt (zahlb.Caption);
  c := StrToInt (zahlc.Caption);
  if a + b = c then
    Inc (FCorrectAnwsers)
end;

// Hier mal ganzzahlige Division mit Rest
procedure TForm1.DoDevide;
var
  a, b, c, r : Integer;
begin
  a := StrToInt (zahla.Caption);
  b := StrToInt (zahlb.Caption);
  c := StrToInt (zahlc.Caption);
  r := StrToInt (edtResidual.Text);
  if (a div b = c) and (a mod b = r) then
    Inc (FCorrectAnwsers)
end;

procedure TForm1.DoMultiply;
var
  a, b, c : Integer;
begin
  a := StrToInt (zahla.Caption);
  b := StrToInt (zahlb.Caption);
  c := StrToInt (zahlc.Caption);
  if a * b = c then
    Inc (FCorrectAnwsers)
end;

procedure TForm1.DoSubtract;
var
  a, b, c : Integer;
begin
  a := StrToInt (zahla.Caption);
  b := StrToInt (zahlb.Caption);
  c := StrToInt (zahlc.Caption);
  if a - b = c then
    Inc (FCorrectAnwsers)
end;

procedure TForm1.InitExercise;
begin
  zahla.Caption := IntToStr (Random (area_n));
  zahlb.Caption := IntToStr (Random (area_n));
  zahlc.Caption := '';
  edtResidual.Text := '';
  InitOperator;
  FMaxExcerises := // hier muss noch die Zuweisung Deiner Komponente Anzahl Runden gemacht werden
end;

procedure TForm1.InitOperator;
begin
  FCurrentOperator := TOperator (Random (4));
  case FCurrentOperator of
    opPlus : PanelX.Caption := '+'; // kann nicht erkennen von welchem Typ die Komponente ist und wie sie heißt
    opMult : PanelX.Caption := '*';
    opMinus : PanelX.Caption := '-';
    opDiv : PanelX.Caption := '/';
  end
end;

procedure TForm1.Reset;
begin
  FCorrectAnswers := 0;
  FCurrentExercise := 1
end;
Vielleicht kannst Du was damit anfangen. Die Methode DoDevide kannst Du natürlich auch mit fixen Kommastellen (z. B. auf 4 Stellen genau) im Ergebnis umschreiben (so zur Übung).

Zitat:
Muss ich die andere Methode aufgeben?
Musst Du natürlich nicht! Für mich wäre es allerdings der Ansatz: Warum einfach, wenn es auch umständlich geht.

Zitat:
Also wäre die andere Methode zu kompliziert für mich? Sinn und Zweck ist ja, dass ich Übung bekommen will.
Wenn Du mit Arrays (statisch und dynamisch) Übung bekommen willst, dann versuch Dich doch mal an den Klassikern; implementier zur Übung mal verschiedene Sortierverfahren (zunächst statisch, danach mit dynamischen Arrays).

Gruß
Volker Zeller
  Mit Zitat antworten Zitat