Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.03.2012, 18:41   #1
sidestep
Пользователь
 
Регистрация: 14.09.2011
Сообщений: 93
По умолчанию Треугольники, образованные пересечением N>3 линий на плоскости

Вот код
Код:
#include <stdio.h>
#include <conio.h>
const int N=5;
const int P = (N*(N-1))/2;
float matrix[N][3];
float tochka[P][2];
int main() {  

	for (int i = 0; i < N; i++) {
		for (int j = 0; j < 3; j++) {
			scanf("%f", &matrix[i][j]); //вводим коэффициенты a,b и c уравнений вида  a*x +b*y+c=0
		}
	}
	int count_toch = 0;
	int count_treu = 0;
	int ploxo = 0;
	float x,y;
	for (int beg = 0; beg < N; beg++) {
		for (int i = beg + 1; i < N; i++) {
			// находим первую прямую с которой пересекается пробегающая
			if (matrix[i][1]*matrix[beg][0] != matrix[i][0]*matrix[beg][1]) {
				tochka[count_toch][0] = (matrix[beg][1]*matrix[i][2] - matrix[i][1]*matrix[beg][2])/(matrix[i][1]*matrix[beg][0] - matrix[i][0]*matrix[beg][1]); 
				tochka[count_toch][1] = (-matrix[beg][2]-matrix[beg][0]*tochka[count_toch][0])/matrix[beg][1];

				if (tochka[count_toch][0]==-0.0)
					tochka[count_toch][0]=0.0;
				if (tochka[count_toch][1]==-0.0)
			        tochka[count_toch][1]=0.0;

				x=tochka[count_toch][0];
				y=tochka[count_toch][1];

				//printf("\n%f   %f", tochka[count_toch][0], tochka[count_toch][1]);
				count_toch++;
				// находим прямую, с которой пересекаются и пробегающая и пересекающая пробегающую
				for (int j = i + 1; j < N; j++) {
					if (matrix[i][1]*matrix[beg][0] != matrix[i][0]*matrix[beg][1] && 
						matrix[j][1]*matrix[beg][0] != matrix[j][0]*matrix[beg][1] &&
						matrix[i][1]*matrix[j][0] != matrix[i][0]*matrix[j][1]
					) {
						// ищем точку пересечения первой с третьей прямой
						tochka[count_toch][0] = (matrix[beg][1]*matrix[j][2] - matrix[j][1]*matrix[beg][2])/(matrix[j][1]*matrix[beg][0] - matrix[j][0]*matrix[beg][1]);
						tochka[count_toch][1] = (-matrix[beg][2]-matrix[beg][0]*tochka[count_toch][0])/matrix[beg][1];
						
						if (tochka[count_toch][0]==-0.0)
							tochka[count_toch][0]=0.0;
						if (tochka[count_toch][1]==-0.0)
						    tochka[count_toch][1]=0.0;

						count_toch++;
						// ищем точку пересечения второй с третьей
						tochka[count_toch][0] = (matrix[i][1]*matrix[j][2] - matrix[j][1]*matrix[i][2])/(matrix[j][1]*matrix[i][0] - matrix[j][0]*matrix[i][1]);
						tochka[count_toch][1] = (-matrix[i][2]-matrix[i][0]*tochka[count_toch][0])/matrix[i][1];

						if (tochka[count_toch][0]==-0.0)
							tochka[count_toch][0]=0.0;
						if (tochka[count_toch][1]==-0.0)
							tochka[count_toch][1]=0.0;
						
						// проверка того, что точки нашего треугольника не совпадают
						if ((tochka[count_toch-1][0] != tochka[count_toch][0] && tochka[count_toch-1][1] != tochka[count_toch][1]) 
							|| (tochka[count_toch-1][0] != x && tochka[count_toch-1][1] != y) 
							|| (x != tochka[count_toch][0] && y != tochka[count_toch][1])) {
								count_treu++;
								ploxo = -1;
								// если все хорошо, то выводим их координаты
								printf("\n%i treugolnuik: (%f, %f), (%f, %f), (%f, %f)", count_treu, x, y,
									tochka[count_toch-1][0], tochka[count_toch-1][1],
									tochka[count_toch][0], tochka[count_toch][1]);

						} else {
							//ploxo = 0;
						}
						count_toch++;
					}
				}

			} 
		} 
	}
	// в противном случае выводим "нет треугольника"
	if (ploxo != -1) {
		printf("\nnetu treugolnikov");
	}

	getch();
	return 0;
}
У моего друга все работает, ну по крайней мере на наших тестах точно
А у меня нет, 50 на 50 так сказать, половину правильно выдает а половину нет
В чем может быть проблема? я Так понял это уже со студией проблемы?

Использую VS 2010 C++

Может я не правильно проект создаю?

Я с этой проблемой сталкиваюсь впервые, и меня это пугает

Кто хочет проверить программу, можете после запуска набрать
-1
1
0
1
1
0
0
1
-2
0
1
2
1
0
0




должно быть 6 треугольников




ЗАранее спасибо!
sidestep вне форума Ответить с цитированием
Старый 10.03.2012, 19:39   #2
EUGY
Форумчанин
 
Аватар для EUGY
 
Регистрация: 11.07.2010
Сообщений: 914
По умолчанию

У меня Ваша main не влезает на экран.
Не подумайте, что лень смотреть, но громоздкая она слишком.
Вы через три дня, глядя на нее не поймете, что писали.
Почему бы не разбить на мелкие функции.
Например написать функцию принимающую в качестве параметров характеристики двух прямых и указатель на координаты пересечения (если таковые есть).
Функция заполняет указатель и возврашает true, если прямые пересекаются и false, если параллельны. Ну, и конечно надо понимать, что тип float не такой простой, как кажется Нужно округление.
EUGY вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Рисуем треугольники. C# LBss Помощь студентам 4 17.04.2011 19:26
Невырожденные треугольники _-Re@l-_ Помощь студентам 0 10.12.2010 20:27
Равнобедренные треугольники endiny Общие вопросы C/C++ 1 28.10.2010 18:23
Нахождение площади треугольника, образуемого пересечением прямых valis Помощь студентам 3 03.02.2010 09:21
Треугольники Prowler Помощь студентам 3 15.05.2007 07:06