21. Анализ программ с циклами и подпрограммами

Единый государственный экзамен ЕГЭ Информатика задание №21 Демонстрационный вариант 2018 Напишите в ответе число, которое будет напечатано в результате выполнения следующего алгоритма. Для Вашего удобства алгоритм представлен на пяти языках программирования.

Бейсик

Visual Basic
12
3
4
5
6
7
8
9
10
11
12
13
DIM A, B, T, M, R AS LONGA = -20: B = 20M = A: R = F(A)FOR T = A TO B IF F(T) <= R THEN M = T R = F(T) END IFNEXT TPRINT M+RFUNCTION F (x) F = 2*(x*x-1)*(x*x-1)+27END FUNCTION

Python

Python
12
3
4
5
6
7
8
def F(x): return 2*(x*x-1)*(x*x-1)+27a = -20; b=20M=a; R=F(a)for t in range(a,b+1): if (F(t) <= R): M=t; R=F(t)print (M+R)

Алгоритмический язык

12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
алгнач
цел 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+Rкон
алг цел F(цел x)нач
знач:=2*(x*x-1)*(x*x-1)+27кон

Паскаль

Delphi/Pascal
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ar a, b, t, M, R :longint;function F(x: longint) : longint;begin F:= 2*(x*x-1)*(x*x-1)+27;end;begina:=-20; b:=20;M:=a; R:=F(a);for t:= a to b do begin if (F(t) <= R) then begin M:=t; R:=F(t) endend;write(M+R)end.

Си

C
12
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>using namespace std;long F(long x) { return 2*(x*x-1)*(x*x-1)+27;}int main() {long 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 + R;return 0;}

Решение:

2(x-1)2+27

при x=1, y=27

1+27=28

 

Ответ: 28


Демонстрационный вариант Единый государственный экзамен ЕГЭ 2017 г. – задание №21. Напишите в ответе число, которое будет напечатано в результате выполнения следующего алгоритма (для Вашего удобства алгоритм представлен на пяти языках программирования).

Бейсик

Visual Basic
12
3
4
5
6
7
8
9
10
11
12
DIM A, B, N, t AS INTEGERA = -100: B = 100N = 0FOR t = A TO B IF F(t) <= 0 THEN N = N + 1 END IFNEXT tPRINT NFUNCTION F (x) F = (x - 16)*(x + 25)END FUNCTION

Python

Python
12
3
4
5
6
7
8
9
def f(x): return (x - 16)*(x + 25)a = -100b = 100n = 0for t in range(a, b + 1): if f(t) <= 0: n = n + 1print(n)

Алгоритмический язык

12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
алгнач
цел a, b, N, t a := -100; b := 100 N := 0 нц для t от a до b если F(t) <= 0 то
N := N + 1 все
кц
вывод Nкон
алг цел F(цел x)нач
знач := (x - 16)*(x + 25)кон

Паскаль

Delphi/Pascal
12
3
4
5
6
7
8
9
10
11
12
13
14
var a, b, N, t: integer;Function F(x: integer):integer;begin F := (x - 16)*(x + 25)end;begin a := -100; b := 100; N := 0; for t := a to b do begin if (F(t) <= 0) then N := N + 1 end; write(N)end.

Си

C
12
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>int F(int x) { return (x - 16)*(x + 25);}void main() { int a, b, N, t; a = -100; b = 100; N = 0; for (t = a; t <= b; t++) { if (F(t) <= 0) { N++; } } printf("%d", N);}

Решение:

Программа выведет на экран число N, его значение зависит от функции F(t). Если  F(t)≤ 0, то N увеличиваем на 1.

Функция F вычисляется по формуле  (x – 16)*(x + 25)

(x – 16)*(x + 25)= x2 -16х + 25х – 400 = x+ 9x – 400

Пусть x2+9*x-400=0, тогда

х1 = -25

х2 = 16

Графиком функции x2+9*x-400 является парабола, ветви которой направлены вверх. Поэтому когда -25<x<16, y≤0.

Итак, N=25 + 16 + 1 = 42

Ответ: 42


Демонстрационный вариант Единый государственный экзамен ЕГЭ 2016 г. – задание №21

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

Бейсик

Visual Basic
12
3
4
5
6
7
8
9
10
11
12
13
14
15
DIM K, I AS LONG INPUT K I = 1 WHILE F(I) < G(K)    I = I + 1 WEND PRINT I FUNCTION F(N)    F = N * N * N END FUNCTION FUNCTION G(N)    G = 2*N + 3 END FUNCTION

Python

Python
12
3
4
5
6
7
8
9
10
11
def f(n):    return n*n*n def g(n):    return 2*n+3 k = int(input())i = 1while f(i) < g(k):    i+=1print (i)

Алгоритмический язык

12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
алг нач
    цел i, k    ввод k    i := 1    нц пока f(i) < g(k)        i := i + 1    кц
    вывод i кон
алг цел f(цел n) нач
    знач := n * n * n кон
алг цел g(цел n) нач
    знач := 2*n + 3 кон

Паскаль

Delphi/Pascal
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
var    k, i : longint; function f(n: longint): longint; begin    f := n * n * n; end; function g(n: longint): longint; begin    g := 2*n + 3; end; begin    readln(k);    i := 1;    while f(i) < g(k) do        i := i+1;    writeln(i) end.

Си

C
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<stdio.h> long f(long n) {    return n * n * n; } long g(long n) {    return 2*n + 3; } int main() {    long k, i;    scanf("%ld", &k);    i = 1;    while(f(i) < g(k))        i++;    printf("%ld", i);    return 0; }

Ответ:

Решение:

Если k=10, то f(i)<g(k)

                          i3 < 2k+3

i3 < 2*10+3

i3 < 23

23 < 23

8 < 2k+3

5 < 2k

k>2,5

k=3

Ответ: 3


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

Паскаль Си Python
Var a,b,t,M,R:integer;
Function F(x:integer):integer;
begin
F:=3*(x-2)*(x+6);
end;
BEGIN
a:=-20; b:=20;
M:=a; R:=F(a);
for t:=a to b do begin
if (F(t)<R)then begin
M:=t;
R:=F(t);
end;
end;
write(R);
END.
#include <stdio.h>
int F(int x)
{
return(3*(x-2)*(x+6));
}
int main(void){
int 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);
}
}
printf(″%d″, R);
}
def F(x):
return 3*(x-2)*(x+6)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(R)

Решение:

Эта программа ищет наименьшее значение функции F(x)=3*(x-2)*(x+6) на интервале [-20, 20].

Если квадратный трехчлен задан в виде F(x)=a*(x-p)*(x-q), то абсцисса, соответствующая точке минимума, вычисляется по формуле:

p=2, q=-6

F(x)=3*(x-2)*(x+6) => F(-2)=3.((-2)-2)*((-2)+6)=3.(-4).(4)=-48

Ответ: -48


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

Паскаль Си Python
Var a,b,t,M,R:integer;
Function F(x:integer):integer;
begin
F:= x*x + 2*x + 10;
end;
BEGIN
a:=-10; b:=10;
M:=a; R:=F(a);
for t:=a to b do begin
if (F(t)< R)then begin
M:=t;
R:=F(t);
end;
end;
write(M);
END.
#include <stdio.h>
int F(int x)
{
return(x*x + 2*x + 10);
}
int main(void)
{
int a, b, t, M, R;
a=-10; b=10;
M=a; R=F(a);
for (t=a; t<= b; t++)
{
if (F(t)< R)
{
M=t;
R=F(t);
}
}
printf(″%d″, M);
}
 

def F(x):
return x*x + 2*x + 10

a = -10
b = 10
M = a
R = F(a)
for t in range(a,b+1):
if F(t) > R:
M = t
R = F(t)
print(M)

Решение:

Эта программа ищет наименьшее значение функции F(x)=x*x+2*x+10 на интервале [-10, 10], но выводит не само значение функции, а значение абциссы (x).

Если квадратный трехчлен задан в виде F(x)=ax2+bx+c, то абсцисса, соответствующая точке минимума, вычисляется по формуле:

b=2, a=1

Ответ: -1


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

Паскаль Си Python
Var a,b,t,M,R:integer;
Function F(x:integer):integer;
begin
F:= x*x + 6*x + 10;
end;
BEGIN
a:=-10; b:=10;
M:=a; R:=F(a);
for t:=a to b do begin
if (F(t)> R)then begin
M:=t;
R:=F(t);
end;
end;
write(M);
END.
#include <stdio.h>
int F(int x)
{
return(x*x + 6*x + 10);
}
int main(void)
{
int a, b, t, M, R;
a=-10; b=10;
M=a; R=F(a);
for (t=a; t<= b; t++)
{
if (F(t)> R)
{
M=t;
R=F(t);
}
}
printf(″%d″, M);
}
def F(x):
return x*x + 6*x + 10a = -10
b = 10
M = a
R = F(a)
for t in range(a,b+1):
if F(t) > R:
M = t
R = F(t)
print(M)

Решение:

Эта программа ищет наибольшее значение функции F(x)=x*x + 6*x + 10 на интервале [-10, 10], но выводит не само значение функции, а значение абциссы (x).

Если квадратный трехчлен задан в виде F(x)=ax2+bx+c, то абсцисса, соответствующая точке максимума, вычисляется по формуле:

b=6, a=1

Функция имеет наибольшее значение на интервале [-10, 10] при x=10.

Ответ: 10


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

Паскаль Си Python
var a,b,t,M,R:integer;
Function F(x: integer):integer;
begin
F := -3*(x-10)*(x+2)+2;
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);
END.
#include <stdio.h>
int F(int x)
{
return(-3*(x-10)*(x+2)+2);
}
int main(void)
{
int 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);
}
printf(″%d″, M);
}
def F(x):
return -3*(x-10)*(x+2)+2a = -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)

Решение:

Эта программа ищет наибольшее значение функции F(x)=-3*(x-10)*(x+2)+2 на интервале [-20, 20], но выводит не само значение функции, а значение абциссы (x).

F(x)=-3*(x-10)*(x+2)+2 = -3.(x2-8x-20)+2 = -3x2+24x+62

Если квадратный трехчлен задан в виде F(x)=ax2+bx+c, то абсцисса, соответствующая точке максимума, вычисляется по формуле:

b=24, a=-3

Ответ: 4


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

Паскаль Си Python
var a,b,t,M,R:integer;
Function F(x:integer):integer;
begin
F := 3*(x-8)*(x-8)
end;
begin
a := -20; b := 20;
M := a; R:= F(a);
for t := a to b do begin
if (F(t)<R) then begin
M := t;
R:= F(t)
end
end;
write(M);
end.
#include <stdio.h>
int F(int x)
{
return(3*(x-8)*(x-8));
}
int main(void)
{
int 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);
}
}
printf(″%d″, M);
}
def F(x):
return 3*(x-8)*(x-8)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)

Решение:

Эта программа ищет наименьшее значение функции F(x)=3*(x-8)*(x-8) на интервале [-20, 20], но выводит не само значение функции, а значение абциссы (x). Знак x положителен, поэтому функция вогнута вверх. Функция имеет только один корень x=8. Так что ответ будет 8.

 

Ответ: 8


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

Паскаль Си Python
var a,b,t,M,R:integer;
Function F(x: integer):integer;
begin
F := 15*(5+x)*(5+x)+125;
end;
BEGIN
a := -25; b := 25;
M := a; R:= F(a);
for t := a to b do begin
if F(t) > R then begin
M := t;
R:= F(t);
end;
end;
writeln(M);
END.
#include <stdio.h>
int F(int x)
{
return(15*(5+x)*(5+x)+125);
}
int main(void)
{
int a, b, t, M, R;
a = -25; b = 25;
M = a; R= F(a);
for (t=a; t<= b; t++)
{
if (F(t) > R))
{
M = t;
R= F(t);
}
}
printf(″%d\n″, M);
}
def F(x):
return 15*(5+x)*(5+x)+125a = -25
b = 25
M = a
R = F(a)
for t in range(a,b+1):
if F(t) > R:
M = t
R = F(t)
print(M)

Решение:

Эта программа ищет наибольшее значение функции F(x)=15*(5+x)*(5+x)+125 на интервале [-25, 25], но выводит не само значение функции, а значение абциссы (x). Знак x положителен, поэтому функция вогнута вверх.

15*(5+x)*(5+x)+125=0 => (5+x)2 = -125/15

Функция не имеет корней.

b>0 и a>0, по этому xmin<0 и ответ является правой конечной точкой интервала=25.

Ответ: 25


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

Паскаль Си Python
var a, b, t, N :integer;
Function F(x: integer):integer;
begin
F := 16*(9-x)*(9-x)-127;
end;
BEGIN
a := -20; b := 20;
N := 0;
for t := a to b do begin
if (F(t) >= 0) then begin
N := N+1;
end;
end;
write(N);
END.
#include <stdio.h>
int F(int x)
{
return(16*(9-x)*(9-x)-127);
}
int main(void)
{
int a, b, t, N;
a = -20; b = 20;
N = 0;
for (t=a; t<= b; t++)
if (F(t) >= 0) N++;
printf(″%d″, N);
}
def F(x):
return 16*(9-x)*(9-x)-127a = -20
b = 20
N = 0
for t in range(a,b+1):
if F(t) >= 0:
N += 1
print(N)

Решение:

if (F(t) >= 0) N++;

Эта программа подсчитывает количество, в котором функция F(x)=16*(9-x)*(9-x)-127 больше или равна нулю на интервале [-20, 20].

16*(9-x)*(9-x)-127 ≥ 0

16*(9-x)2 ≥ 127

x=2,1,0,-,1,-2 => 5 не подходит

на интервале [-20, 20] 20+20+1(нуль) = 41

41-5 = 36

Ответ: 36


Определите, количество чисел K, для которых следующая программа выведет такой же результат, что и для K = 20:

Паскаль Си Python
var i, k: integer;
function F(x:integer):integer;
begin
F:=x*x+5*x;
end;
begin
i := 15;
readln(K);
while (i > 0) and (F(i) > K) do
i:=i-1;
writeln(i);
end.
#include <stdio.h>
int F(int x)
{
return(x*x+5*x);
}
int main(void){
int i, K;
i = 15;
scanf(″%d″, &k);
while ( i > 0 && F(i) > K )
i–;
printf(″%d″, i);
}
def F(x):
return x*x + 5*xi = 15
k = int(input())
while (i > 0) and (F(i) > k):
i -= 1
print(i)

Решение:

i = 15; Начальное значение i равно 15.

while ( i > 0 && F(i) > K )
i–;

Пока условие истинно, i уменьшается.

x2+5x>20

при i=3, 32+5.3>20 => 24>20 максимум=23

при i=2, 22+5.2=14, минимум=14

Количество чисел между 14 и 23, это 10.

Ответ: 10


Напишите в ответе количество различных значений входной переменной k, при которых программа выдаёт тот же ответ, что и при входном значении k = 64. Значение k = 64 также включается в подсчёт различных значений k.

Паскаль Си Python
var k, i : longint;
function f(n: longint) : longint;
begin
f := n * n + 20
end;
begin
readln(k);
i := 12;
while (i>0) and (f(i)>=k) do
i := i-1;
writeln(i)
end.
#include <stdio.h>
int f(int n)
{
return(n*n + 20);
}
int main(void)
{
int i, K;
scanf(″%d″, &k);
i = 12;
while (i > 0 && f(i) >= k)
i = i-1;
printf(″%d″, i);
}
def f(n):
return n*n + 20i = 12
k = int(input())
while (i > 0) and (f(i) >= k):
i -= 1
print(i)

Решение:

i = 12; Начальное значение i равно 12.

while (i > 0 && f(i) >= k)
i–;

Пока условие истинно, i уменьшается.

n2+20 ≥ 64

при i=7, 72+20 ≥ 64 => 69 ≥ 64 максимум=69

при i=6, 62+20=56, минимум=57

Количество чисел между 69 и 57, это 13.

Ответ: 13


Напишите в ответе количество различных значений входной переменной k, при которых программа выдаёт тот же ответ, что и при входном значении k = 18. Значение k = 18 также включается в подсчёт различных значений k.

Паскаль Си Python
var k, i : longint;
function F(x: longint) : longint;
begin
if x < 2 then
F:= 1
else F:=3* F(x-1) – F(x-2)
end;
begin
i := 11;
readln(K);
while (i> 0) and (F(i) > K) do
i:=i-1;
writeln(i)
end.
#include <stdio.h>
int f(int n)
{
if (x < 2) return(1);
else return(3*f(x-1) – f(x-2));
}
int main(void)
{
int i, K;
i = 11;
scanf(″%d″, &k);
while ( i > 0 && f(i) > K)
i = i-1;
printf(″%d″, i);
}
def f(x):
if x < 2:
return 1
else:
return 3*f(x-1) – f(x-2)i = 11
k = int(input())
while (i > 0) and (f(i) > k):
i -= 1
print(i)

Решение:

i = 11; Начальное значение i равно 11.

while ( i > 0 && f(i) > K)
i–;

Пока условие истинно, i уменьшается.

F11=3.F10-F9

F10=3.F9-F8

F9=3.F8-F7

F8=3.F7-F6

F7=3.F6-F5

F6(3.13-5=34)=3.F5(13)-F4(5)

F5(3.5-2=13)=3.54(5)-F3(2)

F4(3.2-1=5)=3.F3(2)-F2(1)

F3(3.1-1=2)=3.F2(1)-F1(1)

Достаточно проверить до F6, потому что его значение 34 больше 18.

F(6)=34>18, максимум=33

F(5)=13, минимум=13

Количество чисел между 33 и 13, это 33-13+1=21.

Ответ: 21


Напишите в ответе наименьшее значение входной переменной k, при котором программа выдаёт тот же ответ, что и при входном значении k = 18.

Паскаль Си Python
var k, i : longint;
function f(n: longint): longint;
begin
f := n * n;
end;
function g(n: longint): longint;
begin
g := 2*n + 5;
end;
begin
readln(k);
i := 1;
while f(i) < g(k) do
i := i+1;
writeln(i)
end.
 #include <stdio.h>
int f(int n)
{
return(n*n);
}
int g(int n)
{
return(2*n + 5);
}
int main(void)
{
int k, i;
scanf(″%d″, &k);
i = 1;
while (f(i) < g(k))
i = i+1;
printf(″%d″, i);
}
def f(n):
return n*ndef g(n):
return 2*n + 5k = int(input())
i = 1
while (f(i) < g(k)):
i = i + 1
print(i)

Решение:

i = 1; Начальное значение i равно 1.

while f(i) < g(k) do
i := i+1;

i2<2.k+5; при k=18 => i2<2.18+5 => i2<41 => i=6

62=36<2.k+5 => k=16

Ответ: 16


Определите, количество чисел k, для которых следующая программа выведет такой же результат, что и для k = 12?

Паскаль Python Python
Delphi/Pascal
12
3
4
5
6
7
8
9
10
11
12
13
14
15
var k, i : longint;function f(n:longint): longint;begin f:= 3*n*n - 2*n;end;beginreadln(k);i := 1;while f(i) < k do i := i + 1;if f(i)-k <= f(i-1) then writeln(i)else writeln(i-1);end.
Python
12
3
4
5
6
7
8
9
10
def f(n): return 3*n*n - 2*nk = int(input())i = 1while f(i) < k: i += 1if f(i)-k <= f(i-1): print(i)else: print(i-1)

 
C++
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>using namespace std;long f(long n) { return 3*n*n - 2*n;}int main(){long k, i;cout >> k;i = 1;while ( f(i) < k ) i++;if (f(i)-k <= f(i-1)) cout << i;else cout << i-1;return 0;}

Решение:

k=12 => i=3

f(3)-12 <= f(2)
21-12 <= 8
9 <= 8

i-1 = 3-1 = 2

k=12,11,10,9 => i=3, i-1=3-1=2

k=7,8 => i=2, i=2

 

Ответ: 6