Есть программа, код приложу,нужно ее переделать используя счетчик.Если не сложно...

0 голосов

Есть программа, код приложу,нужно ее переделать используя счетчик.Если не сложно прокомментируйте нововведения.
program pr3;
const a = 2.12;
const b = 7.45;
const h = 0.34;
var x, f1, f2, y, s: real;
begin
x := a;
s := 0;
REPEAT
f1:=3*ln(exp(1/5)*ln(sin(x)+sqr(x)));
f2:=((2*x+1)/(x*x*x*x*x));
y := f1 / f2;
s := s + y;
x := x + h;
UNTIL x > b;
Writeln('S=', s:10:5);
end.


спросил от Начинающий (166 баллов) в категории Информатика
оставил комментарий от Архангел (142k баллов)

У Вас программа с ошибками: нет завершающей конструкции until для цикла repeat.

оставил комментарий от Начинающий (166 баллов)

скопировал плохо(

оставил комментарий от Начинающий (166 баллов)

что то я не пойму как его тут применить(

оставил комментарий от Начинающий (166 баллов)

да

оставил комментарий от Архангел (142k баллов)

Ой... счетчик - это цикл со счтчиком for...do?

оставил комментарий от Архангел (142k баллов)

xtnxbr - 'nj wbrk cj cxtnxbrjv&

оставил комментарий от Начинающий (166 баллов)

но уже поставил нужный вариант,гляньте пожалуйста

1 Ответ
0 голосов
ответил от Архангел (142k баллов)
 
Лучший ответ

Program pr3;

const {убраны лишние описатели - чистая косметика}
  a = 2.12;
  b = 7.45;
  h = 0.34;

var
  x, f1, f2, y, s: real;
  i, n: integer; {описание, необходимое для цикла}

begin
  { x := a; этот оператор не нужен }
  s := 0;
  n := Trunc((b - a) / h)+1; {стандартная формула числа повторений цикла }
  for i := 1 to n do { Заголовок цикла }
  begin   {начало блока для выполнения в цикле }
    x := a + (i - 1) * h;  { перенесено из конца цикла }
    f1 := 3 * ln(exp(1 / 5) * ln(sin(x) + sqr(x)));
    f2 := ((2 * x + 1) / (x * x * x * x * x));
    y := f1 / f2;
    s := s + y;
  end;  {конец блока для выполнения в цикле }
  Writeln('S=', s:10:5);
end.

Тестовое решение:

S=26390.53751






оставил комментарий от Архангел (142k баллов)

слово "неявной" тут лишнее, случайно влетело

оставил комментарий от Архангел (142k баллов)

Т.е. при i=1 мы получаем x=a*(1-1)*h=a, при i=2 получим x=a+(2-1)*h=a+h,... И при i=n получаем x=a+(n-1)*h, т.е. b

оставил комментарий от Архангел (142k баллов)

x=a+(i-1)*h позволяет снизить ошибки накопления, потому что значение х каждый раз получается "с нуля".

оставил комментарий от Архангел (142k баллов)

х у нас меняется от a до b с шагом h. Можно было просто написать до входа в цикл х:=a, а в конце тела цикла поставить x:=x+h. Но беда в том, что это дурной тон. Наращивание значения на h в каждом шаге цикла - не лучшее решение, потому что и a, и h могут точно в машине не представляться (например, нельзя представить шаг 1/3 в виде десятичной дроби, поэтому в программе, если написать 1/3+1/3+1/3, то 1 никогда не получится). И на каждом шаге цикла ошибка накапливается.

оставил комментарий от Начинающий (166 баллов)

без + 1 в конце

оставил комментарий от Начинающий (166 баллов)

ну там правда и сама формула цикла была другая

оставил комментарий от Начинающий (166 баллов)

можете пояснить формулу для получения х?Просто все примеры которые я встречал были с формулами х:= a+c (начальное число + шаг)

оставил комментарий от Архангел (142k баллов)

Эта формула в Паскале не сработает, только в Бейсике, да и то не в любом, потому что нельзя в Паскале или Си присвоить целочисленной переменной вещественное значение неявной из-за потери дробной части. А Trunc говорит, что дробную часть надо отбросить.

оставил комментарий от Архангел (142k баллов)

Там изменения в трех строках, обратите внимание, еще два комментария

оставил комментарий от Начинающий (166 баллов)

вроде понял,спасибо за объяснение

...