Laufindex

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Laufindex

Beitrag von Foxi1896 »

Hey,

habe da eine glaube für viele leichte Frage:

Ich möchte bei meinem Programm den Laufindex bestimmen können.
Beispiel. 1 bis 100 in 5er Schritten
1 bis 100 in 7er Schritten usw.

Code: Alles auswählen

for t:=t_ab to t_bis do
  begin 
Habe 3 Edits: t_ab, t_zu, t_schritte
Wie füge ich das mit den Schritten ein?

Gruß
Foxi

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

Re: Laufindex

Beitrag von wp_xyz »

Im Gegensatz zu anderen Programmiersprachen hat der Laufindex bei Pascal nur 1er Schritte. Am einfachsten geht's m.E. mit einer while-Schleife:

Code: Alles auswählen

var
  laufindex, startindex, endindex, schrittweite: Integer;
begin
  startindex := StrToInt(t_ab.Text);
  endindex := StrToInt(t_zu.Text);
  schrittweite := StrToInt(t_schritte.Text);
  laufindex := startindex;
  while laufindex <= endindex do begin
    // tue irgendwas...
    laufindex := laufindex + schrittweite;
  end;
end;
 

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2811
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Laufindex

Beitrag von m.fuchs »

Nicht ganz so einfach kann man auch ein Step-ähnliches Verhalten programmieren:

Code: Alles auswählen

program Steps;
 
var
  I: Integer;
 
begin
  (* for-to-schleife, 1 - 100, Step 7 *)
  for i := 0 to 14 do
    WriteLn(i * 7 + 1);
  ReadLn;
end.
Ist nicht schön, aber funktioniert.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

DonMigos
Beiträge: 52
Registriert: Mi 15. Mai 2013, 21:21
OS, Lazarus, FPC: Win7 (L 1.0.8 FPC 2.6.2)
CPU-Target: 32Bit

Re: Laufindex

Beitrag von DonMigos »

Noch zwei möglichkeiten:

Code: Alles auswählen

  for i := 0 to 35 do
  begin
    if i mod 7 = 0 then
      ShowMessage(IntToStr(i));
  end;           
oder (nicht zu empfehlen ?!):

Code: Alles auswählen

  for i := 0 to 35 do
  begin
    if i <> 0 then 
      Inc(Integer(Pointer(@i)^),6); // = Step 7 weil +1 schon automatisch durch for Schleife
    ShowMessage(IntToStr(i));
  end;      
Die Version mit while ist aber denke ich die Beste von wp_xyz.
Zuletzt geändert von DonMigos am Do 27. Jun 2013, 15:16, insgesamt 4-mal geändert.

Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Re: Laufindex

Beitrag von Foxi1896 »

hmm... habe jetzt beide versucht und funktionieren nicht (wahrscheinlich vergesse ich irgendwas)
beim zweiten was ja jetzt nicht so schwer ist kommt dann bei mir wo anders ein Fehler.

Nämlich BREAK not allowed:

Code: Alles auswählen

Memo5.Lines.Add(FloatToStrF(I_a, ffNumber, 15, 2) + chr(9) + chr(9) +
                  FloatToStrF(n_sec_a*60, ffNumber, 15, 0) + chr(9) + chr(9) +
                  FloatToStrF(eta_a, ffNumber, 15, 2) + chr(9) + chr(9) +
                  FloatToStrF(M_a, ffNumber, 15, 2))
     else break;
  end;
 
@DonMigos: Das gleiche Problem :/ Was hat er jetzt gegen das break?

habe es jetzt so eingefügt:

Code: Alles auswählen

for t_a := t_von_a to t_bis_a do
  begin
       if t_a mod step_a = 0 then
  end;  

DonMigos
Beiträge: 52
Registriert: Mi 15. Mai 2013, 21:21
OS, Lazarus, FPC: Win7 (L 1.0.8 FPC 2.6.2)
CPU-Target: 32Bit

Re: Laufindex

Beitrag von DonMigos »

Für was brauchst du hier das break eigentlich ?

Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Re: Laufindex

Beitrag von Foxi1896 »

Code: Alles auswählen

if I_a >= 0 then
     if n_sec_a >= 0 then
     if eta_a >= 0 then
     if M_a >= 0 then
 
  Memo5.Lines.Add(FloatToStrF(I_a, ffNumber, 15, 2) + chr(9) + chr(9) +
                  FloatToStrF(n_sec_a*60, ffNumber, 15, 0) + chr(9) + chr(9) +
                  FloatToStrF(eta_a, ffNumber, 15, 2) + chr(9) + chr(9) +
                  FloatToStrF(M_a, ffNumber, 15, 2))
     else break;
  end;               
für die if abfragen ... hab ich vorhin vergessen mit reinzumachen.

Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Re: Laufindex

Beitrag von Foxi1896 »

Ahhhh.... die geht.
Aber warum nicht zu empfehlen?
DonMigos hat geschrieben: oder (nicht zu empfehlen ?!):

Code: Alles auswählen

  for i := 0 to 35 do
  begin
    if i <> 0 then 
      Inc(Integer(Pointer(@i)^),6); // = Step 7 weil +1 schon automatisch durch for Schleife
    ShowMessage(IntToStr(i));
  end;      
Die Version mit while ist aber denke ich die Beste von wp_xyz.

DonMigos
Beiträge: 52
Registriert: Mi 15. Mai 2013, 21:21
OS, Lazarus, FPC: Win7 (L 1.0.8 FPC 2.6.2)
CPU-Target: 32Bit

Re: Laufindex

Beitrag von DonMigos »

Hmm die anderen Versionen sollten eigentlich (also die mit mod und die mit while) genauso gehen.
Nicht zu empfehlen ist die Variante deshalb, weil hier eigentlich ein Sicherheitsmechanismus der For schleife umgangen wird. Es wird der Zähl-Index während des Schleifenablaufs verändert, was schnell zu fehlern führen kann.

Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Re: Laufindex

Beitrag von Foxi1896 »

Hab jetzt die "mod" Methode zum laufen bekommen ... aber da ist folgender Fehler.
In meinem Diagramm und in Showmessage macht er die Schrittfolge.
Aber da wo ich die Werte ausgeben lasse schreibt er mir alle hin. Obowhl der Befehl von dem Diagramm abhängt.

DonMigos
Beiträge: 52
Registriert: Mi 15. Mai 2013, 21:21
OS, Lazarus, FPC: Win7 (L 1.0.8 FPC 2.6.2)
CPU-Target: 32Bit

Re: Laufindex

Beitrag von DonMigos »

Könntest du mal die komplette Prozedur posten, die auch die Schleife enthält, so kann ich dazu nix sagen.

Mfg

Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Re: Laufindex

Beitrag von Foxi1896 »

Code: Alles auswählen

for t_a:=t_von_a to t_bis_a do
  begin
     if t_a mod step_a = 0 then
     ShowMessage(IntToStr(t_a));
 
{------------------------------------------------------------------------------}
{                                   Drehzahl                                   }
{------------------------------------------------------------------------------}
 
  n_sec_a:=t_a;
  //n_min:=n_sec*60;
  //Umdrehung/sec in Umdrehung/min
 
 
{==============================================================================}
{                      Ausgabe der Eingabe Werte                               }
{==============================================================================}
 
     if I_a >= 0 then
     if n_sec_a >= 0 then
     if eta_a >= 0 then
     if M_a >= 0 then
 
  Memo5.Lines.Add(FloatToStrF(U_a, ffNumber, 15, 2) + chr(9) + chr(9) +
                  FloatToStrF(I_a, ffNumber, 15, 2) + chr(9) + chr(9) +
                  FloatToStrF(n_sec_a*60, ffNumber, 15, 0) + chr(9) + chr(9) +
                  FloatToStrF(eta_a, ffNumber, 15, 2) + chr(9) + chr(9) +
                  FloatToStrF(M_a, ffNumber, 15, 2))
     else break;
  end;
 
end;
 
Zuletzt geändert von Foxi1896 am Do 27. Jun 2013, 17:19, insgesamt 2-mal geändert.

DonMigos
Beiträge: 52
Registriert: Mi 15. Mai 2013, 21:21
OS, Lazarus, FPC: Win7 (L 1.0.8 FPC 2.6.2)
CPU-Target: 32Bit

Re: Laufindex

Beitrag von DonMigos »

Da fehlt doch noch ein begin und end, sonst ist die Schrittweite ja nur für Showmassage gut, so:

Code: Alles auswählen

  for t_a:=t_von_a to t_bis_a do
  begin
     if t_a mod step_a = 0 then
     begin
       ShowMessage(IntToStr(t_a));
       //...restlicher Code
 
     end; //Ende von Mod-Bedingung
  end; //Ende von Schleife
 
 
 

Foxi1896
Beiträge: 87
Registriert: Mo 10. Jun 2013, 09:06

Re: Laufindex

Beitrag von Foxi1896 »

fast jetzt schreibt er mir immer die jeweiligen Werte z.b. bei step = 20 .. 20mal hin.

EdIT: Hab es. Hatte ein end; an der Falschen stelle =) Danke

Antworten