Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Arrays mit Integer-Variablen (https://www.delphipraxis.net/177617-arrays-mit-integer-variablen.html)

joelnbp 16. Nov 2013 13:23

Delphi-Version: 5

Arrays mit Integer-Variablen
 
Hallo,

ich bin neu hier im Forum und hoffe, dass ich alles richtig mache :).

Zu meinem Problem:

Ich programmiere jetzt ein Jahr mit Lazarus kleinere Dinge, wie Ampeln, Timer, und BMI Rechner.
Doch jetzt komme ich langsam an meine Grenzen:

Ein Rechentrainer mit den für mich neuem Integer Zeug und so :).

Code:
procedure TForm1.Button1Click(Sender: TObject);
var
  result_a: array[(round_i)] of integer;
  i:integer;
begin
  for i := 1 to round_i do begin
  result_a[i]:= a*b;
  if (c = reuslt_a[i]) then //result_a:= richtig

end;
  end;
Hier soll nun folgendes passieren:
round_i ist die Anzahl der Runden (Aufgaben), welche ja auch bestimmen soll, wie groß der/das Array sein soll, und ist deshalb als Integer festgelegt.
Nun soll beim klicken das Ergebnis mit der Eeingabe c verglichen werden, und wenn richtig soll das im result_a[1] hinterlegt werden. Beim nächsten klicken (bei der nächsten Aufgabe) erneut. Diesmal soll das Ergebnis aber in result_a[2] hinterlegt werden. Und so weiter. Wie mache ich das? SO kommt es nämlich zu einer Fehlermeldung.
Und wie kann ich
Code:
zahla.caption:=IntToStr(Random(area_n));
  zahlb.caption:=IntToStr(Random(area_n));
passend in die Schleife einfügen?

Ich bin sehr dankbar, für Hilfe!!
Liebe Grüße Joel
PS ich hoffe, ich habe mein Problem richtig geschildert! Ich kann auch den ganzen Quelltext einfügen :).
und ich nutze Lazarus :)

DeddyH 16. Nov 2013 13:35

AW: Arrays mit Integer-Variablen
 
Zitat:

Zitat von joelnbp (Beitrag 1236217)
SO kommt es nämlich zu einer Fehlermeldung.

Tipp für die Zukunft: diese Meldung nicht verschweigen. round_i dürfte eine Variable sein, daher dürfte der Fehler rühren. Der Compiler muss für statische Arrays nämlich bereits zur Designzeit die tatsächliche Größe kennen, was bei einem variablen Wert ja nicht gegeben ist. Das Einfachste wäre daher IMO, auf ein dynamisches Array umzustellen, das kann man nämlich zur Laufzeit dimensionieren.
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  result_a: array of integer;
  i:integer;
begin
  SetLength(result_a, round_i);
  for i := Low(result_a) to High(result_a) do begin
    result_a[i]:= a*b;
    if (c = result_a[i]) then //result_a:= richtig
      (* Code *);
  end;
end;

joelnbp 16. Nov 2013 22:54

AW: Arrays mit Integer-Variablen
 
Dankeschön! Das hat mit erstmal echt geholfen!!

Aber wie kann ich die Anzahl der richtigen Ergebnisse zusammenzählen? Also dann:
Delphi-Quellcode:
for i := Low(result_a) to High(result_a) do begin
    result_a[i]:= a*b;
    if (c = result_a[i]) then result_a[1]=r //nächste Runde dann result_a[2]
    ;
  end;
  richtige_loesungen.caption:= count result_a //nach r durchsuchen

Helmi 16. Nov 2013 23:00

AW: Arrays mit Integer-Variablen
 
Hallo,

du brauchst noch eine Variable:

Delphi-Quellcode:
var
  Counter: Integer;

{...}

Counter := 0;

for i := Low(result_a) to High(result_a) do
  begin
    result_a[i]:= a*b;
    if (c = result_a[i]) then
      begin
        result_a[1]=r; //nächste Runde dann result_a[2]
        inc(Counter);
      end;
  end;
richtige_loesungen.caption:= IntToStr(Counter); //nach r durchsuchen

joelnbp 17. Nov 2013 00:42

AW: Arrays mit Integer-Variablen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also:
Ihr seid echt super! Voller Verzweiflung habe ich wieder Hoffnung! :D
Das Programm lässt sich endlich kompilieren!

Wie man auf dem Bild hoffentlich sieht, wird bei richtiger Eingabe gesagt, man hätte alle Aufgaben richtig. Wenn die Eingabe falsch ist, so sind 0 Aufgaben richtig. Also das Array result_a "resettet" sich nach jeder Aufgabe. So wird dann nicht +1 gerechnet, sodass man nicht weiß wie viele Aufgaben richtig sind. Wiso?:cry:

Ebenso sieht man nicht, welche Aufgabe Aktuell ist. Der Wert besteht aus der Anzahl der Aufgaben -1. Wiso?:cry:

Und Dankeschön! Ich schätze eure Hilfe sehr!!
Hier die Prozedur des Eingabe-Buttons:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  result_a: array of integer;
  i:integer;
  Counter: Integer;
begin
  a:= StrToInt(zahla.caption);
  b:= StrToInt(zahlb.caption);
  c:= StrToInt(zahlc.text);
  round_i:= StrToInt(round.text);
  zahla.caption:=IntToStr(Random(area_n));
  zahlb.caption:=IntToStr(Random(area_n));
  Counter := 0;

  SetLength(result_a, round_i);
  for i := Low(result_a) to High(result_a) do
    begin
        panel7.caption:=IntToStr(i);
      result_a[i]:= a*b;
      if (c = result_a[i]) then
        begin
          result_a[i]:=1;
          inc(Counter);
        end;
    end;
  panel5.caption:= IntToStr(Counter);
  end;

Volker Z. 17. Nov 2013 02:48

AW: Arrays mit Integer-Variablen
 
Hallo,

ich könnte jetzt lang ausholen und versuchen Dir zu erklären wieso, warum und weshalb es mit Deinem Code nicht so recht klappen mag (wenn es Dich interessiert: Detailfragen gerne per PN).
Da ich Deinen Kenntnisstand nun eher als "Anfänger" einschätze (das ist jetzt keineswegs geringschätig gemeint) wäre die Antwort u. U. recht langatmig (ggf. auch unverständlich), daher lass ich es mal lieber bleiben.

Ich denke Du machst Dir das Leben nur unnötig schwer. Versuch es doch mal so (nur was noch nicht in Deinem Projekt vorhanden ist ergänzen):
Delphi-Quellcode:
type
  TForm1 = class(TForm)
    procedure FormCreate (Sender : TObject);
    procedure Button1Click (Sender : TObject);
  private
    FCorrectAnswers : Integer;
    FCurrentExercise : Integer;
    procedure Reset;
  end;

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

procedure TForm1.Button1Click (Sender : TObject);
begin
  // Hier ggf, noch prüfen, ob wirklich FCurrentExercise <= Maximun (SpinEdit Runden)
  if StrToInt (zahla.Caption) * StrToInt (zahlb.Caption) = StrToInt (zahlc.Caption) then
    Inc (FCorrectAnwsers);

  Inc (FCurrentExercise);
  // Hier noch die Ausgabe aktualisieren FCorrectAnwsers of FCurrentExercise
  panel5.caption := IntToStr (FCorrectAnwsers);
  zahla.Caption := IntToStr (Random (area_n));
  zahlb.Caption := IntToStr (Random (area_n))
end;

// Reset wird immer dann aufgerufen, wenn eine neu Runde beginnt (Button Los)
procedure TForm1.Reset;
begin
  FCorrectAnswers := 0;
  FCurrentExercise := 1
end;

joelnbp 17. Nov 2013 10:31

AW: Arrays mit Integer-Variablen
 
Dankeschön erstmal!
Ich habe jetzt das Projekt erstmal dupliziert, und den Quellcode angepasst eingefügt.
Und ja: Ich bin Anfänger :D.
Also wäre die andere Methode zu kompliziert für mich? :) Sinn und Zweck ist ja, dass ich Übung bekommen will.
Aber das hat mich wie gesagt an meine Grenzen gebracht :).

Also: Für mein Verständnis habe ich nochmal nen Paar Fragen:
  • Was sind private declarations?
  • Wie kann die Prozedur Reset ausgeführt werden, wenn das Ausführen in Button1 gar nicht erwähnt wird?
  • Kann ich ohne Probleme das Rechenzeichen, also * mit einer Variable Zufällig duch +, -, DIV austauschen? Wobei mir einfällt, dass die Division ein wenig aufwendiger ist, damit das noch ein normaler Mensch rechnen kann, oder?
  • Muss ich die andere Methode aufgeben? :)

Ansonsten: Funktioniert es jetzt erstmal, und dafür bin ich euch, besonders dir V. Zeller, sehr sehr dankbar!!

Perlsau 17. Nov 2013 12:55

AW: Arrays mit Integer-Variablen
 
Alle diese Fragen kannst du dir leicht selbst beantworten, indem du ein entsprechendes Grundlagen-Tutorial durcharbeitest. Besser wäre es natürlich, wenn du dir nacheinander verschiedene Tutorials vornimmst und die gewissenhaft und geduldig Schritt für Schritt durchgehst.

Hier gibt es Grundlagen-Tutorials.
Auch die Uni Leipzig bietet ein Delphi-Tutorial.
Es gibt sogar ein entsprechendes Wikibook.
... und noch viel mehr via Google zu erkunden.

Viel Erfolg :thumb:

joelnbp 17. Nov 2013 14:56

AW: Arrays mit Integer-Variablen
 
Dankeschön erstmal an:
  • DeddyH
  • Helmi
  • Volker Z.
  • Perlsau

So klapp es ja erstmal, was ich eurer Hilfe zu verschaffen habe!
Dankeschön (:
LG, Joel

Volker Z. 17. Nov 2013 17:44

AW: Arrays mit Integer-Variablen
 
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ß


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:03 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf