Autor Beitrag
Blacktiger800
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 14.05.13 17:47 
Hallo Delphi Freunde,

ich habe ein kleines Problem bei einer Schulaufgabe, weiß aber nicht, was falsch ist. Die Aufgabe bestehen darin, dass das Programm bestimmen soll, ob es sich um ein gleichseitiges, ein gleichschenkliges, ein rechtwinkliges oder ein allgemeines Dreieck handelt. Wenn ich das Programm starte, und für den a, b und c Wert etwas eingebe, kommt aber meistens das falsche raus ( Bei einem gleichseitigen Dreieck müssten ja eigentlich alle Seiten gleichlang sein, bei mir sind es entweder 2 oder 3 Seiten, die gleich sind.)

Hier ist der Programmtext:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
UNIT UDreiecksarten;

INTERFACE

USES
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;
TYPE
  TDreieck = (gleichseitig, gleichschenklig, rechtwinklig, allgemein);
  TForm1 = CLASS(TForm)
    LbBeschriftung1: TLabel;
    LbBeschriftung2: TLabel;
    LbBeschriftung3: TLabel;
    Ed_A: TEdit;
    Ed_B: TEdit;
    Ed_C: TEdit;
    LbAusgabe: TLabel;
    BtBerechnen: TButton;
    BtAbbrechen: TButton;
    PROCEDURE BtAbbrechenClick(Sender: TObject);
    PROCEDURE BtBerechnenClick(Sender: TObject);
    PROCEDURE DreieckBestimmen (a, b, c: Real; VAR Dreiecksarten: TDreieck);

  PRIVATE
    { Private-Deklarationen }
  PUBLIC
    { Public-Deklarationen }
  END;

VAR
  Form1: TForm1;

IMPLEMENTATION

{$R *.DFM}

PROCEDURE TForm1.BtAbbrechenClick(Sender: TObject);
BEGIN
     Halt;
END(* PROC BtAbbrechenClick *)

PROCEDURE TForm1.BtBerechnenClick(Sender: TObject);
VAR a, b, c: Real;
    Dreiecksarten: TDreieck;
BEGIN
     (* Einlesen *)
     a := StrToFloat (Ed_A.Text);
     b := StrToFloat (Ed_B.Text);
     c := StrToFloat (Ed_C.Text);
     (* Verarbeiten *)
     DreieckBestimmen (a, b, c, Dreiecksarten);
     (* Ausgeben *)
     CASE Dreiecksarten OF
     gleichseitig:      LbAusgabe.Caption := 'Es handelt sich um ein gleichseitiges Dreieck'
                                          + Chr (13)
                                          +' und somit ist das Dreieck'
                                          + Chr (13)
                                          +' auch gleichschenklig.';
     gleichschenklig:   LbAusgabe.Caption := 'Es handelt sich um ein gleichschenkliges Dreieck.';
     rechtwinklig:      LbAusgabe.Caption := 'Es handelt sich um ein rechtwinkliges Dreieck.';
     allgemein:         LbAusgabe.Caption := 'Es handelt sich um ein allgemeines Dreieck.';
     END(* CASE *)
END(* PROC BtBerechnenClick *)

PROCEDURE TForm1.DreieckBestimmen (a, b, c: Real; VAR Dreiecksarten: TDreieck);
BEGIN
     IF NOT ((a > 0AND (b >= a) AND (c >=b))
     THEN LbAusgabe.Caption := 'Nicht alle Seitenlängen sind größer als 0'
     ELSE IF (a = b) AND (a = c) AND (b = c)
                THEN Dreiecksarten := gleichseitig
                ELSE IF (a = b) OR (a = c) OR (b = c)
                     THEN Dreiecksarten := gleichschenklig
                     ELSE IF sqrt (sqr(a + b)) = c
                          THEN Dreiecksarten := rechtwinklig
                          ELSE Dreiecksarten := allgemein
END(* PROC DreieckBestimmen *)
END.


Moderiert von user profile iconMartok: Delphi-Tags hinzugefügt
WasWeißDennIch
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 653
Erhaltene Danke: 160



BeitragVerfasst: Di 14.05.13 17:53 
Benutze doch bitte künftig Delphi-Tags für Code, dann wird dieser schön formatiert und ist besser zu lesen. Zum Problem: das werden wahrscheinlich Fließkommaungenauigkeiten sein. Du solltest Fließkommazahlen nicht mit "=" auf Gleichheit prüfen, sondern aus der Unit math die Funktion SameValue dafür benutzen.
Mathematiker
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 2622
Erhaltene Danke: 1448

Win 7, 8.1, 10
Delphi 5, 7, 10.1
BeitragVerfasst: Di 14.05.13 18:02 
Hallo und :welcome:
bei Deinem Programm sehe ich zwei Probleme.
Erstens ist Dein Satz des Pythagoras falsch. Statt
ausblenden Delphi-Quelltext
1:
IF sqrt (sqr(a + b)) = c					

müsste es heißen
ausblenden Delphi-Quelltext
1:
2:
3:
IF sqrt (sqr(a) + sqr(b)) = c
...
IF sqr(a) + sqr(b) = sqr(c)  //das ist besser

aber auch nur, wenn c mit Sicherheit die längste Seite ist. Es sieht aber so aus, als ob das immer so sein soll.
Es ist auch besser das Quadrat als die Wurzel zu benutzen.

Zweitens gibt Deine Methode Dreieckbestimmen keinen korrekten Wert zurück, wenn die erste Bedingung erfüllt ist, d.h kein Dreieck in Deinem Sinne vorliegt.
Außerdem ist es immer problematisch real-Werte zu vergleichen; besser wären integer-Größen. Allerdings kenne ich die Aufgabe ja nicht genau.

Beste Grüße
Mathematiker

_________________
Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein

Für diesen Beitrag haben gedankt: Blacktiger800
Blacktiger800 Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Di 14.05.13 18:22 
Alles klar danke, es geht nun (=