Сумма всех чисел в строке
Код 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;
}
Код:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cstdlib>
#include <cstring>
Цитата: sadovoya
Код и так годится для C++. Но заголовочники лучше в новом стиле делать (добавляя c для с-библиотек и без .h):
conio.h не нужен.
Код:
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cstdlib>
#include <cstring>
Я как то доделал его но он выдает ответ на 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);
}
Код:
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;
}
#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;
}
P.S. У вас была ошибка с выходом из цикла.
Код:
#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;
}
#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;
}
Код:
//Сумма чисел в строке (тут для целых)
//Числа должны разделяться пробелами, табуляциями и т.п. '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;
}
//Числа должны разделяться пробелами, табуляциями и т.п. '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;
}
Код:
#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;
}
#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;
}
Здесь отрицательные целые не обрабатываются - минус игнорируется - можете код модифицировать и для поддержки отрицательных.
Код:
#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;
}
#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;
}
Код:
#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;
}
#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;
}