Автор работы: Пользователь скрыл имя, 05 Мая 2010 в 20:46, задача
решения задач
Ответы на задачи С1:
Программа работает неправильно, если a и b не равны нулю и имеют разные знаки: в этом случае уравнение не имеет решений (поскольку модуль – неотрицательная величина), а программа выдаст два решения. Хотя в задании сказано «Приведите пример таких чисел a, b, x,…», значение x ни на что не влияет (см. далее), в ответе можно указать любое число x. Например,
Лишняя часть программы – ввод x, поскольку это не исходные данные, а результат. Поэтому вместо оператора
readln(a,b,x);
правильнее написать
readln(a,b);
Возможная доработка программы – добавить еще один условный оператор, обрабатывающий неучтенный случай (a и b не равны нулю и имеют разные знаки), при котором нет решений:
var a,b,x: real;
begin
readln(a,b);
if a = 0 then
if b = 0 then
write ('любое число')
else write ('нет решений')
else
if b = 0 then
write('x = 0')
else
if a*b < 0 then
write('нет решений')
else write('x =',b/a,' или x =',-b/a);
end.
обратите внимание, что для проверки условия «a и b имеют разные знаки» использовано произведение a*b, которое больше нуля, когда два значения имеют одинаковые знаки, и меньше нуля – когда разные
writeln ('четное число есть')
else writeln ('четных чисел нет')
end.
var х, у, z: real;
begin
readln (x, у, z);
if (x + y > z) then begin
if (x + z > y) then
if (y + z > x) then
writeln('треугольник построить можно')
else writeln('треугольник построить нельзя')
else writeln('треугольник построить нельзя');
end
else writeln('треугольник построить нельзя');
end.
Чтобы сделать программу красивой и понятной, нужно понять, что треугольник можно построить только в случае одновременного выполнения всех трех условий; в программе
их нужно связать операцией and («И»):
var х, у, z: real;
begin
readln (x, у, z);
if (x + y > z) and (x + z > y) and (y + z > x) then
writeln('треугольник построить можно')
else writeln('треугольник построить нельзя');
end.
var x, у, rl,r2:real;
h: real;
begin
readln (x, у, rl, r2);
h:= sqrt (x*x + y*y);
if (h < rl) AND (h > r2) then
writeln ('точка А лежит внутри кольца');
if (h < r2) AND (h > r1) then
writeln ('точка А лежит внутри кольца');
end.
Более красивый способ – объединить два сложных условия в одно с помощью операции or («ИЛИ»), поскольку и в том, и в другом случае выдается одинаковое сообщение:
var x, у, rl,r2:real;
h: real;
begin
readln (x, у, rl, r2);
h := sqrt(x*x + y*y);
if (h < rl) AND (h > r2) OR (h < r2) AND (h > r1) then
writeln('точка А лежит внутри кольца');
end.
Обратите внимание на то, что операция OR имеет более низкий приоритет, чем AND, поэтому в этом сложном условии она будет выполняться последней, как и требуется.
Остается ответить на третий вопрос: как можно обойтись без операций AND или OR. Конечно, возможен «лобовой» вариант, использующий вложенные условные операторы:
if h < rl then
if h > r2 then
writeln('точка А лежит внутри кольца');
if h > rl then
if h < r2 then
writeln('точка А лежит внутри кольца');
Обратите внимание, что нам понадобилось отдельно «обойти» случай h = r1, потому что по условию понятие «внутри кольца» рассматривается в строгом смысле и при h = r1 считается, что точка не попадает в кольцо.
Для более грамотного решения задачи нужно попробовать использовать арифметические операции, так чтобы результат вычисления некоторого выражения прямо отвечал на нужный вопрос. Поскольку числа могут быть самые разные, лучше «играть» не на конкретных значениях, а на знаке, то есть, если точка находится внутри кольца, выражение должно быть, скажем, отрицательным, а если нет – то положительным. Или наоборот.
Если точка находится внутри кольца, то находится h между r1 и r2. Это значит, что разности h-r1 и h-r2 имеют разный знак, следовательно, их произведение отрицательно1. Таким образом, красиво написанная программа может иметь, например, такой вид:
var x, у, rl,r2:real;
h: real;
begin
readln (x, у, rl, r2);
h := sqrt(x*x + y*y);
if (h - rl)*(h - r2) < 0 then
writeln('точка А лежит внутри кольца');
end.
Кроме того, если условие в первом условном операторе истинно, а одно из последующих – ложно, программа вообще не выдает сообщения на экран, это неверно. Таким образом, для входных данных или программа также работает неверно.
Чтобы исправить эти ошибки «в лоб», можно добавить еще один условный оператор, проверяющий недостающее условие y0 > -2, и добавить else-блоки, чтобы выводить сообщение «не лежит внутри области» при нарушении любого из условий:
var x0, y0: real;
begin
readln (x0, y0)
if(x0 < 2)then begin
if(x0 > -2)then
if (y0 < 2) then
if (y0 > -2) then
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.
8 | ||||||||
7 | ||||||||
6 | ||||||||
5 | ||||||||
4 | ||||||||
3 | ||||||||
2 | ||||||||
1 | ||||||||
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
Для ответа на остальные вопросы нарисуем поле и расставим королей (в самом деле в этой задаче все равно, какого цвета поля, поэтому мы их не раскрашивали).
Короли могут ходить по диагонали, поэтому чтобы дойти до поля (i,j), королю лучше
сначала идти по диагонали, чтобы быстрее выйти на нужную горизонталь или вертикаль, а затем двигаться по этой горизонтали (или вертикали) к заданной клетке.