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

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




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, которое больше нуля, когда два значения имеют одинаковые знаки, и меньше нуля – когда разные

 

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

readln(a,b,x);

правильнее написать

readln(a,b);

Переменная x далее не используется, поэтому ее не нужно объявлять:

var a,b: real;

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

var a,b: real;

Begin

readln(a,b);

if b = 0 then

if a = 0 then

Write('любое число')

else write('x = 0')

Else

if a = 0 then

Write('нет решений')

else write('x =',-b/a);

End.

можно еще немного оптимизировать программу: заметим, что в обеих частях первого условного оператора встречается оператор if a = 0 then; его можно «вынести» наверх, сделать внешним, а не вложенным:

if a = 0 then

if b = 0 then

Write('любое число')

Else write('нет решений')

Else

write('x=',-b/a);

если вы боитесь запутаться во вложенных условных операторах, можно использовать сложные условия и рассмотреть три возможных варианта (важно не забыть ни один!):

if (a=0) and (b=0)then

write('любое число');

if (a=0) and (b<>0)then

write('нет решений');

if a <> 0 then

write('x=',-b/a);

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

 

3) Согласно условию, нас интересует область, закрашенная на рисунке серым цветом. Если рассмотреть границы области по осям координат, получим четыре условия:

по оси X:

по оси Y:

В программе не учитывается условие , причем оно не перекрывается другими условиями. Поэтому программа работает неправильно в том случае, когда и (область красного цвета на рисунке). Одна из таких точек:
Для доработки программы нужно добавить еще один условный оператор с недостающим условием и соответствующий ему else -блок, выдающий сообщение в случае невыполнения этого условия:

 


var x0, у0, у: real;

Begin

readln (x0, y0);

if (x0 < 2)then begin

if (x0 > 0)then begin

if (y0 > 0)then begin

у = 2 – х0;

if (y0 < у) then

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

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

End

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

End

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

End

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

End.

Это решение работает, но громоздко и некрасиво. Заметим, что два условия и автоматически обеспечивают выполнение условия , которое становится лишним:

if (x0 > 0)then begin

if (y0 > 0)then begin

у = 2 – х0;

if (y0 < у) then

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

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

End

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

End

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

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

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

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

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

 

4) В этой программе внешне все выглядит правильно, поэтому весьма вероятно, что сделана «ловушка» на какой-то особый (вырожденный) случай. При решении квадратного уравнения «особый случай» – это равенство дискриминанта нулю (два одинаковых корня). Проверяя его, сразу обнаруживаем, что при этом условие D > 0 не срабатывает и программа выдает сообщение «действительных корней нет». Поэтому, например, для программа работает неверно. При этом можно вводить любые x1 и x2, поскольку в эти переменные записываются результаты вычислений (корни уравнения) анне исходные данные. Это ответ на второй вопрос: вместо оператора

readln(a,b,c,x1,x2);

правильнее написать

readln(a,b,c);

Чтобы исправить программу, достаточно вместо условия D > 0 написать D >= 0:

var a, b, с, D, xl, x2: real;

Begin

readln(a, b, с);

D:= b*b - 4*a*c;

if D >= 0 then begin

xl:= (-b + sqrt(D))/(2*a);

x2:= (-b - sqrt(D))/(2*a);

write('xl =', xl);

write('x2 =', x2);

End

else writeln ('действительных корней нет');

End.

5) Программа очень плохо написана, мысль автора слабо прослеживается, поэтому сложно разбираться в коде. Для проверки четности числа используется операция mod –остаток от деления целых чисел. Очевидно, что если остаток от деления a на 2 (записывается a mod 2) – нуль, то число a делится на 2 без остатка, то есть – четное.
Для того, чтобы выяснить, когда программа будет работать неверно, можно использовать ручную прокрутку для четырех возможных вариантов:

1. оба числа четных

2. a – четное, b – нечетное

3. a – нечетное, b – четное

4. оба числа нечетных

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

var a, b: integer;

Begin

readln(a, b);

a:= a mod 2;

if a > 0 then begin

b:= b mod 2;

if b > 0 then

Поделиться:





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



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