Lazarus Sortieren

Für Fragen von Einsteigern und Programmieranfängern...
Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Lazarus Sortieren

Beitrag von Socke »

SIrRonBird hat geschrieben:Ich weiß nicht was ich falsch gemacht habe ?! Bitte helft mir ! :cry:
Die Formatierung des Quelltextes :) Einen unterstrichenen Text kann man schwer lesen. Für Quelltexte hat das Forum über Eingabefenster eine Dropdown-Box mit dem Titel "Highlighter" dort wählst du "Freepascal/Lazarus" aus.

Zu einer String-Liste (TStrings; Listbox1.Items ist ebenfalls vom Typ TStrings), kannst du Einträge mit der Funktion Add() hinzufügen. Beispiel: Listbox1.Items.Add(IntToStr(5));

Bevor du die Funktion random() verwendest, solltest du einmal in deinem Programm die Funktion randomize() aufrufen. Damit ist sichergestellt, dass dein Programm nicht nach jedem Start die gleiche Folge an "Zufallszahlen" berechnet.

Bei einem If-Statement ist der explizite Vergleich mit dem boolschen Wert TRUE überflüssig, da er impliziert wird. Das ist kein fachlicher Fehler (der zusätzliche Vergleich wird vermutlich vom Compiler heraus optimiert) Daraus folgt, if RadioButton1.Checked then ist einfacher zu lesen als if RadioButton1.Checked = True then.

Weiterhin hast du ein "Problem", sobald dein Benutzer vergisst, einen Radiobutton auszuwählen. Er wird zwar per Dialog darauf hingewiesen, dein Programm rennt dann aber mit unbekannten und potentiell gefährlichen Werten ungebremst in die Schleife. Besser wäre Folgendes:

Code: Alles auswählen

 
//...
else
begin
  ShowMessage('Fehler: Bitte wähle eine Option.'); // hier gibst du deinen Text aus
  exit; // Funktion verlassen
end;
 
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

SIrRonBird
Beiträge: 24
Registriert: Mo 5. Nov 2012, 10:51

Re: Lazarus Sortieren

Beitrag von SIrRonBird »

Viel viel Danke

Ich habe nur eine Frage wie genau geht das mit dem randomize ?

volker
Beiträge: 25
Registriert: Mi 14. Nov 2012, 14:36
OS, Lazarus, FPC: Linux Kernel 6.6 (L 3.0 FPC 3.2.2)
CPU-Target: x86_64 Linux gtk2

Re: Lazarus Sortieren

Beitrag von volker »

Hallo SIrRonBird,
Hintergrund zu Random und Randomize: Ein PC kann keine wirklichen Zufallszahlen (im Sinne der Statistik) produzieren. Es gibt allerdings mathematische Algorithmen (Funktionen), die eine Zahlenfolge erzeugen, die _fast_ wie "echte" Zufallszahlen sind. Allerdings sind dies feste Zahlenfolgen, also jedesmal wenn diese Funktion Random aufgerufen wird, erscheinen die gleichen Zahlen in gleicher Reihenfolge. Das Result ist dann doch nicht mehr so zufällig wie gewünscht.
Abhilfe schafft die Funktion Randomize, die einfach einen neuen Anfangswert für den Random-Algorithmus schafft. Dann erhält man eine andere (also wirklich noch mehr zufällige) Zufallszahlen-Reihe.
Am besten im Form.Create (oder so) Randomize aufrufen, das wars.

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Lazarus Sortieren

Beitrag von Socke »

volker hat geschrieben:Ein PC kann keine wirklichen Zufallszahlen (im Sinne der Statistik) produzieren.
Im Sinne der Statistik sind die sogar zufällig. Nicht aber im Sinne der Physik. Für deine Zwecke (Sortieralgorithmen testen) reicht die Funktion random() aus.

Ein PC kann auch physikalische Zufallszahlen liefern. Dazu braucht es aber externe Geräte wie Tastatur oder Netzwerkkarten. Unter Linux kann man die sogar ziemlich leicht aus der Datei /dev/random lesen; Windows stellt so einen Dienst leider nicht zur Verfügung.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

volker
Beiträge: 25
Registriert: Mi 14. Nov 2012, 14:36
OS, Lazarus, FPC: Linux Kernel 6.6 (L 3.0 FPC 3.2.2)
CPU-Target: x86_64 Linux gtk2

Re: Lazarus Sortieren

Beitrag von volker »

Socke hat Recht, die Zufallszahlengeneratoren liefern Zahlenfolgen, die im Sinne der Statistik einer Zufallsverteilung folgen (z.B. die gute Gaußsche Normalverteilung). Im Sinne der Physik wären Zufallszahlen z.B. die als "thermisches Rauschen" bezeichneten Spannungsschwankungen von Widerständen. Diese können mit den genannten Zusatzgeräten in den PC eingelesen werden, wenn man das unbedingt braucht.

SIrRonBird
Beiträge: 24
Registriert: Mo 5. Nov 2012, 10:51

Re: Lazarus Sortieren

Beitrag von SIrRonBird »

Es tut mir leid jetzt habe ich wieder ein Problem und zwar möchte ich die Zahlen aus der ersten ListBox ind di ezweite ListBox übertragen ! Ich habe es so versucht

Code: Alles auswählen

ListBox1.Count:= a;
 
  for k:= 1 to a do
  begin
    ListBox2.Items[k]:=ListBox1.Items[k+1];
Das hat aber den Fehler unit1.pas(83,17) Error: No member is provided to access property
ergeben ! Was hab ich falschgemacht ?

Mfg SirRonBird

P.S. :Sorry das ich soviel frage aber unserer Lehrer kann uns nichts erklären und weiß selber nichts !

Benutzeravatar
theo
Beiträge: 10869
Registriert: Mo 11. Sep 2006, 19:01

Re: Lazarus Sortieren

Beitrag von theo »

Und was soll das bewirken?

Code: Alles auswählen

ListBox1.Count:= a;
 
Das geht so nicht. Was willst du da machen?

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: Lazarus Sortieren

Beitrag von Heinrich Wolf »

ListBox.Count ist nur zum Lesen da, nicht zum Schreiben. Wenn Du mit ListBoxen explizit selbst sortieren willst musst Du

Code: Alles auswählen

ListBox.Sorted := False;
setzen. Kopieren eines ListBox Inhalts geht so:

Code: Alles auswählen

ListBox2.Items.Clear;
for k := 0 to ListBox1.Items.Count - 1 do
  ListBox2.Items.Add(ListBox1.Items[k]);

SIrRonBird
Beiträge: 24
Registriert: Mo 5. Nov 2012, 10:51

Re: Lazarus Sortieren

Beitrag von SIrRonBird »

Alles Klar vielen Dank

Sorry , mir ist es total peinlich aber ich habe noch eine Frage !

Undzwa möchte ich jetzt ein if-Bedingung einbauen, sodass er ein bestimmtes verfahren nutzt wenn es in der ComboBox aus gewählt ist !
Ich dachte nichts einfacher als das , aber ich habe mich getäuscht !
Meine erste Idee sah wie folgt aus :

Code: Alles auswählen

if ComboBox1.Items := Bubblesort then

Es wurde Folgender Fehler angezeigt : unit1.pas(145,36) Error: Identifier not found "Bubblesort"

Meine zweite Idee (nach einer halben Stunde bei Google) war dann :

Code: Alles auswählen

if ComboBox1.Text := Bubblesort then
Es folgte der gleiche Fehler !

Es wäre schön wenn mir einer auch hier helfen könnte, denn wie schon gesagt ich habe kein Plan davon und mein LK Lehrer auch nicht :roll:

MFG SirRonBird

MAC
Beiträge: 770
Registriert: Sa 21. Feb 2009, 13:46
OS, Lazarus, FPC: Windows 7 (L 1.3 Built 43666 FPC 2.6.2)
CPU-Target: 32Bit

Re: Lazarus Sortieren

Beitrag von MAC »

Also aufgrund des von dir beschrieben Fehlers würde ich dir auf jedenfall nochmal raten dich ein bisschen mit den Basics auseinanderzusetzen. Geh mal auf DelphiTreff oder schau mal nen paar Tutorials auf Youtube an :)

nehmen wir an du hast eine Variable "a" vom Typ Integer und möchstest das A den Wert 3 hast, das machst du da? Richtig

Code: Alles auswählen

var
  a:integer;
begin
a := 3;
end;
Das ":=" bedeutet dort soviel wie "a entspricht 3" oder "a bekommt den wert 3 zugeortnet".

Du willst jetzt aber wissen, welchen wert a hat. Würdest du jetzt folgendes Schreiben

Code: Alles auswählen

if a := 3 then
 
Bedeutet das soviel wie "Wenn (a bekommt den wert auf 3 gesetzt), dann..." --> Das hört sich nicht so richtig an. Und auch Lazarus kann hiermit nix anfangen, deshalb:
Zur reinen Abfrage von Werten zum vergleich, wird im gegensatz zu einer Zuordnung ein einfaches "=" ohne ":" verwendet

Code: Alles auswählen

if a = 3 then
 
Gelesen "Wenn a gleich 3 ist, dann"



Wieso die 2te Idee dann immernoch nicht klapp hängt damit, das du Bubblesort noch als String schreiben musst, damit Lazarus weis, das der String Bubblesort heißt und er nicht nach einer Variable mit dem namen "Bubblesort" suchen soll. Wie du das machen kannst, kannst du ja mal googlen :)
P.S: Theoretisch könntest du auch Combobox1.ItemIndex benutzen... http://lazarus-ccr.sourceforge.net/docs ... index.html

Code: Alles auswählen

Signatur := nil;

Antworten