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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
TheVlad
5 / 5 / 1
Регистрация: 24.10.2012
Сообщений: 102
#1

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

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

Определить знак числа, используя битовые операции - C++
Помогите пожалуйста Определить знак числа, используя битовые операции

Выдать побитовое представление используя union и битовые поля. - C++
Написать функцию для вывода на экран битового представления в ЭВМ числа . Знаю вот такой способ, но он один, а надо двумя (используя...

Перевод из двоичной системы счисления в шестнадцатиричную, используя битовые операции - C++
Формулировка задачи: &quot;Разработать программу, которая переводит число из двоичной системы счисления (из внутреннего представления) в...

Изменить знак числа типа int на противоположный, используя битовые операции. - C++
помогите

Используя битовые операции, вывести на экран восьмиричное представление беззнакового короткогоцелого - C++
Знаю такая задача уже была на форуме в таком виде, но возможно ли её написать проще на уровне начинающего? #include &quot;stdafx.h&quot; #include...

Как представлять двоичные числа в обратном и дополнительном коде, используя битовые операции? - C++
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;algorithm&gt; using namespace std; int main() { int n; cout &lt;&lt; &quot;Enter...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
TheVlad
5 / 5 / 1
Регистрация: 24.10.2012
Сообщений: 102
14.01.2013, 16:05  [ТС] #2
ап, очень надо доделать эту прогу, пожалуйста кто разбирается в этом, помогите =)

Добавлено через 17 часов 29 минут
помогите кто ни будь пожалуйста....
0
TheVlad
5 / 5 / 1
Регистрация: 24.10.2012
Сообщений: 102
15.01.2013, 18:32  [ТС] #3
ап...
0
TheVlad
5 / 5 / 1
Регистрация: 24.10.2012
Сообщений: 102
18.01.2013, 19:47  [ТС] #4
плиз, прошу о помощи последний раз, вопрос жизни и смерти
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.01.2013, 19:47
Привет! Вот еще темы с ответами:

Создать меню для работы с программой заполнения массива, используя функции. код прилагается - C++
Реализовать программу меню: 1. Заполнить массив нулями 2. Заполнить массив с клавиатуры 3. Заполнить массив случайными числами ...

Битовые операции, битовые поля. - C++
Здравствуйте! Еслть 4 диапазона чисел: 0-100, 0-100, 0-6000, 0-3. Сделать в виде битовых операций. Записать в unsigned int. Использовать...

Дописать код - C++
Здравствуйте уважаемые. Помогите пожалуйста. Не могу понять как в данный код дописать еще три логина и три пароля. Вот условия по...

Дописать код - C++
Хочу, чтобы программа считала: это пока что сам сделал, добавьте пожалуйста 1 и 2 #include &lt;iostream.h&gt; #include &lt;stdlib.h&gt; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
18.01.2013, 19:47
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru