Lazarus/Felder (Arrays): Unterschied zwischen den Versionen
main>Peterdauscher |
K (Matthias Scharwies verschob die Seite Lazarus-Buch/Felder (Arrays) nach Lazarus/Felder (Arrays): kürzere URL) |
||
(8 dazwischenliegende Versionen von 3 Benutzern werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
== Felder (Arrays) als "Vielfachspeicher" von Zahlen == | == Felder (Arrays) als "Vielfachspeicher" von Zahlen == | ||
Bisher haben wir nur Variablen kennen gelernt, die aus einer einzigen Zahl (ganz oder reell) oder einem Wahrheitswert (wahr/falsch) bestanden haben. Für viele Dinge reicht das auch, allerdings gibt es auch Probleme, zu deren Lösung viele Variablen benötigt werden. Statt nun jeder einzelnen davon einen Namen zu geben kann man auch viele Variablen unter einem Namen zusammenfassen und sie durchnummerieren. | Bisher haben wir nur Variablen kennen gelernt, die aus einer einzigen Zahl (ganz oder reell) oder einem Wahrheitswert (wahr/falsch) bestanden haben. Für viele Dinge reicht das auch, allerdings gibt es auch Probleme, zu deren Lösung viele Variablen benötigt werden. Statt nun jeder einzelnen davon einen Namen zu geben kann man auch viele Variablen unter einem Namen zusammenfassen und sie durchnummerieren. | ||
Zeile 25: | Zeile 23: | ||
Der Notenspiegel wird dann immer im Memo-Feld <tt>memo1</tt> ausgegeben. Vor dem Aufnehmen der Statistik jedoch, müssen alle Anzahlen der Noten natürlich auf Null gesetzt werden. Das geschieht mit dem Drücken von <tt>button1</tt>. Erst dann darf man mit der Eingabe beginnen. | Der Notenspiegel wird dann immer im Memo-Feld <tt>memo1</tt> ausgegeben. Vor dem Aufnehmen der Statistik jedoch, müssen alle Anzahlen der Noten natürlich auf Null gesetzt werden. Das geschieht mit dem Drücken von <tt>button1</tt>. Erst dann darf man mit der Eingabe beginnen. | ||
<source line highlight="27-29,37-52" lang="pascal"> | |||
unit lazio_testumgebung; | unit lazio_testumgebung; | ||
{$mode objfpc}{$H+} | {$mode objfpc}{$H+} | ||
Zeile 32: | Zeile 30: | ||
uses | uses | ||
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, | Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, | ||
ExtCtrls | ExtCtrls; | ||
type | type | ||
Zeile 72: | Zeile 70: | ||
ReadFrom(Edit1,note); | ReadFrom(Edit1,note); | ||
anzahl[note]:=anzahl[note]+1; | anzahl[note]:=anzahl[note]+1; | ||
Clear | Memo1.Lines.Clear; | ||
for i:=1 to 6 | for i:=1 to 6 | ||
do begin | do begin | ||
Memo1.Lines.Add(IntToStr(i)+':'+anzahl[i]); | |||
end; | end; | ||
end; | end; | ||
end. | end. | ||
</source> | </source> | ||
Zeile 96: | Zeile 91: | ||
<source line highlight="26,36-40,42" lang="pascal"> | |||
unit lazio_testumgebung; | unit lazio_testumgebung; | ||
{$mode objfpc}{$H+} | {$mode objfpc}{$H+} | ||
Zeile 103: | Zeile 98: | ||
uses | uses | ||
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, | Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, | ||
ExtCtrls | ExtCtrls; | ||
type | type | ||
Zeile 143: | Zeile 138: | ||
end. | end. | ||
</source> | </source> | ||
{{Aufgabe|1= | |||
#Schreibe ein Programm, das das Würfeln mit zwei Würfeln von 1-6 simuliert. Das Programm soll eine Statistik über die Augensumme solcher Doppelwürfe anfertigen. Klarerweise gibt es Ergebnisse von 2-12. Von der Zahl 7 kann man erwarten, dass sie häufiger die Augensumme darstellt als z.B. die 2. Denn viele Kombinationen (1,6); (2,5); ... (6,1) führen zur 7, während nur (1,1) zur 2 führt. | #Schreibe ein Programm, das das Würfeln mit zwei Würfeln von 1-6 simuliert. Das Programm soll eine Statistik über die Augensumme solcher Doppelwürfe anfertigen. Klarerweise gibt es Ergebnisse von 2-12. Von der Zahl 7 kann man erwarten, dass sie häufiger die Augensumme darstellt als z.B. die 2. Denn viele Kombinationen (1,6); (2,5); ... (6,1) führen zur 7, während nur (1,1) zur 2 führt. | ||
#Erweitere das Programm, dass es die Daten nicht nur als Zahlen sondern als Graphik in einem Bild auf der Oberfläche ausgibt. | #Erweitere das Programm, dass es die Daten nicht nur als Zahlen sondern als Graphik in einem Bild auf der Oberfläche ausgibt. | ||
#Simuliere einen MP3-Player. In diesem sollen die Titel von 10 Stücken gespeichert sein. Er soll auf Knopfdruck zufällig einen der Titel ausgeben. | #Simuliere einen MP3-Player. In diesem sollen die Titel von 10 Stücken gespeichert sein. Er soll auf Knopfdruck zufällig einen der Titel ausgeben. | ||
#Schreibe ein Programm, das auf Druck von <tt>Button1</tt> zunächst ein Array[1..10] mit Zufallszahlen zwischen 0 und 99 füllt und in eine Memo-Komponente ausgibt. Dann soll es die größte und die kleinste der Zahlen im Array nochmals extra darunter schreiben. | #Schreibe ein Programm, das auf Druck von <tt>Button1</tt> zunächst ein Array[1..10] mit Zufallszahlen zwischen 0 und 99 füllt und in eine Memo-Komponente ausgibt. Dann soll es die größte und die kleinste der Zahlen im Array nochmals extra darunter schreiben. | ||
#Das Ziehen der Lottozahlen erfolgt über Kugeln, die von 1 bis 49 durchnummeriert sind. Es werden 6 der Kugeln gezogen und natürlich kann keine Kugel doppelt gezogen werden. Schreibe ein Lotto-Programm. Tipp: Die Zeile <br> <tt>gezogen: array[1..49] of boolean</tt> <br> könnte hilfreich sein. | |||
#Belege ein Array mit 10 zufälligen Zahlen zwischen 0 und 100. Aus diesen soll nun ein Balkendiagramm in eine Image-Komponente gezeichnet werden.}} | |||
{{Lazarus-Buch}} |
Aktuelle Version vom 10. August 2019, 06:26 Uhr
Felder (Arrays) als "Vielfachspeicher" von Zahlen
Bisher haben wir nur Variablen kennen gelernt, die aus einer einzigen Zahl (ganz oder reell) oder einem Wahrheitswert (wahr/falsch) bestanden haben. Für viele Dinge reicht das auch, allerdings gibt es auch Probleme, zu deren Lösung viele Variablen benötigt werden. Statt nun jeder einzelnen davon einen Namen zu geben kann man auch viele Variablen unter einem Namen zusammenfassen und sie durchnummerieren.
Denkt man an unser Beispiel mit dem Schubladenschrank wäre das also eine Schublade mit einem Namensetikett darauf. In der Schublade jedoch gäbe es jetzt viele kleine Unterfächer, die mit Nummern versehen sind. Eine solche Variable wird in der Informatik auch als Feld oder englisch als Array bezeichnet.
Deklaration von Array-Variablen
Um eine solche Variable zu deklarieren, muss man in der Deklaration sagen, wie viele "Unterfächer" unsere "Schublade" tatsächlich hat, bzw., welche Nummern überhaupt vergeben werden. So besagt die Deklaration
var zahlen : array[1..10] of integer;
dass in der Schublade zahlen zehn einzelne Zahlen gespeichert werden können, die von 1 bis 10 durchnummeriert sind.
Angenommen, man möchte nun die Zahl mit der Nummer 7 auf den Wert 42 setzen, so erreicht man das mit der folgenden Zeile:
zahlen[7]:=42;
Man beachte, dass die Klammern hinter dem Namen des Arrays tatsächlich eckige Klammern sein müssen.
Beispiel
Wir betrachten ein einfaches Beispiel aus der Schulwelt: Lehrer Lempel hat gerade seine Klassenarbeit korrigiert und möchte einen Notenspiegel erstellen. Dafür schreibt er sich ein Lazarus-Programm mit einem Edit-Feld edit1 (zum Eingeben einer Zensur zwischen 1 und 6) und einem Knopf button2, um die Zahl in die Statistik aufzunehmen. Der Notenspiegel wird dann immer im Memo-Feld memo1 ausgegeben. Vor dem Aufnehmen der Statistik jedoch, müssen alle Anzahlen der Noten natürlich auf Null gesetzt werden. Das geschieht mit dem Drücken von button1. Erst dann darf man mit der Eingabe beginnen.
unit lazio_testumgebung;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
ExtCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
i : integer;
note : integer;
anzahl : array[1..6] of integer;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
for i:=1 to 6
do anzahl[i]:=0;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
ReadFrom(Edit1,note);
anzahl[note]:=anzahl[note]+1;
Memo1.Lines.Clear;
for i:=1 to 6
do begin
Memo1.Lines.Add(IntToStr(i)+':'+anzahl[i]);
end;
end;
end.
Betrachten wir zunächst, was passiert, wenn man auf den button1 klickt. Dann wird eine Schleife durchlaufen, die die Variable i von 1 bis 6 nach oben zählt. In jedem Schleifendurchlauf wird eine der Untervariablen des Feldes anzahl auf den Wert 0 gesetzt, zunächst anzahl[1], dann anzahl[2] usw. bis anzahl[6].
Wird button2 angeklickt, so wird zunächst die Integer-Variable note von edit1 eingelesen. Jetzt muss die entsprechende Anzahl in der Statistik um 1 erhöht werden: Das geschieht in der Zeile anzahl[note]:=anzahl[note]+1;. Alle Befehle danach sorgen nur dafür, dass das memo1-Feld gereinigt und die Statistik in dieses Feld ausgegeben wird.
Felder (Arrays) als "Vielfachspeicher" von Zeichenketten
In Feldern (Arrays) können jedoch nicht nur Zahlen, sondern auch Zeichenketten abgelegt werden. Das folgende Programm stellt einen Teil eines Rechentrainers dar, der bei richtiger Antwort den Benutzer lobt. Natürlich ist es viel netter, nicht immer das gleiche Lob zu erhalten, sondern ein bisschen Abwechslung zu haben:
unit lazio_testumgebung;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
ExtCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Edit1: TEdit;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
var
Form1: TForm1;
aussage : array[1..5] of string;
nummer : integer;
implementation
{$R *.lfm}
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
aussage[1]:='Richtig!';
aussage[2]:='Super!';
aussage[3]:='Genau!';
aussage[4]:='Prima!';
aussage[5]:='Genial';
nummer:=random(5)+1;
Edit1.Text:=aussage[nummer];
end;
end.
- Schreibe ein Programm, das das Würfeln mit zwei Würfeln von 1-6 simuliert. Das Programm soll eine Statistik über die Augensumme solcher Doppelwürfe anfertigen. Klarerweise gibt es Ergebnisse von 2-12. Von der Zahl 7 kann man erwarten, dass sie häufiger die Augensumme darstellt als z.B. die 2. Denn viele Kombinationen (1,6); (2,5); ... (6,1) führen zur 7, während nur (1,1) zur 2 führt.
- Erweitere das Programm, dass es die Daten nicht nur als Zahlen sondern als Graphik in einem Bild auf der Oberfläche ausgibt.
- Simuliere einen MP3-Player. In diesem sollen die Titel von 10 Stücken gespeichert sein. Er soll auf Knopfdruck zufällig einen der Titel ausgeben.
- Schreibe ein Programm, das auf Druck von Button1 zunächst ein Array[1..10] mit Zufallszahlen zwischen 0 und 99 füllt und in eine Memo-Komponente ausgibt. Dann soll es die größte und die kleinste der Zahlen im Array nochmals extra darunter schreiben.
- Das Ziehen der Lottozahlen erfolgt über Kugeln, die von 1 bis 49 durchnummeriert sind. Es werden 6 der Kugeln gezogen und natürlich kann keine Kugel doppelt gezogen werden. Schreibe ein Lotto-Programm. Tipp: Die Zeile
gezogen: array[1..49] of boolean
könnte hilfreich sein. - Belege ein Array mit 10 zufälligen Zahlen zwischen 0 und 100. Aus diesen soll nun ein Balkendiagramm in eine Image-Komponente gezeichnet werden.
- Einführung
- Technisches
- Komponenten, Eigenschaften, Ereignisse
- Computer-Mathematik
- Verzweigungen
- Spielen mit dem Zufall
- Schleifen
- Computer-Graphik
- Geschachtelte Verzweigungen und Verzweigungen in Schleifen
- Prozeduren, Funktionen und Bibliotheken
- Felder (Arrays)
- Zeichen (Char) und Zeichenkette (String)
- Dateien
- Graphische Komponenten