Девятая программа: «Не трать деньги понапрасну»

Всем привет!
Мой код проходит 4 из 5 тестов. Почему то во втором тесте предлагается правильный ответ
" Второй тест. Время на проект в часах: 220 , прибыль в срочном режиме: 150000 . Ожидаемый ответ: Выгодней срочный проект. Потратишь на него 262500 "

Хотя по идее должно быть “… потратишь на него 235000”.

  var price = 1500;
  var priceUrg = 3750;
  var finalPrice;
  var finalPriceUrg;
  var urgantMessage = 'Выгодней срочный проект. Потратишь на него ';
  var normalMessage = 'Выгодней обычный проект. Потратишь на него ';

  var getProfitableProject = function(hours, profit){
      
   if(hours > 150){
    price = 1250; 
    priceUrg = 3500;
    }
  
  finalPrice = price * hours; 
  finalPriceUrg = priceUrg * (hours / 2) - profit;
  
 if(finalPriceUrg < finalPrice){
   return urgantMessage + finalPriceUrg;
   } else{
      return normalMessage + finalPrice;
     }

};

Что не так? Прошу протянуть руку помощи

у вас присваивание новой цены до подстановки часов в срочном проекте. переделайте совсем программу, используя предыдущее задание.
у вас выходит 110 часов в срочном, а вы цену уже скинули на 250.

вот моё решение

Не трать деньги понапрасну 24/24

Спасибо!
Но так и не понял в чем ошибка моей логики. Причем первый тест проходит, ( _Первый тест. Время на проект в часах: 200 , прибыль в срочном режиме: 50000 . Ожидаемый ответ: Выгодней обычный проект. Потратишь на него 250000_ .) Раз для него механика верна, почему для второго теста она не проходит? ( Второй тест. Время на проект в часах: 220 , прибыль в срочном режиме: 150000 . Ожидаемый ответ: Выгодней срочный проект. Потратишь на него 262500 .)

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

if (аргументы первого теста) {
  return `Выгодней обычный проект. Потратишь на него 250000`;
} и так далее

по сути теперь:
у вас на вход идет значение в 220 часов.
идет первым условие - проверку прошло (220 > 150) и тут вы сразу даете цену на 250 ниже.
но в срочном проекте время делится пополам и (110 > 150) уже должно возвращать false, у вас же цена занижается на 250 независимо от того, больше ли 150 часов срочной работы или нет (то, что по идее должно работать на значениях 300+ по дефолту).
должно быть: 110*price*2.5-profit = 110*1500*2.5-150000 = 262500
у вас: 110*(price-250)*2.5-profit (тут важно: это не формулы, а то что попадает в сравнение проектов)

первый тест проходит проверку, т.к. profit недостаточно большой, также как и в 4ом.

просто переделайте, не используйте “волшебные константы” (а ведь в курсах про это говорили), опишите логику максимально разжеванно.

Приветствую.

  1. откуда люди берут -otkuda?
  2. почему var pricePerHour = 1500; нельзя писать перед функцией getPrice ? (ответы не совпадают)
Сводка

  1. Нейминг - не самая сильная сторона таких людей. Это доход от более раннего использования проекта.
  2. Можно, но хорошим тоном считается держать глобальую область видимости в чистоте от переменных, неявляющихся функциями и константами

1.я понимаю что это доход,но откуда он взялся как он посчитан? чему равен?
2.Если можно то почему ответы разные получаются?

  1. это входной параметр функции getProfitableProject, берется из ввода. никак не посчитан, просто передается при обращении к функции вторым аргументом.
  2. этот вопрос несколько сложнее, давайте разбираться:

возьмем в качестве проверки 1 тест: 200 часов, 50к дохода.
мы вывели переменную в глобальную область. что это значит? что после каждого запуска функции мы ее будем наглухо изменять.
наша программа работает так: мы запускаем функцию, которая запускает 2 функции, сравнивает их результаты и возвращает что-то своё.
так вот, когда запускается первая вложенная функция (срочный проект), она изменяет глобальную переменную с 1500 на 3750 и переписывает её значение. 3750 * 100 = 375000.
когда запускается вторая вложенная функция (не срочный проект), она уже берет измененное на 3750 в качестве часовой ставки (заметим, что условие не выполняется на увеличение в 2.5 раза, т.к. 2ая вложенная функция несрочная). и отсюда получаем результат второй функции 200 * (3750 - 250) = 700000. ясен красен что результат не должен быть таким. ну а дальше основная функция оперирует неправильными данными, исход предсказуем. переменные даже нельзя поместить внутрь getProfitableProject, результат будет тот же.
поэтому глобальную область держим всегда чистой. все изменения должны происходить внутри функций, кроме случаев, когда нужно явно её менять (в реальных проектах такого в природе не бывает).

1 лайк

My code!! )))

var getProfitableProject = function(hours, profit) {
var projectHot = getPrice(hours,true) - profit;
var projectNotHot = getPrice(hours, false);

if (projectHot < projectNotHot){
return ('Выгодней срочный проект. Потратишь на него ’ + projectHot );
}
else {
return ('Выгодней обычный проект. Потратишь на него ’ + projectNotHot);
}
};

1 лайк

что - то тупняка на ней поймал и долго решить не мог.

let time;
let profit;

const getPrice = (time, boolean) => {
let fix = 1500;
let sum = 0;

if (boolean) {
time = (time / 2);
fix = (fix * 2.5)
}

if (time > 150) {
  fix = fix - 250;
  }

sum = time * fix;

return sum;

}

function getProfitableProject(time, importantProfit) {
let urgent = getPrice(time, true) - importantProfit;
let normal = getPrice(time, false);

return urgent < normal ? 'Выгодней срочный проект. Потратишь на него ’ + urgent : 'Выгодней обычный проект. Потратишь на него ’ + normal;
}

getProfitableProject(time, profit)