Задача Паскаль не могу прийти к иному(верному решению)

Рейтинг: -1Ответов: 1Опубликовано: 17.04.2015

Решал, решал и "дорешался"...(целый день занимался решением задач)

Чтобы ввести в курс дела - Собственно сама задача:

Даны числа от 1 до N. Вычислять: S=1/1+1/2+1/3 ..... + 1/N, вплоть до слагаемого, меньшего заданного E(E<1).

Моё решение:(Часто приводит к ошибкам в процессе исполнения программы и я скорее прихожу к выводу что я неправильно понял задачу)

program page42number4;

label met;
var
    N, k: integer;
    E, t: real;

begin
    Writeln('Write N - integer');
    Readln(N);
    met: Writeln('Write E - real (E<1)');
    Readln(E);
    if (E > 1) and (E <> 1) then goto met;
    k := 2;t := 0;
    while (k < N) do 
    begin
        if t < E then
        begin
            t := 1 / k + t;
            k := k + 2;
        end;
    end;
    Writeln('T=', t,'', 'E=', e);
end.

P.S.Прошу помочь мне разобраться в своих ошибках.

Кстати по составленной мною блок-схеме все правильно должно быть, хотя опять же не факт что блок-схему верно составил

Ответы

▲ 1

Ошибки:

  • Почему k увеличивается на 2, а не на 1?
  • Почему t сравнивается с погрешностью E, а не 1/k?
  • Почему вы начинаете с k=2? Нужно с k=1.
  • Почему вы сравниваете k и N как условие выхода? Нужно1/kиE`

В остальном всё нормально.

program page42number4;

label met;
var
    N, k: integer;
    E, t: real;

begin
    {
     N нас не интересует, потому что ограничения по N нет
     Writeln('Write N - integer');
     Readln(N);
    }
    met: Writeln('Write E - real (E<1)');
    Readln(E);
    if (E > 1) and (E <> 1) then goto met;

    { k должно быть равно 1, а не 2 на первой итерации }
    k := 1;t := 0;

    { условие выхода: 1/k < E => следовательно, пока 1/k >= E, продолжаем }
    while (1/k >= E) do 
    begin
        { if уже не нужен
        if t < E then
        begin }

            t := 1 / k + t;
            k := k + 1; { k увеличиваем на 1, а не на 2 }

        { end; }
    end;
    Writeln('T=', t,'', 'E=', e);
end.