Was stimmt an meinem Programm nicht? Dreiecksungleichung?
Was stimmt an meinem Programm nicht? Dreiecksungleichung?
also ich soll ein Programm machen, welches prüft, ob aus 3 eingegeben Seiten ein Dreieck entstehen kann. Mein Quelltext für den entsprechenden Button sieht so aus:
procedure TForm1.UeberpruefenButtonClick(Sender: TObject);
begin
a:=StrToInt(aSeiteEdit.Text);
b:=StrToInt(bSeiteEdit.Text);
c:=StrToInt(cSeiteEdit.Text);
if a and b and c > 0
then
if a + b >c
then
if a + c >b
then
if b + c >a
then ErgebnisPanel.Caption:='Es ist ein Dreieck'
else ErgebnisPanel.Caption:='Es ist kein Dreieck'
else ErgebnisPanel.Caption:='Es ist kein Dreieck'
else ErgebnisPanel.Caption:='Es ist kein Dreieck'
else ErgebnisPanel.Caption:='Es ist kein Dreieck';
aSeiteEdit.SetFocus;
bSeiteEdit.SetFocus;
cSeiteEdit.SetFocus;
end;
Jetzt meine Frage; Wenn ich 5, 5, 7 eingebe, dann ist es ein Dreieck, wenn ich aber statt 7 eine 8 nehme, dann auf einmal nciht mehr? Obwohl doch rechnerisch alles stimmt:
a,b,c größer 0
10 > 8
13 > 5
13 > 5 ... was stimmt daran jetzt nicht? Wo liegt mein Fehler?
procedure TForm1.UeberpruefenButtonClick(Sender: TObject);
begin
a:=StrToInt(aSeiteEdit.Text);
b:=StrToInt(bSeiteEdit.Text);
c:=StrToInt(cSeiteEdit.Text);
if a and b and c > 0
then
if a + b >c
then
if a + c >b
then
if b + c >a
then ErgebnisPanel.Caption:='Es ist ein Dreieck'
else ErgebnisPanel.Caption:='Es ist kein Dreieck'
else ErgebnisPanel.Caption:='Es ist kein Dreieck'
else ErgebnisPanel.Caption:='Es ist kein Dreieck'
else ErgebnisPanel.Caption:='Es ist kein Dreieck';
aSeiteEdit.SetFocus;
bSeiteEdit.SetFocus;
cSeiteEdit.SetFocus;
end;
Jetzt meine Frage; Wenn ich 5, 5, 7 eingebe, dann ist es ein Dreieck, wenn ich aber statt 7 eine 8 nehme, dann auf einmal nciht mehr? Obwohl doch rechnerisch alles stimmt:
a,b,c größer 0
10 > 8
13 > 5
13 > 5 ... was stimmt daran jetzt nicht? Wo liegt mein Fehler?
-
- Beiträge: 512
- Registriert: Mo 25. Aug 2008, 18:17
- OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
- CPU-Target: x86
- Wohnort: Chemnitz
Re: Was stimmt an meinem Programm nicht? Dreiecksungleichung?
Bitte das nächste mal die code-Tags um deinen Code legen - sieht schöner im Forum aus 
Zu deinem Problem:
"if a and b and c > 0" das macht nicht, was du denkst, das es macht ... da dir die Details wahrscheinlich nix nützen, erspar ich dir die Erklärung, wenn es dich doch interessiert, frag nach, oder schau mal nach Binären Operatoren
Was du stattdessen wohl willst is:
if (a > 0) and (b > 0) and (c > 0) then ...

Zu deinem Problem:
"if a and b and c > 0" das macht nicht, was du denkst, das es macht ... da dir die Details wahrscheinlich nix nützen, erspar ich dir die Erklärung, wenn es dich doch interessiert, frag nach, oder schau mal nach Binären Operatoren

Was du stattdessen wohl willst is:
if (a > 0) and (b > 0) and (c > 0) then ...
Re: Was stimmt an meinem Programm nicht? Dreiecksungleichung?
Oh mein Gott. Das stimmt! Warum geht das so auf einmal! Was hat das >0 mit der Änderung von 7 auf 8 zu tun??? Jetzt bin ich interessiert!Hitman hat geschrieben:Bitte das nächste mal die code-Tags um deinen Code legen - sieht schöner im Forum aus
Zu deinem Problem:
"if a and b and c > 0" das macht nicht, was du denkst, das es macht ... da dir die Details wahrscheinlich nix nützen, erspar ich dir die Erklärung, wenn es dich doch interessiert, frag nach, oder schau mal nach Binären Operatoren
Was du stattdessen wohl willst is:
if (a > 0) and (b > 0) and (c > 0) then ...

Re: Was stimmt an meinem Programm nicht? Dreiecksungleichung?
AND kann zwei verschiedene Bedeutungen haben:
Du meintest das: http://www.freepascal.org/docs-html/ref/refsu37.html" onclick="window.open(this.href);return false;
hast aber das erwischt: http://www.freepascal.org/docs-html/ref/refsu36.html" onclick="window.open(this.href);return false;
Letzteres z.B.
Du meintest das: http://www.freepascal.org/docs-html/ref/refsu37.html" onclick="window.open(this.href);return false;
hast aber das erwischt: http://www.freepascal.org/docs-html/ref/refsu36.html" onclick="window.open(this.href);return false;
Letzteres z.B.
Code: Alles auswählen
var a,b:byte;
begin
a:=%00000111;
b:=%00000101;
caption:=inttostr(a and b);
//oder caption:=inttostr(a or b);
end;
Re: Was stimmt an meinem Programm nicht? Dreiecksungleichung?
joa kann sein.. aber das, was da steht, sagt mir (der armen, unschuldigen, nichtswissenden Schülerin) nichts.. hmm geht das auch auf deutsch für anfänger?theo hat geschrieben:AND kann zwei verschiedene Bedeutungen haben:
Du meintest das: http://www.freepascal.org/docs-html/ref/refsu37.html" onclick="window.open(this.href);return false;
hast aber das erwischt: http://www.freepascal.org/docs-html/ref/refsu36.html" onclick="window.open(this.href);return false;
-
- Beiträge: 512
- Registriert: Mo 25. Aug 2008, 18:17
- OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
- CPU-Target: x86
- Wohnort: Chemnitz
Re: Was stimmt an meinem Programm nicht? Dreiecksungleichung?
Purer Zufall, aufgrund der gewählten Zahlen: 5 = (binär) 00000101, 7 = 00000111, 8 = 00001000Doreen H. hat geschrieben:Oh mein Gott. Das stimmt! Warum geht das so auf einmal! Was hat das >0 mit der Änderung von 7 auf 8 zu tun??? Jetzt bin ich interessiert!Danke!
00000101 AND 00000111 = 00000101 --> und das is größer 0
hingegen:
00000101 AND 00001000 = 00000000 (es stimmt quasi kein einziges gesetztes Bit überein; da wo bei der 5 in Binärdarstellung 1en sind, sind bei der 8 in Binärdarstellung 0en [ums mal bildlich auszudrücken], somit ist für jedes einzelne Bit der Ausdruck (WAHR und FALSCH = FALSCH) - es kann nunmal nicht gleichzeitig WAHR und FALSCH sein)
am Schluss steht also nur noch 0 da, und das is nich größer als 0

Re: Was stimmt an meinem Programm nicht? Dreiecksungleichung?
achso
jetzt wirds mir auch langsam klar... aber sowas wissen nur eingefleischte programmierer ^^
Vielen Dank!


-
- Lazarusforum e. V.
- Beiträge: 3178
- 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: Was stimmt an meinem Programm nicht? Dreiecksungleichung?
Kleiner Großer Fehler:Hitman hat geschrieben:Binären Operatoren
Binäre Operatoren sind Operatoren mit zwei Operanden (bi = zwei). Das heißt aber nicht, dass man ihn unbedingt auf binäre Zahlen/Ausdrücke anwenden muss. Der String Operator "+" ist auch ein binärer Operator und Strings sind in semantischer Hinsicht keine Zahlen.
Es gibt auch noch unäre Operatoren (bspw. das logische "not" oder den Vorzeichenumkehrer "-") und ternäre Operatoren. Von letzterem gibt es in Pascal gar keinen und in anderen Sprachen (C, PHP, etc.) häufig nur eine Kurzschreibweise für eine If-Bedingung (result = a > b ? x : y;).
Gemeint sind die logischen (bitweisen) und die boolschen Operatoren, die theo bereits in der Sprachreferenz verlinkt hat.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein
-
- Beiträge: 512
- Registriert: Mo 25. Aug 2008, 18:17
- OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
- CPU-Target: x86
- Wohnort: Chemnitz
Re: Was stimmt an meinem Programm nicht? Dreiecksungleichung?
Stimmt natürlich, ich dachte an die "bitwise operators", hab daraus aber gedanklich "binär" gemacht. Danke.Socke hat geschrieben:Kleiner Großer Fehler:Hitman hat geschrieben:Binären Operatoren
Binäre Operatoren sind Operatoren mit zwei Operanden (bi = zwei). Das heißt aber nicht, dass man ihn unbedingt auf binäre Zahlen/Ausdrücke anwenden muss. Der String Operator "+" ist auch ein binärer Operator und Strings sind in semantischer Hinsicht keine Zahlen.
Es gibt auch noch unäre Operatoren (bspw. das logische "not" oder den Vorzeichenumkehrer "-") und ternäre Operatoren. Von letzterem gibt es in Pascal gar keinen und in anderen Sprachen (C, PHP, etc.) häufig nur eine Kurzschreibweise für eine If-Bedingung (result = a > b ? x : y;).
Gemeint sind die logischen (bitweisen) und die boolschen Operatoren, die theo bereits in der Sprachreferenz verlinkt hat.