Writeln ('точка лежит внутри области')
Стр 1 из 3Следующая ⇒ 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. Например, 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: В программе не учитывается условие , причем оно не перекрывается другими условиями. Поэтому программа работает неправильно в том случае, когда и (область красного цвета на рисунке). Одна из таких точек:
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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|