Falls jemand eine Erklärung hat, vielen Dank im voraus.
unit Quersumme;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
Edit1: TEdit;
Label2: TLabel;
Label3: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private-Deklarationen }
public
{ Public-Deklarationen }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var rest,zahl,Summ:integer;
begin
zahl:=strtoint(edit1.text);
while zahl <> 0 do
begin
rest:=zahl mod 10;
//label2.caption:=inttostr(rest);
Summ:=Summ+rest;
zahl:=zahl div 10;
end;//While Schleifen-Ende
label1.caption:=inttostr(Summ);
end;
end.
In Deinem Code fehlt die Initialisierung von Summ. Warum das Ergebnis
trotzdem stimmt, wenn Du die Zuweisung an label2 machst, weiß ich nicht. Sie
bewirkt jedenfalls, daß Summ beim Eintritt in die Funktion den Wert 0 hat.
Das ist m.E. nach reiner Zufall.
Noch ein Tip: in Delphi 3 gibt es die Compilerschalter $HINTS ON und
$WARNINGS ON (ich bin mir nicht ganz sicher, aber ich glaube, daß diese
Schalter auch schon in Delphi 2 vorhanden sind). Die Schalter bewirken, daß
der Compiler auf solche "Fehler" mit entsprechenden Meldungen
reagiert(Variable 'Summ' wurde wahrscheinlich nicht initialisiert).
Herbert
--
---
Herbert Urwer
hur...@usd.de
http://www.usd.de
"The road goes ever on and on ..." (Bilbo Baggins)
So long,
Thomas G. Liesner
Hi!
Du hast die Variable "Summ" nicht initialisiert, kann sein das Du daher
einen Nebeneffekt bekommst, der
durch Deinen label2 aufruft eliminiert wird.
Gruß
Ingo
>procedure TForm1.Button1Click(Sender: TObject);
>var rest,zahl,Summ:integer;
>begin
summ:=0;
>zahl:=strtoint(edit1.text);
Jürgen Braukmeier schrieb in Nachricht <35167...@195.143.56.1>...
>Hallo;
>habe keine Erklärung für folgendes Programm.
>Beim Errechnen der Quersumme läuft alles bestens, solange die Zuweisung an
>Label2 aktiviert ist, ansonsten bekomme ich eine Fiktive-Zahl.
>Es ist nicht lebenswichtig, aber trotzdem wurmt mich der Gedanke, warum das
>Programm nur mit der Zuweisung an label2 läuft.
>Mir geht es um eine Klärung, nicht um ein andere Lösung.
>
>Falls jemand eine Erklärung hat, vielen Dank im voraus.
>
>
>procedure TForm1.Button1Click(Sender: TObject);
> var rest,zahl,Summ:integer;
> begin
> zahl:=strtoint(edit1.text);
> while zahl <> 0 do begin
> rest:=zahl mod 10;
> //label2.caption:=inttostr(rest);
> Summ:=Summ+rest;
> zahl:=zahl div 10;
> end;//While Schleifen-Ende
> label1.caption:=inttostr(Summ);
> end;
Hallo Jürgen !
Du solltest die Variable Summ vor der while-Schleife initialisieren
(auf 0 setzen), da sie sonst irgendeinen zufälligen Wert enthält
der in der Zeile: summ:=summ + rest mit addiert wird.
Der Compiler weist per Var-Deklaration den Variablen zwar einen bestimmten
Speicherbereich zu, was da für Werte drinstehen interessiert ihn aber nicht.
Die 2. Möglichkeit wäre summ als typisierte Konstante zu deklarieren :
----------------------
const
summ : Integer = 0;
----------------------
Mit der Zuweisung an Label2 ändert sich wahrscheinlich nur die
Speicheradresse der Variable summ, die dann zufällig Null enthält.
Hoffe das hilft ....
Gruß Thomas
Anmerkung zu : Jürgen Braukmeier
zum Thema : "Re: Quersumme errechnen":
> procedure TForm1.Button1Click(Sender: TObject);
> var rest,zahl,Summ:integer;
> begin
> zahl:=strtoint(edit1.text);
Summ := 0; // hier einfügen.
> while zahl <> 0 do begin
> rest:=zahl mod 10;
> //label2.caption:=inttostr(rest);
> Summ:=Summ+rest;
> zahl:=zahl div 10;
> end;//While Schleifen-Ende
> label1.caption:=inttostr(Summ);
> end;
Anderer Vorschlag:
procedure TForm1.Edit1Change(Sender: TObject);
const
Nums : set of char = ['0'..'9'];
var
i, Summ: word;
begin
Summ := 0;
for i:=1 to Length(Edit1.Text) do
if Edit1.Text[i] in Nums
then inc(Summ, StrToInt(Edit1.Text[i]));
Label1.Caption := IntToStr(Summ);
end;
Meno
----------------------------------------------------------------------