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


#1

Вот задание:


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

    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));

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


#2

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


#3

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


#4

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


#5

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


#6

Так ?

    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));

#7

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

listRangeNumber.push(x);
            x++;

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


#8

Я разбил всё это дело на две функции. Но какой параметр мне нужно вписать в функцию 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));

#9
'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;
}

#10

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


#11

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


#12

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


#13

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


#14

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


#15

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


#16

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


#17

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

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

#18

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


#19

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


#20

Разобрался окончательно. Функция 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)));