25 задание ЕГЭ
Алгоритмы обработки массивов
Предисловие
Эта статья будет на порядок больше, чем предыдущие, потому что 25 задание сравнительно нетрудное, хочется разобраться со всеми демо-версиями с 2009 по 2019 годы.
Демонстрационный вариант ЕГЭ 2019 г. ИНФОРМАТИКА и ИКТ, 11 класс.
1. Дан целочисленный массив из 30 элементов. Элементы массива могут принимать натуральные значения от 1 до 10 000 включительно. Опишите на одном из языков программирования алгоритм, который находит минимум среди элементов массива, не делящихся нацело на 6, а затем заменяет каждый элемент, не делящийся нацело на 6, на число, равное найденному минимуму. Гарантируется, что хотя бы один такой элемент в массиве есть. В качестве результата необходимо вывести изменённый массив, каждый элемент выводится с новой строчки. Например, для исходного массива из шести элементов:
14
6
11
18
9
24
программа должна вывести следующий массив
9
6
9
18
9
24
Исходные данные объявлены так, как показано ниже на примерах для некоторых языков программирования. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать некоторые из описанных переменных.
Бейсик |
Python |
CONST N AS INTEGER = 30 DIM A (1 TO N) AS LONG DIM I AS LONG, J AS LONG, K AS LONG FOR I = 1 TO N INPUT A(I) NEXT I ... END |
# допускается также # использовать две # целочисленные переменные j и k a = [] n = 30 for i in range(0, n): a.append(int(input())) ... |
Алгоритмический язык |
Паскаль |
алг нач цел N = 30 целтаб a[1:N] цел i, j, k нц для i от 1 до N ввод a[i] кц ... кон |
const N = 30; var a: array [1..N] of longint; i, j, k: longint; begin for i := 1 to N do readln(a[i]); ... end. |
C++ |
|
#include <iostream> using namespace std; const int N = 30; int main() { long a[N]; long i, j, k; for (i = 0; i < N; i++) cin >> a[i]; ... return 0; } |
В качестве ответа Вам необходимо привести фрагмент программы, который должен находиться на месте многоточия. Вы можете записать решение также на другом языке программирования (укажите название и используемую версию языка программирования, например Free Pascal 2.6). В этом случае Вы должны использовать те же самые исходные данные и переменные, какие были предложены в условии (например, в образце, записанном на Алгоритмическом языке).
Инициализируем переменную k, которая будет использоваться для поиска наименьшего значения, не кратного 6. Т.к. наибольшее значение элемента массива = 10000, то присвоим k значение = 10001. Далее будем с помощью цикла искать k. В следующем цикле присваиваем всем элементам массива, не кратным 6 значение переменной k. Выводим каждый элемент массива с новой строчки.
Код на месте двоеточия:
k := 10001;
for i := 1 to N do
if (a[i] mod 6 <> 0) and (a[i] < k) then
k := a[i];
for i := 1 to N do
if a[i] mod 6 <> 0 then
a[i] := k;
for i := 1 to N do
writeln(a[i]);
Демонстрационный вариант ЕГЭ 2018 г. ИНФОРМАТИКА и ИКТ, 11 класс.
2. Дан целочисленный массив из 30 элементов. Элементы массива могут принимать целые значения от 0 до 10 000 включительно. Опишите на одном из языков программирования алгоритм, который находит количество элементов массива, больших 100 и при этом кратных 5, а затем заменяет каждый такой элемент на число, равное найденному количеству. Гарантируется, что хотя бы один такой элемент в массиве есть. В качестве результата необходимо вывести измененный массив, каждый элемент массива выводится с новой строчки.
Например, для массива из шести элементов: 4 115 7 195 25 106
программа должна вывести числа 4 2 7 2 25 106
Исходные данные объявлены так, как показано ниже на примерах для некоторых языков программирования. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать некоторые из описанных переменных.
Бейсик |
Python |
CONST N AS INTEGER = 30 DIM A (1 TO N) AS LONG DIM I AS LONG, J AS LONG, K AS LONG FOR I = 1 TO N INPUT A(I) NEXT I ... END |
# допускается также # использовать две # целочисленные переменные j и k a = [] n = 30 for i in range(0, n): a.append(int(input())) ... |
Алгоритмический язык |
Паскаль |
алг нач цел N = 30 цел таб a[1:N] цел i, j, k нц для i от 1 до N ввод a[i] кц ... кон |
const N = 30; var a: array [1..N] of longint; i, j, k: longint; begin for i := 1 to N do readln(a[i]); ... end. |
C++ |
|
#include <iostream> using namespace std; const int N = 30; int main() { long a[N]; long i, j, k; for (i = 0; i<N; i++) cin >> a[i]; ... return 0; } |
В качестве ответа Вам необходимо привести фрагмент программы, который должен находиться на месте многоточия. Вы можете записать решение также на другом языке программирования (укажите название и используемую версию языка программирования, например Free Pascal 2.6). В этом случае Вы должны использовать те же самые исходные данные и переменные, какие были предложены в условии (например, в образце, записанном на Алгоритмическом языке).
Переменная k будет счетчиком для элементов больше 100 и кратных 5. Пройдемся по массиву, присвоим значение k. В следующем цикле снова пройдем массив, присваивая значение k элементам массива больше 100 и кратных 5. Выведем массив.
Код на месте двоеточия:
for i := 1 to N do
if (a[i] > 100) and (a[i] mod 5 = 0) then
k := k + 1;
for i := 1 to N do
if (a[i] > 100) and (a[i] mod 5 = 0) then
a[i] := k;
for i := 1 to N do
writeln(a[i]);
Демонстрационный вариант ЕГЭ 2017 г. ИНФОРМАТИКА и ИКТ, 11 класс.
3. Дан целочисленный массив из 40 элементов. Элементы массива могут принимать целые значения от 0 до 10 000 включительно. Опишите на естественном языке или на одном из языков программирования алгоритм, позволяющий найти и вывести количество пар элементов массива, в которых десятичная запись хотя бы одного числа оканчивается на 2. В данной задаче под парой подразумевается два подряд идущих элемента массива. Например, для массива из пяти элементов: 16 3 142 55 22 – ответ: 3. Исходные данные объявлены так, как показано ниже на примерах для
некоторых языков программирования и естественного языка. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать некоторые из описанных переменных.
Бейсик |
Python |
CONST N = 40 DIM A (1 TO N) AS INTEGER DIM I, J, K, AS INTEGER FOR I = 1 TO N INPUT A(I) NEXT I ... END |
//допускается также использовать //две целочисленные переменные j и k a = [] n = 40 for i in range(0, n): a.append(int(input())) ... |
Алгоритмический язык |
Паскаль |
алг нач цел N = 40 целтаб a[1:N] цел i, j, k нц для i от 1 до N ввод a[i] кц ... кон |
const N = 40; var a: array [1..N] of integer; i, j, k: integer; begin for i := 1 to N do readln(a[i]); ... end. |
C++ |
|
#include <stdio.h> #define N 40 int main() { int a[N]; int i, j, k; for (i = 0; i < N; i++) scanf("%d", &a[i]); ... return 0; } |
В качестве ответа Вам необходимо привести фрагмент программы (или описание алгоритма на естественном языке), который должен находиться на месте многоточия. Вы можете записать решение также на другом языке программирования (укажите название и используемую версию языка программирования, например, Free Pascal 2.6) или в виде блок-схемы. В этом случае Вы должны использовать те же самые исходные данные и переменные, какие были предложены в условии (например, в образце, записанном на естественном языке).
Самая большая ошибка, которую здесь можно допустить – это «ошибка на единицу». Надо учесть это, чтобы индекс не вышел за границы массива. Будем проверять, оканчивается ли i-ый элемент массива на 2, а также i+1-ый. k – счетчик.
Код:
for i := 1 to N-1 do
if (a[i] mod 10 = 2) or (a[i+1] mod 10 = 2) then
k := k + 1;
writeln(k);
Демонстрационный вариант ЕГЭ 2016 г. ИНФОРМАТИКА и ИКТ, 11 класс.
4. Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от –10 000 до 10000 включительно. Опишите на естественном языке или на одном из языков программирования алгоритм, позволяющий найти и вывести количество пар элементов массива, в которых хотя бы одно число делится на 3. В данной задаче под парой подразумевается два подряд идущих элемента массива.
Например, для массива из пяти элементов: 6; 2; 9; –3; 6 – ответ: 4.
Исходные данные объявлены так, как показано ниже на примерах для некоторых языков программирования и естественного языка. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать некоторые из описанных переменных.
Бейсик |
Python |
CONST N AS INTEGER = 20 DIM A (1 TO N) AS INTEGER DIM I AS INTEGER, J AS INTEGER, K AS INTEGER FOR I = 1 TO N INPUT A(I) NEXT I ... END |
# допускается также # использовать две # целочисленные переменные j и k a = [] n = 20 for i in range(0, n): a.append(int(input())) ... |
Алгоритмический язык |
Паскаль |
алг нач цел N = 20 целтаб a[1:N] цел i, j, k нц для i от 1 до N ввод a[i] кц ... кон |
const N = 20; var a: array [1..N] of integer; i, j, k: integer; begin for i := 1 to N do readln(a[i]); ... end. |
C++ |
|
#include <stdio.h> #define N 20 int main() { int a[N]; int i, j, k; for (i = 0; i<N; i++) scanf("%d", &a[i]); ... return 0; } |
В качестве ответа Вам необходимо привести фрагмент программы (или описание алгоритма на естественном языке), который должен находиться на месте многоточия. Вы можете записать решение также на другом языке программирования (укажите название и используемую версию языка программирования, например Free Pascal 2.6) или в виде блок-схемы. В этом случае Вы должны использовать те же самые исходные данные и переменные, какие были предложены в условии (например, в образце, записанном на естественном языке).
Как и в предыдущем задании, учитываем «ошибку на единицу». Проверяем, делится ли i-ый элемент на 3 без остатка, а также i+1-ый.
Код на месте двоеточия:
for i := 1 to N-1 do
if (a[i] mod 3 = 0) or (a[i+1] mod 3 = 0) then
k := k + 1;
writeln(k);
Демонстрационный вариант ЕГЭ 2015 г. ИНФОРМАТИКА и ИКТ, 11 класс.
5. Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от –10 000 до 10 000 включительно. Опишите на естественном языке или на одном из языков программирования алгоритм, позволяющий найти и вывести количество пар элементов массива, сумма которых нечётна и положительна. Под парой подразумевается два подряд идущих элемента массива. Исходные данные объявлены так, как показано ниже на примерах для некоторых языков программирования и естественного языка. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать некоторые из описанных переменных.
Бейсик |
Python |
N = 20 DIM A(N) AS INTEGER DIM I, J, K AS INTEGER FOR I = 1 TO N INPUT A(I) NEXT I ... END |
N = 20 i = None j = None k = None a = [int(input()) for i in range(N)] ... |
Алгоритмический язык |
Паскаль |
алг нач цел N = 20 цел таб a[1:N] цел i, j, k нц для i от 1 до N ввод a[i] кц ... кон |
const N = 20; var a: array [1..N] of integer; i, j, k: integer; begin for i := 1 to N do readln(a[i]); ... end. |
C++ |
|
#include <stdio.h> int main(void) { const int N = 20; int a[N]; int i, j, k; for (i = 0; i < N; i++) scanf("%d", &a[i]); ... } |
Надо соблюсти порядок выполнения вычислений в проверке условия – сначала находим сумму, потом – проверяем, делится ли она на 2 с остатком, и смотрим, положительна ли она.
Код на месте двоеточия:
for i := 1 to N-1 do
if ((a[i] + a[i+1]) mod 2 <> 0) and ((a[i] + a[i+1]) > 0) then
k := k + 1;
writeln(k);
Демонстрационный вариант ЕГЭ 2014 г. ИНФОРМАТИКА и ИКТ, 11 класс.
6. Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от 0 до 10000 включительно. Опишите на естественном языке или на одном из языков программирования алгоритм, позволяющий найти и вывести максимальное значение среди трёхзначных элементов массива, не делящихся на 9. Если в исходном массиве нет элемента, значение которого является трёхзначным числом и при этом не кратно 9, то выведите сообщение «Не найдено». Исходные данные объявлены так, как показано ниже на примерах для некоторых языков программирования и естественного языка. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать некоторые из описанных переменных.
Бейсик |
C++ |
N = 20 DIM A(N) AS INTEGER DIM I, J, MAX AS INTEGER FOR I = 1 TO N INPUT A(I) NEXT I ... END |
#include <stdio.h> #define N 20 void main() { int a[N]; int i, j, max; for (i = 0; i<N; i++) scanf("% d", &a[i]); ... } |
Алгоритмический язык |
Паскаль |
алг нач цел N = 20 целтаб a[1:N] цел i, j, max нц для i от 1 до N ввод a[i] кц ... кон |
const N = 20; var a: array [1..N] of integer; i, j, max: integer; begin for i := 1 to N do readln(a[i]); ... end. |
В качестве ответа Вам необходимо привести фрагмент программы (или описание алгоритма на естественном языке), который должен находиться на месте многоточия. Вы можете записать решение также на другом языке программирования (укажите название и используемую версию языка программирования, например, Free Pascal 2.4) или в виде блок-схемы. В этом случае Вы должны использовать те же самые исходные данные и переменные, какие были предложены в условии (например, в образце, записанном на естественном языке).
Присваиваем k значение меньше минимально возможного (0) – -1. Далее прописываем условие: проверяем, трехзначный ли элемент массива, не кратный ли он 9 и является ли максимумом. По завершении цикла убедимся, что такой элемент был найден. Если нет – печатаем: “Не найдено”, иначе – значение этого элемента.
Код на месте многоточия:
max := -1;
for i := 1 to N do
if (a[i] div 100 > 0) and (a[i] mod 9 <> 0) and (a[i] > max) then
max:= a[i];
if max = -1 then
writeln('Не найдено')
else
writeln(max);
Демонстрационный вариант ЕГЭ 2013 г. ИНФОРМАТИКА и ИКТ, 11 класс.
7. Дан целочисленный массив из 30 элементов. Элементы массива могут принимать целые значения от 0 до 100. Опишите на русском языке или на одном из языков программирования алгоритм, позволяющий найти и вывести
произведение элементов массива, которые имеют нечётное значение и делятся на 3. Гарантируется, что в исходном массиве есть хотя бы один элемент, значение которого нечётно и кратно 3. Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать часть из них. Исходные данные всегда подобраны так, что результат произведения не выходит за пределы объявленных типов данных.
Бейсик |
C++ |
N=30 DIM A(N) AS LONG DIM I, J, P AS LONG FOR I = 1 TO N INPUT A(I) NEXT I … END |
#include <stdio.h> #define N 30 void main(void){ long a[N]; long i, j, p; for (i=0; i<N; i++) scanf("%ld", &a[i]); … } |
Алгоритмический язык |
Паскаль |
алг нач цел N=30 целтаб a[1:N] цел i, j, p нц для i от 1 до N ввод a[i] кц ... кон |
const N=30; var a: array [1..N] of longint; i, j, p: longint; begin for i := 1 to N do readln(a[i]); … end. |
В качестве ответа Вам необходимо привести фрагмент программы (или описание алгоритма на естественном языке), который должен находиться на месте многоточия. Вы можете записать решение также на другом языке программирования (укажите название и используемую версию языка программирования, например Free Pascal 2.4) или в виде блок-схемы. В этом случае Вы должны использовать те же самые исходные данные и переменные, какие были предложены в условии (например, в образце, записанном на естественном языке).
Присваиваем значение элемента k = 1. Это будет счетчик произведения. Если элемент массива не кратен 2 и делится на 3 без остатка, то умножаем его на произведение k.
Код на месте многоточия следующий:
p := 1;
for i := 1 to N do
if (a[i] mod 2 <> 0) and (a[i] mod 3 = 0) then
p := p * a[i];
writeln(p);
Демонстрационный вариант ЕГЭ 2012 г. ИНФОРМАТИКА и ИКТ, 11 класс.
8. Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от 0 до 1000. Опишите на русском языке или на одном из языков программирования алгоритм, позволяющий найти и вывести минимальное значение среди элементов массива, которые имеют чётное значение и не делятся на три. Гарантируется, что в исходном массиве есть хотя бы один элемент, значение которого чётно и не кратно трем. Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но использовать все описанные переменные не обязательно.
Бейсик |
C++ |
N = 20 DIM A(N) AS INTEGER DIM I, J, MIN AS INTEGER FOR I = 1 TO N INPUT A(I) NEXT I … END |
#include <stdio.h> #define N 20 void main(void){ int a[N]; int i, j, min; for (i=0; i<N; i++) scanf("% d", &a[i]); … } |
Алгоритмический язык |
Паскаль |
алг нач цел N = 20 целтаб a[1:N] цел i, j, MIN нц для i от 1 до N ввод a[i] кц ... кон |
const N = 20; var a: array [1..N] of integer; i, j, min: integer; begin for i := 1 to N do readln(a[i]); … end. |
В качестве ответа вам необходимо привести фрагмент программы (или описание алгоритма на естественном языке), который должен находиться на месте многоточия. Вы можете записать решение также на другом языке программирования (укажите название и используемую версию языка программирования, например Borland Pascal 7.0) или в виде блок-схемы. В этом случае вы должны использовать те же самые исходные данные и переменные, какие были предложены в условии (например, в образце, записанном на естественном языке).
Для поиска минимума присвоим значение переменной k = 1001 (max + 1). Далее будем проверять, соответствует ли элемент массива требуемым условиям и меньше ли он минимума. Если да, то присваиваем k значение этого элемента. Выводим k.
Код приведен ниже:
min := 1001;
for i := 1 to N do
if (a[i] mod 3 <> 0) and (a[i] mod 2 = 0) and (a[i] < min) then
min := a[i];
writeln(min);
Демонстрационный вариант ЕГЭ 2011 г. ИНФОРМАТИКА и ИКТ, 11 класс.
9. Дан целочисленный массив из 30 элементов. Элементы массива могут принимать значения от 0 до 1000. Опишите на русском языке или на одном из языков программирования алгоритм, который позволяет подсчитать и вывести среднее арифметическое элементов массива, имеющих нечетное значение. Гарантируется, что в исходном массиве хотя бы один элемент имеет нечетное значение. Исходные данные объявлены так, как показано ниже. Запрещается
использовать переменные, не описанные ниже, но разрешается не использовать часть из них.
Бейсик |
C++ |
N=30 DIM A(N) AS INTEGER DIM I, X, Y AS INTEGER DIM S AS SINGLE FOR I = 1 TO N INPUT A(I) NEXT I … END |
#include <stdio.h> #define N 30 void main(void) {int a[N]; int i, x, y; float s; for (i=0; i<N; i++) scanf("%d", &a[i]); … } |
Естественный язык |
Паскаль |
Объявляем массив A из 30 элементов. Объявляем целочисленные переменные I, X, Y. Объявляем вещественную переменную S. В цикле от 1 до 30 вводим элементы массива A с 1-го по 30-й. … |
const N=30; var a: array [1..N] of integer; i, x, y: integer; s: real; begin for i:=1 to N do readln(a[i]); … end. |
В качестве ответа Вам необходимо привести фрагмент программы (или описание алгоритма на естественном языке), который должен находиться на месте многоточия. Вы можете записать решение также на другом языке программирования (укажите название и используемую версию языка программирования, например, Borland Pascal 7.0) или в виде блок-схемы. В этом случае вы должны использовать переменные, аналогичные переменным, используемым в алгоритме, записанном на естественном языке, с учетом синтаксиса и особенностей используемого
вами языка программирования.
Будем проверять, нечетный ли элемент массива. Если да, то увеличиваем количество таких чисел, и сумму таких элементов. В выводе поделим сумму на количество.
Код для
for i := 1 to N do
if (a[i] mod 2 <> 0) then
begin
x := x + a[i];
y := y + 1;
end;
writeln(x/y);
Демонстрационный вариант ЕГЭ 2010 г. ИНФОРМАТИКА и ИКТ, 11 класс.
Дан целочисленный массив из 30 элементов. Элементы массива могут принимать целые значения от 0 до 100 – баллы учащихся выпускного класса за итоговый тест по информатике. Для получения положительной оценки за тест требовалось набрать не менее 20 баллов. Опишите на русском языке или на одном из языков программирования алгоритм, который находит и выводит минимальный балл среди учащихся, получивших за тест положительную оценку. Известно, что в классе хотя бы один учащийся получил за тест положительную оценку.
Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать часть из них.
Бейсик |
C++ |
N=30 DIM A(N) AS INTEGER DIM I, J, MIN AS INTEGER FOR I = 1 TO N INPUT A(I) NEXT I … END |
#include <stdio.h> #define N 30 void main(void) {int a[N]; int i, j, min; for (i=0; i<N; i++) scanf("% d", &a[i]); … } |
Естественный язык |
Паскаль |
Объявляем массив A из 30 элементов. Объявляем целочисленные переменные I, J, MIN. В цикле от 1 до 30 вводим элементы массива A с 1-го по 30-й. … |
const N=30; var a: array [1..N] of integer; i, j, min: integer; begin for i:=1 to N do readln(a[i]); … end. |
В качестве ответа Вам необходимо привести фрагмент программы (или описание алгоритма на естественном языке), который должен находиться на месте многоточия. Вы можете записать решение также на другом языке программирования (укажите название и используемую версию языка программирования, например, Borland Pascal 7.0) или в виде блок-схемы. В этом случае вы должны использовать те же самые исходные данные и переменные, какие были предложены в условии (например, в образце, записанном на естественном языке).
Т.к. в задании гарантируется, что есть хотя бы одна положительная оценка, то присваиваем переменной min значение 100. Если положительная оценка меньше 100, то условие сработает, и выведется эта оценка. Если равна 100, то условие не сработает, и но ответ все равно будет напечатан.
Код:
min := 100;
for i := 1 to N do
if (a[i] > 19) and (a[i] < min) then
min := a[i];
writeln(min);
Демонстрационный вариант ЕГЭ 2009 г. ИНФОРМАТИКА и ИКТ, 11 класс.
Опишите на русском языке или одном из языков программирования алгоритм получения из заданного целочисленного массива размером 30 элементов другого массива, который будет содержать модули значений элементов первого массива (не используя специальной функции, вычисляющей модуль числа).
Здесь самое важное – не забыть про 0 (его включим в первое условие).
const
N = 30;
var
a: array [1..N] of integer;
b: array [1..N] of integer;
i: integer;
begin
for i := 1 to N do
readln(a[i]);
for i := 1 to N do
begin
if a[i] >= 0 then
b[i] := a[i];
if a[i] < 0 then
b[i] := -a[i];
end;
writeln(a, b);
end.
Вывод
В этом задании нам пригодилось знание не слишком большого количества операторов (простые циклы, присваивание, остаток от деления, целочисленное деление, логические операторы), оно не вызовет трудностей на экзамене. Главное – правильно прописать условие проверки для цикла.