ЕГЭ по информатике Задания части С, их решения, подготовка.
Варианты заданий части С год из года не радуют нас разнообразием. Хотя, насчет «не радуют» - возможны варианты.
С1. Исправление ошибок в программе с условными операторами. Требовалось написать программу, которая вводит с клавиатуры координаты точки на плоскости (x, y – действительные числа) и определяет принадлежность точки заштрихованной области, включая ее границы. Программист торопился и написал программу неправильно. Вот она: var x,y: real; begin readln(x,y); if y = 0 then if y >= sin(x) then write('принадлежит') else write('не принадлежит') end. Последовательно выполните следующее: 1) Приведите пример таких чисел x, y, при которых программа неверно решает поставленную задачу. 2) Укажите, как нужно доработать программу, чтобы не было случаев ее неправильной работы. (Это можно сделать несколькими способами, поэтому можно указать любой способ доработки исходной программы).
О задании. Задание из года в год и из варианта в вариант отличается лишь видом функции (синус меняется с косинусом) и расположением области (над функцией, под функцией, справа-слева и тому подобное. Перемещается также и линия. Налицо типовая задача. Если подобную задачу разбирали на уроках – подготовка практически не требуется.
Рекомендации - 1. Первое задание подразумевает исключительно указание варианта точки (координат X и Y) при которых программа выдаст неправильный ответ. Не требуется – доказательство, обоснование, вывод общего принципа, определение области, точки из которой нам подходят. Одна точка, две координаты. Все. Легко убедится что простой «прогон» по алгоритму методом подстановки требует всего лишь 2-3 попыток. В любом случае, следует проверить ответ подстановкой. И - балл в кармане.
Рекомендации -2. Вторая часть задания – указать, как нужно доработать программу. Любой практик знает, что «Чем исправлять чужое, проще написать своё». Ведь ответом служит текст «правильной» программы, а не подробные указания «как исправить» и «где ошибка». Особенно просто «написать своё», когда задача – типовая. Следует либо воспользоваться сложным условием, либо не забывать про полную форму оператора IF ( if –then-ELSE!). Именно про нее позабыл «незадачливый программист-торопыга» из задания.
С2. Обработка массива. Опишите на русском языке или одном из языков программирования алгоритм получения из заданного целочисленного массива размером 30 элементов другого массива, который будет содержать модули значений элементов первого массива (не используя специальной функции, вычисляющей модуль числа). Опишите на русском языке или одном из языков программирования алгоритм подсчета максимального количества подряд идущих совпадающих элементов в целочисленном массиве длины 30. Дан целочисленный квадратный массив 10 х 10. Опишите на русском языке или на одном из языков программирования алгоритм вычисления суммы максимальных элементов из каждой строки. Напечатать значение этой суммы. Предполагается, что в каждой строке такой элемент единственный.
Рекомендации. Тут все просто – ученик или знает как работать с массивами, или нет. Подчеркну – именно знает. Сами программы у ученика могут быть ужасны. Но знание общего принципа – может спасти, ибо требуется не программа – а алгоритм. Его же можно описать и простым литературным русским языком. Важно выбрать – если есть хорошее понимание алгоритма – следует просто описать его. Если с русским языком хуже чем с Паскалем – следует писать программу.
С3. Дерево игры. Поиск выигрышной стратегии. Два игрока играют в следующую игру. На координатной плоскости стоит фишка. Игроки ходят по очереди. В начале игры фишка находится в точке с координатами (5,2). Ход состоит в том, что игрок перемещает фишку из точки с координатами (x,y) в одну из трех точек: или в точку с координатами (x+3,y), или в точку с координатами (x,y+3), или в точку с координатами (x,y+4). Выигрывает игрок, после хода которого расстояние по прямой от фишки до точки с координатами (0,0) не меньше 13 единиц. Кто выигрывает при безошибочной игре обоих игроков – игрок, делающий первый ход, или игрок, делающий второй ход? Каким должен быть первый ход выигрывающего игрока? Ответ обоснуйте.
Рекомендации Необходимо рисовать дерево игры! Необязательно делать это полностью (не повторять уже отработанные варианты). Обязательно написать ответ на вопрос словами, в простой и понятной форме. Словами описать стратегию (мы ходим сюда, он ходит туда, мы ходим сюда, куда бы он не походил – мы победили). Это простая задача на логику и спокойствие – следует хотя бы попытаться.
С4. Тихий ужас. На вход программе подаются сведения о номерах школ учащихся, участвовавших в олимпиаде. В первой строке сообщается количество учащихся N, каждая из следующих N строк имеет формат: где – строка, состоящая не более чем из 20 символов, – строка, состоящая из 4-х символов (буква, точка, буква, точка), – не более чем двузначный номер. и, а также и разделены одним пробелом. Пример входной строки: Иванов П.С. 57 Требуется написать как можно более эффективную программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет выводить на экран информацию, из какой школы было меньше всего участников (таких школ может быть несколько). При этом необходимо вывести информацию только по школам, пославшим хотя бы одного участника. Следует учитывать, что N>=1000.
На вход программе подаются сведения о сдаче экзаменов учениками 9-х классов некоторой средней школы. В первой строке сообщается количество учеников N, которое не меньше 10, но не превосходит 100, каждая из следующих N строк имеет следующий формат:, где – строка, состоящая не более чем из 20 символов, – строка, состоящая не более чем из 15 символов, – через пробел три целых числа, соответствующие оценкам по пятибалльной системе. и, а также и разделены одним пробелом. Пример входной строки: Иванов Петр Требуется написать как можно более эффективную программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет выводить на экран фамилии и имена трех худших по среднему баллу учеников. Если среди остальных есть ученики, набравшие тот же средний балл, что и один из трех худших, то следует вывести и их фамилии и имена.
Рекомендации. Первое – не браться. Нет, правда. Второе. Не пользоваться записями (тип record). Ни в коем разе. Третье. Изучить излюбленные авторами задачи способы ввода информации и ее обработки. Научится понимать все-все-все намеки в задании.
Получается что-то вроде: const LIM = 99; var C:array[1..LIM] of integer; i, p, N, k, r, Min: integer; s:string; begin readln(N); for i:=1 to N do begin readln(s); { читаем очередную строку } { выделяем часть после второго пробела } p := Pos(' ', s); s := Copy(s, p+1, Length(s)-p); p := Pos(' ', s); s := Copy(s, p+1, Length(s)-p); { определяем номер школы k } Val(s, k, r); C[k] := C[k] + 1; { увеличиваем счетчик k-ой школы } end; Min := N; for k:=1 to LIM do if (C[k] 0) and (C[k]
Или вот так: const LIM = 100; var Info: array[1..LIM] of record name: string; sum: integer; end; i, k, N, mark, min1, min2, min3: integer; c: char; begin readln(N); { ввод исходных данных } for i:=1 to N do begin Info[i].name := ''; for k:=1 to 2 do repeat read(c); Info[i].name := Info[i].name + c; until c = ' '; Info[i].sum := 0; for k:=1 to 3 do begin read(mark); writeln(mark); Info[i].sum := Info[i].sum + mark; end; readln; end; { поиск трех минимальных } min1 := 20; min2 := 20; min3 := 20; for i:=1 to N do begin if Info[i].sum
Намного подробнее – в приложенных файлах за авторством К. Полякова.