СВЕТ: СПАСИБО
01-12-2023
Читать статью
Калужский Александр: Задача про Цаплю: https://www.youtube.co..
24-11-2023
Сергей: спасибо большое
Привет! Сегодня будем учится решать 24 задание из ЕГЭ по информатике 2021.
Двадцать четвёртое задание из ЕГЭ по информатике нацелено на обработку символьной информации.
В этом уроке будем решать задачи 24 задания с помощью языка программирования Pascal.
Перейдём к Демонстрационному варианту из ЕГЭ по информатике 2021.
Текстовый файл состоит не более чем из 106 символов X, Y и Z.
Определите максимальное количество идущих подряд символов, среди которых каждые два соседних различны.
Для выполнения этого задания следует написать программу.
В начале посмотрим, как считать посимвольно файл.
var f: file of char; c: char; begin assign (f, 'c:\24.txt'); reset (f); while not eof (f) do begin read(f, c); writeln(c); end; close (f); end.
В данном примере сам текстовый файл должен находиться по адресу: "c:\24.txt".
В цикле while с помощью команды read(f, c) считывается из файла очередной символ в переменную c и распечатывается на экран с помощью команды writeln(c).
Т.к. количество символов большое в этом файле, убедившись, что считывание происходит нормально, можно нажать на кнопку "Завершить".
В данной задаче нужно посчитать, на сколько длинная цепочка символов есть в нашем файле, в которой не идут два подряд одинаковых символа.
Пример:
Алгоритм будет следующий: Берём символ, сравниваем его со следующим, если они разные, то добавляем к счётчику 1. Счётчик начинает работать с 1, чтобы засчитать самый первый символ. Если символы одинаковые, то сбрасываем счётчик на 1 (первоначальное значение).
Таким образом, у нас будет разная длина цепочек не повторяющихся символов в нашем файле. Но нам нужно в ответе написать наибольшую длину. Для этого мы будем использовать механизм для нахождения максимального значения, который был описан в статье по 17 заданию из ЕГЭ по информатике 2021.
Напишем программу на языке Pascal, которая решает нашу задачу.
var f: file of char; c1, c2: char; count, max : integer; begin assign (f, 'c:\24.txt'); reset (f); count := 1; max := 0; read (f, c1); // Считываем самый первый символ. while not eof (f) do begin // Главный ЦИКЛ программы. read (f, c2); // Считываем очередной символ в цикле. if c1 <> c2 then begin // Основная проверка двух символов. count := count + 1; if count > max then max := count; end else begin count := 1; end; c1:=c2; // В переменную с1 идёт символ с2, // а в с2 считается новый символ из файла. end; Writeln(max); close (f); end.
После запуска программы на экране высветится число 35.
Следующая тренировочная задача из 24 задания ЕГЭ по информатике 2021.
Текстовый файл состоит не более чем из 106 символов L, D и R. Определите длину самой длинной последовательности, состоящей из символов R. Хотя бы один символ R находится в последовательности.
Для выполнения этого задания следует написать программу. Ниже приведён файл, который необходимо обработать с помощью данного алгоритма.
Напишем программу:
var f: file of char; c1: char; count, max : integer; begin assign (f, 'c:\24_1.txt'); reset (f); count := 0; max := 0; while not eof (f) do begin // Главный ЦИКЛ программы. read (f, c1); if c1 = 'R' then begin count := count + 1; if count > max then max := count; end else begin count := 0; end; end; Writeln(max); close (f); end.
Здесь логика следующая: В цикле считываем очередной символ. Если это символ R, то к счётчику прибавляем 1. Если встретили не символ R, то счётчик сбрасываем на ноль. Попутно в переменной max сохраняем максимальное значение для счётчика.
Ещё одна задача на понимание из 24 задания ЕГЭ по информатике 2021.
Текстовый файл состоит не более чем из 106 символов X, Y и Z. Определите максимальную длину цепочки вида XYZXYZXYZ... (составленной из фрагментов XYZ, последний фрагмент может быть неполным).
Пусть в начале показания счётчика равно нулю. Если мы находим нужный нам символ в нужной последовательности, то прибавляем к счётчику 1. Если последовательность сбивается, то ставим счётчик в ноль.
На рисунке представлен данный алгоритм. В нижней строке указано показание счётчика в момент анализа символа.
На данном рисунке максимальная длина цепочки нужных символов равна 9.
Видим, что для символа X, когда он находится на своём месте, остаток от деления значения счётчика на 3 равен 0.
Для символа Y, когда данный символ находится на своём месте, остаток от деления значения счётчика на 3 равен 1.
Для символа Z, когда данный символ находится на своём месте, остаток от деления значения счётчика на 3 равен 2.
Мы смотрим остаток от деления на 3, потому что у нас длина звена равна трём (XYZ).
Таким образом, мы и наш анализ очередного символа привяжем к показанию счётчика:
var f: file of char; c1: char; count, max : integer; begin assign (f, 'c:\24_2.txt'); reset (f); count := 0; max := 0; while not eof (f) do begin // Главный ЦИКЛ программы. read (f, c1); if ((c1 = 'X') and (count mod 3 = 0)) or ((c1 = 'Y') and (count mod 3 = 1)) or ((c1 = 'Z') and (count mod 3 = 2)) then begin count := count + 1; if count > max then max := count; end else begin if c1='X' then count := 1 else count := 0; end; end; Writeln(max); close (f); end.
Важный момент: Если нужную цепочку прервал символ X, то нужно счётчик сразу выставить в 1, иначе может произойти такая ошибка:
Т.е. первые три нужных символа в цепочке алгоритм не засчитал.
Поэтому мы не просто сбрасываем счётчик в ноль, а прописываем условие:
if c1='X' then count := 1 else count := 0;
Продолжаем набирать обороты в 24 задании из ЕГЭ по информатике 2021.
Текстовый файл состоит не более чем из 106 символов A, B и C.
Определите максимальное количество идущих подряд символов, каждый из которых имеет отличное значение от своих соседей. Первый и последний символ в строке не могут входить в искомую последовательность.
var f: file of char; c1, c2, c3: char; count, max : integer; begin assign (f, 'c:\24_3.txt'); reset (f); count := 0; max := 0; read (f, c1); // Считываем самый первый символ. read (f, c2); // Считываем второй символ. while not eof (f) do begin // Главный ЦИКЛ программы. read (f, c3); // Считываем очередной символ в цикле. if (c2 <> c1) and (c2 <> c3) then begin // Основная проверка двух символов. count := count + 1; if count > max then max := count; end else begin count := 0; end; c1 := c2; c2 := c3; end; Writeln(max); close (f); end.
Задача похожа на демонстрационный вариант. Здесь три символа участвуют в каждой итерации.
Посмотрим ещё не маловажные примеры из 24 задания ЕГЭ по информатике 2021.
В файле хранится строка из символов. Длина строки не более 106.
Сколько пар символов в строке являются симметричными? Симметричной парой называют такие два символа, которые расположены на одинаковом удалении от концов строки.
Например, в строке mdtdeeftkm три симметричных пары – mm, tt и ee.
Здесь удобнее использовать другой шаблон для считывания символов.
var s: string; var i: integer; begin assign(input, 'c:\24_4.txt'); readln(s); for i:=1 to Length(s) do begin WriteLn(s[i]); end; end.
Здесь есть строка s, в которой находятся все символы из нашего файла. В цикле for можно перебрать каждый символ и проанализировать его.
Удобство данного метода состоит в том, что мы может сразу посмотреть, какие символы находятся в середине строки или в конце.
К строке можно обращаться, как к массиву. Тогда в a[1] - Будет первый символ строки, в a[2] - второй и т.д.
Чтобы посмотреть последний символ строки, нужно обратиться к элементу a[Length(s)].
Теперь легко написать программу для нашей задачи:
var s: string; var i, count: integer; begin assign(input, 'c:\24_4.txt'); readln(s); count:=0; for i:=1 to Length(s) div 2 do begin if s[i] = s[Length(s)+1-i] then count := count + 1; end; WriteLn(count); end.
Проходим в цикле for до половины строки (Length(s) div 2) и анализируем симметричные символы с обеих концов строки.
Если символы равны, то прибавляем к счётчику 1.
Текстовый файл состоит не более чем из 106 заглавных латинских букв (A..Z). Текст разбит на строки различной длины. Определите количество строк, в которых встречается комбинация F?O, где вопросительный знак обозначает один любой символ.
Чтобы считать файл построчно, можно использовать следующий шаблон:
var f: text; // Обратите внимание на тип переменной f s: string; begin assign(f, 'c:\24_5.txt'); reset(f); while not eof (f) do begin // Главный ЦИКЛ программы. readln(f, s); // Считываем очередную строку. writeln(s); end; close (f); end.
Данный фрагмент кода будет печатать поочерёдно все строки из файла c:\24_5.txt.
Обратите внимание в данном шаблоне на тип данных переменной f.
Когда мы считывали по одному символу, для переменной f был тип данных file of char.
Когда мы считываем построчно, для переменной f тип данных выбираем text.
Так же команда для считывания строки становится readln(f, s);. Переменная s имеет тип string.
Напишем решение для данной задачи:
var f: text; s: string; count, i : integer; begin assign(f, 'c:\24_5.txt'); reset(f); count := 0; while not eof (f) do begin // Главный ЦИКЛ программы. readln(f, s); // Считываем очередную строку. for i:=1 to Length(s)-2 do begin if (s[i]='F') and (s[i+2]='O') then begin count := count + 1; break; end; end; end; Writeln(count); close (f); end.
После считывания очередной строки, мы проверяем с помощью цикла for, есть ли комбинация указанных символов. Если есть, прибавляем к счётчику 1 и выходим из цикла for с помощью команды break.
На этом всё! Удачи на ЕГЭ по информатике.