Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 3 175

/ вопрос открыт /

Здравствуйте, уважаемые эксперты!
На рисунке заштрихованная область - если точка попадет в нее - написать 'vhodit', иначе в белую область попадет точка - написать - 'ne vhodit'
вообщем вроде бы все работает но есть баг
допустим если x=-0.5 а y=0.9 то все норм
а вот если x=-1 y=0.0009 - пишет не входит - хотя точка входит!
код:

Код:

var x,y:real;
p:real;
begin
read(x,y);
if x>1
then write('ne vhodit')
else
if x<-1
then write('ne vhodit')
else
if y>1
then write('ne vhodit')
else
if y<-1
then write('ne vhodit')
else
if x>=0
then write('vhodit')
else
if y<=0
then write('vhodit')
else
begin
p:=x*x+(y-1)*(y-1);
if (p<=1)
then write('vhodit')
else write('ne vhodit');

end;

end.

на рисунке половнка круга
пожалуйста помогите подправить условие
я думаю, что баг содержится между нижними begin и end
заранее спасибо!

К вопросу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки вопроса)

Ruslan Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Ruslan (статус: 1-ый класс)
Вопрос отправлен: 11 сентября 2009, 01:06
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Шичко Игорь

Здравствуйте, Ruslan!
Немного подправлю.
Основная ошибка:
...if (p<=1) and (x<0)
then write('ne vhodit')
else write('vhodit');...
Полный код в приложении.
Удачи.

Приложение:
  1. var
  2. x,y:real;
  3. p:real;
  4. begin
  5. readln(x);
  6. readln(y);
  7.  
  8. writeln('ne vhodit')
  9. else
  10. begin
  11. p:=x*x+(y-1)*(y-1);
  12.  
  13. then writeln('ne vhodit')
  14.  
  15. end;
  16. readln;
  17. end.
  18.  


Ответ отправил: Шичко Игорь (статус: 9-ый класс)
Время отправки: 11 сентября 2009, 07:56

Ответ #2. Отвечает эксперт: Егор

Здравствуйте, Ruslan!
Всё замечательно (для новичка :) ) - можно, конечно, код подоптимизировать, как это сделал Шичко Игорь, но главное - ошибка в условии - надо писать не "if (p<=1)", а "if (p>=1)". У вас же алгоритм основывается на вычислении радиуса окружности для заданных точек (x^2 + (y-1)^2 = r^2 = p). И если радиус меньше 1 - то это пустая область, если больше (или равен) 1 - то это заштрихованная область, а у вас получается наоборот. :)

Ответ отправил: Егор (статус: 10-ый класс)
Время отправки: 13 сентября 2009, 09:19


Мини-форум вопроса

Всего сообщений: 1; последнее сообщение — 13 сентября 2009, 09:22; участников в обсуждении: 1.
Егор

Егор (статус: 10-ый класс), 13 сентября 2009, 09:22 [#1]:

блин, забыл в ответе написать - точка (-0,5;0,9) НЕ входит в заштрихованную область, как и (-1;0,0009)
Опасайтесь багов в приведенном выше коде; я только доказал корректность, но не запускал его.
— Donald E. Knuth.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:41
Выполнено за 0.02 сек.