ПОДГОТОВКА К ЕГЭ ПО ИНФОРМАТИКЕ И ИКТ ЧАСТЬ С (ЗАДАНИЕ С1) Автор Воеводина Е.Т. учитель информатики и ИКТ ГОУ СОШ 603 Фрунзенского района г. Санкт-Петербурга
Задание С1 – на поиск ошибок и оценивается в 3 балла ВОЗМОЖНЫЕ ВАРИАНТЫ ОШИБОК: в программе осуществлен ввод лишних данных; ошибка в операторе условия (> вместо
Классификация заданий С1 1)входные данные – числовые выражения и задание содержит три вопроса: определить при каких входных данных программа работает неверно (вопрос для всех классов заданий С1); определить лишнюю часть представленной программы; исправить предложенную программу. 2)входные данные – числовые выражения, но вопросов два (т.е. в исходной части программы две ошибки); 3)входные данные – числовые, вопросов два, оба касаются исправления программы, но второй вопрос сформулирован довольно жёстко (требует не содержать логических функций и т.д.) 4)входные данные – строковые переменные, а в остальном соответствует первому классу заданий С1.
Некоторые рекомендации для подготовки Важно ориентировать учеников на то, что в этом задании отдельно оценивается ответ на каждый поставленный вопрос. В первом вопросе необходимо указать, как правило, примеры входных данных, при которых программа будет работать неправильно! Ответ не должен состоять из короткого «да» или «нет». Если требуется обоснование ответа, оно должно быть приведено. Если задания перекликаются, например, во 2 задании предлагается усовершенствовать программу любым способом, а в 3 – конкретным (без использования AND и OR), то правильный ответ на более сложный вопрос может дать 2 балла и перекрыть таким образом оба задания. Эффективность программы в задании не оценивается. Рассмотрим несколько примеров заданий С1 с различными формулировками условия
Т.е. в программе не учтено условие x
Т.е. в программе не учтено условие y>=0
Т.е. в программе не учтено условие x>=0
Программа на языке Паскаль Программа на языке Бейсик VAR i,j: integer; BEGIN writeln('искомые поля'); for j:=5 to 8 do for i:=1 to 8 do begin if (i=9-j) OR (i=j) then writeln('i=',i, 'j=',j); end; end. PRINT "Искомые поля" FOR J=5 TO 8 FOR I=1 TO 8 IF (I=9-J) OR (I=J) THEN PRINT "I="; I PRINT "J="; J ENDIF NEXT I NEXT J END С1. Рассматривается стандартная шахматная доска размером 8 х 8. Примем, что i – номер вертикали (может принимать значения от 1 до 8), j – номер горизонтали (также может принимать значения от 1 до 8). В левом нижнем углу, т.е. на поле i =1, j=1 (это поле черного цвета) стоит черный король. Напомним, что король может ходить на 1 клетку в любом направлении (по горизонтали, вертикали или диагонали). В правом нижнем углу, т.е. на поле i =8, j=1 (это поле белого цвета) стоит белый король. Введены обозначения: P(i,j) минимальное число ходов, за которое черный король может попасть на поле (i,j); V(i,j) минимальное число ходов, за которое белый король может попасть на поле (i,j). Программист написал программу, в которой требовалось определить все такие поля (i,j), для которых P(i,j) = V(i,j), и выдать на экран соответствующие значения i,j (текст программы приведен ниже). 1) Выдаст ли программа, написанная программистом, поле, для которого i=4, j=5 ? 2) Указать все из перечисленных ниже полей, которые удовлетворяют постановке задачи, т.е. для таких полей должно быть выполнено P(i,j) = V(i,j) (i=1, j=8), (i=2, j=8), (i=1, j=7), (i=5, j=5), (i=8, j=6) 3) Видно, что программист допустил ошибку в программе. Укажите, какую доработку программы нужно провести, чтобы она соответствовала постановке задачи (такая доработка может быть проведена неединственным образом – годится любой правильный вариант доработки)
Содержание верного ответа (допускаются иные формулировки ответа, не искажающие его смысла) Элементы ответа: 1) Поле i=5, j=4 будет выдано приведенной программой (т.к. i+j=9) (необходимое пояснение!) 2) (i=1, j=8), (i=2, j=8), (i=5, j=5) – эти поля удовлетворяют постановке задачи (ответ очевиден, если нарисовать шахматную доску 8 х 8 и королей в двух нижних углах) 3) Возможный (самый короткий) способ доработки: вместо if (i=9-j) OR (i=j) проверять условие if (i>=9-j) AND (i
ПРОГРАММА НА ПАСКАЛЕПРОГРАММА НА БЕЙСИКЕ VAR a,b,x: integer; p: integer; BEGIN readln(a,b,x); if (a>x) AND (x>b) then writeln('x между a,b'); END. CLS INPUT a, b, x IF (a>x) AND (x>b) THEN PRINT x между a, b END C1. Требовалось написать программу, в которой нужно было проверить, лежит ли число x на числовой оси между числами a и b ("между" понимается в строгом смысле, т.е. случай x=a или x=b недопустим). Числа x, a, b являются натуральными, и известно, что a отлично от b (но неизвестно: a>b или b>a). Входная информация вводится с клавиатуры, а на выходе должно быть сообщение вида «x между a и b» (если это действительно так), в противном случае никакой выходной информации не выдается. Программист торопился и написал программу некорректно. Последовательно выполните три задания: 1) Приведите пример таких чисел a, b, x, при которых программа работает неправильно. 2) Укажите, как нужно доработать программу, чтобы не было случаев ее неправильной работы. (Это можно сделать несколькими способами, поэтому можно указать любой способ доработки исходной программы). 3) Укажите, как можно доработать программу, соблюдая дополнительное условие: доработанная программа не должна использовать логических операций AND или OR.
Содержание верного ответа (допускаются иные формулировки ответа, не искажающие его смысла) Элементы ответа: 1) Пример: a=1 x=2 b=3 2) Возможная доработка: if ax) AND (x>b) then writeln(' x между a,b'); (могут быть и другие правильные способы доработки). 3) Возможная доработка без использования логических операций AND, OR: p:=(x-a)*(x-b); if p
Прежде, чем приступить к решению задачи, следует ещё раз обратить внимание на распространённую ошибку учащихся. Вместо требуемого в задании примера исходных данных, при которых программа работает неправильно, они приводят пример, когда ошибочная программа работает правильно. Возможно это связано с тем, что учащимися не всегда правильно понимается, что роль тестовых данных в программировании, не только доказать работоспособность программы, но и выявить содержащиеся в ней ошибки.
Этот вариант задания оказался «сырым». Если проанализировать программы на Паскале и Бейсике, выяснится, что они разные. Оказывается, что в программе на Бейсике ошибок больше. Для определённости рассмотрим программу на Паскале. Анализ программы показывает, что она даёт неправильный результат всегда, когда строчка начинается не с пробела или не заканчивается пробелом. 1. Ответ на первый вопрос, например, последовательность: b aba 2. Лишняя часть программы: if (s[i-1]=` `)and (s[i]` `)and(s[i+1]=` `) then k:=k+1; 3. Доработать программу можно следующим образом: перед циклом добавить : a:=s[1]; {сохранение первого символа} а во второе ветвление добавить ещё одно условие – if (s[i]` `)and(s[i+1]=` `)or(i=length(s)) then if s[i]=a
Таким образом вариант доработанной программы может выглядеть так: Var s:string; a: char; I, k: integer; begin readln(s); k:=0; a:=s[1]; {сохранение значения первого символа} for i:=1 to length(s) do begin if (s[i]=` `) and (s[i+1] ` `) then a:=s[i+1]; if (s[i]` `) and (s[i+1]= ` `) or (i= length(s)) then if s[i]=a then k:=k+1; end; if k=0 then write (`таких слов нет`) else write (`k=`, k) end.
ЛИТЕРАТУРА 1. Информатика и ИКТ. Подготовка к ЕГЭ под ред. Н.Макаровой 2.ЕГЭ. Универсальные материалы для подготовки учащихся. Учебник ФИПИ. 3. Ссылка на прохождение ЕГЭ по информатике: Справочник начинающего программиста :poleznye_ssylki (Учебник по VB, Основы алгоритмизации, решение задач, экзамены, олимпиады, сценарии уроков) :poleznye_ssylki 6. копилка педагогического опыта 7. Сайт Константина Полякова с подробным анализом задач по ЕГЭ: