Witam.
Mam mały problem bo zaczynam dopiero z C++.
Mianowicie chodzi o to jak wyciągnąć cyfry ze stringa? Np. mamy ciąg znaków dls?d1:s45;=dd-9m0aA7 i chcemy policzyć sumę cyfr zawartych w napisie zmiennej string.
Dodatkowo jest też problem, że mogą to być cyfry ujemne jak tu np "-9".
Ma ktoś jakiś pomysł?
Z takich bardziej patologicznych rozwiązań to można tak
#include <iostream>
#include <string>
using namespace std;
int main() {
std::string str( "dls?d1:s45;=dd-9m0aA7" );
bool sign = false;
int sum = 0;
for( char c : str )
{
if( c == '-' )
sign = true;
else
{
if( isdigit( c ) )
sum += ( c - '0' )*( sign ? -1 : 1 );
sign = false;
}
}
std::cout << sum;
return 0;
}
plocienm napisał(a):
... że mogą to być cyfry ujemne jak tu np "-9". Ma ktoś jakiś pomysł?
Naprawdę nie mam pomysłu co do ujemnych cyfr, matematyka nie zna takiego pojęcia, ujemne liczby owszem, ale żeby cyfry ...
Co ma policzyć w przypadku:abc-523def
?
0 czy -523 ?
fakt nie ma ujemnych cyfr ;)
liczyć ma -523
No to musisz nieco przerobić program od @stryku
dobra teraz już chyba sobie poradzę, przynajmniej wiem jak zacząć
dzięki
Wydaje mi się, że jak najbardziej jest coś takiego jak ujemne cyfry. Cyfra obejmuje znaki od 0 do 9, więc ujemne cyfry występują między -0 a -9 http://sjp.pl/cyfra
Prosty Kot napisał(a):
Wydaje mi się, że jak najbardziej jest coś takiego jak ujemne cyfry. Cyfra obejmuje znaki od 0 do 9, więc ujemne cyfry występują między -0 a -9 http://sjp.pl/cyfra
Masz całkowitą racje, wydaje ci się.
To o czym mówisz nazywa się ujemna liczba jednocyfrowa.
Jak dla mnie tylko rozwiazanie @shalom.
Regrex będzie traktowany jako napis wiec nawet bardzo duże liczby nie bedą problemem.
fajne ćwiczonko z STL-a:
http://ideone.com/4yiAM1
Nie muszę chyba mówić, że RegExp to totalny overkill (jak to zwykle bywa w 95% przypadków użycia RegExpa).
Można jeszcze tak:
#include<iostream>
#include<string>
using namespace std;
int main() {
string text = "dls?d1:s45;=dd-96m0aA7";
string temp = "";
int sum = 0;
for (int i = 0; i < text.size() + 1; ++i) {
if (isdigit(text[i])) temp = temp + text[i];
else {
if (temp != "") {
int number = stoi(temp);
int pos = i - temp.size() - 1;
if (pos >= 0)
if (text[pos] == '-') number *= -1;
sum += number;
temp = "";
}
}
}
cout << sum << endl;
return 0;
}
Programik rozpoznaje np. samotne znaki -
.
Może ja też wkleję rozsądną wersję :D http://ideone.com/GLMKlp
#include <iostream>
#include <string>
using namespace std;
int main()
{
string text = "dls?d1:s45;=dd-96m0aA7";
int sum=0,pos=-1;
for(int i=0;i<=text.size();++i)
{
if(isdigit(text[i]))
{
if(pos<0) pos=i;
}
else if(pos>=0)
{
sum+=(((pos)&&(text[pos-1]=='-'))?-1:1)*atoi(&text[pos]);
pos=-1;
}
}
cout<<sum<<endl;
return 0;
}
Z tym że przypominam że nadał w zadaniu nie wiadomo co robić z tym fantem: abc9999999999999999999def9999999999999999999ghi
1001-1002
i Regexp traci cały swój urok.