Личный кабинет

Решение задач

задай вопрос или/и помоги решить
Владимир Русаков ( Пользователь )
пожалуйста помогите решить задачу в паскале:

По координатам трёх точек на плоскости определить их взаимное расположение. Вводятся шесть чисел через пробел: х1, у1, x2,y2, x3, y3. Все числа целые, по модулю не превосходят 100. Они задают 3 точки плоскости: а (х1, у1), в(x2,y2) , с (x3, y3).

Следует определить взаимное расположение и выдать на экран код ситуации:
0-3 точки совпадают;
1- ровно 2 точки из 3 совпадают;
2-точки не совпадают, лежат на одной прямой;
3- точки образуют остроугольный треугольник;
4-точки образуют прямоугольный треугольник;
5- точки образуют тупоугольный треугольник.

Примеры входных и выходных данных
Вход Выход
112233 2
121212 0
Михаил Крекин ( Пользователь )
Цитата (Владимир Русаков, 06.01.2010, 12:39) <{POST_SNAPBACK}>
По координатам трёх точек на плоскости определить их взаимное расположение. Вводятся шесть чисел через пробел: х1, у1, x2,y2, x3, y3. Все числа целые, по модулю не превосходят 100. Они задают 3 точки плоскости: а (х1, у1), в(x2,y2) , с (x3, y3).

Следует определить взаимное расположение и выдать на экран код ситуации:
0-3 точки совпадают;
1- ровно 2 точки из 3 совпадают;
2-точки не совпадают, лежат на одной прямой;
3- точки образуют остроугольный треугольник;
4-точки образуют прямоугольный треугольник;
5- точки образуют тупоугольный треугольник.

Задача достаточно громоздкая, но с точки зрения программирования — тривиальная. Расписывать всю «ёлку» из if'ов, извините, не буду.
1) ввод исходных данных — обычный read(х1, у1, x2, y2, x3, y3);
2) отбираем первые две ситуации (по равенству обеих координат); если этого не случилось, значит точки не совпадают, идем на оставшиеся ситуации
3) проверяем ситуацию с кодом «2» — if (y1-y2)*(x2-x3) = (x1-x2)*(y2-y3) ; если не на одной прямой, то идем выбирать, какой получился треугольник
4) находим расстояния между парами точек, точнее, квадраты расстояний;
выбираем максимальный и сравниваем с суммой двух других, оказался меньше — код «3», больше — код «5», равен — «4»
Татьяна Дедюлькина ( Пользователь )
Цитата (Михаил_К, 06.01.2010, 16:58) <{POST_SNAPBACK}>
Задача достаточно громоздкая, но с точки зрения программирования — тривиальная. Расписывать всю «ёлку» из if'ов, извините, не буду.
1) ввод исходных данных — обычный read(х1, у1, x2, y2, x3, y3);
2) отбираем первые две ситуации (по равенству обеих координат); если этого не случилось, значит точки не совпадают, идем на оставшиеся ситуации
3) проверяем ситуацию с кодом «2» — if (y1-y2)*(x2-x3) = (x1-x2)*(y2-y3) ; если не на одной прямой, то идем выбирать, какой получился треугольник
4) находим расстояния между парами точек, точнее, квадраты расстояний;
выбираем максимальный и сравниваем с суммой двух других, оказался меньше — код «3», больше — код «5», равен — «4»

Как 2 точки могут лежать не на одной прямой?
Роман Еннер ( Пользователь )
Цитата (Татьяна Дедюлькина, 07.01.2010, 15:58) <{POST_SNAPBACK}>
Как 2 точки могут лежать не на одной прямой?

это был второй пункт :)
Цитата
...
1 пункт) --- ровно 2 точки из 3 совпадают;
2 пункт) --- точки не совпадают, лежат на одной прямой;
...
Михаил Густокашин ( Пользователь )
Цитата (Владимир Русаков, 06.01.2010, 12:39) <{POST_SNAPBACK}>
По координатам трёх точек на плоскости определить их взаимное расположение. Вводятся шесть чисел через пробел: х1, у1, x2,y2, x3, y3. Все числа целые, по модулю не превосходят 100. Они задают 3 точки плоскости: а (х1, у1), в(x2,y2) , с (x3, y3).


на Паскале это длинно и некрасиво, вот код на Питоне 2:

CODE

from math import *

EPS = 1e-5

def angle(dotc, dot1, dot2):
vect1 = (dot1[0] - dotc[0], dot1[1] - dotc[1])
vect2 = (dot2[0] - dotc[0], dot2[1] - dotc[1])
sprod = vect1[0] * vect2[0] + vect1[1] * vect2[1]
vpord = vect1[0] * vect2[1] - vect2[0] * vect1[1]
pi_corrector = abs(atan2(vpord, sprod))
if abs(pi_corrector) > pi - EPS:
pi_corrector = 0
return pi_corrector

x1, y1, x2, y2, x3, y3 = (int(x) for x in raw_input().split())
dots = ((x1, y1), (x2, y2), (x3, y3))
unique_dots = len(set(dots))
if unique_dots < 3:
print unique_dots - 1
else:
ang = []
for start_dot in range(3):
ang.append(angle(dots[start_dot], dots[(start_dot+1)%3], dots[(start_dot+2)%3]))
max_ang = max(ang)
ans = 2
for const_angle in (EPS, pi/2-EPS, pi/2+EPS, pi):
if max_ang < const_angle:
print ans
break
ans += 1

Михаил Крекин ( Пользователь )
Цитата (Михаил Густокашин, 08.01.2010, 14:01) <{POST_SNAPBACK}>
на Паскале это длинно и некрасиво, вот код на Питоне 2:

Особенно красив трюк с обнулением развернутого угла ;-)
Однако, учитывая постановку задачи, логичнее было бы оставаться в пределах целочисленной арифметики.
Михаил Густокашин ( Пользователь )
Цитата (Михаил_К, 09.01.2010, 21:00) <{POST_SNAPBACK}>
Особенно красив трюк с обнулением развернутого угла ;-)
Однако, учитывая постановку задачи, логичнее было бы оставаться в пределах целочисленной арифметики.

ну, это как математик, который рассчитывает устойчивость стола с N ножками а потом решает задачу при N=4. Хотя целочисленное решение тут, пожалуй, красивее.
Владимир Русаков ( Пользователь )
Дистанционное обучение в клубе Pascal ABC

Есть Учитель, есть Ученик, есть Диалог...
Моя Задача, как организатора клуба,
подключить к работе в клубе
Других Учителей и Других Учеников...

думаю, что Илья Петрович Скуратовский
решил задачу №4 не правильно:
www.proshkolu.ru/club/PascalABC/blog/9304/

Составить программу нахождения произведения двух наименьших из трех вводимых с клавиатуры чисел

program min;
var a,b,c:Real;
begin
Write(`a=`); Readln(a);
Write(`b=`); Readln(b);
Write(`c=`); Readln©;
if a>b then
begin
if a>c then Writeln(c,`>`,b)
else Writeln(a,` `,b);
end
else
begin
if a>c then Writeln(a,`>`,c)
else
begin
if b>c then Writeln(a,`>`,c)
else Writeln(a,`>`,b);
end;
end;
end.
у меня две непонятки:

1. программа написана так,
что на выходе должна писать
какое число больше
или я не понял
или она будет писать что угодно
кроме того что надо
(надеюсь это ошибочное мнение)

2. по условию:
составить программу нахождения произведения двух наименьших чисел
у него в программе этого произведения нет

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

Денис Кириенко ( Пользователь )
Школьник просто не понял условия - нужно объяснить ему условие задачи.

Приведите примеры, каким должен быть результат работы программы. Например, при вводе "2 5 3" программа должна вывести 6.

И вообще лучше пользоваться автоматическими системами проверки - тогда таких проблем просто не будет.
Владимир Русаков ( Пользователь )
Циренщиков Сергей Игнатьевич пишет:
Думаю, надо подсказать, что проще найти НАИБОЛЬШЕЕ, тогда результат - произведение других чисел:
if (a>b)and(a>c) then
r:=b*c

footer logo © Образ–Центр, 2018. 12+