Другие языки программирования и технологии

Программа на С выдаёт неправильный ответ

Здравствуйте! Написала программу по этому заданию: Треугольник задан координатами своих вершин. Найти периметр треугольников.
Сам код:
#include
#include
#include
int main()
{
setlocale(LC_ALL, "Russian");
setlocale(LC_ALL, "rus");
printf("|--------------------------------------------|\n");
printf("|Вас приветсвует программа для нахождения |\n");
printf("|периметра треугольника с помощью координат |\n");
printf("|--------------------------------------------|\n\n");

float pirimetr = 0.0;
float x1 = 0.0;
float y1 = 0.0;
float x2 = 0.0;
float y2 = 0.0;
float x3 = 0.0;
float y3 = 0.0;
float storona1 = 0.0;
float storona2 = 0.0;
float storona3 = 0.0;

printf("Введите значение координат первой вершины треугольника: \n");
scanf_s("%f", &x1);
scanf_s("%f", &y1);
printf("Введите значение координат второй вершины треугольника: \n");
scanf_s("%f", &x2);
scanf_s("%f", &y2);
printf("Введите значение координат третьей вершины треугольника: \n");
scanf_s("%f", &x3);
scanf_s("%f", &y3);

storona1 = sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2));
storona2 = sqrt((x2 - x3)*(x2 - x3) + (y2 - y3)*(y2 - y3));
storona1 = sqrt((x3 - x1)*(x3 - x1) + (y3 - y1)*(y3 - y1));

while (((storona1 + storona2) <= storona3) || ((storona2 + storona3) <= storona1) || ((storona1 + storona3) <= storona2)) //Проверяем существует ли треугольник с данными координатами
{
printf("Треугольника с такими координатами не существует, попробуйте снова. \n");

printf("Введите значение координат первой вершины треугольника: \n");
scanf_s("%f", &x1);
scanf_s("%f", &y1);
printf("Введите значение координат второй вершины треугольника: \n");
scanf_s("%f", &x2);
scanf_s("%f", &y2);
printf("Введите значение координат третьей вершины треугольника: \n");
scanf_s("%f", &x3);
scanf_s("%f", &y3);

storona1 = sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2));
storona2 = sqrt((x2 - x3)*(x2 - x3) + (y2 - y3)*(y2 - y3));
storona1 = sqrt((x3 - x1)*(x3 - x1) + (y3 - y1)*(y3 - y1));

}

//Вычисляем пириметр треугольника
pirimetr = storona1 + storona2 + storona3;
printf("Значение пириметра равно %.2f", pirimetr);
getchar();
getchar();
return 0;

}
Треугольник с координатами например: (0;0) (0;6) (7;0) по идее существует, но программа пишет что нет (
P.S.
Да.. программа может быть простая и ошибка скорее всего глупая, если она вообще одна, но на этом я зыке я пишу что-то первый раз.. просто помогите
Вот здесь ошибка:

storona1 = sqrt((x1 - x2)*(x1 - x2) + (y1 - y2)*(y1 - y2));
storona2 = sqrt((x2 - x3)*(x2 - x3) + (y2 - y3)*(y2 - y3));
storona1 = sqrt((x3 - x1)*(x3 - x1) + (y3 - y1)*(y3 - y1)); // 2 раза считаешь одну сторону
Александр Васильев
Александр Васильев
1 530
Лучший ответ
Александр Коршун Ой)) спасибо большое))
А нафига вообще для треугольника, заданного 3-мя точками, проверять, существует ли он, если он существует всегда? Убери эти проверки и все будет хорошо.
Александр Коршун Это обязательное условие преподавателя. В программе должно быть какое-то условие, чтобы использовать цикл. Я не знаю как выглядит треугольник со сторонами 1, 2, 56. Пусть условием будет то, что стороны в нём нормальной длины.
Если ты задал три точки, значит треугольник (пусть даже вырожденный) УЖЕ существует. Потому проверять существование треугольника не имеет никакого смысла.

P.S. Кстати, проверять существование треугольника можно проще:
p = perimetr / 2.0;
if (storona1 > p || storona2 > p || storona3 > p) { // не существует }

P.P.S. И поправь грамматику: пЕриметр.
...бактияр... Bahaduruli (0;0) (0;6) (7;0) - это прямоугольный
Саша Кириленко (0;0) (0;6) (7;0) - никак не вырожденный. Почти прямоугольный.
Сарвар Норматов нет, тут не на одной прямой, одна в начале координат, другая на оси оу, третья на оси ох
Вкратце:

#include "iostream"
#include "cmath"
using namespace std;
float f(float x1,float y1,float x2,float y2){
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}
int main(){
float a,b,c,x1,y1,x2,y2,x3,y3;
cout<< "x1 y1 x2 y2 x3 y3: "; cin>>x1>>y1>>x2>>y2>>x3>>y3;
a=f(x1,y1,x2,y2); b=f(x2,y2,x3,y3); c=f(x3,y3,x1,y1);
cout<< "p="<< a+b+c<<endl; cin.get(); cin.get();}

P.S. Извиняюсь, не заметил, надо не на C++, а на С. Тогда

#include "stdio.h"
#include "math.h"
float f(float x1,float y1,float x2,float y2){
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}
int main(){
float a,b,c,x1,y1,x2,y2,x3,y3;
printf("x1 y1 x2 y2 x3 y3: ");
scanf("%f%f%f%f%f%f",&x1,&y1,&x2,&y2,&x3,&y3);
a=f(x1,y1,x2,y2); b=f(x2,y2,x3,y3); c=f(x3,y3,x1,y1);
printf("p=%g\n",a+b+c); getchar(); getchar();}
Выведи длины сторон на экран и посмотри где собака порылась.
Если не верны длины сторон, то проверяй формулы расчета их
Если стороны верны, то смотри условие
А@
Алексей @zz77Zz@
22 439