special_forces

Untitled

Apr 26th, 2021
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.21 KB | None | 0 0
  1. BitArray2::BitArray2() //сделал
  2. {
  3. bit = NULL;
  4.  
  5. unsigned int* bit = new unsigned int[1]();
  6. if (bit == NULL) {
  7. printf("Ошибка:не выделилась память под массив!");
  8. exit(-2);
  9. }
  10. N = 31;
  11.  
  12. printf("N=%d", N);
  13. printfBitarray(bit);
  14. }
  15. BitArray2::BitArray2(int N) //сделал
  16. {
  17. bit = NULL;
  18. this->N = N-1;
  19. int f = N / 32; //
  20. unsigned int* bit = new unsigned int[f + 1]();
  21. if (bit == NULL) {
  22. printf("Ошибка:не выделилась память под массив!");
  23. exit(-2);
  24. }
  25.  
  26. this->N = N;
  27.  
  28. printf("N=%d\n", N);
  29. printf("N=%d\n", bit[0]);
  30. printf("N=%d\n", bit[1]);
  31. printfBitarray(bit);
  32. }
  33.  
  34. void BitArray2::setspanBit(int el1, int el2)//вроде сделал,добавил ограничения слева
  35. { // установку всех элементов в заданное значение
  36. int t = 0,f=0, c = 0;
  37. printf("1) N=%d\n", N);
  38. if (el1 < 0 || el1 > N) {
  39. printf("Вы вышли за предел массива1\n");//(!(N > 0 && N <= el1 - 1))
  40. return;
  41. }
  42. printf("2) N=%d\n", N);
  43. if (el2 < 0 || el2 > N) {
  44. printf("Вы вышли за предел массива2\n");
  45. return;
  46. }
  47. if (el1 > el2) {
  48. t = el2;
  49. el2 = el1;
  50. el2 = t;
  51. }
  52. printf("Введите 1 либо 0\n");
  53. while (1) //защита от дурака
  54. {
  55. if ((scanf_s("%d", &c) == 1) && (c == 0 || c == 1))
  56. {
  57. if (getchar() == '\n')
  58. break;
  59. }
  60. while (getchar() != '\n');
  61. printf("Ошибка:введите 1 либо 0.\n");
  62. }
  63. int tmpel = 0;;
  64. if (c == 1) { //вставили единицу
  65. for (int i = el1;i <= el2;i++) {
  66. tmpel = i;
  67. f= i / 32;
  68. while (tmpel > 31) {
  69. tmpel = N - f * 32;
  70. }
  71. t = pow(2, tmpel);
  72. bit[f] = bit[f] | t;
  73. printf("i=%d\n", i);
  74. };
  75. }
  76. else
  77. {
  78. for (int i = el1;i <= el2;i++) {
  79. tmpel = i;
  80. f = i / 32;
  81. while (tmpel > 31) {
  82. tmpel = N - f * 32;
  83. }
  84. t = pow(2, i);
  85. bit[f] = bit[f] & (~t);
  86. printf("i=%d\n", i);
  87. };
  88. }
  89. // printf("Массив %d ", bit);
  90. // printfBitarray(bit, N);
  91. }
  92. void BitArray2::setBit(int el) {// вроде сделал
  93. { //установки значения одного элемента массива (бита) по номеру
  94. int t = 0;
  95. int c = 0;
  96. int f = 0;
  97. if (el < 0 || el > N)
  98. {// -1 так надо для массива
  99. printf("3) N=%d\n", N);
  100. printf("Вы вышли за границу массива3.Выберите снова номер элемента ");
  101. while (1) //защита от дурака
  102. {
  103. if ((scanf_s("%d", &el) == 1) && (el >= 0 && el < N))
  104. {
  105. if (getchar() == '\n')
  106. break;
  107. }
  108. while (getchar() != '\n');
  109. printf("Ошибка:введите число.\n");
  110. }
  111. };
  112. printf("Введите 1 либо 0\n");
  113. while (1) //защита от дурака
  114. {
  115. if ((scanf_s("%d", &c) == 1) && (c == 0 || c == 1))
  116. {
  117. if (getchar() == '\n')
  118. break;
  119. }
  120. while (getchar() != '\n');
  121. printf("Ошибка:введите 1 либо 0.\n");
  122. }
  123. f = el / 32;
  124. while (el > 31) {
  125. el = el - f * 32;
  126. }
  127. t = pow(2, el);//доработать el
  128.  
  129. if (c == 1) { //вставили единицу
  130.  
  131. bit[f] = bit[f] | t;
  132. }
  133. else
  134. {
  135. bit[f] = bit[f] & (~t);
  136. }
  137. printfBitarray(bit);
  138. }
  139. }
  140. char BitArray2::getBit(int el) { //вроде сделал
  141. int t = 0;
  142. char c = 0;
  143. int f = 0;
  144. if (el < 0 || el > N)
  145. {// -1 так надо для массива
  146. printf("Вы вышли за границу массива4.Выберите снова номер элемента ");
  147. while (1) //защита от дурака
  148. {
  149. if ((scanf_s("%d", &el) == 1) && (el >= 0 && el < N))
  150. {
  151. if (getchar() == '\n')
  152. break;
  153. }
  154. while (getchar() != '\n');
  155. printf("Ошибка:введите число.\n");
  156. }
  157. };
  158.  
  159.  
  160. f = el / 32;
  161. while (el > 31) {
  162. el = el - f * 32;
  163. }
  164. t = pow(2, el);
  165. if ((bit[f] & t) != 0)
  166. c = 1;
  167. printfBitarray(bit);
  168. return c;//исправить
  169. }
  170. void BitArray2::PUSHBACK() {//увеличиваем массив с конца
  171. unsigned int * tmp = NULL;
  172. int f = 0;
  173. f = N / 32;
  174. if (((N + 1) / 32 )> f)
  175. {
  176.  
  177. //tmp = (unsigned int*)malloc((f+1) * sizeof(unsigned int));
  178. tmp = new unsigned int[f+1]();
  179. if (tmp == NULL) {
  180. printf("Ошибка: память не выделена под число ");
  181. exit;
  182. }
  183. int i;
  184. for ( i = 0;i < f;i = i + 1) {
  185. tmp[i] = bit[i];
  186. }
  187. tmp[i] = 0;
  188. delete[] bit;//можетбыть неправильно
  189. bit = tmp;
  190.  
  191. /*1. Создать новый массив нужного размера.
  192. 2. Скопировать в него все, что нужно из старого.
  193. 3. Удалить старый.
  194. 4. Указателю на старый присвоить адрес нового.(*/
  195. }
  196.  
  197. N = N + 1;
  198. printf("N=%d\n", N);
  199. printfBitarray(bit);
  200. };// добавление нового элемента в конец массива (если размер массива не превышает 32)
  201.  
  202. void BitArray2::POPBACK() { //уменьшаем массив с конца
  203. unsigned int* tmp = NULL;
  204. int f = 0;
  205. //продумать динамический массив
  206. int t = N;
  207. f = N / 32;
  208. while (t > 31) {
  209. t = t - f * 32;
  210. }
  211. t = pow(2, N );
  212. bit[f] = bit[f] & (~t);//подумать
  213. if (((N-1) / 32) < f)
  214. {
  215. tmp = new unsigned int[f -1]();
  216. //tmp = (unsigned int*)malloc((f-1) * sizeof(unsigned int));
  217. if (tmp == NULL) {
  218. printf("Ошибка: память не выделена под число ");
  219. exit;
  220. }
  221. int i;
  222. for (i = 0;i < f;i = i + 1) {
  223. tmp[i] = bit[i];
  224. }
  225. delete[] bit;//можетбыть неправильно
  226. bit = tmp;
  227. /*1. Создать новый массив нужного размера.
  228. 2. Скопировать в него все, что нужно из старого.
  229. 3. Удалить старый.
  230. 4. Указателю на старый присвоить адрес нового.(*/
  231. }
  232.  
  233. N = N - 1;
  234. printf("N=%d\n", N);
  235. printfBitarray(bit);
  236.  
  237. };
  238. void BitArray2::PUSHFRONT() {
  239. unsigned int* tmp = NULL;
  240. int f = 0;
  241. int c = 0;
  242. int t = 0;
  243. int v = 0;
  244. f = (N+1) / 32;
  245. int c1 = 0;
  246. //t = pow(2, N);
  247. if (((N + 1) / 32) > f) //если выходит за рамки инта ,то создается новый массив
  248. {
  249. tmp = new unsigned int[f + 1]();
  250. //tmp = (unsigned int*)malloc((f+1) * sizeof(unsigned int));
  251. if (tmp == NULL) {
  252. printf("Ошибка: память не выделена под число ");
  253. exit;
  254. }
  255. int i;
  256. for (i = 0;i < f;i = i + 1) {
  257. tmp[i] = bit[i];
  258. }
  259. tmp[i] = 0;
  260. delete[] bit;\
  261. bit = tmp;
  262. }
  263. //v = N + 1;
  264. t = pow(2, 31);
  265. if ((bit[0] & t) != 0)
  266. c1 = 1;
  267. else
  268. c1=0;
  269. bit[0] = bit[0] << 1;
  270. N = N + 1;
  271. for(int i = 1;i <= f;i = i + 1){
  272. if (i == f)
  273. v = N - c * 32;//может 32 .мы в начале иниц. делаем n-1;
  274. else
  275. v = 31;
  276. t = pow(2, v);
  277. if ((bit[f] & t) != 0) //это набудщее
  278. c = 1;
  279. else
  280. c = 0;
  281. bit[f] = bit[f] << 1;
  282. if (c1!=0)
  283. bit[f] = bit[f]|1;
  284. c1 = c;
  285. }
  286. };
  287. void BitArray2::POPFRONT() {// удалить начальный элмент
  288. unsigned int* tmp = NULL;
  289. int f = 0;
  290. int c = 0;//продумать динамический массив
  291. int t = 0;
  292. int v = 0;
  293. f = (N) / 32;
  294. int c1 = 0;
  295. int i = 0;
  296. t = pow(2, 0);
  297. N = N - 1;
  298. if ((bit[f] & t) != 0)
  299. c1 = 1;
  300. else
  301. c1 = 0;
  302. bit[f] = bit[f] >> 1;
  303.  
  304. for (i = f-1;i >= 0;i = i + 1) {
  305.  
  306. t = pow(2, 0);//проверка на символ
  307. if ((bit[i] & t) != 0) //проверяем что в начале переменной
  308. c = 1;
  309. else
  310. c = 0;
  311. bit[i] = bit[i] >> 1;
  312. if (c1 != 0)
  313. t = pow(2, 31);
  314. bit[f] = bit[f] | t;//вставляем в конец перменной
  315. c1 = c;
  316. }
  317. if ((N / 32) < f) //после удаления надо сделать
  318. {
  319. tmp = new unsigned int[f - 1]();
  320. //tmp = (unsigned int*)malloc((f-1) * sizeof(unsigned int));//ПЕРЕПИСАТЬ
  321. if (tmp == NULL) {
  322. printf("Ошибка: память не выделена под число ");
  323. exit;
  324. }
  325. int i;
  326. for (i = 0;i < f;i = i + 1) {
  327. tmp[i] = bit[i];
  328. }
  329. delete[] bit;//можетбыть неправильно
  330. bit = tmp;
  331. }
  332. };
  333. BitArray2::~BitArray2() //сделал
  334. {
  335. printf("Деструктор");
  336. delete[] bit;//можетбыть неправильно
  337. }
  338.  
  339. void BitArray2::printfBitarray(unsigned int* bit)
  340. {
  341. int size = N;
  342. int f = (N + 1) / 32;
  343.  
  344. char* n = new char[1]();
  345. char* s = new char [size + 1]();
  346. // для int хватит подправить
  347. int i;
  348. int v = 0;
  349. printf("N=%d\n", bit[0]);
  350. printf("N=%d\n", bit[1]);
  351. for (i = 0;i <= f;i = i + 1) {
  352. n[0] = bit[i];
  353. for (i = 0; n >= 0; i++) {
  354. s[i] = n[0] % 2;
  355. n[0] = n[0] / 2;
  356. }
  357. if (i == f)
  358. v = size - i * 32;//может 32 .мы в начале иниц. делаем n-1;
  359. else
  360. v = 31;
  361. for (int g = i;g <= v;g++) {
  362. printf("0");
  363. }
  364. for (i--; i >= 0; i--)
  365. printf("%d", s[i]);
  366. }
  367.  
  368. printf("\n");
  369. delete[] s;
  370. delete[] n;
  371.  
  372.  
  373. };
Advertisement
Add Comment
Please, Sign In to add comment