Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Сумма всех чисел в строке

88K
05 ноября 2014 года
Sherzod To'xtaboev
2 / / 05.11.2014
Сумма всех чисел в строке. Кто нибудь может это транслировать на C++

Код C

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

int main()
{
char str[80];
gets(str);
int sum=0;
char *ptr=strtok(str, " ");
while (ptr!=0)
{
if (atoi(ptr)!=0) sum+=atoi(ptr);
ptr=strtok(NULL, " ");
}
printf("%dn", sum);
getchar();
return 0;

}
326
05 ноября 2014 года
sadovoya
757 / / 19.11.2005
Код и так годится для C++. Но заголовочники лучше в новом стиле делать (добавляя c для с-библиотек и без .h):

 
Код:
#include <cstdio>
#include <cstdlib>
#include <cstring>
conio.h не нужен.
88K
05 ноября 2014 года
Sherzod To'xtaboev
2 / / 05.11.2014
Цитата: sadovoya
Код и так годится для C++. Но заголовочники лучше в новом стиле делать (добавляя c для с-библиотек и без .h):

 
Код:
#include <cstdio>
#include <cstdlib>
#include <cstring>
conio.h не нужен.



Я как то доделал его но он выдает ответ на ASCII как то можно исправить это

#include <iostream>
//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char argv[])
{
using namespace std;
cout << "input string (max len 80)" << endl;
char str[80];
cin >> str;
int sum = 0;
int i = 0;
while( str ) {
sum += (int)str[i++];
}
cout << "sum = " << sum << endl;

system("pause");
//cin >> str;
return(0);
}

326
05 ноября 2014 года
sadovoya
757 / / 19.11.2005
 
Код:
sum += (int)str[i++];
Этим вы суммируете числовые коды символов. Как вариант, можно и отсюда двигаться - - внести поправку между кодом цифры-символа и самой цифрой.
В большинстве кодировок (если не во всех) коды цифр идут подряд; для таких, причем однобайтных, кодировок можно так:

Код:
#include <cstdio>
#include <clocale>

int main() {
    setlocale(LC_ALL,"");
    puts("Введите строку, состоящую из цифр (макс. длина 80 символов): ");
    char * str = new char[80];
    gets(str);
    int sum = 0;
    while( *str )
        sum += *str++ - '0';
    delete [] str;
    printf("Сумма цифр в строке: %d\n", sum);
    printf("\nНажмите клавишу...");
    getchar();
    return 0;
}
Если в строке кроме цифр допускается все прочее - достаточно добавить фильтр на диапазон '0'..'9' суммируемых char-ов.

P.S. У вас была ошибка с выходом из цикла.
326
06 ноября 2014 года
sadovoya
757 / / 19.11.2005
Это было для цифр. А вот для целых чисел, разделенных пробелом, запятой или точкой с запятой:

Код:
#include <cstdio>
#include <cstring>
#include <clocale>
#include <cstdlib>

int main () {
    setlocale(LC_ALL, "");
    char str[] = "100,200;300 400";
    printf("Исходная строка: %s\n", str);
    const char *delim = " ;,"; //разделители
    char *p = strtok (str, delim);
    int sum = 0;
    puts("Числа в строке:");
    while ( p ) {
        sum += atoi(p);
        printf ("%s\n", p);
        p = strtok (0, delim);
    }
    printf("Сумма чисел: %d\n\nНажмите клавишу...", sum);
    getchar();

    return 0;
}
326
06 ноября 2014 года
sadovoya
757 / / 19.11.2005
Для разделителей пробел и др. white space (табуляции и т.п.). Здесь для целых чисел. Более универсальным будет переделать в double.

Код:
//Сумма чисел в строке (тут для целых)
//Числа должны разделяться пробелами, табуляциями и т.п. 'white space'

#include <iostream>
#include <sstream>
#include <string>


int main() {
    std::string s("100 200 300\t400\n500 600");
    std::istringstream iss(s);
    int sum = 0, tmp = 0;
    while (iss >> tmp)
        sum += tmp;
    std::cout << sum << std::endl;
    return 0;
}
P.S. Посредством связки <sstream> и <string> можно делать многие полезные строчно-числовые конвертации, не прибегая даже к расширенному функционалу string в стандартах C++11/14.
11K
07 ноября 2014 года
xAtom
65 / / 17.01.2011
Код:
#include <iostream>
#include <cstring>
using namespace std;


//в стиле Си
size_t strnum_sum1(const char* s){
    size_t n, sum = 0;
    while((s = strpbrk(s, "0123456789")) != NULL){
        for(n = 0; *s >= '0' && *s <= '9'; )
            n = n * 10 + (size_t)(*s++ - '0');
        sum += n;
    }
    return sum;
}


//c++
size_t strnum_sum2(const string& s){
    const char tpl[] = "0123456789";
    size_t n, sum = 0;
    string::size_type l, f = 0;
    while((f = s.find_first_of(tpl, f)) != string::npos){
        if((l = s.find_first_not_of(tpl, f)) == string::npos)
            l = s.length();
        for(n = 0; f < l; )
            n = n * 10 + (size_t)(s[f++] - '0');
        sum += n;
    }
    return sum;
}


int main(void){
    char s1[] = "5, [1], N2, 12, ops1000";
    cout << strnum_sum1(s1) << endl;

    string s2 = "0xxx10+90xxx4, 6";
    cout << strnum_sum2(s2) << endl;
    return 0;
}
Проверка работы кода
326
08 ноября 2014 года
sadovoya
757 / / 19.11.2005
Не самый эффективный, но короткий способ -- заменить не-цифры на любые white space, потом поступить как в прошлом моем примере.
Здесь отрицательные целые не обрабатываются - минус игнорируется - можете код модифицировать и для поддержки отрицательных.

Код:
#include <cstdio>
#include <sstream>
#include <string>
#include <algorithm>
#include <clocale>

bool my_pred(char c) {
    return ( !isdigit(c) );
}

int main() {

    setlocale(0, "");

    std::string s("a0100d200c0300\t400\n500 600");
    std::replace_if(s.begin(), s.end(), my_pred, '\t');
    std::istringstream iss(s);
    int sum = 0, tmp = 0;
    while (iss >> tmp)
        sum += tmp;

    printf("Сумма чисел: %d\n\nНажмите клавишу...", sum);
    getchar();

    return 0;
}
Это все будет работать и с новым и со старым стандартами. Начиная со стандарта С++11 привлекательно использовать регулярные выражения (если компилятор достаточно поддерживает 11 стандарт). Может пригодиться еще в C++11 новая функция stoi для string.
326
08 ноября 2014 года
sadovoya
757 / / 19.11.2005
Сумма цифр с помощью STL:

Код:
#include <numeric>
#include <cstdio>
#include <clocale>
#include <string>

template<class T>
T sum_fn(T x, char y) {
    return isdigit(y) ? x + y - '0' : x;
}

int main() {

    setlocale(0, "");
    const char *ch_sec = "0w-349d9-g96f";
    std::string s;
    for(int i = 0; i < 1000; i++)
        s += ch_sec;

    std::size_t sum1 = std::accumulate(s.begin(), s.end(), (std::size_t)0,
                    &sum_fn<std::size_t>);
    printf("Сумма цифр: %u\n", sum1);

    double sum2 = std::accumulate(s.begin(), s.end(), (double)0, &sum_fn<double>);
    printf("Сумма цифр: %.0f\n", sum2);

    printf("\nНажмите клавишу...");
    getchar();
    return 0;
}

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог