@luntik4344

Почему не работает программа по подсчету количества треугольников?

Здравствуйте, уважаемые пользователи. Вынужден обратиться к Вам за помощью, так как сам просто не понимаю, в чем беда.
Передо мной поставлена следующая задача: На вход в программу подается набор пар чисел - координат точек на плоскости. Необходимо написать программу, обнаруживающую треугольник наибольшей площади среди всех треугольников, задаваемых этими точками. Обратите внимание, что не любая тройка заданных точек может определять треугольник.
Вот что у меня получилось:
#include <iostream>
#include <string>
#include <math.h>
using namespace std;

int main() {
	char place[10][10];
	int num,temp_x,temp_y,check,num_wrong;
	double place_x[10],place_y[10],max_squ;

	setlocale(LC_ALL,"Russian");

	cout << "Введите количество точек: ";
	cin >> num; // считываем общее количество точек
	for (int i=0;i<num;i++) {
		cout << "Введите координаты точки в формате x,y: ";
		cin >> place[i]; // координаты каждой точки заносим в строковой массив
	}

	check=0; temp_x=0; temp_y=0;

	/*
	Работаем с каждой строкой массива с координатами. Проверяем строку посимвольно. Если символ является числом, то заносим его в переменную. После этого цикла мы получаем два массива, с координатами x и y. i элменет массива place_x соответствует i элементу массива place_y
	*/
	for (int i=0;i<num;i++) {
		for (int j=0;j<strlen(place[i]);j++) {
			if (isdigit(place[i][j]) && check==0) {temp_x=temp_x*10+(place[i][j]-'0');}
			if (isdigit(place[i][j]) && check==1) {temp_y=temp_y*10+(place[i][j]-'0');}
			if (!isdigit(place[i][j])) {check=1;place_x[i]=temp_x;temp_x=0;}
			if (j==strlen(place[i])-1) {check=0;place_y[i]=temp_y;temp_y=0;}
		}
	}


	double len1,len2,len3;
	max_squ=0;
	num_wrong=0;

	/*
	С помощью 3х циклов прогоняем все точки друг с другом. Высчитываем длину между этими точками по формуле. Затем, провеяем существование треугольника по основному неравенству, и если треугольник существует, то считыем его площадь.
	*/
	for (int i=0;i<num-2;i++) {
		for (int j=1;j<num-1;j++) {
			len1 = pow((place_x[j]-place_x[i]),2)+pow((place_y[j]-place_y[i]),2); len1 = sqrt(len1);
			for (int k=2;k<num;k++) {
				len2 = pow((place_x[k]-place_x[j]),2)+pow((place_y[k]-place_y[j]),2); len2 = sqrt(len2);
				len3 = pow((place_x[k]-place_x[i]),2)+pow((place_y[k]-place_y[i]),2); len3 = sqrt(len3);
				if ((len1+len2)>len3 && (len2+len3)>len1 && (len1+len3)>len2) { 
					double p=(len1+len2+len3)/2;
					double check=p*(p-len1)*(p-len2)*(p-len3);
					double squ=sqrt(check);
					if (squ>max_squ) {max_squ=squ;}
				}
				else {num_wrong=num_wrong++;}
			}
		}
	}

	num_wrong=num_wrong/3;

	cout << "Площадь самого большого треугольника равна " << max_squ << "\n";
	cout << "Всего может быть составлено "<< (num*(num-1)*(num-2))/6 <<", из которых "<< num_wrong << " треугольник(-ов) не существует\n";
}


При вводе (5,1)(7,4)(7,1) программа работает правильно - определяет, что всего возможность составить 1 треугольник из трех точек и считает его площадь.
При вводе (3,5)(5,7)(7,9)(9,11) программа работает неправильно. Ее результат: Всего может быть составлено 4 треугольника, из которых 6 треугольник(-ов) не существует.

Пожалуйста, помогите разобраться в решении этой проблемы.
Заранее спасибо!
  • Вопрос задан
  • 258 просмотров
Пригласить эксперта
Ответы на вопрос 4
@MiiNiPaa
num_wrong=num_wrong++ Это что? Это зачем?
В общем здесь UB. Поправьте строчку.
Ответ написан
LittleFatNinja
@LittleFatNinja
горе девелопер, любитель лютой садомии
код гавно редкое, никто в нем разбираться не будет
Ответ написан
@vilgeforce
Раздолбай и программист
Код писать умеете, пришло время учиться пользоваться отладчиком...
Ответ написан
Комментировать
AnnTHony
@AnnTHony
Интроверт
(3,5)(5,7)(7,9)(9,11) - на одной линии по-моему точки лежат? На это есть проверка? Длина большей стороны должна быть меньше суммы длин двух других. Если она равна сумме, то точки лежат на одной прямой и треугольник не существует.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы