Zmiana liczby na cyfry.

0

Napisz funkcje string convBase(int n, int base) która pobiera liczbe całkowitą n oraz podstawę sytemu liczbowego base a zwraca napis (typu string) zawieraj¡cy liczbę n zapisaną w systemie liczbowym o podstawie base. Podstawa może być dowolną liczbą całkowita od 2 do 36 (włącznie). Dla podstaw większych od 10 zastosuj kolejne litery alfabetu (A, B, ..., Z) jako cyfry 10, 11, ..., 36.

int main()
{
using std::cout; using std::endl; using std::setw;
int numbs[] = {61, 0, -9, -200, 9999};
int bases[] = {16, 8, 2, 20, 36};
size_t size = sizeof(numbs)/sizeof(*numbs);
for (size_t i = 0; i < size; ++i) cout << setw(4) << numbs[i] << " = " << setw(5) << convBase(numbs[i],bases[i]) << " in base " << setw(2) << bases[i] << endl;
}
powinna wydrukowa¢
61 = 3D in base 16
0 = 0 in base 8
-9 = -1001 in base 2
-200 = -A0 in base 20
9999 = 7PR in base 36

Kompletnie nie wiem jak się zabrać do tego. Gdyby ktoś miał trochę czasu wolnego i mi wytłumaczył jak to zrobić będę wdzięczny ;]
Ps wiem google nie gryzie ale i nie odpowiada jak nie znasz pytania :]

1

Rozumiem, że Base to jest system liczbowy na który ma zostać przekonwertowana liczba z "numbers"?

0
Czitels napisał(a):

Rozumiem, że Base to jest system liczbowy na który ma zostać przekonwertowana liczba z "numbers"?

Z tego co rozumiem funkcja ma wyliczyć int numbs / int base zmienić to na string i w tej formie oddać do main , więc wydaje mi się że nie jest potrzebne późniejsze zmienianie z powrotem na int.

1

Kod (opis w komentarzach):

// https://4programmers.net/Forum/C_i_C++/299314-zmiana_liczby_na_cyfry?p=1417757#id1417757

#include <iostream>
#include <string>
#include <stack>
#include <assert.h>

using namespace std;

string dec_to_any(int n, int base){
	string digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 36 znaków - zmiana do base 36 
	stack<int> remainder; // stos na reszty - definiujemy, żeby nie uzywać rekurencji 
	int rem = 0;
	while (n > 0) { // główna pętla, dodajemy na stos reszty - to będa nasze cyfry
					// w nowej bazie
		rem = n % base;
		remainder.push(rem);
		n = n / base;
		}

	string out_string = "";
	while ( !(remainder.empty())){
		out_string += digits.at(remainder.top());
		remainder.pop();
		}
	return out_string;
	}
void test(){
	assert(dec_to_any(9, 2) == "1001");
	assert(dec_to_any(61, 16) == "3D");
	assert(dec_to_any(200, 20) == "A0");
	cout << "Tests passed";
	}

int main (){
	test();
	return 0;
	}

Do ujemnych liczb Dorób sobie prostego "ifa":)

0
lion137 napisał(a):

Kod (opis w komentarzach):

// https://4programmers.net/Forum/C_i_C++/299314-zmiana_liczby_na_cyfry?p=1417757#id1417757

#include <iostream>
#include <string>
#include <stack>
#include <assert.h>

using namespace std;

string dec_to_any(int n, int base){
	string digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 36 znaków - zmiana do base 36 
	stack<int> remainder; // stos na reszty - definiujemy, żeby nie uzywać rekurencji 
	int rem = 0;
	while (n > 0) { // główna pętla, dodajemy na stos reszty - to będa nasze cyfry
					// w nowej bazie
		rem = n % base;
		remainder.push(rem);
		n = n / base;
		}

	string out_string = "";
	while ( !(remainder.empty())){
		out_string += digits.at(remainder.top());
		remainder.pop();
		}
	return out_string;
	}
void test(){
	assert(dec_to_any(9, 2) == "1001");
	assert(dec_to_any(61, 16) == "3D");
	assert(dec_to_any(200, 20) == "A0");
	cout << "Tests passed";
	}

int main (){
	test();
	return 0;
	}

Do ujemnych liczb Dorób sobie prostego "ifa":)

Dzięki wielkie.

0

'''
#include <iostream>
#include <string>
#include <stack>
#include <assert.h>

using namespace std;

//deklaracje funkcji

string convBase(int, int);

string convBase(int n, int base)
{
string digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 36 znaków - zmiana do base 36
stack<int> remainder; // stos na reszty - definiujemy, żeby nie uzywać rekurencji
int rem = 0;

if (n >= 0) // główna pętla, dodajemy na stos reszty - to będa nasze cyfry w nowej bazie
{ 
	rem = n % base;
	remainder.push(rem);
	n = n / base;
}
else
{
	n = ((n)*(-1)); //zmienia ujemne na dodatnie by program mógł wyszukać w stringu
	rem = n % base;
	remainder.push(rem);
	n = n / base;
	n = ((n)*(-1)); //na koniec zmienia na ujemą ((powino ale ie działa )

}

string out_string = "";

while (!(remainder.empty())) 
{
	out_string += digits.at(remainder.top());
	remainder.pop();
}

return out_string;

}

int main() {

int numbs[] = { 61, 0, -9, -200, 9999 };
int bases[] = { 16, 8, 2, 20, 36 };
size_t size = sizeof(numbs) / sizeof(*numbs);
for (size_t i = 0; i < size; ++i) 
	cout << numbs[i] << " = " << convBase(numbs[i], bases[i]) << " in base " <<  bases[i] << endl;

	
system("pause");
return 0;

}'''
Zrobiłem ifa tylko nie wiem co robię nie tak że nie chce mi później na nowo zamienić liczbę na ujemną ;[ ...

1

Tak to Ci nie zadziała, liczba n, już się nie "bawi", ważne jest to co na stosie. Przez "ifa" miałem na myśli taki hack, żeby algorytm się nie zmieniał, tylko w przypadku ujemnego wejścia, zwracał stringa z prefiksem "-".

// https://4programmers.net/Forum/C_i_C++/299314-zmiana_liczby_na_cyfry?p=1417757#id1417757

#include <iostream>
#include <string>
#include <stack>
#include <assert.h>

using namespace std;

string dec_to_any(int n, int base){
	int ctrl = 0;
	string pref = "-";
	if (n < 0){ 
		ctrl = 1;
		n = -1 * n; // żeby na wejściu do algorytmu z powrotem była liczba dodatnia
	}
	string digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 36 znaków - zmiana do base 36 
	stack<int> remainder; // stos na reszty - definiujemy, żeby nie uzywać rekurencji 
	int rem = 0;
	while (n > 0) { // główna pętla, dodajemy na stos reszty - to będa nasze cyfry
					// w nowej bazie
		rem = n % base;
		remainder.push(rem);
		n = n / base;
		}

	string out_string = "";
	while ( !(remainder.empty())){
		out_string += digits.at(remainder.top());
		remainder.pop();
		}
	if (ctrl == 1) return (pref + out_string); // mały "cheating":) konkatenacja "-" z wynikiem
	else
	return out_string;
	}
void test(){
	assert(dec_to_any(-9, 2) == "-1001");
	assert(dec_to_any(-61, 16) == "-3D");
	assert(dec_to_any(200, 20) == "A0");
	assert(dec_to_any(9999, 36) == "7PR");
	cout << "Tests passed";
	}

int main (){
	test();
	return 0;
	}
0
lion137 napisał(a):

Tak to Ci nie zadziała, liczba n, już się nie "bawi", ważne jest to co na stosie. Przez "ifa" miałem na myśli taki hack, żeby algorytm się nie zmieniał, tylko w przypadku ujemnego wejścia, zwracał stringa z prefiksem "-".

// https://4programmers.net/Forum/C_i_C++/299314-zmiana_liczby_na_cyfry?p=1417757#id1417757

#include <iostream>
#include <string>
#include <stack>
#include <assert.h>

using namespace std;

string dec_to_any(int n, int base){
	int ctrl = 0;
	string pref = "-";
	if (n < 0){ 
		ctrl = 1;
		n = -1 * n; // żeby na wejściu do algorytmu z powrotem była liczba dodatnia
	}
	string digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; // 36 znaków - zmiana do base 36 
	stack<int> remainder; // stos na reszty - definiujemy, żeby nie uzywać rekurencji 
	int rem = 0;
	while (n > 0) { // główna pętla, dodajemy na stos reszty - to będa nasze cyfry
					// w nowej bazie
		rem = n % base;
		remainder.push(rem);
		n = n / base;
		}

	string out_string = "";
	while ( !(remainder.empty())){
		out_string += digits.at(remainder.top());
		remainder.pop();
		}
	if (ctrl == 1) return (pref + out_string); // mały "cheating":) konkatenacja "-" z wynikiem
	else
	return out_string;
	}
void test(){
	assert(dec_to_any(-9, 2) == "-1001");
	assert(dec_to_any(-61, 16) == "-3D");
	assert(dec_to_any(200, 20) == "A0");
	assert(dec_to_any(9999, 36) == "7PR");
	cout << "Tests passed";
	}

int main (){
	test();
	return 0;
	}

Dzięki wielkie bo robię sobie kurs a nie doczytałem się że to nie dla kompletnych nobków tylko dla osób które już miały styczność z javą ;[.
Mam jeszcze takie pytanie dodatkowe niezwiązane z tematem.
Znasz może jakiś program do nauki c++ dla kompletnych laików .

1

Proszę bardzo.
Co Masz na myśli pisząc "program do nauki c++", jakiś kurs interaktywny, książkę, kurs online (MOOC), stronę (typu codeacademy)?

0
lion137 napisał(a):

Proszę bardzo.
Co Masz na myśli pisząc "program do nauki c++", jakiś kurs interaktywny, książkę, kurs online (MOOC), stronę (typu codeacademy)?

Najlepszy wydaje mi się byłby program który uczy poprzez pisanie coraz bardziej skomplikowanych kodów ,
tak żeby powoli mnie za "rączkę" przykładami przeprowadził =D.

0

Dzięki.
Kiedyś jeszcze na win 98 był taki program do podstaw C albo Basic,
miałeś podział na zagadnienia i zadania po każdym zagadnieniu do napisania.
Świetna sprawa ale pewnie już nikt takich programów nie produkuje ;[
Nie wiesz czy te Codecademy jest w pełni darmowe czy tylko częściowo?

1

"Nie wiesz czy te Codecademy jest w pełni darmowe czy tylko częściowo?"
Wikipedia podaje: "Codeacademy is freemium interactive platform", Co znaczy, że jest za darmo, ale płatne sa dodatkowe usługi.

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