Задать вопрос
@HakkoRain
junior

Нужно вывести числа в заданном диапазоне. Почему выводит результат не при всех задаваемых значениях?

Задача: написать программу, которая принимает начальное значение диапазона и конечное, введенные пользователем. Необходимо вывести сумму всех четных чисел заданного диапазона. Задачу решил, но при проверке выяснилось, что программа не выдает результат (не формирует диапазон) при использовании в начальном и конечном диапазоне чисел разного порядка (однозначные, двухзначные, трехзначные). Например, задав диапазон 9 и 10, или 98 и 100... При этом, не могу понять, почему программа работает исправно при любом диапазоне от 0, от 1, а также, при диапазонах через порядок (однозначное число - трехзначное число).
Листинг кода:

var n = prompt('введите начальное число диапозона', '0');
var k = prompt('введите конечное число диапозона', '0' );
var a = [];


while (n <= k) {
    a.push(n++);
}
console.log('Числа заданного диапозона: ' + a);

function arraySum(arr, elm) {
    arr = arr.slice(0);   
    for(var sum = 0, a; a = arr.pop();) 
    sum += !elm || elm=="четное" && !(a & 1) || elm== "нечетное" && a & 1 ? a : 0; 
    return sum
}
console.log("Сумма всех чисел: ", arraySum(a)); //сумма всех чисел
console.log("Сумма четных чисел: ",  arraySum(a, 'четное')); //сумма четных чисел
console.log("Сумма нечетных чисел: ",arraySum(a, 'нечетное')); //сумма нечетных чисел
  • Вопрос задан
  • 2228 просмотров
Подписаться 1 Простой 2 комментария
Решения вопроса 1
AngReload
@AngReload
Кратко о себе
Это конечно говнокод, но ошибка только одна:
var n = prompt('введите начальное число диапозона', '0');
var k = prompt('введите конечное число диапозона', '0' );

prompt возвращает строки а не числа, поэтому нужно конвертировать в число, например так:
var n = parseInt(prompt('введите начальное число диапозона', '0'), 10);
var k = parseInt(prompt('введите конечное число диапозона', '0' ), 10);

через Number или parseInt.

Вообще, полезно знать разницу при сравнении чисел и строк:
9 < 10 // true
'9' < '10' // false
Во втором случае получается «ложь», потому что строки сравниваются по кодам символов, начиная с первого символа, те '9' < '1'. Смотрим коды символов:
'9'.charCodeAt(0) // 57
'1'.charCodeAt(0) // 49
57 больше 49, поэтому сравнение заканчивается, выдавая значение false.
Поэтому условие цикла n <= k работает не как ожидается.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы