Лабораторная работа № 2. ЕГЭ–C1: поиск ошибок в программе

1)	Требовалось написать программу, которая вводит с клавиатуры координаты точки на плоскости (x, y — действительные числа) и определяет принадлежность точки заштрихованной области, включая ее границы. Программист торопился и написал программу неправильно. Вот она:
var x,y: real;
begin
readln(x,y);
if y>=x*x-2 then
  if y<=4-x*x then
    if x>=0 then
      write('принадлежит')
    else
      write('не принадлежит')
end. 
Последовательно выполните следующее.
1. Перерисуйте и заполните таблицу, которая показывает, как работает программа при аргументах, принадлежащих различным областям (А, В, С, D и Е). Границы принадлежат заштрихованным областям.
Область	Условие 1
(y>=x*x-2)	Условие 2
(y<=4-x*x)	Условие 3
(х>=0)	Программа выведет	Область обрабатывается верно	
А						
В						
С						
D						
Е						
F						
G						
H						
В столбцах условий укажите «да», если условие выполнится, «нет», если условие не выполнится, «—» (прочерк), если условие не будет проверяться, «не изв.», если программа ведет себя по-разному для разных значений, принадлежащих данной области. В столбце «Программа выведет» укажите, что программа выведет на экран. Если программа ничего не выводит, напишите «—» (прочерк). Если для разных значений, принадлежащих области, будут выведены разные тексты, напишите «не изв.». В последнем столбце укажите «Да» или «Нет».
2. Укажите, как нужно доработать программу, чтобы не было случаев её неправильной работы. Это можно сделать несколькими способами, достаточно указать любой способ доработки исходной программы.

2)	Требовалось написать программу, при выполнении которой с клавиатуры считываются координаты точки на плоскости (х, у — действительные числа) и определяется принадлежность этой точки заданной закрашенной области (включая границы).
1)	
Ученик написал такую программу:
var x, y: real;
begin
  readln(x, y);
  if x*x + y*y <= 25 then
    if y <= 4-x*x then
      if y <= x+1 then
        write('принадлежит')
      else
        write('не принадлежит')
end.
При проверке работы программа выполнялась по шагам для некоторых контрольных значений х и y, при этом был заполнен протокол тестирования, содержащий следующую информацию.
Область — часть плоскости, которой принадлежит проверяемая точка (все возможные области отмечены на рисунке буквами А, В, С, ... W).
Условие 1, Условие 2, Условие 3 — результат проверки соответствующего условия (да или нет). Если условие не проверялось, в протокол записывался прочерк.
Вывод — сообщение, которое вывела программа. Если программа ничего не вывела, в протокол записывался прочерк.
Верно — итоговое заключение (да или нет) о правильности результата работы программы при данных значениях х и у.
В результате неаккуратного обращения протокол был испорчен, частично сохранились только три строки:
Область	Условие 1
(х*х + у*у <= 25)	Условие 2 (у <= 4-х*х)	Условие 3 (y <= х+1)	Вывод	Верно	
	да			—		
				принадлежит	нет	
			нет		нет	

Последовательно выполните следующее.
1.	Восстановите уцелевшие строки протокола, заполнив все клетки таблицы. Там, где содержание восстанавливается неоднозначно, запишите все возможные значения. Например, если для нескольких областей получается одинаковая строка таблицы, укажите в графе «Область» все эти области.
2.	Укажите, как нужно доработать программу, чтобы не было случаев её неправильной работы (это можно сделать несколькими способами, достаточно указать любой способ доработки исходной программы).

3)	Требовалось написать программу, при выполнении которой с клавиатуры вводится натуральное число, не превосходящее 108, и выводится его первая (старшая) цифра. Ученик написал такую программу:
var n: longint;
begin
read(n);
while n>10 do begin
  n := n mod 10
end;
write(n);
end.
Последовательно выполните следующее.
1.	Напишите, что выведет эта программа при вводе числа 1984.
2.	Приведите пример числа, при вводе которого программа выдаст верный ответ.
3.	Найдите в программе все ошибки (их может быть одна или несколько).
Для каждой ошибки выпишите строку, в которой она допущена, и приведите эту же строку в исправленном виде.
Обратите внимание, что нужно исправить приведённую программу, а не написать свою. Вы можете только заменять ошибочные строки, но не можете удалять строки или добавлять новые. Заменять следует только ошибочные строки: за исправления, внесённые в строки, не содержащие ошибок, баллы будут снижаться.

Задачи для самостоятельного решения:
Вариант 1
Указание: восстановите блок-схемы, на основе которых составлены указанные в задачах программы.
Задание 1.	Требовалось написать программу, при выполнении которой с клавиатуры считываются координаты точки на плоскости (х, у — действительные числа) и определяется принадлежность этой точки заданной закрашенной области (включая границы). Ученик написал такую программу:
var x, y: real; 
begin
  readln(x,у);
  if у >= x*x-6 then begin
    if x*x + у* у <=16 then
      write('принадлежит')
  end 
  else
    if x >= 0 then
         write('принадлежит')
    else write('не принадлежит')
end.
При проверке работы программа выполнялась по шагам для некоторых контрольных значений х и у, при этом был заполнен протокол тестирования. В результате неаккуратного обращения протокол был испорчен, частично сохранились только четыре строки:
Область	Условие 1
(y >= x*x-6)	Условие 2 (x*x+y*y <= 16)	Условие 3 (x >= 0)	Вывод	Верно	
	да			—		
				принадлежит	нет	
				не принадлежит	да	
			–		да	
Графы протокола содержат следующую информацию.
Область — часть плоскости, которой принадлежит проверяемая точка. Все возможные области отмечены на рисунке буквами А, В, С, ... S.
Условие 1, Условие 2, Условие 3 — результат проверки соответствующего условия (да или нет). Если условие не проверялось, в протокол записывался прочерк.
Вывод — сообщение, которое вывела программа. Если программа ничего не вывела, в протокол записывался прочерк.
Верно — итоговое заключение (да или нет) о правильности результата работы программы при данных значениях х и у.
Последовательно выполните следующее.
1.	Восстановите уцелевшие строки протокола, заполнив все клетки таблицы. Там, где содержание восстанавливается неоднозначно, запишите все возможные значения. Например, если для нескольких областей получается одинаковая строка таблицы, укажите в графе «Область» все эти области. 
2.	Укажите, как нужно доработать программу, чтобы не было случаев её неправильной работы. Это можно сделать несколькими способами, достаточно указать любой способ доработки исходной программы.

Задание 2.	Требовалось написать программу, при выполнении которой с клавиатуры считывается натуральное число N, не превосходящее 109, и выводится минимальную цифру этого числа.   Программист торопился и написал программу неправильно:  
var N: longint;
    digit, min_digit: integer;
begin
  readln(N);
  min_digit := 0;
  while N > 0 do begin
    digit := N mod 10;
    if digit > min_digit then
      min_digit := digit;
    N := N div 10;
  end;
  writeln(min_digit);
end.
Последовательно выполните следующее:
1.	Определите, что выведет программа при вводе числа 532.
2.	Найдите все ошибки в этой программе (их может быть одна или несколько). Для каждой ошибки:
а)	выпишите строку, в которой сделана ошибка;
б)	укажите, как надо исправить ошибку —  приведите правильный вариант строки.
Обратите внимание, что требуется найти ошибки в имеющейся программе, а не написать свою, возможно, имеющую другой алгоритм решения. Исправление ошибки должно затрагивать только строку, в которой находится ошибка.

Вариант 2
Указание: восстановите блок-схемы, на основе которых составлены указанные в задачах программы.
Задание 1.	Требовалось написать программу, при выполнении которой с клавиатуры считываются координаты точки на плоскости (х, у — действительные числа) и определяется принадлежность этой точки заданной закрашенной области (включая границы). Ученик написал такую программу:
var x, y: real; 
begin
  readln(x,y);
  if y >= 1-x then begin
    if y <= 2-2*x*x then     
      write('принадлежит')
  end
  else
  if y >= x*x-5 then
       write('принадлежит')
  else write('не принадлежит')
end.
При проверке работы программа выполнялась по шагам для некоторых контрольных значений х и у, при этом был заполнен протокол тестирования. В результате неаккуратного обращения протокол был испорчен, частично сохранились только четыре строки:
Область	Условие 1
(y >= 1-x)	Условие 2 
(y <= 2-2*x*x)	Условие 3 
(y >= x*x-5)	Вывод	Верно	
				—		
				принадлежит	нет	
				не принадлежит	да	
			–		да	
Графы протокола содержат следующую информацию.
Область — часть плоскости, которой принадлежит проверяемая точка. Все возможные области отмечены на рисунке буквами А, В, С, ... R.
Условие 1, Условие 2, Условие 3 — результат проверки соответствующего условия (да или нет). Если условие не проверялось, в протокол записывался прочерк.
Вывод — сообщение, которое вывела программа. Если программа ничего не вывела, в протокол записывался прочерк.
Верно — итоговое заключение (да или нет) о правильности результата работы программы при данных значениях х и у.
Последовательно выполните следующее.
1.	Восстановите уцелевшие строки протокола, заполнив все клетки таблицы. Там, где содержание восстанавливается неоднозначно, запишите все возможные значения. Например, если для нескольких областей получается одинаковая строка таблицы, укажите в графе «Область» все эти области. 
2.	Укажите, как нужно доработать программу, чтобы не было случаев её неправильной работы. Это можно сделать несколькими способами, достаточно указать любой способ доработки исходной программы.

Задание 2.	Требовалось написать программу, при выполнении которой с клавиатуры считывается натуральное число N, не превосходящее 109, и выводится количество цифр этого числа.   Программист торопился и написал программу неправильно:  
var N: longint;
   count: integer;
begin
  readln(N);
  count := 1;
  while N > 1 do begin
    count := count + 1;
    N := N div 10;
  end;
  writeln(count);
end.
Последовательно выполните следующее:
1.	Определите, что выведет программа при вводе числа 123.
2.	Укажите одно число, для которого программа выводит неверный результат.
3.	Найдите все ошибки в этой программе (их может быть одна или несколько). Для каждой ошибки:
а)	выпишите строку, в которой сделана ошибка;
б)	укажите, как надо исправить ошибку —  приведите правильный вариант строки.
Обратите внимание, что требуется найти ошибки в имеющейся программе, а не написать свою, возможно, имеющую другой алгоритм решения. Исправление ошибки должно затрагивать только строку, в которой находится ошибка.

Вариант 3 
Указание: восстановите блок-схемы, на основе которых составлены указанные в задачах программы.
Задание 1.	Требовалось написать программу, при выполнении которой с клавиатуры считываются координаты точки на плоскости (х, у — действительные числа) и определяется принадлежность этой точки заданной закрашенной области (включая границы). Ученик написал такую программу:
var x, y: real; 
begin
  readln(x,y);
  if y >= x+1 then begin
    if y <= 2-2*x*x then     
      write('принадлежит')
  end
  else
  if y >= x*x-5 then
       write('принадлежит')
  else write('не принадлежит')
end.
При проверке работы программа выполнялась по шагам для некоторых контрольных значений х и у, при этом был заполнен протокол тестирования. В результате неаккуратного обращения протокол был испорчен, частично сохранились только четыре строки:
Область	Условие 1
(y >= x+1)	Условие 2 
(y <= 2-2*x*x)	Условие 3 
(y >= x*x-5)	Вывод	Верно	
				—		
				принадлежит	нет	
				не принадлежит	да	
			–		да	
Графы протокола содержат следующую информацию.
Область — часть плоскости, которой принадлежит проверяемая точка. Все возможные области отмечены на рисунке буквами А, В, С, ... R.
Условие 1, Условие 2, Условие 3 — результат проверки соответствующего условия (да или нет). Если условие не проверялось, в протокол записывался прочерк.
Вывод — сообщение, которое вывела программа. Если программа ничего не вывела, в протокол записывался прочерк.
Верно — итоговое заключение (да или нет) о правильности результата работы программы при данных значениях х и у.
Последовательно выполните следующее.
1.	Восстановите уцелевшие строки протокола, заполнив все клетки таблицы. Там, где содержание восстанавливается неоднозначно, запишите все возможные значения. Например, если для нескольких областей получается одинаковая строка таблицы, укажите в графе «Область» все эти области. 
2.	Укажите, как нужно доработать программу, чтобы не было случаев её неправильной работы. Это можно сделать несколькими способами, достаточно указать любой способ доработки исходной программы.

Задание 2.	Требовалось написать программу, при выполнении которой с клавиатуры считывается натуральное число N, не превосходящее 109, и выводится произведение цифр этого числа.   Программист торопился и написал программу неправильно:  
var N, product: longint;
    digit: integer; 
begin
  readln(N);
  product := N mod 10;
  while N >= 10 do begin
    digit := N mod 10;
    product := product * digit;
    N := N div 10
  end;
  writeln(product)
end.
Последовательно выполните следующее:
1.	Определите, что выведет программа при вводе числа 532.
2.	Найдите все ошибки в этой программе (их может быть одна или несколько). Для каждой ошибки:
а)	выпишите строку, в которой сделана ошибка;
б)	укажите, как надо исправить ошибку —  приведите правильный вариант строки.
Обратите внимание, что требуется найти ошибки в имеющейся программе, а не написать свою, возможно, имеющую другой алгоритм решения. Исправление ошибки должно затрагивать только строку, в которой находится ошибка.

Вариант 4
Указание: восстановите блок-схемы, на основе которых составлены указанные в задачах программы.
Задание 1.	 Требовалось написать программу, которая вводит с клавиатуры координаты точки на плоскости (x, y — действительные числа) и определяет принадлежность точки заштрихованной области, включая ее границы. Программист торопился и написал программу неправильно. Вот она:
var x,y: real;
begin
readln(x,y);
if y>=x then
  if y>=0 then
    if y<=2-x*x then
      write('принадлежит')
    else
      write('не принадлежит')
end.
Последовательно выполните следующее:
1. Перерисуйте и заполните таблицу, которая показывает, как работает программа при аргументах, принадлежащих различным областям (A, B, C, D, E, F и G). Точки, лежащие на границах областей, отдельно не рассматривать. 
Область	y>=x?	y>=0?	y<=2-x*x?	вывод	верно?	
A						
B						
C						
D						
E						
F						
G						
В столбцах условий укажите "да", если условие выполнится, "нет" если условие не выполнится, "—" (прочерк), если условие не будет проверяться, «не изв.», если программа ведет себя по-разному для разных значений, принадлежащих данной области. В столбце "Программа выведет" укажите, что программа выведет на экран. Если программа ничего не выводит, напишите "—" (прочерк). Если для разных значений, принадлежащих области, будут выведены разные тексты, напишите «не изв». В последнем столбце укажите "да" или "нет".
2. Укажите, как нужно доработать программу, чтобы не было случаев ее неправильной работы. Это можно сделать несколькими способами, поэтому можно указать любой способ доработки исходной программы.

Задание 2.	Требовалось написать программу, которая вводит с клавиатуры натуральное число N, не превышающее 109, и выводит сумму чётных цифр в десятичной записи этого числа или 0, если чётных цифр нет. Программист торопился и написал программу неправильно. Вот она:
var N: longint;
    s: integer;
begin
  readln(N);	
  s := 0;	
  while N > 1 do begin	
    if N mod 2 = 0 then begin	
      s := N mod 10;	
    end;	
    N := N div 10;	
  end;	
  write(s);	
end.
Последовательно выполните следующее.
1. Напишите, что выведет эта программа при вводе числа 1984.
2. Приведите пример числа, при вводе которого программа выдаст верный ответ.
3. Найдите в программе все ошибки (их может быть одна или несколько).
Для каждой ошибки выпишите строку, в которой она допущена, и приведите эту же строку в исправленном виде.
Обратите внимание, что нужно исправить приведённую программу, а не написать свою. Вы можете только заменять ошибочные строки, но не можете удалять строки или добавлять новые. Заменять следует только ошибочные строки.