Подсчёт суммы диапазона чисел

Вот задание:


А вот что у меня получилось:

    function range(x,y){
        var listRangeNumber = [];   
        while( x <= y ){
            listRangeNumber.push(x);
            x++;
        }
        for (k = 0; k <= listRangeNumber.lenght; k++) {
            listSumNumber += listRangeNumber[k];
            console.log(listSumNumber);
        }
        return listRangeNumber;
    }
    x = prompt("Enter lesser number");
    y = prompt("Enter bigger number");
    alert( "Range of this numbers " + range(x,y));

Не получается вывести сумму хотя бы в консоль, но вывод диапазона работает.

Во-первых у тебя в ТЗ сказано, что сумму вычислять нужно в отдельной функции. Во-вторых это же рекомендуется для стиля кода - код разбивать на функции, каждая выполняет минимальное действие. Вот твою функцию можно разделить на две.

объяви и инициализируй до начала цикла.
Кроме того элементы массива можно перебирать в более элегантном for of цикле

1 лайк

Спасибо, сейчас попробую

чтобы избегать ошибок с инициализацией переменных используют ‘use strict’; - интерпретацию по новым стандартам, которая требует объявления переменных.

Так ?

    function range(x,y){
        var listRangeNumber = [];
        var listSumNumber;
        while( x <= y ){
            listRangeNumber.push(x);
            x++;
        }
        for (k = 0; k <= listRangeNumber.lenght; k++) {
            listSumNumber += listRangeNumber[k];
            console.log(listSumNumber);
        }
        return listRangeNumber;
    }
    

    x = prompt("Enter lesser number");
    y = prompt("Enter bigger number");
    alert( "Range this numbers " + range(x,y));

Что такое инициализация переменной слышал? Сразу ноль присвоить.

listRangeNumber.push(x);
            x++;

можно записать как listRangeNumber.push(x++);

Я разбил всё это дело на две функции. Но какой параметр мне нужно вписать в функцию sum() ?. И что нужно написать вместо “listRangeNumber” в sum() ?

    function range(x,y){
        var listRangeNumber = [];
        while( x <= y ){
            listRangeNumber.push(x);
            x++;
        }
        return listRangeNumber;
    }
    function sum(){
        var listSumNumber = 0;
        for (k = 0; k <= listRangeNumber.lenght; k++) {
            listSumNumber += listRangeNumber[k];
            console.log(listSumNumber);
        }
    }
    x = prompt("Enter lesser number");
    y = prompt("Enter bigger number");
    alert( "Range this numbers " + range(x,y));
'use strict';

function range(x, y) {
  var listRangeNumber = [];
  while (x <= y) listRangeNumber.push(x++);

  return listRangeNumber;
}

function sum(ran) {
  var listSumNumber = 0;
  for (var i of ran) console.log((listSumNumber += i));

  return listSumNumber;
}
1 лайк

А у вас это работает ?

У меня да. Что у вас не работает? К стати, чтоб научиться выявлять ошибки лучше пользоваться не console.log, а debug - ом. Это все равно что сравнивать, что кушать рис китайскими палочками или ложкой/вилкой

Допишите к коду, который я вам дал это
var test = sum(range(1, 5));
console.log({test});
и запустите

Это простая задача. Но чтобы она не была тяжелой, как штанга, нужно прийти к ней последовательно. Взять хорошую книгу по JavaScript и изучать по порядку.

Спасибо, я более менее что то понял из увиденного. Этот пример как раз из книги “Выразительный javascript”. Дело в том что в книжке на этом моменте ещё не объясняли про for of, по этому я пытался сделать через цикл.

это не влияет на результат. for of - это краткая запись for. Проблема у вас в том, что вы не числа складываете, а выполняете конкатенацию строк.

А эта запись
for (k = 0; k <= listRangeNumber.lenght; k++) {
listSumNumber += listRangeNumber[k];
};
тождественна этой записи ?
for (var i of ran) (listSumNumber += i);

Вот и изучите цикл for of. Нормальная книга по языку программирования “весит” не менее 1500 стр. По Java, лет 8-10 назад книга занимала 2 тома по 1000 стр. Хорошего объема книга по JavaScript:

  1. Современный учебник
  2. Дэвид Флэнаган - хоть там не описан стандарт ECMAScript 2015, нужна еще книга наподобие “Новинки ES6”

console.log((listNumber += i));
Двойные скобки я ошибочно поставил. Хватит одних.

К стати, я малехо “загнул”. for-of цикл появился в стандарте ES6. Так что то, что вы еще не изучили этот цикл - это нормально.

Разобрался окончательно. Функция prompt принимает значения типа string. Ещё в книжке был описан цикл for…in, его можно использовать для перебора свойств объекта.

    function range(x,y){
        var listRangeNumber = [];
        while( x <= y ){
            listRangeNumber.push(x);
            x++;
        }
        return listRangeNumber;
    }

    function sum(range){
        var listSumNumber = 0;
        for (var k in range) {
            listSumNumber += range[k];
        }
        return listSumNumber;
    }

    alert( "Range this numbers " + range(x,y));
    alert (sum(range(x,y)));