Какой язык программирования выбрать для решения задач ЕГЭ?
В экзаменационной работе ЕГЭ несколько заданий требуют знания языка программирования. В задачах 8, 11, 19, 20, 21, 24 требуется понять и проанализировать текст программы, в задаче 25 требуется написать фрагмент программы. В формулировке задачи на выбор предоставлены следующие языки: Бейсик, Паскаль, Си, Алгоритмический язык, Python, Естественный язык.
Единственная задача, в которой требуется самостоятельно написать законченную программу – это задача 27. В формулировке задачи требуется написать программу «на любом языке программирования». Так какой же язык программирования выбрать?
Выражу на этот счет свое личное мнение, основанное на опыте сдачи экзамена моими учениками за несколько последних лет. В 27-й задаче ЕГЭ необходимо правильно составить алгоритм, реализовать который можно практически на любом языке программирования. Т.е. на одном языке программа будет короче, на другом длиннее, но пока ни разу не встретилась задача, которую невозможно было бы решить, к примеру, на Бейсике. Кроме того, выбор языка не влияет на оценку. Поэтому, если Вы хорошо владеете каким-то экзотическим языком программирования, Вы имеете полное право писать программу на нем. Однако, следует учитывать тот факт, что программу будут проверять и оценивать.
В рекомендациях ФИПИ проверяющим сказано: «Если этот язык программирования недостаточно знаком эксперту, то ему следует воспользоваться доступной справочной литературой или обратиться за помощью к консультанту или председателю (заместителю председателя) предметной комиссии, соблюдая при этом регламент проверки». Т.е. в случае, когда проверяющий столкнулся с неизвестным ему языком, он должен «соблюдая при этом регламент проверки», т.е. в отведенные сроки (а при проверке ЕГЭ они очень сжатые), найти того, кто данный язык программирования знает, и разобраться в тексте Вашей программы. Очевидно, что вероятность недооценки очень велика. Кроме того, следует понимать, что школы используют только лицензионное (официально приобретенное) программное обеспечение. Если компилятор используемого Вами языка школой не приобретен, проверить работоспособность Вашей программы на компьютере будет невозможно.
Практика последних двух лет показала, что многие проверяющие не знают язык Python (он фигурирует в списке разрешенных языков в задачах ЕГЭ всего второй год). Сложности у проверяющих вызывает проверка текста программы, написанной на С#, Java. Не говоря уж о редких специфических языках. Не рекомендую писать программу на естественном или алгоритмическом языке, ввиду отсутствия официальных правил, описывающих язык. Да и разбираться в тексте, написанном на языке, не используемом на практике, не очень приятно. Я всегда настоятельно советую ученикам описывать на естественном языке алгоритм программы, чтобы облегчить задачу проверяющему, но сама программа должна быть написана на понятном удобном языке программирования.
На данный момент я рекомендую выбрать Паскаль, Си или Бейсик. Это известные, распространенные языки. Среда разработки для них есть практически в любой школе. Значит, у проверяющего не возникнет вопросов при анализе Вашей программы. У языка Паскаль есть еще один плюс: изначально сложная 27-я задача решалась именно на нем, а значит примеры, образцы решений и разборы всех типов задач Вы легко найдете в литературе и в интернете, чего нельзя сказать о других языках.
Благодарим за то, что пользуйтесь нашими материалами.
Информация на странице «Какой язык программирования выбрать для решения задач ЕГЭ?» подготовлена нашими редакторами специально, чтобы помочь вам в освоении предмета и подготовке к экзаменам.
Чтобы успешно сдать нужные и поступить в ВУЗ или колледж нужно использовать все инструменты: учеба, контрольные, олимпиады, онлайн-лекции, видеоуроки, сборники заданий.
Также вы можете воспользоваться другими статьями из разделов нашего сайта.
Публикация обновлена:
08.03.2023
Теперь ЕГЭ по информатике выпускники сдают в компьютерной форме, а это значит, что и в процессе подготовки их ждет немало изменений.
Как связаны программирование и подготовка к ЕГЭ по информатике
Некоторые задания из ЕГЭ по информатике 2022 (номера 8, 11, 19, 20, 21, 24, 25 и 27) требуют знаний одного из языков программирования и минимальных навыков работы с ним. В первых из перечисленных заданий проверяется умение выпускников понимать и анализировать текст программы, в 25 задаче нужно самостоятельно написать фрагмент программы, в 27 — законченную программу.
В формулировках заданий перечислены следующие языки программирования: Basic, Pascal, C/C++, Алгоритмический язык, Python, Естественный язык. Выбор языка программирования не влияет на оценку, несмотря на то, что на каком-то из них программа может получиться длиннее, а на другом короче. Эксперты в области подготовки к ЕГЭ по информатике говорят, что за все время их деятельности на экзамене еще ни разу не попалось задание, которое нельзя было бы выполнить, например, с использованием Basic.
Как решать задачи на программирование при подготовке
Прежде чем приступать к решению задач, нужно разобраться с теоретической частью. Для того, чтобы успешно выполнять задания и получить высокие баллы, вам необходимо разбираться в:
- синтаксисе используемого языка программирования,
- алгоритмических конструкциях,
- работе со строками и символами,
- работе с массивами,
- базовых алгоритмах программ,
- составных типах данных.
Приступая к практической части подготовки, в первую очередь решите демонстрационную версию экзамена (можно даже на специальной онлайн-платформе, где КИМ будет выглядеть ровно так, как компьютерная версия самого ЕГЭ) и посмотрите, какие задания вам даются легко, какие вызывают небольшие трудности, а с какими вы совсем не можете справиться. Такое распределение задач по категориям поможет вам лучше организовать подготовку, расставить приоритеты и повысить эффективность практики.
После этого обязательно изучите критерии и постарайтесь понять, что именно от вас хотят увидеть проверяющие, на что нужно обратить внимание при выполнении заданий и какие условия нужно соблюдать.
И только после этого начинайте практиковаться. Лучше делать это каждый день, а также привлечь к подготовке человека, который в этом хорошо разбирается — репетитора или куратора онлайн-школы. Он поможет вам прояснить непонятные моменты и научит находить ошибки.
Какой язык программирования выбрать для сдачи ЕГЭ по информатике в 2022 году
В большинстве школ языкам программирования уделяется не так много времени, а где-то о них и не упоминают, поэтому ученикам приходится брать на себя целых две сложных и важных задачи:
- выбрать язык(и) программирования для ЕГЭ по информатике,
- научиться с ними работать.
Сейчас посмотрим, какие языки программирования выпускники выбирают чаще всего и какие из них лучше для подготовки к ЕГЭ по информатике 2022.
- Pascal
Даже если в вашей школе информатика преподавалась “для галочки”, об этом языке вы уж точно слышали. Несмотря на то, что Паскаль является устаревшим языком программирования и не используется разработчиками в крупных компаниях, для ЕГЭ он вполне подойдет.
С использованием Паскаля можно решить все базовые задания на программирование, хотя выполнение более сложных задач, скорее всего, получится не совсем удобным и весьма громоздким.
- C++
Этот язык пользуется наибольшей популярностью среди выпускников, несмотря на то, что написание программ на нем — не самое быстрое. Если у вас медленный темп работы, то в целях экономии времени на ЕГЭ по информатике 2022 лучше выбрать другой язык программирования, тем более, что в большинстве заданий проверяются ответы, а не написание программ.
- Python
Питон совсем недавно вошел в список разрешенных языков программирования для ЕГЭ по информатике, поэтому для многих (в том числе проверяющих) он покажется непривычным. Однако этот язык почти идеально подходит под формат экзамена: он быстрый, на нем можно решить 18 заданий из 27, он имеет простой синтаксис.
- Другие варианты
Вы можете выбрать другой язык программирования, например, C или Basic, которые также рекомендуют многие преподаватели. Однако здесь могут возникнуть две сложности: это усложнит подготовку, так как в большинстве методических материалов по подготовке используются первые три языка из нашего списка, а также может случиться такое, что эксперт, проверяющий работу, не будет знать выбранный вами язык (это, конечно, не ваша проблема, но неприятные ситуации могут возникнуть).
Итог
При выборе языка программирования для ЕГЭ по информатике 2022 мы советуем руководствоваться именно легкостью, распространенностью языка и быстротой использования. Самое важное — чтобы он помог вам решить задания из КИМа, а все остальное уже второстепенно.
На уроке рассмотрен разбор 27 задания ЕГЭ по информатике: дается подробное объяснение и решение задания 2017 года
Содержание:
- Объяснение задания 27 ЕГЭ по информатике
- Решение 27 заданий ЕГЭ по информатике
- Задания 2021 и более поздние
- Задания предыдущих лет на повторение
- На вход программы поступает последовательность чисел, произвести анализ пар
- Выбрать из каждой пары одно число
- Набор данных, состоящих из троек чисел
- Анализ пар, находящихся на расстоянии
27-е задание: «Анализ числовых последовательностей»
Уровень сложности
— высокий,
Требуется использование специализированного программного обеспечения
— да,
Максимальный балл
— 2,
Примерное время выполнения
— 35 минут.
Проверяемые элементы содержания: Умение создавать собственные программы (20–40 строк) для анализа числовых последовательностей
Рекомендации по выполнению:
«О выборе языка программирования. Выбирайте тот язык, которым лучше всего владеете. Никакого повышения или снижения баллов за экзотичность языка не предусмотрено.»
Типичные ошибки и рекомендации по их предотвращению:
ФГБНУ «Федеральный институт педагогических измерений»
Работа с записями
Запись в Паскале — это сложный тип данных, который может состоять из нескольких элементов – полей; поля могут иметь различный тип.
Подробно о записях объясняется здесь.
Решение 27 заданий ЕГЭ по информатике
Плейлист видеоразборов задания на YouTube:
Задание демонстрационного варианта 2022 года ФИПИ
Задания 2021 и более поздние
27_1 new:
* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!
Имеется набор данных, состоящий из пар положительных целых чисел. Необходимо выбрать из каждой пары ровно одно число так, чтобы сумма всех выбранных чисел не делилась на 3 и при этом была минимально возможной. Гарантируется, что искомую сумму получить можно. Программа должна напечатать одно число – минимально возможную сумму, соответствующую условиям задачи.
Входные данные:
Даны два входных файла: файл A (27-1a.txt) и файл B (27-1b.txt), каждый из которых содержит в первой строке количество пар N
(1 ≤ N ≤ 100000). Каждая из следующих N
строк содержит два натуральных числа, не превышающих 10 000.
Пример входных данных:
6 1 3 5 12 6 9 5 4 3 3 1 1
Пример выходных данных для приведённого выше примера входных данных:
20
✍ Решение:
-
Язык PascalABC.NET:
Язык Python (Питон):
f = open ('27-1b.txt') # для первого ответа - 27-1a.txt n=int(f.readline()) data=f.readlines() summa=0 minim=10001 # для минимальной разницы for i in range(0, n): s = data[i].split() a=int(s[0]) b=int(s[1]) summa+=min(a,b) # сумма максимумов из пар raznitsa = abs(a-b) # разница if raznitsa % 3 != 0: minim=min(minim,raznitsa) if summa % 3 != 0: print(summa) else: print(summa + minim) # здесь добавляем! т.к. иначе берем наибольший из пары
Ответ: 67303 200157496
Задания предыдущих лет на повторение
На вход программы поступает последовательность чисел, произвести анализ пар
27_4:
* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!
Компьютер наземной станции слежения получает от объектов-самолётов, находящихся в зоне её работы, идентификационные сигналы, представляющие собой последовательность из N целых положительных чисел. Каждый объект направляет на наземную станцию уникальное число, т. е. все числа в получаемой станцией последовательности различны. Обработка сигнала представляет собой рассмотрение всех пар различных элементов последовательности, при этом элементы пары не обязаны быть переданы непосредственно друг за другом, порядок элементов в паре не важен. Считается, что возникла одна критическая ситуация, если произведение элементов некоторой пары кратно 58.
Необходимо определить общее количество возникших критических ситуаций.
Описание входных и выходных данных
В первой строке входных данных задаётся количество чисел N (1 < N < 1000). В каждой из последующих N строк записано одно целое положительное число, не превышающее 10 000.
В качестве результата программа должна напечатать одно число: общее количество возникших критических ситуаций.
Пример входных данных:
4 2 6 29 87
Пример выходных данных для приведённого выше примера входных данных:
4
Из четырёх заданных чисел можно составить б попарных произведений:
2*6 = 12 2*29 = 58 2*87 = 174 6*29 = 174 6*87 = 522 29*87 = 2523
Из них на 58 делятся 4 произведения (выделены синим).
Требуется написать эффективную по времени и по памяти программу для решения описанной задачи.
✍ Решение:
✎ Программа эффективна по времени и по памяти (4 балла):
- Язык Паскаль (версия PascalABC):
- Язык Python (версия Python 3):
- Язык Бейсик:
- Произведение двух чисел делится на 58, если выполнено одно из следующих условий (условия не могут выполняться одновременно).
- A. Оба сомножителя делятся на 58.
- Б. Один из сомножителей делится на 58, а другой не делится.
- B. Ни один из сомножителей не делится на 58, но один сомножитель делится на 2, а другой — на 29.
- Почему именно 2 и 29?
- Берем два делителя числа 58, произведение которых дает число 58: 2*29 = 58. При этом одно из них — наименьший делитель (в нашем случае 2), а другой, не должен делиться на первый найденный делитель (29/2 <> 0).
- Условие делимости произведения на 58 можно сформулировать проще, например так:
- Но в этом случае пара сомножителей может удовлетворять обоим условиям, что затруднит подсчёт количества пар.
- При вводе чисел можно определять, делится ли каждое из них на 58, 2 и 29, и подсчитывать следующие значения:
- n58 — количество чисел, кратных 58;
- n29 —количество чисел, кратных 29, но не кратных 2 и 58;
- n2 — количество чисел, кратных 2, но не кратных 29 и 58.
- Сами числа при этом можно не хранить. Каждое число учитывается не более чем в одном из счётчиков.
- Количество пар, удовлетворяющих условию А, можно вычислить по формуле
n58*(n58 - 1)/2
. - Количество пар, удовлетворяющих условию Б, можно вычислить по формуле
n58*(N - n58)
. - Количество пар, удовлетворяющих условию В, можно вычислить по формуле
n2 * n29
. - Поэтому искомое количество пар вычисляется по формуле:
var N: integer; {количество чисел} a: integer; {очередное число} n58, n29, n2: integer; k58: integer; {количество требуемых пар} i: integer; begin readln(N); n58 := 0; n29 := 0; n2 := 0; for i := 1 to N do begin readln(a); if a mod 58 = 0 then n58 := n58 + 1 else if a mod 29 = 0 then n29 := n29 + 1 else if a mod 2 = 0 then n2 := n2 + 1; end; k58 := n58 * (n58 - 1) div 2 + n58 * (N - n58) + n2 * n29; writeln(k58) end.
n=int(input()) n58,n29,n2=0,0,0 for i in range(n): a=int(input()) if a % 28 == 0: n58+=1 elif a % 29 == 0: n29+=1 elif a % 2 == 0: n2+=1 k58=n58 * (n58-1) // 2 + n58 * (n-n58) + n2 * n29 print(k58)
N58 = 0 N2 = 0 N29 = 0 NX = 0 INPUT N FOR I = 1 TO N INPUT A IF A MOD 58 = 0 THEN N58 = N58 + 1 ELSE IF A MOD 29 = 0 THEN N29 = N29 + 1 ELSE IF A MOD 2 = 0 THEN N2 = N2 + 1 ELSE NX = NX + 1 END IF END IF END IF NEXT I K58 = N58*(N58 - 1)2 + N58*(N2 + N29 + NX) + N2*N29 PRINT K58
(один из сомножителей делится на 58) ИЛИ (один сомножитель делится на 2, а другой — на 29)
n58 * (n58 - 1)/2 + n58 * (N - n58) + n2 * n29
✎ Программа неэффективная (2 балла):
- Язык Паскаль (версия PascalABC):
var i, j, k, n: integer; a: array[1..1000]of integer;//очередное значение begin readln(n); for i := 1 to n do begin readln(a[i]); end; k := 0; for i := 1 to n - 1 do for j := i + 1 to n do if a[i] * a[j] mod 58 = 0 then k := k + 1; writeln(k); end.
Полный перебор: все числа сохраняются в массиве, рассматриваются все возможные пары и подсчитывается количество подходящих произведений.
27_6: Разбор 27 задания демоверсии 2018 года:
* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!
На вход программы поступает последовательность из N целых положительных чисел, все числа в последовательности различны. Рассматриваются все пары различных элементов последовательности (элементы пары не обязаны стоять в последовательности рядом, порядок элементов в паре не важен). Необходимо определить количество пар, для которых произведение элементов делится на 26.
Описание входных и выходных данных В первой строке входных данных задаётся количество чисел N (1 ≤ N ≤ 1000). В каждой из последующих N строк записано одно целое положительное число, не превышающее 10 000.
В качестве результата программа должна напечатать одно число: количество пар, в которых произведение элементов кратно 26.
Пример входных данных:
4 2 6 13 39
Пример выходных данных для приведённого выше примера входных данных:
4
Из четырёх заданных чисел можно составить 6 попарных произведений:
2·6 = 12 2·13 = 26 2·39 = 78 6·13 = 78 6·39 = 234 13·39 = 507
Из них на 26 делятся 4 произведения:
2·13=26; 2·39=78; 6·13=78; 6·39=234
Требуется написать эффективную по времени и по памяти программу для
решения описанной задачи.
✍ Решение:
* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!
-
Произведение двух чисел делится на 26, если выполнено одно из следующих условий (условия не могут выполняться одновременно).
А. Оба сомножителя делятся на 26.
Б. Один из сомножителей делится на 26, а другой не делится.
В. Ни один из сомножителей не делится на 26, но один сомножитель делится на 2, а другой – на 13.
Примечание для проверяющего. Условие делимости произведения на 26 можно сформулировать проще, например, так:
(один из сомножителей делится на 26) ИЛИ
(один сомножитель делится на 2, а другой – на 13).
Но в этом случае пара сомножителей может удовлетворять обоим условиям, что затруднит подсчёт количества пар.
При вводе чисел можно определять, делится ли каждое из них на 26, 2 и 13, и подсчитывать следующие значения:
1) n26 – количество чисел, кратных 26;
2) n13 – количество чисел, кратных 13, но не кратных 26;
3) n2 – количество чисел, кратных 2, но не кратных 26.
Примечание для проверяющего. Сами числа при этом можно не хранить.
Каждое число учитывается не более чем в одном из счётчиков.
Количество пар, удовлетворяющих условию А, можно вычислить по формуле n26·(n26 – 1)/2.
Количество пар, удовлетворяющих условию Б, можно вычислить по формуле n26·(N – n26).
Количество пар, удовлетворяющих условию В, можно вычислить по формуле n2·n13.
Поэтому искомое количество пар вычисляется по формуле
n26·(n26 – 1)/2 + n26·(N – n26) + n2·n13
✎ Программа эффективна и по времени, и по памяти (4 балла):
Программа на языке Паскаль (версия PascalABC):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
var N: integer; {количество чисел} a: integer; {очередное число} n26, n13, n2: integer; k26: integer; {количество требуемых пар} i: integer; begin readln(N); n26 := 0;n13 := 0;n2 := 0; for i := 1 to N do begin readln(a); if a mod 26 = 0 then n26 := n26 + 1 else if a mod 13 = 0 then n13 := n13 + 1 else if a mod 2 = 0 then n2 := n2 + 1; end; k26 := n26 * (n26 - 1) div 2 + n26 * (N - n26) + n2 * n13; writeln(k26) end. |
Программа на языке Python (версия Python 3):
1 2 3 4 5 6 7 8 9 10 11 12 |
n=int(input()) n26,n13,n2=0,0,0 for i in range(n): a=int(input()) if a % 26 == 0: n56+=1 elif a % 13 == 0: n13+=1 elif a % 2 == 0: n2+=1 k26=n26 * (n26-1) // 2 + n26 * (n-n26) + n2 * n13 print(k26) |
Программа на языке Бейсик:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
N26 = 0 N2 = 0 N13 = 0 NX = 0 INPUT N FOR I = 1 TO N INPUT A IF A MOD 26 = 0 THEN N26 = N26 + 1 ELSE IF A MOD 13 = 0 THEN N13 = N13 + 1 ELSE IF A MOD 2 = 0 THEN N2 = N2 + 1 ELSE NX = NX + 1 END IF END IF END IF NEXT I K26 = N26*(N26 - 1)2 + N26*(N2 + N13 + NX) + N2*N13 PRINT K26 |
27_7: Разбор досрочного экзамена 2020 г, ФИПИ (2 вариант):
* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!
Дана последовательность N целых положительных чисел. Рассматриваются все пары элементов последовательности, разность которых чётна, и в этих парах, по крайней мере, одно из чисел пары делится на 19. Порядок элементов в паре неважен. Среди всех таких пар нужно найти и вывести пару с максимальной суммой элементов. Если одинаковую максимальную сумму имеет несколько пар, можно вывести
любую из них
. Если подходящих пар в последовательности нет,
нужно вывести два нуля
.
Описание входных и выходных данных
В первой строке входных данных задаётся количество чисел N (2 ≤ N ≤ 10 000). В каждой из последующих N строк записано одно натуральное число, не превышающее 10 000.
Пример входных данных:
5 38 12 57 16 57
Пример выходных данных для приведённого выше примера входных данных:
57 57
Пояснение. Из данных пяти чисел можно составить три различные пары, удовлетворяющие условию: (38, 12), (38, 16), (57, 57). Наибольшая сумма получается в паре (57, 57). Эта пара допустима, так как число 57 встречается в исходной последовательности дважды.
Напишите эффективную по времени и памяти программу для решения этой задачи.
Программа считается эффективной по времени, если при увеличении количества исходных чисел N в k раз время работы программы увеличивается не более чем в k раз.
Программа считается эффективной по памяти, если память, необходимая для хранения всех переменных программы, не превышает 1 Кбайт и не увеличивается с ростом N.
Максимальная оценка за правильную (не содержащую синтаксических ошибок и дающую правильный ответ при любых допустимых входных данных) программу, эффективную по времени и памяти, – 4 балла.
Максимальная оценка за правильную программу, эффективную только по времени или только по памяти, – 3 балла.
Максимальная оценка за правильную программу, не удовлетворяющую требованиям эффективности, – 2 балла.
Вы можете сдать одну или две программы решения задачи. Если Вы сдадите две программы, каждая из них будет оцениваться независимо от другой, итоговой станет бо́льшая из двух оценок.
Перед текстом программы кратко опишите алгоритм решения. Укажите использованный язык программирования и его версию.
Типовые задания для тренировки
✍ Решение:
* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!
- ✎ Программа эффективна по времени и памяти
- ✎ Правильная программа на языке C++, эффективная только по времени
- ✎ Правильная, но неэффективная программа на языке Паскаль
Язык Pascal (PascalABC):
Вариант 1:
const p = 19; var N: integer; {количество чисел} a: integer; {очередное число} m0, m1: integer; {чётный и нечётный максимумы} mp0, mp1: integer; {чётный и нечётный максимумы, кратные p} x, y: integer; {ответ – пара чисел} i: integer; begin m0 := 0; m1 := 0; mp0 := 0; mp1 := 0; x := 0; y := 0; readln(N); for i := 1 to N do begin readln(a); // для четных if a mod 2 = 0 then begin // если кратное if (a mod p = 0) and (a >= mp0) then begin if mp0 > m0 then m0:= mp0; mp0:=a end else if a > m0 then m0 := a; end else begin // для нечетных if (a mod p = 0)and(a>=mp1) then begin if mp1>m1 then m1:=mp1; mp1 := a; end else if a>m1 then m1:=a; end; end; // writeln('mp0=', mp0, 'm0=', m0); if (mp0 > 0) and (m0 > 0) then begin x := mp0; y := m0; end; // writeln('mp1=', mp1, 'm1=', m1); if (mp1 > 0) and (m1 > 0) and (mp1 + m1 > x + y) then begin x := mp1; y := m1; end; writeln('=', x, ' ', y) end.
Язык Pascal (PascalABC):
Вариант 2:
const p = 19; var n, i, x, k19n, k19chet, n19chet, n19n, m1, m2: integer; begin readln(n); {количество чисел} readln(x); {первое число} // обнуление всех переменных k19chet := 0; // четный кратный n19chet := 0; // четный некратный k19n := 0; // нечетный кратный n19n := 0; // нечетный некратный m1 := 0; m2 := 0; // максимальные // цикл до n - 1, т.к. первое число уже считали for i := 1 to n - 1 do begin // проверка, если четный и кратный if (x mod p = 0) and (x mod 2 = 0) and (x > k19chet) then begin k19chet := x; end; // проверка, если четный и некратный if (x mod p <> 0) and (x mod 2 = 0) and (x > n19chet) then begin n19chet := x; end; // проверка, если нечетный и кратный if (x mod p = 0) and (x mod 2 = 1) and (x > k19n) then begin k19n := x; end; // проверка, если нечетный и некратный if (x mod p <> 0) and (x mod 2 = 1) and (x > n19n) then begin n19n := x; end; readln(x); // считываем очередное число // если x кратно и есть такое некратное n19chet, сумма с которым была бы больше чем m1 + m2 if (x mod p = 0) and ((x + n19chet) mod 2 = 0) and (x + n19chet > m1 + m2) and (n19chet > 0) then begin m1 := x; m2 := n19chet; end; // если x кратно и есть такое некратное n19n, сумма с которым была бы больше чем m1 + m2 if (x mod p = 0) and ((x + n19n) mod 2 = 0) and (x + n19n > m1 + m2) and (n19n > 0) then begin m1 := x; m2 := n19n; end; // если есть такое кратное k19n, сумма с которым была бы четной и больше чем m1 + m2 if ((x + k19n) mod 2 = 0) and (x + k19n > m1 + m2) and (k19n > 0) then begin m1 := x; m2 := k19n; end; // если есть такое кратное k19chet, сумма с которым была бы четной и больше чем m1 + m2 if ((x + k19chet) mod 2 = 0) and (x + k19chet > m1 + m2) and (k19chet > 0) then begin m1 := x; m2 := k19chet; end; end; writeln(m1, ' ', m2) end.
:
p = 19 m0 = m1 = mp0 = mp1 = 0 N = int(input()) for i in range(N): a = int(input()) if a % 2 == 0: if a % p == 0 and a >= mp0: if mp0 > m0: m0 = mp0 mp0 = a elif a > m0: m0 = a else: if a % p == 0 and a >= mp1: if mp1 > m1: m1 = mp1 mp1 = a elif a > m1: m1 = a x = y = 0 if mp0 > 0 and m0 > 0: x = mp0; y = m0 if mp1 > 0 and m1 > 0 and mp1 + m1 > x + y: x = mp1; y = m1 print(x,y)
Ещё один путь решения – записать всю последовательность в массив и анализировать её в несколько проходов. Ниже приводится реализующая такой алгоритм программа на языке C++. В этой программе массив с исходными данными обрабатывается два раза: на первом проходе находятся индексы максимального чётного и нечётного элементов, кратных p, на втором проходе – общие чётный и нечётный максимумы. При этом элементы, выделенные как кратные при первом проходе, во время второго прохода из сравнения исключаются. Такая программа эффективна по времени (несмотря на повторную обработку массива, общее время работы пропорционально N), но неэффективна по памяти. Максимальная оценка за такую программу при отсутствии в ней синтаксических и содержательных ошибок – 3 балла.
С++:
#include <iostream> using namespace std; int main() { const int p = 19; // делитель int N; cin >> N; // количество элементов int a[N]; // элементы последовательности for (int i = 0; i < N; ++i) cin >> a[i]; int imp0 = -1, imp1 = -1; //индексы максимумов, кратных p for (int i = 0; i < N; ++i) { if (a[i] % p == 0) { if (a[i] % 2 == 0) { if (imp0 == -1 || a[i] > a[imp0]) imp0 = i; } else { if (imp1 == -1 || a[i] > a[imp1]) imp1 = i; } } } int im0 = -1, im1 = -1; // индексы общих максимумов for (int i = 0; i < N; ++i) { if (i != imp0 && i != imp1) { if (a[i] % 2 == 0) { if (im0 == -1 || a[i] > a[im0]) im0 = i; } else { if (im1 == -1 || a[i] > a[im1]) im1 = i; } } } int x = 0, y = 0; // пара чисел для ответа if (imp0 != -1 && im0 != -1) { x = a[imp0]; y = a[im0]; } if (imp1 != -1 && im1 != -1 && a[imp1] + a[im1] > x + y) { x = a[imp1]; y = a[im1]; } cout << x << ' ' << y << endl; return 0; }
Запишем все исходные числа в массив, переберём все возможные пары и выберем подходящую. Такое решение не является эффективным ни по памяти (требуемая память зависит от размера исходных данных), ни по времени (количество возможных пар, а значит, количество действий и время счёта с ростом количества исходных элементов растут квадратично). Подобная программа оценивается не выше 2 баллов.
Язык Pascal (версия PascalABC):
const p = 19; var N: integer; {количество чисел} a: array [1..10000] of integer; {исходные данные} x, y: integer; {ответ – пара чисел} i, j: integer; begin readln(N); for i := 1 to N do readln(a[i]); x := 0; y := 0; for i := 1 to N - 1 do begin for j := i + 1 to N do begin if ((a[i] - a[j]) mod 2 = 0) and ((a[i] mod p = 0) or (a[j] mod p = 0)) and (a[i] + a[j] > x + y) then begin x := a[i]; y := a[j] end end end; writeln(x, ' ', y) end.
Выбрать из каждой пары одно число
27_1:
* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!
Задание А (более легкое, чем Б)
Имеется набор данных, состоящий из 5 пар положительных целых чисел. Необходимо выбрать из каждой пары ровно одно число так, чтобы сумма квадратов всех выбранных чисел была нечетной и при этом максимально возможной. Если получить требуемую сумму невозможно, в качестве ответа нужно выдать 0.
Напишите программу для решения этой задачи. В этом варианте задания оценивается только правильность программы, время работы и размер использованной памяти не имеет значения.
Максимальная оценка за правильную программу — 2 балла.
Задание Б (более сложное, чем А)
Имеется набор данных, состоящих из пар положительных целых чисел. Необходимо выбрать из каждой пары ровно одно число так, чтобы сумма квадратов всех выбранных чисел была нечетной и при этом максимально возможной. Если получить требуемую сумму невозможно, в качестве ответа нужно выдать 0.
Напишите программу для решения этой задачи.
Постарайтесь сделать программу эффективной по времени, если время работы программы пропорционально количеству пар чисел N, т.е. при увеличении N в k раз время работы программы должно увеличиваться на более чем в k раз.
Программа считается эффективной по памяти, если размер памяти, использованной в программе для хранения данных, не зависит от числа N и не превышает 1 килобайта.
Максимальная оценка за правильную программу, эффективную по времени и по памяти, — 4 балла.
Как в варианте А, так и в варианте Б программа должна напечатать одно число — максимально возможную сумму, соответствующую условиям задачи (или 0, если такую сумму получить нельзя).
Например: 2 6 4 1 7 3 2 9 7 4 sum=231
✍ Решение:
- поскольку в задании указано, что «имеется набор данных, состоящих из пар…», то введем в программу переменную
n
для количества пар, значение которой будет считываться со стандартного входного потока: - объявим сами числа типа
integer
, переменную цикла —i
— типаinteger
и дополнительные переменные, смысл которых будет объяснен ниже. Объявление сделаем в отдельных строках (так делать не обязательно), чтобы можно было ввести удобно комментарии: - так как в задании не оговаривается, что пары чисел считывается из файла, значит их необходимо считать со стандартного входного потока оператором
readln()
; т.е. организуем цикл:
n:longint; {количество пар чисел};
x,y: integer; {пара чисел} max: integer; {максимальное из пары} min: integer; {минимальное из пары} sum:longint; {сумма квадратов отобранных чисел} min_kvadr:longint; {мин. нечетная разница квадратов max и min} i:integer;
for i:=1 to n do begin readln(x,y); ...
Допустим имеем пары:
2 6 4 1 7 3 2 9 7 4
2 6 4 1 7 3 2 9 7 4
if x>y then begin max:=x; min:=y end else begin max:=y;min:=x end;
2 6 - разница 32 (36 - 4)
4 1 - разница 15 (16 - 1)
7 3 - разница 40 (49 - 9)
2 9 - разница 77 (81 - 4)
7 4 - разница 33 (49 - 16)
if((max-min) mod 2 > 0) and ((sqr(max)-sqr(min)) < min_kvadr) then min_kvadr:=sqr(max) - sqr(min)
min_kvadr:=1073676289; {32 767 * 32 767 (самое большое в типе integer) }
if sum mod 2 = 0 then begin if min_kvadr = 1073676289 then sum := 0 else sum:=sum - min_kvadr end;
Эффективная программа на языке Паскаль (версия Pascal ABC):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
var n:longint; {количество пар чисел} x,y: integer; {пара чисел} max: integer; {максимальное из пары} min: integer; {минимальное из пары} sum:longint; {сумма квадратов отобранных чисел} min_kvadr:longint; {мин. нечетная разница квадратов max и min} i:integer; begin sum:=0; readln(n); min_kvadr:=1073676289; {32 767 * 32 767, самое большое integer} for i:=1 to n do begin readln(x,y); if x>y then begin max:=x; min:=y end else begin max:=y;min:=x end; sum:=sum+sqr(max); if((max-min) mod 2 > 0) and (sqr(max)-sqr(min) < min_kvadr) then min_kvadr:=sqr(max) - sqr(min) end; if sum mod 2 = 0 then begin if min_kvadr = 1073676289 then sum := 0 else sum:=sum - min_kvadr end; writeln('sum=',sum) end. |
Пример работы программы:
3 1 4 2 4 3 4 sum=41
✎ Задание А (более легкое, 2 балла максимум):
- так как в задании указано, что пар чисел ровно 5, то введем в программу константу n=5
Решение на языке Паскаль (версия PascalABC):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
const n = 5; {количество пар чисел} var x,y: longint; {пара чисел} max_sum: longint; {максимальная из сумм} sum:array [1..15]of longint; {суммы квадратов всех комбинаций чисел} i,k:longint; begin readln(x,y); sum[1]:=sqr(x); sum[2]:=sqr(y); k:=3; {счетчик для сумм} for i:=2 to n do begin readln(x,y); sum[k]:=sum[k-2]+sqr(x); {1 шаг: s3=s1+x*x}{2 шаг: s7=s4+x*x} sum[k+1]:=sum[k-2]+sqr(y); {1 шаг: s4=s1+y*y}{2 шаг: s8=s4+y*y} sum[k+2]:=sum[k-1]+sqr(x); {1 шаг: s5=s2+x*x}{2 шаг: s9=s6+x*x} sum[k+3]:=sum[k-1]+sqr(y); {1 шаг: s6=s2+y*y}{2 шаг: s10=s6+y*y} k:=k+4; end; max_sum:=sum[1]; for i:=1 to n*n do if (sum[i]>max_sum) and (sum[i] mod 2 <>0) then max_sum:=sum[i]; if (max_sum=sum[1]) and (max_sum mod 2 = 0) then max_sum:=0; writeln(max_sum) end. |
Предлагаем также посмотреть объяснение данного 27 задания на видео:
📹 YouTube здесь
📹 Видеорешение на RuTube здесь
Набор данных, состоящих из троек чисел
27_2:
* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!
Вам предлагается два задания с похожими условиями: задание А и задание Б. Вы можете решать оба задания или одно из них по своему выбору. Задание Б более сложное, его решение оценивается выше. Итоговая оценка выставляется как максимальная из оценок за задания А и Б.
А. Имеется набор данных, состоящий из 5 троек положительных целых чисел. Необходимо выбрать из каждой тройки ровно одно число так, чтобы сумма всех выбранных чисел не делилась на 5 и при этом была минимально возможной. Если получить требуемую сумму невозможно, в качестве ответа нужно выдать 0.
Напишите программу для решения этой задачи. В этом варианте задания оценивается только правильность программы, время работы и размер использованной памяти не имеют значения.
Максимальная оценка за правильную программу — 2 балла.
Б. Имеется набор данных, состоящий из троек положительных целых чисел. Необходимо выбрать из каждой тройки ровно одно число так, чтобы сумма всех выбранных чисел не делилась на 5 и при этом была минимально возможной. Если получить требуемую сумму невозможно, в качестве ответа нужно выдать 0.
Постарайтесь сделать программу эффективной по времени и по используемой памяти.
Программа считается эффективной по времени, если время работы программы пропорционально количеству чисел N, т.е. при увеличении N в k раз время работы программы должно увеличиваться не более чем в k раз.
Программа считается эффективной по памяти, если размер памяти, использованной в программе для хранения данных, не зависит от числа N и не превышает 1 килобайта.
Максимальная оценка за правильную программу, эффективную по времени и по памяти, — 4 балла.
Как в варианте А, так и в варианте Б программа должна напечатать одно число — минимально возможную сумму, соответствующую условиям задачи (или 0, если такую сумму получить нельзя).
Напоминаем! не забудьте указать, к какому заданию относится каждая из представленных Вами программ.
Перед текстом программы кратко опишите Ваш алгоритм решения, укажите использованный язык программирования и его версию.
Входные данные
Для варианта А на вход программе подается 5 строк, каждая из которых содержит три натуральных числа, не превышающих 10000.
Пример входных данных для варианта А:
1 3 2 2 1 2 2 5 1 1 3 4 6 1 1
Для варианта Б на вход программе в первой строке подается количество троек чисел N (1<=N<=100000). Каждая из следующих N строк содержит три натуральных числа, не превышающих 10000.
Пример входных данных для варианта Б:
5 1 3 2 2 1 2 2 5 1 1 3 4 6 1 1
Пример выходных данных для приведенных выше примеров входных данных:
6
Типовые задания для тренировки
✍ Решение:
Чтобы получить минимально возможную сумму, будем брать из каждой тройки наименьшее число. Если полученная при этом сумма будет кратна 5, ее придется увеличить. Для этого достаточно в одной из троек, где хотя бы два числа имеют разные остатки при делении на 5, заменить ранее выбранное число на число с другим остатком от деления на 5 из той же тройки. При этом модуль разности между прежним и новым, выбранным из тройки, должен быть минимально возможным.
Пример правильной и эффективной программы для задания Б на языке Паскаль (версия PascalABC):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
const aMax = 10000;{наибольшее возможное исходное число} var N: longint; {количество троек} a, b, c, tmp: longint;{тройка чисел} s: longint;{сумма выбранных чисел} D_min: longint;{мин. разница в тройке не кратная 5} i: longint;{} begin s := 0; D_min := aMax + 1; readln(N); for i := 1 to N do begin readln(a, b, c); if (a > b) then begin tmp := a;a := b;b := tmp end; if(b > c) then begin tmp := b;b := c;c := tmp; if (a > b) then begin tmp := a;a := b;b := tmp end end; {a,b,c отсортированы по возрастанию} s := s + a; if((b - a) mod 5 > 0 ) and ((b - a) < D_min) then D_min := b - a; if((c - a) mod 5 > 0 ) and ((c - a) < D_min) then D_min := c - a end; if s mod 5 = 0 then begin if D_min > aMax then s := 0 else s := s + D_min end; writeln(s) end. |
✎ Задание А (2 балла)
В цикле перебираются все возможные суммы, и среди них ищется удовлетворяющая условию.
На языке Паскаль (версия PascalABC):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
var a: array[1..5, 1..3] of longint; i1, i2, i3, i4, i5: longint; s, sMin: longint; begin for i1 := 1 to 5 do readln(a[i1, 1], a[i1, 2], a[i1, 3]); sMin := 100000; for i1 := 1 to 3 do for i2 := 1 to 3 do for i3 := 1 to 3 do for i4 := 1 to 3 do for i5 := 1 to 3 do begin s := a[1, i1] + a[2, i2] + a[3, i3] + a[4, i4] + a[5, i5]; if (s mod 5 = 0) and (s < sMin) then sMin := s end; if (sMin = 100000) then sMin := 0; writeln(sMin) end. |
Анализ пар, находящихся на расстоянии
27_3: Разбор 27 задания демоверсии 2019 года (ФИПИ):
* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!
На вход программы поступает последовательность из N целых положительных чисел, все числа в последовательности различны. Рассматриваются все пары различных элементов последовательности, находящихся на расстоянии не меньше чем 4 (разница в индексах элементов пары должна быть 4 или более, порядок элементов в паре неважен).
Необходимо определить количество таких пар, для которых произведение элементов делится на 29.
Описание входных и выходных данных:
В первой строке входных данных задаётся количество чисел N (4 ≤ N ≤ 1000). В каждой из последующих N строк записано одно целое положительное число, не превышающее 10 000.
В качестве результата программа должна вывести одно число: количество пар элементов, находящихся в последовательности на расстоянии не меньше чем 4, в которых произведение элементов кратно 29.
Пример входных данных:
7 58 2 3 5 4 1 29
Пример выходных данных для приведённого выше примера входных данных:
5
Из 7 заданных элементов с учётом допустимых расстояний между ними можно составить 6 произведений:
58·4 = 232 :29=8 58·1 = 58 :29=2 58·29 = 1682 :29=58 2·1 = 2 2·29 = 58 :29=2 3·29 = 87 :29=3
Из них на 29 делятся 5 произведений.
Требуется написать эффективную по времени и памяти программу для решения описанной задачи.
✍ Решение:
* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!
✎ Программа на языке Паскаль (версия PascalABC). Программа неэффективна ни по времени, ни по памяти (2 балла):
- Перебор всех вариантов произведений:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
const s = 4;//требуемое расстояние var n, i, j, cnt: integer; a: array[1..1000] of integer; begin readln(n); cnt := 0; for i := 1 to n do readln(a[i]); for i := 1 to n - s do for j := i + s to n do if a[i] * a[j] mod 29 = 0 then cnt := cnt + 1; writeln(cnt) end. |
✎ Программа на языке Паскаль (версия PascalABC). Программа эффективна и по времени, и по памяти (4 балла):
- Если один из сомножителей делится без остатка на 29, то произведение с любым другим сомножителем тоже будет делится на 29.
- Последние рассматриваемые 4 элемента можно хранить как 4 счётчика: количество делящихся на 29 среди всех считанных чисел, всех считанных чисел без последнего, всех считанных чисел без 2 последних, всех считанных чисел без 3 последних, – и также сдвигать их после очередного шага.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
const s = 4;//требуемое расстояние var n,i: integer; n1, n2, n3, n4: integer; //хранение последних s счетчиков a_: integer; //очередное значение cnt: integer;//количество искомых пар begin readln(n); n1 := 0;n2 := 0;n3 := 0;n4 := 0; cnt := 0; for i := 1 to n do begin readln(a_); // очередное значение if i > s then if a_ mod 29 = 0 then cnt := cnt + (i - s) else cnt := cnt + n4; // сдвигаем элементы счетчика n4 := n3; n3 := n2; n2 := n1; // обновляем счетчик кратных 29 if a_ mod 29 = 0 then n1 := n1 + 1; end; writeln(cnt) end. |
Смотрите видео разбора демоверсии 2019 года задание 27:
📹 YouTube здесь
Видео на RuTube здесь
27_5:
* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!
Датчик передаёт каждую секунду по каналу связи неотрицательное целое число, не превосходящее 1000, — текущий результат измерений. Временем, в течение которого происходит передача, можно пренебречь.
Необходимо найти в заданной серии показаний датчика минимальное чётное произведение двух показаний, между моментами передачи которых прошло не менее 8 секунд. Если получить такое произведение не удаётся, ответ считается равным -1. Общее количество показаний датчика в серии не превышает 10 000.
Вам предлагаются два задания, связанных с этой задачей: задание А и задание Б. Вы можете решать оба задания или одно из них по своему выбору.
Итоговая оценка выставляется как максимальная из оценок за задания А и Б. Если решение одного из заданий не представлено, то считается, что оценка за это задание — 0 баллов.
Задание Б является усложнённым вариантом задания А, оно содержит дополнительные требования к программе.
А. Напишите на любом языке программирования программу для решения поставленной задачи, в которой входные данные будут запоминаться в массиве, после чего будут проверены все возможные пары элементов. Перед программой укажите версию языка программирования.
ОБЯЗАТЕЛЬНО укажите, что программа является решением ЗАДАНИЯ А. Максимальная оценка за выполнение задания А — 2 балла.
Б. Напишите программу для решения поставленной задачи, которая будет эффективна как по времени, так и по памяти (или хотя бы по одной из этих характеристик). Программа считается эффективной по времени, если время работы программы пропорционально количеству полученных показаний прибора N, т. е. при увеличении N в k раз время работы программы должно увеличиваться не более чем в k раз. Программа считается эффективной по памяти, если размер памяти, использованной в программе для хранения данных, не зависит от числа А и не превышает 1 килобайта.
Перед программой укажите версию языка программирования и кратко опишите использованный алгоритм.
ОБЯЗАТЕЛЬНО укажите, что программа является решением ЗАДАНИЯ Б. Максимальная оценка за правильную программу, эффективную по времени и по памяти, — 4 балла.
Максимальная оценка за правильную программу, эффективную по времени, но неэффективную по памяти, — 3 балла.
Пример входных данных:
10 5 4 3 2 1 6 7 8 9 4
Программа должна вывести одно число — описанное в условии произведение, либо -1, если получить такое произведение не удаётся.
Пример выходных данных для приведённого выше примера входных данных:
16
✍ Решение:
* Учтите, что в данных заданиях более не требуется учитывать эффективность алгоритма (с 2021 года)!
-
✎ Задание А (решение на языке Паскаль, версия pascalABC):
Ниже приводится пример переборного решения на Паскале, неэффективного ни по памяти, ни по времени, но являющегося правильным ответом на задание А.
const s = 8;{требуемое расстояние между показаниями} var N: integer; a: array[1..10000] of integer; {все показания датчика} mp: integer; {минимальное значение произведения} i, j: integer; begin readln(N); {Ввод значений датчика} for i := 1 to N do readln(a[i]); mp := 1000 * 1000 + 1; for i := 1 to N - s do begin for j := i + s to N do begin if (a[i] * a[j] mod 2 = 0) and (a[i] * a[j] < mp) then mp := a[i] * a[j] end; end; if mp = 1000 * 1000 + 1 then mp := -1; writeln(mp) end.
✎Задание Б (решение на языке Паскаль, версия pascalABC):
Чтобы произведение было чётным, хотя бы один сомножитель должен быть чётным, поэтому при поиске подходящих произведений чётные показания прибора можно рассматривать в паре с любыми другими, а нечётные — только с чётными.
Для каждого показания с номером k, начиная с k = 9, рассмотрим все допустимые по условиям задачи пары, в которых данное показание получено вторым. Минимальное произведение из всех этих пар будет получено, если первым в паре будет взято минимальное подходящее показание среди всех, полученных от начала приёма и до показания с номером k — 8. Если очередное показание чётное, минимальное среди предыдущих может быть любым, если нечётное — только чётным.
Для получения эффективного по времени решения нужно по мере ввода данных помнить абсолютное минимальное и минимальное чётное показание на каждый момент времени, каждое вновь полученное показание умножать на соответствующий ему минимум, имевшийся на 8 элементов ранее, и выбрать минимальное из всех таких произведений. Ниже приводится пример такой программы на Паскале, эффективной по памяти и по времени.
const s = 8; {требуемое расстояние между показаниями} amax = 1001;{больше максимально возможного показания} var N: integer; a: array[1..s] of integer; {хранение s показаний датчика} a_: integer; {ввод очередного показания} ma: integer; {минимальное число без s последних} me: integer; {минимальное чётное число без s последних} mp: integer; {минимальное значение произведения} p: integer; i, j: integer; begin readln(N); {Ввод первых s чисел} for i := 1 to s do readln(a[i]); {Ввод остальных значений, поиск минимального произведения} ma := amax;me := amax;mp := amax * amax; for i := s + 1 to N do begin readln(a_); if a[1] < ma then ma := a[1]; if (a[1] mod 2 = 0) and (a[1] < me) then me := a[1]; if a_ mod 2 = 0 then p := a_ * ma else if me < amax then p := a_ * me else p := amax * amax; if (p < mp) then mp := p; {сдвигаем элементы вспомогательного массива влево} for j := 1 to s - 1 do a[j] := a[j + 1]; a[s] := a_ end; if mp = amax * amax then mp := -1; writeln(mp) end.
Как начать программировать и поможет ли это на ЕГЭ по информатике
Теперь ЕГЭ по информатике выпускники сдают в компьютерной форме, а это значит, что и в процессе подготовки их ждет немало изменений.
Как связаны программирование и подготовка к ЕГЭ по информатике
Некоторые задания из ЕГЭ по информатике 2022 (номера 8, 11, 19, 20, 21, 24, 25 и 27) требуют знаний одного из языков программирования и минимальных навыков работы с ним. В первых из перечисленных заданий проверяется умение выпускников понимать и анализировать текст программы, в 25 задаче нужно самостоятельно написать фрагмент программы, в 27 — законченную программу.
В формулировках заданий перечислены следующие языки программирования: Basic, Pascal, C/C++, Алгоритмический язык, Python, Естественный язык. Выбор языка программирования не влияет на оценку, несмотря на то, что на каком-то из них программа может получиться длиннее, а на другом короче. Эксперты в области подготовки к ЕГЭ по информатике говорят, что за все время их деятельности на экзамене еще ни разу не попалось задание, которое нельзя было бы выполнить, например, с использованием Basic.
Как решать задачи на программирование при подготовке
Прежде чем приступать к решению задач, нужно разобраться с теоретической частью. Для того, чтобы успешно выполнять задания и получить высокие баллы, вам необходимо разбираться в:
- синтаксисе используемого языка программирования,
- алгоритмических конструкциях,
- работе со строками и символами,
- работе с массивами,
- базовых алгоритмах программ,
- составных типах данных.
Приступая к практической части подготовки, в первую очередь решите демонстрационную версию экзамена (можно даже на специальной онлайн-платформе, где КИМ будет выглядеть ровно так, как компьютерная версия самого ЕГЭ) и посмотрите, какие задания вам даются легко, какие вызывают небольшие трудности, а с какими вы совсем не можете справиться. Такое распределение задач по категориям поможет вам лучше организовать подготовку, расставить приоритеты и повысить эффективность практики.
После этого обязательно изучите критерии и постарайтесь понять, что именно от вас хотят увидеть проверяющие, на что нужно обратить внимание при выполнении заданий и какие условия нужно соблюдать.
И только после этого начинайте практиковаться. Лучше делать это каждый день, а также привлечь к подготовке человека, который в этом хорошо разбирается — репетитора или куратора онлайн-школы. Он поможет вам прояснить непонятные моменты и научит находить ошибки.
Какой язык программирования выбрать для сдачи ЕГЭ по информатике в 2022 году
В большинстве школ языкам программирования уделяется не так много времени, а где-то о них и не упоминают, поэтому ученикам приходится брать на себя целых две сложных и важных задачи:
- выбрать язык(и) программирования для ЕГЭ по информатике,
- научиться с ними работать.
Сейчас посмотрим, какие языки программирования выпускники выбирают чаще всего и какие из них лучше для подготовки к ЕГЭ по информатике 2022.
- Pascal
Даже если в вашей школе информатика преподавалась “для галочки”, об этом языке вы уж точно слышали. Несмотря на то, что Паскаль является устаревшим языком программирования и не используется разработчиками в крупных компаниях, для ЕГЭ он вполне подойдет.
С использованием Паскаля можно решить все базовые задания на программирование, хотя выполнение более сложных задач, скорее всего, получится не совсем удобным и весьма громоздким.
Этот язык пользуется наибольшей популярностью среди выпускников, несмотря на то, что написание программ на нем — не самое быстрое. Если у вас медленный темп работы, то в целях экономии времени на ЕГЭ по информатике 2022 лучше выбрать другой язык программирования, тем более, что в большинстве заданий проверяются ответы, а не написание программ.
- Python
Питон совсем недавно вошел в список разрешенных языков программирования для ЕГЭ по информатике, поэтому для многих (в том числе проверяющих) он покажется непривычным. Однако этот язык почти идеально подходит под формат экзамена: он быстрый, на нем можно решить 18 заданий из 27, он имеет простой синтаксис.
- Другие варианты
Вы можете выбрать другой язык программирования, например, C или Basic, которые также рекомендуют многие преподаватели. Однако здесь могут возникнуть две сложности: это усложнит подготовку, так как в большинстве методических материалов по подготовке используются первые три языка из нашего списка, а также может случиться такое, что эксперт, проверяющий работу, не будет знать выбранный вами язык (это, конечно, не ваша проблема, но неприятные ситуации могут возникнуть).
При выборе языка программирования для ЕГЭ по информатике 2022 мы советуем руководствоваться именно легкостью, распространенностью языка и быстротой использования. Самое важное — чтобы он помог вам решить задания из КИМа, а все остальное уже второстепенно.
Какие языки программирования нужны для егэ по информатике
Для тех, кому предстоит готовиться для поступления на бюджет
Более 100 выпускников уже воспользовались моими рекомендациями и не пожалели
Для тех, кому предстоит готовиться для поступления на бюджет
Более 100 выпускников уже воспользовались моими рекомендациями и не пожалели
Я преподаватель программирования в университете и учитель информатики в гимназии
В 2020 году закочила Школу анализа данных Яндекса
Часто участвую в конференциях и мастер-классах от IT-компаниий, постоянно прохожу курсы повышения квалификации
Являюсь членом жюри олимпиады по информатике и организатором перечневых олимпиад
Подготовила 7 столбалльников по информатике
В среднем выпускники моих годовых курсов получают на ЕГЭ 81 балл, а выпускники 11 класса в гимназии — 86 баллов
Кроме подготовки к экзамену я рассказываю о том как устроен современный мир компьютерных наук, а также помогаю разобраться IT-профессях и вузах
Всё, что нужно знать о ЕГЭ по информатике
Разные вузы требуют разные вступительные экзамены по IT-направлениям. Где-то нужно сдавать физику, где-то – информатику. К какому экзамену готовиться – решать вам, но стоит иметь в виду, что конкурс на специальности, где надо сдавать физику, обычно ниже, чем на специальностях, где требуется ЕГЭ по информатике, т.е. вероятность поступить «через физику» больше.
Зачем тогда сдавать ЕГЭ по информатике?
- К нему быстрее и проще подготовиться, чем к физике.
- Вы сможете выбирать из большего количества специальностей.
- Вам будет легче учиться по выбранной специальности.
Что нужно знать о ЕГЭ по информатике
ЕГЭ по информатике состоит из двух частей. В первой части 23 задачи с кратким ответом, во второй – 4 задачи с развёрнутым ответом. В первой части экзамена 12 заданий базового уровня, 10 заданий повышенного уровня и 1 задание высокого уровня. Во второй части – 1 задание повышенного уровня и 3 – высокого.
Решение задач из первой части позволяет набрать 23 первичных балла – по одному баллу за выполненное задание. Решение задач второй части добавляет 12 первичных баллов (3, 2, 3 и 4 балла за каждую задачу соответственно). Таким образом, максимум первичных баллов, которые можно получить за решение всех заданий – 35.
Первичные баллы переводятся в тестовые, которые и являются результатом ЕГЭ. 35 первичных баллов = 100 тестовым баллам за экзамен. При этом за решение задач из второй части экзамена начисляется больше тестовых баллов, чем за ответы на задачи первой части. Каждый первичный балл, полученный за вторую часть ЕГЭ, даст вам 3 или 4 тестовых балла, что в сумме составляет около 40 итоговых баллов за экзамен.
Это означает, что при выполнении ЕГЭ по информатике необходимо уделить особое внимание решению задач с развёрнутым ответом: №24, 25, 26 и 27. Их успешное выполнение позволит набрать больше итоговых баллов. Но и цена ошибки во время их выполнения выше – потеря каждого первичного балла чревата тем, что вы не пройдёте по конкурсу, ведь 3-4 итоговых балла за ЕГЭ при высокой конкуренции на IT-специальности могут стать решающими.
Как готовиться к решению задач из первой части
- Уделите особое внимание задачам № 9, 10, 11, 12, 15, 18, 20, 23. Именно эти задачи, согласно анализу результатов прошлых лет, особенно сложны. Трудности с решением этих задач испытывают не только те, у кого общий балл за ЕГЭ по информатике получился низким, но и «хорошисты», и «отличники».
- Выучите наизусть таблицу степеней числа 2.
- Помните о том, что Кбайты в задачах означают кибибайты, а не килобайты. 1 кибибайт = 1024 байта. Это поможет избежать ошибок при вычислениях.
- Тщательно изучите варианты ЕГЭ предыдущих лет. Экзамен по информатике — один из самых стабильных, это означает, что для подготовки можно смело использовать варианты ЕГЭ за последние 3-4 года.
- Познакомьтесь с разными вариантами формулировки заданий. Помните о том, что незначительное изменение формулировки всегда приводят к ухудшению результатов экзамена.
- Внимательно читайте условие задачи. Большинство ошибок при выполнении заданий связано с неверным пониманием условия.
- Учитесь самостоятельно проверять выполненные задания и находить ошибки в ответах.
Что нужно знать о решении задач с развёрнутым ответом
24 задача — на поиск ошибки
25 задача требует составления простой программы
26 задача — на теорию игр
27 задача — необходимо запрограммировать сложную программу
Основную трудность на экзамене представляет 27 задача. Ее решает только 60-70% пишущих ЕГЭ по информатике. Ее особенность заключается в том, что к ней невозможно подготовиться заранее. Каждый год на экзамен выносится принципиально новая задача. При решении задачи №27 нельзя допустить ни одной смысловой ошибки.
Как рассчитывать время на экзамене
Ориентируйтесь на данные, которые приведены в спецификации контрольных измерительных материалов для проведения ЕГЭ по информатике. В ней указано примерное время, отведенное на выполнение заданий первой и второй части экзамена.
ЕГЭ по информатике длится 235 минут
Из них 90 минут отводится на решение задач из первой части. В среднем на каждую задачу из первой части уходит от 3 до 5 минут. На решение задачи №23 требуется 10 минут.
Остается 145 минут на решение заданий второй части экзамена, при этом для решения последней задачи №27 понадобится не менее 55 минут. Эти расчеты выполнены специалистами Федерального института педагогических измерений и основаны на результатах экзаменов прошлых лет, поэтому к ним следует отнестись серьезно и использовать в качестве ориентира на экзамене.
Языки программирования – какой выбрать
- BASIC. Это устаревший язык, и хотя его до сих пор изучают в школах, тратить время на его освоение уже нет смысла.
- Школьный алгоритмический язык программирования. Он разработан специально для раннего обучения программированию, удобен для освоения начальных алгоритмов, но практически не содержит глубины, в нем некуда развиваться.
- Pascal. По-прежнему является одним из самых распространённых языков программирования для обучения в школах и вузах, но и его возможности сильно ограничены. Pascal вполне подходит в качестве языка написания ЕГЭ.
- С++. Универсальный язык, один из самых быстрых языков программирования. На нём сложно учиться, зато в практическом применении его возможности очень широки.
- Python. Его легко изучать на начальном уровне, единственное, что требуется – знание английского языка. Вместе с тем, при углубленном изучении Python предоставляет программисту не меньше возможностей, чем С++. Начав изучение «Питона» ещё в школе, вы будете использовать его и в дальнейшем, вам не придётся переучиваться на другой язык, чтобы достичь новых горизонтов в программировании. Для сдачи ЕГЭ достаточно знать «Питон» на базовом уровне.
Полезно знать
- Работы по информатике оценивают два эксперта. Если результаты оценки экспертов расходятся на 1 балл, выставляется больший из двух баллов. Если расхождение 2 балла и более – работу перепроверяет третий эксперт.
- Полезный сайт для подготовки к ЕГЭ по информатике – сайт Константина Юрьевича Полякова.
- На сайте ФИПИ выложены кодификатор элементов содержания и требований к уровню подготовки для проведения ЕГЭ по информатике, а также спецификация контрольных измерительных материалов для проведения ЕГЭ по информатике. В этих документах можно найти перечень разделов курса информатики, который проверяется на ЕГЭ, а также список необходимых для сдачи экзамена знаний и умений.
- На этом же сайте можно найти методические рекомендации для учителей с анализом результатов ЕГЭ разных лет и обучающие материалы для экспертов ЕГЭ по информатике с критериями оценивания задач.
Хотите получать новые статьи во «Вконтакте»?
Подпишитесь на рассылку полезных статей
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter
В отличие от бланковой модели экзамена, в 2021 году выполнение заданий по программированию допускается на языках программирования (семействах языков): С++, Java, C#, Pascal, Python, Школьный алгоритмический язык. Продолжительность экзамена останется прежней и составит 3 часа 55 минут.
Какие языки программирования будут на ЕГЭ 2021?
В отличие от письменной модели экзамена, в этом году выполнение заданий по программированию допускается на языках программирования: С++, Java, C#, Pascal, Python, школьный алгоритмический язык.
Какие среды программирования будут на ЕГЭ?
Список языков программирования указан в спецификации КИМ ЕГЭ по информатике и ИКТ 2021 года, размещенной на сайте Федерального института педагогических измерений. Выполнение заданий по программированию допускается на языках С++, Java, C#, Pascal, Python, Школьный алгоритмический язык.
Какой язык программирования учить для Огэ?
Если предстоит изучать язык программирования «с нуля», для сдачи ОГЭ подойдёт «КуМир», с прицелом на будущее лучше освоить Python. В первой части экзамена лучше решать всё по порядку и записывать ответы прямо в КИМ. Перед тем как сдавать работу, нужно всё перепроверить и перенести правильные ответы в бланк.
Какие среды программирования будут на ЕГЭ 2021?
В отличие от бланковой модели экзамена, в 2021 года выполнение заданий по программированию допускается на языках программирования (семействах языков) С++, Java, C#, Pascal, Python, Школьный алгоритмический язык.
Для чего используется псевдокод?
Главная цель использования псевдокода — обеспечить понимание алгоритма человеком, сделать описание более воспринимаемым, чем исходный код на языке программирования. Псевдокод широко используется в учебниках и научно-технических публикациях, а также на начальных стадиях разработки компьютерных программ.
Какой самый простой язык программирования?
6 самых простых языков программирования для начинающих
- Слово «Легко»
- JavaScript.
- Рубин на рельсах
- питон
- Джава
- C / C ++
- C #
- Заключительные мысли о программировании интро
Когда будут результаты ЕГЭ 2021?
Рассказываем, когда будут известны результаты ЕГЭ-2021
Экзамен | Дата экзамена | Официальный день объявления результатов (не позднее указанной даты) |
---|---|---|
Обществознание | 15.06 (вт) | 30.06 (ср) |
Биология | 18.06 (пт) | 05.07 (пн) |
Иностранные языки (письменно) | 18.06 (пт) | 7.07 (ср) |
Иностранные языки (устно) | 21.06 (пн) | 7.07 (ср) |
Можно ли пользоваться компьютером на ЕГЭ по информатике?
Компьютером можно пользоваться на протяжении всего экзамена, а задания выполнять в любом порядке и возвращаться к ним.
Какие самые легкие предметы для сдачи ОГЭ?
Иностранный язык, география и информатика длятся 135 минут. Именно по продолжительности экзамена самые легкие предметы для сдачи ОГЭ — география, информатика и иностранный язык.
Для чего нужен алгоритмический язык?
Алгоритми́ческий язык — формальный язык, используемый для записи, реализации или изучения алгоритмов. Всякий императивный язык программирования является алгоритмическим языком, но не всякий алгоритмический язык пригоден для использования в качестве языка программирования.
Как проходит экзамен по информатике ОГЭ?
Структура ОГЭ
Экзамен состоит из двух частей, включающих в себя 20 заданий. Часть 1: 18 заданий (1–18) с кратким ответом. Записывается в виде цифры, последовательности цифр или букв. Часть 2: два задания (19, 20) для выполнения на компьютере.
Какие программы разрешены на ЕГЭ по информатике?
Теперь программировать разрешается на языках: C++, C#, Pascal, Python, Java, Школьный алгоритмический язык. Что касается содержания заданий, то 9 из них новые и выполняются на компьютере, а 18 полностью повторяют задания прошлых лет. Изменилась и система оценивания заданий.
Как посмотреть баллы ЕГЭ?
Узнать результаты ЕГЭ по каждому предмету ученики могут в учебном учреждении или на портале Госуслуг. Для проверки результатов через портал укажите данные паспорта (имя, фамилию, отчество, номер) или код регистрации ЕГЭ.
Технология программирования
Чтение короткой (30±50 строк) простой программы на алгоритмическом языке (языке программирования)
Запись алгоритма в словесной форме, в виде блок-схемы или на псевдокоде должна быть точна настолько, чтобы позволить исполнителю правильно выполнить алгоритм, при этом изображение команд произвольное. При решении любой задачи на компьютере предполагается, что некоторая информация подвергается обработке по предварительно составленной инструкции, называемой программой. Язык, на котором записывается алгоритм для исполнения компьютером, называется языком программирования. Языки программирования принадлежат к формальным языкам. При записи алгоритма на языке программирования все правила языка должны строго выполняться. Программа — это алгоритм, записанный на языке программирования.
Для записи программ используется конечный набор символов, составляющих алфавит языка программирования. В отличие от привычных алфавитов (например, русского) алфавит языка программирования включает в себя, кроме букв, цифры, знаки препинания, знаки арифметических действий и некоторые другие дополнительные символы. Программа записывается в виде последовательности символов из алфавита своего языка программирования. Естественно, что не любой текст, составленный из символов алфавита, будет правильной программой. Как и в естественных языках, правильность построения программы из символов алфавита можно проверить, используя синтаксис языка программирования.
Синтаксис языка программирования — это набор правил, которые определяют способы построения правильных программ из символов алфавита. Зная синтаксис языка, можно построить алгоритм, который определяет, является ли данный текст правильной программой или нет. Этот алгоритм позволяет компьютеру проверять синтаксическую правильность вводимых в него программ.
Должна быть определена и семантика языка программирования. Семантика языка программирования — это набор правил, по которым исполнитель выполняет программы на этом языке. Пользуясь семантикой языка, можно однозначно определить результат выполнения программы с заданными входными данными.
При чтении программы необходимо сначала определить, к какому виду она относится. Условно программы можно разделить на два вида: простая программа без использования подпрограмм (кроме стандартных процедур вводавывода) и программа, использующая подпрограммы (подалгоритмы). Такая программа может включать в свою структуру как стандартные подпрограммы, так и подпрограммы, написанные пользователем.
Для чтения простой программы необходимо выяснить:
- что является входными данными и как они вводятся в программу;
- какие действия последовательно выполняются с помощью каждого функционального узла программы (операторов), т. е. рассмотреть пошаговое выполнение операторов, при этом обратить внимание на роль вспомогательных переменных, массивов и т.д.;
- что является результаты работы программы;
- каковы ограничения по работе алгоритма.
При чтении программы, использующей подпрограммы, необходимо сначала проанализировать, что и как выполняют подпрограммы, каковы их входные и выходные параметры. Затем в основной программе вызовы каждой из подпрограмм рассматривать уже как результат работы соответствующего подалгоритма.
Существенно облегчает чтение программ наличие комментариев — поясняющего текста. Комментарии можно добавлять в любое место программы. Наличие комментариев — обязательное условие хорошо и грамотно написанной программы.
Примеры чтения программ на языках Pascal, QBASIC
Примечание. В приведенных примерах программа приводится для двух языков программирования. В зависимости от того, какой язык программирования изучается, и следует рассматривать ее вариант записи и соответствующие пояснения.
Пример 1. Дана программа на двух языках программирования. Определить, какую задачу она решает.
Решение. Проанализируем тексты программы:
- формируется тело программы и описываются переменные;
- вводятся натуральные числа М и N, причем проверяется условие корректности ввода: числа должны быть положительные. Если введенные значения не удовлетворяют условию, то ввод повторяют, пока условие не будет выполнено;
- выбирается наименьшее значение из М и N, результат записывается в K;
- NOD присваивается значение 1;
- в цикле от двух до K генерируется число I;
- тело цикла — в условном операторе проверяется, является ли значение переменной I одновременно делителем М и N. Если условие выполняется, то текущее значение I сохраняется в переменной NOD; если условие не выполняется, NOD не изменит своего значения;
- после перебора всех значений I в NOD или запишется наибольший делитель двух чисел М и N, или останется значение 1;
- последний оператор программы служит для вывода результата работы программы — значения переменной NOD.
Переменные, используемые в программе:
N, М — исследуемые числа;
I — переменная цикла;
NOD — наибольший общий делитель;
К — наименьшее из М и N.
Ответ: данная программа позволяет определить для двух чисел М и N их наибольший общий делитель NOD.
Примечание. Эту же задачу можно решить, используя алгоритм Евклида.
Пример 2. Дана программа на двух языках программирования. Определить, какую задачу она решает.
Решение. Проанализируем тексты программы:
- формируется тело программы, описываются переменные и одномерный массив MAS целого типа (для Pascal целый массив длиной 100);
- вводится фактическая длина массива N с проверкой на положительное значение N;
- вводится значение первого элемента массива MAS;
- устанавливается начальное значение МАХ по первому элементу массива;
- переменной К присваивается значение 1;
- последовательно, в цикле, просматриваются вводимые элементы массива, и если очередной элемент MAS(I) больше или равен МАХ, то переписывается значение MAS(I) в МАХ и в переменной К запоминается I;
- выводятся результаты: МАХ — значение максимального элемента массива и К — номер максимального элемента в исходном массиве (если таких элементов несколько, выведется номер самого правого максимума).
Переменные, используемые в программе:
MAS — массив чисел;
N — размер массива;
I — переменная цикла;
МАХ — значение наибольшего элемента;
К — номер наибольшего элемента.
Ответ: программа написана для поиска значения максимального элемента массива и его номера (если таких элементов несколько, то будет найден номер самого правого максимума).
Пример 3. Дана программа на двух языках программирования. Определить, какую задачу она решает.
Решение. Проанализируем тексты программы:
- формируется тело программы и описываются переменные;
- вводится строка символов S;
- определяется длина строки, значение которой заносится в переменную L;
- в цикле осуществляется замена ‘!’ на ‘.’ в исходной строке;
- выводится преобразованная строка.
Переменные, используемые в программе:
I — переменная цикла;
L — длина строки;
S — строка текста.
В программе на языке Pascal используется встроенная функция языка:
Length(STR) — она определяет фактическую длину строки STR (длина строки не более 256 символов).
В программе на языке QBASIC используются встроенные функции:
Len(X) — определяет фактическую длину строки X (длина строки не более 256 символов);
M1D$(X$, N, M) — выделяет M символов, начиная с N-го символа в символьном выражении X$ (M можно опустить).
Ответ: данная программа позволяет заменить во введенной строке символов все восклицательные знаки на точки.
Пример 4. Дана программа на двух языках программирования. Определить, какую задачу она решает.
Решение. Проанализируем текст программы на языке Pascal:
- формируется тело программы и описываются переменные;
- вводится строка STR и дублируется во вспомогательной переменной S1;
- определяется местоположение первой точки в тексте; если точка есть, то из S1 вырезается текст до нее;
- ищется вторая точка; если она есть, то из S1 вырезается текст после нее;
- в зависимости от присутствия точек результат выводится на экран.
Используемые переменные:
I — номер позиции, которая соответствует точке;
STR — строка текста;
S1 — вспомогательная переменная.
В данной программе используются встроенные функции языка Pascal:
Pos(S1, S2) — поиск подстроки S1 в строке S2 ;
Delete(S, N, M) — удаление из строки S M символов, начиная с позиции N;
Copy(S, N, M) — выделение подстроки из M символов, которые располагаются в строке S начиная с позиции N.
Проанализируем текст программы на языке QBASIC:
- формируется тело программы, и описываются переменные;
- вводится строка символов S;
- определяется местоположение первой точки в тексте — М1;
- ищется вторая точка в строке (поиск начинается с символа М1 + 1); если в строке есть две точки, то на экран выводится текст, находящийся между двумя точками, если нет — сообщение «В тексте нет двух точек».
Используемые переменные:
S — строка текста;
Ml, M2 — номера позиций двух точек; если точек нет, то значения Ml и М2 равны нулю.
В данной программе используются встроенные функции языка:
INSTR(N, X$, Y$) — поиск подстроки Y в строке X, начиная с N-го символа (N можно опустить);
MID$(X$, N, M) — выделение M символов, начиная с N-го символа в символьном выражении X$ (M можно опустить).
Ответ: данная программа из заданной строки символов выделяет подстроку между первой и второй точкой.
Пример 5. Проанализировать тексты программы.
Решение.
- Формируется тело программы и описываются переменные и двумерный массив MАS;
- вводится фактический размер массива MAS и значения его элементов;
- просматриваются строки массива справа налево, находиться минимальный элемент в строке и запоминаются значения индексов (номер столбца) этого элемента;
- для каждой строки выводится значение и местоположение самого правого минимального элемента.
Используемые переменные:
MAS — двумерный массив;
N, M — количество строк и столбцов массива;
I, J — переменные цикла;
JM — столбец минимального элемента для данной строки;
MIN — текущий минимум.
Ответ: программа решает задачу поиска в каждой строке двумерной матрицы минимального элемента и его координат. Если таких элементов в строке несколько, то выводится значение и координаты самого правого элемента.
Поиск и исправление ошибок в небольшом фрагменте программы (10±20 строк)
Существует три аспекта проверки программы:
- на правильность;
- на эффективность реализации;
- на вычислительную сложность.
Эти проверки, вместе взятые, направлены на получение экспериментального ответа на вопросы: работает ли алгоритм и насколько хорошо он работает? Предполагается, что проверка правильности удостоверяет, что программа делает в точности то, для чего она была предназначена. Проверка эффективности реализации направлена на поиск способов «заставить» правильную программу работать быстрее или расходовать меньше памяти. Чтобы улучшить программу, пересматриваются результаты этапа реализации в процессе построения алгоритма.
Проверка вычислительной сложности сводится к экспериментальному анализу сложности алгоритма или к экспериментальному сравнению двух или более алгоритмов, решающих одну и ту же задачу.
Наличие ошибок в только что разработанной программе — вполне нормальное, закономерное явление. Составить реальную (достаточно сложную) программу без ошибок практически невозможно. Нельзя делать вывод, что программа правильна, лишь на том основании, что она считает и выдает результаты.
Текст программы можно проконтролировать за столом с помощью просмотра, проверки и прокрутки.
Просмотр. Текст программы просматривается на предмет обнаружения явных ошибок и расхождений с алгоритмом. Нужно просмотреть организацию всех циклов, чтобы убедиться в правильности операторов, задающих кратности циклов. Полезно просмотреть еще раз условия в условных операторах, аргументы в обращениях к подпрограммам и т. п.
Проверка. При проверке программы программист по тексту программы мысленно старается восстановить тот вычислительный процесс, который определяет программа, после чего сверяет его с требуемым алгоритмом.
Прокрутка. Основой прокрутки является имитация программистом за столом выполнения программы на машине. Для выполнения прокрутки приходится задаваться какими-то исходными данными и производить над ними необходимые вычисления.
Прокрутка — трудоемкий процесс, поэтому ее следует применять только для контроля логически сложных участков программы.
После просмотра программы вручную ее необходимо отладить и протестировать на компьютере.
Отладка — это процесс поиска и устранения ошибок в программе, производимый по результатам ее прогона на компьютере.
Тестирование — это испытание, проверка правильности работы программы в целом или ее составных частей.
Отладка и тестирование — два разных этапа:
- при отладке происходит локализация и устранение синтаксических ошибок и явных ошибок кодирования;
- в процессе тестирования проверяется работоспособность программы, не содержащей явных ошибок. Тестирование устанавливает факт наличия ошибок, а отладка выясняет их причину.
Как бы тщательно ни была отлажена программа, решающим этапом, устанавливающим ее пригодность для работы, является контроль программы по результатам ее выполнения на системе тестов. Программу условно можно считать правильной, если ее запуск для выбранной системы тестовых исходных данных во всех случаях дает правильные результаты.
Тестовые данные должны обеспечить проверку всех возможных условий возникновения ошибок. Процесс тестирования можно разделить на три этапа:
- Проверка в нормальных условиях. Предполагает тестирование на основе данных, которые характерны для реальных условий функционирования программы.
- Проверка в экстремальных условиях. Тестовые данные включают граничные значения области изменения входных переменных, которые должны восприниматься программой как правильные данные. Типичными примерами таких значений являются очень маленькие или очень большие числа и отсутствие данных. Еще один тип экстремальных условий — граничные объемы данных. Например, когда массивы состоят из слишком малого или слишком большого количества элементов.
- Проверка в исключительных ситуациях. Проводится с использованием данных, значения которых лежат за пределами допустимой области изменений.
Ошибки могут быть допущены на всех этапах решения задачи. Разновидности характерных ошибок:
- Неправильная постановка задачи — верное решение неверно сформулированной задачи.
- Неверный алгоритм — выбор алгоритма, приводящего к неточному, неэффективному решению задачи.
- Ошибки анализа — неполный учет ситуаций, которые могут возникнуть; логические ошибки.
- Семантические ошибки — неправильный порядок выполнения операций.
- Синтаксические ошибки — нарушение правил, определяемых языком программирования.
- Ошибки при выполнении операций — слишком большое число (переполнение), деление на нуль, извлечение квадратного корня из отрицательного числа и т. п.
- Ошибки в данных — неправильное определение возможного диапазона изменения данных.
- Опечатки — перепутаны близкие по написанию символы, например цифра 1 и буква I.
- Ошибки ввода/вывода — неверное считывание входных данных, неверное задание форматов, отсутствие некоторых данных.
В качестве примера рассмотрим программу, в которой вычисляется значение функции по приведенным формулам в зависимости от значения параметра K, который является номером режима.
$y(x)={table√{a_1x^2+b_1x+c_1}, text»если» K=1; √{a_2x^2+c_2}, text»если» K=2; √{b_3x+c_3}, text»если» K=3;$
Программа имеет вид
Ошибки, допущенные при написании программы:
- Пропущен ввод исходных данных А1, B1, C1, A2, C2, B3, C3; пропущено описание переменной Y (для языка Pascal).
- В приведенной программе не предусмотрена обработка ситуации, когда под корнем получается отрицательное значение. Необходимо использовать условный оператор для определения положительности подкоренного выражения.
- Отсутствует анализ ситуации, когда вместо цифр 1, 2, 3 для переменной К считана другая цифра. В этом случае, можно выдавать, например, сообщение: «Номер режима неверен». Для выдачи такого сообщения в программе в саsе-операторе после строки с меткой 3 нужно добавить строку вида else <Печать сообщения> (вариант 1). Можно также организовать ввод параметра K с проверкой введенного значения, и при ошибочном вводе требовать повторения ввода значения для переменной K (вариант 2).
Пример откорректированной программы (вариант 1).
Пример откорректированной программы (вариант 2).
Создание собственной программы (30±50 строк) для решения простых задач
Процесс создания компьютерной модели можно представить как путь от постановки задачи до реализации модели на компьютере. При разработке компьютерной модели очень важен выбор программного обеспечения (ПО), с помощью которого будет реализована модель. Возможны два основных варианта выбора — это, во-первых, прикладное ПО и, во-вторых, среда программирования. Если в качестве ПО была выбрана среда программирования, то построение компьютерной модели завершается созданием программы.
При написании программы прежде всего следует четко уяснить задачу, которую должна решать программа. Затем предварительно разработанный алгоритм решения задачи записывается в виде упорядоченной последовательности команд (инструкций), т. е. составляется программа, ориентированная на определенную среду программирования.
При написании программы обязательно следует проверять, насколько она соответствует намеченной цели, т. е. делает ли программа для всех наборов данных то, что от нее требуется, не выполняет ли она каких-либо лишних действий. Основное внимание следует сосредоточить на предотвращении логических ошибок. Для этого рекомендуется перед написанием программы построить блок-схему алгоритма решения или словесный алгоритм, что позволит абстрагироваться от конкретного языка программирования и сосредоточиться на анализе алгоритма.
Примеры разработки программ
Пример 1. Составить словесный алгоритм, разработать блок-схему и написать программу проверки принадлежности введенного числа данной арифметической прогрессии. Прогрессия задается двумя последовательными членами.
Решение. Словесный алгоритм.
Начало алгоритма
- Ввести два последовательных члена арифметической прогрессии: A1, A2.
- Ввести произвольное целое число C.
- Найти разность (D) арифметической прогрессии.
- Найти разность между введенным числом C и членом арифметической прогрессии, например A1.
- Найти остаток от деления нацело найденной разности на D.
- Если остаток от деления равен 0, то это значит, что число C принадлежит рассматриваемой арифметической прогрессии»; иначе получаем, что число C не принадлежит рассматриваемой арифметической прогрессии.
Конец алгоритма.
Блок-схема алгоритма:
Программа:
Примечание. Mod — операция, результатом которой является остаток от целочисленного деления.
Пример 2. Составить словесный алгоритм, алгоритм в виде блок-схемы и написать программу поиска в строковом массиве, содержащем фамилии 10 учеников, заданной фамилии, обеспечить запоминание ее порядкового номера (массив фамилий может быть неупорядочен).
Решение.
Словесный алгоритм
Начало алгоритма
- Ввести все десять фамилий (строковый массив из 10 элементов).
- Ввести фамилию, которую нужно найти.
- Сравнивать ее с очередным элементом строкового массива, пока не будет найдена такая же фамилия или пока не закончится список (массив).
- Если фамилия найдена, вывести ее номер в списке (массиве), если нет — сообщить о том, что фамилия не найдена.
Конец алгоритма.
Блок-схема алгоритма
Программа:
Содержание:
-
Я — репетитор по информатике и программированию
-
В каких частях экзаменующийся вынужден прибегать к элементам программирования
-
Мой выбор – язык программирования Pascal! Почему?
-
Краткий логический вывод
Я — репетитор по информатике и программированию
Здравствуйте! Меня зовут Александр Георгиевич. Я — профессиональный московский репетитор по информатике, математике, базам данных, алгоритмам и программированию.
Я понимаю, что вы занятой человек, но все равно настоятельно рекомендую потратить несколько минут и ознакомиться с отзывами клиентов, прошедших курсы индивидуальной подготовки под моим началом. Также выберите один из вариантов нашего будущего взаимовыгодного финансового сотрудничества.
Я провожу занятия на удобной для моего ученика территории. Но, хочу заметить, что в последние годы с бурным развитием интернет-технологий все больше и больше старшеклассников предпочитают дистанционный формат обучения. Это удобно, продуктивно и дешево!
Генеральное направление моей репетиторской деятельности — подготовка школьников к успешной сдаче ОГЭ и ЕГЭ по информатике. В течение своей репетиторской деятельности через мои руки прошла не одна сотня школьников, и большинство из них получило от 93 тестовых баллов из 100 возможных на официальных экзаменах. Записывайтесь ко мне на частные уроки, чтобы оказаться среди них!
Очень часто ко мне обращаются студенты для того, чтобы обучиться какому-либо востребованному языку программирования или заказать проект по программированию. Специально для вас я записал видеоролик, в котором объясняю все моменты, связанные с выполнением вашей работы на заказ. Также особое внимание обратите на отзывы клиентов, опубликованных под этим видео.
Как правило, знание различных языков программирования пригодится не только при решении заданий под номерами 24-27 на экзамене ЕГЭ по информатике и ИКТ. Напомню, что последние упражнения ориентированы на фундаментальные понятия и базис по программированию.
В каких частях экзаменующийся вынужден прибегать к элементам программирования
Очень часто элементы программирования встречаются и в задачах базового и повышенного уровня сложности, например, в демонстрационных вариантах 2016 — 2018 годов задачи под номерами 8, 11, 19, 20, 21, так или иначе, перекликаются с основными конструкциями языков программирования.
Как правило, предлагаются следующие на выбор языки программирования:
Basic (QBasic) | Pascal (Turbo Pascal) | C (чистый C) | Естественный язык |
И возникает сложная «двойная» дилемма, какой язык программирования совершенствовать? Лично я являюсь апологетом языка программирования высокого уровня – Pascal от корпорации Borland, которой официально уже не существует.
Настоятельно рекомендую каждому, а также об этом твержу постоянно и в видеоуроках, отказаться от естественного или алгоритмического языка. Нет ничего более неказистого и нерационального, чем разбираться с программой, записанной нестандартными, не общепринятыми командами.
Любая программа, созданная на естественном языке, имеет массу необъективностей и различных восприятий: один автор напишет слово начало, символизирующее начало тела цикла, другой автор, напишет сокращение нц. Нет строгой детерминации правил описания ключевых слов на естественном языке, что порождает огромное количество дуальностей и противоречий.
Поэтому не нужно даже пытаться разбирать фрагмент исходного кода программы, созданной на нестандартизованном языке программирования. Хотя, безусловно, финальный выбор одного из предложенных языков исключительно за вами!
Мой выбор – язык программирования Pascal! Почему?
Поясню, почему в качестве языка программирования мне импонирует исключительно Pascal (к слову, все приведенные языки программирования я знаю одинаково фундаментально и глубоко):
-
Прекрасная внутренняя организация блоков программного кода по соответствующим разделам: раздел подключения сторонних модулей, раздел декларации константных величин, раздел декларации переменных величин, раздел описания собственных типов данных.
-
Хорошо продуманная создателем языка мнемоника ключевых слов: например, зарезервированное слово begin, означает какое-либо начало, в программе данное ключевое слово символизирует начало блока тела цикла, условной конструкции или подпрограммы.
-
Легко читаемая лексика.
Не советую в качестве альтернативы останавливать собственный выбор на языке программирования C, обладающем инкапсулированной сложностью, особенно в сложных программах, насыщенных указательными переменными или динамическими структурами данных.
Одним из существенных недостатков такого великого языка программирования, как Basic, субъективно считаю отсутствие полной поддержки функций и процедур при обработке строковых данных, а также отсутствие встроенной поддержки типа данных «множество» (в отличие от языка Pascal).
Краткий логический вывод
Выбор языка программирования – всегда субъективная вещь, но старайтесь выбирать тот вариант, который глубже и конститутивнее понимаете, это позволит вам оптимальнее подойти к вопросу о решении предлагаемой задачи при сдаче ЕГЭ по информатике и ИКТ.