Программа На Строки В С++

  • Автор темы Scerob
  • Дата начала
S

Scerob

#1
Разработать программу, выполняющую обработку
строк в соответствии с заданием для вашего варианта.
Исходные строки вводятся с клавиатуры. Обработка
строк должна осуществляться посимвольно
(использование функций форматированного ввода scanf и
sscanf не допускается).
Найти сумму целых чисел, перечисленных в исходной
строке через запятую. Ввод исходной строки
осуществляется с клавиатуры.
Пример ввода: 1,2,3,4
Результат: 10


#include "stdafx.h"
#include "stdafx.h"
#include <iostream>
using namespace std;
int main ()
{
char str[100];
cout << "vvedite stroku\n";
cin >> str;
int sum = 0;
int cur_el=0;
for (int i=0 ; i<strlen(str) ; i++)
if (str == ',')
cur_el++;
else
sum += str;
cout << "}\nsum = " << sum;
system("pause");

}
Не могу понять как сказать программе чтоб она элементы которые не запятая складывала.
 
W

Whatka

#2
Вот решение:
C++:
#include <string.h>
#include <iostream>
#include <math.h>
using namespace std;
int main ()
{
setlocale(LC_ALL,".1251");
char s[100],*u;
cout << "Введите числа через запятую:";
cin >> s;
int sum(0),elem(0),len(0);
u=strtok(s,",\0");
while(u!=0)
{
elem=0;
len=strlen(u);
if(u[0]!='-')
{
for(int i(0);i<len;i++)
elem+=(u[i]-48)*pow(10.,len-i-1);
}
else
{
for(int i(1);i<len;i++)
elem+=(u[i]-48)*pow(10.,len-i-1);
elem*=-1;
}
sum+=elem;
u=strtok(NULL,",\0");
}
cout<<"Сумма чисел строки="<<sum<<endl;
}
Если надо без функций обработки строки(strlen,strtok)
напиши свои и всавь в программу
 
S

Scerob

#3
elem+=(u-48)*pow(10.,len-i-1); не понял эту строчку 48 это что.
 
W

Whatka

#4
так по порядку

elem+=что-то; равносильно elem=elem+что-то;
pow(x,n) возводит x в n-нную степень

u[j]-1 символ типа char (заведомо цифра) по таблице кодов ASCII(стандарт кодирровки) символам от 0 до 9 соответствуют коды от 48 до 57 соответственно
т.е.например
48-48=0
49-48=1
50-48=2


что ещё не понятно?-спрашивай
 
S

Scerob

#5
А можно ли эту строчку как то заменить на более понятные, простые функции а то таблица кодов ASCll это я вобще слышу первый раз.
 
W

Whatka

#6
C++:
int k;
{
//в цикле
k=len-i-1;
elem=elem+(u[i]-48)*pow(10.,k);
}
(u-48)-посмотри функцию atoi

а вообще проще посмотреть таблицу кодов ASCll :google:
 
S

Scerob

#7
А можешь ещё раз пожалуйста объяснить эту строчку сказав что делает каждый элемент по отношению ко всей программе конкретно. А то что-то не доходит зачем всё это. В частности что нам даёт u-48 и возведение 10 в степень len-i-1.
 
W

Whatka

#8
Рассмотрим на примере:
у тебя в строке число 123
C++:
char
)
тебе его надо получить его целым числом
C++:
int
всё это делаем для получения суммы
C++:
int sum; sum=elem+elem1;
где elem и elem1 должны быть целыми

опустим разбиение строки на слова(цифры в данном случае)

и так у тебя есть 123 НО в char *s
C++:
int k,k1,k2;
k=s[0]-48; //нумерация строки с 0
k1=s[1]-48; 
k2=s[2]-48;
т.е. k=1 k1=2 k2=3
а тебе надо 123
применем поразрядовое представление числа

123=1*100+2*10+3*1,заметь 100=10во второй степени 10=10в первой степени 1=10в нулевой степени

elem=k*10^2+k1*10^1+k2*10^0;
 
S

Scerob

#9
Так понял почти всё осталось понять почему -48, скажи плиз u что значит этот элемент и почему -48 ведь по коду 48 это 0
 
W

Whatka

#10
Отнимаешь 48 всегда т.к. символы чисел в кодировке идут последовательно
код->cимволы
49->1
50->2
51->3
52->4
53->5
54->6
55->7
56->8
57->9
..

1->nul
2->soh
3->stx
4->eot

код символа еденицы 49, 49-48=1 ты получил код еденицу в целом виде,которая соответствует символу nul
но ты не переводишь обратно в символы,а работаешь дальше уже со значением