Liczba plus jej odwrotność

0

Bardzo proszę o pomoc utknąłem w martwym punkcie.
Próbuję napisać funkcję która przyjmuję cyfrę zapisaną jako string a zwraca liczbe+liczbe odwrotną do niej.
Przykładowo dostajemy string 1021 czyli 1021+1201 = 2222.
Nie wiem czy dobrze próbuję ugryźć to zagadnienie, dlatego proszę o wskazówki.
W miejscu w którym utknąłem kompilator nie może przepisać elementu tablicy string do inta zaznaczyłem to miejsce (++++++)

#include <iostream>
#include <cstdlib>
using namespace std;

int main(void)
{
  string tab[10];
  int sklad,j,i=0;
  static int temp=0;
  int mnoznik=1;
  string liczba;
  cin>>liczba;
  int skladnik1 = atoi(liczba.c_str());
  cout<<skladnik1;
  j=liczba.length()-1;
  
  for(j;j>=0;j--,i++)
  {
    tab[i]=liczba[j];              
  }
 
 do
 {                              
    sklad=tab[j];                                   (++++++)(++++++)(++++++)(++++++)(++++++)(++++++)
    sklad=sklad*mnoznik;
    temp=temp+skladnik;
    mnożnik=mnożnik*10;
    j=j-1;
 }
 while(j>=0);
 
 cout<<temp;
 
  cout<<tab[0]<<endl;                               //wyswietlilem jedynie po to żeby sprawdzić, czy dobrze poodwracało elementy
  cout<<tab[1]<<endl;
  cout<<tab[2]<<endl;
  cout<<tab[3]<<endl;
  cin.get();
  cin.get();    
    
}
0

Funkcja powinna również zwracać liczbę typu string

0

Konwersja string to int i na odwrót masz tu: Konwersje int na string i string na int
Powiedzmy ze masz liczbę ujemną:

//liczba to Twoja zmienna po konwersji
int wynik = (liczba - liczba) - liczba;
wynik += wynik;
0

Źle przeczytałem.

0

Tak na przyszłość proponuję nie używać pojęć, o których się nie ma pojęcia: http://pl.wikipedia.org/wiki/Liczba_odwrotna

ostringstream oss;
string valAsString;
unsigned int val = 1021;
unsigned int valReversed;
oss << val;
valAsString = oss.str();
reverse(valAsString.begin(), valAsString.end());

istringstream(valAsString) >> valReversed;

cout << val + valReversed << endl;
0

Według mnie liczba odwrotna do 1021 to 1/1021.

0

Oczywiście chodziło mi o liczbę odwrotnie zapisaną (wspak).
Niestety dalej nic nie rozumiem :(

4

Nie poradzisz sobie dalej jeżeli nie nauczysz się dzielić problemu na mniejsze kawałki.

  1. 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ś */);
}
  1. 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.

  1. 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.

  1. 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...

0

Kurcze dzięki wielkie :)

0

Aż tak okropnym pasożytem nie jestem konto założone :)
i zaplusowane ;p
jeszcze raz dzięki :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1