Даша: Спасибо:3
31-05-2023
Читать статью
Санечка: я ничего не учила) но буду надеятся что ..
30-05-2023
Мейнер Сяо: Удачи всем сегодня на экзамене ;)..
Двадцать первое задание из ЕГЭ по информатике - довольно серьёзно задание, которое требует понимания основ программирования и использования функций.
Все сегодняшние задачи из ЕГЭ по информатике будем рассматривать на языке программирования Паскаль.
Рассмотрим пример функции, которая суммируем два числа!
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 задании из ЕГЭ по информатике, поэтому понимание функций очень важно на экзамене по информатике.
Определите, при каком наименьшем значении 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.
#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 кон
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)
Чтобы программа напечатала число 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.
Потренируемся решать ещё примерные задачи 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.
#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) все кон
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(19) = 19 * 7 = 133.
Т.е. последний раз, когда выполняется цикл в главной части программы должно выполнится условие 133 < b. Понимаем, что наименьшее значение b должно быть 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.
#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 кон
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!
Рассмотрим задачи, которые были на реальном экзамене по информатике в 2019 и 2020 годах.
Напишите в ответе число, которое будет напечатано в результате выполнения следующего алгоритма. Для Вашего удобства программа приведена на четырёх языках программирования.
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)
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.
Напишите в ответе число, которое будет напечатано в результате выполнения следующего алгоритма. Для Вашего удобства программа приведена на 4 языках программирования.
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)
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.
На этом завершился урок по подготовке 21 задания из ЕГЭ по информатике. Удачи!