Nie poradzisz sobie dalej jeżeli nie nauczysz się dzielić problemu na mniejsze kawałki.
- Napisałeś, że potrzebujesz funkcji. Ta funkcja ma mieć wynik. Niech ta funkcja nazywa się po prostu "funkcja", chociaż mogłaby mieć dowolną nazwę jaką sobie wymyślisz.
No to piszesz:
int funkcja(string s)
{
return /* coś */;
}
Typ wyniku jest na początku nagłówka funkcji, tutaj jest to int.
Problem pierwszy odpadł.
Gdyby wynikiem też miałby być ciąg znaków to trzeba by było napisać:
string funkcja(string s)
{
return itoa(/* coś */);
}
- Funkcja ta ma sumować dwie liczby, ale ty na wejściu nie dostajesz liczby, lecz ciąg znaków (w domyśle dziesiętnych, choć tego nie wiadomo), który reprezentuje cyfry tej liczby.
Musisz więc zamienić te znaki na liczby, aby dodawanie mogło się udać. Dla pierwszej liczby możesz użyć wywołania funkcji atoi(s), ale dla drugiej nie możesz użyć ciągu s. Musisz użyć ciągu z odwróconą kolejnością znaków - cyfr. Najprościej taki ciąg zapisać też wywołaniem funkcji nie przejmując się na razie jak ona będzie działać. Np.: reverse(s). To "nie przejmowanie się" jest właśnie sednem programowania bo na razie interesuje Cię tylko wynik.
Wtedy to co musisz policzyć będzie wyglądać tak:
atoi(s) + atoi(reverse(s))
Odwracanie cyfr liczby takiej jak int i tak sprowadza się do wyciągnięcia z jej wartości poszczególnych cyfr o jakiejś podstawie, więc jeżeli od razu masz liczbę w postaci ciągu cyfr będących znakami, to odwracanie jest najłatwiejsze i najbardziej zrozumiałe.
Ostatecznie więc cała funkcja będzie wyglądać tak:
int funkcja(string s)
{
return atoi( s.c_str() ) + atoi( reverse(s).c_str() );
}
Metoda c_str() służy do tego, żeby funkcja atoi dostała prawidłowy ciąg znaków. Nieczytelne, ale cóż poradzić - taki jest C++ w odróżnieniu od czystego C. Można też użyć konwersji string na int za pomocą metod z C++, ale jest to jeszcze bardziej nieczytelne. Ewentualnie konsekwentnie używać (char*) zamiast string.
- Zostaje ostatni problem, czyli napisanie funkcji reverse() odwracającej znaki ciągu. Przy czym długość tego ciągu może być dowolna. Jednym ze sposobów odwracania ciągu jest zamiana elementu pierwszego z ostatnim, drugiego z przedostatnim i tak dalej aż dojdzie się do jego środka.
Można to napisać w taki sposób pamiętając, że wynikiem też ma być string:
string reverse(string s)
{
int len = s.length();
for(int idx = 0; idx < len / 2; ++idx)
{
char temp = s[idx];
s[idx] = s[len - 1 - idx]
s[len - 1 - idx] = temp;
}
return s;
}
Wygląda tu tak jakby zwracana była wartość otrzymana, choć w rzeczywistości s w tej funkcji reprezentuje kopię argumentu. Tak więc zamiana jest wykonywana na kopii i to ona jest zwracana.
- Funkcję masz napisaną (a właściwie dwie). Teraz będzie można jej użyć na przykład tak:
int main(void)
{
cout << funkcja("1021") ;
return 0; //kod wyniku programu
}
ps. Ten temat powinien trafić raczej do newbie...