BitArray2::BitArray2() //сделал { bit = NULL; unsigned int* bit = new unsigned int[1](); if (bit == NULL) { printf("Ошибка:не выделилась память под массив!"); exit(-2); } N = 31; printf("N=%d", N); printfBitarray(bit); } BitArray2::BitArray2(int N) //сделал { bit = NULL; this->N = N-1; int f = N / 32; // unsigned int* bit = new unsigned int[f + 1](); if (bit == NULL) { printf("Ошибка:не выделилась память под массив!"); exit(-2); } this->N = N; printf("N=%d\n", N); printf("N=%d\n", bit[0]); printf("N=%d\n", bit[1]); printfBitarray(bit); } void BitArray2::setspanBit(int el1, int el2)//вроде сделал,добавил ограничения слева { // установку всех элементов в заданное значение int t = 0,f=0, c = 0; printf("1) N=%d\n", N); if (el1 < 0 || el1 > N) { printf("Вы вышли за предел массива1\n");//(!(N > 0 && N <= el1 - 1)) return; } printf("2) N=%d\n", N); if (el2 < 0 || el2 > N) { printf("Вы вышли за предел массива2\n"); return; } if (el1 > el2) { t = el2; el2 = el1; el2 = t; } printf("Введите 1 либо 0\n"); while (1) //защита от дурака { if ((scanf_s("%d", &c) == 1) && (c == 0 || c == 1)) { if (getchar() == '\n') break; } while (getchar() != '\n'); printf("Ошибка:введите 1 либо 0.\n"); } int tmpel = 0;; if (c == 1) { //вставили единицу for (int i = el1;i <= el2;i++) { tmpel = i; f= i / 32; while (tmpel > 31) { tmpel = N - f * 32; } t = pow(2, tmpel); bit[f] = bit[f] | t; printf("i=%d\n", i); }; } else { for (int i = el1;i <= el2;i++) { tmpel = i; f = i / 32; while (tmpel > 31) { tmpel = N - f * 32; } t = pow(2, i); bit[f] = bit[f] & (~t); printf("i=%d\n", i); }; } // printf("Массив %d ", bit); // printfBitarray(bit, N); } void BitArray2::setBit(int el) {// вроде сделал { //установки значения одного элемента массива (бита) по номеру int t = 0; int c = 0; int f = 0; if (el < 0 || el > N) {// -1 так надо для массива printf("3) N=%d\n", N); printf("Вы вышли за границу массива3.Выберите снова номер элемента "); while (1) //защита от дурака { if ((scanf_s("%d", &el) == 1) && (el >= 0 && el < N)) { if (getchar() == '\n') break; } while (getchar() != '\n'); printf("Ошибка:введите число.\n"); } }; printf("Введите 1 либо 0\n"); while (1) //защита от дурака { if ((scanf_s("%d", &c) == 1) && (c == 0 || c == 1)) { if (getchar() == '\n') break; } while (getchar() != '\n'); printf("Ошибка:введите 1 либо 0.\n"); } f = el / 32; while (el > 31) { el = el - f * 32; } t = pow(2, el);//доработать el if (c == 1) { //вставили единицу bit[f] = bit[f] | t; } else { bit[f] = bit[f] & (~t); } printfBitarray(bit); } } char BitArray2::getBit(int el) { //вроде сделал int t = 0; char c = 0; int f = 0; if (el < 0 || el > N) {// -1 так надо для массива printf("Вы вышли за границу массива4.Выберите снова номер элемента "); while (1) //защита от дурака { if ((scanf_s("%d", &el) == 1) && (el >= 0 && el < N)) { if (getchar() == '\n') break; } while (getchar() != '\n'); printf("Ошибка:введите число.\n"); } }; f = el / 32; while (el > 31) { el = el - f * 32; } t = pow(2, el); if ((bit[f] & t) != 0) c = 1; printfBitarray(bit); return c;//исправить } void BitArray2::PUSHBACK() {//увеличиваем массив с конца unsigned int * tmp = NULL; int f = 0; f = N / 32; if (((N + 1) / 32 )> f) { //tmp = (unsigned int*)malloc((f+1) * sizeof(unsigned int)); tmp = new unsigned int[f+1](); if (tmp == NULL) { printf("Ошибка: память не выделена под число "); exit; } int i; for ( i = 0;i < f;i = i + 1) { tmp[i] = bit[i]; } tmp[i] = 0; delete[] bit;//можетбыть неправильно bit = tmp; /*1. Создать новый массив нужного размера. 2. Скопировать в него все, что нужно из старого. 3. Удалить старый. 4. Указателю на старый присвоить адрес нового.(*/ } N = N + 1; printf("N=%d\n", N); printfBitarray(bit); };// добавление нового элемента в конец массива (если размер массива не превышает 32) void BitArray2::POPBACK() { //уменьшаем массив с конца unsigned int* tmp = NULL; int f = 0; //продумать динамический массив int t = N; f = N / 32; while (t > 31) { t = t - f * 32; } t = pow(2, N ); bit[f] = bit[f] & (~t);//подумать if (((N-1) / 32) < f) { tmp = new unsigned int[f -1](); //tmp = (unsigned int*)malloc((f-1) * sizeof(unsigned int)); if (tmp == NULL) { printf("Ошибка: память не выделена под число "); exit; } int i; for (i = 0;i < f;i = i + 1) { tmp[i] = bit[i]; } delete[] bit;//можетбыть неправильно bit = tmp; /*1. Создать новый массив нужного размера. 2. Скопировать в него все, что нужно из старого. 3. Удалить старый. 4. Указателю на старый присвоить адрес нового.(*/ } N = N - 1; printf("N=%d\n", N); printfBitarray(bit); }; void BitArray2::PUSHFRONT() { unsigned int* tmp = NULL; int f = 0; int c = 0; int t = 0; int v = 0; f = (N+1) / 32; int c1 = 0; //t = pow(2, N); if (((N + 1) / 32) > f) //если выходит за рамки инта ,то создается новый массив { tmp = new unsigned int[f + 1](); //tmp = (unsigned int*)malloc((f+1) * sizeof(unsigned int)); if (tmp == NULL) { printf("Ошибка: память не выделена под число "); exit; } int i; for (i = 0;i < f;i = i + 1) { tmp[i] = bit[i]; } tmp[i] = 0; delete[] bit;\ bit = tmp; } //v = N + 1; t = pow(2, 31); if ((bit[0] & t) != 0) c1 = 1; else c1=0; bit[0] = bit[0] << 1; N = N + 1; for(int i = 1;i <= f;i = i + 1){ if (i == f) v = N - c * 32;//может 32 .мы в начале иниц. делаем n-1; else v = 31; t = pow(2, v); if ((bit[f] & t) != 0) //это набудщее c = 1; else c = 0; bit[f] = bit[f] << 1; if (c1!=0) bit[f] = bit[f]|1; c1 = c; } }; void BitArray2::POPFRONT() {// удалить начальный элмент unsigned int* tmp = NULL; int f = 0; int c = 0;//продумать динамический массив int t = 0; int v = 0; f = (N) / 32; int c1 = 0; int i = 0; t = pow(2, 0); N = N - 1; if ((bit[f] & t) != 0) c1 = 1; else c1 = 0; bit[f] = bit[f] >> 1; for (i = f-1;i >= 0;i = i + 1) { t = pow(2, 0);//проверка на символ if ((bit[i] & t) != 0) //проверяем что в начале переменной c = 1; else c = 0; bit[i] = bit[i] >> 1; if (c1 != 0) t = pow(2, 31); bit[f] = bit[f] | t;//вставляем в конец перменной c1 = c; } if ((N / 32) < f) //после удаления надо сделать { tmp = new unsigned int[f - 1](); //tmp = (unsigned int*)malloc((f-1) * sizeof(unsigned int));//ПЕРЕПИСАТЬ if (tmp == NULL) { printf("Ошибка: память не выделена под число "); exit; } int i; for (i = 0;i < f;i = i + 1) { tmp[i] = bit[i]; } delete[] bit;//можетбыть неправильно bit = tmp; } }; BitArray2::~BitArray2() //сделал { printf("Деструктор"); delete[] bit;//можетбыть неправильно } void BitArray2::printfBitarray(unsigned int* bit) { int size = N; int f = (N + 1) / 32; char* n = new char[1](); char* s = new char [size + 1](); // для int хватит подправить int i; int v = 0; printf("N=%d\n", bit[0]); printf("N=%d\n", bit[1]); for (i = 0;i <= f;i = i + 1) { n[0] = bit[i]; for (i = 0; n >= 0; i++) { s[i] = n[0] % 2; n[0] = n[0] / 2; } if (i == f) v = size - i * 32;//может 32 .мы в начале иниц. делаем n-1; else v = 31; for (int g = i;g <= v;g++) { printf("0"); } for (i--; i >= 0; i--) printf("%d", s[i]); } printf("\n"); delete[] s; delete[] n; };