Файл: Пособие по выполнению задания 15. 2 Огэ по информатике. Составил Волгин П. М. (Моу сош 20, г. Воскресенск М. О.).pdf

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 11.04.2024

Просмотров: 24

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

1
Пособие по выполнению задания 15.2 ОГЭ по информатике.
Составил Волгин П.М. (МОУ СОШ № 20, г. Воскресенск М.О.)
pavel.niglov@yandex.ru
Все задачи взяты из Генератора вариантов ОГЭ сайта К.Ю. Полякова http://kpolyakov.spb.ru/school/oge/gen.php
Задание выполнялось в Pascal ABC
Теория: В задании 15.2 требуется написать программу на одном из языков программирования, которая по входным данным будет получать выходные данные. Для решения задачи важно знать два вида цикла:
Цикл с известным количеством итераций;
Цикл с неизвестным количеством итераций.
Какой именно цикл использовать зависит от условия задачи.
Кроме умения воспользоваться циклической структуры, для выполнения задания потребуются дополнительные знания, которые включают в себя:
Структуру программы на языке Pascal;
Основные операторы, служебные слова, переменные и их применение;
Умение запускать программу.
Для решения задания необходимо воспользоваться одной из двух схем программы:
Program N15;
var
n,a,i:integer;
<список переменных>:<тип>;
Begin
read(n);
<инициализация>
for i:=1 to n do
begin
read(a);
if<условие> then
<действие>
end;
. . .
End.
Program N15;
var
a:integer;
<список переменных>:<тип>;
Begin
read(a);
<инициализация>
while a<>0 do begin
if<условие> then
<действие>
read(a);
end;
. . .
End.
Первая схема необходима для решения задания с помощью цикла с известным количеством итераций, вторая – для цикла с неизвестным количеством итераций.
Первая схема программы
Вторая схема программы

2
В задачах 15.2 необходимо знать некоторые операции, которые могут пригодиться для решения: k:=k+1//счетчик – используется для подсчета количества; s:=s+a//сумматор – используется для подсчета суммы; a mod 10// последняя цифра в числе. Используется в задачах, в которых необходимо найти числа, оканчивающиеся на какую-либо цифру. a mod 2// четность числа. Если a mod 2=0, то число четное. Если a mod
2<>0 – нечетное. Используется в задачах, в которых необходимо найти четные или нечетные числа. a mod m = 0// кратность числа m. Используется в задачах для нахождения чисел, кратных m. Например, числа, кратные 5: a mod 5=0. a mod m <> 0// Отрицание кратности числа m. Используется в задачах для нахождения чисел, не кратных m. Например, числа, не кратные 5: a mod
5<>0.
and// логический союз конъюнкции. Используется для соединения нескольких условий в задачах, в которых необходимо выполнение всех условий.
or// логический союз дизъюнкции. Используется для соединения нескольких условий в задачах, в которых необходимо выполнение хотя бы одного условия. min:=[maximum];
for i:=1 to n do if aПеред циклом обязательна инициализация переменной min. Переменной min до цикла необходимо присвоить самое максимальное значение, которое может принимать число в последовательности. max:=[minimum];
for i:=1 to n do if a>max then max:=a; //стандартный поиск максимального элемента в последовательности. Используется в задачах, в которых необходимо найти максимальный элемент.
Перед циклом обязательна инициализация переменной max. Переменной max до цикла необходимо присвоить самое минимальное значение, которое может принимать число в последовательности.
Обозначения переменных:
a – переменная, обозначающая введенные числа;
k – переменная, обозначающая количество;
s – переменная, обозначающая сумму;
min – переменная, обозначающая минимальное число;


3
max – переменная, обозначающая максимальное число;
n – переменная, обозначающая количество введенных чисел.
Рассмотрим пример задачи:
(№ 981) Напишите программу, которая в последовательности натуральных чисел определяет минимальное число, оканчивающееся на 4. Программа получает на вход количество чисел в последовательности, а затем сами числа. В последовательности всегда имеется число, оканчивающееся на 4. Количество чисел не превышает 1000. Введённые числа не превышают 30 000. Программа должна вывести одно число – минимальное число, оканчивающееся на 4.
Пример работы программы:
Решение:
В данной задаче используется цикл с известным количеством итераций. Будем применять первую схему программы с циклом for. Получаем:
Program N15;
var
n,a,i:integer;
min:integer;
Begin
read(n);
for i:=1 to n do
begin
read(a);

Переменная min отвечает за искомое минимальное число, оканчивающееся на 4.
Как найти минимальное число? Необходимо воспользоваться стандартным поиском минимального элемента в последовательности. Изначально инициализируем переменную min целого типа. В условии задачи сказано: числа
не превышают 30 000. Это означает, что min нужно присвоить значение 30 000, чтобы программа смогла найти необходимое значение переменной min. Если данную строку не написать, компилятор присвоит переменной min значение 0, и в качестве ответа будет выводиться 0, так как 0 всегда меньше любого натурального числа, оканчивающегося на 4. Поэтому строка инициализации переменной важна.
min:=30000;
for i:=1 to n do begin

4
if a
Но нам нужно получить не просто минимальное число, а минимальное число, оканчивающееся на 4. Поэтому, необходимо добавить дополнительное условие:
if a mod 10 = 4
В данной задаче необходимо, чтобы выполнялись оба условия одновременно, поэтому воспользуемся логическим союзом конъюнкции and.
if (a
Оба операнда должны стоять в скобках, а между ними – логический оператор
and. В противном случае, программа не запустится или будет дан неверный результат.
Ответ необходимо записать в переменную min. Получаем готовое условие:
min:=30000;
for i:=1 to n do begin
if (a
Получаем готовую программу:
Program N15;
var
n,a,i:integer;
min:integer;
Begin
read(n);
min:=30000;
for i:=1 to n do
begin
read(a);
if (aand (a mod 10 = 4) then
min:=a;
end;
writeln(min);
End.
Важно! Не забудьте в конце цикла написать служебное слово «end;». Иначе, цикл не завершится, и программа будет выводить неверный ответ.


5
(№ 984) Напишите программу, которая в последовательности натуральных чисел определяет количество чисел, кратных 4, но не кратных 7. Программа получает на вход количество чисел в последовательности, а затем сами числа. В последовательности всегда имеется число, кратное 4 и не кратное 7. Количество чисел не превышает 1000. Введённые числа не превышают 30 000. Программа должна вывести одно число: количество чисел, кратных 4, но не кратных 7.
Пример работы программы:
Решение:
В данной задаче используется цикл с известным количеством итераций. Будем применять первую схему программы с циклом for. Получаем:
Program N15;
var
n,a,i:integer;
k:integer;
Begin
read(n);
for i:=1 to n do
begin
read(a);
Переменная k отвечает за искомое количество чисел кратных 4, но не кратных 7.
До цикла необходимо инициализировать переменную k. Сначала переменной k присвоим значение 0, так как до начала цикла количество чисел, кратных 4, но не кратных 7 равно 0.
k:=0;
В теле цикла после ввода значения переменной a напишем два условия, которые соединим союзом and, так как условия должны выполняться одновременно:
if (a mod 4 = 0) and (a mod 7 <>0) then…
Далее используем счетчик для подсчета количества.
k:=k+1;

6
Получаем готовую программу:
Program N15;
var
n,a,i:integer;
k:integer;
Begin
read(n);
k:=0;
for i:=1 to n do
begin
read(a);
if (a mod 4 = 0) and (a mod 7 <> 0) then
k:=k+1;
end;
writeln(k);
End.
(№ 1037) Напишите программу, которая в последовательности целых чисел определяет количество чисел, кратных 5 или 9. Программа получает на вход целые числа, количество введённых чисел неизвестно, последовательность чисел заканчивается числом 0 (0 – признак окончания ввода, не входит в последовательность). Количество чисел не превышает 1000. Введённые числа по модулю не превышают 30 000. Программа должна вывести одно число: количество чисел, кратных
5 или
9.
Пример работы программы:
Решение:
В данной задаче используется цикл с неизвестным количеством итераций.
Будем применять вторую схему программы c циклом while. Получаем:
Program N15;
var
a:integer;
k:integer;
Begin
read(a);
while a<>0 do begin

7
Переменная k отвечает за искомое количество чисел кратных 5 или 9. До цикла необходимо инициализировать переменную k. Сначала переменной k присвоим значение 0, так как до начала цикла количество чисел, кратных 5 или 9 равно 0.
k:=0;
В теле цикла после ввода значения переменной a напишем два условия, которые соединим союзом or, так как необходимо выполнение только одного из двух условий:
if (a mod 5 = 0) or (a mod 9 = 0) then…
Далее используем счетчик для подсчета количества.
k:=k+1;
Получаем готовую программу:
Program N15;
var
a:integer;
k:integer;
Begin
read(a);
k:=0;
while a<>0 do begin
if (a mod 5 =0) or (a mod 9 = 0) then
k:=k+1;
read(a);
end;
writeln(k);
End.
Важно! Перед командой «end;» обязательно нужно написать оператор
«read(a);», иначе в программе не будет работать цикл.
Задача повышенной сложности.
(№ 1013) Напишите программу, которая в последовательности натуральных чисел находит среднее арифметическое трёхзначных чисел или сообщает, что таких чисел нет (выводит NO). Программа получает на вход натуральные числа, количество введённых чисел неизвестно, последовательность чисел заканчивается числом 0 (0 – признак окончания ввода, не входит в последовательность). Количество чисел не превышает 100. Введённые числа не превышают 300. Программа должна вывести среднее арифметическое


8 трёхзначных чисел или вывести NO, если таких чисел нет.
Пример работы программы:
Решение:
В данной задаче используется цикл с неизвестным количеством итераций.
Будем применять вторую схему программы с циклом while. Получаем:
Program N15;
var
a:integer;
k:integer;
s:real;
Begin
read(a);
while a<>0 do begin
Переменная s отвечает за искомое среднее арифметическое. Ее необходимо инициализировать (s:=0, так как до цикла сумма равна 0). Так как среднее арифметическое может быть не целым числом, то в разделе описания переменных объявим переменную s вещественного типа (real).
В задаче необходимо найти трехзначные числа. Понадобится условие, с помощью которого программа находит трехзначные числа.
if (a>99) and (a<999)
Но в условии задачи написано, что введенные числа не превышают 300.
Значит, достаточно описать одно условие.
if a>99
Если a>99, то необходимо сначала посчитать сумму, а затем разделить эту сумму на количество трехзначных чисел. Для этого используем переменную k, которая будет являться счетчиком трехзначных чисел. Переменную k необходимо инициализировать (k:=0, так как до начала цикла количество трехзначных чисел равно 0). Получаем:
s:=s+a;

9
k:=k+1;
Так как после служебного слова then следует два действия, то их нужно закрепить в операторные скобки [begin, end;]
Получаем:
if a>99 then
begin
s:=s+a;
k:=k+1;
end;
Важно! Не забыть написать оператор «read(a);» для того чтобы цикл продолжал выполняться, а также закрыть цикл командой «end;».
Остается выполнить последнее условие задачи. Программа должна вывести среднее арифметическое трёхзначных чисел или вывести NO, если таких чисел нет. Если количество трехзначных чисел (переменная k) равно 0, то необходимо вывести «NO», а иначе вывести среднее арифметическое.
Получаем запись операторов после цикла:
if k=0 then writeln('NO')
else writeln(s/k);
Оставим количество знаков в дробной части числа равным одному (для того чтобы в дробной части не было периодической дроби).
writeln(s/k:5:1);
Получаем итоговую программу:
Program N15;
var
a:integer;
k:integer;
s:real;
Begin
read(a);
k:=0;
s:=0;
while a<>0 do begin
if a>99 then

10
begin
s:=s+a;
k:=k+1;
end;
read(a);
end;
if k=0 then writeln('NO')
else writeln(s/k:5:1);
End.
Второй способ решения (с использованием логической переменной).
Вместо счетчика трехзначных чисел в качестве последнего условия можно использовать логическую переменную p типа boolean. Изначально переменную
p инициализируем ложью (false), а если условие нахождения трехзначного числа будет выполняться, то переменная p будет менять свое значение на истину (true). Переменная k в этой программе является количеством итераций истинности условия if a>99.
Получаем программу:
Program N15;
var
a:integer;
k:integer;
s:real;
p:boolean;
Begin
read(a);
p:=false;
k:=0;
s:=0;
while a<>0 do begin
if a>99 then
begin
s:=s+a;
p:=true;
k:=k+1;
end;
read(a);
end;
if p=false then writeln('NO')
else writeln(s/k:5:1);
End.


11
Такая программа не самая оптимальная, но она тоже имеет право на существование. Задание 15.2 не проверяет знание оптимальности программы.
Это задание проверяет: умение составлять программы на языке программирования; знание циклической структуры; умение правильно написать условие для алгоритма.
Технические вопросы задания 15.2
Перед началом решения задачи, обучающимся необходимо сесть за компьютер и зайти в среду программирования Pascal ABC или Pascal ABC.Net. В области редактора нужно записать само решение задачи (программу на языке Pascal).
Затем, запустить программу, нажав на зеленую стрелку
(или нажать на клавишу F9).
Если все сделать правильно, то программа потребует ввести значения.
Важно! Если вы хотите использовать окно для ввода данных, то используйте пользовательский модуль crt в программе. Для этого перед служебным словом
var нужно написать команду «uses crt;». Тогда окно для ввода будет выглядеть следующим образом:
Внимание! Для среды программирования Pascal ABC.Net во время запуска программы с модулем «crt» необходимо воспользоваться сочетанием клавиш
shift+F9. Если пользовательский модуль не подключать, то для запуска достаточно нажать на значок флажка или на клавишу F9.
Если в программе произошла синтаксическая ошибка, то компилятор системы программирования не даст запустить программу. Снизу будет всплывать соответствующая ошибка, а курсор укажет на ту строку, в которой произошла ошибка.
Окно для ввода значения

12
Например:
Популярные ошибки:
Нельзя ставить символ «точка с запятой» перед else в операторе if
(Возможно, перед служебным словом «else» стоит символ «точка с запятой»);
Ожидался символ «точка с запятой» (Возможно, пропущен символ «точка с запятой» после выражения или пропущено служебное слово «end;»);
Ожидалось описание или begin (Возможно, пропущено служебное слово
var перед описанием переменных);
Ожидался символ «двоеточие» (Возможно, пропущено служебное слово
«Begin» или не поставлен символ «двоеточие» перед определением типа переменной в разделе var);
Ожидался идентификатор, но <что-то> обнаружено (Возможно, пропущен символ «точка с запятой» перед оператором);
Операнды имеют неприводимые типы (Возможно, два условия в операторе if стоят не в скобках);
Попытка присвоить переменную типа integer выражения типа real
(Возможно, для переменной целого типа использована операция, характерная для вещественного типа);
Неверное выражение (Возможно, пропущен символ «точка с запятой» после выражения или выражение записано некорректно);
Ожидалось присваивание (Возможно, вместо знака «:=» в программе используется знак «=»).
Пример ошибки в программе