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

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

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2012, 15:14   #1
Simon1712
Пользователь
 
Регистрация: 11.11.2012
Сообщений: 36
По умолчанию Задача с олимпиады 2007 года

На координатной плоскости расположены равнобедренный прямоугольный треугольник ABC с длиной катета d и точка X. Катеты треугольника лежат на осях координат, а вершины расположены в точках: A (0,0), B (d,0), C (0,d).
Напишите программу, которая определяет взаимное расположение точки X и треугольника. Если точка X расположена внутри или на сторонах треугольника, выведите 0. Если же точка находится вне треугольника, выведите номер ближайшей к ней вершины.
Входные данные. Сначала вводится натуральное число d (не превосходящее 1000), а затем координаты точки X – два целых числа из диапазона от *–1000 до 1000.
Выходные данные. Если точка лежит внутри, на стороне треугольника или совпадает с одной из вершин, то выведите число 0. Если точка лежит вне треугольника, то выведите номер вершины треугольника, к которой она расположена ближе всего (1 – к вершине A, 2 – к B, 3 – к C). Если точка расположена на одинаковом расстоянии от двух вершин, выведите ту вершину, номер которой меньше.
Simon1712 вне форума Ответить с цитированием
Старый 23.11.2012, 15:17   #2
Simon1712
Пользователь
 
Регистрация: 11.11.2012
Сообщений: 36
По умолчанию

Вот наработки:
Код:
var
  d, x, y, res:integer;
  da, db, dc : real;
begin
  res := 5;
  readln(d);
  readln(x, y);
  if (x < d) and (y < d) and (y > 0) and (x > 0) and (x + y < d) then res := 0;
  if (x = 0) and (y < d) and (y > 0) then res := 0;
  if (y = 0) and (x < d) and (x > 0) then res := 0;
  if (x + y = d) and (x > 0) and (y > 0) then res := 0;
  if res = 0 then writeln(res)
  else
    begin
      da := sqrt(x * x + y * y);
      db := sqrt((x - d) * (x - d) + y * y);
      dc := sqrt(x * x + (y - d) * (y - d));
      if (da <= db) and (da <= dc) then res := 1;
      if (db <= da) and (db <= dc) and (db <> da) then res := 2;
      if (dc <= db) and (dc <= da) and (db <> dc) and (da <> dc) then res := 3;
      writeln(res);
    end;
end.
Simon1712 вне форума Ответить с цитированием
Старый 23.11.2012, 15:54   #3
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
Код:
  if (x < d) and (y < d) and (y > 0) and (x > 0) and (x + y < d) then res := 0;
  if (x = 0) and (y < d) and (y > 0) then res := 0;
  if (y = 0) and (x < d) and (x > 0) then res := 0;
а зачем так много? тут хватит одного условия:
Код:
If (x>=0) and (y>=0) and (x+y <= d) then
  res := 0 {точка в треугольнике}
else
  begin
     {обработка за пределами треугольника}
      da := sqrt(x * x + y * y);
      db := sqrt((x - d) * (x - d) + y * y);
      dc := sqrt(x * x + (y - d) * (y - d));
      if da <= db then
        begin
          if da <= dc then
            res := 1
          else
            res := 3;
        end
      else 
        begin
          if db <= dc then
            res := 2
          else
            res := 3;
        end;
  end;
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 24.01.2014, 10:03   #4
Simon1712
Пользователь
 
Регистрация: 11.11.2012
Сообщений: 36
По умолчанию

Цитата:
Сообщение от DiemonStar Посмотреть сообщение
а зачем так много? тут хватит одного условия:
Код:
If (x>=0) and (y>=0) and (x+y <= d) then
  res := 0 {точка в треугольнике}
else
  begin
     {обработка за пределами треугольника}
      da := sqrt(x * x + y * y);
      db := sqrt((x - d) * (x - d) + y * y);
      dc := sqrt(x * x + (y - d) * (y - d));
      if da <= db then
        begin
          if da <= dc then
            res := 1
          else
            res := 3;
        end
      else 
        begin
          if db <= dc then
            res := 2
          else
            res := 3;
        end;
  end;
Спасибо, все работает!
Simon1712 вне форума Ответить с цитированием
Старый 24.01.2014, 10:06   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Некроспасибо больше чем через год Но все равно лучше, чем ни чего
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача из олимпиады 11 класса Rebelition Паскаль, Turbo Pascal, PascalABC.NET 5 02.11.2011 19:44
Выбрали символ олимпиады 2014 года Alar Свободное общение 20 17.03.2011 22:56
Задача с олимпиады Xardas Помощь студентам 4 29.02.2008 19:00
Задача с олимпиады Xardas Помощь студентам 5 27.02.2008 23:38
Паскаль. задача с олимпиады SoulFlyMF Помощь студентам 2 13.11.2007 20:52