C ++ программа по определению треугольника - PullRequest
0 голосов
/ 27 июня 2011

Мне нужна помощь со следующим кодом, который требует от меня:

  • Объявите переменные типа 3 double, каждая из которых представляет одну из трех сторон треугольника.

  • Предложите пользователю ввести значение для первой стороны, затем

  • Установите пользовательский ввод для созданной вами переменной, представляющей первую сторону треугольника.

  • Повторите последние 2 шага еще дважды, по одному разу для каждой из оставшихся 2 сторон треугольника.

  • Используйте серию вложенных операторов if / else, чтобы определить, является ли треугольник с длинами сторон, установленными пользователем, треугольником EQUILATERAL, ISOSCELES или SCALENE. [Примечание: посмотрите на страницу Википедии в «треугольнике» для определения этих трех типов треугольников.]

  • Вывести полученный тип треугольника на консоль.

  • Убедитесь, что ваш детектор треугольника работает, запустив его 5 раз, как в примере выше. Вы можете использовать те же значения, что и в примере.

У меня сейчас есть:

//lab eleven program code on triangles
#include <iostream.h>

main()
{
    //variables
    float aside, bside, cside;
    //enter side a
    cout<<"enter the length of side a "<<endl;
    cin>>aside;
    //enter side b
    cout<<"enter the length of side b "<<endl;
    cin>>bside;     
    //enter side c
    cout<<"enter the length of side c "<<endl;
    cin>>cside;

// all sides equal
if(aside==bside && bside==cside)                 
   cout << "Equilateral triangle\n";

// at least 2 sides equal
else if(aside==bside || aside==cside || bside==cside)   

   cout << "Isosceles triangle\n";
// no sides equal
else                                
   cout << "Scalene triangle\n";            
}

Но мне нужна помощь с операторами if и else if для определения типа треугольника. Наш профессор не освещал эту тему в классе.

Мы используем программу Ch 6.3 на Windows.

Ответы [ 5 ]

2 голосов
/ 27 июня 2011

Как сказал ваш профессор, вы должны посмотреть на:

http://en.wikipedia.org/wiki/Triangle#Types_of_triangles

Вы также должны посмотреть на:

http://www.teacherschoice.com.au/maths_library/trigonometry/solve_trig_sss.htm

Алгоритм:

Solve for all angles, a1, a2, a3 (see the article above)
If you can't find a solution:
    Output "Error: Not a valid triangle"
Else:
    If (a1 == a2) && (a2 == a3):
        Output "EQUILATERAL" and stop
    If (a1 == a2) || (a2 == a3) || (a1 == a3):
        Output "ISOSCELES" and stop
    Output "SCALENE" and stop

Также обратите внимание: будьте осторожны с «равенством» со значениями с плавающей запятой (float / double) (такими как углы). Если вы делаете такое сравнение, вы должны использовать это вместо:

abs(x - y) < epsilon

Где epsilon - «достаточно малая величина».

2 голосов
/ 27 июня 2011

Логика четко вытекает из определения этих различных типов треугольников, которое, как отмечает профессор, является информацией, легко получаемой из Википедии.Это просто включает в себя простое сравнение длин сторон;Вы не должны идти так далеко, как углы.Но я помогу вам с условием «не треугольник».Не бойтесь надеть здесь свою математическую шляпу и пойти побродить, небольшая логика не плохая вещь для студента-полисиста, который терпит время от времени.: -)

Чтобы стороны образовали правильный треугольник, для каждой пары сторон (я назову их f и g), они должны составлять больше, чем длина третьей стороны (Я назову это h).Если вы имеете дело с равносторонними треугольниками, вы автоматически знаете, что это условие выполнено (почему?).Если вы имеете дело с равнобедренными или разносторонними треугольниками, вам технически нужно проверить только две меньшие стороны относительно самой большой стороны, и если это верно для них, то верно и для других двух случаев (почему?).Тем не менее, вам также может быть удобно проверить все три случая.

Рассматривая, почему это неравенство должно выполняться: если сумма двух сторон точно равна длине третьей стороны, вы бы получили«вырожденный» треугольник, в котором стороны f и g могут лежать только поверх h!Если бы они суммировали до меньшего, обе стороны могли бы соединиться с конечными точками h, но тогда никогда не встретились бы в третьей точке!Вы можете проверить это самостоятельно, обрезав кусочки или полоски бумаги и попробовав их.

Три другие вещи, о которых стоит подумать:

  1. В C ++, double и float это не одно и то же.Один имеет меньшую точность, чем другой.Убедитесь, что вы используете тот, который требует профессор.
  2. Проверка на то, что стороны неотрицательны, - отличная идея.Вероятно, вы могли бы также разумно исключить длины 0, чтобы исключить возможность вырожденных треугольников, которые просто выглядят как отрезки или точки.
  3. При сравнении чисел с плавающей запятой всегда следует учитывать, является листрогое равенство даст вам то, что вы хотите.Для проверки равносторонних / равнобедренных / разносторонних условий, вы в порядке, потому что пользователь непосредственно вводит числа с плавающей запятой, а вы ими не манипулируете, поэтому у вас нет шансов внести ошибку.Но при проверке условия «не треугольника» относительно легко создать ситуацию, когда сложение двух сторон округляется (из-за превратностей арифметики с плавающей точкой в ​​процессоре) в нечто, что очень близко, но не совсемточно, третья сторона.В этих случаях, если вы хотите поймать вырожденные треугольники, вы обычно выбираете значение «эпсилон» (некоторое очень небольшое значение по сравнению с числами, с которыми вы имеете дело), ​​которое представляет максимальное количество округления, которое вы готовытерпеть.Затем вы проверяете, находится ли сумма f и g где-то между h - epsilon и h + epsilon - или, другими словами, абсолютное значение f + g - h меньше или равноepsilon.Если это так, вы заявляете, что f + g = h (насколько вы можете судить), и имеете дело с вырожденным случаем.
2 голосов
/ 27 июня 2011
if(a==b && b==c)                    // all sides equal
   cout << "Equilateral triangle\n";
else if(a==b || a==c || b==c)       // at least 2 sides equal
   cout << "Isosceles triangle\n";
else                                // no sides equal
   cout << "Scalene triangle\n";
1 голос
/ 27 июня 2011

Для завершения этой программы вам понадобится следующее:

Убедитесь, что введенные данные верны.В этом случае ввод должен быть больше 0. Вы можете перехватить ввод, используя цикл вроде

    while (invar <= 0)
    {
        cout<<"Enter length"<<endl;
        cin>>invar;
        if (invar <= 0)
        {
            cout<<"invalid input"<<endl;
        }
    }

Я не уверен, что это правильный синтаксис c ++, я не использовал его около 8 лет,Вы можете сделать это для всех 3 входов.Я, вероятно, сделал бы функцию для определения треугольника, используя 3 входные переменные и 1 возвращаемую переменную.Ниже приведен псевдокод

if (a + b <= c) or (a + c <= b) or (b + c <= a)
{
 return "you don't have a triangle."
}
else
{
 if (a == b) or (a == c) or (b == c)
 {
  if (a == b and b == c)
  {
   return "equilateral"
  }
  return "isosceles"
 }
 return "scalene"
}

return -1
0 голосов
/ 25 августа 2013
#include<stdio.h>
#include<ctype.h>
#include<conio.h>
#include<math.h>

int main()
{
float Side1,Side2,Side3;
float Flag1,Flag2,Sum_of_sq1,Sum_of_sq2,Sum_of_sq3;
clrscr();
printf("Enter Three Sides Side1 Side2 Side3 :");
scanf("%f %f %f", &Side1 , &Side2 , &Side3);
Flag1=(Side1==Side2)?(Side2==Side3?1:0):((Side2==Side3)?0:-1);
if(Flag1==0)
  { printf("Triangle is Isoceles\n");
    }
     if (Flag1==1)
      {  printf("Equilateral Triangle");
     }


          Sum_of_sq1=pow(Side1,2)+pow(Side2,2);
          Sum_of_sq2=pow(Side1,2)+pow(Side3,2);
          Sum_of_sq3=pow(Side2,2)+pow(Side3,2);
if (sqrt(Sum_of_sq1)==Side3 ||sqrt(Sum_of_sq2)==Side2 || sqrt(Sum_of_sq3)==Side1)
             printf("The Triangle is Right Angled Triangle");



     getch();
     return(0);

 }
...