Numere și cifre - din perspectiva C++
Last Updated: Sep 17 2014 21:58, Started by
dani.user
, Sep 17 2014 18:18
·
0
#1
Posted 17 September 2014 - 18:18
Multe probleme sunt legate de operații cu cifrele unui număr. Soluțiile apar, însa deseori se trântește un cod simplu dar repetitiv și care îngreunează urmărirea problemei (dacă-i mai complicată).
Dacă tot se cere o rezolvare în C++, hai să vedem cum ar arată o soluție cu adevărat C++ (11).
Spoiler
Da, să nu vă sperii am pus-o sub formă de spoiler. Înainte de analiza soluția, hai să vedem cât de ușor se folosește: int main() { Digitizer<int> x(456); cout << "x = " << x << endl; cout << "x has " << x.size() << " digits" << endl; cout << "x[0] = " << x[0] << endl; cout << "x digits: "; for (auto digit : x) { cout << digit << " "; } cout << endl; cout << "x digits (reverse): "; for (auto it = x.rbegin(); it != x.rend(); it++) { cout << *it << " "; } cout << endl; Digitizer<int, 2> xBinary = *x; cout << "x digits (binary) = "; for (auto digit : xBinary) { cout << digit; } cout << endl; Digitizer<int, 8> xOctal = *x; cout << "x digits (octal) = "; for (auto digit : xOctal) { cout << digit; } cout << endl; Digitizer<int, 16> xHexa = *x; cout << "x digits (Hexa) = "; for (auto digit : xHexa) { cout << digit; } cout << endl; cout << endl; Digitizer<int> y = x; cout << "y = " << y << endl; y[0] = 8; cout << "Changing y[0] to 8: " << y << endl; Digitizer<int, 2> yBinary = *y; cout << "y digits (binary) = "; for (auto digit : yBinary) { cout << digit; } cout << endl; cout << "Changing yBinary[2] to 1: "; yBinary[2] = 1; for (auto digit : yBinary) { cout << digit; } cout << endl; cout << endl; cout << "Sorting yBinary: "; sort(begin(yBinary), end(yBinary)); for (auto digit : yBinary) { cout << digit; } cout << " (" << yBinary << ")" << endl; return 0; } Quote
x = 456 x has 3 digits x[0] = 4 x digits: 4 5 6 x digits (reverse): 6 5 4 x digits (binary) = 111001000 x digits (octal) = 710 x digits (Hexa) = 1C8 y = 456 Changing y[0] to 8: 856 y digits (binary) = 1101011000 Changing yBinary[2] to 1: 1111011000 Sorting yBinary: 0000111111 (63) Soluția permite:
Aștept comentarii, sugestii și mai ales, ÎNTREBĂRI |
#2
Posted 17 September 2014 - 19:55
E bun de pus într-o bibliotecă .
1. Digit(Digit&& other) { swap(_value, other._value); }Aici și la supraîncărcarea lui ”=”, de ce se folosește Digit&& (sau Digitizer&&)? 2. ValueType operator*() const { return (ValueType)*this; }Nu prea înțeleg de ce îi facem cast lui *this la ValueType. (*this) nu e de tip Digit? Ar cam fi un conflict între tipuri. EDIT: Cumva când se execută return (ValueType)*thisatunci intervine supraîncărcarea de aici: operator const ValueType() const { return _value; } Edited by adrian93, 17 September 2014 - 19:57. |
#3
Posted 17 September 2014 - 21:58
1. Move Constructor
2. Da, ma folosesc de supraincarcarea precedenta. E cam ciudat sa am aceeasi supraincarcare si implicita si prin dereferentiere, dar am zis ca e mai natural de folosit asa. |
Anunturi
Bun venit pe Forumul Softpedia!
▶ 0 user(s) are reading this topic
0 members, 0 guests, 0 anonymous users