Персональная страничка
Диканева Тараса
Викторовича

Главная \ Преподавательское \ Программирование для начинающих

9. Циклы while и repeat

Предыдущий раздел:

Следующий раздел:

Задание 9: Циклы while и repeat

1. Напечатайте на экране 10 раз слово Hello с помощью цикла while и столько же с помощью цикла repeat.

2. Напечатайте в столбик нечетные числа от 3 до 25.

3. Найти минимальное число большее 300, которое делится на 19.

4. Определить, является ли введенное пользователем число степенью тройки (не используя логарифмы).

5. Из мат. анализа известно, что последовательность сумм вида:

    s_n=1-\frac{\displaystyle x^2}{\displaystyle 2!}+\frac{\displaystyle x^4}{\displaystyle 4!}-\frac{\displaystyle x^6}{\displaystyle 6!}+\ldots+(-1)^n\frac{\displaystyle x^{2n}}{\displaystyle (2n)!}

сходится к функции \cos(x). Напишите программу, которая будет суммировать этот ряд до тех пор, пока очередная добавка не окажется меньше 10-6.

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

7. Последовательность Фибоначчи определяется рекуррентным соотношением x_{n+1}=x_n+x_{n-1}, где x_1=1, x_2=1. Найдите первое число в последовательности Фибоначчи, которое больше 1000.

8. Для n-го члена в последовательности Фибоначчи существует явная формула

    x_n=\frac{\displaystyle 1}{\displaystyle \sqrt{5}}\left (\left (\frac{\displaystyle 1+\sqrt{5}}{\displaystyle 2}\right )^n-\left (\frac{\displaystyle 1-\sqrt{5}}{\displaystyle 2}\right )^n\right )

Поскольку операции с вещественными числами происходят с конечной точностью, то, начиная с определенного n, эта формула будет врать. Найдите n, начиная с которого, отличие от истинного значения составит 0.001.

9. Создайте программу, играющую с пользователем в орлянку. Программа должна спрашивать у пользователя орел или решка. Если пользователь вводит 0, то выбирает орла, 1 – решку, любое другое число – конец игры. Программа должна вести учет выигрышей и проигрышей и после каждого раунда сообщать пользователю о состоянии его счета. Пусть вначале на счету 1 рубль и ставка в каждом коне тоже 1 рубль. Если денег у пользователя не осталось игра прекращается.

10. Усовершенствуйте разработанный в предыдущем задании «игровой автомат» таким образом, чтобы выигрыш происходил только в 40% случаев.

11. В 1593 году Франсуа Виет предложил для вычисления числа \pi формулу

    \frac{\displaystyle 2}{\displaystyle \pi}=\sqrt{\frac{\displaystyle 1}{\displaystyle 2}}\cdot   \sqrt{\frac{\displaystyle 1}{\displaystyle 2}+\frac{\displaystyle 1}{\displaystyle 2}\sqrt{\frac{\displaystyle 1}{\displaystyle 2}}}\cdot  \sqrt{\frac{\displaystyle 1}{\displaystyle 2}+\frac{\displaystyle 1}{\displaystyle 2}\sqrt{\frac{\displaystyle 1}{\displaystyle 2}+\frac{\displaystyle 1}{\displaystyle 2}\sqrt{\frac{\displaystyle 1}{\displaystyle 2}}}}\cdot \ldots

В 1655 году профессор Оксфордского университета Джон Уоллис (John Wallis) предложил формулу:

    \frac{\displaystyle 2}{\displaystyle \pi}=  \frac{\displaystyle 1\cdot 3}{\displaystyle 2\cdot 2}\cdot  \frac{\displaystyle 3\cdot 5}{\displaystyle 4\cdot 4}\cdot  \frac{\displaystyle 5\cdot 7}{\displaystyle 6\cdot 6}\cdot  \frac{\displaystyle 7\cdot 9}{\displaystyle 8\cdot 8}\cdot \ldots

Сообщив о ней лорду Брункеру (Lord Brouncker), он получил в ответ разложение

    \frac{\displaystyle 4}{\displaystyle \pi}=  1+\frac{\displaystyle 1}{\displaystyle   2+\frac{\displaystyle 9}{\displaystyle   2+\frac{\displaystyle 25}{\displaystyle   2+\frac{\displaystyle 49}{\displaystyle   2+\ldots}}}}

Наконец, 1674 году Г. Лейбниц показал, что

    \frac{\displaystyle \pi}{\displaystyle 4}=1-\frac{\displaystyle 1}{\displaystyle 3}+\frac{\displaystyle 1}{\displaystyle 5}-\frac{\displaystyle 1}{\displaystyle 7}+\ldots

Определите, какой из этих способов обеспечивает более быструю сходимость.

Следующий раздел:

Предыдущий раздел:

35 комментариев

  1. Всеволод

    Поясніть що потрібно зробити в 4 задачі??

  2. Всеволод

    Поясніть що таке число фібоначі??

  3. Taras

    >> Поясніть що потрібно зробити в 4 задачі??

    Программа должна в ответ на введенное число говорить, «Это степень тройки» (для чисел 1, 3, 9, 27 и т.д) или «Нет, это не степень» для всех остальных.

    >> Поясніть що таке число фібоначі??

    Определение дается в задаче 7: «Последовательность Фибоначчи определяется рекуррентным соотношением x_{n+1}=x_n+x_{n-1}, где x_1=1, x_2=1». То есть первые два числа равны 1, а каждое следующее — сумма двух предыдущих. Получаем соответственно 1, 1, 2, 3, 5, 8, …

  4. Игорёк

    Пятая задача. Хотелось бы узнать, делается ли у меня шаг+1;
    program zd43;
    var o,x,i,a,b,c,d,k,m:integer;
    s:real;
    begin
    writeln(‘Ââåäèòå x’);
    readln(x);
    k:=2;
    i:=1;
    d:=1;
    c:=-1;
    s:=1;
    a:=1;
    m:=1;
    repeat
    i:=i+1;
    k:=k*i;
    c:=c*a;
    d:=x*d*x;
    s:=s+(c*d/k);
    writeln(s);
    until c*d/k<0.000001;

    end.

  5. Игорёк

    Необходимо убрать с, как я понял, иначе цикл прервётся сразу же, т.к будет отрицательное значение. Если без с, будет ли правильно всё, просто я немного не уверен, как здесь делается шаг, т.е как именно понимается, что шаг +1 или +2 и т.д

  6. Taras

    Программа явно делает не то, причем уже на первом шаге. Для проверки берешь, какое-нибудь простое число (x = 2, например), считаешь вручную, что должно получиться, а потом в режиме отладки после выполнения каждой строки смотришь, равны переменные тому, чему ты хотел бы или нет.

    Про «шаг +1 или +2» не понял. Шагом логично назвать однократное выполнение операторов в теле цикла.

  7. Игорёк

    нашёл ошибку, в факториале как я понимаю. Т.е это факториал должен быть увеличен в 2 раза ? Если произведение 3 чисел, то должен быть как произведение 6-ти чисел ? или просто умножить на 2 ?

  8. Taras

    2! = 1 * 2 = 2
    4! = 1 * 2 * 3 * 4 = 24
    6! = 1 * 2 * 3 * 4 * 5 * 6 = 720

    Что-то мне подсказывает, что умножением на 2 тут не обойдешься.

  9. Игорёк

    <Потерто>

    А если так, будет ли это теперь правильным решением ?

  10. Taras

    Очень похоже на правду. Я даже стер, чтобы никто не подсмотрел раньше времени ))

    А чтобы убедиться, что все точно правильно, выведи рядом со своим ответом cos(x). Если отличия будут не раньше чем в 6-м знаке после запятой, значит все в порядке.

  11. Taras

    Кстати, в repeat’е begin и end не нужны.

  12. Игорёк

    9-я задача. Паскаль сам должен определять выиграл или проиграл ? при выборе орла или решки.

  13. Игорёк

    и ещё, здесь может надо сделать через переменные логического типа ? Просто немного непонятно как сделать так,чтобы результат писало выиграл или проиграл при выборе орла или решки.

  14. Taras

    В Паскале есть такая функция random, которая дает случайное (на самом деле не совсем, но не суть) значение, которое с равной вероятностью равно любому вещественному числу в диапазоне [0; 1). Ну, то есть пишешь:

    x := random;

    и x будет случайным числом. С ее помощью и можно организовывать случайные события типа «выиграл» или «проиграл».

  15. Dima

    kak объяснить что в задаче 5, мое значение получается правильным только при точности 0.001-
    мое- -0.989939630681818
    cos(3) -0.989992496600445
    а при точности 0.000001-
    -0.972201034714899
    -0.989992496600445

    не понимаю

  16. оксана

    проверьте, пожалуйста, 9 задание:


    Был текст программы

    Намекните как 10 сделать с процентами)))

  17. Taras

    Я стал богаче на 17 виртуальных рублей. Это положительным образом характеризует твою программу.

    В 10-й — просто представь, что ты владелица казино. Мне кажется, мышление сразу должно встать на правильную дорогу.

  18. оксана

    Да вы везунчик, я выше 7 рублей не поднималась))) А в 10й может быть просто заменить y:=random(2) на y:=random(3)?

  19. Taras

    Угадывание одного варианта из 3-х даст выигрыш лишь в 33% случаев. А надо в 40%.

  20. оксана

    тогда может быть так:
    var
    x,y,d: integer;
    k2: boolean;
    begin
    d:=1;
    writeln(‘Привет! Давай поиграем в орлянку. Ввод числа «0» означает «орел», ввод числа «1» — «решка». Если случайно введешь другое число, то к сожалению игра закончится(((‘);
    writeln(‘Игра начинается. Сейчас на твоем счету 1 рубль. Угадай орел или решка?’);
    write(‘введи число ‘);
    readln(x);
    y:= random(2);
    while (x=1) or (x=0) do
    begin
    if x=y then
    begin
    d:=d+1;
    y:= random(3);
    writeln(‘Угадал! Теперь на твоем счете ‘,d,’ руб.’);
    writeln(‘Продолжим?’);
    write(‘введи число ‘);
    readln(x);
    end else
    begin
    d:=d-1;
    y:= random(2);
    if d>0 then
    begin
    writeln(‘Не угадал, теперь на твоем счете ‘,d,’ руб.’);
    writeln(‘Попробуй еще раз’);
    write(‘введи число ‘);
    readln(x);
    end else
    begin
    writeln(‘На твоем счете 0 рублей, к сожалению игра закончена(((‘);
    break;
    end;
    end;
    end;
    k2:=((x1) and (x0));
    if k2 then
    writeln(‘неправильное число, игра закончена’);
    end.

  21. Taras

    Тут вероятность зависит от результата предыдущего раунда и равна либо 1/2, либо 1/3, но никогда 40%, то есть 2/5. Даже частота выигрышей и та совсем не 40%.

  22. оксана

    А так?:
    var
    x,y,d: integer;
    k2: boolean;
    begin
    d:=1;
    writeln(‘Привет! Давай поиграем в орлянку. Ввод числа «0″ означает «орел», ввод числа «1″ — «решка». Если случайно введешь другое число, то к сожалению игра закончится(((‘);
    writeln(‘Игра начинается. Сейчас на твоем счету 1 рубль. Угадай орел или решка?’);
    write(‘введи число ‘);
    readln(x);
    while (x=1) or (x=0) do
    begin
    y:= random(5);
    if y=2 then
    x:=y;
    if x=y then
    begin
    d:=d+1;
    writeln(‘Угадал! Теперь на твоем счете ‘,d,’ руб.’);
    writeln(‘Продолжим?’);
    write(‘введи число ‘);
    readln(x);
    end else
    begin
    d:=d-1;
    if d>0 then
    begin
    writeln(‘Не угадал, теперь на твоем счете ‘,d,’ руб.’);
    writeln(‘Попробуй еще раз’);
    write(‘введи число ‘);
    readln(x);
    end else
    begin
    writeln(‘На твоем счете 0 рублей, к сожалению игра закончена(((‘);
    break;
    end;
    end;
    end;
    k2:=((x1) and (x0));
    if k2 then
    writeln(‘неправильное число, игра закончена’);
    end.

  23. Taras

    Для каждого из вариантов y:
    y = 0 -> вероятность выигрыша 0.5
    y = 1 -> вероятность выигрыша 0.5
    y = 2 -> вероятность выигрыша 1
    y = 3 -> вероятность выигрыша 0
    y = 4 -> вероятность выигрыша 0
    Поскольку вероятность каждого из значений y есть 1/5 = 0.2, то вероятность выигрыша получается равной
    0.2*0.5 + 0.2*0.5 + 0.2*1 = 0.4

    Ура!

    Честно говоря, не ожидал, что получится правильная вероятность ))

    Я бы еще упростил решение. Например, так

    if random(5) < 2 then
      writeln('Угадал!');

    или так

    if random < 0.4 then
      writeln('Угадал!');
  24. оксана

    Ура!

  25. АленА

    По 11 задаче, полный затык по Брункеру подсчитать, хоть намекните немного, у меня 3,99…, но никак не Пи. В других вариантах считала Пи до 5-той цифры после запятой:
    — По Виету за 8 шагов;
    — По Уоллису за 78539 шагов;
    — По Лейбницу за 100001 шагов.

  26. АленА

    Получилось по Брункеру — за 100000 шагов (точность в 0,00001).

    Ответ к 11-той: более быстрая сходимость, как видно, по Виету.

  27. Darkhan

    program N9_10;{игровой автомат,40%выигрышей}
    var
    n, p, x:integer;
    z:real;
    begin
    p:=1;
    n:=0;
    while x<2 do
    begin
    writeln('Выберите 0 или 1');
    readln(x);
    n:=n+1;
    z:=random;
    if (z<0.4)or(z=0.4) then
    p:=p+1 else
    p:=p-1;
    if p=0 then
    begin
    x:=2;
    writeln('Вы проиграли');
    end else
    writeln('На вашем счету,рублей', ' ', p);
    end;
    writeln('Сыграно конов', ' ', n);
    writeln('Выиграно конов', ' ', n div 2);
    writeln('Проиграно конов', ' ', n div 2 +1);
    end.

  28. Alex_Kot

    Program Z_9_7 {Последовательность Фибоначчи, X_n+1>1000};
    var {0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597 …}
    x, x1, x2: integer;
    begin
    x:=1;
    x1:=1;
    x2:=0;
    write(‘ Последовательность Фибоначчи:’, x2, ‘,’, x1, ‘,’, x, ‘,’);
    repeat
    x2:=x1;
    x1:=x;
    x:=x1+x2;
    write(x, ‘,’);
    until x>1000;
    write(‘…’);
    writeln;
    writeln(‘ X=’, x);
    end.

  29. Alex_Kot

    Может быть так?
    Program Z_9_8; {Последовательность Фибоначчи}
    var {0,1,1,2,3,5,8,13,21,34,55,89,144,233,377,610,987,1597 …}
    n, i: integer;
    a, b, delta, eps: real;
    x, x1, x2, Xn: real; {!!!}
    begin
    x:=1;
    x1:=1;
    x2:=0;
    n:=2;
    eps:=1e-3;
    delta:=0;
    repeat
    n:=n+1;
    x2:=x1;
    x1:=x;
    x:=x1+x2;
    a:=1;
    b:=1;
    for i:=1 to n do
    begin
    a:=a*(1+sqrt(5))/2;
    b:=b*(1-sqrt(5))/2;
    end;
    Xn:=(a-b)/sqrt(5);
    delta:=abs(Xn-x);
    until delta>eps;
    writeln(n, ‘,’);
    writeln(‘ Xn=’, Xn);
    writeln(‘ x=’, x);
    end.

  30. Alex_Kot

    Какова вероятность выиграша?
    Program Z9_10; {Игральный автомат, 40%}
    var
    n, n1, n2, x, S: real;
    Z: boolean;
    begin
    S:=1; {состояние счета}
    n:=0; {n=n1+n2}
    n1:=0; {количество выиграшей}
    n2:=0; {количество проиграшей}
    Z:=false;
    repeat
    readln(x);
    if (x=0) or (x=1) then
    begin
    n:=n+1;
    if (abs(x-random)<=0.4) then
    begin
    S:=S+1;
    n1:=n1+1;
    end else
    begin
    S:=S-1;
    n2:=n2+1;
    end;
    writeln(' S=', S, ' n1=', n1, ' n2=', n2);
    end else
    Z:=true;
    until (S=0) or Z;
    if Z then
    writeln(' FINISH! ВВОД НЕВЕРНЫЙ!')
    else
    writeln('FINISH! ИГРА ОКОНЧЕНА n=', n);
    end.

  31. Alex_Kot

    В задаче Z9_11 самая быстрая сходимость по Виетту: точность 1e-14 можно получить всего за 24 шага (это решение удобно использовать для сравнения с другими разложениями). Но во времена Виетта не было компьютеров для вычисления sqrt. Самое интересное решение по Lord Brounker. Хорошая сходимость. 11 точных знаков получается всего за 5000 шагов. При этом точность тем выше, чем больше начальное значение k. Хорошо брать начальное значение x примерно равным k:
    Program Z9_11_v; {Вычисление числа Pi разложением Lord Brounker}
    var
    k, n: integer;
    x, z: real;
    begin
    n:=0;
    k:=9999;
    x:=9999;
    repeat
    k:=k-2;
    x:=2+k/x*k; {x:=2+(k*k)/x}
    z:=4/(x-1); {4/z+1=x, откуда z=4/(x-1)}
    write(‘ ‘, z);
    n:=n+1;
    until k=1;
    writeln(‘ n=’, n);
    end.

  32. Alex_Kot

    Классное пособие! Как здоровье Тараса Викторовича, однако?

  33. Taras

    Здоровье, спасибо, в прядке :))
    Со временем не очень. Некогда в комментариях общаться.

  34. Ruslan

    //Задание 9: Циклы while и repeat
    //7. Последовательность Фибоначчи определяется рекуррентным соотношением
    // x_{n+1}=x_n+x_{n-1}, где x_1=1, x_2=1.
    //Найдите первое число в последовательности Фибоначчи, которое больше 1000.
    program a97;
    var
    a, aa, bolshe: integer;
    begin
    bolshe:=1000;
    a:=1;
    aa:=0;
    while (aa<bolshe) and (abolshe) and (aa>bolshe) then
    begin
    write (‘Первое число в последовательности Фибоначчи, которое больше ‘, bolshe, ‘ это ‘, a);
    end else
    write (‘Первое число в последовательности Фибоначчи, которое больше ‘, bolshe, ‘ это ‘, aa);
    end.

  35. Ruslan

    //Задание 9: Циклы while и repeat
    //8. Для n-го члена в последовательности Фибоначчи существует явная формула
    //http://www.tvd-home.ru/prog/t9
    //Поскольку операции с вещественными числами происходят с конечной точностью, то, начиная с определенного n, эта формула будет врать.
    //Найдите n, начиная с которого, отличие от истинного значения составит 0.001.
    program a98;
    var
    n, y, x, xx, a, b, aa, bb: real;
    begin
    aa:=1;
    bb:=1;
    a:=((1+sqrt(5))/2);
    b:=((1-sqrt(5))/2);
    while y<1 do
    begin
    x:=(1/sqrt(5))*(aa-bb);
    // write (x, ' ');
    aa:=aa*a;
    bb:=bb*b;
    xx:=trunc (x);
    // write (xx);
    // writeln;
    y:=(x-xx)*1000;
    n:=n+1;
    end;
    write ('Начиная с ', n ,' отличие от истинного значения составит 0.001');
    end.

    Ответ — Program_9.8.pas(20) : Ошибка времени выполнения: Значение было недопустимо малым или недопустимо большим для Int32.

Добавить комментарий