program na zaliczenie trójkąt i operacje na jego bokach

0

Do 31 grudnia muszę napisać program na zaliczenie... niestety nie wiem jak się za niego zabrać mógłby mi ktoś podpowiedzieć rozwiązanie? Poniżej przedstawiam treść zadania i elementy składające się na jego ocenę:

Proszę napisać program sprawdzający, czy podane 3 liczby a,b,c mogą być bokami trójkąta.
Jeśli tak, to należy obliczyć:

* - promień koła opisanego na tym trójkącie,
* - pole koła opisanego na trójkącie,
* - miary wszystkich katów trójkąta.

Ponadto należy podać czy dany trójkąt jest ostro-, prosto-, czy rozwartokątny. Liczny a, b, c mają być całkowite i należeć do przedziału (0, 250). Liczby te są wprowadzane przez użytkownika programu.

* - Program powinien zostać napisany w języku programowania Object Pascal (w środowisku Delphi)
* - Program powinien być przygotowany, tak aby w laboratorium była możliwość kompilowania i uruchomienia programu oraz edycji kodu.
* - Program powinien być odporny na błędy:
      o wprowadzane przez złośliwego użytkownika,
      o mogące pojawić się podczas wykonywania instrukcji programu (np. próba odczytu danych z nieistniejącego pliku, przepełnienie mogące się pojawić przy niektórych działaniach matematycznych itp.).
* Odporność programu na błędy oznacza, że:
      o program nie zawiesza się,
      o program informuje użytkownika o wystąpieniu błędu,
      o jeśli pozwala na to charakter błędu, program prosi użytkownika o wprowadzenie poprawek, a następnie wykonuje kolejne instrukcje,
      o wystąpienie błędu nie powoduje otrzymania niewłaściwych wyników.
0

Ja jestem cieniak jeżeli chodzi o matme, a poza tym nie pokazałeś nawet że coś sam próbowałeś w
kierunku stworzenia programu uczynić. Także podejrzewam, że nie chodziłeś w ogóle na zajęcia no i
teraz idziesz na łatwiznę. Zleć komuś napisanie takiego programu, na przykład adf88 [reklama nie ;)]
powinien dać radę napisać taki program jak sam pisze "za nieduże pieniądze". I małą podpowiedź co
do napisania takiego programu, a szczególnie jak określić jaki masz trójkąt z danych boków podał ów
adf88 w temacie przeniesionym do kosza: http://4programmers.net/Forum/502697 ja
ze swojej strony dodam tylko, że poprawność wprowadzonych danych (czy są liczbami) w aplikacji
konsolowej w Delphi bez używania dodatkowych modułów w uses - zrobisz przy pomocy funkcji Val.
Poza tym wpisując w google "delphi pole trójkąta" powinieneś dostać "garść" pomocnych informacji.
Oraz oczywiście nieoceniona Wikipedia http://pl.wikipedia.org/wiki/Trójkąt i trochę samodzielności :)
A za free możesz mieć to co poniżej, sprawdzenie poprawności danych oraz czy trzy podane boki
utworzą w ogóle trójkąt. Dodatkowo pole trójkąta. Nie wiem czy są jakieś błedy. Dalej kombinuj sam.

program Trojkaty;

{$APPTYPE CONSOLE}

const
  MinDlugoscBoku = 1;
  MaxDlugoscBoku = 250;
var
  A, B, C : integer;
  P : Real;
  Odp : string;
  Code : integer;
  ToTrojkat : boolean;
begin
repeat
  repeat
  Write('Podaj bok A: ');
  Readln(Odp);
  Val(Odp, A, Code);
  until (Code = 0) and (A >= MinDlugoscBoku) and (A <= MaxDlugoscBoku);
  repeat
  Write('Podaj bok B: ');
  Readln(Odp);
  Val(Odp, B, Code);
  until (Code = 0) and (B >= MinDlugoscBoku) and (B <= MaxDlugoscBoku);
  repeat
  Write('Podaj bok C: ');
  Readln(Odp);
  Val(Odp, C, Code);
  until (Code = 0) and (C >= MinDlugoscBoku) and (C <= MaxDlugoscBoku);
  
  if (A <= B + C) and (B <= A + C) and (C <= A + B) then
     begin
     ToTrojkat := True;
     end
     else
     begin
     ToTrojkat := False;
     Writeln('Error: Podane boki nie utworza poprawnego trojkata!');
     end;
until ToTrojkat = True;

  P := (A + B + C) / 2;
  Writeln('Pole trojkata o podanych bokach wynosi:',
  Sqrt(P * (P - A) * (P - B) * (P - C)));
  Readln;
end.
0

tak jak napisał olesio zlec to komus jesli sam nie potrafisz bo nie sadze zeby ktos siedzial nad tym za free.

0

nie chodziło mi konkretnie o kod delphi tylko o jakieś wskazówki co do jego napisania głównie chodziło o sprawdzanie poprawności danych... widzę, że głównie na pieniądzach Wam zależy... chcę ten program sam napisać, prosiłem aby o wskazówki jakieś naprowadzenie... podstawy delphi kojarzę, ale do tej pory miałem jedne ćwiczenia i 2 wykłady z podstaw programowania, gdzie mamy delphi, a nigdy wcześniej nie miałem styczności z niczym innym jak tylko z php. Na wykładach sama teoria praktycznie 0 kodu, natomiast na ćwiczenia wykładowca przyszedł podał zadania i poszedł...

0

dziękuję olesio za ta funkcję VAL poczytam dokładniej o niej i zabiorę się do dalszej części zadania ;] a sprawdzanie czy dany trójkąt istnieje miałem napisane tylko nie wiedziałem co i jak dalej zrobić, by się nie sypał przy wpisaniu nie integer, a np zwykłych liter z klawiatury...

0

zrobilem program ale nie wiem czemu przy niektorych dlugosciach bokow nie ma sumy 180 stopni ktos ma jakis pomysl co jest nie tak?

oto kod:

program trojkaty;

{$APPTYPE CONSOLE}

uses
  SysUtils, math;

const
  min = 1;
  max = 250;
var
  a, b, c, code : integer;
  bok : string;
  trojkat : boolean;
  p, pole_trojkata, pole_kola, R : real;
  sin_alpha, sin_beta, sin_gama, alpha, beta, gama  : real;
begin
repeat
  repeat
  write('Podaj dlugosc boku a: ');
  readln(bok);
  Val(bok, a, code);
  if (code <> 0) then writeln('Podano nieprawidlowy typ danych');
  if (a < min) or (a > max) then writeln('Dlugosci bokow musza byc liczbami calkowitymi z przedzialu od 1 do 250');
  until (code = 0) and (a >= min) and (a <= max);
  repeat
  write('Podaj dlugosc boku b: ');
  readln(bok);
  Val(bok, b, code);
  if (code <> 0) then writeln('Podano nieprawidlowy typ danych');
  if (a < min) or (a > max) then writeln('Dlugosci bokow musza byc liczbami calkowitymi z przedzialu od 1 do 250');
  until (code = 0) and (b >= min) and (b <= max);
  repeat
  write('Podaj dlugosc boku c: ');
  readln(bok);
  Val(bok, c, code);
  if (code <> 0) then writeln('Podano nieprawidlowy typ danych');
  if (a < min) or (a > max) then writeln('Dlugosci bokow musza byc liczbami calkowitymi z przedzialu od 1 do 250');
  until (code = 0) and (c >= min) and (c <= max);

  if (a <= b + c) and (b <= a + c) and (c <= a + b) then
     begin
     trojkat := True;
     end
     else
     begin
     trojkat := False;
     writeln('Podane dlugosci nie moga byc dlugosciami bokow trojkata');
     end;
until trojkat = True;
  writeln('Podane dlugosci moga byc dlugosciami trojkata');
  p  := (a + b + c)/2;
  pole_trojkata := sqrt(p * (p - a) * (p - b) * (p - c));
  R := (a * b * c)/(4 * pole_trojkata);
  writeln('Dlugosc promienia opisanego na tym trojkacie wynosi: ', R:0:4);
  pole_kola := PI * r * r;
  writeln('Pole okregu opisanego na tym trojkacie wynosi: ', pole_kola:0:4);
  sin_alpha := a/(2*R);
  sin_beta := b/(2*R);
  sin_gama := c/(2*R);
  alpha := RadToDeg(ArcSin(sin_alpha));
  beta := RadToDeg(ArcSin(sin_beta));
  gama := RadToDeg(ArcSin(sin_gama));
  if (alpha > 90) or (beta > 90) or (gama > 90) then writeln('Jest to trojkat rozwartokatny')
  else
  begin
    if (alpha = 90) or (beta = 90) or (gama = 90) then writeln('Jest to trojkat prostokatny')
    else writeln('jest to trojkat ostrokatny');
  end;
  writeln('wartosc kata alpha: ',alpha:0:2);
  writeln('wartosc kata beta: ',beta:0:2);
  writeln('wartosc kata gamma: ',gama:0:2);
  readln;
end.
0

Nie wiem dlaczego nie wychodzi 180 stopni - kod wydaje mi się poprawny, jedyne co bym poprawił to dał
funkcje oraz procedury z wielkiej litery, a także nazwy stałych oraz zmiennych równiez dał z wielkiej litery.
Poza tym przy pobieraniu B sprawdzasz procedurą Val, wartość boku A - nie B. Poprawiłem i jest tak:

program trojkaty;

{$APPTYPE CONSOLE}

uses
  Math;

const
  Min = 1;
  Max = 250;
var
  A, B, C, Code : integer;
  Bok : string;
  Trojkat : boolean;
  P, Pole_Trojkata, Pole_Kola, R : Real;
  Sin_Alpha, Sin_Beta, Sin_Gama, Alpha, Beta, Gama : Real;
begin
repeat
  repeat
  Write('Podaj dlugosc boku A: ');
  Readln(bok);
  Val(Bok, A, Code);
  if (code <> 0) then Writeln('Podano nieprawidlowy typ danych.');
  if (A < Min) or (A > Max) then Writeln('Dlugosci bokow musza byc liczbami calkowitymi z przedzialu od 1 do 250.');
  until (Code = 0) and (A >= Min) and (A <= Max);
  repeat
  Write('Podaj dlugosc boku B: ');
  Readln(Bok);
  Val(Bok, B, Code);
  if (Code <> 0) then writeln('Podano nieprawidlowy typ danych.');
  if (B < min) or (B > max) then writeln('Dlugosci bokow musza byc liczbami calkowitymi z przedzialu od 1 do 250.');
  until (Code = 0) and (B >= Min) and (B <= Max);
  repeat
  Write('Podaj dlugosc boku C: ');
  readln(Bok);
  Val(Bok, C, Code);
  if (Code <> 0) then
     Writeln ('Podano nieprawidlowy typ danych.');
  if (C < min) or (C > max) then
     Writeln('Dlugosci bokow musza byc liczbami calkowitymi z przedzialu od 1 do 250.');
  until (Code = 0) and (C >= Min) and (C <= Max);

  if (A <= B + C) and (B <= A + C) and (C <= A + B) then
     begin
     Trojkat := True;
     end
     else
     begin
     Trojkat := False;
     Writeln('Podane dlugosci nie moga byc dlugosciami bokow trojkata.');
     end;
until Trojkat = True;
  Writeln('Podane dlugosci moga byc dlugosciami trojkata');
  P := (A + B + C) / 2;
  Pole_Trojkata := Sqrt(P * (P - A) * (P - B) * (P - C));
  R := (A * B * C) / (4 * Pole_Trojkata);
  Writeln('Dlugosc promienia opisanego na tym trojkacie wynosi: ', R:0:4);
  Pole_kola := PI * R * R;
  Writeln('Pole okregu opisanego na tym trojkacie wynosi: ', Pole_Kola:0:4);
  Sin_Alpha := A / (2 * R);
  Sin_Beta := B / (2 * R);
  Sin_Gama := C / (2 * R);
  Alpha := RadToDeg(ArcSin(sin_alpha));
  Beta := RadToDeg(ArcSin(Sin_Beta));
  Gama := RadToDeg(ArcSin(Sin_Gama));
  if (Alpha > 90) or (Beta > 90) or (Gama > 90) then
     Writeln('Jest to trojkat rozwartokatny.')
  else
  begin
    if (Alpha = 90) or (Beta = 90) or (Gama = 90) then
       Writeln('Jest to trojkat prostokatny.')
       else
       Writeln('Jest to trojkat ostrokatny.');
  end;
  Writeln('Wartosc kata Alpha: ', Alpha:0:2);
  Writeln('Wartosc kata Beta: ', Beta:0:2);
  Writeln('Wartosc kata Gamma: ', Gama:0:2);
  Readln;
end.
0

Nie wiem dlaczego nie wychodzi 180 stopni - kod wydaje mi się poprawny, jedyne co bym poprawił to
dał funkcje oraz procedury z wielkiej litery, a także nazwy stałych oraz zmiennych równiez dał z
wielkiej litery. Poza tym przy pobieraniu B sprawdzasz procedurą Val, wartość boku A - nie B.
Poprawiłem i jest tak, jak widzisz poniżej. Moduł SysUtils jest zbędny, a Math jak widać przydał się.
Tylko jak ktoś z Was może - to niech sprawdzi jeszcze ten kod, dlaczego suma kątów jest różna od
180. I dodatkowo bym jeszcze zrobił komunikaty o błędach jako stałe, bo się powtarzają, ale to już jest
drobna kosmetyka i nie jest konieczna :) No i jak widzisz, dałeś radę napisać ten program samodzielnie.

program trojkaty;

{$APPTYPE CONSOLE}

uses
  Math;

const
  Min = 1;
  Max = 250;
var
  A, B, C, Code : integer;
  Bok : string;
  Trojkat : boolean;
  P, Pole_Trojkata, Pole_Kola, R : Real;
  Sin_Alpha, Sin_Beta, Sin_Gama, Alpha, Beta, Gama : Real;
begin
repeat
  repeat
  Write('Podaj dlugosc boku A: ');
  Readln(Bok);
  Val(Bok, A, Code);
  if (Code > 0) then
     Writeln('Podano nieprawidlowy typ danych.');
  if (A < Min) or (A > Max) then
     Writeln('Dlugosci bokow musza byc liczbami calkowitymi z przedzialu od 1 do 250.');
  until (Code = 0) and (A >= Min) and (A <= Max);
  repeat
  Write('Podaj dlugosc boku B: ');
  Readln(Bok);
  Val(Bok, B, Code);
  if (Code > 0) then
      Writeln('Podano nieprawidlowy typ danych.');
  if (B < min) or (B > max) then
      Writeln('Dlugosci bokow musza byc liczbami calkowitymi z przedzialu od 1 do 250.');
  until (Code = 0) and (B >= Min) and (B <= Max);
  repeat
  Write('Podaj dlugosc boku C: ');
  readln(Bok);
  Val(Bok, C, Code);
  if (Code > 0) then
     Writeln('Podano nieprawidlowy typ danych.');
  if (C < min) or (C > max) then
     Writeln('Dlugosci bokow musza byc liczbami calkowitymi z przedzialu od 1 do 250.');
  until (Code = 0) and (C >= Min) and (C <= Max);

  if (A <= B + C) and (B <= A + C) and (C <= A + B) then
     begin
     Trojkat := True;
     end
     else
     begin
     Trojkat := False;
     Writeln('Podane dlugosci nie moga byc dlugosciami bokow trojkata.');
     end;
until Trojkat = True;
  Writeln('Podane dlugosci moga byc dlugosciami trojkata');
  P := (A + B + C) / 2;
  Pole_Trojkata := Sqrt(P * (P - A) * (P - B) * (P - C));
  R := (A * B * C) / (4 * Pole_Trojkata);
  Writeln('Dlugosc promienia opisanego na tym trojkacie wynosi: ', R:0:4);
  Pole_kola := PI * R * R;
  Writeln('Pole okregu opisanego na tym trojkacie wynosi: ', Pole_Kola:0:4);
  Sin_Alpha := A / (2 * R);
  Sin_Beta := B / (2 * R);
  Sin_Gama := C / (2 * R);
  Alpha := RadToDeg(ArcSin(sin_alpha));
  Beta := RadToDeg(ArcSin(Sin_Beta));
  Gama := RadToDeg(ArcSin(Sin_Gama));
  if (Alpha > 90) or (Beta > 90) or (Gama > 90) then
     Writeln('Jest to trojkat rozwartokatny.')
  else
  begin
    if (Alpha = 90) or (Beta = 90) or (Gama = 90) then
       Writeln('Jest to trojkat prostokatny.')
       else
       Writeln('Jest to trojkat ostrokatny.');
  end;
  Writeln('Wartosc kata Alpha: ', Alpha:0:2);
  Writeln('Wartosc kata Beta: ', Beta:0:2);
  Writeln('Wartosc kata Gamma: ', Gama:0:2);
  Readln;
end.
0
olesio napisał(a)

No i jak widzisz, dałeś radę napisać ten program samodzielnie.

no wiesz ^^ ja nigdzie nie napisałem, że nie dam rady napisać tego programu samodzielnie, lecz miałem na myśli, że nie mam pomysłu jak się do tego zabrać, a chodziło głównie o sprawdzanie poprawności danych wprowadzanych przez użytkownika :P jeszcze teraz zastanowić się, dlaczego nie zawsze suma miar kątów jest równa 180 stopni

0

Zamiast komunikatów, lepiej zrobić jest funkcję:

program Trojkat;

{$APPTYPE CONSOLE}

uses
  Math;

const
  Min = 1;
  Max = 250;

var
  A, B, C: Byte;
  Code: Integer;
  Bok: String;
  CTrojkat: Boolean;
  P, Pole_Trojkata, Pole_Kola, R: Real;
  Sin_Alpha, Sin_Beta, Sin_Gama, Alpha, Beta, Gama: Real;

function PressABC(PressC: Char): Integer;
var
  PressI: Integer;
begin
  repeat
    Write('Podaj dlugosc boku ' + PressC + ': ');
    Readln(Bok);
    Val(Bok, PressI, Code);

    if (Code > 0) then
     Writeln('Podano nieprawidlowy typ danych.');

    if (PressI < Min) or (PressI > Max) then
     Writeln('Dlugosci bokow musza byc liczbami calkowitymi z '+
       'przedzialu od 1 do 250.');
  until (Code = 0) and (PressI >= Min) and (PressI <= Max);
  Result:= PressI;
end;

begin
  repeat
    A := PressABC('A');
    B := PressABC('B');
    C := PressABC('C');

    if (A <= B + C) and (B <= A + C) and (C <= A + B) then
     CTrojkat := True
    else
     begin
       CTrojkat := False;
       Writeln; Writeln
         ('Podane dlugosci nie moga byc dlugosciami bokow trojkata.');
     end;

  until CTrojkat = True;

  Writeln; Writeln('Podane dlugosci moga byc dlugosciami trojkata.');
  P := (A + B + C) / 2;
  Pole_Trojkata := Sqrt(P * (P - A) * (P - B) * (P - C));
  R := (A * B * C) / (4 * Pole_Trojkata);

  Writeln; Writeln
    ('Dlugosc promienia opisanego na tym trojkacie wynosi: ', R:0:4);
  Pole_Kola := PI * R * R;

  Writeln('Pole okregu opisanego na tym trojkacie wynosi: ', Pole_Kola:0:4);
  Sin_Alpha := A / (2 * R);
  Sin_Beta := B / (2 * R);
  Sin_Gama := C / (2 * R);
  Alpha := RadToDeg(ArcSin(Sin_Alpha));
  Beta := RadToDeg(ArcSin(Sin_Beta));
  Gama := RadToDeg(ArcSin(Sin_Gama));

  Writeln;

  if (Alpha > 90) or (Beta > 90) or (Gama > 90) then
   Writeln('Jest to trojkat rozwartokatny.')
  else
   begin
     if (Alpha = 90) or (Beta = 90) or (Gama = 90) then
      Writeln('Jest to trojkat prostokatny.')
     else
      Writeln('Jest to trojkat ostrokatny.');
   end;

  Writeln;
  Writeln('Wartosc kata Alpha: ', Alpha:0:2);
  Writeln('Wartosc kata Beta: ', Beta:0:2);
  Writeln('Wartosc kata Gamma: ', Gama:0:2);

  Readln;
end.
0

funkcja funkcja, ale pytanie dlaczego przy niektórych długościach suma miar kątów jest < 180

0

jest jeszcze jeden problem ^^ spróbujcie sobie wpisać długości boków 1, 2, 3. Program coś wyświetla i tak szybko jak wyświetlił, tak się zamyka ^^

0

Bo nie może obliczyć Alpha, Beta i Gama.

poza tym znalazłem inny wzór na długość promienia okręgu opisanego:

R = ( a + b + c ) / 4P

a, b, c - boki trójkąta na którym opisany jest okrąg
P - pole trójkąta na którym opisany jest okrąg

ale gdy go zastosowałem program robi to samo, co w przypadku wpisania 1, 2, 3.

0
Grzegorz16 napisał(a)

Bo nie może obliczyć Alpha, Beta i Gama.

poza tym znalazłem inny wzór na długość promienia okręgu opisanego:

R = ( a + b + c ) / 4P

a, b, c - boki trójkąta na którym opisany jest okrąg
P - pole trójkąta na którym opisany jest okrąg

ale gdy go zastosowałem program robi to samo, co w przypadku wpisania 1, 2, 3.

mylisz się jeśli chodzi o obliczanie sinusow itp dobrze jest zrobione problem tkwi w czymś innym...

jak masz trójkąt 3 3 5 to przy wierzchołku jest rozwarty tylko.. jak wpisujesz 2 2 3 to kąt gamma jest rozwarty i wtedy wartość sinusa dla tego kata jest taka sama jak dla ostrego mianowicie muszę zrobić sprawdzanie czy kąt jest rozwarty i wtedy od 180 odjąć wartość kąta chyba sobie poradzę i zamieszczę tu poprawny kod może komuś się przyda ^^

0

Primo
Napisałem ci inny prawidłowy wzór na obliczanie R >> źródło

Secundo
Nie powiedziałem, że źle obliczasz sinusy, tylko, że tam występuje błąd i program od razu kończy prace (w przypadku podania 1, 2, 3 lub zmienienia wzoru).

0
Grzegorz16 napisał(a)

Primo
Napisałem ci inny prawidłowy wzór na obliczanie R >> źródło

Secundo
Nie powiedziałem, że źle obliczasz sinusy, tylko, że tam występuje błąd i program od razu kończy prace (w przypadku podania 1, 2, 3 lub zmienienia wzoru).

źle przepisałeś wzór... mój wzór jest ok ;]

w Twoim źródle jest napisane:

P = ( abc ) / 4R, gdzie:
a,b,c - boki trójkąta
R - promień okręgu opisanego na tym trójkącie

przekształcając wzór otrzymujemy:

P = (abc)/4R | R
P * R = (a
bc)/4 | :P
R = (a
b*c)/4P

u mnie w kodzie wygląda to następująco:

R := (A * B * C) / (4 * Pole_Trojkata);

czyli jednakowo tak jak jest zapisane we wzorze powyżej...

pobawiłem się trochę ze sprawdzaniem wraz z koleżanką, która od dziś jest moim guru matematycznym i doszliśmy do wniosku, że błąd jest taki, że oblicza sinus kąta i z niego wartość kąta. Jednakże sinus kąta jest taki sam dla par kątów np. 30 i 160, 60 i 120. Dodałem sprawdzanie czy dany trójkąt jest rozwartokątny czy nie. I w zależności od wyniku dwa sposoby obliczania kąta gamma ;]

ukończony kod programu zamieszczam poniżej:

program trojkaty;

{$APPTYPE CONSOLE}

uses
  SysUtils, math;

const
  Min_val = 1;
  Max_val = 250;
var
  A, B, C, X, Code : integer;
  Bok : string;
  Trojkat : boolean;
  P, Pole_Trojkata, Pole_Kola, R : Real;
  Sin_Alpha, Sin_Beta, Sin_Gama, Alpha, Beta, Gama, suma : Real;
begin
repeat
  repeat
  Write('Podaj dlugosc boku A: ');
  Readln(Bok);
  Val(Bok, A, Code);
  if (Code > 0) then
     Writeln('Podano nieprawidlowy typ danych.');
  if (A < Min_val) or (A > Max_val) then
     Writeln('Dlugosci bokow musza byc liczbami calkowitymi z przedzialu od 1 do 250.');
  until (Code = 0) and (A >= Min_val) and (A <= Max_val);
  repeat
  Write('Podaj dlugosc boku B: ');
  Readln(Bok);
  Val(Bok, B, Code);
  if (Code > 0) then
      Writeln('Podano nieprawidlowy typ danych.');
  if (B < Min_val) or (B > Max_val) then
      Writeln('Dlugosci bokow musza byc liczbami calkowitymi z przedzialu od 1 do 250.');
  until (Code = 0) and (B >= Min_val) and (B <= Max_val);
  repeat
  Write('Podaj dlugosc boku C: ');
  readln(Bok);
  Val(Bok, C, Code);
  if (Code > 0) then
     Writeln('Podano nieprawidlowy typ danych.');
  if (C < Min_val) or (C > Max_val) then
     Writeln('Dlugosci bokow musza byc liczbami calkowitymi z przedzialu od 1 do 250.');
  until (Code = 0) and (C >= Min_val) and (C <= Max_val);

  if ((Abs(B-C) < A) AND (A < (B + C))) then
     begin
     Trojkat := True;
     end
     else
     begin
     Trojkat := False;
     Writeln('Podane dlugosci nie moga byc dlugosciami bokow trojkata.');
     end;
until Trojkat = True;
  Writeln('Podane dlugosci moga byc dlugosciami trojkata');
  P := (A + B + C) / 2;
  Pole_Trojkata := Sqrt(P * (P - A) * (P - B) * (P - C));
  R := (A * B * C) / (4 * Pole_Trojkata);
  Writeln('Dlugosc promienia opisanego na tym trojkacie wynosi: ', R:0:4);
  Pole_kola := PI * R * R;
  Writeln('Pole okregu opisanego na tym trojkacie wynosi: ', Pole_Kola:0:4);
  if (A > B) then
  begin
      X := A;
      A := B;
      B := X;
  end;
  if(B > C) then
  begin
      X := B;
      B := C;
      C := X;
  end;
  Sin_Alpha := A / (2 * R);
  Sin_Beta := B / (2 * R);
  Sin_Gama := C / (2 * R);
  Alpha := RadToDeg(ArcSin(Sin_Alpha));
  Beta := RadToDeg(ArcSin(Sin_Beta));
  if  ((sqr(A) + sqr(B)) < sqr(C)) then Gama := 180-(RadToDeg(ArcSin(Sin_Gama)))
  else Gama := RadToDeg(ArcSin(Sin_Gama));
  suma := Alpha + Beta + Gama;
  if (Alpha > 90) or (Beta > 90) or (Gama > 90) then
     Writeln('Jest to trojkat rozwartokatny.')
  else
  begin
    if (Alpha = 90) or (Beta = 90) or (Gama = 90) then
       Writeln('Jest to trojkat prostokatny.')
       else
       Writeln('Jest to trojkat ostrokatny.');
  end;
  Writeln('Wartosc kata Alpha: ', Alpha:0:2);
  Writeln('Wartosc kata Beta: ', Beta:0:2);
  Writeln('Wartosc kata Gamma: ', Gama:0:2);
  Writeln('Suma katow wynosi: ', suma:0:2);
  Readln();
end.

Proszę, abyście jeszcze sobie go trochę przetestowali i dali znać w razie jakby występowały jakieś błędy... ;]

0

na koncu mala literowka powinno byc:

Readln;

a jest:

Readln();
0
ZoCiM napisał(a)

źle przepisałeś wzór... mój wzór jest ok ;]

w Twoim źródle jest napisane:

dobrze przepisał, ale wzór jest zły, nigdzie nie napisał, że twój jest zły.

ZoCiM napisał(a)

Liczby a, b, c mają być całkowite i należeć do przedziału (0, 250)

Czyli można powiedzieć, że lepiej dla zmniennych A, B, C pasuje typ Byte, niż Integer.

Ko na odczytanie zmiennych A, B, C jest u ciebie dłuższy niż u CheSteR'a. Jeśli miałbyś wprowadzać poprawki, np. literówka w wyświetlanym tekscie, musisz u siebie poprawić to 3x...
Stosowanie wcięc poprawia czytelność kodu. a dodatkowe Writeln; jak zastosował CheSteR poprawia także czytelność tekstu wyświetlanego na ekranie.
Mimo wszystko gratulacje. Załącze jeszcze ten sam kod poprawny jednak estetycznie.

program Trojkaty;

{$APPTYPE CONSOLE}

uses
  SysUtils. Math;   // SysUtils czy aby na pewno potrzebne?

const
  Min_Val = 1;
  Max_Val = 250;

var
  A, B, C: Byte;
  Code: Integer;
  Bok: String;
  Trojkat: Boolean;
  P, Pole_Trojkata, Pole_Kola, R: Real;
  Sin_Alpha, Sin_Beta, Sin_Gama, Alpha, Beta, Gama, Suma: Real;

function PressABC(PressC: Char): Integer;
var
  PressI: Integer;
begin
  repeat
    Write('Podaj dlugosc boku ' + PressC + ': ');
    Readln(Bok);
    Val(Bok, PressI, Code);

    if (Code > 0) then
     Writeln('Podano nieprawidlowy typ danych.');

    if (PressI < Min_Val) or (PressI > Max_Val) then
     Writeln('Dlugosci bokow musza byc liczbami calkowitymi z '+
       'przedzialu od 1 do 250.');
  until (Code = 0) and (PressI >= Min_Val) and (PressI <= Max_Val);
  Result:= PressI;
end;

begin
  repeat
    A := PressABC('A');
    B := PressABC('B');
    C := PressABC('C');

    if ((Abs(B-C) < A) and (A < (B + C))) then
     Trojkat := True
    else
     begin
       Trojkat := False;
       Writeln; Writeln
         ('Podane dlugosci nie moga byc dlugosciami bokow trojkata.');
     end;

  until Trojkat = True;

  Writeln; Writeln('Podane dlugosci moga byc dlugosciami trojkata.');
  P := (A + B + C) / 2;
  Pole_Trojkata := Sqrt(P * (P - A) * (P - B) * (P - C));
  R := (A * B * C) / (4 * Pole_Trojkata);

  Writeln; Writeln
    ('Dlugosc promienia opisanego na tym trojkacie wynosi: ', R:0:4);
  Pole_Kola := Pi * R * R;

  Writeln('Pole okregu opisanego na tym trojkacie wynosi: ', Pole_Kola:0:4);

  if (A > B) then
  begin
     X := A;
     A := B;
     B := X;
  end;

  if (B > C) then
  begin
     X := B;
     B := C;
     C := X;
  end;

  Sin_Alpha := A / (2 * R);
  Sin_Beta := B / (2 * R);
  Sin_Gama := C / (2 * R);
  Alpha := RadToDeg(ArcSin(Sin_Alpha));
  Beta := RadToDeg(ArcSin(Sin_Beta));
  if ((Sqr(A) + Sqr(B)) < Sqr(C)) then 
   Gama := 180 - (RadToDeg(ArcSin(Sin_Gama)))
  else 
   Gama := RadToDeg(ArcSin(Sin_Gama));
  Suma := Alpha + Beta + Gama;

  Writeln;

  if (Alpha > 90) or (Beta > 90) or (Gama > 90) then
   Writeln('Jest to trojkat rozwartokatny.')
  else
   begin
     if (Alpha = 90) or (Beta = 90) or (Gama = 90) then
      Writeln('Jest to trojkat prostokatny.')
     else
      Writeln('Jest to trojkat ostrokatny.');
   end;

  Writeln;
  Writeln('Wartosc kata Alpha: ', Alpha:0:2);
  Writeln('Wartosc kata Beta: ', Beta:0:2);
  Writeln('Wartosc kata Gamma: ', Gama:0:2);
  Writeln('Suma katow wynosi: ', Suma:0:2);

  Readln;
end.

Niestety nie testowałem go, ponieważ tu skąd pisze nie mam delphi ani tp.

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