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

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

Восстановить пароль Регистрация
 
TheVlad
5 / 5 / 1
Регистрация: 24.10.2012
Сообщений: 102
12.01.2013, 16:31     Создать множество , используя битовые маски. (Дописать код) #1
нужно дописать код чтобы все значения переменной "о" добавить в множество( например множество А, используя битовые маски. И найти дополнение до этого множества...

немного теории....(в спойлере)
Кликните здесь для просмотра всего текста
Для представления множества, которая может содержать до 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");
 
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.01.2013, 16:31     Создать множество , используя битовые маски. (Дописать код)
Посмотрите здесь:

C++ Дописать код
C++ Дописать код программы
Выдать побитовое представление используя union и битовые поля. C++
C++ Дописать код
C++ Изменить знак числа типа int на противоположный, используя битовые операции.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
TheVlad
5 / 5 / 1
Регистрация: 24.10.2012
Сообщений: 102
14.01.2013, 16:05  [ТС]     Создать множество , используя битовые маски. (Дописать код) #2
ап, очень надо доделать эту прогу, пожалуйста кто разбирается в этом, помогите =)

Добавлено через 17 часов 29 минут
помогите кто ни будь пожалуйста....
TheVlad
5 / 5 / 1
Регистрация: 24.10.2012
Сообщений: 102
15.01.2013, 18:32  [ТС]     Создать множество , используя битовые маски. (Дописать код) #3
ап...
TheVlad
5 / 5 / 1
Регистрация: 24.10.2012
Сообщений: 102
18.01.2013, 19:47  [ТС]     Создать множество , используя битовые маски. (Дописать код) #4
плиз, прошу о помощи последний раз, вопрос жизни и смерти
Yandex
Объявления
18.01.2013, 19:47     Создать множество , используя битовые маски. (Дописать код)
Ответ Создать тему
Опции темы

Текущее время: 04:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru