Методические подходы к обучению способам решения задач С2 и С4 ЕГЭ по информатике (на примере записи программ на естественном языке и языке Паскаль) Учитель информатики ГБОУ СОШ №1238 Леонова Елена Валентиновна Цель: предложить методику подготовки учащихся к решению задач С2, С4 ЕГЭ по информатике (из опыта учителя) 2 Почему стоит решать задачи С2, С4. Аргументы «за» учащемуся: Во-первых, если отбросить страхи, эти задания не намного сложнее, чем другие. Во-вторых, «заработав» на них баллы, можно компенсировать возможный неуспех «по невнимательности» в заданиях частей А и В. В-третьих, при знании критериев проверки этих заданий есть шанс повысить свой итоговый балл. 3 Методические подходы к обучению способам решения задачи С2 ЕГЭ по информатике Для подготовки обучающегося, учителю необходимо: 1) выявить специфику задания типа С2 (что именно и при каких «стартовых» условиях должен сделать учащийся); 2) предложить краткое и простое описание последовательности этапов решения задачи; 3) определить требования к подготовке учащегося, необходимые для решения задач типа С2 4) рассмотреть и проанализировать критерии проверки задач типа С2; 5) рассмотреть подходы к выполнению учащимся каждого этапа решения задачи; 4 Задачи этого типа направлены на обработку массива по некоторым критериям. От учащегося требуется «дописать» программу, приводящую к решению поставленной задачи. В итоге структура программы должна приобрести вид: 1) Организация ввода данных (уже есть) 2) Инициализация начальных значений некоторых переменных (требуется задать!) 3) Обработка данных (требуется организовать!) 4) Вывод данных (требуется организовать!). Обработка данных происходит в процессе циклической обработки элементов (или пар соседних элементов) по некоторому комбинированному условию, которое учащемуся необходимо формализовать на основе анализа условия задачи. В качестве условий могут быть как обязательное наличие признака, так и его отсутствие (например, элемент массива не делится на 2). 5 Примеры формализации некоторых типичных для С2 составляющих комбинированного условия: Признак Пример его формального описания для некоторого элемента массива А принадлежность к положительным /отрицательным числам четность/нечетность наличие указанного числа знаков в числе (только однозначное или двузначное) A[i]>0/ A[i]<0 наличие указанной цифры в конце (начале) числа (вторая цифра числа – 4) A[i] div 10 =4 делимость на некоторое число (делится на 7 нацело) A[i] mod 7=0 окончание числа на указанные цифры (оканчивается на 5) A[i] mod 10=5 соответствие указанному значению абсолютного значения элементов массива (самих по себе, разности соседних элементов, …) (последующий элемент массива больше предыдущего более чем в три раза) 6 A[i+1] > A[i]*3 A[i] mod 2 =0 (трехзначное положительное число ) (A[i]>=100) and (A[i]<=999) Требования к уровню подготовки выпускников, достижение которых проверяется на едином государственном экзамене по информатике и ИКТ, необходимые для решения С2: Запись натурального числа в позиционной системе с основанием меньшим или равным 10. Обработка и преобразование такой записи числа. Нахождение сумм, произведений элементов данной конечной числовой последовательности (или массива). Использование цикла для решения простых переборных задач (поиск наименьшего простого делителя данного натурального числа, проверка числа на простоту, и т.д.). Заполнение элементов одномерного и двумерного массива по заданным правилам. Операции с элементами массива. Линейный поиск элемента. Вставка и удаление элементов в массиве. Перестановка элементов данного массива в обратном порядке. Суммирование элементов массива. Проверка соответствия элементов массива некоторому условию. Нахождение второго по величине (второго максимального или второго минимального) значения в данном массиве за однократный просмотр массива. Нахождение минимального (максимального) значения в данном массиве и количества элементов, равных ему, за однократный просмотр массива. Операции с элементами массива, отобранными по некоторому условию. (Например, нахождение минимального четного элемента в массиве, нахождение количества и суммы всех четных элементов в массиве.) Сортировка массива. 7 Критерии проверки С2 или на что обратить внимание учащихся. Каким должно быть решение на 2 балла: 8 Как видно из критериев проверки С2 программу можно описать и на естественном языке. Рассмотрим и проанализируем пример такого описания (по демонстрационному варианту ФИПИ) параллельно с описанием решения на Паскале на примере следующей задачи: Пример С2-1. Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от 0 до 10000 включительно. Опишите на естественном языке или на одном из языков программирования алгоритм, позволяющий найти и вывести максимальное значение среди трёхзначных элементов массива, не делящихся на 9. Если в исходном массиве нет элемента, значение которого является трёхзначным числом и при этом не кратно 9, то выведите сообщение «Не найдено». Исходные данные объявлены так, как показано ниже на примерах для некоторых языков программирования и естественного языка. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать некоторые из описанных переменных. В качестве ответа Вам необходимо привести фрагмент программы (или описание алгоритма на естественном языке), который должен находиться на месте многоточия. Вы можете записать решение также на другом языке программирования (укажите название и используемую версию языка программирования, например, Free Pascal 2.4) или в виде блок-схемы. В этом случае Вы должны использовать те же самые исходные данные и переменные, какие были предложены в условии (например, в образце, записанном на естественном языке). 9 Пример С2-1. Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от 0 до 10000 включительно. Опишите на естественном языке или на одном из языков программирования алгоритм, позволяющий найти и вывести максимальное значение среди трёхзначных элементов массива, не делящихся на 9. Если в исходном массиве нет элемента, значение которого является трёхзначным числом и при этом не кратно 9, то выведите сообщение «Не найдено». Объявляем массив A из 20 элементов. Объявляем целочисленные переменные I, J, MAX. В цикле от 1 до 20 вводим элементы массива A с 1-го по 20-й. … Верное решение на естественном языке 10 Пример С2-1. Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от 0 до 10000 включительно. Опишите на естественном языке или на одном из языков программирования алгоритм, позволяющий найти и вывести максимальное значение среди трёхзначных элементов массива, не делящихся на 9. Если в исходном массиве нет элемента, значение которого является трёхзначным числом и при этом не кратно 9, то выведите сообщение «Не найдено». 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. Верное решение max := 99; for i := 1 to N do if (a[i]>=100) and (a[i]<=998) and (a[i] mod 9<>0) and (a[i]>max) then max := a[i]; if max > 99 then writeln(max) else 11 writeln(‘Не найдено’); Каким может быть решение на 1 балл: Наличие только одной ошибки из нижеперечисленных 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. найти и вывести максимальное значение среди трёхзначных элементов массива, не делящихся на 9. не инициализируется или неверно инициализируется переменная MAX (например, присваивается начальное значение, большее или равное 100); Верное решение max := 99; for i := 1 to N do if (a[i]>=100) and (a[i]<=998) and (a[i] mod 9<>0) and (a[i]>max) then max := a[i]; if max > 99 then writeln(max) else 12 writeln(‘Не найдено’); Каким может быть решение на 1 балл: Наличие только одной ошибки из нижеперечисленных Элементы массива могут принимать целые значения от 0 до 10000 включительно. 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. найти и вывести максимальное значение среди трёхзначных элементов массива, не делящихся на 9. неточно определяется принадлежность диапазону трёхзначных чисел (например, в сравнении со 100 вместо знака «больше или равно» используется знак «больше»; также обратите внимание, что с учётом ограничения на кратность 9 допустима проверка на принадлежность диапазону от 100 до 998); Верное решение max := 99; for i := 1 to N do if (a[i]>=100) and (a[i]<=998) and (a[i] mod 9<>0) and (a[i]>max) then max := a[i]; if max > 99 then writeln(max) else 13 writeln(‘Не найдено’); Каким может быть решение на 1 балл: Наличие только одной ошибки из нижеперечисленных неверно осуществляется проверка делимости на 9; 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. найти и вывести максимальное значение среди трёхзначных элементов массива, не делящихся на 9. на делимость на 9 проверяется не значение элемента, а его индекс; Верное решение max := 99; for i := 1 to N do if (a[i]>=100) and (a[i]<=998) and (a[i] mod 9<>0) and (a[i]>max) then max := a[i]; if max > 99 then writeln(max) else 14 writeln(‘Не найдено’); Каким может быть решение на 1 балл: Наличие только одной ошибки из нижеперечисленных в сложном условии вместо логической операции «И» используется логическая операция «ИЛИ»; 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. Верное решение max := 99; for i := 1 to N do if (a[i]>=100) and (a[i]<=998) and (a[i] mod 9<>0) and (a[i]>max) then max := a[i]; if max > 99 then writeln(max) else writeln(‘Не найдено’); 15 Каким может быть решение на 1 балл: Наличие только одной ошибки из нижеперечисленных 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. отсутствует вывод ответа, или при выводе ответа не учитывается случай, когда требуемого числа в массиве может не быть; Если в исходном массиве нет элемента, значение которого является трёхзначным числом и при этом не кратно 9, то выведите сообщение «Не найдено». Верное решение max := 99; for i := 1 to N do if (a[i]>=100) and (a[i]<=998) and (a[i] mod 9<>0) and (a[i]>max) then max := a[i]; if max > 99 then writeln(max) else writeln(‘Не найдено’); 16 Каким может быть решение на 1 балл: Наличие только одной ошибки из нижеперечисленных не указано или неверно указано условие завершения цикла; 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. Верное решение max := 99; for i := 1 to N do if (a[i]>=100) and (a[i]<=998) and (a[i] mod 9<>0) and (a[i]>max) then max := a[i]; if max > 99 then writeln(max) else writeln(‘Не найдено’); 17 Каким может быть решение на 1 балл: Наличие только одной ошибки из нижеперечисленных используется переменная, не объявленная в разделе описания переменных; 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. 18 Задача С2-1 const N=20; var a:array[1..N] of integer; i,j,max: integer; begin for i:=1 to N do readln(a[i]); … Объявляем массив A из end. 20 элементов. Объявляем целочисленные переменные I, J, MAX. В цикле от 1 до 20 вводим элементы массива A с 1-го по 20-й. … Дан целочисленный массив из 20 элементов. Элементы массива могут принимать целые значения от 0 до 10000 включительно. Опишите на естественном языке или на одном из языков программирования алгоритм, позволяющий найти и вывести максимальное значение среди элементов массива, которые имеют чётное значение и являются трёхзначными. Если в исходном массиве нет элемента, значение которого является чётным трёхзначным числом, то вывести сообщение «Не найдено». 19 Задача С2-1 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. Опишите на естественном языке или на одном из языков программирования алгоритм, позволяющий найти и вывести максимальное значение среди элементов массива, которые имеют чётное значение и являются трёхзначными. Если в исходном массиве нет элемента, значение которого является чётным трёхзначным числом, то вывести сообщение «Не найдено». Элементы массива могут принимать целые значения от 0 до 10000 включительно. max:=0; for i:=1 to N do begin end; If max=0 then writeln(‘не найдено’) else writeln(max); 20 Задача С2-1 Опишите на естественном языке или на одном из языков программирования алгоритм, позволяющий найти и вывести максимальное значение среди элементов массива, которые имеют чётное значение и являются трёхзначными. Если в исходном массиве нет элемента, значение которого является чётным трёхзначным числом, то вывести сообщение «Не найдено». const N=20; var a:array[1..N] of integer; i, j, max: integer; begin for i:=1 to N do readln(a[i]); If (a[i]> max) and (a[i] mod 2 =0) max:=0; for i:=1 to N do and (a[i]>=100 ) and (a[i]<=999) begin then max:=a[i]; end; If max=0 then writeln(‘не найдено’) else writeln(max); end. 21 Задача С2-1 const N=20; Полный вид решения на языке var Паскаль АВС 3.0.1 a:array[1..N] of integer; i, j, max: integer; max:=0; begin for i:=1 to N do for i:=1 to N do begin readln(a[i]); If (a[i]> max) and (a[i] mod 2 =0) and … end. (a[i]>=100 ) and (a[i]<=999) then max:=a[i]; end; If max=0 then writeln(‘не найдено’) else writeln(max); 22 Полный вид решения на естественном языке Объявляем массив A из 20 элементов. Объявляем целочисленные переменные I, J, MAX. В цикле от 1 до 20 вводим элементы массива A с 1-го по 20-й. … Задача С2-1 Записываем в переменную max начальное значение, равное 0. В цикле от 1-го элемента до 20-го выполняем проверку каждого элемента массива с соответствующим индексом по следующему условию: Если элемент массива больше или равен 100 и меньше или равен 999 и в остатке от деления на 2 дает ноль и больше значения переменной max, то переменной max присваиваем значение этого элемента массива. Переходим к следующему элементу. После завершения цикла проверяем значение переменной max. Если оно равно нулю, то выводим «не найдено», иначе выводим значение переменной max. 23 Задача С2-2 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. Объявляем массив A из 30 элементов. Объявляем целочисленные переменные I, J, MIN. В цикле от 1 до 30 вводим элементы массива A с 1-го по 30-й. … Дан целочисленный массив из 30 элементов. Элементы массива могут принимать значения от 150 до 200 – рост учащихся выпускного класса. В баскетбольную команду входят все учащиеся класса, чей рост не менее 180 сантиметров. Гарантируется, что такие учащиеся в классе есть. Опишите на русском языке или на одном из языков программирования алгоритм, который находит и выводит рост самого низкого участника баскетбольной команды. Исходные данные объявлены так, как показано ниже. Запрещается использовать переменные, не описанные ниже, но разрешается не использовать часть из них. 24 Задача С2-2 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. В баскетбольную команду входят все учащиеся класса, чей рост не менее 180 сантиметров. Гарантируется, что такие учащиеся в классе есть. Опишите на русском языке или на одном из языков программирования алгоритм, который находит и выводит рост самого низкого участника баскетбольной команды. Элементы массива могут принимать значения от 150 до 200 – рост учащихся выпускного класса. min:=200; for i:=1 to N do begin end; writeln(min); 25 Задача С2-2 const N=30; var a: array [1..N] of integer; i, j, min: integer; begin for i:=1 to N do readln(a[i]); min:=200; … for i:=1 to N do Begin В баскетбольную команду входят все учащиеся класса, чей рост не менее 180 сантиметров. Гарантируется, что такие учащиеся в классе есть. Опишите на русском языке или на одном из языков программирования алгоритм, который находит и выводит рост самого низкого участника баскетбольной команды. If (a[i]< min) and (a[i] >=180) then min:=a[i]; end; writeln(min); end. 26 Задача С2-2 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. Полный вид решения на языке Паскаль АВС 3.0.1 min:=200; for i:=1 to N do Begin If (a[i]< min) and (a[i] >=180) then min:=a[i]; end; writeln(min); 27 Полный вид решения на естественном языке Задача С2-2 Объявляем массив A из 30 элементов. Объявляем целочисленные переменные I, J, MIN. В цикле от 1 до 30 вводим элементы массива A с 1-го по 30-й. … Записываем в переменную min начальное значение, равное 200. В цикле от 1-го элемента до 20-го выполняем проверку каждого элемента массива с соответствующим индексом по следующему условию: Если элемент массива больше или равен 180 и меньше значения переменной min, то переменной min присваиваем значение этого элемента массива. После завершения цикла выводим значение переменной min. 28 Методические подходы к обучению способам решения задачи С4 ЕГЭ по информатике 1) выявить специфику задания типа С4 (что именно и при каких «стартовых» условиях должен сделать учащийся); 2) предложить краткое описание последовательности этапов решения задач типа С4; 3) определить требования к подготовке учащегося, необходимые для решения задач типа С4 4) рассмотреть и проанализировать критерии проверки задач типа С4; 5) рассмотреть подходы к выполнению учащимся каждого этапа решения задачи С4; 29 Направленость задачи С4 согласно Спецификации КИМа ЕГЭ по информатике: Умение создавать собственные программы на языке программирования (30–50 строк) для решения задач средней сложности. При этом программа обязательно (на 4 балла) или желательно (на 3-2 балла) должна быть оптимальной по времени работы и используемой памяти. 30 Для получения максимального балла от учащегося требуется: 1. уметь анализировать «накрученное» условие и представлять метод решения в виде формальной записи на языке программирования; 2. хорошо знать способы описания и обработки переменных целого, вещественно, строкового, логического типов данных (так, примеров описания строковых данных в КИМе нет) 3. обладать знаниями и умениями из уже рассмотренного в С2 перечня плюс следующими: A. Слияние двух упорядоченных массивов в один без использования сортировки. B. Обработка отдельных символов данной строки. Подсчет частоты появления символа в строке. C. Работа с подстроками данной строки с разбиением на слова по пробельным символам. Поиск подстроки внутри данной строки, замена найденной подстроки на другую строку. 4. Иметь достаточный опыт написания программ, чтобы «чувствовать» и исправлять возможные ошибки без использования компьютера. 31 Критерии проверки С4 или на что обратить внимание учащихся. Каким должно быть решение на 4 и 3 балла: 4 балла ставится за эффективную и правильно работающую программу, которая, возможно, содержит до трёх синтаксических ошибок. 3 балла ставится в случае, когда задача фактически решена, но программа содержит четыре-пять синтаксических ошибок, или если допущена одна содержательная ошибка, или если все входные данные сохраняются в массиве или иной структуре данных (программа неэффективна по памяти, но эффективна по 32 времени работы). Критерии проверки С4 или на что обратить внимание учащихся. Каким должно быть решение на 2 и 1 балл: 2 балла ставится, если программа •неэффективна по времени работы (перебираются все возможные пары элементов), •или в программе две содержательные ошибки, •либо шесть-семь синтаксических ошибок. 1 балл ставится, если программа написана неверно, но из описания алгоритма и общей структуры программы видно, что экзаменуемый в целом правильно представляет путь решения задачи. 33 Задача С4-1 (анализ решения из демоверсии КИМ 2014 года) По каналу связи передаётся последовательность положительных целых чисел, все числа не превышают 1000. Количество чисел известно, но может быть очень велико. Затем передаётся контрольное значение последовательности – наибольшее число R, удовлетворяющее следующим условиям: 1) R – произведение двух различных переданных элементов последовательности («различные» означает, что не рассматриваются квадраты переданных чисел; допускаются произведения различных элементов последовательности, равных по величине); 2) R делится на 21. Если такого числа R нет, то контрольное значение полагается равным 0. В результате помех при передаче как сами числа, так и контрольное значение могут быть искажены. Напишите эффективную, в том числе по используемой памяти, программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет проверять правильность контрольного значения. Программа должна напечатать отчёт по следующей форме: Вычисленное контрольное значение: … Контроль пройден (или – Контроль не пройден) Перед текстом программы кратко опишите используемый Вами алгоритм решения. На вход программе в первой строке подаётся количество чисел N. В каждой из последующих N строк записано одно натуральное число, не превышающее 1000. 34 В последней строке записано контрольное значение. По каналу связи передаётся Напишите эффективную, в том последовательность положительных числе по используемой памяти, целых чисел, все числа не превышают программу , которая будет 1000. Количество чисел известно, но проверять правильность может быть очень велико. Затем контрольного значения. передаётся контрольное значение последовательности – наибольшее Пример входных данных: число R, удовлетворяющее 6 На вход программе в первой следующим условиям: 70 строке подаётся количество 21 1) R – произведение двух различных чисел N. В каждой из 997 элементов последующих N строк записано переданных 7 последовательности («различные» одно натуральное число, не 9 означает, что не рассматриваются превышающее 1000. В 300 квадраты переданных чисел; последней строке записано 21000 контрольное значение. допускаются произведения различных элементов последовательности, Пример выходных данных для равных по величине); приведённого выше примера 2) R делится на 21. входных данных: Вычисленное контрольное Если такого числа R нет, то значение: 21000 контрольное значение полагается Контроль пройден 35 равным 0. Решение задачи С4 имеет следующие обязательные составляющие: Описание используемых переменных Инициализация Организация ввода Организация обработки Организация вывода При оптимальном по времени решении задачи С4 организация ввода и обработки организуется параллельно, а не последовательно (как в С2). Тогда количество используемых переменных сводится к минимуму, а значит, программа будет еще оптимальна и по памяти. 36 Словесное описание алгоритма решения задачи, предваряющее ее запись на языке программирования является обязательной частью решения задачи С4: Произведение двух чисел делится на 21, если: один из сомножителей делится на 21 (второй может быть любым) либо ни один из сомножителей не делится на 21, причём один из сомножителей делится на 7, а другой – на 3. Поэтому программа, вычисляющая кодовое число, может работать так. Программа читает все входные данные один раз, не запоминая все данные в массиве. Программа для прочитанного фрагмента входной последовательности хранит значения четырёх величин: М7 – самое большое число, кратное 7, но не кратное 3; M3 – самое большое число, кратное 3, но не кратное 7; M21 – самое большое число, кратное 21; МAX – самое большое число среди всех элементов последовательности, отличное от М21 (если число М21 встретилось более одного раза и оно же является максимальным, то MAX = M21). После того как все данные прочитаны, искомое контрольное значение вычисляется как максимум из произведений М21*MAX и М7*М3. 37 var M7,M3,M21,R,MAX,dat,res,i,N: longint; Количество чисел N известно, но может begin быть очень велико. M7 := 0; все числа не превышают 1000 M3 := 0; … M21 := 0; MAX := 0; R – произведение двух различных переданных readln(N); элементов последовательности for i := 1 to N do Begin … end; readln(R); if (M7*M3 < M21*MAX) then res := M21*MAX else res := M7*M3; writeln('Вычисленное контрольное значение: ',res); if R = res then writeln('Контроль пройден') else writeln('Контроль не пройден'); end. 38 var M7,M3,M21,R,MAX,dat,res,i,N: longint; begin контрольное значение M7 := 0; последовательности – M3 := 0; наибольшее число R, удовлетворяющее следующим M21 := 0; условиям: MAX := 0; 1) R – произведение двух readln(N); различных переданных элементов последовательности for i := 1 to N do 2) R делится на 21 Begin … end; readln(R); if (M7*M3 < M21*MAX) then res := M21*MAX else res := M7*M3; writeln('Вычисленное контрольное значение: ',res); if R = res then writeln('Контроль пройден') else writeln('Контроль не пройден'); end. 39 var M7,M3,M21,R,MAX,dat,res,i,N: longint; begin readln(dat); if ((dat mod 7) = 0) and ((dat mod 3) > 0) and (dat > M7) M7 := 0; then M7 := dat; M3 := 0; M21 := 0; if ((dat mod 3) = 0) and ((dat mod 7) > 0) and (dat > M3) MAX := 0; then M3 := dat; readln(N); if (dat mod 21 = 0) and (dat > M21) then for i := 1 to N do begin Begin if M21 > MAX then MAX := M21; … M21 := dat end end; else if dat > MAX then MAX := dat; readln(R); if (M7*M3 < M21*MAX) then res := M21*MAX else res := M7*M3; writeln('Вычисленное контрольное значение: ',res); if R = res then writeln('Контроль пройден') else writeln('Контроль не пройден'); 40 end. Решение задачи на 2 балла из 4 возможных Не выполнены условия, позволяющие поставить 3 или 4 балла. Программа работает в целом верно, эффективно или нет, но в реализации алгоритма содержится до двух содержательных ошибок, допустимые виды ошибок перечислены в критериях на 3 балла. Количество синтаксических «описок» не должно быть более семи. Программа может быть неэффективна по времени. Например, все числа запоминаются в массиве (ниже n – количество прочитанных чисел), и перебираются все возможные пары элементов последовательности. Например, так: max := 0; for i := 1 to n - 1 do for j := i + 1 to n do if ((a[i]*a[j]) mod 21 = 0) and ((a[i]*a[j]) > max) then max := a[i]*a[j]; 41 Алгоритм решения задачи: Анализ условия, определение цели. Выявление связей между искомым и вводимыми данными. Запись описания алгоритма решения задачи на естественном языке. Оформление программы на языке программирования, включающее в себя: описание переменных и их типов, инициализацию нужных переменных, организацию ввода и обработки, организацию вывода. Анализ программы , выявление ошибок на 2-3 подобранных самостоятельно тестах (кроме данного в задаче), коррекция. 42 Задача С4-1 Например, пусть на вход подаются следующие символы: batat. В данном случае программа должна вывести atb На вход программе подаются строчные английские буквы. Ввод этих символов заканчивается точкой (другие символы, отличные от “.” и букв “a”..“z”, во входных данных отсутствуют; в программе на языке Бейсик символы можно вводить по одному в строке, пока не будет введена точка). Требуется написать эффективную программу, которая будет печатать буквы, встречающиеся во входной последовательности, в порядке уменьшения частоты их встречаемости. Каждая буква должна быть распечатана один раз. Точка при этом не учитывается. Если какие-то буквы встречаются одинаковое число раз, то они выводятся в алфавитном порядке. 43 Пояснение к решению Программа читает все входные символы до точки один раз, подсчитывая в массиве, хранящем 26 целых чисел, количество каждой из букв. Сами входные символы при этом не запоминаются. В дополнительный массив, состоящий из 26 символов, заносятся буквы от «а» до «z». Затем элементы первого массива сортируются по неубыванию любым алгоритмом сортировки, параллельно переставляются и элементы второго массива (возможно использование одного массива записей, состоящих из двух полей). При этом элементы с равным числом вхождений символов местами не меняются. Во втором из отсортированных массивов пропускаются элементы, количество которых равно 0, остальные элементы печатаются подряд. 44 Немного об особенностях символьного типа Переменная типа char может принимать значения из определенной упорядоченной последовательности символов. Переменная этого типа занимает 1 байт и принимает одно из 256 значений кода ASCII Обычно символы, имеющие экранное представление, записывают в явном виде, заключив в апострофы (например, 'A', 'b', '*'). Две стандартные функции позволяют поставить в соответствие данную последовательность символов множеству целых неотрицательных чисел (порядковым номерам символов последовательности). Эти функции называются функциями преобразования: ord(ch) – выдает номер символа (нумерация с нуля), chr(i) – выдает i-ый символ из таблицы символов. Пример. ord(H) выдает номер символа Н в последовательности всех символов, используемых транслятором. chr(15) выдает 15-ый символ этой последовательности. 45 var a: array[0..25] of integer; b: array[0..25] of ‘a’..’z’; c: char; i,j,k: integer; begin for i:=0 to25 do begin a[i]:=0; b[i]:=chr(ord(‘a’)+i) end; repeat read(c); … until c=‘.’; … ... i:=0; while a[i]=o do i:=i+1; for j:= i to 25 do write( b[j]); end. 46 var a: array[0..25] of integer; b: array[0..25] of ‘a’..’z’; c: char; i,j,k: integer; begin for i:=0 to25 do repeat begin read(c); a[i]:=0; a[ord(c)-ord(‘a’)]:=a[ ord(c)-ord(‘a’)]+1; b[i]:=chr(ord(‘a’)+i) until c=‘.’; end; ... … i:=0; while a[i]=0 do i:=i+1; for j:=i to 25 do write( b[j]); end. 47 var a: array[0..25] of integer; b: array[0..25] of ‘a’..’z’; c: char; i,j,k: integer; begin for i:=0 to25 do begin a[i]:=0; b[i]:=chr(ord(‘a’)+i) end; repeat read(c); a[ord(c)-ord(‘a’)]:=a[ ord(c)-ord(‘a’)]+1; until c=‘.’; ... i:=0; while a[i]=0 do i:=i+1; for j:=i to 25 do write( b[j]); end. for i:=1 to 25 do begin for j := 0 to 24 do if a[j] > a[j +1] then begin k:=а[j]; с:=b[j]; а[j]:=а[j+1]; b[j]:=m[j+1]; a[j + 1] :=k; b[j+1] :=c end; end; 48 Спасибо за внимание! 49