Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Дана строка, найти сумму всех чисел в ней (https://javascript.ru/forum/node-js-io-js/76677-dana-stroka-najjti-summu-vsekh-chisel-v-nejj.html)

Антон789456 01.02.2019 23:13

Дана строка, найти сумму всех чисел в ней
 
Привет, мне лабу дали, одно из заданий такое: Дан текст. Найти слова, состоящие из цифр, и сумму чисел, которые образуют эти слова.

я попробовал написать код, но он почему то выводит первое попавшееся число в строке и завершается. В чём косяк, поможете?
var str = "Произвольный текст, содержащий цифры вроде 1, 2, 45 или 36";

function check(s){
    var sum = 0;
    while ((str[s] >= '0') && (str[s]<='9')) {

        sum = sum*10 + +str[s];

        s++;
    }
    return sum;
}

function index(f){

    while ((str[f] >= '0') && (str[f]<='9'))  f++;

    return f;

}

var summa = 0;
var i = 0;
do {

    if ((str[i] >= '0') && (str[i]<='9')){

        summa = summa + check(i);

        i = i + index(i);

    } i++

} while (i < str.length);

console.log(summa);

destus 02.02.2019 06:08

var str = "Произвольный текст, содержащий цифры вроде 1, 2, 45 или 36";
alert(str.match(/\-?\d+/g).reduce((sum, el) => sum + +el, 0))

Антон789456 02.02.2019 18:15

Цитата:

Сообщение от destus (Сообщение 503053)
var str = "Произвольный текст, содержащий цифры вроде 1, 2, 45 или 36";
alert(str.match(/\-?\d+/g).reduce((sum, el) => sum + +el, 0))

Спасибо, а нет материала какого-нибудь хорошего про регулярные выражения почитать?

AleksSergSB 08.02.2019 13:29

Цитата:

Сообщение от Антон789456 (Сообщение 503049)
я попробовал написать код, но он почему то выводит первое попавшееся число в строке и завершается. В чём косяк, поможете?
var str = "Произвольный текст, содержащий цифры вроде 1, 2, 45 или 36";

[JS]function check(s){
    var sum = 0;
    while ((str[s] >= '0') && (str[s]<='9')) {

        sum = sum*10 + +str[s];

        s++;
    }
    return sum;
}

function index(f){

    while ((str[f] >= '0') && (str[f]<='9'))  f++;

    return f;

}

var summa = 0;
var i = 0;
do {

    if ((str[i] >= '0') && (str[i]<='9')){

        summa = summa + check(i);

        i = i + index(i);

    } i++

} while (i < str.length);

console.log(summa);

Привет!
Логически код написан не связно.

В функции check() вы передаете индекс строки, а саму строку "дергаете" из глобального контекста. То есть, обращаетесь к переменной со строкой находящейся вне функции. Это плохой пример. Функция не универсальна. В будущем когда будете писать в модулях (вы ведь node js изучаете?), такой код не подойдет. То же самое касается вашей функции index(f).
Старайтесь всегда писать функции универсальные, без обращения к данным вне окружения функции.

В самой функции check() есть логические ошибки.
условие " str[s] >= '0' && (str[s]<='9') " не верное. Синтаксически ошибок нет, но вы сравниваете две строки на "больше" "меньше". В таком выражении например буква ''д" будет true при str[s] >= '0'. Сравнивать "больше" "меньше" нужно только числовые значения, если не ожидаете специфический результат получить. Таким образом "9" - строка, а не число. Проверить это можно "typeof str[s] " результат будет string а не number.

Если вы еще не изучали регулярные выражения, то я бы решил задачу примерно так:
const string = 'Произвольный текст, содержащий цифры вроде 1 2, 45 или 36'
// разбиваем строку на массив, удалив запятые и пробелы из строки
const stringArr = string.split(',').join(' ').split(' ');
// переменная накопления суммы
let summNumString=0
// перебираем полученный массив
for (let i=0; i<stringArr.length; i++){
	// если получается преобразовать в число то суммируем
             if (Number(stringArr[i]))
		summNumString+=Number(stringArr[i]);
}
// вывод результата в консоль
console.log(summNumString)


Регулярные выражения обязательно изучите.

Кстати, мой код корректно отработает если в строке будет дробное число (например 1.2), а регулярка от destus поймет это как два разных числа)) :victory:

Nexus 08.02.2019 13:33

Цитата:

Сообщение от AleksSergSB
Кстати, мой код корректно отработает если в строке будет дробное число (например 1.2), а регулярка от destus поймет это как два разных числа))

var str = "Произвольный текст, содержащий цифры вроде 1, 2.2, 45 или 36";
alert(str.match(/\-?[\d\.]+/g).reduce((sum, el) => sum + +el, 0));


Часовой пояс GMT +3, время: 03:14.