Prosty program w Delphi - pomoc w znalezieniu błędów

0

Witam,

Dostałem dość prosty program do sprawdzenia pod względem ilości błędów. Nigdy wcześniej z Delphi nie miałem do czynienia. Ale z tego co przeanalizowałem to program nie jest jakiś skomplikowany. Sprawdza po wprowadzonych długościach boków czy trójkąt jest równoramienny, równoboczny albo różnoboczny. Korzysta ze znanego warunku trójkąta:
http://www.womkat.edu.pl/files/standaryzacja/grupa18/kmiljon/warunek_trjkta.html

I z tego co widzę na etapie "matematycznym" nie ma żadnego błędu. Funkcja do sprawdzania boków (checksides) działa ok, ale nie jestem pewny czy czegoś nie pominąłem.

Gorzej z etapem pobierania danych z comboboxa. Jest tam sporo przycinania stringów po indexach i może tam być jakiś wyjątek nie obsłużony. Na razie dopatrzyłem się tylko jednego błędu. Program nie wywala błędu, kiedy podamy mu w comboboxie więcej parametrów niż 3, przedzielonych przecinkami. Czyli na przykład jak podamy mu 3,4,8,9,1 to weźmie sobie tylko 3 pierwsze parametry i na nich będzie sprawdzać trójkąta.

Będę wdzięczny za udzielenie pomocy.

unit Unit3;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm3 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Sides: TComboBox;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

function checksides (a, b, c : shortint) : string ;
begin
     begin
          if (c > a+b) or (a > b+c) or (b > a+c) then
          begin
               checksides := 'Not a Triangle';
               form3.edit1.font.color := clRed;
               exit;
          end;
          if (c = 0) or (a = 0) or (b = 0) then
          begin
               checksides := 'Not a Triangle';
               exit;
          end;
          if (a<>b) and (a<>c) and (c<>b) then
             checksides := 'scalene'
          else if (a=b) and (a=c) and (c=b) then
             checksides := 'equilateral'
          else
             checksides := 'isoscolese';
     end;
end;

procedure TForm3.Button1Click(Sender: TObject);
var
thesides : array [0..2] of shortint;
s1, s2, t : shortint;
aside : string;
begin
if sides.text = '' then
   begin
      edit1.text := 'invalid!';
      edit1.font.color := clRed;
      exit;
   end;
s1 := 1; s2 := 1;
for t := 0 to 2 do
    begin
         while (CompareText(Copy(sides.text,s2,1),',') <> 0) and
               (s2 <> Length(sides.text)+1) do
               s2 := s2 + 1;
         thesides[t] := StrtoInt(Copy(sides.text,s1,s2-s1));
         s2 := s2 + 1; s1 := s2;
    end;
edit1.text := checksides(thesides[0],thesides[1],thesides[2]);
end;

end.
5

Jeżeli ten Twój program nie musi koniecznie posiadać tylko jednego pola edycyjnego, to naturalne w tym przypadku jest stworzenie trzech oddzielnych pól typu np. TEdit (lub TSpinEdit) i zrezygnowanie z zabawy z wydziubywaniem trzech pierwszych liczb; Wystarczy wtedy użycie funkcji TryStrToInt i nie będzie trzeba się martwić o nieobsłużone wyjątki;


To zdarzenie najpewniej wywali się, jeżeli podasz dwa przecinki po sobie - funkcja StrToInt dostanie pusty łańcuch i rzuci wyjątkiem; Tak przypuszczam, bo nie dodałeś w załączniku źródeł projektu, aby można potestować;

Poza tym zaprzęganie CompareText i Copy do porównania tylko jednego znaku to jakaś paranoja... Zamiast całego tego warunku:

 while (CompareText(Copy(sides.text,s2,1),',') <> 0) and {...}

można odwołać się po prostu do konkretnego znaku:

while Sides.Text[s2] <> ',' and {...}

Najlepiej będzie skopiować tekst z komponentu do pomocniczej zmiennej, przed operacjami konwersji.

2
furious programming napisał(a):

można odwołać się po prostu do konkretnego znaku

Albo skorzystać z funkcji Pos, PosEx.

1 użytkowników online, w tym zalogowanych: 0, gości: 1