СДЕЛАЙТЕ СВОИ УРОКИ ЕЩЁ ЭФФЕКТИВНЕЕ, А ЖИЗНЬ СВОБОДНЕЕ

Благодаря готовым учебным материалам для работы в классе и дистанционно

Скидки до 50 % на комплекты
только до

Готовые ключевые этапы урока всегда будут у вас под рукой

Организационный момент

Проверка знаний

Объяснение материала

Закрепление изученного

Итоги урока

Статья "МЕТОДИКА РЕШЕНИЯ ЗАДАЧ ЕГЭ ВЫСОКОГО УРОВНЯ 27 (С4)

Категория: Информатика

Нажмите, чтобы узнать подробности

В статье произведена попытка систематизировать информацию, необходимую для успешного решения самой сложной задачи ЕГЭ по программированию. Материал содержит анализ необходимых навыков, рассмотрены возможные формулировки задачи, производится их анализ, приводятся алгоритмы и программы решения. Материал выстроен от более простого к более сложному. Все тексты программ автосрсикие.

Просмотр содержимого документа
«Статья "МЕТОДИКА РЕШЕНИЯ ЗАДАЧ ЕГЭ ВЫСОКОГО УРОВНЯ 27 (С4)»

10

МЕТОДИКА РЕШЕНИЯ ЗАДАЧ ЕГЭ ВЫСОКОГО УРОВНЯ 27 (С4)

Автор: учитель информатики Шахова Е.А., г. Севастополь, ГБОУ «Гимназия №1 им. А.С. Пушкина».


Задача №27 в ЕГЭ является задачей высокого уровня, призванная , прежде всего, проверить умения учащихся на практике составлять и реализовывать эффективные и правильные алгоритмы, составлять программы на языках высокого уровня.

Прежде чем говорить о методиках решения, рассмотрим спецификацию этой задачи согласно официальному кодификатору.

Характеристика

Значение

Что проверяется

Умение создавать собственные программы (30–50 строк) для решения задач средней сложности

Требования к проверяемым элементам содержания

Основные этапы разработки программ. Разбиение задачи на подзадачи.

Проверяемые требования к уровню подготовки

Создавать программы на языке программирования по их описанию

Уровень сложности

Высокий

Максимальный балл

4

Примерное время выполнения

55 мин

Заметим, что эта задача имеет самый высокий балл, и на ее выполнение разработчики задания выделают практически четверть общего времени, отводимого на экзамен.

Проанализируем результаты решения этой задачи в 2015-2016 учебном году. Процент выполнения этой задачи представлен в следующей таблице:


Полученные баллы

1

2

3-4

0

Процент участников

7%

3,7%

5,7%

16,2%


Можно заметить очень невысокий процент успешного выполнения данного задания, что можно связать с непривычным типом задания, к которому многие учащиеся были не готовы. Это говорит о низком уровне алгоритмической культуры и отсутствии навыков программирования.

Итак, как же научиться решать эти задания?

Перечислим необходимые для этого знания и умения, базовые алгоритмические задачи и методы:

  • понятие сложности алгоритма;

  • объявление, ввод массива;

  • записи (структуры данных);

  • работа со строками и символьными переменными;

  • нахождение максимума и минимума в массиве, в последовательности;

  • нахождение суммы, произведения элементов массива, последовательности;

  • свойства кратности, делимости сумм и произведений чисел;

  • сдвиг элементов массива;

  • использование вложенных циклов для полного перебора.

В качестве особенностей решения задачи можно выделить следующие:

  • большое количество возможных вариаций задач и их формулировок;

  • от учащегося требуются хорошие практически навыки программирования;

  • требуется знать свойства делимости;

  • большое количество приемов и способов решения, которые трудно формализовать;

  • организация оптимального решения требует творческого подхода и тщательного анализа задачи.

Перед тем как говорить о решении задач, вспомним необходимые понятия.

Сложность алгоритмов

Сложность алгоритмаэто количественная характеристика ресурсов, необходимых алгоритму для работы (успешного решения задачи).

Основные ресурсы:

    • время (временнáя сложность) и

    • объем памяти (ёмкостная сложность).

Наиболее важной характеристикой является время.

Сложность задачи может быть разной для разных входных данных (экземпляров задачи).

Различают сложность в худшем случае и сложность в среднем.

В теории сложности чаще оперируют понятием сложности в худшем случае.

Обычно оценивают порядок роста сложности при n®¥: T = O(f(n)).

  • Фактическая сложность (время работы в секундах) зависит не только от алгоритма, но и от скорости работы компьютера.

  • Именно порядок роста сложности ограничивает размер решаемых задач.

Например, если сравнивать порядок зависимости времени решения задачи, можно привести данные, представленные в таблице:


Выделим основные типы и темы заданий:

  1. Обработка данных, вводимых в виде символьных строк или последовательности чисел.

  2. Проверка контрольного значения среди последовательности чисел.

  3. Поиск пар с определенными свойствами среди множества экспериментальных значений с заданными интервалом между индексами.

  4. Выбор подмножества элементов с определенным набором свойств.

  5. Выбор одного значения из пары с нахождением суммы или произведения с определёнными свойствами.


Рассмотрим каждый тип задачи отдельно.

Возможная формулировка задания (тип I)

На вход программе подаются сведения о номерах школ учащихся, участвовавших в олимпиаде. В первой строке сообщается количество учащихся N, каждая из следующих N строк имеет формат:



где – строка, состоящая не более чем из 20 символов, – строка, состоящая из 4-х символов (буква, точка, буква, точка), – не более чем двузначный номер. и , а также и разделены одним пробелом. Пример входной строки:


Иванов П.С. 57


Требуется написать как можно более эффективную программу (укажите используемую версию языка программирования, например, BorlandPascal 7.0), которая будет выводить на экран информацию, из какой школы было меньше всего участников (таких школ может быть несколько). При этом необходимо вывести информацию только по школам, пославшим хотя бы одного участника. Следует учитывать, что N=1000.


Данные задачи включались в экзамен несколько лет назад, сейчас не встречаются, но для полной картины следует рассмотреть и такие задачи тоже.

Необходимые знания и умения:

  1. Решение задачи разбиения строки на подстроки по пробелам.

Функции и процедуры (Pascal) : pos, copy, delete, length, insert.

  1. Преобразование строки в число, в цифры.

Функции и процедуры (Pascal) : val, StrToInt (Delphi).

  1. Работа с символами. Функции (Pascal): ord, chr.

  2. Работа с записями (структурами).

Type Rec=record

{поля записи}

F:string[20]; {фамилия}

IO: string[4]; {инициалы}

num: integer;{номер школы}

end;

Подробно останавливаться не будем из-за неактуальности.


Возможная формулировка задания (тип II)

По каналу связи передаются положительные целые числа, не превышающие 1000, – результаты измерений, полученных в ходе эксперимента (количество измерений известно заранее). После окончания эксперимента передаётся контрольное значение – наибольшее число R, удовлетворяющее следующим условиям:

1) R — сумма двух различных переданных элементов последовательности («различные» означает, что нельзя просто удваивать переданные числа, суммы различных, но равных по величине элементов допускаются);

2) R — нечётное число.

Если чисел, соответствующих приведённым условиям, нет, считается, что R = –1. В результате помех при передаче как сами числа, так и контрольное значение могут быть искажены.

Напишите эффективную, в том числе по используемой памяти, программу (укажите используемую версию языка программирования, например, FreePascal 2.6.4), которая будет проверять правильность контрольного значения.

Перед текстом программы кратко опишите используемый Вами алгоритм решения.

На вход программе в первой строке подаётся количество чисел N. В каждой из последующих N строк записано одно натуральное число, не превышающее 1000. В последней строке записано контрольное значение.

Пример входных данных:

 

6

100

8

33

45

19

90

145

Пример выходных данных:

145


Рассмотрим неоптимальное решение полным перебором, которое оценивается в 2 балла.

Организация полного перебора

При неоптимальном решении все данные сначала сохраняются в массиве, а затем в двойном цикле рассматриваются все возможные пары чисел.

Текст программы (авторский).

Var a:array [1..10000] of integer;

n, i, j: integer;

Rmin, R : integer;

Begin

readln(n);

for i:=1 to n do

readln(a[i]);

Rmin:=2001;

for i:=1 to n-1 do

for j:=i+1 to n do

begin

R:=a[i]+a[j];

{проверка условия контрольного значения}

if (R then Rmin:=R;

end;

if Rmin=2001 then Rmin:=-1;

writeln(Rmin);

End.


В данной программе подчеркнуты те части программы, которые зависят только от значений в задаче, и не зависят от ее типа. Грубо говоря, эту программу можно использовать как шаблон для решения подобных ей, изменяя только указанные части.

Например, число 2001 взято как максимально возможная сумма двух элементов плюс 1, т.е. это невозможное значение для суммы двух чисел, которое будет заведомо больше чем реальная сумма. Поэтому, если после обработки данных число осталось прежним, это говорит о том, что искомой пары так и не было найдено. Условие подчеркнуто, потому как в задаче можно искать минимум, а можно максимум, в данной ситуации еще требовалось, чтобы это число было кратно трем, в другой задаче может быть другое условие, поэтому именно здесь надо будет поменять данные.

Как видно, для данного типа задач можно подготовить шаблонное неоптимальное решение на 2 балла.

Рассмотрим поиск оптимальным способом, т.е. без использования массива для хранения всех данных.

Оптимальное решение.

Если не хранить все числа, то тогда во время ввода данных какие именно хранить?

ИДЕЯ: Хранить в памяти не все введенные ранее числа, а только те, которые «лучше» остальных.

Чтобы сумма была меньше, нужно брать меньшие числа, достаточно хранить только минимальные, удовлетворяющие условию.

Сколько таких чисел хранить и какие должны быть условия?

По условию сумма должна быть наименьшей и кратной трем. Хранить только наименьшее нет смысла, потому как с другим наименьшим оно может не дать нужного остатка при делении на 3.

Вывод: следует хранить все минимальные числа, имеющие разные остатки при делении на 3.


Попытаемся словесно сформулировать алгоритм решения. Назовем парным остатком такой остаток, который в сумме с текущим будет делиться на 3.

Алгоритм оптимального решения
  1. Считываем количество чисел n.

  2. Инициализируем переменные.

  3. Цикл из n итераций

    1. Чтение очередного числа a.

    2. Вычисление его остатка от деления на 3.

    3. Выбираем число, остаток от деления на 3 от которого в сумме с остатком деления a на 3 кратен 3 (парный).

    4. Если их сумма меньше контрольного значения, запоминаем ее как контрольное значение.

    5. Если число a меньше минимального, имеющего тот же остаток от деления на 3, запоминаем его.

  4. Если контрольное число не изменилось, запоминаем в него 1.

  5. Вывод контрольного значения.


Программа для оптимального решения

Var R, Rmin: integer;

n, a, I,m1,m2:integer;

b : array[0..2] of integer; {массив, хранящий минимальные значения с разными остатками при делении на 3.}

Begin

Rmin:=2001;

for i:=0 to 2 do b[i]:=1001; // заполняем массив «невозможными» числами

readln(n);

for i:=1 to n do

begin

readln(a);

m1:=(a mod 3); //смотрим остаток от деления на 3

m2:=( 3-m1)mod 3;//смотрим парный остаток от деления на 3

if b[m2]1001 then

begin R:=a+b[m3]; {читаем сумму текущего элемента с минимальным, имеющим парный остаток}

if R

Rmin:=R;

end;

{проверяем, не является ли текущий элемент лучше предыдущего, имеющего такой же остаток }

if a

b[m1]:=a;

end;

if Rmin=2001 then Rmin:=-1; //если сумма не нашлась такая

writeln(Rmin);

End.


Как мы видим, что алгоритм сложнее, но, тем не менее, тоже может быть формализован.


Возможная формулировка задания (тип III)

Для заданной последовательности неотрицательных целых чисел необходимо найти минимальную сумму двух её элементов, номера которых различаются не менее чем на 4. Значение каждого элемента последовательности не превышает 1000. Количество элементов последовательности не превышает 10000.

Задача А (2 балла). Напишите на любом языке программирования программу для решения поставленной задачи, в которой входные данные будут запоминаться в массиве, после чего будут проверены все возможные пары элементов.

Задача Б (4 балла). Напишите программу для решения поставленной задачи, которая будет эффективна как по времени, так и по памяти (или хотя бы по одной из этих характеристик).

Программа считается эффективной по времени, если время работы программы пропорционально количеству элементов последовательности N, т.е. при увеличении N в k раз время работы программы должно увеличиваться не более чем в k раз. Программа считается эффективной по памяти, если размер памяти, использованной в программе для хранения данных, не зависит от числа N и не превышает 1 килобайта.

Входные данные представлены следующим образом. В первой строке задаётся число N – общее количество элементов последовательности. Гарантируется, что N 4. В каждой из следующих N строк задаётся одно неотрицательное целое число – очередной элемент последовательности. Программа должна вывести одно число – описанную в условии сумму.

Пример входных данных:

7

10

45

55

245

35

25

10

Пример выходных данных :

20



Решение задачи А (не оптимальное)

Полный перебор похож на решение предыдущей задачи, только нужно брать не соседние пары, а через 4 элемента.

Var a:array [1..10000] of integer;

n, i, j: integer;

Rmin, R : integer;

Begin

readln(n);

for i:=1 to n do

readln(a[i]);

Rmin:=2001;

for i:=1 to n-4 do

for j:=i+4 to n do

begin

R:=a[i]+a[j];

if (R) then {проверка условия контрольного значения}

Rmin:=R;

end;

writeln(Rmin);

End.


Как и прошлый раз, здесь подчеркнуты те части, которые могут модифицироваться в зависимости от условия задачи.

Оптимальное решение

Намного интереснее найти оптимальное решение. Как всегда нужно сформулировать идею.

Рассмотрим следующую последовательность:

Зеленым изображено очередное введенное число, голубыми те числа, с которыми оно может составлять пару, красными – с которыми не может, потому как их индексы отличаются меньше, чем на 4.

Если нельзя хранить все введенные ранее числа, то сколько чисел хранить в памяти и какие?

Во-первых, необходимо хранить числа - «кандидаты» в лучшие для составления с новым полученным числом контрольного значения. Эти числа были получены как минимум за 4 (согласно условию задачи) числа до текущего. В текущем примере это только число 4, которое минимально из всех предыдущих чисел.

Во-вторых, необходимо хранить предпоследние 3 числа, которые пока не могут быть использованы для формирования контрольного значения, но могут пригодиться для последующих чисел. В данном случае мы видим, что в красной зоне есть числа 3 и 1, которые меньше 4, и для будущих чисел могут составить лучше пару, но пока еще использоваться не могут.

Внимание: если условие для контрольного значения сложное, «кандидатов» может быть несколько, как в предыдущей задаче.

Сформулируем алгоритм решения.

Алгоритм решения задачи Б
  1. Считываем количество чисел n.

  2. Инициализация переменных, считываем первое число, сохраняем как лучшее.

  3. Считываем 3 числа, запоминаем в массив.

  4. Цикл из n-4 итераций

    1. Чтение очередного числа a.

    2. Складываем с лучшим. Если их сумма меньше контрольного значения, запоминаем ее как контрольное значение.

    3. Сравниваем первый элемент массива и лучшее, запоминаем из них лучшее.

    4. Сдвигаем влево на 1 элементы массива.

    5. Запоминаем a в последний элемент массива.

  5. Вывод контрольного значения.


Программа для решения задачи Б

Const delta=4; {минимальный интервал}

Var R :integer; {минимальная сумма}

n, a, m:integer; {количество чисел, очередное значение, лучшее}

b :array[1..delta-1] of integer; {массив промежуточных значений}

Begin

R:=2001;

readln(n);

readln(m); {читаем первое, считаем его «лучшим»}

{ Считываем 3 числа, запоминаем в массив }

for i:=1 to delta-1 do readln(b[i]);

for i:= delta+1 to n do

begin { Чтение очередного числа a}

readln(a);

{Складываем с лучшим. Если их сумма меньше контрольного значения, запоминаем ее как контрольное значение.}

If (m+a)

{Сравниваем первый элемент массива и лучшее, запоминаем из них лучшее}

if b[1]

{Сдвигаем влево на 1 элементы массива}

for j:=1 to delta-2 do b[j]:=b[j+1];

{Запоминаем a в последний элемент массива}

b[delta-1]:=a;

end;

writeln(R);

End.


Модификация задачи (тип III)

Для заданной последовательности положительных целых чисел необходимо найти минимальное, кратное пяти произведение двух её элементов, номера которых различаются не менее чем на 6. Если таких чисел нет, вывести 0.

Значение каждого элемента последовательности не превышает 1000. Количество элементов последовательности не превышает 10000.


Можно заметить, что задача очень похожа на предыдущую, но появляется дополнительное условие, а именно необходимость кратности пяти произведения. Получается некий симбиоз задачи типа II и типа III. Объединим идеи.

Решение задачи А (не оптимальное)

Var a:array [1..10000] of integer;

n, i, j: integer;

Rmin, R :longint;

Begin

readln(n);

for i:=1 to n do

readln(a[i]);

Rmin:=1000001;

for i:=1 to n-6 do

for j:=i+6 to n do

begin

R:=a[i]+a[j];

if (Rthen

Rmin:=R;

end;

if Rmin=1000001 then

Rmin:=0;

writeln(Rmin);

End.


Можно заметить, что эта программа является модификацией неоптимального решения предыдущей задачи, изменяются только условия, некоторые числа, инициализирующее значение (оно устанавливается в соответствии с пониманием о максимальном возможном значении произведения двух чисел, а не суммы), тип данных. В остальном алгоритм полного перебора остается прежним, а вот оптимальное решение существенно отличается.

Во-первых нам надо хранить не только наименьшее значение из предыдущей последовательности, но и число, которое наименьшее из кратных 5, потому как оно точно даст произведение, кратное 5, а вот другое наименьшее может не подойти. Приведем полный текст с комментариями.

Программа для решения задачи Б

Const delta=6; {минимальный интервал}

Var R :longint ; {минимальное произведение}

n, a:integer; {количество чисел, очередное значение}

m, m5:integer; {наименьшее, наименьшее из кратных 5}

b :array[1..delta-1] of integer; {массив промежуточных значений}

Begin

R:=1000001;

readln(n);readln(m);

if (m mod 5)=0 then

m5:=m

else

m5:=0;

for i:=1 to delta-1 do

readln(b[i]);

for i:= delta+1 to n do

begin readln(a);

{проверяем произведение с наименьшим, кратным 5}

if ((m50) and ((m5*a)

R:=a*m5;

{проверяем произведение с наименьшим и чтобы оно было кратно 5}

if ((a mod 5)=0) and (a*m

R:=a*m;

{проверяем, не является ли 1-е число в массиве наименьшим и наименьшим, кратным 5}

if b[1]

m:=b[1];

if (b[1]mod 5=0) and (b[1]

m5:=b[1];

{сдвиг в массиве}

for j:=1 to delta-2 do b[i]:=b[i+1];

b[delta-1]:=a;

end;

if Rmin=1000001 then Rmin:=0;

writeln (Rmin);

End.


Возможная формулировка задания (тип IV)

На ускорителе для большого числа частиц производятся замеры скорости каждой из них. Скорость частицы — это целое неотрицательное число. Частиц, скорость которых измерена, может быть очень много, но не может быть меньше трёх. Скорости всех частиц различны. Скорость, по крайней мере, одной частицы нечётна.

При обработке результатов в каждой серии эксперимента отбирается множество скоростей. Это непустое подмножество скоростей частиц (в него могу войти как скорость одной частицы, так и скорости всех частиц серии), такое, что сумма всех значений скоростей у него нечётна и максимальна среди всех возможных непустых подмножеств с нечётной суммой. Если таких подмножеств несколько, то из них выбирается то подмножество, которое содержит наименьшее количество элементов.


При данной формулировке задачи проще сразу рассмотреть оптимальное решение.


Поскольку задачу нужно решать в один проход (если делать оптимальное решение), то сумму надо считать одновременно с чтением данных.

Проблема 1: сумма должна быть максимальной по значению, но минимальной по количеству.

Вывод: нужно брать все положительные элементы и не брать нулевые.

Проблема 2: не все числа должны входить в эту сумму, чтобы она была нечетной.

Вывод: надо запоминать «кандидатов» на удаление из последовательности, если сумма вдруг получится четной. Это должно быть нечетное число с одной стороны и минимальное из нечетных, чтобы сумма уменьшилась на минимальное возможное значение.

Текст оптимального решения представлен ниже.

Программа оптимального решения

Var s: longint ; {сумма}

n, a:integer; {количество чисел, очередное значение}

m :integer; {наименьшее нечетное}

Begin

S:=0;

readln(n);

m:=0;

for i:= 1 to n do

begin

readln(a);

S:=s+a;

if ( (a mod 2)=1) and ((m=0) or (a

m:=a;

end;

if (s mod 2)=0 then

s:=s-m;

writeln(R);

End.


И наконец, рассмотрим последний тип задач, который встречался в прошлом году на экзаменах.


Возможная формулировка задания (тип V)

На вход даны пары чисел. Нужно выбрать из каждой пары по одному числу так, чтобы сумма всех выбранных чисел не была кратна 6 и при этом была минимально возможной. Напишите программу, выводящую такую сумму на экран. Если же ее невозможно получить, выведите 0. Баллы начисляются за ту из подзадач, что решена на большее количество баллов. Задача А дает 2 балла, задача Б - 4 балла. В задаче А приведите неэффективный алгоритм. При решении указывайте, какую подзадачу делаете. За алгоритм, неэффективный по времени ИЛИ памяти, дается 3 балла, по времени И памяти - 2 балла.

Задача А. Количество пар известно заранее и равно 6. Числа не превышают 30 000.

Пример входных данных:

5 4

3 2

1 1

18 3

11 12

2 5

Пример выходных данных:

23

Задача Б. Количество пар N не известно заранее и может принимать значения 2

Пример входных данных:

6

5 4

3 2

1 1

18 3

11 12

2 5

Пример выходных данных:

23

Полный перебор представляет собой вложенные циклы для перебора всех возможных пар значений.

Решение задачи А

Var a:array[1..6,1..2]of integer;

i,j1,j2,j3,j4,j5,j6,s,smin: integer;

Begin

for i:=1 to 6 do

for j1:=1 to 2 do

read(a[I,j1]);

smin:=1000*6+1;

for j1:=1 to 2 do

for j2:=1 to 2 do

for j3:=1 to 2 do

for j4:=1 to 2 do

for j5:=1 to 2 do

for j6:=1 to 2 do

begin

s:=a[1,j1]+ a[2,j2] +a[3,j3]+ a[4,j4]+ a[5,j5] +a[6,j6];

if (s0) then smin:=s

end;

if smin= 1000*6+1 then smin:=1;

writeln(smin);

End.





Идея решения задачи Б

Поскольку задачу нужно решать в один проход (если делать оптимальное решение), то сумму надо считать одновременно с чтением данных.

Проблема 1: сумма должна быть минимальной по значению.

Вывод: нужно брать из каждой пары только минимальное число.

Проблема 2: Сумма может получиться кратной 6.

Вывод: надо запоминать «кандидатов» на замену одного числа из пары на другое, если сумма вдруг получится кратной 6. Число должно иметь, во первых, минимальную разницу с заменяемым, а во-вторых, должно иметь другой остаток при делении на 6, чтобы и сумма поменяла свой остаток от деления. Сумма при этом увеличится именно на разницу между числами, поэтому проще запоминать именно ее.

Ниже приведен полный текст решения задачи.

Решение задачи Б

Var n:integer; {количество чисел}

a, b : integer; {очередная пара чисел}

dmin, d : integer; {минимальная разница между числами в паре}

s:integer; i:integer;

Begin

readln(n);

s:=0; d:=1001;

for i:=1 to n do

begin

readln(a,b);

{добавляем минимальное число в сумму}

if a

s:=s+a

else

s:=s+b;

{вычисляем разницу между числами}

d:=abs(a-b);

{если разница минимальна и не кратна 6, запоминаем ее}

if (d0) then

dmin:=d;

end;

{если сумма получилась кратной 6, увеличиваем ее на dmin}

If (s mod 6) =0 then

If dmin=1001 then

s:=0

else

s:=s+dmin;

writeln(s);

end.


Список использованных источников

  1. В.Р. Лещинер, М.А. Ройтберг. МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ для учителей, подготовленные на основе анализа типичных ошибок Участников ЕГЭ 2016 года по ИНФОРМАТИКЕ и ИКТ. – http://www.fipi.ru/ege-i-gve-11/analiticheskie-i-metodicheskie-materialy.

  2. КИМ ЕГЭ «Информатика и ИКТ» http://www.ege.edu.ru/ru/classes-11/preparation/demovers/

  3. Материалы сайта Полякова К.Ю. по подготовке к ЕГЭ http://kpolyakov.spb.ru/school/ege.htm.

  4. Информатика и ИКТ. Подготовка к ЕГЭ 2016. 20 тренировочных вариантов по демоверсии на 2016 год: учебно-методическое пособие./Под ред. Л. Н. Евич, С.Ю. Кулабухова. – Ростов на Дону: Легион, 2015.

  5. Каталог заданий сайта «Решу ЕГЭ». –

https://inf-ege.sdamgia.ru/test?a=catlistwstat


Скачать

Рекомендуем курсы ПК и ППК для учителей

Вебинар для учителей

Свидетельство об участии БЕСПЛАТНО!