Array auslesen und in case Bedingung nutzen

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Floriank67c
Beiträge: 2
Registriert: Sa 28. Mär 2020, 17:29

Array auslesen und in case Bedingung nutzen

Beitrag von Floriank67c »

Hallo
Ich arbeite recht frisch mit Lazarus und arbeite zurzeit an einem Programm das Schulnoten ausliest und Schüler vergleicht um z.B. den besten Schüler zu ermitteln (ist ein Schulprojekt). Nun hab ich das Problem das ich zwar einen Algorithmus zum berechnen des besten Schülers geschrieben bin mir aber 1. unsicher ob dieser so funktioniert und 2. weiß ich nicht wie ich die im Array gespeicherte Zahl ausgeben kann.

der dazu gehörige Teil des Quelltextes:
begin
Deutsch[1]:=strtoint(edit1.text);
Mathe[1]:=strtoint(edit2.text);
englisch[1]:=strtoint(edit3.text);
HSK[1]:=strtoint(edit4.text);
Deutsch[2]:=strtoint(edit5.text);
Mathe[2]:=strtoint(edit6.text);
englisch[2]:=strtoint(edit7.text);
HSK[2]:=strtoint(edit8.text);
Deutsch[3]:=strtoint(edit9.text);
Mathe[3]:=strtoint(edit10.text);
englisch[3]:=strtoint(edit11.text);
HSK[3]:=strtoint(edit12.text);


begin
for i:=1 to 3 do

Schuler[i]:=(Mathe[i]+deutsch[i]+englisch[i]+HSK[i]);
end;


begin

for i:=1 to 3 do
z[i]:=0;
begin If Schuler[i]<=Schuler[1] then begin If Schuler[i]<=Schuler[2] then begin If Schuler[i]<=Schuler[3] then z[i]:=1 ;
end;
end;
end;
end;


(hier fehlt die Programmzeile, welche erkennt welches der 3 z Speicherplätze( ist mit 1..3 definiert) die 1 enthält und damit quasi der True ist. Und je nachdem soll q=1 sein wenn es Z[1] ist, q=2 wenn es Z[2] und das so weiter auch mit 3. Sodass am Ende das Label welches dem besten Schüler zugehörig ist die Strings ausspuckt.)


begin
case q of
1: Label4.caption:= 'Schüler 1 hat die besten Noten';
2: Label5.caption:= 'Schüler 2 hat die besten Noten';
3: Label6.caption:= 'Schüler 3 hat die besten Noten';
end;
end;


Ich hoffe ich habe euch mein Problem verständlich erläuter, bin wie gesagt noch relativ neu in Lazarus und würde mich über eine Antwort freuen.

Mfg Florian

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Array auslesen und in case Bedingung nutzen

Beitrag von wp_xyz »

Lass mich mal zusammenfassen:
  • Es gibt 3 Schüler, 1...3, allgemeiner: 1...N
  • Es gibt vier Fächer Deutsch, Mathe, Englisch, HSK, in denen jeder Schüler eine Note hat. Die Noten stehen in Integer-Arrays Deutsch[1..N], Mathe[1..N] usw.
  • Es wird für jeden Schüler die Gesamtnote berechnet als Summe der Einzelnoten. Also brauchst du dafür wieder ein Array, das du schuler[] nennst (ich fände: GesamtNote[] wäre klarer)
  • Um den besten Schüler, zweitbesten usw zu bestimmen, würde ich ein weiteres Array (Integer) deklarieren, das, in der Reihenfolge der Gesamtnoten, die Indices der Schüler enthält. Du nennst das z, schreibst nur 0 oder 1 rein, was ich nicht verstehe. Wiegesagt, in meinem Vorgehen, wäre, wenn z ebenfalls mit 1..N indiziert wird, z[1] der Index des besten Schülers, z[2] der des zweitbesten usw.
  • Um nun im ganz allgemeinen Fall den Index des besten Schülers zu finden, durchläufst du das Array mit den Gesamtnoten und suchst den Index der niedrigsten Gesamtnote. Dafür brauchst du eine Merk-Variable, die zunächst auf "super-schlecht" gesetzt wird (z.B. 99999), sowie eine Merkvariable für den zugehörigen Schülerindex. Wenn du nun das Gesamtnoten-Array durchläufst, prüfst du, ob der aktuelle Schüler eine bessere Note hat als die Merkvariable. Wenn nicht, gehst du zum nächsten Schüler. Wenn doch, schreibst du dessen Note in die Merkvariable und du merkst dir in der anderen Variablen den Index dieses Schülers. Dann gehts weiter mit dem nächsten Schüler. Am Ende steht der index des besten Schüler in der Schülervariablen. Dieser Index kommt in z[1]. Nun geht's weiter mit der Suche nach dem zweitbesten Schüler. Damit du nicht wieder den besten Schüler findest, musst du ihn aus dem Array streichen. Das ist etwas kompliziert, aber es reicht in dem schuler array am Index des besten Schülers eine ganze schlechte Note einzutragen, so dass der Schüler bei der Suche ab nun ignoriert wird.
  • OK - das war's schon. Am Ende steht in jedem Element von z der Index eines Schülers. z[1] ist der beste, z[2] der zweitbeste usw. und z[N] der schlechteste
In der praktischen Implementierung nimmst du am besten zwei Schleifen. Die äußere entspricht dem Füllen des z Arrays, also der Suche nach dem 1./2./3.-besten Schüler. Die innere Schleife dient der Suche nach der jeweils besten Note und dem zugehörigen Schüler.

Es gäbe noch andere Arten, an das Problem heranzugehen, aber ich denke es geht hier um den Umgang mit Schleifen, und das wird in dem skizzierten Vorgehen auf jeden Fall geübt.

Viel Spaß beim Knobeln.

Floriank67c
Beiträge: 2
Registriert: Sa 28. Mär 2020, 17:29

Re: Array auslesen und in case Bedingung nutzen

Beitrag von Floriank67c »

Vielen dank für die schnelle Antwort, werde das mal ausprobieren, und mich zurückmelden wie es lief. :)

Antworten