1

Тема: Допоможіть знайти помилку.

Написана программа для розрахунку суми коренів із 2 n разів двома способами. Программа працює, але рахує неправильно. Де помилка?

Program e;
Var
i,n:integer;
s:real;
Begin
    writeln('n');
    readln(n);
    s:=0;
    i:=0;
    Begin
        repeat
            i:=i+1;
            s:=sqrt(2+s);
        until
        n=i;
    end;
    Begin
        while
            n=i
        do
        i:=i+1;
        s:=sqrt(2+s);
    End;
    writeln ('s=',s:0:3);
    writeln ('n=',n);
    writeln ('i=',i);
    writeln ('s=',s:0:3);
    writeln ('n=',n);
    writeln ('i=',i);
end.

2

Re: Допоможіть знайти помилку.

Перша помилка в тому, що ви не описуєте завдання таким чином, щоб за ним можна було зрозуміти, що вам треба.
Друга в тому, що ви не використовуєте тег code.
Третя в тому, що ви не робите відступів.
Четверта в тому, що не описуєте конкретно проблеми (що саме ви очікували - а що отримали?)
Досить помилок? Чи ще шукати?

Подякували: DOP1

3 Востаннє редагувалося Ярослав (20.11.2015 09:53:57)

Re: Допоможіть знайти помилку.

Відступи допомагають зрозуміти структуру.
В циклах кожного разу рахується корінь із 2, тому, думаю, краще один раз його порахувати і запам’ятати:

a:=sqrt(2);

.
Якщо користувач вводить 5, то програмка порахує суму шести коренів, оскільки i приймає значення від 0 до 5: 0, 1, 2, 3, 4, 5. Тому треба або відняти 1 після вводу:

n:=n-1;

або привласнити i не 0, а 1.
Функція sqrt() постійно брала корінь із виразу 2+s, наскільки я зрозумів із умови, то треба брати корінь із 2, а потім додавати те, що ми уже маємо, тобто не sqrt(s+2), а sqrt(2) + s.

Прожка виглядає так:

Program e;
Var
    i,n:integer;
    a,s:real;
Begin
    writeln('n');
    readln(n);
    n:=n-1;
    a:=sqrt(2);
    s:=0;
    i:=0;
    
    Begin
        repeat
            i:=i+1;
            s:=a+s;
        until
            n=i;
    end;

    Begin
        while
            n=i
        do
            i:=i+1;
            s:=a+s;
    End;
    
    writeln ('s=',s:0:3);
    writeln ('n=',n);
    writeln ('i=',i);
    writeln ('s=',s:0:3);
    writeln ('n=',n);
    writeln ('i=',i);
end.

Вивід:

sh-4.3$ main 
n 
5 
s=7.071 
n=4
i=5  
s=7.071 
n=4
i=5