Создайте Series из последовательности 15 значений, равномерно разбивающих отрезок [0, 20]. Определите отношение элементов полученной серии к их предыдущим элементам (*). В результате необходимо получить среднее полученного вектора, оставив в нём только те значения, которые не более чем 1.5 (**). Выберите из ответов тот, который максимально близок к полученному (c точки зрения абсолютной разницы). Варианты ответов: - 1) 1.24 - 2) 1.18 - 3) 0.71 - 4) 1.13
Пояснения: (*) Если было бы необходимо найти последовательность из 3-х значений, равномерно разбивающих отрезок [0,1], то это были бы значения [0, 0.5, 1]. (**) Если был бы дан список элементов a = [1,2,3,12], отношения элементов к предыдущим будут равны [NaN, 2, 1.5, 4]. А на последнем этапе в таком примере останется только [1.5] и среднее значение будет также 1.5.
N, s, i: Integer;
s1: real;
begin
readln(N); {общий ввод для всех задач}
if N < 0 then
writeln('Задача 1. N=', 0)
else writeln('Задача 1. N=', N + 4);
s := 0;
for i := 1 to n do
s := s + i;
writeln('Задача 7. 1+2+3+…+N=', s);
write('Задача 9. Последовательность от N до 1 = ');
for i := n downto 1 do
write(i, ' ');
writeln();
s1 := 0;
for i := 1 to n do
s1 := s1 + i / 10;
writeln('Задача 12. 0,1+0,2+0,3+..+N/10=', s1);
write('Задача 13. Последовательность квадратов от 1 до N = ');
for i := 1 to n do
write(i * i, ' ');
writeln();
write('Задача 14. Последовательность первых N нечетных чисел = ');
for i := 1 to n do
write(2 * i - 1, ' ');
writeln();
if N > 0 then
writeln('Задача 20. N степень 3 = ', frac(ln(n) / ln(3)) = 0);
s := 0;
for i := 1 to n do
if n mod i = 0 then
s := s + i;
writeln('Задача 24. Сумма всех натуральных делителей числа N (сключая 1 и N) = ', s);
end.
"Современное решение"
// PascalABC.NET 3.0, сборка 1076
begin
var n:=ReadInteger('Количество элементов в массиве: ');
var x:=ArrRandom(n,-20,20);
Writeln('Массив Х'); x.Println;
Write('Ср. арифм. отрицательных элементов после первого, большего 10: ');
var a1:=x.SkipWhile(x->x<=10).Where(x->x<0);
if a1.Count=0 then Writeln('пусто')
else Writeln(a1.Average);
Write('Ср. арифм. всех элементов до первого, большего 10: ');
a1:=x.TakeWhile(x->x<=10);
if a1.Count=0 then Writeln('пусто')
else Writeln(a1.Average)
end.
Тестовые просчеты:
Количество элементов в массиве: 15
Массив Х
-11 11 16 -7 11 -8 10 -16 15 -15 -10 -8 -6 -13 -17
Ср. арифм. отрицательных элементов после первого, большего 10: -11.1111111111111
Ср. арифм. всех элементов до первого, большего 10: -11
Количество элементов в массиве: 13
Массив Х
14 -9 1 2 12 -15 0 16 -19 16 -11 -15 -12
Ср. арифм. отрицательных элементов после первого, большего 10: -13.5
Ср. арифм. всех элементов до первого, большего 10: пусто
Количество элементов в массиве: 5
Массив Х
-11 2 0 15 7
Ср. арифм. отрицательных элементов после первого, большего 10: пусто
Ср. арифм. всех элементов до первого, большего 10: -3
Количество элементов в массиве: 3
Массив Х
15 10 8
Ср. арифм. отрицательных элементов после первого, большего 10: пусто
Ср. арифм. всех элементов до первого, большего 10: пусто
"Школьный вариант решения"
// PascalABC.NET 3.0, сборка 1076
const
nmax=50; { максимальное кол-во элементов }
var
i,n,p,s1,s2,k2:integer;
x:array[1..nmax] of integer;
begin
Write('Количество элементов в массиве: '); Read(n);
Randomize;
Writeln('Массив Х');
p:=0;
for i:=1 to n do begin
x[i]:=Random(41)-20;
Write(x[i],' ');
if p=0 then
if x[i]>10 then p:=i;
end;
Writeln;
Write('Ср. арифм. отрицательных элементов после первого, большего 10: ');
if p=0 then Writeln('пусто')
else begin
s2:=0; k2:=0;
for i:=p+1 to n do
if x[i]<0 then begin s2:=s2+x[i]; Inc(k2) end;
if k2=0 then Writeln('пусто')
else Writeln(s2/k2)
end;
Write('Ср. арифм. всех элементов до первого, большего 10: ');
if p=0 then Writeln('пусто')
else begin
s1:=0;
for i:=1 to p-1 do s1:=s1+x[i];
Writeln(s1/(p-1))
end
end.
Этот вариант существенно длиннее, но главное, что нужно долго вглядываться в текст программы, чтобы понять, что именно она делает.