AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Arrays mit Integer-Variablen

Ein Thema von joelnbp · begonnen am 16. Nov 2013 · letzter Beitrag vom 18. Nov 2013
Antwort Antwort
Seite 1 von 2  1 2   
joelnbp

Registriert seit: 16. Mär 2013
Ort: Berlin, Berlin
9 Beiträge
 
FreePascal / Lazarus
 
#1

Arrays mit Integer-Variablen

  Alt 16. Nov 2013, 13:23
Delphi-Version: 5
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.270 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Arrays mit Integer-Variablen

  Alt 16. Nov 2013, 13:35
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (16. Nov 2013 um 13:54 Uhr)
  Mit Zitat antworten Zitat
joelnbp

Registriert seit: 16. Mär 2013
Ort: Berlin, Berlin
9 Beiträge
 
FreePascal / Lazarus
 
#3

AW: Arrays mit Integer-Variablen

  Alt 16. Nov 2013, 22:54
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
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.304 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Arrays mit Integer-Variablen

  Alt 16. Nov 2013, 23:00
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
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
joelnbp

Registriert seit: 16. Mär 2013
Ort: Berlin, Berlin
9 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Arrays mit Integer-Variablen

  Alt 17. Nov 2013, 00:42
Also:
Ihr seid echt super! Voller Verzweiflung habe ich wieder Hoffnung!
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?

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

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;
Miniaturansicht angehängter Grafiken
screenshot-32-.jpg  
  Mit Zitat antworten Zitat
Volker Z.

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

AW: Arrays mit Integer-Variablen

  Alt 17. Nov 2013, 02:48
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;
Volker Zeller
  Mit Zitat antworten Zitat
joelnbp

Registriert seit: 16. Mär 2013
Ort: Berlin, Berlin
9 Beiträge
 
FreePascal / Lazarus
 
#7

AW: Arrays mit Integer-Variablen

  Alt 17. Nov 2013, 10:31
Dankeschön erstmal!
Ich habe jetzt das Projekt erstmal dupliziert, und den Quellcode angepasst eingefügt.
Und ja: Ich bin Anfänger .
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!!

Geändert von joelnbp (17. Nov 2013 um 10:33 Uhr)
  Mit Zitat antworten Zitat
Perlsau
(Gast)

n/a Beiträge
 
#8

AW: Arrays mit Integer-Variablen

  Alt 17. Nov 2013, 12:55
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
  Mit Zitat antworten Zitat
joelnbp

Registriert seit: 16. Mär 2013
Ort: Berlin, Berlin
9 Beiträge
 
FreePascal / Lazarus
 
#9

AW: Arrays mit Integer-Variablen

  Alt 17. Nov 2013, 14:56
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
  Mit Zitat antworten Zitat
Volker Z.

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

AW: Arrays mit Integer-Variablen

  Alt 17. Nov 2013, 17: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
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 16:56 Uhr.
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