+Оглавление
Разбираем задачу №4 в ЕГЭ по информатике.
Обратите внимание, здесь будет не только пример решения, но и разбор задания по существу.
Для примера я беру демоверсию 2020 года (актуальная на момент написания статьи) с сайта fipi.ru.
Прежде чем приступать к решению этого примера, посмотрим в спецификацию к демоверсии.
Задание, как нам сообщается, требует знаний о файловых системах или о базах данных. Справедливости ради отмечу, что файловая система сама по себе является одной из разновидностей баз данных. Последние несколько лет, однако, встречаются только задания на базы данных, поэтому я буду разбирать именно эту теорию, но не стоит забывать и о файловой системе.
В кодификаторе придётся искать по нескольку строк из таблиц содержания и уровня подготовки:
Всё и тут крутится вокруг СУБД (систем управления базами данных). От этого будем отталкиваться.
Когда-то давно я сам изучал базы данных, начав с СУБД под названием MySQL от ORACLE. Изучать пришлось самостоятельно, поэтому я копнул слишком глубоко (в школах этому не учат) и наткнулся на отличную статью о реляционной алгебре. Конечно, написана она довольно серьёзным языком, поэтому без хорошей подготовки прочитать её будет тяжело.
Реляционная алгебра
Учебников по этому чуду дискретной математики полно, я в свободной форме попытаюсь изложить только нужные для работы с ЕГЭ тезисы.
Мы будем рассматривать таблицы, которые состоят из столбцов. Именно из столбцов, ибо столбцы являются неизменными для всех данных в таблице. Данные организованы в строки: каждая строка соответствует какому-то факту или объекту. Например, в таблице "Таблица 1" в каждой строке содержатся данные об одном человеке. А колонки (опять они) указывают, какая именно информация должна быть.Про каждого мы знаем его код (ID), фамилию и инициалы, дату рождения и пол (порядок не важен, важно, что эти данные есть и нет других). В таблицах может осуществляться сортировка по любой колонке (или нескольким), может проводиться выборка.
Выборка строится так: машина проверяет КАЖДУЮ строку на определённое условие, и, если условие истинно для строки, то эта строка останется в выборке, а нет - значит, нет.
Например, сделаем выборку по условию "Пол = 'М'" из "Таблицы 1":
Условие может быть, например, сложным, типа "Пол='М' ИЛИ Год_рождения > 1990", здесь при определении истинности этого условия для каждой строки будет использоваться алгебра логики, с которой мы уже сталкивались в задании №2.
Связи между таблицами
Каждая таблица может иметь связь с другой или даже с самой собой. При наличии связей из двух таблиц можно сделать одну, если выбрать строки, в которых значения связных столбцов совпадают. (Например, столбец "ID" из таблицы 1 и столбец "ID_родителя" из таблицы 2)
В нашем случае связь довольно сложная: один столбец из таблицы 1 связан сразу с двумя столбцами в таблице 2, и выглядеть это будет примерно вот так:
Такая конструкция выглядит довольно громоздкой, не так ли? Особенно, если посмотреть, что данные в таблице теперь будут повторяться.
Зато теперь, если построить таблицу до конца, можно будет что-то предпринимать:
Решение
Нам надо определить количество строк "полной" таблицы, которые подходят под очень сложное условие: у скольких детей на момент их рождения отцам было больше 25 полных лет.
Возраст отца (это, наверное, самое сложное) на момент рождения определяется как (год рождения ребёнка - год рождения родителя)
Условие будет выглядеть примерно так:
(год_рождения_ребёнка - год_рождения_родителя >25) И (Пол_родителя = 'М')
Для удобства я создал новый столбец в этой "полной" таблице. И теперь отлично видно, что правильный ответ "2"
Заключение
Разумеется, машина обрабатывает эти таблицы гораздо быстрее людей (я сделал автоматом), а на работу с этим заданием рекомендуется отводить всего 3 минуты. Да одно только написать такую громоздкую таблицу - это минут 20 надо. Такой метод, конечно, не подойдёт для решения "на скорость", но для тренировки именно так делать полезно. Вы (опять) сможете обнаружить закономерности, которые подойдут именно Вам, где-то после третьей задачи такого типа.
Обратите внимание, что не возбраняется создавать новые - вычисляемые столбцы (как у нас возраст_родителя).
На языке SQL наш запрос выглядел бы так:
SELECT Count(*) AS Ответ
FROM Таблица1 AS Таблица1_1 INNER JOIN (Таблица1 INNER JOIN Таблица2 ON Таблица1.Код = Таблица2.ID_родителя) ON Таблица1_1.Код = Таблица2.ID_ребенка
WHERE ((([Таблица1_1].[Год_рождения]-[Таблица1].[Год_рождения])>25) AND ((Таблица1.Пол)="М"));
*Здесь 2 операции INNER JOIN как раз создают присоединяют к Таблице2 слева и справа Таблицу1, а после WHERE указано условие.
PS
Надеюсь, Вам понравилось и помогло то, что я написал. Подписывайтесь на канал и ставьте лайк, и тогда Вы будете знать, когда я буду выпускать новые разборы, а я буду знать, что мой труд востребован