Испытание Функции [19/20]. Нужна помощь


#1

Здравствуйте! Код проходит все проверки, кроме одной


Подозреваю, что проблема в цикле, но где именно, понять не могу.
Вот код. Помогите, пожалуйста, понять ,что не так

var calculateDeposit = function (sumDeposit, percent, monthes, isCapitalizationPersent) {
if(isCapitalizationPersent){
for(var i = 0; i<= monthes ; i++){
var totalDeposit = sumDeposit + sumDeposit*(percent/100/12);
}
}
var totalDeposit = sumDeposit + sumDeposit*(percent/100/12*monthes);

return Math.round(totalDeposit);
};


#2

У вас неправильно рассчитывается сумма депозита с капитализацией.
Переменная totalDeposit должна объявляться всего один раз.
Посмотрите на код. В чем смысл цикла, если внутри него totalDeposit не увеличивается на каждом круге? Цикл отработает два раза - всё правильно, но что он сделает? Дважды посчитает результат с теми же самыми исходными данными.
Попробуйте дописать внутри цикла вывод переменной totalDeposit в консоль, чтобы понять, что я имею в виду.


#3

перед циклом вам необходимо задать начальное значение переменной totalDeposit равной sumDeposit. А в теле самого цикла, в операции присваивания надо использовать переменную totalDeposit справа от знака равно.
И непонятно зачем вы еще один месяц накручиваете за телом цикла?
В общем если в моей пояснялке не разобрались то тут исправленный мною ваш код:

Исправленный код
var calculateDeposit = function (sumDeposit, percent, monthes, isCapitalizationPersent) {
if(isCapitalizationPersent){
var totalDeposit = sumDeposit;
for(var i = 0; i<= monthes ; i++){
totalDeposit = totalDeposit + totalDeposit*(percent/100/12);
}
}
return Math.round(totalDeposit);
};

ЗЫ смотрел с точки зрения алгоритма (в жабе я ноль, так что синтаксис может хромать)


#4

да, поняла о чем вы, но не могу понять, как написать правильно(


#5

попробовала вашу версию кода - тот же итог(


#7

Вы уверены, что результат тот же? У меня есть подозрение, что результат должен был измениться. Или вы вот эту строчку из своего кода: var totalDeposit = sumDeposit + sumDeposit*(percent/100/12*monthes) так и оставили, хотя я уже писал, что не понимаю, зачем она Вам нужна? Она исключает всю работу цикла, как будто его и не было. Копируйте пожалуйста внимательнее.


#8

Да, точно, прошу прощения за невнимательность.

Еще один месяц накручивается снизу потому, что в условии, если капитализация средств не происходит процент по другому рассчитывается с учетом количества месяцев.
(уже поняла, что тот блок надо поместить в else)

но даже с правильным копированием ваш вариант проверку не проходит даже на условиях с капитализацией

но, спасибо, что попытались)


#9

как оказалось, еще в цикле нужно было начальное значение переменной i с 0 на 1 поменять. Теперь все работает.
Спасибо, что обратили мое внимание на строчку после кода)


#10

Существует три типа циклов: с предпроверкой условия (while-do), с постпроверкой условия (repeat-until) и безусловные с строгим количеством проходов. for относится к последним. Они с одной стороны проще (заранее знаешь сколько проходов совершит цикл), а с другой стороны сложнее (все зависит от синтакстиса языка программирования). Я, когда правил Ваш кусок кода, указал, что ситаксис жабы не знаю, соответственно не могу сказать, будет ли этот код вообще работать, поэтому указал лишь примерно, что и как должно работать, чтобы цикл отработал как положено. Как пример в Delphi ФОР работает так: сначала плюсует значение, зачем проверяет его на выход из цикла (аналог циклов с предпроверкой условия). В жабе же, судя по тому что у Вас он прогонял лишний раз цикл, ФОР сначала прогонял цикл, и лишь затем выходил из цикла по условию (аналог постпроверки условия). Подобные нюансы очень сложно отследить не зная языка и не имея возможности проверить код.

я рад, что смог Вам помочь.


#11

Вот полностью рабочий

КОД
var calculateDeposit = function (start, yearPercent, time, isCapitalPercent) {
  var deposit = 0;
  
  if(isCapitalPercent) {
    deposit = start;
    for(var i = 0; i < time; i++) {
      deposit = deposit + deposit*(yearPercent/100/12);
    }
  } else {
    deposit = start + start*(yearPercent/100/12*time);
  }
  
  return Math.round(deposit);
};