Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Notendurchschnitt berechnen und Initialisierung eines Array of integer (https://www.delphipraxis.net/205956-notendurchschnitt-berechnen-und-initialisierung-eines-array-integer.html)

EdAdvokat 3. Nov 2020 16:31


Notendurchschnitt berechnen und Initialisierung eines Array of integer
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
ich wollte eigentlich eine ganz einfache Notendurchschnittsberechnung mit einem Array of integer programmieren, doch ich bekomme
es einfach nicht hin.
An der Stelle der ersten Summenbildung ist das ArrayNoten[i] vermutlich nicht initialisiert und gibt daher irgendwelche Zufallszahlen aus
und verfälscht damit das Ergebnis.
Wie kann ich das ArrayNoten[i] initialisieren oder liegt der Fehler ganz wo anders?
Beim Suchen nach Initialisierung von Array of integer fand ich folgende Lösung:
FillChar(ArrayNoten, SizeOf(ArrayNoten), 0);
Aber wo muss ich diese Initialisierung in mein Programm einbauen, damit es funktioniert?
So wie es jetzt ist geht es nicht.
Das vollständige Programm liegt bei.

Delphi-Quellcode:
procedure TForm1.btn3Click(Sender: TObject);
var i, sum, anz : Integer;
    Durchschnitt : Extended;
    ArrayNoten: array[1..6] of Int32;

begin
  sum:=0;
  Durchschnitt:=0;
  anz:=0;

  //FillChar(ArrayNoten, SizeOf(ArrayNoten), 0); //Initialisierung Array

  for i := 0 to length(ArrayNoten) - 1 do
  //for I := (Low(ArrayNoten)) to (High(ArrayNoten))-1 do

    begin
      ArrayNoten[1]:=(strtoint(edt1.text));  //1
      ArrayNoten[2]:=(strtoint(edt2.text));  //2
      ArrayNoten[3]:=(strtoint(edt3.text));  //4
      ArrayNoten[4]:=(strtoint(edt4.text));  //1
      ArrayNoten[5]:=(strtoint(edt5.text));  //1
      ArrayNoten[6]:=(strtoint(edt6.text));  //1
      sum:= sum + ArrayNoten[i];
    end;
    anz:=SumInt(ArrayNoten);
    Durchschnitt:= sum / anz;
    lblDurchsch.Caption:=floattostr(Durchschnitt);
end;

mmw 3. Nov 2020 16:50

AW: Notendurchschnitt berechnen und Initialisierung eines Array of integer
 
hallo,

hilft das hier

System.Math.Mean

gruß

Jumpy 3. Nov 2020 16:59

AW: Notendurchschnitt berechnen und Initialisierung eines Array of integer
 
Schau dir mal deine Schleife an, die macht ja keinen Sinn, denn du benutzt nirgendwo die Schleifenvariable i. Du berechnest in der Schleife sum usw... Die werden ja immer größer. und und und

dummzeuch 3. Nov 2020 17:16

AW: Notendurchschnitt berechnen und Initialisierung eines Array of integer
 
Zitat:

Zitat von EdAdvokat (Beitrag 1476610)

Delphi-Quellcode:
procedure TForm1.btn3Click(Sender: TObject);
var i, sum, anz : Integer;
    Durchschnitt : Extended;
    ArrayNoten: array[1..6] of Int32;

begin
  sum:=0;
  Durchschnitt:=0;
  anz:=0;

  //FillChar(ArrayNoten, SizeOf(ArrayNoten), 0); //Initialisierung Array

  for i := 0 to length(ArrayNoten) - 1 do
  //for I := (Low(ArrayNoten)) to (High(ArrayNoten))-1 do

    begin
      ArrayNoten[1]:=(strtoint(edt1.text));  //1
      ArrayNoten[2]:=(strtoint(edt2.text));  //2
      ArrayNoten[3]:=(strtoint(edt3.text));  //4
      ArrayNoten[4]:=(strtoint(edt4.text));  //1
      ArrayNoten[5]:=(strtoint(edt5.text));  //1
      ArrayNoten[6]:=(strtoint(edt6.text));  //1
      sum:= sum + ArrayNoten[i];
    end;
    anz:=SumInt(ArrayNoten);
    Durchschnitt:= sum / anz;
    lblDurchsch.Caption:=floattostr(Durchschnitt);
end;

Ich sehe da zwei Probleme:
  1. Du solltest die Zuweisungen auf ArrayNoten[] aus den Edit-Feldern vor die Schleife verschieben. Derzeit
    werden sie in der Schleife jedes Mal alle neu zugewiesen. Das ist aber nicht der Grund für den Fehler.
  2. sum soll doch die Summe aller Noten sein. Dann muss sie berechnet werden als:
    sum := sum + ArrayNoten[i]*i;
    Denn Du hast die Note i jeweils ArrayNoten[i] mal.
    Das ist der Grund für den Fehler.
FillChar ist nicht notwendig denn die Zuweisung erfolgt ja immer erst nach der Zuweisung auf das Array, damit ist es also initialisiert.

Benmik 3. Nov 2020 17:40

AW: Notendurchschnitt berechnen und Initialisierung eines Array of integer
 
Wozu brauchst du überhaupt ein Array? Auf dem Tablet getippt, daher rudimentär + ungetestet:
Delphi-Quellcode:
For i := 1 to 6 do
  Inc(sum,StrToInt(FindComponent('edt' + i.ToString).Text);
Durchschnitt := sum / 6;
Und falls es doch mit einem Array sein soll:
Delphi-Quellcode:
For i := Low(Notenarray) to High(Notenarray) do
  Notenarray[i] := StrToInt(FindComponent('edt' + i.ToString).Text);
For i := 1 to 6 do
  Inc(sum,Notenarray[i]);
Besser ist
Delphi-Quellcode:
1 to 6
, weil FindComponent darauf angewiesen ist.

EdAdvokat 3. Nov 2020 19:00

AW: Notendurchschnitt berechnen und Initialisierung eines Array of integer
 
Danke #dummzeuch.
Ich habe Deine Hinweise berücksichtigt und selbst noch einen weiteren Fehler gefunden.
Jetzt rechnet er den Notendurchschnitt exakt aus.
Ich habe die Schleife dahin verändert:
Delphi-Quellcode:
for i := 0 to length(ArrayNoten) do
also -1 weggelassen.
Auch den anderen vielen Dank für Eure Mühe.

Benmik 3. Nov 2020 19:09

AW: Notendurchschnitt berechnen und Initialisierung eines Array of integer
 
Aus Interesse: Wozu brauchst du das Array?

EdAdvokat 3. Nov 2020 19:17

AW: Notendurchschnitt berechnen und Initialisierung eines Array of integer
 
eigentlich brauche ich das array nicht. Es war lediglich eine mir selbst gestellte Aufgabe, die ich nur sehr schwerfällig lösen konnte.:oops:
Anders geht es natürlich auch und möglicherweise viel besser.

Rollo62 4. Nov 2020 10:16

AW: Notendurchschnitt berechnen und Initialisierung eines Array of integer
 
Zitat:

Zitat von EdAdvokat (Beitrag 1476627)
Ich habe die Schleife dahin verändert:
Delphi-Quellcode:
for i := 0 to length(ArrayNoten) do
also -1 weggelassen.

Warum ?
Wenn Du bei length(ArrayNoten) die -1 weglassen willst,
dann solltest Du besser Low(ArrayNoten) to High(ArrayNoten) schreiben.

Ohne -1 gibt es jetzt einen Überlauf 0,1,2,3,4,5,6 sind nämlich 7 Array-Zugriffe, und keine 6.

EdAdvokat 4. Nov 2020 10:27

AW: Notendurchschnitt berechnen und Initialisierung eines Array of integer
 
Danke #Rollo62: habe es auf Deinen Vorschlag hin geändert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:37 Uhr.
Seite 1 von 2  1 2      

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