вентилятор
Хорошего настроения!

ЕГЭ по информатике - Задание 21 (Функции)



Двадцать первое задание из ЕГЭ по информатике - довольно серьёзно задание, которое требует понимания основ программирования и использования функций.


Все сегодняшние задачи из ЕГЭ по информатике будем рассматривать на языке программирования Паскаль.



Что такое Функция в языке программирования Паскаль ?


Функция – это подпрограмма, результатом работы которой является определенное значение.

Рассмотрим пример функции, которая суммируем два числа!


var a, b, summa: integer;

// Функция, которая суммирует два числа.
function F(x:integer; y:integer):integer;
begin
F := x + y;
end; 

BEGIN
Readln(a);
Readln(b);

summa := F(a, b);

WriteLn(summa);
END.

Здесь функция F, которая суммирует два числа.


В главной часте программы, которая заключена между BEGIN и END, запрашиваются два числа с клавиатуры: a и b! Эти два числа передаются в функцию F. В функции эти числа кладутся в локальные переменные x и y. Переменные x и y суммируются, и результатом работы функции будет сумма переменных a и b.


Результат работы функции будет помещён в переменную summa (В строке summa := F(a, b)).


Таким образом, в переменной summa будет сумма двух переменных a и b.


Значение, которое вернёт функция, указано в строчке F := x + y;


Функции позволяют сократить программный код для однотипных расчётов.


Отличие функций от процедур в языке программирования Паскаль заключается в том, что функция возвращает значение, которое можно присвоить переменной, а процедура - нет.


Функции так же могут попасться и в 11 задании из ЕГЭ по информатике, поэтому понимание функций очень важно на экзамене по информатике.


Тренировочные задачи 21 задания из ЕГЭ по информатике


Задача (стандартная)

Определите, при каком наименьшем значении b в результате выполнения следующего алгоритма будет напечатано число 100 (Для Вашего удобства алгоритм представлен на пяти языках):


БейсикПаскаль
DIM A, B AS INTEGER
INPUT B
A = 0
WHILE F(A) < B
    A = A + 1
WEND
PRINT A

FUNCTION F(x)
DIM I, S, AS INTEGER
    S = 0
    I = 1
    WHILE I <= x
       S = S + 5
       I = I + 1
    WEND
    F = S
END FUNCTION
var a, b :integer;
function F(x :integer): integer;
var i, s : integer;
begin
    s := 0; i := 1;
    while i <= x do
    begin
        s := s + 5;
        i := i + 1;
    end;
    F := s
end;
BEGIN
    readln(b);
    a := 0;
    while F(a) < b do
        a := a + 1;
    write(a);
END.
C++Алгоритмический язык
#include 
using namespace std;
long F(long x) {
    long i, s;
    s = 0;
    i = 1;
    while(i <= x) {
        s = s + 5;
        i = i + 1;
    }
    return s;
}
int main() {
    int a, b;
    cin >> b;
    a = 0;
    while (F(a) < b)
        a = a + 1;
    cout << a << endl;
    return 0;
}
алг
нач
  цел a, b
  ввод b
  a := 0
  нц пока F(a) < b
    a := a + 1
  кц
  вывод a
кон

алг цел F(цел x)
нач
  цел i, s
  s := 0
  i := 1
  нц пока i <= x
    s := s + 5
    i := i + 1
  кц
  знач := s
кон
Python
def F(x)
    s = 0
    i = 1
    while i <= x:
        s = s + 5
        i = i + 1
    return s
b = int(input())
a = 0
while F(a) < b:
    a = a + 1
print(a)


Решение:
ЕГЭ по информатике - задание 21 (Функция)

Чтобы программа напечатала число 100, в переменной a по окончанию программы должно быть число 100.


Переменная a увеличивается в цикле while, т.е. пока значение функции F(a) меньше того числа, которое пользователь ввёл с клавиатуры (переменной b), Цикл будет прибавлять к переменной a единицу.


В последний раз, когда Цикл while в основной части программы пройдёт проверку (F(a) < b), значение переменной a = 99. Ведь к переменной a прибавится 1 внутри цикла, и как раз, программа напечатает 100.


Найдём, чему будет равно значение функции при последнем проходе Цикла (при a = 99).


Переменная x внутри функции олицетворяет переменную a, которая передаётся в виде аргумента в функцию F.


Тогда и x = 99, следовательно, цикл while (внутри функции) будет повторятся 99 раз. После окончания цикла (внутри функции) в переменной s будет значение s = 0 + 99 * 5 = 495. Это число вернёт функция в виде значения, и это значение будет участвовать в условии цикла while в главной части программы.


Нужно найти наименьшее значение b, чтобы условие 495 < b выполнялось (это будет последний проход ЦИКЛА).


Понимаем, что b = 496.


Ответ: 496.

Потренируемся решать ещё примерные задачи 21 задания из ЕГЭ по информатике.


Задача (закрепление материала)

Определите при каком наименьшем значении b в результате выполнения следующего алгоритма будет напечатано число 20 (для Вашего удобства алгоритм представлен на пяти языках):


БейсикПаскаль
DIM A, B AS INTEGER
INPUT B
A = 0
WHILE F(A) < B
     A = A + 1
WEND
PRINT A

FUNCTION F(x)
    IF x = 0
       F = 0
    ELSE
       F = 7 + F(x-1)
    END IF
END FUNCTION
var a, b : integer;
function F(x:integer):integer;
begin
  if x = 0 then
    F := 0
  else
    F := 7 + F(x-1)
end;
BEGIN
  readln(b);
  a := 0;
  while F(a) < b do
    a := a + 1;
  write(a);
END.    
C++Алгоритмический язык
#include 
using namespace std;
long F(long x) {
  if(x == 0)
    return 0;
  else
    return 7 + F(x - 1);
}
int main() {
  int a, b;
  cin >> b;
  a = 0;
  while (F(a) < b)
    a = a + 1;
  cout << a << endl;
  return 0;
}
алг
нач
  цел a, b
  ввод b
  a := 0
  нц пока F(a) < b
    a := a + 1
  кц
  вывод a
кон

алг цел F(цел x)
нач
  если x > 0 то
    знач := 0
  иначе
    знач := 7 + F(x-1)
  все
кон
Python
def F(x):
  if x == 0:
    return 0
  else:
    return 7 + F(x-1)
b = int(input())
a = 0
while F(a) < b:
  a = a + 1
print(a)

Решение:

Чтобы программа напечатала число 20, нужно, чтобы при последнем проходе цикла while в главной части программы условие F(a) < b было верно при a = 19.


Число 19 передаём в функцию, посмотрим какое значение вернёт функция.


Локальная переменная x после того, как будет запущена функция F, будет равна 19. Условие отработает по ветке else, т.к. 19 неравно 0. Значит функция F запускает ещё раз функцию F но с другим параметром 18 (19 - 1). И т.д., пока параметр передаваемый в функцию не будет равен нулю.


Получается такая картина:


F(19) = F(18) + 7
F(18) = F(17) + 7
F(17) = F(16) + 7
...
F(1) = F(0) + 7
F(0) = 0

При запуске F(19) функция возвращает сумму девятнадцати семёрок. F(19) = 19 * 7 = 133.


Т.е. последний раз, когда выполняется цикл в главной части программы должно выполнится условие 133 < b. Понимаем, что наименьшее значение b должно быть 134.


Ответ: 134

Важный пример для изучения 21 задания из ЕГЭ по информатике.


Задача (Минимум функции)

Определите, какое число будет напечатано в результате выполнения следующего алгоритма (для Вашего удобства алгоритм представлен на пяти языках):


БейсикПаскаль
DIM A, B, T, M, R AS INTEGER
A = -20: B = 20
M = A : R = F(A)
FOR T = A TO B
    IF F(T) <= R THEN
        M = T
        R = F(T)
    END IF
NEXT T
PRINT M + 6

FUNCTION F(X)
    F = (x * x - 16) * (x * x - 16) + 3
END FUNCTION
var a, b, t, M, R :integer;
function F(x:integer):integer;
begin
    F := (x * x - 16) * (x * x - 16) + 3
end;
BEGIN
    a: = -20;  b := 20;
    M := a; R := F(a);
    for t := a to b do
        if F(t) <= R then
        begin
            M := t;
            R := F(t);
        end;
    write(M + 6);
END. 
C++Алгоритмический язык
#include 
using namespace std;
long F(long x) {
    return (x * x - 16) * (x * x - 16) + 3;
}
int main() {
    long a, b, t, M, R;
    a = -20; b = 20;
    M = a; R = F(a);
    for(t = a; t <= b; t++) {
        if(F(t) <= R) {
            M = t;
            R = F(t);
        }
    }
    cout << M + 6 << endl;
    return 0;
}
алг
нач
  цел a, b, t, M, R
  a := -20; b := 20
  M := a; R := F(a)
  нц для t от a до b
      если F(t) <= R то
        M := t
        R := F(t)
      все
  кц
  вывод M + 6
кон

алг цел F(цел x)
нач
    знач := (x*x - 16) * (x*x - 16) + 3
кон
Python
def F(x):
    return (x * x - 16) * (x * x - 16) + 3
a = -20; b = 20
M = a; R = F(a)
for t in range(a, b+1):
    if (F(t) <= R):
        M = t; R = F(t)
print(M + 6)

Решение:

В главной части программы находится цикл FOR. В нём переменная t проходит целые числа от -20 до 20. И эта переменная t является аргументов в функции F.


В теле цикла идёт условие. Это условие ищет наименьшее значение для функции F. Если мы нашли меньшее значение для функции F, чем то значение, которое сейчас считается наименьшим и находится в переменной R, то это значение будет считаться наименьшим.


Таким образом, после прохождения всего цикла, в переменной R будет минимум всей функции F! А в переменной M значение переменной t, при котором этот минимум настаёт.


Чтобы ответить на вопрос задачи, необходимо найти минимум функции F = (x2 - 16) * (x2 - 16) + 3.


Обозначим z = x2 - 16. Тогда функция примет вид F = z2 + 3. Минимум этой функции достигается при z = 0. Значит, x2 - 16 = 0 => (x - 4)(x + 4) = 0. Т.е. минимум функции достигается при двух значениях x = 4, x = -4.


Примечание: Минимум можно искать любым способом, вплоть до нахождения производной!


Т.к. переменная t идёт в цикле FOR от минуса к плюсу, а неравенство внутри цикла нестрогое, то в переменной M будет второе значение (4!) после прохождения всего цикла!


Тогда ответ получается равен 10!


Ответ: 10

Задачи 21 задания из реального ЕГЭ по информатике


Рассмотрим задачи, которые были на реальном экзамене по информатике в 2019 и 2020 годах.


Задача (ЕГЭ по информатике, Москва, 2019)

Напишите в ответе число, которое будет напечатано в результате выполнения следующего алгоритма. Для Вашего удобства программа приведена на четырёх языках программирования.


БейсикPython
DIM A, B, T, M, R AS LONG
A = -20 : B = 20
M = A : R = F(A)
FOR T = A TO B
    IF F(T) < R THEN
        M = T
        R = F(T)
    END IF
NEXT T
PRINT M + R

FUNCTION F(x)
    F = 2 * (x * x - 1) * (x * x - 1) + 5
END FUNCTION
def F(x):
    return 2 * (x * x - 1) * (x * x - 1) + 5
a = -20
b = 20
M = a
R = F(a)
for t in range(a, b + 1):
    if F(t) < R:
        M = t
        R = F(t)
print(M + 18)
ПаскальC++
var a, b, t, M, R :integer;
function F(x:integer):integer;
begin
    F := 2 * (x * x - 1) * (x * x - 1) + 5
end;

begin
    a := -20; b := 20;
    M := a ; R := F(a);
    for t := a to b do
        if (F(t) < R) then begin
            M := t; R := F(t)
        end;
    write(M + 18)
end.
#include 
using namespace std;
int F(int x) {
    return 2 * (x * x - 1) * (x * x - 1) + 5;
}
int main() {
    int a, b, M, R;
    a = -20;
    b = 20;
    M = a; R = F(a);
    for(int t = a; t <= b; t++)
        if(F(t) < R) {
            M = t;
            R = F(t);
        }
    cout << M + 18;
    return 0;
}

Решение:

Задача похоже на предыдущую. Снова по окончании цикла FOR в переменной R будет минимум функции F, а в переменной M значение, при котором функция F достигает минимума.


Найдём минимум для функции F = 2 * (x2 - 1) * (x2 - 1) + 5. Обозначим z = x2 - 1. Тогда функция F = 2 * z2 + 5 минимум принимаем в значении z = 0. Следовательно, минимум будет достигаться x2 - 1 = 0. Т.е. при x = -1 и при x = 1 достигается минимум функции.


Переменная t в цикле FOR перебирает значение от минусовых значений к плюсовым значениям. Неравенство внутри тела цикла строгое! Значит, в переменной M будет минусовое значение.


В ответе напишем -1 + 18 = 17.


Ответ: 17


Задача (ЕГЭ по информатике, Москва, 2020)

Напишите в ответе число, которое будет напечатано в результате выполнения следующего алгоритма. Для Вашего удобства программа приведена на 4 языках программирования.


БейсикPython
DIM A, B, T, M, R AS LONG
A = -20: B = 20
M = A: R = F(A)
FOR T = A TO B
    IF F(T) < R THEN
        M = T
        R = F(T)
    END IF
NEXT t
PRINT M + R

FUNCTION F(x)
    F = 2 * (x * x - 9) * (x * x - 9) + 5
END FUNCTION
def F(x):
    return 2 * (x * x - 9) * (x * x - 9) + 5
a = -20
b = 20
M = a
R = F(a)
for t in range(a, b+1):
    if F(t) < R :
        M = t
        R = F(t)
print(M + 18)
ПаскальC++
var a, b, t, M, R : integer;
function F(x:integer) : integer;
begin
    F := 2 * (x * x - 9) * (x * x - 9) + 5
end;
begin
    a := -20; b := 20;
    M := a ; R := F(a);
    for t := a to b do
        if (F(t) < R) then begin
            M := t; R := F(t)
        end;
    write(M + 18);
end.
#include 
using namespace std;
int F(int x) {
    return 2 * (x * x - 9) * (x * x - 9) + 5;
}
int main() {
    int a, b, M, R;
    a = -20;
    b = 20;
    M = a; R = F(a);
    for(int t = a; t <= b; t++)
        if(F(t) < R) {
            M = t;
            R = F(t);
        }
    cout << M + 18;
    return 0;
}

Решение:

Опять такая же ситуация, как в предыдущих двух задачах.


Найдём при каких значениях x достигается минимум функции F = 2 * (x2 - 9) * (x2 - 9) + 5.


Минимум функции F достигается при x = 3 и x = -3.


Переменная t перебирает целые числа от минусовых значений до плюсовых. Неравенство внутри цикла строгое, значит, после окончания цикла переменная M = -3.


Ответ будет -3 + 18 = 15.


Ответ: 15

На этом завершился урок по подготовке 21 задания из ЕГЭ по информатике. Удачи!





15-08-2020 в 14:54:04





Поддержать сайт:


Похожая статья:

ЕГЭ по информатике - Задание 1 (Практика)

Здравствуйте, друзья! Сегодня разберём, как на практике решать первое ...

Категория: Информатика  Подкатегория: ЕГЭ
Дата: 08-12-2019 в 09:42:25 0



Оставить коментарий:



Напишите email, чтобы получать сообщения о новых комментариях (необязательно):


Задача против робота. Расположите картинки горизонтально:




Нажимая кнопку Отправить, Вы соглашаетесь с политикой конфиденциальности сайта.