1 Востаннє редагувалося Torbins (14.11.2013 10:46:06)

Тема: Проектування ітераційних алгоритмів

Є лабораторна робота
1 завдання, ось зробив програму, можете підкорегувати текст і виправити помилки!
дякую

program iteratcia;
uses crt;
var x,eps,xn,an,s,f,t:real;
    kk,i,n:integer;
    ind:boolean;
begin
  clrscr;
  repeat
  ind:=true;
  writeln('riad E(n=1..+00)(x^2n/(2n)!) pry X e [-10:10]');
  writeln('vvedit x');  readln(x);
  if (x<-10) or (x>10) then
    begin writeln ('nevirne x');
    ind:=false;
    end;
  until ind;
  writeln('Vvedit eps'); readln(eps);
  writeln('Vvedit limit kilkosti iteratsii'); readln(kk);
  xn:=x;
  n:=0;
  s:=0;
  repeat
   inc(n);
   xn:=xn*xn;
   f:=1;
  for i:=1 to (2*n) do
    an:=xn/f*i; s:=s+an;
  until (abs(an)<eps) or (n>=kk);
  if (n>kk) then writeln('Perevyscheno limit kilkosti krokiv');
  writeln('rezultat:');
  writeln('Kilkist krokiv iteratsii:',n);
  writeln('Nablyzhene znachennia funktsii:',s:1:12);
  t:=(exp(x)+exp(-x))/2-1;
  writeln('Tochne znachennia funktsii:',t:1:12);
  writeln(' |t-s|=', abs(t-s):1:12);
 readln;
end.

2

Re: Проектування ітераційних алгоритмів

А де помилки? Що не так працює? І що значить підкоректувати текст?

3

Re: Проектування ітераційних алгоритмів

xn:=xn*xn; тут переповнення плаваючої точки
і зробити шоб факторіал не накопичувало а рахувало разом з ФУНКЦІЄЮ

4

Re: Проектування ітераційних алгоритмів

Delphi edition, нічого не переповнюється

program iteratcia;

{$APPTYPE CONSOLE}

//uses crt;
var x,eps,xn,an,s,f,t:extended;
    kk,i,n:integer;
    ind:boolean;
begin
    //clrscr;
    repeat
        ind:=true;
        writeln('riad E(n=1..+00)(x^2n/(2n)!) pry X e [-10:10]');
        writeln('vvedit x');
        readln(x);
        if (x<-10) or (x>10) then
            begin 
                writeln ('nevirne x');
                ind:=false;
            end;
    until ind;
    
    writeln('Vvedit eps'); readln(eps);
    writeln('Vvedit limit kilkosti iteratsii'); readln(kk);
    xn:=x;
    n:=0;
    s:=0;
    
    repeat
        inc(n);
        xn:=xn*xn;
        f:=1;
        for i:=1 to (2*n) do
            an:=xn/f*i; s:=s+an;
    until (abs(an)<eps) or (n>=kk);
    
    if (n>kk) then writeln('Perevyscheno limit kilkosti krokiv');
    
    writeln('rezultat:');
    writeln('Kilkist krokiv iteratsii:',n);
    writeln('Nablyzhene znachennia funktsii:', s:1:12);
    t := (exp(x)+exp(-x))/2-1;
    writeln('Tochne znachennia funktsii:', t:1:12);
    writeln(' |t-s|=', abs(t-s):1:12);
    readln;
end.

real -> extended, і нічого не переповнюється

5 Востаннє редагувалося koala (14.11.2013 07:04:49)

Re: Проектування ітераційних алгоритмів

Grisha_20.95 написав:

Є лабораторна робота
1 завдання, ось зробив програму, можете підкорегувати текст і виправити помилки!
дякую

Подобаються мені такі люди... На сторінці 1 лабораторна (№9), 1 завдання (№1) і 26 варіантів. Звісно, треба вказати номер завдання, а то ми не здогадаємося, але варіант нащо вказувати, ми ж всі телепати і по неправильній програмі відгадаємо, що саме неправильно обчислюється. Мабуть, за тим, що решта обчислюється правильно.

Grisha_20.95 написав:

[code=pascal]
  xn:=x;
  n:=0;
  s:=0;
  repeat
   inc(n);
   xn:=xn*xn;
   f:=1;
  for i:=1 to (2*n) do
    an:=xn/f*i; s:=s+an;
  until (abs(an)<eps) or (n>=kk);
[/code]

Давайте спробую відгадати: n-кількість кроків, xn - це має бути x^2n, s-сума ряду при n кроках, f - значення факторіалу на черговому кроці, an-значення члена ряда. Ви це хотіли написати? А тепер давайте подивимося, що написали:

  repeat
    inc(n);{n=1,2,3 - ніби все правильно}
    xn:=xn*xn;{xn=x^2, x^4, x^8, x^16... гм... щось не так...}
    f:=1;{f - завжди 1}
    for i:=1 to (2*n) do{сума точно по всіх елементах від 1 до 2*n?
Чи тільки по парних і від 0?}
      an:=xn/f*i; {це еквівалент i*xn/f - ви точно так хотіли?}
    s:=s+an;{чомусь сума обчислюється не у внутрішньому циклі... я щось не бачу 
в завданні "знайдіть суму останніх членів рядів при кроці, що зростає"}
  until (abs(an)<eps) or (n>=kk);

Якщо я правильно зрозумів, що вам треба (а я не телепат, а ви не сказали варіант), то малося на увазі щось таке:

  repeat
    inc(n);
    xn:=xn*sqr(x);
    s:=0;
    an:=xn;
    for i:=1 to n do begin
      if i>0 then an:=an/(2*i);
      s:=s+an;
    end;
  until (abs(an)<eps) or (n>=kk);

І запам'ятайте на майбутнє:
1. Комп'ютер робить те, що ви йому скажете, а не те, що ви мали на увазі (хоча Гугл вже працює над цим :));
2. Тут немає телепатів, і ніхто не наймався працювати для вас компілятором. Коли викладаєте питання - спробуйте уявити, що це питають вас, і подивіться, що б ви перепитали, якби отримали таке питання. А потім додайте цю інформацію в питання, щоб вас не перепитували.

Подякували: Torbins, Replace2