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?
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:
Funkcja powinna dostawać dwa dodatkowe parametry: wskaźnik na tablice znaków oraz jej rozmiar;
Funkcja wypełnia i zwraca statyczną tablice: char tab[33]; chociaż to jest niepoprawne w przypadku wielu wątków;
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
).
#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;
}