Пожалуйста помогите пожалуйста.Программирование циклических алгоритмов. ВЫЧИСЛИТЬ...

0 голосов
75 просмотров

Пожалуйста помогите пожалуйста.Программирование циклических алгоритмов. ВЫЧИСЛИТЬ КОЛИЧЕСТВО ОТРИЦАТЕЛЬНЫХ ЗНАЧЕНИЙ sin(fi)НА ИНТЕРВАЛЕ [а,b] С ЗАДАННЫМ ШАГОМ


Информатика (386 баллов) | 75 просмотров
Дано ответов: 2
0 голосов
Правильный ответ
// PascalABC.NET 3.2, сборка 1425 от 22.04.2017
// Внимание! Если программа не работает, обновите версию!

begin
  var a,b,h,fi:real;
  Write('Укажите границы интервала табуляции и шаг: ');
  Read(a,b,h);
  var k:=0;
  fi:=a;
  while fi<=b+0.1*h do begin<br>    if sin(fi)<0 then k+=1; fi+=h<br>    end;
  Writeln('Отрицательных значений- ',k)
end.

Пример
Укажите границы интервала табуляции и шаг: -6 5 0.2
Отрицательных значений- 25

Вариант для большого количества промежуточных точек, снижающий влияние накапливающейся из-за возможной неточности представления вещественных чисел, погрешности:

// PascalABC.NET 3.2, сборка 1425 от 22.04.2017
// Внимание! Если программа не работает, обновите версию!

begin
  var a,b,h,fi:real;
  Write('Укажите границы интервала табуляции и шаг: ');
  Read(a,b,h);
  var n:=Trunc((b-a)/h)+1;
  var k:=0;
  for var i:=1 to n do begin
    fi:=a+h*(i-1); Println(fi,sin(fi));
    if sin(fi)<0 then k+=1<br>    end;
  Writeln('Отрицательных значений- ',k)
end.

(150k баллов)
0 голосов

Var a,b,h,fi,y:real; k,i:integer;
begin
 writeln('a, b, h:');
 readln(a,b,h);
 k:=0;
 fi:=a-h;
 for i:=1 to round((b-a)/h)+1 do
  begin
  fi:=fi+h;
  y:=sin(fi);
  if y<0 then k:=k+1;<br>  writeln(fi:4:1,' ',y:5:3);
  end;
 writeln('k = ',k);
 end.

Пример:
a, b, h:
-0.5 0.5 0.1
-0.5 -0.479
-0.4 -0.389
-0.3 -0.296
-0.2 -0.199
-0.1 -0.100
-0.0 -0.000
 0.1 0.100
 0.2 0.199
 0.3 0.296
 0.4 0.389
 0.5 0.479
k = 6

PS. Значения, очень близкие к 0, можно не учитывать. В этом случае вместо y<0 можно написать, например, условие abs(y)<eps, где eps - малое число.

(194k баллов)