Форум программистов, компьютерный форум CyberForum.ru

Создать множество , используя битовые маски. (Дописать код) - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Строки. Вывести на печать то слово этой строки, которое по алфавиту предшествует всем другим http://www.cyberforum.ru/cpp-beginners/thread759633.html
Дана строка из 20 различных слов (словом считается любой набор букв, за которым следует пробел). Вывести на печать то слово этой строки, которое по алфавиту предшествует всем другим.
C++ мультиоператор - вохможно ли? struct SAI_BuMa { int number_BuMa; int counter_BuMa; }; struct SAI_ReBuMa { int level_ReBuMa; int counter_ReBuMa; }; http://www.cyberforum.ru/cpp-beginners/thread759615.html
Задачник по языку С++ C++
Дайте пожалуйста какой-то задачник по С++. Желательно не Дейтела, так как он у меня есть. Заранее спасибо.
C++ min, max двумерного масива
Дано матрицу Т размером 6х7. Найти максимальный и минимальный элементы каждого столбца матрицы Т. У меня есть некоторая часть роботы, помогите со второй частью задания. #include <conio.h> #include <stdlib.h> #include <iomanip.h> void main() { clrscr; int t;
C++ Определение наличия одинаковых элементов масива http://www.cyberforum.ru/cpp-beginners/thread759566.html
Здравствуйте, помогите определить есть ли в данном масиве одинаковые элементы. #include <iostream> #include <ctime> using namespace std; int main() { int* Arr; Arr = new int;
C++ Переворот масива Здравствуйте. Помагите пожалучто, у меня как то криво масив переворачиваетса... #include <iostream> #include <ctime> using namespace std; int main() { int* Arr; Arr = new int; подробнее

Показать сообщение отдельно
TheVlad
5 / 5 / 1
Регистрация: 24.10.2012
Сообщений: 102

Создать множество , используя битовые маски. (Дописать код) - C++

12.01.2013, 16:31. Просмотров 988. Ответов 3
Метки (Все метки)

нужно дописать код чтобы все значения переменной "о" добавить в множество( например множество А, используя битовые маски. И найти дополнение до этого множества...

немного теории....(в спойлере)
Кликните здесь для просмотра всего текста
Для представления множества, которая может содержать до 32 различных элементов от 0 до 31, можно использовать целое число стандартного 32-разрядного целого типа данных. Можно использовать 64-разрядный тип, тогда допустимое количество элементов возрастает до 64 (от 0 до 63, соответственно). В том числе, если и-тый бит равен 1, то и-тый элемент содержится в множестве, если же и-тый бит равен 0, то и-тый элемент в множестве отсутствует. Целое число, каким представляется множество, называют битовой маской
Стандартные операции над множествами и выражения, соответствующие им при работе с масками.
 Объединение множеств: A | B
 Пересечение множеств: A & B
 Разница множеств: A & ~ B
 Дополнение множества: ALL_BITS ^ A (здесь ALL_BITS - маска, в которой все биты, соответствующие элементам домена установлены в 1)
 Добавление и-того элемента в множество (установление и-го бита): A | = 1 << i
 Удаление и-того элемента: A & = ~ (1 << i)
 Проверка, и-тый элемент принадлежит множеству (A & (1 << и))! = 0
Пусть требуется представить числом множество, разница между максимальным и минимальным элементами которой составляет не более 32 (или 64). Тогда, вообще говоря, каждый элемент множества можно представить как сумму некоторого "опорного" элемента и "смещения", причем все "смещения" представляем числом как отдельную множество, а "опорный" элемент - отдельным числом. Например, множество {41,56,67} можно представить как сумму {41 +0,41 +14,41 +26}, причем множество "смещений" ({0,14,26}) можно представить как 32-разрядное число, а "опорное" числе 41 представить как отдельное число типа char. Очевидно, что такой подход можно развить и представлять множество целых чисел различными подмножествами, каждую из подмножеств сохраняя как число.
Пример кода для добавления и удаления элементов множества чисел от 0 до 31.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# Include <iostream>
# Include <conio.h>
using namespace std;
int main () {
/ * Число А, собственно, и представлять множество * /
long int A = 0;
char action; / * эта переменная сохранять желаемое действие, которое необходимо выполнить над множеством * /
int item;
cout << "size of int:" << sizeof (A) << endl; / * проверяем размер числа А в байтах * /
char goon = 'y'; / * переменная, служит признаком продолжения работы с множеством * /
while (goon == 'y') {
cout << "Enter new item, please \ t";
cin >> item;
cout << "Add? (a) Delete? (d) \ t";
/ * Пользователь должен нажать клавишу a или d; ответ будет записана в переменную action * /
cin >> action;
switch (action) {
case 'a': if (item <= 8 * sizeof (A)) A | = 1 << (item-1);
/ * Если заданное пользователем число превышает индекс старшего разряда маски, об этом выводим соответствующее сообщение * /
else cout << "Item cannot be included in the set A" << endl; break;
case 'd': if (item <= 8 * sizeof (A)) A & = ~ (1 << (item-1));
else cout << "Item was not in the set A"; break;
default: break;
}
/ / Выводим все элементы множества на экран
cout << "Current set: \ t";
for (int i = 1; i <= 8 * sizeof (A); i + +) / * умножая количество байт на 8, получаем количество бит, которыми представляется число А, то есть, число элементов в множестве * /
{/ * Сдвигаем 1 на 0, 1, 2, (8 * sizeof (A) -1) бит влево, получая при этом числа, в которых бит с индексом (и-1) установлен в 1, а остальные битов - в 0 . Если в множестве А присутствует элемент с индексом (и-1), то результат побитового "И" будет ненулевым, и в этом случае элемент с индексом (и-1) выводим на экран * /
if ((A & (1 << (i-1)))! = 0) cout << i << ",";
}
cout << endl;
cout << "Are we handling our set? y | n \ t";
/ * Если пользователь нажмет клавишу y, обработки множества продолжится, если клавишу n - прекратится * /
cin >> goon;
}
_getch ();
return 0;
}



C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
#include <stdlib.h>
#include <math.h>
#include <time.h>
#include <iostream>
#include <iomanip>
#include <conio.h>
 
using namespace std;
 
double rndup(double n)// ОКРУГЛЕННЯ ЧИСЛА З ПЛАВАЮЧОЮ КРАПКОЮ І ВИВІД ОДНОГО ЗНАКА ПІСЛЯ КОМИ
{
      double t;
      t=n-floor(n);
      if (t>=0.5)    
      {
              n*=10;// double n
              ceil(n);
              n/=10;
              }
      else 
      {
              n*=10;// double n
              floor(n);
              n/=10;
              }
      return n;
}     
int main()
{
    srand(time(NULL));
    setlocale(LC_ALL, "ukr");
    //рядки = стовпці = z
    int const z=5;
 
    int a[z][z];
 
    for(int i=0;i<z;i++)
    for(int j=0;j<z;j++)
 
       //  a[i][j]=rand()%20-6;
    
       { 
          cout<<"введiть "<<(j+1)<<" елемент "<<(i+1)<<" рядка"<<endl;
          cin>>a[i][j];
         } 
 
// ВИВІД МАТРИЦІ
 
    cout<<endl<<"Введена матриця : ";
    cout<<endl<<endl;
 
    for(int i=0;i<z;i++)
    {
        for(int j=0;j<z;j++) 
            cout<<setw(4)<<a[i][j]<<"  ";
        cout<<endl;
    }
    cout<<endl;
 
    // ПРИВЕДЕННЯ ДО СХІДЧАСТОГО ВИГЛЯДУ
 
    int count = 0;
    int til = 0;
double w[5];
bool key = true;
double i2j = 0;
double mulxmj = 0;
//double mj = 0;
 
til = z;
for (int m = 0; m < til-1; m++)
{
    if (a[m][m] == 0)
    {
        key = false;
        for (unsigned i1 = m+1; i1<z; i1++)
        {
            if (a[i1][m] != 0)
            
                break;
            
        }
    }
    if (!key)
    break; 
    
    for (unsigned i2 = m+1; i2<z; i2++)
    {
        double multi = 1.0*a[i2][m] / a[m][m];
        if(multi!=0)
        for (unsigned j = 0; j<z; j++)
        {
            i2j = a[i2][j];
            i2j = rndup(i2j);
//          mj = cmatrix[m][j];
 
            mulxmj = (multi * a[m][j]);
            mulxmj = rndup(mulxmj);
            a[i2][j] = i2j - mulxmj;
        }
    }
}
 
//* Підрахунок рангу
 
int rang = 0;
key = true;
 
for (unsigned i=0; i<z; i++)
{
    key = false;
    for (unsigned j=0; j<z; j++)
        if (a[i][j] != 0.0)
            key = true;
        if (!key)
            count++;
}
//*/
// ВИВЕДЕННЯ СХІДЧАСТОЇ МАТРИЦІ 
 
cout <<"Приведена до схiдчастого вигяду матриця:";
    cout <<"\n"<<endl;
    
    for(int i=0;i<z;i++)
    {
        for(int j=0;j<z;j++)
        {
            cout<<setw(4)<< a[i][j]<<"  ";
        }
    cout <<"\n";
    }
cout <<"\n";
 
//  СЕРЕДНЄ ЗНАЧЕННЯ ПО СТОВПЦЯХ
 
 
for(int j=0;j<5;j++) {
    int sum=0;
    
        for(int j=0;j<5;j++)
        {
            sum=0;
            for(int i=0;i<5;i++)
            sum+=a[i][j];
 
        w[j]=sum/5.0;
        
}
}
cout<<" Середнi значення по стовпцях : " << endl; 
 double f;
 int o;
 
for(int i=0;i<5;i++) {
    f=w[i];
    if (f>0)
        o=f+0.5;
    else
        o=f-0.5;
    
    cout<<endl<<i+1<<" стовпець: "<<setiosflags(ios::fixed)<<setprecision(1)<<setw(4)<<o<<"  ";
}
 
cout<<endl;
 
 
// ВИВЕДЕННЯ РАНГУ
    
rang = z - count;
 
cout <<endl<<"Ранг = "<< rang << "\n";
cout <<"\n";
 
//*
 
system("pause");
 
}
    
rang = u - count;
 
cout <<endl<<"Ранг = "<< rang << "\n";
cout <<"\n";
 
//*
 
system("pause");
 
}
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru