Персональная страничка
| ||
Предыдущий раздел:
Следующий раздел:
1. Напечатайте на экране 10 раз слово Hello с помощью цикла while и столько же с помощью цикла repeat.
2. Напечатайте в столбик нечетные числа от 3 до 25.
3. Найти минимальное число большее 300, которое делится на 19.
4. Определить, является ли введенное пользователем число степенью тройки (не используя логарифмы).
5. Из мат. анализа известно, что последовательность сумм вида:
сходится к функции . Напишите программу, которая будет суммировать этот ряд до тех пор, пока очередная добавка не окажется меньше 10-6.
6. Напишите программу, которая запрашивает у пользователя числа до тех пор, пока каждое следующее число больше предыдущего. В конце программа сообщает, сколько чисел было введено.
7. Последовательность Фибоначчи определяется рекуррентным соотношением , где , . Найдите первое число в последовательности Фибоначчи, которое больше 1000.
8. Для n-го члена в последовательности Фибоначчи существует явная формула
Поскольку операции с вещественными числами происходят с конечной точностью, то, начиная с определенного n, эта формула будет врать. Найдите n, начиная с которого, отличие от истинного значения составит 0.001.
9. Создайте программу, играющую с пользователем в орлянку. Программа должна спрашивать у пользователя орел или решка. Если пользователь вводит 0, то выбирает орла, 1 – решку, любое другое число – конец игры. Программа должна вести учет выигрышей и проигрышей и после каждого раунда сообщать пользователю о состоянии его счета. Пусть вначале на счету 1 рубль и ставка в каждом коне тоже 1 рубль. Если денег у пользователя не осталось игра прекращается.
10. Усовершенствуйте разработанный в предыдущем задании «игровой автомат» таким образом, чтобы выигрыш происходил только в 40% случаев.
11. В 1593 году Франсуа Виет предложил для вычисления числа формулу
В 1655 году профессор Оксфордского университета Джон Уоллис (John Wallis) предложил формулу:
Сообщив о ней лорду Брункеру (Lord Brouncker), он получил в ответ разложение
Наконец, 1674 году Г. Лейбниц показал, что
Определите, какой из этих способов обеспечивает более быструю сходимость.
Следующий раздел:
Предыдущий раздел:
Поясніть що потрібно зробити в 4 задачі??
Поясніть що таке число фібоначі??
>> Поясніть що потрібно зробити в 4 задачі??
Программа должна в ответ на введенное число говорить, «Это степень тройки» (для чисел 1, 3, 9, 27 и т.д) или «Нет, это не степень» для всех остальных.
>> Поясніть що таке число фібоначі??
Определение дается в задаче 7: «Последовательность Фибоначчи определяется рекуррентным соотношением , где , ». То есть первые два числа равны 1, а каждое следующее — сумма двух предыдущих. Получаем соответственно 1, 1, 2, 3, 5, 8, …
Пятая задача. Хотелось бы узнать, делается ли у меня шаг+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.
Необходимо убрать с, как я понял, иначе цикл прервётся сразу же, т.к будет отрицательное значение. Если без с, будет ли правильно всё, просто я немного не уверен, как здесь делается шаг, т.е как именно понимается, что шаг +1 или +2 и т.д
Программа явно делает не то, причем уже на первом шаге. Для проверки берешь, какое-нибудь простое число (x = 2, например), считаешь вручную, что должно получиться, а потом в режиме отладки после выполнения каждой строки смотришь, равны переменные тому, чему ты хотел бы или нет.
Про «шаг +1 или +2» не понял. Шагом логично назвать однократное выполнение операторов в теле цикла.
нашёл ошибку, в факториале как я понимаю. Т.е это факториал должен быть увеличен в 2 раза ? Если произведение 3 чисел, то должен быть как произведение 6-ти чисел ? или просто умножить на 2 ?
2! = 1 * 2 = 2
4! = 1 * 2 * 3 * 4 = 24
6! = 1 * 2 * 3 * 4 * 5 * 6 = 720
Что-то мне подсказывает, что умножением на 2 тут не обойдешься.
<Потерто>
А если так, будет ли это теперь правильным решением ?
Очень похоже на правду. Я даже стер, чтобы никто не подсмотрел раньше времени ))
А чтобы убедиться, что все точно правильно, выведи рядом со своим ответом cos(x). Если отличия будут не раньше чем в 6-м знаке после запятой, значит все в порядке.
Кстати, в repeat’е begin и end не нужны.
9-я задача. Паскаль сам должен определять выиграл или проиграл ? при выборе орла или решки.
и ещё, здесь может надо сделать через переменные логического типа ? Просто немного непонятно как сделать так,чтобы результат писало выиграл или проиграл при выборе орла или решки.
В Паскале есть такая функция random, которая дает случайное (на самом деле не совсем, но не суть) значение, которое с равной вероятностью равно любому вещественному числу в диапазоне [0; 1). Ну, то есть пишешь:
x := random;
и x будет случайным числом. С ее помощью и можно организовывать случайные события типа «выиграл» или «проиграл».
kak объяснить что в задаче 5, мое значение получается правильным только при точности 0.001-
мое- -0.989939630681818
cos(3) -0.989992496600445
а при точности 0.000001-
-0.972201034714899
-0.989992496600445
не понимаю
проверьте, пожалуйста, 9 задание:
…
Был текст программы
Намекните как 10 сделать с процентами)))
Я стал богаче на 17 виртуальных рублей. Это положительным образом характеризует твою программу.
В 10-й — просто представь, что ты владелица казино. Мне кажется, мышление сразу должно встать на правильную дорогу.
Да вы везунчик, я выше 7 рублей не поднималась))) А в 10й может быть просто заменить y:=random(2) на y:=random(3)?
Угадывание одного варианта из 3-х даст выигрыш лишь в 33% случаев. А надо в 40%.
тогда может быть так:
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.
Тут вероятность зависит от результата предыдущего раунда и равна либо 1/2, либо 1/3, но никогда 40%, то есть 2/5. Даже частота выигрышей и та совсем не 40%.
А так?:
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.
Для каждого из вариантов 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
Ура!
Честно говоря, не ожидал, что получится правильная вероятность ))
Я бы еще упростил решение. Например, так
или так
Ура!
По 11 задаче, полный затык по Брункеру подсчитать, хоть намекните немного, у меня 3,99…, но никак не Пи. В других вариантах считала Пи до 5-той цифры после запятой:
— По Виету за 8 шагов;
— По Уоллису за 78539 шагов;
— По Лейбницу за 100001 шагов.
Получилось по Брункеру — за 100000 шагов (точность в 0,00001).
Ответ к 11-той: более быстрая сходимость, как видно, по Виету.
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.
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.
Может быть так?
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.
Какова вероятность выиграша?
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.
В задаче 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.
Классное пособие! Как здоровье Тараса Викторовича, однако?
Здоровье, спасибо, в прядке :))
Со временем не очень. Некогда в комментариях общаться.
//Задание 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.
//Задание 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.