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