Далее на странице...
Здесь Вы познакомитесь с понятием параллельные массивы и научитесь с ними работать.
Мы продолжим работать с этим кодом, который, напомним: определяет максимальное число в массиве и выдает индексы (позиции) этого числа.
На этой странице исходная задача будет усложнена.
Условие задачи и немного теории:
Есть два числовых массива:
var kpd = [42, 70, 49, 68, 70, 61, 43, 47, 70, 35]
var cost = [22, 24, 25, 21, 22, 23, 23, 26, 23, 24]
Представим следующее:
kpd - массив содержащий значения КПД (коэффициента полезного действия) различных модификаций какого-либо двигателя.
cost - массив, повторяющий структуру массива kpd и содержащий стоимость этих модификаций двигателя.
Массивы kpd и cost называются параллельными, так как для каждого значения из kpd есть соответствующее значение из массива cost с тем же индексом.
То есть значению 42 из kpd соответствует значение 22 из cost - у обоих индекс 0. Индекс 1 - это значения 70 и 24 и т.д.
Нужно сделать следующее:
1. Узнать максимальное значение КПД двигателя из массива kpd. А также индексы (позиции) этого значения (это мы уже делали здесь).
Максимальный КПД двигателя равен 70.
Это значение занимает следующие позиции: 1,4,8.
2. Согласно этим индексам проанализировать соответствующие значения ЦЕНЫ из массива cost и определить минимальное из них.
То есть нужно выяснить, какой двигатель с максимальным КПД (это массив kpd) имеет минимальную стоимость производства (массив cost).
Минимальная цена при максимальном КПД: 22.
Параллельные массивы - Исходный код
Ниже размещен код, от которого мы будем отталкиваться - именно о нем шла речь в начале страницы.
<script type="text/javascript">
var kpd = [42, 70, 49, 68, 70, 61, 43, 47, 70, 35];
var cost = [22, 24, 25, 21, 22, 23, 23, 26, 23, 24];
var i = 0;
var maxi = 0;
while (i < kpd.length)
{
if(kpd[i] > maxi)
{
maxi = kpd[i]
}
i ++;
}
document.write("Максимальный КПД двигателя равен " + maxi);
var empty = [];
for(i = 0; i < kpd.length; i++)
{
if(kpd[i] == maxi)
{
empty.push(i);
}
}
document.write("<br /> Это значение занимает следующие позиции: " + empty);
</script>
Это значение занимает следующие позиции: 1,4,8
Итак, для начала мы имеем максимальный КПД равный 70 и номера позиций (индексов) этого значения в массиве kpd - 1,4 и 8.
-
Подробнее о том, как работает этот фрагмент кода можно узнать здесь.
Работа с параллельными массивами в Javascript
Теперь нам предстоит выяснить: как сопоставить элементы двух параллельных массивов между собой?
А в нашем случае узнать: какому из максимальных значений КПД (число 70 из массива kpd) соответствует минимальная стоимость двигателя (выбирается меньшее из 3-х значений массива cost с индексами 1,4 и 8).
<script type="text/javascript">
var kpd = [42, 70, 49, 68, 70, 61, 43, 47, 70, 35];
var cost = [22, 24, 25, 21, 22, 23, 23, 26, 23, 24];
var i = 0;
var maxi = 0;
while (i < kpd.length)
{
if(kpd[i] > maxi)
{
maxi = kpd[i]
}
i ++;
}
document.write("Максимальный КПД двигателя равен " + maxi);
var empty = [];
var mini = Infinity;
for(i = 0; i < kpd.length; i++)
{
if(kpd[i] == maxi)
{
empty.push(i);
if (cost[i] < mini)
{
mini = cost[i]
}
}
}
document.write("<br /> Это значение занимает следующие позиции: " + empty);
document.write("<br /> Минимальная цена при максимальном КПД: " + mini);
</script>
Результат - Работа с параллельными массивами в Javascript
Максимальный КПД двигателя равен 70
Это значение занимает следующие позиции: 1,4,8
Минимальная цена при максимальном КПД: 22
Комментарии к коду (красным помечены изменения в исходном коде).
-
Вводим переменную mini и присваиваем ей значение Infinity (что обозначает бесконечность) var mini = Infinity. С бесконечностью будут сравниваться нужные значения массива cost с целью поиска минимального.
Если предположить, что нам не известен диапазон значений массива cost, то их лучше сравнивать именно с бесконечностью.
Но если известен, то, например, в нашем случае, можно было бы переменной mini присвоить значение 100.
-
Теперь, после того, как в массив empty занесен индекс очередного максимального значения КПД empty.push(i), мы используем этот индекс для получения соответствующего значения из массива cost.
И если это значение меньше текущего значения переменной mini, последней оно и присваивается.
if (cost[i] < mini){mini = cost[i]}Подробнее о том, что происходит в примере...
1) Итак, сначала был определен индекс первого максимального значения 70 из массива kpd (этот число 1, которое заносится в массив empty).
2) Затем берется значение из массива cost также с индексом 1, то есть 24.
3) Далее идет сравнение: если 24 < Infinity, то число 24 присваивается переменной mini, то есть теперь ее текущее значение равно 24.
4) Затем определяется индекс следующего максимального значения 70 из массива kpd - он равен 4.
5) Индексу под номером 4 соответствует число 22 из массива cost.
6) Снова сравнение: 22 < 24, поэтому теперь mini = 22.
7) Последний индекс, с которым мы работаем равен 8 - это значение 23 из массива cost.
8)Но теперь условие 23 < 22 ложно, поэтому переменная mini не меняет своего значения и по прежнему mini = 22.
-
Таким образом, мы имеем минимальную цену при максимальном КПД двигателя, равную 22.
Параллельные массивы - Упрощаем код
Если, например, нам не нужны номера индексов максимального значения КПД в массиве, то их можно не заносить в массив empty, тем самым немного упростив код.
<script type="text/javascript">
var kpd = [42, 70, 49, 68, 70, 61, 43, 47, 70, 35];
var cost = [22, 24, 25, 21, 22, 23, 23, 26, 23, 24];
var i = 0;
var maxi = 0;
while (i < kpd.length)
{
if(kpd[i] > maxi)
{
maxi = kpd[i]
}
i ++;
}
document.write("Максимальный КПД двигателя равен " + maxi);
/* Исключаем этот фрагмент кода: var empty = []; */
var mini = 100;
for(i = 0; i < kpd.length; i++)
{
if(kpd[i] == maxi)
{
/* Исключаем этот фрагмент кода: empty.push(i); */
if (cost[i] < mini)
{
mini = cost[i]
}
}
}
document.write("<br /> Минимальная цена при максимальном КПД: " + mini);
</script>
Максимальный КПД двигателя равен 70
Минимальная цена при максимальном КПД: 22
Обратите внимание: здесь мы уже работаем со значением переменной mini = 100 (в предыдущем примере работали с Infinity).
Параллельные массивы - Добавляем функции
Код из предыдущего примера можно оптимизировать, используя функции.
<script type="text/javascript">
var kpd = [42, 70, 49, 68, 70, 61, 43, 47, 70, 35];
var cost = [22, 24, 25, 21, 22, 23, 23, 26, 23, 24];
function max_kpd(kpd)
{
var i = 0;
var maxi = 0;
while (i < kpd.length)
{
if(kpd[i] > maxi)
{
maxi = kpd[i]
}
i ++;
}
return maxi;
}
var best_kpd = max_kpd(kpd);
document.write("Максимальный КПД двигателя равен " + best_kpd);
function min_cost(kpd,cost)
{
var mini = Infinity;
for(i = 0; i < kpd.length; i++)
{
if(kpd[i] == best_kpd)
{
if (cost[i] < mini)
{
mini = cost[i]
}
}
}
return mini;
}
var best_cost = min_cost(kpd,cost);
document.write("<br /> Минимальная цена при максимальном КПД: " + best_cost);
</script>
Результат - Параллельные массивы - Добавляем функции
Максимальный КПД двигателя равен 70
Минимальная цена при максимальном КПД: 22
Теперь функции max_kpd и min_cost можно повторно использовать для определения максимального КПД и минимальной стоимости других двигателей.