Подготовка ребёнка к ЕГЭ по информатике. Часть тринадцатая

20.02.19

Разработка - Математика и алгоритмы

Исправление ошибок в программе, часть вторая.

24 задание ЕГЭ часть 2

«Исправление ошибок в программе»

Предисловие

 

Вторая и заключительная статья по теме. Здесь будут представлены задания с 2009 по 2015 годы. Перейдем к рассмотрению задач!

 

Демонстрационный вариант ЕГЭ 2015 г. ИНФОРМАТИКА и ИКТ, 11 класс

 

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

 

Бейсик

Python

CONST n = 4

count = 0

maximum = 999

FOR I = 1 TO n

INPUT x

IF x mod 2 <> 0 THEN

count = count + 1

IF x > maximum THEN

maximum = I

END IF

END IF

NEXT I

IF count > 0 THEN

PRINT count

PRINT maximum

ELSE

PRINT "NO"

END IF

n = 4

count = 0

maximum = 999

for i in range(1, n + 1):

x = int(input())

if x % 2 != 0:

count += 1

if x > maximum:

maximum = i

if count > 0:

print(count)

print(maximum)

else:

print("NO")

Алгоритмический язык

Паскаль

алг

нач

цел n = 4

цел i, x

цел maximum, count

count := 0

maximum := 999

нц для i от 1 до n

ввод x

если mod(x, 2) <> 0 то

count := count + 1

если x > maximum то

maximum := i

все

все

кц

если count > 0 то

вывод count, нс

вывод maximum

иначе

вывод "NO"

все

кон

const n = 4;

var i, x: integer;

var maximum, count: integer;

begin

count := 0;

maximum := 999;

for i := 1 to n do

begin

read(x);

if x mod 2 <> 0 then

begin

count := count + 1;

if x > maximum then

maximum := i

end

end;

if count > 0 then

begin

writeln(count);

writeln(maximum)

end

else

writeln('NO')

end.

С++

#include <stdio.h>

int main(void)

{

const int n = 4;

int i, x, maximum, count;

count = 0;

maximum = 999;

for (i = 1; i <= n; i++) {

scanf("%d",&x);

if (x % 2 != 0) {

count++;

if (x > maximum)

maximum = i;

}

}

if (count > 0) {

printf("%d\n", count);

printf("%d\n", maximum);

}

else

printf("NO\n");

}

 

Последовательно выполните следующее.

1. Напишите, что выведет эта программа при вводе последовательности:

2 9 4 3

2. Приведите пример такой последовательности, содержащей хотя бы одно нечётное число, что, несмотря на ошибки, программа печатает правильный ответ.

3. Найдите все ошибки в этой программе (их может быть одна или несколько). Известно, что каждая ошибка затрагивает только одну строку и может быть исправлена без изменения других строк. Для каждой ошибки:

1) выпишите строку, в которой сделана ошибка;

2) укажите, как исправить ошибку, т.е приведите правильный вариант строки.

Достаточно указать ошибки и способ их исправления для одного языка программирования.

 

Обратите внимание, что требуется найти ошибки в имеющейся программе, а не написать свою, возможно, использующую другой алгоритм решения. Исправление ошибки должно затрагивать только строку, в которой находится ошибка.

 

1. Разберемся, как выполняется данный алгоритм для данной последовательности:

 

Шаг 1

count = 0

maximum = 999

X = 2

Шаг 2

count = 0

maximum = 999

X = 9

Шаг 3

count = 1

maximum = 999

X = 4

Шаг 4

count = 1

maximum = 999

X = 3

Шаг 5

count = 2

maximum = 999

Печать «2»

Шаг 6

Печать «999»

 

 

 

2. Например, 2 4 6 9. Убедимся:

 

Шаг 1

count = 0

maximum = 999

X = 2

Шаг 2

count = 0

maximum = 999

X = 4

Шаг 3

count = 0

maximum = 999

X = 6

Шаг 4

count = 0

maximum = 999

X = 999

Шаг 5

count = 1

maximum = 999

Печать «1»

Шаг 6

Печать «999»

 

 

 

3. Первая ошибка допущена в шестой строке «maximum := 999;» Очевидно, что т. к. числа ввода неотрицательные, необходимо, чтобы максимум был меньше наименьшего неотрицательного (т. е., 0). Поэтому корректная строка:

maximum := -1;

И следовательно, вторая ошибка допущена в четырнадцатой строке: «maximum := i». В ответе нужен не индекс этого числа, а само число. Т.е. должно быть «maximum := x».

 

Демонстрационный вариант ЕГЭ 2014 г. ИНФОРМАТИКА и ИКТ, 11 класс

 

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

 

Бейсик

Алгоритмический язык

DIM N AS LONG

INPUT N

max_digit = 9

WHILE N >= 10

digit = N MOD 10

IF digit > max_digit THEN

max_digit = digit

END IF

N = N \ 10

WEND

PRINT max_digit

END

алг

нач

цел N, digit, max_digit

ввод N

max_digit := 9

нц пока N >= 10

digit := mod(N, 10)

если digit > max_digit то

max_digit := digit

все

N := div(N, 10)

кц

вывод max_digit

кон

С++

Паскаль

#include<stdio.h>

int main()

{

long int N;

int digit, max_digit;

scanf("%ld", &N);

max_digit = 9;

while (N >= 10)

{

digit = N % 10;

if (digit > max_digit)

max_digit = digit;

N = N /10;

}

printf("%d", max_digit);

}

var N: longint;

digit, max_digit: integer;

begin

readln(N);

max_digit := 9;

while N >= 10 do

begin

digit := N mod 10;

if digit > max_digit then

max_digit := digit;

N := N div 10;

end;

writeln(max_digit);

end.

 

Последовательно выполните следующее.

1. Напишите, что выведет эта программа при вводе числа 423.

2. Найдите все ошибки в этой программе (их может быть одна или несколько). Для каждой ошибки:

1) выпишите строку, в которой сделана ошибка;

2) укажите, как исправить ошибку, – приведите правильный вариант строки.

 

Обратите внимание, что требуется найти ошибки в имеющейся программе, а не написать свою, возможно, использующую другой алгоритм решения. Исправление ошибки должно затрагивать только строку, в которой находится ошибка.

 

1. Разберемся, как выполняется данный алгоритм для числа 423:

 

Шаг 1

N = 423

Digit = 3

N= 42

Шаг 2

N = 42

Digit = 2

N = 4

Шаг 3

Печать «9»

 

 

 

2. Первая ошибка допущена в пятой строке «max_digit := 9;» Очевидно, что минимальная цифра – 0. Поэтому правильная строка выглядит следующим образом: «max_digit := 0;»

Вторая ошибка допущена в шестой строке: «while N >= 10 do». Цикл должен закончиться, когда N будет равным 0. Т.е. он выполняется, пока N > 0:

«while N > 0 do».

 

Демонстрационный вариант ЕГЭ 2013 г. ИНФОРМАТИКА и ИКТ, 11 класс

 

3.

 

 

Требовалось написать программу, при выполнении которой с клавиатуры считывается координата точки на прямой (x – действительное число) и определяется принадлежность этой точки одному из выделенных отрезков В и D (включая границы). Программист торопился и написал программу неправильно.

 

Бейсик

Алгоритмический язык

INPUT x

IF x>=-3 THEN

IF x<=9 THEN

IF x>1 THEN

PRINT "не принадлежит"

ELSE

PRINT "принадлежит"

ENDIF

ENDIF

ENDIF

END

алг

нач

вещ x

ввод x

если x>=-3 то

если x<=9 то

если x>1 то

вывод 'не принадлежит'

иначе

вывод 'принадлежит'

все

все

все

кон

С++

Паскаль

void main(void)

{

float x;

scanf("%f",&x);

if(x>=-3)

if(x<=9)

if(x>1)

printf("не принадлежит");

else

printf("принадлежит");

}

var x: real;

begin

readln(x);

if x>=-3 then

if x<=9 then

if x>1 then

write('не принадлежит')

else

write('принадлежит')

end.

 

Последовательно выполните следующее.

1. Перерисуйте и заполните таблицу, которая показывает, как работает программа при аргументах, принадлежащих различным областям (A, B, C, D и E). Границы (точки –3, 1, 5 и 9) принадлежат заштрихованным областям (B и D соответственно).

 

Область

Условие

1

(x >= –3)

Условие

2

(x <= 9)

Условие

3

(x > 1)

Программа

выведет

Область

обрабатывается

верно

A

 

 

 

 

 

B

 

 

 

 

 

C

 

 

 

 

 

D

 

 

 

 

 

E

 

 

 

 

 

 

В столбцах условий укажите «Да», если условие выполнится; «Нет», если условие не выполнится; «—» (прочерк), если условие не будет проверяться; «не изв.», если программа ведет себя по-разному для разных значений, принадлежащих данной области. В столбце «Программа выведет» укажите, что программа выведет на экран. Если программа ничего не выводит, напишите «—» (прочерк). Если для разных значений, принадлежащих области, будут выведены разные тексты, напишите «не изв.». В последнем столбце укажите «Да» или «Нет».

 

2. Укажите, как нужно доработать программу, чтобы не было случаев её

неправильной работы. (Это можно сделать несколькими способами, достаточно указать любой способ доработки исходной программы.)

 

1. Заполним таблицу:

 

Область

Условие

1

(x >= –3)

Условие

2

(x <= 9)

Условие

3

(x > 1)

Программа

выведет

Область

обрабатывается

верно

A

нет

-

-

-

нет

B

да

да

нет

принадлежит

да

C

да

да

да

Не принадлежит

да

D

да

да

да

Не принадлежит

нет

E

да

нет

-

-

нет

 

2. Будем проверять принадлежность двум отрезкам (для определения границ воспользуемся оператором «и»), используя оператор «или»:

var x: real;

begin

readln(x);

if ((x >= -3) and (x <= 1)) or ((x >= 5) and (x <= 9)) then

writeln('Принадлежит')

else

writeln('Не принадлежит');

end.

 

Демонстрационный вариант ЕГЭ 2012 г. ИНФОРМАТИКА и ИКТ, 11 класс

 

4.

 

 

 

 

 

 

 

 

Требовалось написать программу, при выполнении которой с клавиатуры считываются координаты точки на плоскости (x, y – действительные числа) и определяется принадлежность этой точки заданной закрашенной области (включая границы). Программист торопился и написал программу неправильно.

 

Бейсик

Алгоритмический язык

INPUT x, y

IF y>=x THEN

IF y>=0 THEN

IF y<=2-x*x THEN

PRINT "принадлежит"

ELSE

PRINT "не принадлежит"

ENDIF

ENDIF

ENDIF

END

алг

нач

вещ x,y

ввод x,y

если y>=x то

если y>=0 то

если y<=2-x*x то

вывод 'принадлежит'

иначе

вывод 'не принадлежит'

все

все

все

кон

С++

Паскаль

void main(void){

float x,y;

scanf("% f % f",&x,&y);

if (y>=x)

if (y>=0)

if (y<=2-x*x)

printf("принадлежит");

else

printf("не принадлежит");

}

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 и H). Точки, лежащие на границах областей, отдельно не рассматривать.

 

Область

Условие 1

(y>=x)

Условие 2

(y>=0)

Условие 3

(y<=2–x*x)

Программа

выведет

Область

обрабатывается верно

A

 

 

 

 

 

B

 

 

 

 

 

C

 

 

 

 

 

D

 

 

 

 

 

E

 

 

 

 

 

F

 

 

 

 

 

G

 

 

 

 

 

H

 

 

 

 

 

 

В столбцах условий укажите "да", если условие выполнится, "нет" если условие не выполнится, "—" (прочерк), если условие не будет проверяться, «не изв.», если программа ведет себя по-разному для разных значений, принадлежащих данной области. В столбце "Программа выведет" укажите, что программа выведет на экран. Если программа ничего не выводит, напишите "—" (прочерк). Если для разных значений, принадлежащих области, будут выведены разные тексты, напишите «не изв». В последнем столбце укажите "да" или "нет".

 

2. Укажите, как нужно доработать программу, чтобы не было случаев ее неправильной работы. (Это можно сделать несколькими способами, достаточно указать любой способ доработки исходной программы.)

 

1. Заполним таблицу:

 

Область

Условие 1

(y>=x)

Условие 2

(y>=0)

Условие 3

(y<=2–x*x)

Программа

выведет

Область

обрабатывается верно

A

да

да

нет

Не принадлежит

да

B

да

нет

-

-

нет

C

нет

-

-

-

нет

D

нет

-

-

-

нет

E

да

да

да

принадлежит

да

F

да

нет

-

-

нет

G

нет

-

-

-

нет

H

нет

-

-

-

нет

 

2. Разобьем решение на 2 части для x: от -2 до 0 и от 0 до 1:

var x,y: real;

begin

readln(x,y);

if ((x >= -2) and (x <= 0) and (y >= x) and (y <= 2-sqr(x))) or (x >= 0) and (x <= 1) and (y >= 0) and (y <= 2-sqr(x)) then

writeln('Принадлежит')

else

writeln('Не принадлежит');

end.

 

Демонстрационный вариант ЕГЭ 2011 г. ИНФОРМАТИКА и ИКТ, 11 класс

 

5.

 

 

 

 

 

 

Требовалось написать программу, при выполнении которой с клавиатуры считываются координаты точки на плоскости (x, y – действительные числа) и определяется принадлежность этой точки заданной заштрихованной области (включая границы). Программист торопился и написал программу неправильно.

 

Паскаль

Бейсик

С++

var x,y: real;

begin

readln(x,y);

if y<=x then

if y<=-x then

if y>=x*x-2 then

write('принадлежит')

else

write('не принадлежит')

end.

INPUT x, y

IF y<=x THEN

IF y<=-x THEN

IF y>=x*x-2 THEN

PRINT "принадлежит"

ELSE

PRINT "не принадлежит"

ENDIF

ENDIF

ENDIF

END

void main(void)

{ float x,y;

scanf("%f%f",&x,&y);

if (y<=x)

if (y<=-x)

if (y>=x*x-2)

printf("принадлежит");

else

printf("не

принадлежит");

}

 

Последовательно выполните следующее:

1) Приведите пример таких чисел x, y, при которых программа неправильно решает поставленную задачу.

2) Укажите, как нужно доработать программу, чтобы не было случаев ее неправильной работы. (Это можно сделать несколькими способами, поэтому можно указать любой правильный способ доработки исходной программы.)

 

1. x = 0, y = 0.5 – вообще не выдает никакого результата

 

2. Будем проверять принадлежность двум отрезкам (для определения границ воспользуемся оператором «и»), используя оператор «или»:

 

var x,y: real;

begin

readln(x,y);

if ((x >= -2) and (x <= 0) and (y >= x) and (y >= sqr(x)-2) and (y < -x)) or (x >= 0) and (x <= 2) and (y >= sqr(x)-2) and (y <= x) then

writeln('Принадлежит')

else

writeln('Не принадлежит');

end.

 

Демонстрационный вариант ЕГЭ 2010 г. ИНФОРМАТИКА и ИКТ, 11 класс

 

6.

 

 

 

 

 

 

 

Требовалось написать программу, которая вводит с клавиатуры координаты точки на плоскости (x,y – действительные числа) и определяет принадлежность точки заштрихованной области, включая ее границы. Программист торопился и написал программу неправильно.

 

 

Паскаль

Бейсик

С++

var x,y: real;

begin

readln(x,y);

if x*x+y*y>=4 then

if x>= –2 then

if y<= –x then

write('принадлежит')

else

write('не принадлежит')

end.

 

 

INPUT x, y

IF x*x+y*y>=4 THEN

IF x>= –2 THEN

IF y<= –x THEN

PRINT "принадлежит"

ELSE

PRINT "не принадлежит"

ENDIF

ENDIF

ENDIF

END

void main(void)

{ float x,y;

scanf("% f % f",&x,&y);

if (x*x+y*y>=4)

if (x>= –2)

if (y<= –x)

printf("принадлежит");

else

printf("не принадлежит");

}

 

Последовательно выполните следующее:

1) Приведите пример таких чисел x, y, при которых программа неверно решает поставленную задачу.

2) Укажите, как нужно доработать программу, чтобы не было случаев ее неправильной работы. (Это можно сделать несколькими способами, достаточно указать любой способ доработки исходной программы).

 

1. x = 0, y = 0 – вообще не выдает никакого результата

 

2. Посчитаем, какие значения может принимать x, приравняв уравнение прямой и окружности. Далее пропишем условие для y:

 

var x,y: real;

begin

readln(x,y);

if (x >= -2) and (x <= 2*sqrt(2)) and (y <= -x) and (y <= sqr(x) + sqr(y) - 4) then

writeln('Принадлежит')

else

writeln('Не принадлежит');

end.

 

Демонстрационный вариант ЕГЭ 2009 г. ИНФОРМАТИКА и ИКТ, 11 класс

 

7.

 

 

 

 

 

Требовалось написать программу, которая вводит с клавиатуры координаты точки на плоскости (x,y – действительные числа) и определяет принадлежность точки заштрихованной области, включая ее границы. Программист торопился и написал программу неправильно.

 

Паскаль

Бейсик

С++

var x,y: real;

begin

readln(x,y);

if y<=1 then

if x>=0 then

if y>=sin(x) then

write('принадлежит')

else

write('не принадлежит')

end.

INPUT x, y

IF y<=1 THEN

IF x>=0 THEN

IF y>=SIN(x) THEN

PRINT "принадлежит"

ELSE

PRINT "не принадлежит"

ENDIF

ENDIF

ENDIF

END

void main(void)

{ float x,y;

scanf("%f%f",&x,&y);

if (y<=1)

if (x>=0)

if (y>=sin(x))

printf("принадлежит");

else

printf("не принадлежит");

}

 

Последовательно выполните следующее:

1) Приведите пример таких чисел x, y, при которых программа работает неправильно.

2) Укажите, как нужно доработать программу, чтобы не было случаев ее неправильной работы. (Это можно сделать несколькими способами, по-этому можно указать любой способ доработки исходной программы).

 

1. Например, x = 10, y = 0,8.

 

2. Поступаем аналогично предыдущим заданиям:

 
var x,y: real;

begin

readln(x,y);

if (x >= 0) and (x <= pi/2) and (y <= 1) and (y >= sin(x)) then

writeln('Принадлежит')

else

writeln('Не принадлежит');

end.

 

Вывод

Это последняя статья по данному заданию. Было любопытно увидеть вектор развития данного задания с 2009 по 2018. Можно заметить, что раньше у экзаменуемых было больше творческих возможностей, постепенно формат стал более стандартизированным.

См. также

Математика и алгоритмы Программист Платформа 1C v8.2 Конфигурации 1cv8 Россия Абонемент ($m)

На написание данной работы меня вдохновила работа @glassman «Переход на ClickHouse для анализа метрик». Автор анализирует большой объем данных, много миллионов строк, и убедительно доказывает, что ClickHouse справляется лучше PostgreSQL. Я же покажу как можно сократить объем данных в 49.9 раз при этом: 1. Сохранить значения локальных экстремумов 2. Отклонения от реальных значений имеют наперед заданную допустимую погрешность.

1 стартмани

30.01.2024    3459    stopa85    12    

38

Математика и алгоритмы Бесплатно (free)

Разработка алгоритма, построенного на модели симплекс-метода, для нахождения оптимального раскроя.

19.10.2023    7955    user1959478    52    

36

Математика и алгоритмы Разное Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Расширение (+ обработка) представляют собою математический тренажер. Ваш ребенок сможет проверить свои знание на математические вычисление до 100.

2 стартмани

29.09.2023    3398    maksa2005    8    

26

Математика и алгоритмы Инструментарий разработчика Программист Платформа 1С v8.3 Мобильная платформа Россия Абонемент ($m)

Что ж... лучше поздно, чем никогда. Подсистема 1С для работы с регулярными выражениями: разбор выражения, проверка на соответствие шаблону, поиск вхождений в тексте.

1 стартмани

09.06.2023    11151    8    SpaceOfMyHead    19    

61

Математика и алгоритмы Программист Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Три задачи - три идеи - три решения. Мало кода, много смысла. Мини-статья.

03.04.2023    4652    RustIG    9    

25

Механизмы платформы 1С Математика и алгоритмы Программист Платформа 1С v8.3 Россия Бесплатно (free)

В статье анализируются средства платформы для решения системы линейных уравнений в 1С. Приводятся доводы в пользу некорректной работы встроенных алгоритмов, а значит потенциально некорректного расчета себестоимости в типовых конфигурациях.

23.11.2022    3810    gzharkoj    14    

25

Математика и алгоритмы Программист Платформа 1С v8.3 Россия Абонемент ($m)

Обычно под распределением понимают определение сумм пропорционально коэффициентам. Предлагаю включить сюда также распределение по порядку (FIFO, LIFO) и повысить уровень размерности до 2-х. 1-ое означает, что распределение может быть не только пропорциональным, но и по порядку, а 2-ое - это вариант реализации матричного распределения: по строкам и столбцам. Возможно вас заинтересует также необычное решение этой задачи через создание DSL на базе реализации текучего интерфейса

1 стартмани

21.03.2022    9093    7    kalyaka    11    

44
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. teller 22.02.19 07:08 Сейчас в теме
Интересно.
Фейнмана забывают совсем.
Если атомы, из которых состоят все тела, находятся в непрерывном движении, то за счет чего предметы сохраняют постоянную форму, иногда не меняясь очень подолгу (например, окаменелости)?
2. teller 22.02.19 07:10 Сейчас в теме
А на информатике уже c++, python?
Как школьники успевают понять причины возникновения этих языков?
3. vasilev2015 2725 22.02.19 09:02 Сейчас в теме
(2) Мой проходил только Паскаль. Не знаю, для кого в состав ЕГЭ включают другие языки. Может, в спецшколах их преподают ?
Оставьте свое сообщение