Ответы на задачи 24 (С1)
Скачать 1.99 Mb.
|
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.
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.
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 (точную копию первого условного оператора). Вот исправленная программа 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.
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.
y <= x y <= 0 y >= x*x-2 выполненные одновременно, выделяют только область, обозначенную на рисунке синим цветом, а не всю заштрихованную область (серую). То есть для точек, попавших в серую область, но не попавших в синюю (например, для точки ), ответ будет неверный. Во-вторых, записав программу «лесенкой» с выделением структуры if y <= x then if y <= 0 then if y >= x*x-2 then write('принадлежит') else write('не принадлежит'); мы видим, что else-блок относится только к последнему условному оператору, поэтому сообщение «не принадлежит» не будет выведено, если одно из первых двух условий ложно. Поэтому, например, для точки программа не выдаст вообще никакого ответа, то есть, сработает неверно. Самый простой вариант доработки – построить одно сложное условие, причем для того, чтобы охватить всю серую область, условия y <= x и y <= -x должны быть связаны с помощью логической операции «ИЛИ» (в Паскале – or): if ((y <= x) or (y <= 0)) 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 <= 0)) and (y >= x*x-2) then write('принадлежит') else write('не принадлежит'); end.
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.
y >= 2*x x <= 0 x*x+y*y <= 4 выполненные одновременно, выделяют только область, обозначенную на рисунке синим цветом, а не всю заштрихованную область (серую). То есть для точек, попавших в серую область, но не попавших в синюю (например, для точки ), ответ будет неверный. Во-вторых, записав программу «лесенкой» с выделением структуры if y >= 2*x then if x <= 0 then if x*x+y*y <= 4 then write('принадлежит') else write('не принадлежит'); мы видим, что else-блок относится только к последнему условному оператору, поэтому сообщение «не принадлежит» не будет выведено, если одно из первых двух условий ложно. Поэтому, например, для точки программа не выдаст вообще никакого ответа, то есть, сработает неверно. Самый простой вариант добаботки – построить одно сложное условие, причем для того, чтобы охватить всю серую область, условия y >= 2*x и x <= 0 должны быть связаны с помощью логической операции «ИЛИ» (в Паскале – or): if ((y >= 2*x) or (x <= 0)) and (x*x+y*y <= 4) then write('принадлежит') else write('не принадлежит'); Обратите внимание, что два первых условия, связанные с помощью or, взяты в скобки, потому что иначе операция and выполнится раньше, чем or, и результат будет неверный. Вот полная программа: var x, y: real; begin readln(x, y); if ((y >= 2*x) or (x <= 0)) and (x*x+y*y <= 4) then write('принадлежит') else write('не принадлежит'); end.
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.
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.
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) в одно сложное условие в одном условном операторе: |