Advertisement
Guest User

Untitled

a guest
Jan 18th, 2017
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.33 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <vector>
  4. #include <cmath>
  5.  
  6. class F {
  7. private:
  8. int B; // основание системы счисления
  9. char C; // код представления числа d(direct)/r(reverse)/a(additional)
  10. char S; // знак числа
  11. std::vector<char> D; // цифровая часть числа
  12.  
  13. F dex_to_F(int dex, int base, char C, char S) {
  14. std::vector <char> N;
  15. while (dex != 0) {
  16. N.push_back(dex%base + '0'); //добавление элемента в конец вектора
  17. dex /= base;
  18. }
  19. std::reverse(N.begin(), N.end());
  20. return F(base, C, S, N);
  21. }
  22.  
  23. public:
  24. F(int B, char C, char S, std::vector<char> D) { // инициализируем поля класса в конструкторе
  25. this->B = B;
  26. this->C = C;
  27. this->S = S;
  28. this->D = D;
  29. }
  30.  
  31. std::string get_base() {
  32. return std::to_string(B);
  33. }
  34. std::string to_s() {
  35. std::string str = "";
  36. str += S;
  37. for (int i = 0; i < D.size() ; i++) {
  38. str += (int)D[i];
  39. }
  40. return str;
  41. }
  42.  
  43. F to_code(char code) {
  44. if (S == '+') {
  45. return F(B, C, S, D);
  46. } else {
  47. F buf_f = F(B, code, S, D);
  48. if (code == 'a') {
  49. int val = abs(dex()) - 1;
  50. F f_buf = dex_to_F(val, B, C, S);
  51. buf_f.D = f_buf.D;
  52. }
  53. std::string buf = "";
  54. for (int i = 0; i < D.size(); i++) {
  55. buf += D[i];
  56. }
  57. int n = std::stoi(buf);
  58. int number = 0, k = 1;
  59. while (n) {
  60. number += (B - 1 - n % B) * k;
  61. k *= 10;
  62. n /= 10;
  63. }
  64. std::string buf2 = std::to_string(number);
  65. std::vector<char> v(buf2.begin(), buf2.end());
  66. buf_f.D = v;
  67. return buf_f;
  68. }
  69.  
  70. }
  71.  
  72.  
  73. void to_base(int base) {
  74. std::vector <char> N;
  75. int val = dex();
  76. int dex = abs(val);
  77. while (dex != 0) {
  78. N.push_back(dex%base + '0');
  79. dex /= base;
  80. }
  81. std::reverse(N.begin(), N.end());
  82. D = N;
  83. B = base;
  84. }
  85.  
  86. int dex() {
  87. int count = 0, a = 0;
  88. std::string str = "";
  89. for (int i = 0; i < D.size(); i++) {
  90. str += (int)D[i];
  91. }
  92. int number = std::stoi(str);
  93. do {
  94. int mod = number % 10;
  95. a += pow(B, count)*mod;
  96. count++;
  97. number /= 10;
  98. }while(number);
  99. return (S == '-')?-a:a;
  100. }
  101.  
  102. F operator-() {
  103. char temp = (S == '-')?'+':'-';
  104. return F(B, C, temp, D);
  105. }
  106.  
  107. F operator+(F value) {
  108. int val = value.dex() + dex();
  109. char sign = (val > 0)?'+':'-';
  110. F f_buf = dex_to_F(abs(val), B, C, sign);
  111. return f_buf;
  112. }
  113.  
  114. F operator%(F value) {
  115. int val = value.dex() % dex();
  116. char sign = (val > 0)?'+':'-';
  117. F f_buf = dex_to_F(abs(val), B, C, sign);
  118. return f_buf;
  119. }
  120.  
  121. F operator*(F value) {
  122. int val = value.dex() * dex();
  123. char sign = (val > 0)?'+':'-';
  124. F f_buf = dex_to_F(abs(val), B, C, sign);
  125. return f_buf;
  126. }
  127. };
  128.  
  129. int main() {
  130. setlocale(LC_ALL, "Russian");
  131.  
  132. F temp1 = F(5, 'd', '-', {'3', '4', '0'});
  133. F temp2 = F(2, 'd', '-', {'1', '0', '0', '1', '0'});
  134. F temp3 = F(5, 'd', '+', {'3', '1'});
  135.  
  136. std::cout << "\nПрограмма курсовой работы F-число.\n";
  137.  
  138. std::cout << "\nЧисло A: " << temp1.to_s() << ", основание: " << temp1.get_base();
  139. std::cout << "\nЧисло B: " << temp2.to_s() << ", основание: " << temp2.get_base();
  140. std::cout << "\nЧисло C: " << temp3.to_s() << ", основание: " << temp3.get_base();
  141.  
  142. std::cout << "\n\nПримеры операций над числами:";
  143. std::cout << "\n\n- Приведение числа F к заданному коду:\n";
  144. F buf1 = temp1.to_code('r');
  145. F buf2 = temp2.to_code('r');
  146. std::cout << "Обратный код числа A: " << buf1.to_s();
  147. std::cout << "\nОбратный код числа B: " << buf2.to_s();
  148.  
  149. buf1 = temp1.to_code('a');
  150. buf2 = temp2.to_code('a');
  151. std::cout << "\nДополнительный код числа A: " << buf1.to_s();
  152. std::cout << "\nДополнительный код числа B: " << buf2.to_s();
  153.  
  154. std::cout << "\n\n- Преобразование числа F к заданной системе счисления:";
  155.  
  156. buf1.to_base(8);
  157. F buf3 = temp3;
  158. temp3.to_base(3);
  159. std::cout << "\nЧисло A: " << buf1.to_s() << ", основание: " << buf1.get_base();
  160. std::cout << "\nЧисло C: " << buf3.to_s() << ", основание: " << buf3.get_base();
  161.  
  162.  
  163. std::cout << "\n\n- Изменение знака числа:";
  164. std::cout << "\nЧисло B: " << (-temp2).to_s() << ", основание: " << temp2.get_base();
  165. std::cout << "\nЧисло C: " << (-temp3).to_s() << ", основание: " << temp3.get_base();
  166.  
  167. std::cout << "\n\n- Сложение двух заданных F чисел:";
  168. F buf4 = temp1 + temp3;
  169. F buf5 = temp1 + temp2;
  170. std::cout << "\nЧисло D = A + C: " << buf4.to_s() << ", основание: " << buf4.get_base();
  171. std::cout << "\nЧисло D = A + B: " << buf5.to_s() << ", основание: " << buf5.get_base();
  172.  
  173. std::cout << "\n\n- Получение остатка от деления двух F чисел:";
  174. F buf6 = temp1 % temp3;
  175. std::cout << "\nЧисло D = A % C: " << buf6.to_s() << ", основание: " << buf6.get_base();
  176.  
  177.  
  178.  
  179.  
  180. char d[] = "0123456789ABCDEF";
  181. int n, m, r;
  182. std::string s;
  183. std::cout << "\n\nВведите систему счисления, для которой \nнужно посторить таблицу умножения: ";
  184. std::cin >> n;
  185.  
  186. for (int i = 1; i <= n; i++) {
  187. std::cout << "\n" << std::setw(5) <<i << " |";
  188. for (int j = 1; j <= n; j++) {
  189. char ch1 = i + '0';
  190. char ch2 = j + '0';
  191.  
  192. F f1 = F(n, 'd', '+', {ch1});
  193. F f2 = F(n, 'd', '+', {ch2});
  194. F res = f1*f2;
  195. std::cout << std::setw(5) << res.to_s();
  196. }
  197. }
  198. return 0;
  199. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement