Исходник программы - класс для работы с Неупакованными BCD числами в Си(C++)


Добавил:DMT
Дата создания:29 апреля 2008, 15:55
Дата обновления:29 апреля 2008, 15:55
Просмотров:5422 последний 23 апреля, 0:45
Комментариев: 0
Исходник программы - класс для работы с Неупакованными BCD числами в Си(C++) Рассмотрим программу с использованием некоторых рассмотренных классов ввода/вывода в сочетании с собственным классом LongBCD, который состоит из последовательности цифр. Элементы-члены в свою очередь являются закрытыми данными класса.
Операция сложения чисел складывает и вычитает цифры, начиная с младших разрядов.
Числа выводятся с помощью стандартных функций
Код на C++
  1. #include <iostream.h>
  2. #include <stdio.h>
  3. #include <conio.h>
  4. #include <alloc.h>
  5.  
  6. //Числа хранятся в формате "младший разряд первым",
  7. //Поддержка отрицательных чисел отсутствует
  8.  
  9. //Минимальный размер выделяемой памяти под хранение BCD числа
  10. #define MINBCDSIZE 4
  11.  
  12. // Класс BCD-числа
  13. class LongBCD
  14. {
  15. private:
  16. char * data; // BCD-число
  17. int size; // Его размер
  18.  
  19. // Функция увеличения области данных с их сохранением
  20. void extend(int newsize)
  21. {
  22. char *nd = new char [newsize];
  23. memset(nd, '0', newsize);
  24. memcpy(nd, data, size);
  25. size = newsize;
  26. delete data;
  27. data = nd;
  28. }
  29.  
  30. // Установка значения i-го разряда области данных BCD-числа
  31. void set(int i, char dig)
  32. {
  33. if (i >= size)
  34. extend(i + 1);
  35. data[i] = dig;
  36. }
  37.  
  38. // Обнуление области данных BCD-числа, начиная с i-го разряда
  39. void zero(int i);
  40. // Установка значения BCD-числа на основании другого BCD-числа
  41. void setvalue(LongBCD & n);
  42. // Суммирование (+=)
  43. void add(LongBCD & n);
  44. // Вычитание (-=)
  45. void sub(LongBCD & n);
  46.  
  47. public:
  48. // Конструкторы
  49. LongBCD();
  50. LongBCD(long n);
  51. // Деструктор
  52. ~LongBCD() {if (data) free(data);}
  53.  
  54. // Установка значения BCD-числа на основании long
  55. void setvalue(long n);
  56.  
  57. // Перегрузка оператора присваивания
  58. LongBCD & operator = (long n) {setvalue(n); return *this;}
  59. LongBCD & operator = (LongBCD & n) {setvalue(n); return *this;}
  60.  
  61. // Перегрузка операций + и -
  62. friend LongBCD operator + (LongBCD &, LongBCD &);
  63. friend LongBCD operator - (LongBCD &, LongBCD &);
  64.  
  65. // Функция вывода BCD-числа на экран
  66. void show(void);
  67. };
  68.  
  69. // Суммирование (+=)
  70. void LongBCD::add(LongBCD & n)
  71. {
  72. int maxl = n.size;
  73. int i, carry = 0;
  74.  
  75. // Проверка наличия достаточного количества памяти
  76. if (maxl >= size) extend(maxl + 1);
  77.  
  78. // Цикл по всем разрядам, начиная с младшего
  79. for (i = 0; i < maxl; i++)
  80. {
  81. int res = (data[i] - '0') + (n.data[i] - '0') + carry;
  82.  
  83. // Учет переноса
  84. if (res > 9)
  85. {
  86. res -= 10;
  87. carry = 1;
  88. }
  89. else carry = 0;
  90.  
  91. set(i, '0' + res);
  92. }
  93.  
  94. if (carry) set(maxl, '1');
  95. }
  96.  
  97. // Вычитание (-=)
  98. void LongBCD::sub(LongBCD & n)
  99. {
  100. int maxl = n.size;
  101. int i, carry = 0;
  102.  
  103. // Проверка наличия достаточного количества памяти
  104. if (maxl >= size) extend(maxl + 1);
  105.  
  106. // Цикл по всем разрядам, начиная с младшего
  107. for (i = 0; i < maxl; i++)
  108. {
  109. int res = (data[i] - '0') - (n.data[i] - '0') - carry;
  110.  
  111. // Учет заема
  112. if (res < 0)
  113. {
  114. res += 10;
  115. carry = 1;
  116. }
  117. else carry = 0;
  118.  
  119. set(i, '0' + res);
  120. }
  121. }
  122.  
  123. // Обнуление области данных BCD-числа, начиная с i-го разряда
  124. void LongBCD::zero(int i)
  125. {
  126. while(i < size) data[i++] = '0';
  127. }
  128.  
  129. // Установка значения BCD-числа на основании long
  130. void LongBCD::setvalue(long n)
  131. {
  132. int i = 0;
  133.  
  134. while (n != 0)
  135. {
  136. set(i, '0' + (n % 10));
  137. n /= 10;
  138. i++;
  139. }
  140.  
  141. zero(i);
  142. }
  143.  
  144. // Установка значения BCD-числа на основании другого BCD-числа
  145. void LongBCD::setvalue(LongBCD & n)
  146. {
  147. int i;
  148. for (i = 0; i < n.size; i++) set(i, n.data[i]);
  149. zero(i);
  150. }
  151.  
  152. // Функция вывода BCD-числа на экран
  153. void LongBCD::show(void)
  154. {
  155. int i = size;
  156. while((i != 0) && (data[i-1] == '0')) i--;
  157.  
  158. if (i == 0)
  159. putchar('0');
  160. else
  161. while (i != 0) {
  162. i--;
  163. putchar(data[i]);
  164. }
  165.  
  166. puts("");
  167. }
  168.  
  169. // Конструктор создает число со значеним 0
  170. LongBCD::LongBCD()
  171. {
  172. data = new char[MINBCDSIZE];
  173. size = MINBCDSIZE;
  174. zero(0);
  175. }
  176.  
  177. // Конструктор создает число со значеним, определяемым переменной
  178. LongBCD::LongBCD(long n)
  179. {
  180. data = new char[MINBCDSIZE];
  181. size = MINBCDSIZE;
  182. setvalue(n);
  183. }
  184.  
  185. // Перегрузка операции +
  186. LongBCD operator + (LongBCD & a, LongBCD & b)
  187. {
  188. LongBCD * temp = new LongBCD;
  189. *temp = a;
  190. temp->add(b);
  191. return * temp;
  192. }
  193.  
  194. // Перегрузка операции -
  195. LongBCD operator - (LongBCD & a, LongBCD & b)
  196. {
  197. LongBCD * temp = new LongBCD;
  198. *temp = a;
  199. temp->sub(b);
  200. return * temp;
  201. }
  202.  
  203. void main(void)
  204. {
  205. clrscr();
  206. LongBCD A, B, C;
  207.  
  208. long temp;
  209. cout << "Введите BCD-число A: ";
  210. cin >> temp;
  211. A.setvalue(temp);
  212.  
  213. cout << "Введите BCD-число B: ";
  214. cin >> temp;
  215. B.setvalue(temp);
  216.  
  217. cout << "\nA = "; A.show();
  218. cout << "\nB = "; B.show();
  219. cout << "\nA+B = "; C=A+B; C.show();
  220. cout << "\nA-B = "; C=A-B; C.show();
  221.  
  222. getch();
  223. }
При использовании обязательна ссылка на http://DMTSoft.ru
Результаты работы программы

Введите BCD-число A: 12345
Введите BCD-число B: 324
A = 12345
B = 324
A+B = 12669
A-B = 12021
up