Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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;
- };
Advertisement
Add Comment
Please, Sign In to add comment