Nur ungerade zahlen in einer for-schleife!

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
jaslaz
Beiträge: 58
Registriert: Sa 28. Aug 2010, 18:30
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Nur ungerade zahlen in einer for-schleife!

Beitrag von jaslaz »

Hi zusammen,

Code: Alles auswählen

for n:=1 to form2.listbox1.items.count do
  begin
 listbox2.Items.add(form2.listbox.Items[n]+ '  =  ' + form2.listbox2.Items[n+1])  
  end;
Ich will nun das zeile1 und zeile2 der listbox immer in einer zeile einer anderen sind (siehe code)!
Mein Problem ist das ich bei der for-schleife nur jede zweite zahl benutzen will!
Also falls listbox1 10 zeilen hat, nur die zahlen 1,3,5,7,9 in der For Schleife bearbeitet werden.
Dort ein n:=n+1 einzubauen geht nicht da die variable aus der for-Schleife nicht verändert werden darf!!!

Ich stell mir das sonst einfach so vor:

Code: Alles auswählen

for n:=1 to form2.listbox1.items.count do
  begin
 if n= UNGERADE then 
 listbox2.Items.add(form2.listbox.Items[n]+ '  =  ' + form2.listbox2.Items[n+1]) 
  end;
 
Mein problem ist dann aber wie ich Ungerade abfragen kann!
 
 
Hoffe ihr könnt mir helfen, auch andere Möglichkeiten sind erwünscht(gleiches Ergebnis natürlich!!!).
 
LG Jaslaz

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

Re: Nur ungerade zahlen in einer for-schleife!

Beitrag von theo »

http://www.freepascal.org/docs-html/rtl/system/odd.html" onclick="window.open(this.href);return false;

jaslaz
Beiträge: 58
Registriert: Sa 28. Aug 2010, 18:30
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Nur ungerade zahlen in einer for-schleife!

Beitrag von jaslaz »

theo hat geschrieben:http://www.freepascal.org/docs-html/rtl/system/odd.html
was hat das denn jetzt damit zu tun?

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

Re: Nur ungerade zahlen in einer for-schleife!

Beitrag von theo »

jaslaz hat geschrieben: was hat das denn jetzt damit zu tun?
Bist du so, oder tust du nur so? ;-)

Odd=Ungerade

jaslaz
Beiträge: 58
Registriert: Sa 28. Aug 2010, 18:30
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Nur ungerade zahlen in einer for-schleife!

Beitrag von jaslaz »

theo hat geschrieben: Bist du so, oder tust du nur so? ;-)

Odd=Ungerade

ups sry und thx

Bora4d
Beiträge: 290
Registriert: Mo 24. Dez 2007, 13:14
OS, Lazarus, FPC: WinXP-Pro-Sp3, Xubuntu 12.04, (Laz 1.1-SVN Mai2012, FPC 2.6.1 / 2.6.0-Linux)
CPU-Target: AMD64X2

Re: Nur ungerade zahlen in einer for-schleife!

Beitrag von Bora4d »

Deine Frage ist schon gut beantwortet aber ss gibt noch eine Möglichkeit was ich immer verwende. Der Operator mod liefert immer die zahl nach dem komma, wenn eine Zahl durch 2 Rest 0 ist dann ist die Zahl gerade:
if (EineZahl mod 2) = 0 then EineZahl_Ist_Gerade;

Wenn man prüfen will ob eine Zahl durch 3 teilbar ist, also ohne Stellen nach dem komma dann macht man das so:
if (EineZahl mod 3) = 0 then EineZahl_Ist_durch_3_teilbar;
z.B.
9 mod 3 = 0
6 mod 3 = 0
8 mod 3 <>0

Socke
Lazarusforum e. V.
Beiträge: 3177
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: Nur ungerade zahlen in einer for-schleife!

Beitrag von Socke »

Bora4d hat geschrieben:Der Operator mod liefert immer die zahl nach dem komma, wenn eine Zahl durch 2 Rest 0 ist dann ist die Zahl gerade:
Die Formulierung »gerade = durch 2 ohne Rest teilbar« führt natürlich als erstes zum mod-Operator. Die Funktion Odd() ist aber ein ganzes Stücke effizienter. Wie das geht:
In der binären Repräsentation hat das niederwertigste Bit den Dezimalwert 1. Alle anderen Bits haben gerade Werte und sind somit garantiert auch durch 2 Teilbar. Man muss also nur überprüfen, ob dieses Bit gesetzt ist, beispielsweise:
boolean(5 and 1)
Ein einfaches and ist ist natürlich viel schneller als eine Division und ein Vergleich (schon allein dadurch, dass es nur eine statt zwei Oprationen ist). In Assembler-Anweisungen sind das auf x86 3 zu 6 Operationen (über deren Komplexität ich keine Aussage treffen kann).
Der Nachteil durch einen Funktionsaufruf wird im Regelfall durch Inlining verhindert.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

diogenes
Beiträge: 200
Registriert: So 11. Jul 2010, 18:39
OS, Lazarus, FPC: Linux
CPU-Target: 64 Bit
Wohnort: Wien
Kontaktdaten:

Re: Nur ungerade zahlen in einer for-schleife!

Beitrag von diogenes »

Oder du formulierst:

Code: Alles auswählen

for n:=1 to ([color=#FF0000]form2.listbox1.items.count - 1[/color]) div 2 do
  begin
 listbox2.Items.add(form2.listbox.Items[[color=#FF0000]2 * n + 1[/color]]+ '  =  ' + form2.listbox2.Items[[color=#FF0000]2 * (n + 1)[/color]])  
  end;
damit wird nur mit ungeraden Zahlen (bzw. später im Ausdruck mit ihren unmittelbaren Nachfolgern) indiziert. ISt das OK so?
Die 2. Möglichkeit geht mit while-Schleife:

Code: Alles auswählen

n := 1;
while n < form2.listbox1.items.count do begin
  listbox2.Items.add(form2.listbox.Items[n]+ '  =  ' + form2.listbox2.Items[n + 1]);
  Inc( n, 2)
 end;
Ich persönlich würde zweiteres bevorzugen. Ist vermutlich schneller.
Ceterum censeo computatores per Pascal docendos esse.

petermännchen
Beiträge: 92
Registriert: So 26. Aug 2007, 20:35
OS, Lazarus, FPC: Win7, Laz 1.2.6, FPC 2.6.4, SVN 33306, ZEOS 7.1.4
CPU-Target: 32Bit
Wohnort: Helmstedt
Kontaktdaten:

Re: Nur ungerade zahlen in einer for-schleife!

Beitrag von petermännchen »

Mein Angebot :oops:

Code: Alles auswählen

for n:=1 to form2.listbox1.items.count do  
  begin 
    //Test auf ungerade
    if odd(n) then 
      listbox2.Items.add(form2.listbox.Items[n]+ '  =  ' + form2.listbox2.Items[n+1])   
    end;
{    //Test auf gerade
    if not odd(n) then 
      listbox2.Items.add(form2.listbox.Items[n]+ '  =  ' + form2.listbox2.Items[n+1])   
    end;}

Ups, Theo's Link ist ja das gleiche.
Zeiterfassung, einfach gerechter!

Antworten