While15. Начальный вклад в банке равен 1000 руб. Через каждый месяц размер вклада увеличивается на $$P$$ процентов от имеющейся суммы ($$P$$ — вещественное число, $$0 < P < 25$$). По данному $$P$$ определить, через сколько месяцев размер вклада превысит 1100 руб., и вывести найденное количество месяцев $$K$$ (целое число) и итоговый размер вклада $$S$$ (вещественное число).
Решение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
program While15; var P, S :Real; K :Integer; begin Write('Введите процент вклада: '); Readln(P); K:=1; S:=1000; while S<=1100 do begin inc(K,1); S:=S+S*P/100; end; Writeln(K,' ',S); end. |
Решение от Андрея:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Program while15; var p,s : real; k : integer; begin write('p= '); readln(p); k:=1; while s<1100 do begin inc(k); s:=1000*exp(ln(1+p/100)*k); end; writeln('K= ',k,' S= ',s:7:2); end. |
Решение следующее из решения Андрея:
$$s=1000*exp(ln(1+p/100)*k)$$
$$s/1000=exp(ln(1+p/100)*k)$$
$$ln(s/1000)=ln(1+p/100)*k$$
$$ln(s/1000)/ln(1+p/100)=k$$
$$k=ln(s/1000)/ln(1+p/100)$$
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Program while15; var p,s : real; ktemp : real; k:integer; begin k:=0; write('p= '); readln(p); ktemp:=ln(1100/1000)/ln(1+p/100); k:=int(ktemp)+1; s:=1000*exp(ln(1+p/100)*k); writeln('K= ',k,' S= ',s:7:2); end. |
Другие задачи из раздела While можно посмотреть здесь.
Есть такой вариант…
P.S. Строго не судите, я только учусь) У вас очень полезный сайт.
да, вполне решение, только k не определено… надо перед циклом сказать k:=1; что бы заработало.
А у формулы «s:=1000*exp(ln(1+p/100)*k);» есть название?
Я просто не задумывался никогда, как считать капитализацию.
А используя вашу формулу можно решить данную задачу вообще без цикла:
s=1000*exp(ln(1+p/100)*k)
s/1000=exp(ln(1+p/100)*k)
ln(s/1000)=ln(1+p/100)*k
ln(s/1000)/ln(1+p/100)=k
k=ln(s/1000)/ln(1+p/100)
при этом s у нас известна 1100
поэтому
k=ln(1100/1000)/ln(1+p/100);
ну и запишем это в код:
«Да, вполне решение, только k не определено… надо перед циклом сказать k:=1; что бы заработало.»
Работает и в моем варианте, и в Вашем. Ответы одинаковы, но может с k:=1; будет правильнее в каком-то смысле, я ведь только учусь.
Формула капитализации найдена в Гугле, раздел с картинками — FV=PV*(1+i)^n , где FV -будущая стоимость , PV — текущая стоимость , i — процентная ставка , n — число периодов начисления процентов .
Если не определить k, перед его использованием, то оно может принимать любое начальное значение. например код:
На моём компьютере, на моём компиляторе (Delphi 7), в данный момент выводит значение:
у вас это значение будет другим.
И чтобы ваш код работал на любом компьютере, и на большинстве компиляторах, нужно не только объявлять переменную, но и явно её назначать. Это верно для большинства языков программирования.
Ошибку понял, буду следить за этим, но разве автоматом переменной 0 не присвоит значение(у меня 0 присваивает)?
На это нельзя рассчитывать. То есть абсолютно. Выделение участка памяти под переменную и назначение значения переменной, это совсем разные весчи.
В объектных языках появляется процесс инициализации при объявлении класса. И там уже можно не сильно задумываться обнулением переменных, так как для создания и уничтожения объекта существуют специальные механизмы. (Просто надо знать эти механизмы и ими пользоваться 🙂
Но когда мы работаем не с объектами, а с переменными на прямую. То нужно задать значение переменной, перед её использованием. Множество современных компиляторов будут выдавать ошибку, при попытке использовать переменную без указания предварительно её значения.
Спасибо! Хотелось бы спросить как у более опытного человека,что изучать после Паскаля(планирую стартовать в веб, ибо других вакансий в городе нет, а дальше смена места жительства и что-то серьезней чем веб),именно какие языки? Что нужно знать и уметь обязательно любому программисту? На что акцентировать внимание при изучении программирования? Может книги какие посоветуете(алгоритмизация… да что угодно). Буду очень благодарен за такого рода помощь.
ЭЭ…. ну чесн говоря веб это такая весчь… в которой я не очень… если хотите в этом убедиться посмотрите на метки моего сайта 🙂
я бы начал с того, что попытался устроиться на работу… плакал бы сказал, что буду работать за еду… деньги.?!.. никогда не слышал. 🙂
Когда вас выгонят, вы будете точно знать, что вам нужно. И за что вас выгнали. 🙂
Я развивался примерно так, только меня мало выгоняли, и я всегда требовал денег. 🙂
Читать книги… блин конечно могу сказать HTML, PHP….
«С» никогда не помешает…
но я вас уверяю… всё это без практики не канает… и один день на работе заменяет неделю книжек… особенно если вокруг люди которые знают в разы больше… 🙂
Спасибо огромное за ответ!
Андрей просто за компьютер решил отпахать 😀
В решении без цикла int(x) возвращает целую часть x в Real типе, тут нужна ceil(x)
первое решение неправильное, потому что прибавляет константный % от тыщи, а не % от суммы с процентами. 2й правильный, но это 1000*exp(ln(1+p/100)*k); слишком трудно для осмысления. Вот людской вариант:
var
p,s:real;
k:integer;
begin
readln(p);
p:=p/100;
s:=1000;
while s<1100 do
begin
inc(k,1);
writeln (' число месяцев ',k);
s:=s+s*p;
writeln (' сумма ',s);
end;
writeln ('k=',k,' s=',s:4:2);
end.
а нет, первое правильное.Только там не к=1, а к=0 надо
и S не <=, а S<n
ну всмысле S<1100. потому цель добрать 1100, а не больше 1100