Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

writeln('точка лежит внутри области')




Else writeln('точка не лежит внутри области')

Else writeln('точка не лежит внутри области')

else writeln('точка не лежит внутри области');

End

else writeln('точка не лежит внутри области');

End.

чтобы сделать красивую программу, нужно перевести на Паскаль сложное условие «точка лежит внутри области, если одновременно выполняются четыре условия…»; слова «одновременно выполняются» говорят о том, что нужно использовать логическую операцию and («И»):

var x0, y0: real;

Begin

Readln (x0, y0)

if (x0 < 2) and (x0 > -2) and

(y0 < 2) and (y0 > -2) then

Writeln('точка лежит внутри области')

else writeln('точка не лежит внутри области');

End.

 

                 
                 
                 
                 
                 
                 
                 
             
                 

9) Легко проверить, что клетка (i=5,j=4) удовлетворяет условию i=9-j, и, следовательно, сложному условию (i=9-j) OR (i=j) (OR означает логическую операцию «ИЛИ» - выполнение хотя бы одного из двух условий)

Для ответа на остальные вопросы нарисуем поле и расставим королей (в самом деле в этой задаче все равно, какого цвета поля, поэтому мы их не раскрашивали).

Короли могут ходить по диагонали, поэтому чтобы дойти до поля (i,j), королю лучше

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

· черный король [его координаты (1,1)] идет по диагонали k-1 шагов, где k=min(i,j) до клетки с координатами (i,i) (если i<=j) или до клетки (j,j) (если i>=j); затем он делает оставшееся количество шагов, max(i,j)-k, по горизонтали или вертикали, так что его общее число шагов равно

Max(i,j)-1

· аналогично белый король [его координаты (8,1)] идет по диагонали q-1 шагов, где q=min(9-i,j) до клетки с координатами (9-i,9-i) (если 9-i<=j) или до клетки (j,j) (если 9-i>=j); затем он делает оставшееся количество шагов, max(9-i,j)-q, по горизонтали или вертикали, так что его общее число шагов равно

Max(9-i,j)-1

· таким образом, нас интересуют клетки (i,j), для которых

max(i,j)-1= max(9-i,j)-1 или max(i,j)= max(9-i,j) (*)

(1,8) (2,8)              
(1,7)                
              (8,6)  
        (5,5)        
                 
                 
                 
             
                 

Чтобы найти все пары (i,j), для которых верно полученное равенство, рассмотрим сначала левую половину доски (i<=4):

· если i<=4, то 9-i>=5>i, поэтому равенство (*) справедливо только при j>=9-i; это область выше главной диагонали и на ней;

· в силу симметрии сразу можно построить соответствующую область и в правой части доски (см. рисунок справа):

Из указанных полей только три, выделенные желтым маркером, оказываются внутри нужной области

(i=1, j=8), (i=2, j=8), (i=1, j=7),
(i=5, j=5), (i=8, j=6)

Правильное условие, определяющее нужную область, выглядит так: «клетка выше главной диагонали (или на ней) и одновременно выше второй диагонали (или на ней)». Остается записать его на Паскале:

(j>=i) and (j>=9-i)

Доработка программы сводится просто к замене условия, все остальное правильно.

10) Попробуем прежде всего найти математическое решение неравенства . Оно истинно, если числитель и знаменатель дроби имеют один знак, или оба положительные, или оба отрицательные. При получаем:

( и ) или ( и )

В краткой форме: или . В зависимости от значения получаем

Случай 1. При и : или

Случай 2. При и : или

Теперь рассмотрим случай . Снова получаем два варианта:

( и ) или ( и )

При всегда ложно выражение в первых скобках, а при – выражение во вторых скобках. Поэтому можно записать еще два случая через двойные неравенства:

Случай 3. При и :

Случай 4. При и :

Запишем основную часть программы, определив принадлежность каждого else -блока и используя запись «лесенкой»:

if b > 0 then

write('x > ', a, ' или x < 0')

Else

if a > 0 then

write('0 < x < ', a)

Else

write(a, ' < x < 0');

Анализ условных операторов показывает, что неправильно обрабатывается Случай 2 ( и ), то есть, в качестве примера можно привести пару при любом (которое вообще не влияет на результат).

В программе вводится переменная , которая нигде не используется. Поэтому это – лишняя часть программы, можно убрать из списка объявляемых переменных и списка ввода в операторе readln.

Простейший и (в данной задаче) наиболее логичный вариант доработки программы – добавить еще один условный оператор для правильного разделения Случая 1 и Случая 2:

var a, b: real;

Begin

readln(a, b);

if b > 0 then

if a > 0 then

write('x > ', a, ' или x < 0')

Else

write('x < ', a, ' или x > 0')

Else

if a > 0 then

write('0 < x < ', a)

Else

write(a, ' < x < 0');

End.

11) Первое условие в программе, x*x+y*y >= 4, означает «вне круга». Если выполняются одновременно второе и третье условия, x <= 2 и y <= x, точка находится в секторе между прямыми и , в который входит заштрихованная область. Таким образом, выполнение всех трех условия означает «вне круга и в секторе». Однако, этому условию удовлетворяет не только заштрихованная область, но еще и вся бесконечная область, выделенная на рисунке красным цветом. Поэтому для любой точки в «красной зоне», например, для точки (1;­ –2), программа выдаст неправильный ответ «принадлежит».

Если записать программу «лесенкой», становится видна еще одна ошибка.

if x*x+y*y >= 4 then

if x <= 2 then

if y <= x then

Write('принадлежит')

Else

Write('не принадлежит')

Дело в том, что любой else относится к ближайшему if, поэтому сообщение «не принадлежит» выводится только тогда, когда первые два условия выполняются, а третье – нет. Следовательно, для точки (0;0), например, программа вообще не выдаст никакого сообщения (первое условие ложно).

Чтобы исправить программу, можно добавить еще одно условие y >= 0 (это отсекает «красную зону») и объединить все четыре условия в одно сложное условие:

var x,y: real;

Begin

readln(x,y);

if (x*x+y*y >= 4) and (x <= 2) and

(y <= x) and (y >= 0) then

Write('принадлежит')

Else

Write('не принадлежит')

End.

12) Записанные в программе условия означают «ниже синусоиды» и в секторе между прямыми и , в который входит заштрихованная область. Однако, этому условию удовлетворяет не только заштрихованная область, но еще и вся бесконечная область, выделенная на рисунке красным цветом. Первое пересечение синусоиды с осью абсцисс происходит при , поэтому программа выдает неверный ответ «принадлежит», например, для точки (-4;0), которая в самом деле не принадлежит заштрихованной области.

Если записать программу «лесенкой», становится видна еще одна ошибка.

if y >= -1 then

if y <= sin(x) then

if y >= x-1 then

Write('принадлежит')

Else

Write('не принадлежит')

Дело в том, что любой else относится к ближайшему if, поэтому сообщение «не принадлежит» выводится только тогда, когда первые два условия выполняются, а третье – нет. Следовательно, для точки (0;-2), например, программа вообще не выдаст никакого сообщения (первое условие ложно).

Чтобы исправить программу, можно добавить еще одно условие x >= -pi/2 (это отсекает «красную зону») и объединить все четыре условия в одно сложное условие:

var x,y: real;

Begin

readln(x,y);

if (y >= -1) and (y <= sin(x)) and

(y >= x-1) and (x >= -pi/2) then

Write('принадлежит')

Else

Write('не принадлежит')

End.

13) Эта задача полностью аналогична задаче 11 (рисунки симметричны). Вот основная часть программы с выделенной структурой:

if x*x+y*y >= 4 then

if x >= -2 then

if y <= -x then

Write('принадлежит')

Else

Write('не принадлежит')

Для точек в «красной зоне» (см. рисунок) программа ошибочно выдает ответ «принадлежит», а для точек, в которых не выполняется первое или второе условие (внутри круга или слева от прямой ) вообще не выдается никакого сообщения.

Чтобы исправить программу, можно добавить еще одно условие y >= 0 (это отсекает «красную зону») и объединить все четыре условия в одно сложное условие:

 

var x,y: real;

Begin

readln(x,y);

if (x*x+y*y >= 4) and (x >= -2) and

(y <= -x) and (y >= 0) then

Write('принадлежит')

Else

Write('не принадлежит')

End.

14) Условный оператор

if a > b then begin x:=a; a:=b; b:=x; end;

упорядочивает переменные a и b с помощью вспомогательной переменной x, записывая в переменную a минимальное из двух значений а в переменную b – максимальное. Аналогично оператор

if b > c then begin x:=b; b:=c; c:=x; end;

упорядочивает значения b и с.

Очевидно, что x используется только как вспомогательная переменная, поэтому вводить ее с клавиатуры не нужно, оператор ввода должен выглядеть так:

read(a, b, c);

Программа работает неправильно, если минимальное число вводится последним и попадает в переменную c. Действительно, выполняя программу для a=3, b=2 и c=1 получаем

  a b c
readln(a, b, c, x);      
if a > b then begin x:=a; a:=b; b:=x; end;      
if b > c then begin x:=b; b:=c; c:=x; end;      

Чтобы исправить ошибку, в конец программы нужно добавить строчку, упорядочивающую a и b (точную копию первого условного оператора). Вот исправленная программа

var a, b, c, x: integer;

Begin

read(a, b, c);

if a > b then begin x:=a; a:=b; b:=x; end;

if b > c then begin x:=b; b:=c; c:=x; end;

if a > b then begin x:=a; a:=b; b:=x; end;

write(a,b,c);

End.

15) В приведенной программе две ошибки. Во-первых, условия

y <= sin(x)

y <= 0.5

y >= 0

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

Например, для точки программа ошибочно выдаст ответ «принадлежит». Поэтому нужны два дополнительных ограничения по координате x (для заданной области – ):

x <= pi ( или, например, x <= 4)

x >= 0

Во-вторых, записав программу «лесенкой» с выделением структуры

if y <= sin(x) then

if y <= 0.5 then

if y >= 0 then

Write('принадлежит')

Else

write('не принадлежит');

мы видим, что else -блок относится только к последнему условному оператору, поэтому сообщение «не принадлежит» не будет выведено, если одно из первых двух условий ложно. Поэтому, например, для точки программа не выдаст вообще никакого ответа, то есть, сработает неверно.

Самый простой способ доработки программы – использовать одно сложное условие, определяющее именно заштрихованную область (с ограничением по оси x)

var x, y: real;

Begin

readln(x, y);

if (y <= sin(x)) and (y <= 0.5) and (y >= 0) and

(x >= 0) and (x <= pi) then

Write('принадлежит')

Else

write('не принадлежит');

End.

16) В приведенной программе две ошибки. Во-первых, условия

y <= x

y <= -x

y >= x*x-2

выполненные одновременно, выделяют только область, обозначенную на рисунке синим цветом, а не всю заштрихованную область (серую). То есть для точек, попавших в серую область, но не попавших в синюю (например, для точки ), ответ будет неверный.

Во-вторых, записав программу «лесенкой» с выделением структуры

if y <= x then

if y <= -x then

if y >= x*x-2 then

Write('принадлежит')

Else

write('не принадлежит');

мы видим, что else -блок относится только к последнему условному оператору, поэтому сообщение «не принадлежит» не будет выведено, если одно из первых двух условий ложно. Поэтому, например, для точки программа не выдаст вообще никакого ответа, то есть, сработает неверно.

Самый простой вариант добаботки – построить одно сложное условие, причем для того, чтобы охватить всю серую область, условия y < x и y < -x должны быть связаны с помощью логической операции «ИЛИ» (в Паскале – or):

if ((y <= x) or (y <= -x)) and (y >= x*x-2) then

Write('принадлежит')

Else

write('не принадлежит');

Обратите внимание, что два первых условия, связанные с помощью or, взяты в скобки, потому что иначе операция and выполнится раньше, чем or, и результат будет неверный.

Вот полная программа:

var x, y: real;

Begin

readln(x, y);

if ((y <= x) or (y <= -x)) and (y >= x*x-2) then

Write('принадлежит')

Else

write('не принадлежит');

End.

17) В приведенной программе две ошибки. Во-первых, условия

y >= x

y >= 0

y <= 2-x*x

выполненные одновременно, выделяют только область, обозначенную на рисунке синим цветом, а не всю заштрихованную область (серую). То есть для точек, попавших в серую область, но не попавших в синюю (например, для точки ), ответ будет неверный.

Во-вторых, записав программу «лесенкой» с выделением структуры

if y >= x then

if y >= 0 then

if y <= 2-x*x then

Write('принадлежит')

Else

write('не принадлежит');

мы видим, что else -блок относится только к последнему условному оператору, поэтому сообщение «не принадлежит» не будет выведено, если одно из первых двух условий ложно. Поэтому, например, для точки программа не выдаст вообще никакого ответа, то есть, сработает неверно.

Самый простой вариант добаботки – построить одно сложное условие, причем для того, чтобы охватить всю серую область, условия y < x и y < -x должны быть связаны с помощью логической операции «ИЛИ» (в Паскале – or):

if ((y >= x) or (y >= 0)) and (y <= 2-x*x) then

Write('принадлежит')

Else

write('не принадлежит');

Обратите внимание, что два первых условия, связанные с помощью or, взяты в скобки, потому что иначе операция and выполнится раньше, чем or, и результат будет неверный.

Вот полная программа:

var x, y: real;

Begin

readln(x, y);

if ((y >= x) or (y >= 0)) and (y <= 2-x*x) then

Write('принадлежит')

Else

write('не принадлежит');

End.

 

18) В приведенной программе две ошибки. Во-первых, условия

y >= x

x <= 0

x*x+y*y <= 1

выполненные одновременно, выделяют только область, обозначенную на рисунке синим цветом, а не всю заштрихованную область (серую). То есть для точек, попавших в серую область, но не попавших в синюю (например, для точки ), ответ будет неверный.

Во-вторых, записав программу «лесенкой» с выделением структуры

if y >= x then

if x <= 0 then

if x*x+y*y <= 1 then

Write('принадлежит')

Else

write('не принадлежит');

мы видим, что else -блок относится только к последнему условному оператору, поэтому сообщение «не принадлежит» не будет выведено, если одно из первых двух условий ложно. Поэтому, например, для точки программа не выдаст вообще никакого ответа, то есть, сработает неверно.

Самый простой вариант добаботки – построить одно сложное условие, причем для того, чтобы охватить всю серую область, условия y < x и y < -x должны быть связаны с помощью логической операции «ИЛИ» (в Паскале – or):

if ((y >= x) or (x <= 0)) and (x*x+y*y <= 1) then

Write('принадлежит')

Else

write('не принадлежит');

Обратите внимание, что два первых условия, связанные с помощью or, взяты в скобки, потому что иначе операция and выполнится раньше, чем or, и результат будет неверный.

Вот полная программа:

var x, y: real;

Begin

readln(x, y);

if ((y >= x) or (x <= 0)) and (x*x+y*y <= 1) then

Write('принадлежит')

Else

write('не принадлежит');

End.

 

19) В приведенной программе две ошибки. Во-первых, условия

y <= x

y >= -x

x*x+y*y <= 1

выполненные одновременно, выделяют только область, обозначенную на рисунке синим цветом, а не всю заштрихованную область (серую). То есть для точек, попавших в серую область, но не попавших в синюю (например, для точки ), ответ будет неверный.

Во-вторых, записав программу «лесенкой» с выделением структуры

if y <= x then

if y >= -x then

if x*x+y*y <= 1 then

Write('принадлежит')

Else

write('не принадлежит');

мы видим, что else -блок относится только к последнему условному оператору, поэтому сообщение «не принадлежит» не будет выведено, если одно из первых двух условий ложно. Поэтому, например, для точки программа не выдаст вообще никакого ответа, то есть, сработает неверно.

Самый простой вариант добаботки – построить одно сложное условие, причем для того, чтобы охватить всю серую область, условия y < x и y < -x должны быть связаны с помощью логической операции «ИЛИ» (в Паскале – or):

if ((y <= x) or (y >= -x)) and (x*x+y*y <= 1) then

Write('принадлежит')

Else

write('не принадлежит');

Обратите внимание, что два первых условия, связанные с помощью or, взяты в скобки, потому что иначе операция and выполнится раньше, чем or, и результат будет неверный.

Вот полная программа:

var x, y: real;

Begin

readln(x, y);

if ((y <= x) or (y >= -x)) and (x*x+y*y <= 1) then

Write('принадлежит')

Else

write('не принадлежит');

End.

 

20) В приведенной программе несколько ошибок. Во-первых, заштрихованная область ограничена тремя прямыми: x=0, y=0 и y=x/2-1 и определяется условиями

x0 > 0

y0 < 0

y0 > x0/2-1

а в программе использована совершенно другая система условий. Во-вторых, в конце программы, независимо от выполнения условных операторов, всегда выводится сообщение «не принадлежит». Например, при вводе координат (1,–3) будет выведено сообщение «принадлежитне принадлежит», поэтому для этих данных она работает неверно.

Доработать программу очень просто – нужно составить сложное условие, объединив три правильных условия с помошью операции И (and):

var x0, y0: real;

Begin

readln(x0, y0);

if (x0 > 0) and (y0 < 0) and (y0 > x0/2-1) then

Write('принадлежит')

Else

write('не принадлежит');

End.


21) Прежде всего, перепишем условия в программе так, чтобы была видна их связь с уравнениями заданных прямых:

x-y >= -2 заменим на равносильное y <= x+2

x+y <= 2 заменим на равносильное y <= 2-x

Далее замечаем, что в программе else относится к последнему оператору if, то есть в самом деле структура кода такова:

if y <= x*x then

if y <= x+2 then

if y <= 2-x then

Write('принадлежит')

Else

write('не принадлежит');

Это значит, что, например, при невыполнении первого условия (y <= x*x) (или при выполнении первого и невыполнении второго) вообще никакого сообщения не выводится, поскольку внутренний условный оператор, содержащий else -блок, не срабатывает. Таким образом, для точки (0,1), например, программа работает неправильно – не выводит никакого ответа.

Кроме того, системе из трех условий, которую использовал программист, удовлетворяют точки не только в «серой» области (которая нужна по условию задачи), но и в «красной» (см. рисунок). Поэтому, например, для точки (0,-1) будет ошибочно выдано соощение «принадлежит».

Для исправления этих ошибок нужно добавить условие y >= 0 и объединить все 4 условия с помощью операции И (в паскале – and) в одно сложное условие в одном условном операторе:

var x, y: real;

Begin

readln(x, y);

if (y <= x*x) and (y <= x+2) and (y <= 2-x) and (y >=0)
then

Write('принадлежит')

Else

write('не принадлежит');

End.

 

22) Особенность этой задачи в том, что одной из ограничительных линий используется гипербола, которая состоит из двух ветвей. Одна из этих ветвей на исходном рисунке не показана. Использованное в программе условие x*y >= 1 равносильно условию для положительных (это область выше показанной ветви гиперболы) и условию для отрицательных (это «красная» область ниже второй, не показанной ветви).

Далее замечаем, что в программе else относится к последнему оператору if, то есть в самом деле структура кода такова:

if x*y >= 1 then

if x <= 2 then

if y <= 2 then

Write('принадлежит')

Else

write('не принадлежит');

Это значит, что, например, при невыполнении первого условия (x*y >= 1) (или при выполнении первого и невыполнении второго) вообще никакого сообщения не выводится, поскольку внутренний условный оператор, содержащий else -блок, не срабатывает. Таким образом, для точки (0,0), например, программа работает неправильно – не выводит ответ вообще.

Кроме того, с учетом второй ветви гиперболы, системе из трех условий, которую использовал программист, удовлетворяют точки не только в «серой» области (которая нужна по условию задачи), но и в «красной» (см. рисунок). Поэтому, например, для точки (-2,-2) будет ошибочно выдано сообщение «принадлежит».

Для исправления этих ошибок нужно добавить условие x > 0 и объединить все 4 условия с помощью операции И (в паскале – and) в одно сложное условие в одном условном операторе:

var x, y: real;

Begin

readln(x, y);

if (x*y >= 1) and (x <= 2) and (y <= 2) and (x > 0) then

Write('принадлежит')

Else

write('не принадлежит');

End.

23) Сразу замечаем, что в программе else относится к последнему оператору if, то есть в самом деле структура кода такова:

if y >= 0 then

if y <= 1 then

if x >= 0 then

if x <= pi then

if y <= sin(x) then

Write('принадлежит')

Else

write('не принадлежит');

Это значит, что, например, при невыполнении первого, второго или третьего условий вообще никакого сообщения не выводится, поскольку внутренний условный оператор, содержащий else -блок, не срабатывает. Таким образом, для точки (-1,0), например, программа работает неправильно – не выводит ответ вообще.

Кроме того, в программе есть и другая ошибка. Легко видеть, что первые 4 условия определяют прямоугольник, в котором заключена нужная нам область – это правильно. В то же время пятое условие (y <= sin(x)) «отсекает» область, обозначенную желтым цветом, это неправильно. Таким образом, например, для точки (3;0,8), находящейся в «желтой» области, программы выдает неправильный ответ: «не принадлежит».

Поэтому нужно в пятом условии к области y <= sin(x) добавить еще область
x >= pi/2 (с учетом первых четырех условий, добавляется прямоугольник, показанный на рисунке красной рамкой). Объединение областей выполняется с помощью логической операции ИЛИ (в Паскале – or). Таким образом, вместо пятого условия нужно использовать сложное условие

(y <= sin(x)) or (x >= pi/2)

Кроме того, полученные 5 условий нужно объединить в одно сложное с помощью операции И (в Паскале – and):

var x, y: real;

Begin

readln(x, y);

if (y >= 0) and (y <= 1) and (x >= 0) and (x <= pi) and

((y <= sin(x)) or (x >= pi/2)) then

Write('принадлежит')

Else

write('не принадлежит');

End.

24) Сразу замечаем, что в программе else относится к последнему оператору if, то есть в самом деле структура кода такова:

if x <= 1 then

if y <= 1 then

if x*x + y*y <= 1 then

Write('принадлежит')

else write('не принадлежит');

Программа выводит сообщение «принадлежит» только тогда, когда выполняются все три условия, то есть, для всех точек внутри круга (синяя область), тогда как для «угла», который остался серым, будет выдано сообщение «не принадлежит» (поскольку первые два условия выполняются, а третье – нет). Таким образом, например, для точки (0,9;0,9) будет неверно выдано сообщение «не принадледжит». Итак на первый вопрос может быть такой:

Точка (0,9;0,9) находится в выделенной области. Для нее выполняются условия x<=1 и y<=1, но не выполняется условие x*x+y*y <=1. В этом случае приведенная программа выдает неверный ответ «не принадлежит».

Кроме того, для точек, для которых не выполняется любое из первых двух условий, вообще никакого сообщения не выдается. Поэтому в качестве примера неверной работы программы можно указать, например, точку (1,5;1,5). Тогда на первый вопрос можно ответить и так:

Для точки (1,5;1,5) не выполняется условие x<=1. В этом случае приведенная программа работает неправильно – не выдает вообще никакого ответа.

Для исправления программы лучше всего составить новое сложное условие. Выделенная область может быть получена как объединение двух областей: круга x*x + y*y <= 1 и квадрата с единичной стороной, левый нижний угол которого находится в начале координат:

if (x*x + y*y <= 1) { круг }

or

((x >= 0) and (x <= 1) and { квадрат}

(y >= 0) and (y <= 1))

Then write('принадлежит')

else write('не принадлежит');

25) Сразу замечаем, что в программе else относится к последнему оператору if, то есть в самом деле структура кода такова:

if y >= 0 then

if x <= 1 then

if y >= x*x then

write('принадлежит')

else write('не принадлежит');

Программа выводит сообщение «принадлежит» только тогда, когда выполняются все три условия, то есть, для всех точек внутри круга (синяя область), тогда как для «угла», который остался серым, будет выдано сообщение «не принадлежит» (поскольку первые два условия выполняются, а третье – нет). Таким образом, например, для точки (0,9;0,1) будет неверно выдано сообщение «не принадледжит». Итак на первый вопрос может быть такой:

Точка (0,9;0,1) находится в выделенной области. Для нее выполняются условия y>=0 и x<=1, но не выполняется условие y >= x*x. В этом случае приведенная программа выдает неверный ответ «не принадлежит».

Кроме того, для точек, для которых не выполняется любое из первых двух условий, вообще никакого сообщения не выдается. Поэтому в качестве примера неверной работы программы можно указать, например, точку (0;-1). Тогда на первый вопрос можно ответить и так:

Для точки (0;-1) не выполняется условие y>=0. В этом случае приведенная программа работает неправильно – не выдает вообще никакого ответа.

Для исправления программы лучше всего составить новое сложное условие. Выделенная область может быть получена как объединение двух областей: области выше параболы y >= x*x и квадрата с единичной стороной, левый нижний угол которого находится в начале координат:

if ((y >= x*x) and (x <= 1)) { над параболой }

or

((x >= 0) and (x <= 1) and { квадрат}

(y >= 0) and (y <= 1))

Then write('принадлежит')

else write('не принадлежит');

Для квадрата ограничение сверху по координате Y несущественно (вся область прямо над квадратом выделена), и можно заменить квадрат на верхнюю часть полосы, убрав последнее условие:

if ((y >= x*x) and (x <= 1)) { над параболой }

or

((x >= 0) and (x <= 1) and (y >= 0))

Then write('принадлежит')

else write('не принадлежит');

26) Сразу замечаем, что в программе else относится к последнему оператору if, то есть в самом деле структура кода такова:

if x <= 1 then

if y >= 1-x then

if y >= x*x then

Write('принадлежит')

else write('не принадлежит');

Программа выводит сообщение «принадлежит» только тогда, когда выполняются все три условия, то есть, для всех точек внутри круга (синяя область), тогда как для «угла», который остался серым, будет выдано сообщение «не принадлежит» (поскольку первые два условия выполняются, а третье – нет). Таким образом, например, для точки (0,9;0,5) будет неверно выдано сообщение «не принадледжит». Итак на первый вопрос может быть такой:

Точка (0,9;0,5) находится в выделенной области. Для нее выполняются условия x<=1 и y>=1-x, но не выполняется условие y >= x*x. В этом случае приведенная программа выдает неверный ответ «не принадлежит».

Кроме того, для точек, для которых не выполняется любое из первых двух условий, вообще никакого сообщения не выдается. Поэтому в качестве примера неверной работы программы можно указать, например, то

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...