Методика решения и оценивания задач «С1», «С2» Единого Государственного Экзамена Пример задания С1 Требовалось написать программу, которая вводит с клавиатуры координаты точки на плоскости (x, y – действительные числа) и определяет принадлежность точки заштрихованной области, включая ее границы. Программист торопился и написал программу неправильно. Вот она: INPUT x, y if y <= 1 then if x >= 0 then if y >= sin(x) then print “принадлежит” else print “не принадлежит” end Последовательно выполните следующее: 1) Приведите пример таких чисел x, y, при которых программа неверно решает поставленную задачу. 2) Укажите, как нужно доработать программу, чтобы не было случаев ее неправильной работы. (Это можно сделать несколькими способами, поэтому можно указать любой способ доработки исходной программы). Методика решения задач типа С1 1. Определим по графику набор условий, которые должны быть выполнить справа от оси y, что равносильно условию x>=0 слева от первого максимума функции; из математики мы знаем, что эта функция достигает максимума при x = pi/2, поэтому получаем второе условие x <= pi/2 ниже линии y = 1, откуда следует третье условие y <= 1 выше линии y = sin(x), что дает четвертое условие y >= sin(x) Вывод: точка принадлежит указанной области, только если выполняются все 4 условия! Методика решения задач типа С1 2. Из программы видно, что не хватает одного условия x <= pi/2, поэтому можно определить точку, которая не принадлежит указанной области, но в программе не обрабатывается Это может быть точка с координатами x = 3.14, y = 0.5 или любая другая, для которой выполняется условие y>=sin(x) и x > pi/2 Методика решения задач типа С1 3. Выясним, когда программа выдает сообщение принадлежит». Для этого составим блок-схему «Не if y <= 1 then if x >= 0 then if y >= sin(x) then print ”принадлежит” else print “не принадлежит” по схеме видим, что если первое условие ложно, или второе условие ложно, то программа вообще не выдает никакого сообщения, то есть, работает неправильно Методика решения задач типа С1 4. Исправим программу, чтобы она работала корректно if x <= pi/2 then if y <= 1 then if x >= 0 then if y >= sin(x) then print “принадлежит” else print “не принадлежит” else print “не принадлежит” else print “не принадлежит” else print “не принадлежит” данное решение является правильным, но не совсем элегантным, поскольку для такой простой программы выводит 4 раза надпись «Не принадлежит». Методика решения задач типа С1 5. Более красивое решение для этой задачи состоит в использовании одного сложного условия, построенного с помощью логической операции and. Input x,y If x >= 0 and x <= pi/2 and y <= 1 and y >= sin(x) then print “принадлежит” Else print “не принадлежит” End if End Замечания по оцениванию С1 В качестве примера входных данных можно приводить не только число (или числа), но и множество, интервал, неравенство. Если в первой части задания приводится несколько чисел, причем среди них есть как правильные, так и НЕ правильные, то результат не засчитывается. Задание С2 Тема: Обработка массива Цель задания: Умение написать короткую (10-15 строк) простую программу обработки массива на языке программирования или записать алгоритм на естественном языке. Время на решение: 30 минут. Пример задания С2 Опишите на русском языке или одном из языков программирования алгоритм подсчета максимального количества подряд идущих совпадающих элементов в целочисленном массиве длины 30. Методика решения задач типа С2 1. Разобраться в сути задачи, понять ее и нарисовать пример массива 1 1 2 2 1 1 1 1 3 3 2 2 Методика решения задач типа С2 2. Сформулировать для себя (может быть пока не полный и не точный) алгоритм, например такой: «Пройти весь массив, подсчитывая для каждого элемента длину цепочки подряд идущих одинаковых чисел, если эта длина больше текущей, то запомнить ее» Для этого понадобятся как минимум две переменные: k – текущая длина цепочки повторений kMax – максимальная длина цепочки 1 1 2 2 1 1 1 1 3 3 2 2 1 2 1 2 1 2 3 4 1 2 1 2 kMax 1 2 2 2 2 2 3 4 4 4 4 4 K Методика решения задач типа С2 3. Сформулируем окончательный алгоритм на русском языке: «Выделим две вспомогательные переменные, k и kMax, и запишем в каждую из них по единице. В цикле рассматриваем все элементы массива со второго до последнего, если очередной элемент равен предыдущему, увеличиваем k; если k > kMax, записываем в kMax значение k. В конце цикла в kMax окажется требуемое значение». Методика решения задач типа С2 4. Сформулируем окончательный алгоритм на Бейсике: DIM A(30) K= 1 kMax = 1 For i=2 to 30 If A(i) = A(i-1) then k=k+1 Else k = 1 End if If k > kMax then kMax = k End if Next i Print “kMax=”kMax END Возможные проблемы в задачах С2 проверьте, что будет записано в переменные до начала цикла (определены ли их начальные значения) проверяйте, не выйдет ли индекс за границу массива в начале или в конце цикла будьте внимательны с «крайними» случаями, например, нужно обязательно убедиться, что программа работает, когда интересующая нас цепочка стоит в самом начале или в самом конце массива Критерии оценивания С2 Задание С2 относится к высокому уровню сложности. За решение этого задания можно получить два балла. По содержанию проверяет умение формально описывать алгоритм на естественном языке или на языке программирования. Задача С2_1 Опишите на русском языке или одном из языков программирования алгоритм подсчета суммы произведений последовательных пар элементов в целочисленном массиве из 30 элементов. Это значит, что нужно рассчитать сумму произведений первого и второго, третьего и четвертого, пятого и шестого и т.д.). Методика решения Сформулировать для себя (может быть пока не полный и не точный) алгоритм, например такой: «Пройти весь массив, подсчитывая произведение элементов очередной пары и суммируя их» Для этого понадобится переменная: SumProd – сумма произведений последовательных пар элементов 1 SumProd 2 1∙2+ 5 6 5∙6+ 3 1 3∙1+ SumProd=89 4 7 4∙7+ 8 1 8∙1+ 3 6 3∙6 Алгоритм Введем переменную SumProd, в которую будем заносить сумму произведений последовательных пар элементов в просмотренной части массива, и присвоим ей начальное значение 0. В цикле до конца массива: считаем произведение элементов очередной пары и прибавляем его к SumProd. По окончании цикла переменная SumProd содержит сумму произведений последовательных пар элементов массива. Сформулируем окончательный алгоритм на Бейсике: N=30 DIM A(N) For i=1 to N Input A(i) Next i SumProd =0 For i=1 to N/2 SumProd= SumProd+A(2*i-1)*A(2*i) Next i Print “SumProd=”; SumProd END Задача С2_2 Опишите на русском языке или одном из языков программирования алгоритм поиска номера первого из двух последовательных элементов в целочисленном массиве из 30 элементов, произведение которых максимально (если таких пар несколько, то можно выбрать любую из них). Методика решения Сформулировать для себя (может быть пока не полный и не точный) алгоритм, например такой: «Пройти весь массив, подсчитывая произведение элементов очередной пары. Если это произведение больше текущего, то запомнить номер первого элемента этой пары.» Для этого понадобятся 2 переменные: MaxProd – максимальное произведение двух последовательных элементов; MaxNum – номер первого элемента в этой паре. 1 MaxNum MaxProd 2 1 5 6 3 1∙2 5∙6 3 1 5 3∙1 MaxNum =3 4 7 7 4∙7 Алгоритм 1. Введем целочисленную переменную MaxProd, в которую будем заносить максимальное произведение двух последовательных элементов в просмотренной части массива и переменную MaxNum, в которую будем заносить номер первого элемента в этой паре. 2. Присвоим начальное значение MaxProd равное произведению первых двух элементов, переменной MaxNum номер - 1. 3. В цикле до конца массива: проверяем превосходит ли произведение элементов очередной пары найденный максимум. Если превосходит, то заносим в переменную MaxProd новое произведение, а в переменную MaxNum – номер первого элемента этой пары. 4. По окончании цикла осуществляем вывод значения MaxNum. Сформулируем окончательный алгоритм на Бейсике: N=30 DIM A(N) For i=1 to N Input A(i) Next i MaxNum =1 MaxProd=A(1)*A(2) For i=1 to N-1 IF A(i)*A(i+1)>MaxProd THEN MaxNum=I MaxProd=A(i)*A(i+1) End If Next i Print “MaxNum=”; MaxNum END Задача С2_3 Опишите на русском языке или одном из языков программирования алгоритм поиска номера первого из двух последовательных элементов в целочисленном массиве из 30 элементов, сумма которых максимальна (если таких пар несколько, то можно выбрать любую из них). Методика решения Сформулировать для себя (может быть пока не полный и не точный) алгоритм, например такой: «Пройти весь массив, подсчитывая сумму элементов очередной пары. Если эта сумма больше текущей, то запомнить номер первого элемента этой пары.» Для этого понадобятся 2 переменные: MaxSum – максимальная сумма двух последовательных элементов; MaxNum – номер первого элемента в этой паре. 1 MaxNum MaxSum 2 5 6 3 1 4 7 1 3 5 7 1+2 5+6 3+1 4+7 MaxSum =3 Алгоритм 1. Введем целочисленную переменную MaxSum, в которую будем заносить максимальную сумму двух последовательных элементов в просмотренной части массива и переменную MaxNum, в которую будем заносить номер первого элемента в этой паре. 2. Присвоим начальное значение MaxSum, равное сумме первых двух элементов, а переменной MaxNum номер 1. 3. В цикле до конца массива: проверяем превосходит ли сумма элементов очередной пары найденный максимум. Если превосходит, то заносим в переменную MaxSum новую сумму, а в переменную MaxNum – номер первого элемента пары. 4. По окончании цикла осуществляем вывод значения MaxNum. Сформулируем окончательный алгоритм на Бейсике: N=30 DIM A(N) For i=1 to N Input A(i) Next i MaxNum =1 MaxSum=A(1)+A(2) For i=1 to N-1 IF A(i)+A(i+1)>MaxSum THEN MaxNum=i MaxSum=A(i)+A(i+1) End If Next i Print “MaxNum=”; MaxNum END