Цикл while для увеличения числа до более высокого или равного целевому - PullRequest
0 голосов
/ 12 сентября 2018

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

То, что я делаю, - это ввод пользователем четырех чисел: Target, Promoters, Neutrals и Detractors.

Для каждого промоутера, который они вводят, который дает 100 очков, нейтралы дают 0, а противники - -100.Затем берется окончательное среднее значение, которое будет сравниваться с целью, которую они вначале вводили. Именно здесь я хочу, чтобы цикл while включился, я хочу, чтобы цикл автоматически сообщал пользователю, сколько промоутеров им необходимо для достижения цели.

Итак, в примере с пользователем, имеющим цель 75, и у него 3 промотора, 2 нейтрала и 1 недоброжелатель.Это даст им в среднем 33,33 (200/6).И я вручную определил, что им понадобится еще 10 промоутеров, чтобы счет стал 75, поэтому я достиг цели, которую они поставили.

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

Код ниже.Это всего лишь последний кусочек головоломки для меня, чтобы закончить это.

Вот мой HTML и JavaScript.

/* eslint-env browser */
// eslint.rc
{
  "no-unused-vars" [2, {"args": "none"}]
}
"use strict";
    
$(document).ready(function () {
     
     $('#target, #proNum, #neuNum, #detNum').change(function () {

var target = $('#target').val();
var proNum = $('#proNum').val();
var neuNum = $('#neuNum').val();
var detNum = $('#detNum').val();
    
         console.log("target is equal to " + target);
         console.log("promitors is equal to " + proNum);
         console.log("neutrals is equal to " + neuNum);
         console.log("detractors is equal to " + detNum);
         
var targetTot = (target*10);
var prosTot = (proNum*100);
var neusTot = (neuNum*0);
var detsTot = (detNum*-100);
         
         console.log("Target is " + targetTot);
         
var scoresQuant = +proNum + +neuNum + +detNum;  
var scoresTot = prosTot+neusTot+detsTot;
var preCurrent = scoresTot/scoresQuant;

var current = Math.round(preCurrent*100)/100;
         
         console.log("scoresQuant is equal to " + scoresQuant);
         console.log("scoresTot is equal to " + scoresTot);
         console.log("preCurrent is equal to " + preCurrent);
         console.log(current);
         
$('#current').text(current);

var hypPro = 0;
var scoresTotLoop = scoresTot/100;
var targetLoop = target/10;
         
 while (scoresTotLoop/scoresQuant+hypPro<=targetLoop)  {
    hypPro++;
} 
  console.log("hypPro is equal to " + hypPro);       
         
$('#prosToTarget').text(hypPro);
        });
        
});
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8"/>
        <title>NPS Calculator</title>
        
        <!-- Linking to external sheets -->
        <link rel="stylesheet" type="text/css" href="css/style.css">
        <script src="https://code.jquery.com/jquery-3.3.1.js" integrity="sha256-2Kok7MbOyxpgUVvAk/HJ2jigOSYS2auK4Pfzbm7uH60=" crossorigin="anonymous"></script>
        <script type="text/javascript" src="js/script.js"></script>
        <!-- End of linking to external sheets -->
        
        <!-- Font Imports -->
        <link href="https://fonts.googleapis.com/css?family=Nunito+Sans:300,400,700" rel="stylesheet">
        <!-- End of font Imports -->
        
    </head>
<body>
	<div id ="headers">
		<h1>NPS Calcultor</h1>
		<h2>This site will help you work out the total number of promoters you need to achieve your target this month.</h2>
	</div>
	<div id = "calculator">
		<div id = "targetNPS">
            <table  id ="targetTable">
                <tr>
                    <td>
                        <h2>Target NPS</h2>
                    </td>
                    <td>
                        <input type="text" class="IO" id = "target"/>
                    </td>
                </tr>
            </table>
        </div> 
		<div id = "scores">
            <table id = "scoresTable">
                <tr>
                    <td>
                        <h2>Promoters</h2>
                    </td>
                    <td>
                        <h2>Neutrals</h2>
                    </td>
                    <td>
                        <h2>Detractors</h2>
                    </td>
                </tr>
                <tr>
                    <td class = "pros">
                        <input type="text" class="IO" id = "proNum"/>
                    </td>
                    <td class = "neus">
                        <input type="text" class="IO" id = "neuNum"/>
                    </td>
                    <td class = "dets">
                        <input type="text" class="IO" id = "detNum"/>
                    </td>
                </tr>
            </table>
		</div>
		<div id = "currentNPS">
            <table id = "currentTable">
                <tr>
                    <td>
                        <h2>Current NPS</h2>
                    </td>
                    <td>
                        <h2 class="IO" id = "current">0</h2>
                    </td>
                </tr>
            </table>
		</div>
		<div id = "prosToTargetNPS">
			<table id ="prosToTargetTable">
                <tr>
                    <td>
                        <h2>Promitors to Target</h2>
                    </td>
                    <td>
                        <h2 class="IO" id = "prosToTarget">0</h2>
                    </td>
                </tr>
            </table>           
		</div>
	</div>
</body>
</html>

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018

Мне удалось решить проблему, используя идею трактовать ее как уравнение сверху. Вот решение, которое я нашел, то, что я сделал, взяло уравнение, опубликованное @psinaught, назначило цель как y, объединило плюсы как x, нейтрали как n, недоброжелатели как d, а затем решило для y. Который затем выдает уравнение, ниже которого я поменял местами правильные переменные.

var preProsToTarget = ((detNum*target)+(neuNum*target)+(100*detNum))/(-target+100); 
var prosToTarget = Math.max(0,preProsToTarget-proNum);
0 голосов
/ 13 сентября 2018

как уже говорилось в psinaught, решение будет не циклом while, а уравнением.опубликованное решение уже движется в правильном направлении - но, насколько я вижу, работает только тогда, когда pVal и dVal имеют одинаковое абсолютное значение.Еще одним недостатком является то, что, поскольку ваш пример имеет значение 0 для нейтралов, нейтральное значение было удалено при упрощении его уравнения.поэтому, как только нейтралы получат значение, отличное от 0, оно больше не будет работать ...

, если все (числа и значения) могут быть общими, уравнение будет:

x = ( n * ( target - nVal ) + d * ( target - dVal) ) / ( pVal - target )

Кроме того, вы хотели бы проверить, если цель не превышает pVal, поскольку цель является средней, она больше не будет доступна.

вот ссылка на мою рабочую скрипку: http://jsfiddle.net/bq1f02pk/2/ вы можете настроить все числа, независимо от того, количество или значения.

что я сделал в части js:

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

$("input").on("change", function() {

Далее, чтобы заставить математическую часть работать и избавиться от селекторов jquery, я извлек все входные значения в переменные:

  var target = parseInt($("#target").val());
  var proms = parseInt($("#p").val());
  var pVal = parseInt($("#pval").val());
  var neuts = parseInt($("#n").val());
  var nVal = parseInt($("#nval").val());
  var dets = parseInt($("#d").val());
  var dVal = parseInt($("#dval").val());

Ниже приведены некоторые проверки правильности ввода:

   if (target == pVal) { // only achievable without n's and d's
      return false;
    } else if (target > pVal) { //not reachable
      return false;
    } else if( neuts == 0 && dets == 0){ //no calculation needed
      return false;
    }

в моей скрипке, эти три if также печатают тексты описания для пользователя, в противном случае - один, если с ||было бы достаточно.

теперь, наконец, у нас есть вычисление:

var totals = var totals = ( neuts * ( target - nVal ) + dets * ( target - dVal ) ) / ( pVal - target );
var remaining = totals - proms;

, и чтобы помочь пользователю понять его проблему, вы можете дополнительно создать длинный текст для объяснения результатов:

$("#result").text("to reach your target of " + target + " you need " + totals + " promoters in total. you already have " + proms + " promoters, so you need " + remaining + " more promoters!");
0 голосов
/ 12 сентября 2018

Рассмотрим x для общего количества требуемых двигателей (10 + 3), p для входных двигателей (3), n для входных нейтралей (2) и d для входных помех (1).

Итак, мы имеем следующее уравнение - (100x + 0n - 100d)/(x+n+d) = 75

или 100(x - d)/(x+n+d) = 75

или x-d = 0.75(x+n+d)

Или x-0.75x = 0.75n + 0.75d +d

Или 0.25x = 0.75n + 1.75d

Или x = (75/25)n + (175/25)d ------- (1)

Или x = 3n + 7d

Как n иd уже есть, 2 и 1,

x = 3 * 2 + 7 * 1 = 13 и xp = 13 - 3 = 10 требуются промоторы.

Как реализоватьэто в коде?Как вы можете видеть в уравнении (1)

  1. Умножьте n на (target/(100-target))
  2. Умножьте d на (100+target)/(100-target)
  3. Добавьте их, чтобы получитьВсего промоторов
  4. Вычтите входные промоторы, чтобы получить требуемые промоторы.

Нет необходимости в петле. Здесь предполагается, что цель всегда достижима путем добавления только промоторов.

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