1. Какой ответ выдаст программа, если в массиве несколько элементов, удовлетворяющих условию задачи? Почему? 2. Что нужно изменить в программе, чтобы выдавался не первый из найденных элементов, а последний? 3. Измените условие цикла while, так чтобы использовалась логическая операция not.
Program z2_65;
uses crt;
Label a1,a2,a3,a4,a5,a6,a7;
var a,s,h,rv,ro,p:real;
n:integer;
begin
clrscr;
Writeln('Укажите номер пункта:');
writeln('1. Дана сторона треугольника.');
writeln('2. Дана площадь треугольника.');
writeln('3. Дана высота треугольника.');
writeln('4. Дан радиус вписанной окружности треугольника.');
writeln('5. Дан радиус описанной окружности треугольника.');
read(n);
case n of
1:Begin Write('a=');read(a);goto a1;end;
2:begin Write('s=');read(s);goto a2;end;
3:Begin Write('h=');read(h);goto a3;end;
4:Begin Write('r=');read(rv);goto a4;end;
5:Begin Write('R=');read(ro);goto a5;end;
else
begin
write('Такого номера пункта нет.');
goto a7;
end;
end;
a1: rv:=a/2;
ro:=a/Sqrt(3);
s:=sqrt(3)*sqr(a)/4;
h:=2*s/a;
goto a6;
a2: a:=sqrt(4*s/sqrt(3));
h:=2*s/a;
rv:=a/2;
ro:=a/Sqrt(3);
goto a6;
a3: a:=2*h/sqrt(3);
s:=a*h/2;
rv:=a/2;
ro:=a/Sqrt(3);
goto a6;
a4: a:=2*rv;
ro:=a/Sqrt(3);
s:=sqrt(3)*sqr(a)/4;
h:=2*s/a;
goto a6;
a5: a:=sqrt(3)*ro;
s:=(a*a*a)/(4*ro);
h:=2*s/a;
rv:=a/2;
a6: writeln('a=',a:2:2);
writeln('s=',s:2:2);
writeln('h=',h:2:2);
writeln('R=',ro:2:2);
writeln('r=',rv:2:2);
a7: readkey;
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.
Этот вариант существенно длиннее, но главное, что нужно долго вглядываться в текст программы, чтобы понять, что именно она делает.