Liczba plus jej odwrotność

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 (++++++)

Kopiuj
#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ą:

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

Źle przeczytałem.

byku_guzio
  • Rejestracja:prawie 15 lat
  • Ostatnio:około 7 lat
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

Kopiuj
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;

Olamagato
To raczej jest dla niego za ciężkie na tym poziomie.
Sparrow-hawk
  • Rejestracja:prawie 13 lat
  • Ostatnio:3 miesiące
  • Lokalizacja:Katowice
  • Postów:189
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 :(

Olamagato
  • Rejestracja:ponad 16 lat
  • Ostatnio:12 dni
  • Lokalizacja:Polska, Warszawa
  • Postów:1058
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:
Kopiuj
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ć:

Kopiuj
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:

Kopiuj
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:
Kopiuj
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:
Kopiuj
int main(void)
{
	cout << funkcja("1021") ;
	return 0; //kod wyniku programu
}

ps. Ten temat powinien trafić raczej do newbie...


Jeżeli ktoś komuś coś, ewentualnie nikt nikomu nic, to właściwie po co...?
edytowany 6x, ostatnio: Olamagato
Zobacz pozostałe 8 komentarzy
Endrju
Tak. Tam jest dobrze a u Ciebie dalej jest źle.
Olamagato
Może napisz co jest źle bo nie mam czym skompilować i kod jest z palca. A co do mojego wcześniejszego komentarza, to chyba nie zrozumiałeś, albo włączyłeś sarkazm mode.
Endrju
To drugie. :-) reverse(s).c_str()
msm
@Olamagato - Może napisz sobie gdzieś wielkimi literami że /atoi nie przyjmuje std::stringa tylko char* / :P Jeśli chodzi o kompilowanie to zawsze jest ideone...
Olamagato
OK, dzięki. Pomroczność jasna. Poprawione, chociaż szkoda, że mniej czytelnie. @msm - na ścianie to ja mam napisane czcionką 240, żeby "Nie używać C++". Złamałem swoją zasadę żeby pomóc. Należy mi się kop w środek d**y.
0

Kurcze dzięki wielkie :)

Olamagato
Jeżeli wszystko dla Ciebie jasne, to "zaptaszkuj", żeby odhaczyć temat.
msm
Ładną odpowiedź dałeś :]. Zaptaszkuj? Anonim? On Ci raczej nie da, za to ja Ci zaptaszkuje i jeszcze plusa w dziale newbie otrzymasz :P.
Olamagato
Heh, zapomniałem, że nie pisał z konta... :)
diasdj
  • Rejestracja:ponad 12 lat
  • Ostatnio:ponad 8 lat
  • Postów:18
0

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

edytowany 1x, ostatnio: diasdj
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)