Анализ результатов егэ за 2013 год
Скачать 372.53 Kb.
|
Задание С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; Так описывается массив типа состоящий из 10 элементов. Единственное действие, которое можно выполнять над массивами целиком, причем только при условии, что массивы однотипны, – это присваивание. Если в программе описаны две переменные одного типа, например, 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 с помощью операции и если такой найден увеличиваем счетчик на 1: 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]); … После того, как был введен массив начинаем поиск максимального четного элемента, предварительно обнулив переменную . В цикле проверяем каждый элемент на четность с помощью операции если остаток от деления на 2 равен 0, то число четное. После чего сверяем это число с максимальным четным и если оно оказывается больше максимального четного, то записывается в переменную Когда цикл закончит работу в переменной будет храниться наибольшее из четных чисел. 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; Аналогично производится поиск максимального нечетного элемента, предварительно обнулив переменную . В цикле проверяем каждый элемент на нечетность с помощью операции если остаток от деления на 2 неравен 0, то число нечетное. После чего сверяем это число с максимальным нечетным и если оно оказывается больше максимального нечетного, то записывается в переменную Когда цикл закончит работу в переменной будет храниться наибольшее из четных чисел. 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]. |