Delphi-PRAXiS

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.

dummzeuch 4. Nov 2020 11:10

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.

Das ist immernoch falsch (und ich hatte es im Original übersehen):

Korrekt ist
Delphi-Quellcode:
for i := 1 to 6 do

Denn der Index des Arrays ist ja als 1 bis 6 deklariert und nicht 0 bis 5 oder 0 bis 6:
Delphi-Quellcode:
var
  ArrayNoten: array[1..6] of Int32;
oder, wie Rollo62 schon schrieb:
Delphi-Quellcode:
for i := Low(ArrayNoten) to High(ArrayNoten) do

Dann setzt der Compiler die korrekten Werte automatisch ein.

Das Length(Array)-1 braucht man nur dann, wenn man das Array dynamisch alloziert, denn dann beginnt der Index immer bei 0, das letzte Element ist also bei Length(Array)-1:
Delphi-Quellcode:
var
  ArrayNoten: array of Int32;
begin
  SetLength(ArrayNoten, 6);
  for i := 0 to Length(ArrayNoten)-1 do
Auch in diesem Fall funktioniert Low und High.

Tipp: Es empfiehlt sich bei den Compiler-Optionen im Debug-Modus Overflow Checking und Range Checking zu aktivieren. Dann hätte es nämlich einen Laufzeitfehler gegeben, weil Du auf einen ungültigen Array-Index zugreifst.

Rollo62 4. Nov 2020 11:26

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

Zitat von dummzeuch (Beitrag 1476657)
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.

Das ist immernoch falsch (und ich hatte es im Original übersehen):

Ja stimmt, ich bin von 0...6 ausgegangen, war ja 1..6 im ersten Teil:
Delphi-Quellcode:
ArrayNoten: array[1..6] of Int32;


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:04 Uhr.

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