Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <iomanip>
- #include <vector>
- #include <cmath>
- class F {
- private:
- int B; // основание системы счисления
- char C; // код представления числа d(direct)/r(reverse)/a(additional)
- char S; // знак числа
- std::vector<char> D; // цифровая часть числа
- F dex_to_F(int dex, int base, char C, char S) {
- std::vector <char> N;
- while (dex != 0) {
- N.push_back(dex%base + '0'); //добавление элемента в конец вектора
- dex /= base;
- }
- std::reverse(N.begin(), N.end());
- return F(base, C, S, N);
- }
- public:
- F(int B, char C, char S, std::vector<char> D) { // инициализируем поля класса в конструкторе
- this->B = B;
- this->C = C;
- this->S = S;
- this->D = D;
- }
- std::string get_base() {
- return std::to_string(B);
- }
- std::string to_s() {
- std::string str = "";
- str += S;
- for (int i = 0; i < D.size() ; i++) {
- str += (int)D[i];
- }
- return str;
- }
- F to_code(char code) {
- if (S == '+') {
- return F(B, C, S, D);
- } else {
- F buf_f = F(B, code, S, D);
- if (code == 'a') {
- int val = abs(dex()) - 1;
- F f_buf = dex_to_F(val, B, C, S);
- buf_f.D = f_buf.D;
- }
- std::string buf = "";
- for (int i = 0; i < D.size(); i++) {
- buf += D[i];
- }
- int n = std::stoi(buf);
- int number = 0, k = 1;
- while (n) {
- number += (B - 1 - n % B) * k;
- k *= 10;
- n /= 10;
- }
- std::string buf2 = std::to_string(number);
- std::vector<char> v(buf2.begin(), buf2.end());
- buf_f.D = v;
- return buf_f;
- }
- }
- void to_base(int base) {
- std::vector <char> N;
- int val = dex();
- int dex = abs(val);
- while (dex != 0) {
- N.push_back(dex%base + '0');
- dex /= base;
- }
- std::reverse(N.begin(), N.end());
- D = N;
- B = base;
- }
- int dex() {
- int count = 0, a = 0;
- std::string str = "";
- for (int i = 0; i < D.size(); i++) {
- str += (int)D[i];
- }
- int number = std::stoi(str);
- do {
- int mod = number % 10;
- a += pow(B, count)*mod;
- count++;
- number /= 10;
- }while(number);
- return (S == '-')?-a:a;
- }
- F operator-() {
- char temp = (S == '-')?'+':'-';
- return F(B, C, temp, D);
- }
- F operator+(F value) {
- int val = value.dex() + dex();
- char sign = (val > 0)?'+':'-';
- F f_buf = dex_to_F(abs(val), B, C, sign);
- return f_buf;
- }
- F operator%(F value) {
- int val = value.dex() % dex();
- char sign = (val > 0)?'+':'-';
- F f_buf = dex_to_F(abs(val), B, C, sign);
- return f_buf;
- }
- F operator*(F value) {
- int val = value.dex() * dex();
- char sign = (val > 0)?'+':'-';
- F f_buf = dex_to_F(abs(val), B, C, sign);
- return f_buf;
- }
- };
- int main() {
- setlocale(LC_ALL, "Russian");
- F temp1 = F(5, 'd', '-', {'3', '4', '0'});
- F temp2 = F(2, 'd', '-', {'1', '0', '0', '1', '0'});
- F temp3 = F(5, 'd', '+', {'3', '1'});
- std::cout << "\nПрограмма курсовой работы F-число.\n";
- std::cout << "\nЧисло A: " << temp1.to_s() << ", основание: " << temp1.get_base();
- std::cout << "\nЧисло B: " << temp2.to_s() << ", основание: " << temp2.get_base();
- std::cout << "\nЧисло C: " << temp3.to_s() << ", основание: " << temp3.get_base();
- std::cout << "\n\nПримеры операций над числами:";
- std::cout << "\n\n- Приведение числа F к заданному коду:\n";
- F buf1 = temp1.to_code('r');
- F buf2 = temp2.to_code('r');
- std::cout << "Обратный код числа A: " << buf1.to_s();
- std::cout << "\nОбратный код числа B: " << buf2.to_s();
- buf1 = temp1.to_code('a');
- buf2 = temp2.to_code('a');
- std::cout << "\nДополнительный код числа A: " << buf1.to_s();
- std::cout << "\nДополнительный код числа B: " << buf2.to_s();
- std::cout << "\n\n- Преобразование числа F к заданной системе счисления:";
- buf1.to_base(8);
- F buf3 = temp3;
- temp3.to_base(3);
- std::cout << "\nЧисло A: " << buf1.to_s() << ", основание: " << buf1.get_base();
- std::cout << "\nЧисло C: " << buf3.to_s() << ", основание: " << buf3.get_base();
- std::cout << "\n\n- Изменение знака числа:";
- std::cout << "\nЧисло B: " << (-temp2).to_s() << ", основание: " << temp2.get_base();
- std::cout << "\nЧисло C: " << (-temp3).to_s() << ", основание: " << temp3.get_base();
- std::cout << "\n\n- Сложение двух заданных F чисел:";
- F buf4 = temp1 + temp3;
- F buf5 = temp1 + temp2;
- std::cout << "\nЧисло D = A + C: " << buf4.to_s() << ", основание: " << buf4.get_base();
- std::cout << "\nЧисло D = A + B: " << buf5.to_s() << ", основание: " << buf5.get_base();
- std::cout << "\n\n- Получение остатка от деления двух F чисел:";
- F buf6 = temp1 % temp3;
- std::cout << "\nЧисло D = A % C: " << buf6.to_s() << ", основание: " << buf6.get_base();
- char d[] = "0123456789ABCDEF";
- int n, m, r;
- std::string s;
- std::cout << "\n\nВведите систему счисления, для которой \nнужно посторить таблицу умножения: ";
- std::cin >> n;
- for (int i = 1; i <= n; i++) {
- std::cout << "\n" << std::setw(5) <<i << " |";
- for (int j = 1; j <= n; j++) {
- char ch1 = i + '0';
- char ch2 = j + '0';
- F f1 = F(n, 'd', '+', {ch1});
- F f2 = F(n, 'd', '+', {ch2});
- F res = f1*f2;
- std::cout << std::setw(5) << res.to_s();
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement