На определение треугольника

Тема в разделе "Pascal and Delphi", создана пользователем Famous, 29 ноя 2010.

  1. Famous

    Famous Гость

    Собственно вот сама задача
    Определить, существует ли треугольник с заданными целочисленными длинами сторон а, в, с. Если да, то определить тип треугольника - остроугольный, тупоугольный или прямоугольный.
    А вот та кодировка которую я составил, но в чём-то присутствует ошибка, когда я ввожу стороны любые какие я бы не ввёл, выдаёт сообщение об ошибки или же что треугольник не существует...помогите разобраться
    Код (Delphi):
    program treygolnichek;
    var x,y,z,m,n,p,x1,x2,y1,y2,l1,l2,l3,c:real;
    begin
    write ('x= ');readln (x);
    write ('y= ');readln (y);
    write ('z= ');readln (z);
    write ('m= ');readln (m);
    write ('n= ');readln (n);
    write ('p= ');readln (p);
    if (x>0) and (y>0) and (z>0) then
    begin
    if (x+y>=z) and (x+z>=y) and (y+z>=x) then
    begin
    l1:=sqrt(sqr((x1-x2))+(sqr(y1-y2)));
    l2:=sqrt(sqr((x1-x2))+(sqr(y1-y2)));
    l3:=sqrt(sqr((x1-x2))+(sqr(y1-y2)));
    c:=(sqr(l1)+sqr(l2)-sqr(l3))/(2*l1*l2);{cosinus naibolshego ygla}
    if abs(c)<1e-10 then writeln('treugolnik pryamougolnyj')
    else if c>0 then writeln('treugolnik ostrougolnyj') {ECJIu cos>0, To ygol Menbshe 90 gradusov}
    else if c<0 then writeln('treugolnik tupougolnyj');{boJIshe 90 gradusov}
    readln;
    end
    else
    writeln('Treygolnik ne sushestvuet"');
    end
    else
    writeln('Treygolnik ne sushestvuet');
    end.
     
  2. XTen

    XTen Active Member

    Регистрация:
    18 сен 2010
    Сообщения:
    26
    Симпатии:
    0
    Готов реализовать!
    ICQ: 410691984
     
  3. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    Может, допустим, что x, у, z - длины сторон.
    а это что за буквы такие? =)
    кто такие x1,x2,y1,y2? не видно, где они задаются.

    либо поясните, что написали, либо вот обращайтесь к отписавшему выше...
     
  4. Famous

    Famous Гость

    сами значения мы задаём когда уже вводим x,y,z,m,n,p,
    хотя я вот насчёт m,n,p сомневаюсь что они вообще лишние...хотя преподавательница говорит мол если вводить то надо 6 переменных...
     
  5. hosm

    hosm * so what *

    Регистрация:
    18 май 2009
    Сообщения:
    2.450
    Симпатии:
    7
    Вот это есть определение переменных:
    а присваивание им значений в коде отсутствует, т.е. они считаются равными 0.
    А они потом используются при вычислениях.
    Поэтому если проходит условие на длину сторон:
    Код (Text):
     if (x>0) and (y>0) and (z>0) then
    begin
    if (x+y>=z) and (x+z>=y) and (y+z>=x) then
    то в результате получается деление на 0 (или переполнение в результате деления на 0, я уже не помню)
    Может, тогда не длину сторон задавали, а координаты точек-вершин треугольника? (x1, y1) (x2, y2) (x3, y3)
    Или она посчитала какие-то промежуточные переменные.
    это что за копипаста? Что тут должно считаться?
     
  6. BashOrgRu

    BashOrgRu Well-Known Member

    Регистрация:
    15 мар 2009
    Сообщения:
    78
    Симпатии:
    0
    Задача легко решается, зная формулу косинуса и то, что при убывания значения косинуса угол возрастает(на отрезке от 0 до пи).

    Код (Delphi):
    program help;
    uses crt;
    var a,b,c:integer;
    cosA,cosB,cosC,MinCos:real;
    begin
    ClrScr;
    writeln('a=');
    readln(a);
    writeln('b=');
    readln(b);
    writeln('c=');
    readln(c);
    if (a+b>=c) and (a+c>=b) and (b+c>=a) then
    begin
    {Применям cosX= (y^2+z^2-x^2)/2yz}
    cosA:=(b*b+c*c-a*a)/(2*b*c);
    cosB:=(c*c+a*a-b*b)/(2*a*c);
    cosC:=(a*a+b*b-c*c)/(2*a*b);
    MinCos:=cosC;
    if cosA<=cosB then
    begin
    if cosA<=cosC then MinCos:=cosA;
    end
    else
    if cosB<=cosC then MinCos:=cosB;
    writeln('cos=',MinCos:6:2);
    if MinCos=0 then writeln('Прямоугольный')
    else
    if MinCos>0 then writeln('Остроугольный')
    else writeln('Тупоугольный');
    end
    else
    writeln('Не существует.');
    readkey;
    end.
     
Загрузка...

Поделиться этой страницей