Zamiana systemow liczbowych-funkcje

WItam! mam zrobic program wykorzystujacy funkcje, ktory bedzie zmienial liczbe z sys. 10 na dowolnie wybraną. O to co narazie nabazgrałem:

Po odpaleniu i podaniu danych wynik zawsze wychodzi 0. Moglby mi ktos wskazac dlaczego?

Masz świadomość, że return to nie Pythonowski yield? W pierwszej iteracji wyjdzie z funkcji (i już nie wróci do pętli). Zwraca zawsze 0, ponieważ dla małych danych t[9] (najbardziej znacząca cyfra) będzie zawsze 0.

Wygląda mi na błąd w rozpoznaniu tego, czym jest liczba i jej zapis w systemie pozycyjnym. bo czy (int(0xF) == int(15))? Dlatego (zamiana(x, y) == x) i jesteś w kropce, skoro chcesz zwracać typ liczbowy.

zamiast return wstawiłem cout<

ale tego drugiego problemu ktory pokazales dalej nie rozumiem…

i tak wogle to wielkie dzięki ze wogle chce ci sie czytac te moje wypociny.

Chodzi o to, że dla każdej możliwej wartości int istnieje wiele reprezentacji (np. 16#F == 10#15 == 8#17 == 2#1111) Zapisy są różne, ale wartość ta sama. Dlatego funkcja zamiana(x, y) powinna zwracać np. string. Poza tym dlaczego obsługujesz tylko zapisy o bazie mniejszej niż 10? Zapis szesnastkowy z dodatkowymi literkami ABCDEF jest bardzo popularny (nietrudno to dopisać).

Funkcja zamiana() nie może tak wyglądać musisz wybrać jedno z:

  1. Funkcja powinna dostawać dwa dodatkowe parametry: wskaźnik na tablice znaków oraz jej rozmiar;

  2. Funkcja wypełnia i zwraca statyczną tablice: char tab[33]; chociaż to jest niepoprawne w przypadku wielu wątków;

  3. Funkcja powinna zwracać std::string;

Uwaga, poniżej jest mały spojler. Mam nadzieję, że trochę pomoże. Wiem, że dałoby się to zrobić wydajniej nie używając stosu do odwracania cyfr, ale tak jest chyba czytelniej (i wygodniej :wink: ).

#include 

#include 

#include 

#include 


using namespace std;


// nie sprawdza poprawnosci danych

// dziala ladnie dla v w przedziale [0, 36]

// dalej pokazuje brzydkie znaczki

char int2digit(int v)

{

  if (v < 10)

    return '0' + v;

  else

    return 'A' + v - 10;

}


// tez nie sprawdza poprawnosci

// troche zakrecilem z tym stosem, ale chodzilo tylko o to,

// zeby odwrocic kolejnosc cyfr w wyniku

string int2base(int v, int base, bool show_base = true)

{

  string res;

  stack st;


  if (show_base)

    res = int2base(base, 10, false) + '#';


  if (v < 0)

    {

      res += '-';

      v = -v; // dalej potrzebujemy wartosci bezwzglednej

    }


  do

    {

      st.push(int2digit(v % base));

      v /= base;

    }

  while (v != 0);


  while (!st.empty())

    {

      res += st.top();

      st.pop();

    }


  return res;

}


int main()

{

  int base, val;

  cin >> val >> base;


  cout << setw(20) << right

       << int2base(val, base) // pierwszy sposob

       << setw(20) << right << "#" << endl;


  cout << setw(20) << right

       << int2base(val, base, false) // drugi sposob

       << setw(20) << right << "" << endl;


  // standardowa funkcja z iomanip

  // dziala tylko dla base \in {8, 10, 16}

  cout << setbase(base) << val << endl;

  return 0;

}