По заданному на рисунке графику найти значение функции у по переменной х, у изменяется от (-1,1)
var
x,y,z: double;
begin
readln(x);
z:= Frac(Abs(x)/6)*6;
if z<1 then y:= 1-z
else if z<2 then y:= 0
else if z<3 then y:= 2-z
else if z<4 then y:= z-4
else if z<5 then y:= 0
else y:= z-5;
writeln(y:8:3);
readln
end.
const
a: array [0..5] of double = ( 1, 0, 2,-4, 0,-5);
b: array [0..5] of double = (-1, 0,-1, 1, 0, 1);
var
x,y,z: double;
begin
readln(x);
z:= Frac(Abs(x)/6)*6;
y:= a[Trunc(z)]+b[Trunc(z)]*z;
writeln(y:8:3);
readln
end.
И еще один способ до кучи ))
var
x,y: double;
begin
readln(x);
y:= Round(Cos(Trunc(x)*Pi/3)*0.9)+(Round(Cos((Trunc(x)+1)*Pi/3)*0.9)-Round(Cos(Trunc(x)*Pi/3)*0.9))*Frac(x);
writeln(y:8:3);
readln
end.
Что-то не отпускает меня эта задача.. Вот еще один способ
Тут я для разнообразия выделил повторяющиеся вычисления в функцию - в третьем способе это тоже напрашивается. Способ вообще аналогичен третьему, но там периодичность достигалась косинусом, а тут - простым делением на 6 (как в первых двух).
var
x,y: double;
function f(x: double): double;
begin
f:= Round(Abs(Frac(x/6)-0.5)*4-1)
end;
begin
readln(x);
x:= Abs(x);
y:= f(Trunc(x)) + (f(Trunc(x+1))-f(Trunc(x)))*Frac(x);
writeln(y:8:3);
readln
end.
var
x,y,z: double;
begin
readln(x);
z:= Abs(Frac(Abs(x)/6)*6-3);
if z<1 then y:= z-1
else if z<2 then y:= 0
else y:= z-2;
writeln(y:8:3);
readln
end.
Шестой способ центрирован на середины горизонтальных отрезков. Вся область разбивается на куски длиной 3 (с центрами в означенных точках). На каждом таком куске наша функция оказывается нечетной, при этом знак функции чередуется от куска к куску:
var
x,y: double;
function f(x: double): double;
begin
f:= Abs(Frac(x/3)-0.5)
end;
begin
readln(x);
x:= Abs(x);
if f(x)<1/6 then y:=0
else y:= (f(x)*3-0.5)*(1-Trunc((x+1.5)/3) mod 2*2);
writeln(y:8:3);
readln
end.
Еще одна модификация первого способа, но в другом смысле (нежели чем способ 5). Просто замена вложенных if на case, что позволяет немало сократить код:
var
x,y,z: double;
begin
readln(x);
z:= Frac(Abs(x)/6)*6;
case Trunc(z) of
0: y:= 1-z;
1,4: y:= 0;
2: y:= 2-z;
3: y:= z-4;
else y:= z-5;
end;
writeln(y:8:3);
readln
end.
var
x,y,z: double;
i: integer;
begin
readln(x);
z:= Frac(Abs(x)/6)*6;
i:= Trunc(z);
case i of
0,2: y:= i div 2+1-z;
1,4: y:= 0;
else y:= z-4-(i-3) div 2;
end;
writeln(y:8:3);
readln
end.
case(cos(x*pi/3)-cos(pi/3),1-arccos(cos(x*pi/3))*3/pi,case(cos(x*pi/3)-cos(2*pi/3),0,2-arccos(cos(x*pi/3))*3/pi))
(case - это такая функция, которая в зависимости от знака первого аргумента возвращает второй или третий)
case i of
0 .. 2, 4 : y := abs(1 - i mod 3)*(i div 2 + 1 - z) + 0;
else y := z - 4 - (i - 3) div 2;
end;