Was stimmt an meinem Programm nicht? Dreiecksungleichung?

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
Doreen H.
Beiträge: 31
Registriert: Mi 9. Jun 2010, 15:11

Was stimmt an meinem Programm nicht? Dreiecksungleichung?

Beitrag von Doreen H. »

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?

Hitman
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?

Beitrag von Hitman »

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 ...

Doreen H.
Beiträge: 31
Registriert: Mi 9. Jun 2010, 15:11

Re: Was stimmt an meinem Programm nicht? Dreiecksungleichung?

Beitrag von Doreen H. »

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 ...
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!

Benutzeravatar
theo
Beiträge: 10871
Registriert: Mo 11. Sep 2006, 19:01

Re: Was stimmt an meinem Programm nicht? Dreiecksungleichung?

Beitrag von theo »

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.

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;

Doreen H.
Beiträge: 31
Registriert: Mi 9. Jun 2010, 15:11

Re: Was stimmt an meinem Programm nicht? Dreiecksungleichung?

Beitrag von Doreen H. »

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;
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?

Hitman
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?

Beitrag von Hitman »

Doreen 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!
Purer Zufall, aufgrund der gewählten Zahlen: 5 = (binär) 00000101, 7 = 00000111, 8 = 00001000

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 ;-)

Doreen H.
Beiträge: 31
Registriert: Mi 9. Jun 2010, 15:11

Re: Was stimmt an meinem Programm nicht? Dreiecksungleichung?

Beitrag von Doreen H. »

achso :) jetzt wirds mir auch langsam klar... aber sowas wissen nur eingefleischte programmierer ^^ :) Vielen Dank!

Socke
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?

Beitrag von Socke »

Hitman hat geschrieben:Binären Operatoren
Kleiner Großer Fehler:
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

Hitman
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?

Beitrag von Hitman »

Socke hat geschrieben:
Hitman hat geschrieben:Binären Operatoren
Kleiner Großer Fehler:
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.
Stimmt natürlich, ich dachte an die "bitwise operators", hab daraus aber gedanklich "binär" gemacht. Danke.

Antworten