Испытание:Вечный вопрос

Здравствуйте.

Прошел предыдущее испытание быстро в этом застопорился…

Мой код

var initialAmount = 50000;
var duration = 12;
var simplePercent = 7;
var complexPercent = 6;
var recommendedType;
var finalAmount;

var sum1;
var sum2;

var calculateComplex = function (initialAmount,duration,complexPercent) {

for(var i = 1;i<=duration;i++){
var percentNew = (complexPercent0.01)/12 duration ;
var percentinitialAmount = initialAmount * percentNew
initialAmount+=percentinitialAmount
}
return Math.round(initialAmount );
};

var calculateSimple = function(initialAmount,duration,simplePercent){

percentNew=(simplePercent*0.01/12) * duration;
var sum1 = initialAmount * percentNew;
initialAmount +=sum1
return Math.round(initialAmount);
}

sum1 = calculateComplex(initialAmount,duration,complexPercent);
sum2 = calculateSimple(initialAmount,duration,simplePercent);

if(sum1 > sum2){
finalAmount = sum2;
recommendedType = ‘simple’;
}
else{
finalAmount = sum1;
recommendedType = ‘complex’;

}

При таком коде он проходит 2 проверки а на третьей проверке вместо 270581 получается 270417 и тип другой выходит.
из условия вижу,что должен поставить сначала одно значение с другим типом,а если оно не выполняется то другие значения.
Если их ставлю то везде тип становится верным но значения .
Можете подсказать что именно не так ? или весь код переделывать?

Если использовать функцию, написанную в предыдущем испытании, то остается не так много делать.

Код
var initialAmount = 250000;
var duration = 14;
var simplePercent = 7;
var complexPercent = 6.8;
var recommendedType;
var finalAmount;

var calculateDeposit = function(sumDeposit, percent, term, isCapitalize) {
  var totalDeposit;
  var sumPercent = 0;
      if (isCapitalize){
        for (var i = 0; i < term; i++) {
          sumPercent = sumDeposit * (percent / 12 * 0.01);
          sumDeposit += sumPercent;
        }
      } else {
      sumPercent += sumDeposit * (percent / 12 * term * 0.01);
      sumDeposit += sumPercent;
      }
  
  totalDeposit = Math.round(sumDeposit);
  
  return totalDeposit;
};
var simpleDeposit = calculateDeposit(initialAmount, simplePercent, duration, false);
var complexDeposit = calculateDeposit(initialAmount, complexPercent, duration, true);
var recommend = function(value1, value2) {
  recommendedType = "simple";
  finalAmount = value1;
  if (value1 < value2) {
    recommendedType = "complex";
    finalAmount = value2;
  }
return recommendedType;
};
recommend(simpleDeposit, complexDeposit);
3 лайка

У вас неправильно считается сумма депозита с капитализацией.

Здесь отсутствует знак умножения. И не нужно умножать на duration, потому что эта переменная используется в цикле.
Еще есть ошибка в условии. Рекомендуемый вид депозита - это большая из двух величин. У вас наоборот.

я так понимаю, лучше записывать рез-т выполнения функции в переменные как у вас - типа для читабельности? а не сравнивать :)) а то подумалось, как топором написано. проверки прошло

код

if (calculateDeposit(initialAmount, simplePercent, duration, false) > calculateDeposit(initialAmount, complexPercent, duration, true)) {
recommendedType = ‘simple’;
finalAmount = calculateDeposit(initialAmount, simplePercent, duration, false);
console.log(recommendedType);
} else {
recommendedType = ‘complex’;
finalAmount = calculateDeposit(initialAmount, complexPercent, duration, true);
console.log(recommendedType);
}

Да, а то казалось бы написано короче, но читается плохо, и куски с вызовом функции повторяются, что не есть хорошо.

Все исправил,оказалась проблема не в знаке…взял код из предыдущего еще раз и вставил в итоге все считается.

Summary

var initialAmount = 50000;
var duration = 12;
var simplePercent = 7;
var complexPercent = 6;
var recommendedType;
var finalAmount;

var calculateDeposit = function (firstValueDeposit, percentYear, timeDeposit, capitalizationDeposit) {
var percent = 0;
if (capitalizationDeposit){
for (var i = 1; i <= timeDeposit; i++){
percent = firstValueDeposit * percentYear * 0.01 / 12;
firstValueDeposit += percent;
}

} else { percent = firstValueDeposit * (percentYear * 0.01 / 12) * timeDeposit;
firstValueDeposit += percent;
}
return Math.round(firstValueDeposit);
};

var complex = calculateDeposit(initialAmount, complexPercent, duration, true);
var simple = calculateDeposit(initialAmount, simplePercent, duration, false);
if (simple > complex){
recommendedType = ‘simple’;
finalAmount = simple;
} else {
recommendedType = ‘complex’;
finalAmount = complex};

Хотелось бы узнать не страшно ли у меня получилось?

Лишний знак ; в конце кода. А в целом всё правильно.
Придираться можно только к имени переменной-флага. В теории акцентируется внимание на том, с каким названием она чаще всего создается.

var initialAmount = 50000;
var duration = 12;
var simplePercent = 7;
var complexPercent = 6;
var finalAmount;
var recommendedType;

var calculateDeposit = function (start, percent, time, iscapital) {
var  percenttime = 1;
if(!iscapital) {  
percenttime = 1+(percent/1200)*time  
}else {
for(var i = 1; i<=time; i++) {
  percenttime*=(1+(percent/1200));
  };
};

return Math.round(start*percenttime);
};

var Deposisimple = calculateDeposit(initialAmount, simplePercent, duration, false );
var Deposicomplex = calculateDeposit(initialAmount, complexPercent, duration, true );

var choice = function(Deposisimple, Deposicomplex) {
if(Deposisimple > Deposicomplex){
 recommendedType='simple';
 }
else{
 recommendedType='complex';
 };
 return recommendedType; 
};
choice(Deposisimple, Deposicomplex); 
var benefit = function(Deposisimple, Deposicomplex){
 if(Deposisimple > Deposicomplex){
 finalAmount=Deposisimple;
 }
else{
 finalAmount=Deposicomplex;
 };
 return finalAmount; 
 };
benefit(Deposisimple,Deposicomplex);

Функцию benefit можно было не выделять, а значение finalAmount дописать в choice, тем более что условия одинаковые.
Обращайте внимание на оформление кода (табы/пробелы, отступы между частями кода для улучшения читабельности). Также помните о правиле именования переменных camelCase.
Например, не percenttime, а percentTime или не Deposisimple, а deposiSimple.

не совсем понимаю почему функция benefit не нужна, если я значение finalAmount допишу в choice , функция choice всё равно выдаст только первое значени которое будет записано в return

var choice = function(Deposisimple, Deposicomplex) {
if(Deposisimple > Deposicomplex){
 recommendedType='simple';
 finalAmount=Deposisimple;
 }
else{
 recommendedType='complex';
 finalAmount=Deposicomplex;
 };
 return recommendedType; 
 return finalAmount;
};
 choice(Deposisimple, Deposicomplex); 

var benefit = function(Deposisimple, Deposicomplex){
if(Deposisimple > Deposicomplex){
 finalAmount=Deposisimple;
 }
else{
 finalAmount=Deposicomplex;
 };
 return finalAmount; 
};
benefit(Deposisimple,Deposicomplex);

По условиям задания вы должны вывести только recommendedType, всего один return. Но действий внутри функции может быть много.

Получается функция choice , не только выведет одно значение recommendedType, но так же поменяет значение переменной finalAmount?

var choice = function(Deposisimple, Deposicomplex) {
if(Deposisimple > Deposicomplex){
 recommendedType='simple';
 finalAmount=Deposisimple;
 }
else{
 recommendedType='complex';
 finalAmount=Deposicomplex;
 };
 return recommendedType; 
};
choice(Deposisimple, Deposicomplex)

Да, получается, что так. Вы можете это проверить (для себя), добавив вывод значения в консоль.

Что за траблы с проверкой на сайте, ребята? Убил пару часов на постоянно выскакивающую ошибку “Не удалось проинициализировать исходные переменные” (string)" в то время как код рабочий и отрабатывает в codepen.io на 100% Что означает эта ошибка?

var calculateDeposit = function (initialAmount, duration, simplePercent, complexPercent) {
  var recommendedType;
  var finalAmount;
  
  var simpleProfit = initialAmount / 100 * simplePercent / 12 * duration;
  var simpleAmount = initialAmount + simpleProfit;
  
  var complexAmount = initialAmount;
  for (var i = 0; i < duration; i++) {
    complexAmount += complexAmount / 100 * complexPercent / 12;
  }
  
  if (simpleAmount > complexAmount) {
    recommendedType = 'simple';
    finalAmount = Math.round(simpleAmount); 
  } else {
    recommendedType = 'complex';
    finalAmount = Math.round(complexAmount);
  }
  
  return console.log(recommendedType, finalAmount);
} 

calculateDeposit(250000, 14, 7, 6.8);

вроде все получилось (над предыдущим поломала голову, а это по аналогии), но задание вызвало вопрос - а зачем здесь функции? у меня такой код:
var simpleAmount=initialAmount+initialAmount*(simplePercent/100/12)duration;
for(i=0; i<duration; i++){
initialAmount=initialAmount+initialAmount
(complexPercent/100/12);
var complexAmount=Math.round(initialAmount);}
if (simpleAmount<complexAmount) {
var recommendedType=“complex”;
finalAmount=complexAmount;}
else {
recommendedType=“simple”;
var finalAmount=simpleAmount;}``

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

подскажите, пожалуйста, почему не работает этот код и переменные не определены?
var initialAmount = 50000;
var duration = 12;
var simplePercent = 7;
var complexPercent = 6;
var recommendedType;
var finalAmount;
var calculateDeposit = function (initialAmount, duration, simplePercent, complexPercent) {
var depositComplex = Math.round (initialAmount * Math.pow (1 + complexPercent / 12 / 100 , duration));
var depositSimple = Math.round (initialAmount + simplePercent / 12 * duration / 100 * initialAmount);
if (depositComplex > depositSimple) {
recommendedType = ‘complex’;
finalAmount = depositComplex;
} else {
recommendedType = ‘simple’;
finalAmount = depositSimple;
};
return finalAmount;
return recommendedType;
}

В начале кода у вас определена переменная finalAmount, но ей не присвоено никакое начальное значение. Помните о том, что функция может возвращать только одно значение. То есть всё, что написано после первого return, игнорируется.

Здравствуйте! Подскажите, пожалуйста, в чем ошибка? Выдает, что переменные “recommendedType” и “finalAmount” не определены, хотя я задаю им значения в цикле.

var simple = calculateDeposit(initialAmount, simplePercent, duration, false);
var capitalize = calculateDeposit(initialAmount, complexPercent, duration, true);

console.log(simple, capitalize);

var recommend = function(simple, capitalize) {
var recommendedType = 'simple’
var finalAmount = simple;
if (simple < capitalize) {
recommendedType = ‘complex’;
finalAmount = capitalize;
}
return recommendedType
};

console.log(recommendedType, finalAmount);

А еще не очень понимаю, зачем в последнем задании использовать именно функцию, почему нельзя просто иф? пробовала через иф, на оследнюю проверку не проходит

if(simple > capitalize){
var recommendedType = ‘simple’;
var finalAmount = simple;
}else{
recommendedType = ‘complex’;
finalAmount = capitalize;
}

console.log(recommendedType, finalAmount);