Испытание: Деньги к деньгам

Привет :wave:t2:

код
let calculateDeposit = function (startSum, percent, term, isCapital) {
  let total
  if (isCapital) {
    for (let i = 0; i < term; i++) {
      startSum = startSum + (percent / 1200) * startSum
    }
      total = Math.floor(startSum)
    } else { 
      total = Math.floor(percent / 1200 * term * startSum + startSum) 
      } 
    return total
}
1 лайк

Добрый день!
Я никогда раньше не занималась программированием, поэтому моё решение очень большое и неправильное.
Для решения задачи я использовала массив, когда речь идет о вкладе с капитализацией.
Проверку не могу пройти на 4 этапе и абсолютно не понимаю почему.
Возможно ли решить задачу с использованием массива?
Мое решение:
let calculateDeposit = function (initialDeposit, parsentage, numberMonth, isCapitalization) {
if (isCapitalization == false) {
let savingForMonth = parsentage / 100 / 12 * numberMonth * initialDeposit;
let totalAmountOfDeposit = initialDeposit + savingForMonth;
return Math.floor(totalAmountOfDeposit);
} else {
let array = [initialDeposit];
for (let i = 0; i <= numberMonth; i++) {
let totalAmountOfDeposit = 0;
totalAmountOfDeposit = array[i] + (parsentage / 100 / 12) * array[i];
array.push(totalAmountOfDeposit);
return Math.floor(array[array.length - 1]);
}
}
};

Как то так получилось решить, изначально поломал голову, из за невнимательности, что проценты подаются в целой форме)

Моё решение
let calculateDeposit = function (startDep, percent, time, isCapital) {
  let summ = 0;
  percent = percent / 100;
  if(!isCapital) {
    percent = (percent / 12 * time);
    summ = startDep + Math.floor(startDep * percent);
  } else {
      for(let i = 0; i < time; i++) {
        startDep += Math.floor(startDep * percent / 12);
        summ = startDep;
      }
    }
  return summ;
};

calculateDeposit();

Вот мое решение:

Сводка

let calculateDeposit = function (startSum, persent, period, isCapitalise) {

let total;
let supTotal = startSum;

if (!isCapitalise) {
  total = Math.floor(startSum + (startSum * (persent / 12 * period) / 100));
  
return total
};

if (isCapitalise) {
   
  
        for (let i=1; i<=period; i++) {
      
        supTotal += supTotal * (persent / 12) / 100
        }
     
return Math.floor(supTotal)
      
};

}
`

Как по мне, то вариантов решения поставленных задач множество, в том числе и использую массив или функции и циклы, главное понимать что туда писать, но как я понимаю код еще и должен быть как можно проще (меньше строк) и доступен к понимаю другим. Но опять же, массивы ни кто не отменял, другое дело зачем они тут. И кстати сам никогда этим не занимался, на HTML Academy получаю первый опыт.

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

Решение
let calculateDeposit = function (initialSum, percentAge, depositMonths, boolVariable) {
  let percent = percentAge / 100;
  let depositTotal = 0;
  
  if(!boolVariable) {
    depositTotal = ((percent / 12) * depositMonths * initialSum) + initialSum;
  }
  else {
    depositTotal = calculateDepositMonths(initialSum, percentAge, depositMonths, boolVariable);
  }
  return Math.floor(depositTotal);
};

let calculateDepositMonths = function (initialSum, percentAge, depositMonths, boolVariable) {
  let percent = percentAge / 100;
  let depositTotal = initialSum;
  
  for(let i = 0; i <= depositMonths - 1; i++) {
    depositTotal += (percent / 12) * depositTotal;
  }
  return depositTotal;
};

Мое решение, немного замороченно по формуле с процентами вышло, но зато сразу понятно что к чему :upside_down_face:

let calculateDeposit = function (startDeposit, percentAnnum, termDeposit, isCapInterest) {
if(!isCapInterest) {
  let result = (startDeposit * 0.01) * (100 + percentAnnum / 12 * termDeposit);
  return Math.floor(result);
} else {
    let depositValue = startDeposit;
    for(i = 1; i <= termDeposit; i++) {
      depositValue += (depositValue * 0.01) * (percentAnnum / 12);
    }
    return Math.floor(depositValue);
  }
};

Через Math.pow (возведение в степень) очень быстро решается.

Сводка
let calculateDeposit = function (startSum, percent, term, capitalization) {
  if (capitalization) {
    return Math.floor(startSum*Math.pow(1+(percent/1200),term));
    }
  else {
    return Math.floor(startSum*(1+(percent/1200)*term));  
    }
};
const culculatePercent = percent => percent / 12 / 100;


let calculateDeposit = function (deposit, percent, months, isCapitalized) {
  const percentYear = culculatePercent(percent)

  if (isCapitalized) {
    let capDeposit = deposit
    for (let i = months; i > 0; i--) {
      capDeposit += percentYear * capDeposit
    }

    return Math.floor(capDeposit);
  }
  
  return Math.floor(percentYear * months * deposit + deposit);
};

что такое sumPercent и зачем?

Мой вариант

Сводка
let calculateDeposit = function (deposit, interest, term, isCapit) {
  interest /= 100
  if (isCapit === true) {
     let MonthAmount = deposit;
    for (let i = 1; i <= term; i++) {
      MonthAmount += (interest / 12) * MonthAmount;
      }
      return Math.floor(MonthAmount);
  } else {
    earnedInterest = (interest / 12) * term * deposit
        return Math.floor(deposit + earnedInterest)
    }
}

вырежи свой ретёрн из цикла и поставь за пределами цикла, сразу за фигурными скобками

Как бы в коде выше все return не в теле цикла, читай код внимательней)

обращаю твоё внимание на последний цикл

for (let i = 0; i <= numberMonth; i++) {
let totalAmountOfDeposit = 0;
totalAmountOfDeposit = array[i] + (parsentage / 100 / 12) * array[i];
array.push(totalAmountOfDeposit);
return Math.floor(array[array.length - 1]);
}

Ахах, это даже не мой код))

Вот такой вот код получился у меня

Сводка

function calculateDeposit (initialSum, percentYear, termDeposit, capitalization) {
let totalSum = initialSum;
let accum;
if (!capitalization) {
accum = Math.floor((initialSum * ((percentYear/100) / 12 * termDeposit)));
totalSum +=accum;
}

if (capitalization) {
while (termDeposit > 0) {
accum = Math.floor((totalSum * ((percentYear/100) / 12)));

totalSum += accum;
termDeposit--;
}

}
return totalSum
}

У меня вышло так:

Мой код
function calculateDeposit (deposit, percentYears, contributionPeriod, capitalization) {
    
    percentYears /= 100;
    percentYears /= 12;
    let depositArr = [];
    let result;
    
  if (capitalization === false) {
    percentYears *= contributionPeriod;
    result = deposit + deposit * percentYears;
    return Math.floor(result);
  } else {
    
      for (let i = 0; i <= contributionPeriod; i++) {
        depositArr[0] = deposit;
        depositArr[i] = depositArr[i-1] + depositArr[i-1] * percentYears;
      }
      
      result = depositArr[depositArr.length - 1];
      return Math.floor(result);
    }
  
};
let calculateDeposit = function (depSum, depPercent, depTime, isCapDep) {
  let total;
  if (!isCapDep) {
    total = Math.floor(depSum + (depPercent / 12 * depTime / 100 * depSum));
  } else {
    total = depSum;
    for (let i = 1; i <= depTime; i++) {
      total += Math.floor(depPercent / 12 / 100 * total);
    }
  }
  return total
};
let calculateDeposit = function (startDeposit, percent, term, capitalization) {
  
  if(capitalization == false) {
    return Math.floor(startDeposit + ((percent / 100) / 12) * term * startDeposit);
  };
  
  if(capitalization == true) {
    let sum = startDeposit;
    for(let i = 0; i < term; i++) {
      sum = sum + Math.floor(((percent / 100) / 12) * sum);
    };
    return sum;
  };

};

… или можем вынести повторяющиеся блоки в переменную:

let calculateDeposit = function (initial, percent, term, isCap) {
  let result = initial;
  percent = percent / 100;
  const monthPercent = percent / 12;
  
  if (isCap) {
    
    while (term) {
      result += result * monthPercent;
      term--;
    }
    
  } else {
    result += initial * (monthPercent * term);
  }
  
  return Math.floor(result);
};