Показать сообщение отдельно
  #4 (permalink)  
Старый 08.02.2019, 13:29
Аспирант
Отправить личное сообщение для AleksSergSB Посмотреть профиль Найти все сообщения от AleksSergSB
 
Регистрация: 20.11.2016
Сообщений: 74

Сообщение от Антон789456 Посмотреть сообщение
я попробовал написать код, но он почему то выводит первое попавшееся число в строке и завершается. В чём косяк, поможете?
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 поймет это как два разных числа))
Ответить с цитированием