Анализ результатов егэ за 2013 год
![]()
|
Задание С2Задание С2 проверяет умение написать короткую (10-15 строк) простую программу на языке программирования или записать алгоритм на естественном языке. Как правило, это задание на составление алгоритма обработки массива, и оно относится к высокому уровню сложности [15]. Теоретический материал для решения задания С2В основе задания С2 лежит работа с массивами, их сортировкой и поиском элементов. Массив – однородная совокупность элементов. Массивы состоят из ограниченного числа элементов, причем все элементы массива имеют один и тот же тип, который называется базовым. Массив может состоять из элементов типа ![]() ![]() Каждый элемент массива имеет порядковый номер, называемый индексом. Очень часто это целочисленный тип ( ![]() ![]() С помощью индекса можно обращаться к отдельным элементам любого массива, как к обычной переменной: можно получать значение этого элемента, отдельно присваивать ему значение, использовать его в выражениях. Например: A[5]:=23; - пятому элементу массива A присваивается значение 23. C[1]:=’w’; - первому элементу массива C символьного типа, присваивается значение w. A[7]:=A[5]*2; - седьмому элементу массива A присваивается значение равное произведению значения пятого элемента на 2. Writeln (C[1], C[3]); - на экран выводится значение первого и третьего элемента массива C. Индекс массива в Паскале не обязательно задавать в явном виде. В качестве индекса массива можно использовать переменную или выражение, соответствующее индексному типу. Иначе говоря, индексы можно вычислять. В языке Паскаль тип массива задается с использованием специального слова ![]() Var m: array [1..10] of integer; Так описывается массив ![]() ![]() Единственное действие, которое можно выполнять над массивами целиком, причем только при условии, что массивы однотипны, – это присваивание. Если в программе описаны две переменные одного типа, например, Var a, b: array [1..10] of real; то можно переменной ![]() ![]() ![]() ![]() ![]() Для того чтобы ввести значения элементов массива, необходимо последовательно изменять значение индекса, начиная с первого до последнего, и вводить соответствующий элемент. Для реализации этих действий удобно использовать цикл с заданным числом повторений, т.е. простой арифметический цикл, где параметром цикла будет выступать переменная – индекс массива Паскаля. Значения элементов могут быть введены с клавиатуры или определены с помощью оператора присваивания. Пример фрагмента программы ввода массива Паскаля: Var A: array [1..10] of integer; I: byte; {переменная I вводится как индекс массива} Begin For i:=1 to 10 do Readln (a[i]); {ввод i-го элемента производится с клавиатуры} Вывод массива в Паскале осуществляется также поэлементно, в цикле, где параметром выступает индекс массива, принимая последовательно все значения от первого до последнего. Пример фрагмента программы вывода массива Паскаля: Var A: array [1..10] of integer; I: byte; {переменная I вводится как индекс массива} Begin For i:=1 to 10 do Write (a [i],’ ‘); {вывод массива осуществляется в строку, после каждого элемента печатается пробел} Вывод можно осуществить и в столбик с указанием соответствующего индекса. Но в таком случае нужно учитывать, что при большой размерности массива все элементы могут не поместиться на экране и будет происходить скроллинг, т.е. при заполнении всех строк экрана будет печататься очередной элемент, а верхний смещаться за пределы экрана. Алгоритм сортировки при решении задания можно использовать самый простой – методом пузырька: При первом проходе по массиву элементы попарно сравниваются между собой: первый со вторым, второй с третьим, третий с четвертым и т.д. Если предшествующий элемент оказывается больше последующего, то их меняют местами. Не трудно догадаться, что постепенно самое большое число оказывается последним. Остальная часть массива остается не отсортированной, хотя некоторое перемещение элементов с меньшим значением в начало массива наблюдается. При втором проходе число сравнений будет на одно меньше. Уже ненужно сравнивать последний элемент с предпоследним. Последний элемент уже стоит на своем месте. На третьем проходе уже не надо сравнивать предпоследний и третий элемент с конца. Поэтому число сравнений будет на два меньше, чем при первом проходе. В конце концов, при проходе по массиву, когда остаются только два элемента, которые надо сравнить, выполняется только одно сравнение. Другими словами, количество проходов по массиву равно m-1, где m – это количество элементов массива. При обмене элементов массива обычно используется "буферная" (третья) переменная, куда временно помещается значение одного из элементов. for i:=1 to m-1 do for j:=1 to m-i do if a[j] > a[j+1] then begin k:=a[j]; a[j]:=a[j+1]; a[j+1]:=k; end; Алгоритмы поиска минимального элемента в массиве можно использовать следующий: min:=a[1]; for i:=2 to m do begin if a[i] < min then min:=a[i]; end; Переменная ![]() ![]() Алгоритм поиска максимального элемента в массиве выглядит аналогично: max:=a[1]; for i:=2 to m do begin if a[i] > max then max:=a[i]; end; Переменная ![]() ![]() Разбор задания С2Дан целочисленный массив из 30 элементов. Элементы массива могут принимать целые значения от 0 до 1000. Опишите на языке программирования алгоритм, позволяющий найти и вывести количество элементов массива, десятичная запись которых содержит ровно 2 цифры, причём хотя бы одна из этих цифр — цифра 9. Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать часть из них.
В качестве ответа Вам необходимо привести фрагмент программы (или описание алгоритма на естественном языке), который должен находиться на месте многоточия. Вы можете записать решение также на другом языке программирования (укажите название и используемую версию языка программирования, например, Free Pascal 2.4) или в виде блок-схемы. В этом случае Вы должны использовать те же самые исходные данные и переменные, какие были предложены в условии (например, в образце, записанном на естественном языке) [5]. Для простоты решения сначала можно составить словесный алгоритм, а потом перевести его на язык программирования. Условие задачи сводится к тому, что из 30 элементов, имеющихся в массиве необходимо выбрать двузначные хотя бы с одной девяткой. Таким образом, первое, что необходимо сделать это написать условие для отбора двузначных чисел: если значение элемента массива больше 9 и меньше 100, то оно двузначное (вариант больше либо равно 10 и меньше либо равно 99 также является корректным). Далее необходимо выбрать из множества двузначных чисел числа, в которых есть девятки. Несложно посчитать, что их 18 (19, 29, 39, 49, 59, 69, 79, 89, 90 - 99). Условие «хотя бы с одной девяткой» означает, что девяток может быть 1 и больше, в нашем случае одна, либо две, так как число двузначное. Так как все числа в промежутке от 89 до 99 нам подходят, то этот интервал можно выделить в отдельное условие: если значение элемента массива больше 88 и меньше 100, то число двузначное и имеет в своем составе хотя бы одну девятку (вариант больше либо равно 89 и меньше либо равно 99 также является корректным). Остальные числа 19, 29, 39… можно выделить следующим образом: если значение элемента массива оканчивается на 9, то число двузначное и имеет в своем составе хотя бы одну девятку. Останется только посчитать количество выбранных чисел. Перед тем как начинать писать программу необходимо разобраться с переменными. Новые переменные добавлять нельзя, но можно использовать не все данные переменные. Переменная ![]() ![]() ![]() ![]() ![]() ![]() Процедура ввода элементов массива в примере описана: for i:=1 to N do readln(a[i]); Теперь непосредственно алгоритм: Обнуляем счетчик чисел ![]() k:=0; Просматривая каждый элемент массива находим двузначные: for i:=1 to N do begin if (a[i]>=10) and (a[<=99]) then Из двузначных элементов выбираем элементы хотя бы с одной девяткой из промежутка от 89 до 99 и если такой найден увеличиваем счетчик на 1: if (a[i]=>89) and (a[i]<=99) then k:=k+1; Из двузначных элементов выбираем элементы хотя бы с одной девяткой не входящие в промежуток от 89 до 99 с помощью операции ![]() if (a[i] mod 10 = 9) then k:=k+1; Объединяя условия из пункта 2, 3 и 4 получаем: for i:=1 to N do begin if (a[i]>=10) and (a[i]<=99) and ((a[i]>=89) and (a[i]<=99) or (a[i] mod 10 = 9)) then k:=k+1; end; Сначала проверяется является ли значение элемента массива двузначным числом. Если число двузначное, то определяется его принадлежность интервалу от 89 до 99 или наличие в числе девятки, если число принадлежит этому интервалу, то счетчик чисел увеличивается на 1. Если девятка найдена, то счетчик чисел увеличивается на 1, в противном случае цикл переходит к следующему элементу массива. После завершения цикла остается только вывести на экран значение переменной ![]() writeln (k); end. Еще один способ доработки, использую операции ![]() ![]() k:=0; for i:=1 to N do begin if (10<=a[i]) and (a[i]<=99) and ((a[i] mod 10 = 9) or (a[i] div 10=9)) then k:=k+1; end; writeln(k); В этом варианте решения сначала проверяется является ли значение элемента массива двузначным числом. Если это условие выполняется, то с помощью операции mod проверяется будет ли остаток от деления на 10 равен девятке (вторая цифра в числе). И с помощью операции div проверяется будет ли результат целочисленного деления на 10 равен 9 (первая цифра в числе). Два последних условия объединены операцией ![]() Еще один вариант заданияОпишите на русском языке или одном из языков программирования алгоритм вычисления разности максимального среди элементов, имеющих чётные значения, и максимального среди элементов, имеющих нечётные значения, в заданном целочисленном массиве из 30 положительных элементов (в предположении, что в массиве есть и чётные, и нечётные элементы) [5]. Сначала необходимо определиться с переменными и объявить их в разделе описания переменных. Переменная m типа массив будет содержать в себе целочисленный массив из 30 положительных элементов. Переменная ![]() ![]() ![]() ![]() ![]() const N=30; var m: array [1..N] of integer; i, raz, max_ch, max_nech: integer; begin for i:=1 to N do readln(m[i]); … После того, как был введен массив начинаем поиск максимального четного элемента, предварительно обнулив переменную ![]() ![]() ![]() ![]() ![]() ![]() max_ch:=0; for i:=1 to N do begin if (m[i] mod 2)=0 then if m[i]>max_ch then max_ch:=m[i]; end; Аналогично производится поиск максимального нечетного элемента, предварительно обнулив переменную ![]() ![]() ![]() ![]() ![]() ![]() max_nech:=0; for i:=1 to N do begin if (m[i] mod 2)<>0 then if m[i] > max_nech then max_nech:=m[i]; end; Осталось только найти разность между максимальный четным и максимальным нечетным числом и вывести его на экран: raz:=max_ch-max_nech; writeln ('raznost=',raz); end. Рекомендации к решению заданий С2Прежде чем писать алгоритм на языке программирования, для удобства, можно сформулировать его на естественном языке, а потом перевести на язык программирования. Если в результате текст программы будет представлен на естественном языке, то он должен быть максимально приближено к записи команд на языке программирования: должно быть соблюдена последовательность выполняются инструкций, грамотно записаны условия цикла, операция присваивания, алгоритм сортировки и т.д. Что касается сортировки массива, то можно использовать метод пузырька, так как он наиболее прост в использовании и изучается в школьном курсе информатики. Алгоритмы поиска максимально и минимального элемента в массиве также изучаются в школьном курсе информатики. Необходимо обращать внимание на типы данных. Например, если в задании требуется найти среднее арифметического элементов массива, удовлетворяющих какому-либо условию, то переменная, которая будет содержать в себе результат работы программы должна быть вещественного типа. При написании фрагмента программы нужно проверить заданы ли начальные значения у переменных. Если в задание требуется посчитать количество элементов, то есть в задании используется счетчик, его необходимо обнулить перед началом использования. При необходимости правильно использовать логические операции ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() При тестировании программы нужно убедиться в том, что программа всегда дает какой-либо ответ и в результате работы выводит на экран значение нужной переменной. Исключить случаи безответной реакции программы и проверить программу на частные случаи (например, с нулевыми значениями элементов массива или с отрицательными значениями). В данном задании разрешается допускаются синтаксические ошибки, но они не должны искажать смысла программы. Здесь проверяется знание алгоритмов и умение их правильно составлять [14]. |