Einzelnen Beitrag anzeigen

Benutzerbild von sECuRE
sECuRE

Registriert seit: 10. Apr 2003
Ort: Heidelberg
360 Beiträge
 
Delphi 7 Professional
 
#22

Re: guter stil????

  Alt 27. Mär 2006, 12:53
Hi,

Zitat von tigerman33:
kann ich genau wie Christian Seehase gerne verzichten. Auch den viel gepredigten begin-end Block um einzeilige then/else-Zweige oder Schleifen finde ich überflüssig. Das müllt mir bloß den Code zu.
Da stimme ich zu. Allerdings hab' ich noch etwas anzumerken:

Zitat von tigerman33:
Delphi-Quellcode:
while x > 0 do
  if x < 5 then
    inc(x) else
    dec(x);
Das else würde ich an den Zeilenanfang setzen, denn wenn man schnell über Code liest, und einen der ausgeführte Text der if-Bedingung nicht interessiert, liest man die Zeile für gewöhnlich nicht zu Ende - und übersieht eventuell das else.

Letztendlich würde ich es so machen:
Delphi-Quellcode:
// 1) const sorgt eventuell für schnellere Parameterweitergabe, sicher aber dafür,
// dass man sich nicht einfach Variablen überschreibt
// 2) ein normaler Integer langt und ist auf 32bit-CPUs schneller berechnet
// - StrToInt liefert auch nur einen Integer und keinen int64
// 3) Funktionsname:
// Man prüft bei der Verwendung von functions *generell* - Was wird also geprüft?
function IstPrim(const n:integer):boolean;
var x:integer;
begin
  // Sonderfall 1 beachten
  if (n = 1) then begin
    result:=false;
    exit;
  end;

  // Deine Primzahlprüfung hab' ich nicht ganz verstanden. Warum prüfst du nur die Teiler
  // bis Round(N / 2)? Normalerweise prüft man doch von 2 bis Sqrt(N)!
  result:=true;
  for x:=2 to Trunc(Sqrt(N)) do
    if ((n mod x) = 0) then begin
      result:=false;
      exit;
    end;
end;


// integer: siehe oben
procedure Zerlegen(var OutputLabel:TLabel; const n:integer);
var x:integer;
begin
  x:=2;
  while ((n mod x) <> 0) do
    Inc(c);

  // Die Bedingung vorher war Schwachsinn (*sorry*)
  OutputLabel.Caption:=OutputLabel.Caption+'*'+IntToStr(x);

  if (not IstPrim(n div x)) then
    Zerlegen(n div x);

  m:=m*x;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  m:=1;
  label2.Caption:='';
  if (IstPrim(strtoint(edit1.Text))) then
    Label2.Caption:=edit1.Text+' ist eine Primzahl!
  else begin
    Zerlegen(Label2, StrToInt(Edit1.Text));
    Label2.Caption:=Label2.Caption+'*'+IntToStr(StrToInt(Edit1.Text) div m);
  end;
end;
Die globale Variable m hab' ich erst mal dringelassen, ich hab' ja schon genug anderes kritisiert .

cu
  Mit Zitat antworten Zitat