Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 01.02.2019, 23:13
Новичок на форуме
Отправить личное сообщение для Антон789456 Посмотреть профиль Найти все сообщения от Антон789456
 
Регистрация: 01.02.2019
Сообщений: 3

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

я попробовал написать код, но он почему то выводит первое попавшееся число в строке и завершается. В чём косяк, поможете?
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);
Ответить с цитированием
  #2 (permalink)  
Старый 02.02.2019, 06:08
Аватар для destus
Профессор
Отправить личное сообщение для destus Посмотреть профиль Найти все сообщения от destus
 
Регистрация: 18.05.2011
Сообщений: 1,207

var str = "Произвольный текст, содержащий цифры вроде 1, 2, 45 или 36";
alert(str.match(/\-?\d+/g).reduce((sum, el) => sum + +el, 0))
Ответить с цитированием
  #3 (permalink)  
Старый 02.02.2019, 18:15
Новичок на форуме
Отправить личное сообщение для Антон789456 Посмотреть профиль Найти все сообщения от Антон789456
 
Регистрация: 01.02.2019
Сообщений: 3

Сообщение от destus Посмотреть сообщение
var str = "Произвольный текст, содержащий цифры вроде 1, 2, 45 или 36";
alert(str.match(/\-?\d+/g).reduce((sum, el) => sum + +el, 0))
Спасибо, а нет материала какого-нибудь хорошего про регулярные выражения почитать?
Ответить с цитированием
  #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 поймет это как два разных числа))
Ответить с цитированием
  #5 (permalink)  
Старый 08.02.2019, 13:33
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,705

Сообщение от AleksSergSB
Кстати, мой код корректно отработает если в строке будет дробное число (например 1.2), а регулярка от destus поймет это как два разных числа))
var str = "Произвольный текст, содержащий цифры вроде 1, 2.2, 45 или 36";
alert(str.match(/\-?[\d\.]+/g).reduce((sum, el) => sum + +el, 0));
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти сумму цифр числа yaparoff Общие вопросы Javascript 7 02.01.2021 19:32
Вот такое задание, но я только в начале пути вэб разработки, подскажите как? Dixlofos Общие вопросы Javascript 31 22.10.2018 01:48
Найдите сумму четных чисел из массива yaparoff Общие вопросы Javascript 3 18.01.2017 09:37
Посчитать сумму ширины всех элементов в наборе без использования цикла Alex_D181 jQuery 7 10.06.2015 15:36
Browser Object Model, где найти для всех платформ? alta Javascript под браузер 2 09.10.2010 21:24