logo - universidade federal de itajubárcosta62br.unifei.edu.br/escola/eip_07.pdf · estrutura de...
TRANSCRIPT
Logo
2
Aula 07Aula 07
● Estruturas de dados
– Lista, Pilha, Fila– Pair, Map, Set e Bitset
3
Estrutura de DadosEstrutura de Dados
• Estrutura de dados já foi vista em vetores, que foi uma maneira de manipular várias informações (variáveis ou estruturas) de uma vez só, pois poderíamos declarar vários desses elementos.
• Quando isso era feito, esses dados estavam em uma sequência rigidamente definida na memória, bem como o número de elementos eram constantes. Esses dois detalhes, na verdade, possuem algumas limitações.
4
Estrutura de DadosEstrutura de Dados
• Viu-se anteriormente Alocação dinâmica de memória, onde deixamos de estar presos ao conceito de "número de elementos fixos", pois lá alocávamos e realocávamos o tanto de espaços de memória.
• Aplica-se os conceitos anterior nos tipos de estrutura de dados: Listas, Filas, Pilhas, Árvores e Grafo.
5
Estrutura de DadosEstrutura de Dados
• Listas, filas e pilhas são estrutura de dados lineares.
• Árvores e Grafo são estrutura de dados não lineares.
6
Listas EncadeadasListas Encadeadas
• Esqueça a programação. Use seu bom senso e responda:
o que é uma lista?o que é uma lista?
• Vamos supor que você fez uma lista de compras. Ou seja, tem um pedaço de papel com diversos elementos, em uma dada ordem. Provavelmente essa ordem é a que você vai comprar, do primeiro para o último. Geralmente elas tem uma sequência lógica, como elementos do mesmo setores estarem adjacentes.
7
Listas EncadeadasListas Encadeadas
• A analogia é parecida para uma lista em C/C++.
• Em programação, lista é uma série de elementos ligados. O primeiro é ligado no segundo, que é ligado no terceiro etc.
• Iremos aprender como colocar elementos, tirar, mudar de posição. Como elas estão ligadas, basta que tenhamos o endereço (ponteiro) para o primeiro elemento da lista.
• Ou seja, iremos estudar as chamadas listas encadeadas, que são itens 'alinhados' numa fila.
8
Listas EncadeadasListas Encadeadas
• A lista encadeada terá a seguinte estrutura:
struct REGISTRO {struct REGISTRO {
int data; int data;
struct REGISTRO *next;struct REGISTRO *next;
};};
9
Listas EncadeadasListas Encadeadas
• É conveniente tratar as células como um novo tipo-de-dados e atribuir um nome a esse novo tipo:
typedef struct REGISTRO celula;typedef struct REGISTRO celula;
• Uma célula c e um ponteiro p para uma célula podem ser declarados assim:
celula c, *p;celula c, *p;
• Se c é uma célula então c.data é o conteúdo da célula e c.next é o endereço da próxima célula. Se p é o endereço de uma célula, então p->data é o conteúdo da célula e p->next é o endereço da próxima célula. Se p é o endereço da última célula da lista então p->next vale NULL .
10
Listas EncadeadasListas Encadeadas
• A lista encadeadas precisam das funções:– Inicia
– Insere
– Remove
– Imprimi
– Libera
11
IniciaInicia
• A lista encadeada tem que ser inicializada sempre que for começar.
celula* inicia (void)celula* inicia (void){{
return NULL;return NULL;
}}
12
InsereInsere
• Considere o problema de inserir uma nova célula em uma lista encadeada. Suponha que quero inserir a nova célula entre a posição apontada por p e a posição seguinte. (É claro que isso só faz sentido se p é diferente de NULL).
celula* insere (int x, celula *p)celula* insere (int x, celula *p){{
celula *nova;celula *nova; nova = (celula *) malloc(sizeof(celula));nova = (celula *) malloc(sizeof(celula)); nova->data = x;nova->data = x; nova->next = p;nova->next = p; return nova;return nova;}}
13
RemoveRemove
• Considere o problema de remover uma certa célula de uma lista encadeada. Como especificar a célula em questão? A ideia mais óbvia é apontar para a célula que quer remover.
14
RemoveRemovecelula* remove (int y, celula *p)celula* remove (int y, celula *p){{
celula *a, *b;celula *a, *b;a = NULL;a = NULL;b = p;b = p;while (b != NULL && b->data != y) {while (b != NULL && b->data != y) {
a = b;a = b;b = b->next;b = b->next;
}}if (b == NULL) {if (b == NULL) {
return p;return p;}}if (a == NULL){if (a == NULL){
p = b->next;p = b->next;} else {} else {
a->next = b->next;a->next = b->next;}}free (b);free (b);return p;return p;
}}
15
ImprimiImprimi
• Para imprimir o conteúdo de uma lista encadeada, faça:
void imprima (celula *p)void imprima (celula *p){{
celula *I;celula *I;for (I = p; I != NULL; I = I->next)for (I = p; I != NULL; I = I->next){{
printf ("%d ", I->data);printf ("%d ", I->data);}}printf("\n");printf("\n");
}}
16
LiberaLibera
• Libera os valores da lista encadeadas.
void libera(celula *p) void libera(celula *p) {{
celula *lixo, *aux;celula *lixo, *aux;lixo = p;lixo = p;while(lixo != NULL)while(lixo != NULL){{
aux = lixo->next;aux = lixo->next;free(lixo);free(lixo);lixo = aux;lixo = aux;
}}}}
17
ExemploExemplo
• O professor tem uma lista de itens a colocar e retirar de uma lista, para isso ele vai colocar I e um número inteiro e colocar R e um número a ser retirado. E para mostrar os valores que tem na lista ele vai colocar M.
• Você tem como fazer um programa que resolva esse problema do professor.
18
ProgramaPrograma
#include <bits/stdc++.h>using namespace std;struct REGISTRO { int data; struct REGISTRO *next;};typedef struct REGISTRO celula;celula* inicia (void);celula* insere (int x, celula *p);void imprima (celula *p);celula* remove (int y, celula *p);void libera(celula *p);
19
ProgramaPrograma
celula* inicia (void){
return NULL;}celula* insere (int x, celula *p){
celula *nova; nova = (celula *) malloc(sizeof(celula)); nova->data = x; nova->next = p; return nova;}
20
ProgramaPrograma
void imprima (celula *p){
celula *I;for (I = p; I != NULL; I = I->next){
printf ("%d ", I->data);}printf("\n");
}celula* remove (int y, celula *p){
celula *a, *b;a = NULL;b = p;
21
ProgramaPrograma
while (b != NULL && b->data != y) {
a = b;b = b->next;
}if (b == NULL){
return p;}if (a == NULL){
p = b->next;} else {
a->next = b->next;}
22
ProgramaPrograma
free (b);return p;
}void libera(celula *p){
celula *lixo, *aux;lixo = p;while(lixo != NULL){
aux = lixo->next;free(lixo);lixo = aux;
}}
23
ProgramaPrograma
int main(){
int n;char op;celula *p;freopen("entrada.txt", "r", stdin);p = inicia();
24
ProgramaPrograma
while (scanf(" %c", &op) != EOF){
switch (op){
case 'I':scanf("%d", &n);p = insere(n, p);break;case 'R':scanf("%d", &n);p = remove(n, p);break;case 'M':imprima(p);
}}
25
ProgramaPrograma
libera(p);return 0;
}
26
Entrada do programaEntrada do programa
Entrada:I 10I 20I 30MR 20MI 40I 50R 10R 30M
27
Saída do programaSaída do programa
Saída:30 20 10 30 10 50 40
28
ListasListas
• Uma vez entendidas as listas encadeadas básicas, você pode inventar muitos outros tipos de listas encadeadas.
• Por exemplo, você pode construir uma lista encadeada circular, em que a última célula aponta para a primeira. O endereço de uma tal lista é o endereço de uma de suas células (a última, por exemplo). Você pode também ter uma lista duplamente encadeada: cada célula contém o endereço da célula anterior e o endereço da célula seguinte.
• Mas pode-se usar o vetor estático ou a STL com a vector para produzir uma lista encadeada.
29
FILAFILA
• Uma fila é uma estrutura de dados dinâmica que admite remoção de elementos e inserção de novos objetos. Mais especificamente, uma fila (= queue) é uma estrutura sujeita à seguinte regra de operação: sempre que houver uma remoção, o elemento removido é o que está na estrutura há mais tempo.
• Em outras palavras, o primeiro objeto inserido na fila é também o primeiro a ser removido. Essa política é conhecida pela sigla FIFO (= First-In-FIFO (= First-In-First-Out)First-Out).
https://www.geeksforgeeks.org/queue-data-structure/
30
FILAFILA
• As funções suportadas pela fila da STL são:– empty ()empty () - Retorna se a fila está vazia;
– size ()size () - Retorna o tamanho da fila;
– front ()front () - Retorna uma referência ao primeiro elemento da fila;
– back ()back () - Retorna uma referência ao último elemento da fila;
– push (n)push (n) - Adiciona o elemento "n" no final da fila;
– pop ()pop () - Exclui o primeiro elemento da fila.
31
ProgramaPrograma
#include <bits/stdc++.h>using namespace std;void imprima(queue <int> F);void imprima(queue <int> F){ queue <int> fila = F; while (!fila.empty()) { printf("%d ", fila.front()); fila.pop(); } printf("\n");}
32
ProgramaPrograma
int main(){ queue <int> Fila; int n; char op; freopen("entrada.txt", "r", stdin);
33
ProgramaPrograma
while (scanf(" %c", &op) != EOF) {switch (op) {
case 'I':scanf("%d", &n);Fila.push(n);break;case 'R':Fila.pop();break;case 'M':imprima(Fila);
}}
return 0;}
34
Entrada do programaEntrada do programa
Entrada:I 10I 20I 30MRMI 40I 50RRM
35
Saída do programaSaída do programa
Saída:10 20 30 20 30 40 50
36
PilhaPilha
• Uma pilha é uma estrutura de dados que admite remoção de elementos e inserção de novos objetos. Mais especificamente, uma pilha (= stack) é uma estrutura sujeita à seguinte regra de operação: sempre que houver uma remoção, o elemento removido é o que está na estrutura há menos tempo.
• Em outras palavras, o primeiro objeto a ser inserido na pilha é o último a ser removido. Essa política é conhecida pela sigla LIFO (= Last-In-First-Out).
https://www.geeksforgeeks.org/stack-data-structure/
37
PILHAPILHA
• As funções associadas à pilha são:– empty ()empty () - Retorna se a pilha está vazia;
– size ()size () - Retorna o tamanho da pilha;
– top ()top () - Retorna uma referência ao elemento mais alto da pilha;
– push (n)push (n) - Adiciona o elemento "n" no topo da pilha;
– pop ()pop () - Apaga o elemento mais alto da pilha.
38
ProgramaPrograma
#include <bits/stdc++.h>using namespace std;void imprima(stack <int> P);void imprima(stack <int> P){ stack <int> pilha = P; while (!pilha.empty()) { printf("%d ", pilha.top()); pilha.pop(); } printf("\n");}
39
ProgramaPrograma
int main(){ stack <int> P; int n; char op; freopen("entrada.txt", "r", stdin);
40
ProgramaPrograma
while (scanf(" %c", &op) != EOF) {switch (op) {
case 'I':scanf("%d", &n);P.push(n);break;case 'R':P.pop();break;case 'M':imprima(P);
}}
return 0;}
41
Entrada do programaEntrada do programa
Entrada:I 10I 20I 30MRMI 40I 50RRM
42
Saída do programaSaída do programa
Saída:30 20 10 20 10 20 10
43
ListList
• Listas são contêineres de sequência que permitem a alocação de memória não contígua. Em comparação com o vetor, a lista tem um percurso lento, mas assim que uma posição é encontrada, a inserção e a exclusão são rápidas. Normalmente, quando dizemos uma lista, falamos sobre a lista duplamente vinculada. Para implementar uma lista ligada, usamos a lista de encaminhamento.
https://www.geeksforgeeks.org/list-cpp-stl/
44
LISTLIST
• Funções usadas com a lista:– front () - front () - Retorna o valor do primeiro elemento
da lista;– back () - back () - Retorna o valor do último elemento
da lista;– push_front (n) - push_front (n) - Adiciona um novo elemento
"n" no início da lista;– push_back (n) - push_back (n) - Adiciona um novo elemento
"n" no final da lista;– pop_front () - pop_front () - Remove o primeiro elemento da
lista e reduz o tamanho da lista em 1;– pop_back () - pop_back () - Remove o último elemento da
lista e reduz o tamanho da lista em 1;
45
LISTLIST
• Funções usadas com a lista:– begin () - begin () - Retorna um iterador apontando para
o primeiro elemento da lista;– end () - end () - Retorna um iterador apontando para o
último elemento teórico que segue o último elemento;
– empty () - empty () - Retorna se a lista está vazia (1) ou não (0);
– insert () - insert () - Insere novos elementos na lista antes do elemento em uma posição especificada;
– erase () - erase () - Remove um único elemento ou um intervalo de elementos da lista;
46
LISTLIST
• Funções usadas com a lista:– assign () - assign () - Atribui novos elementos para lista,
substituindo os elementos atuais e redimensiona a lista;
– remove () - remove () - Remove todos os elementos da lista, que são iguais ao dado elemento;
– reverse () - reverse () - Inverte a lista;– size () - size () - Retorna o número de elementos na
lista;– sort () - sort () - Classifica a lista em ordem crescente.
47
ProgramaPrograma
#include <bits/stdc++.h>using namespace std;void imprima(list <int> L);void imprima(list <int> L){ list <int> :: iterator it; for(it = L.begin(); it != L.end(); ++it) { printf("%d ", *it); } printf("\n");}
48
ProgramaPrograma
int main(){ list <int> L; int n, m; char op, ch; freopen("entrada.txt", "r", stdin);
while (scanf(" %c", &op) != EOF){
switch (op){
case 'I':scanf("%d %d", &n, &m);L.push_front(n);L.push_back(m);break;
49
ProgramaPrograma
case 'R':scanf(" %c", &ch);if (ch == 'F'){
L.pop_front();} else {
L.pop_back();}break;case 'M':imprima(L);
}}
return 0;}
50
Entrada do programaEntrada do programa
Entrada:I 10 20I 20 30I 30 10MR FMI 40 50I 50 40R BR BM
51
Saída do programaSaída do programa
Saída:30 20 10 20 30 10 20 10 20 30 10 50 40 20 10 20 30 10
52
PairPair
• O contêiner de pair é um contêiner simples definido no cabeçalho <utility> que consiste em dois elementos ou objetos de dados.– O primeiro elemento é referenciado como
"first" e o segundo como "second" e o pedido é fixo (first, second).
– Pair é usado para combinar dois valores que podem ser diferentes no tipo. Par fornece uma maneira de armazenar dois objetos heterogêneos como uma única unidade.
53
PairPair
– Pair pode ser atribuído, copiado e comparado. O vetor de objetos alocados em um map ou hash_map é do tipo "pair" por padrão, na qual todos os elementos "first" são chaves exclusivas associadas a seus objetos de valor "second".
– Para acessar os elementos, usamos o nome da variável seguido pelo operador de ponto seguido pela palavra-chave first ou second.
https://www.geeksforgeeks.org/sorting-vector-of-pairs-in-c-set-1-sort-by-first-and-second/
54
ProgramaPrograma
#include <bits/stdc++.h>using namespace std; int main(){ vector <pair <int, char> > P; int n, i, x; char op; freopen("entrada.txt", "r", stdin);
while (scanf("%d %c", &x, &op) != EOF){
P.push_back(make_pair(x, op));}
55
ProgramaPrograma
n = P.size();for (i = 0; i < n; i++){
cout << P[i].second << " ";cout << P[i].first << endl;
}
56
ProgramaPrograma
sort(P.begin(), P.end());printf("Ordenado pelo primeiro:\n");for (i = 0; i < n; i++){
cout << P[i].second << " ";cout << P[i].first << endl;
}return 0;
}
57
Entrada do programaEntrada do programa
Entrada:10 A40 B30 C70 D50 A20 B
58
Saída do programaSaída do programa
Saída:A 10B 40C 30D 70A 50B 20Ordenado pelo primeiro:A 10B 20C 30B 40A 50D 70
59
MapMap
• Maps são contêineres associativos que armazenam elementos de forma mapeada. Cada elemento possui um valor de chave e um valor mapeado. Nenhum valor mapeado pode ter os mesmos valores de chave.
• Funções associadas ao map:– begin ()begin () - Retorna um iterador para o primeiro
elemento no map;
– end ()end () - Retorna um iterador ao elemento teórico que segue o último elemento no map;
– size ()size () - Retorna o número de elementos no map;
https://www.geeksforgeeks.org/map-associative-containers-the-c-standard-template-library-stl/
60
MapMap
• Funções associadas ao map:– max_size () - max_size () - Retorna o número máximo de
elementos que o map pode conter;
– empty () -empty () - Retorna se o map está vazio
– pair insert (keyvalue, mapvalue) - pair insert (keyvalue, mapvalue) - AdicioAdiciona um novo elemento ao map;
– erase (iterador position) - erase (iterador position) - Remove o elemento na posição apontada pelo iterador;
– erase (const n) - erase (const n) - Remove o valor da chave "n" do map;
– clear () - clear () - Remove todos os elementos do map;
61
MapMap
• Funções associadas ao map:– key_comp () / value_comp () - key_comp () / value_comp () - Retorna o
objeto que determina como os elementos no map são ordenados ('<' por padrão)
– find (const n) - find (const n) - Retorna um iterador ao elemento com o valor da chave "n" no map, se encontrado, senão retorna o iterador ao final
– count (const n) - count (const n) - Retorna o número de correspondências para o elemento com o valor da chave "n" no map;
62
MapMap
• Funções associadas ao map:– lower_bound (const n) - lower_bound (const n) - Retorna um iterador
ao primeiro elemento que é equivalente ao valor mapeado com o valor da chave "n" ou definitivamente não irá antes do elemento com o valor da chave "n" no map;
– upper_bound (const n) - upper_bound (const n) - Retorna um iterador ao primeiro elemento que é equivalente ao valor mapeado com o valor da chave "n" ou, definitivamente, irá após o elemento com o valor da chave "n" no map.
63
ProgramaPrograma
#include <bits/stdc++.h>using namespace std;int main(){ freopen("entrada.txt", "r", stdin); map <int, int> mapa; int i, n, x, y; scanf("%d", &n); for (i = 0; i < n; i++) { scanf("%d %d", &x, &y); mapa.insert(pair <int, int> (x, y)); }
64
ProgramaPrograma
map <int, int> :: iterator itr; cout << "\tO mapa eh:\n"; cout << "\tChave\tElemento\n"; for (itr = mapa.begin(); itr != mapa.end(); ++itr) { cout << '\t' << itr->first << '\t' << itr->second << '\n'; } return 0;}
65
Entrada do programaEntrada do programa
Entrada:71 402 303 604 205 506 507 10
66
Saída do programaSaída do programa
Saída:O mapa eh:Chave Elemento1 402 303 604 205 506 507 10
67
URI 1281URI 1281
#include <bits/stdc++.h>using namespace std;int main() {
freopen("entrada.txt", "r", stdin);map <string, double> tab;double p, total;string prod;int c, n;scanf("%d", &c);
Agradecimento ao amigoEdgar Almeira
68
URI 1281URI 1281
while(c--){total=0;scanf("%d", &n);while(n--){
cin >> prod;scanf("%lf", &p);tab[prod] = p;
}
Agradecimento ao amigoEdgar Almeira
69
URI 1281URI 1281
scanf("%d", &n);while(n--){
cin >> prod;scanf("%lf", &p);total += (tab[prod] * p);
}printf("R$ %.2lf\n", total);
}return 0;
}
Agradecimento ao amigoEdgar Almeira
70
Entrada do programaEntrada do programa
Entrada:24mamao 2.19cebola 3.10tomate 2.80uva 2.733mamao 2tomate 1uva 3
Entrada:5morango 6.70repolho 1.12brocolis 1.71tomate 2.80cebola 2.814brocolis 2tomate 1cebola 1morango 1
Agradecimento ao amigoEdgar Almeira
71
Saída do programaSaída do programa
Saída:R$ 15.37R$ 15.73
Agradecimento ao amigoEdgar Almeira
72
SetSet
• Set são um tipo de contêineres associativos em que cada elemento deve ser único, porque o valor do elemento o identifica. O valor do elemento não pode ser modificado depois de adicionado ao conjunto, embora seja possível remover e adicionar o valor modificado desse elemento.
https://www.geeksforgeeks.org/set-in-cpp-stl/
73
SetSet
• Funções associadas ao Set:– begin () -begin () - Retorna um iterador para o primeiro
elemento no conjunto;
– end () -end () - Retorna um iterador ao elemento teórico que segue o último elemento no conjunto;
– size () -size () - Retorna o número de elementos no conjunto;
– max_size () -max_size () - Retorna o número máximo de elementos que o conjunto pode conter;
74
SetSet
• Funções associadas ao Set:– empty () - empty () - Retorna se o conjunto está vazio;
– par <iterator, bool> insert (const n) - par <iterator, bool> insert (const n) - Adiciona um novo elemento "n" ao conjunto;
– inserção do iterador (iterador position, const n) inserção do iterador (iterador position, const n) - - Adiciona um novo elemento 'n' na posição apontada pelo iterador;
– erase (iterador position) - erase (iterador position) - Remove o elemento na posição apontada pelo iterador;
– erase (const n) - erase (const n) - Remove o valor "n" do conjunto;
– clear () - clear () - Remove todos os elementos do conjunto;
75
SetSet
• Funções associadas ao Set:– ekey_comp () / value_comp () - ekey_comp () / value_comp () - Retorna o
objeto que determina como os elementos no conjunto são ordenados (‘<’ por padrão);
– find (const n) - find (const n) - Retorna um iterador ao elemento "n" no conjunto, se encontrado, senão retorna o iterador ao final;
– count (const n) - count (const n) - Retorna 1 ou 0 com base no elemento 'n' presente no set ou não;
76
SetSet
• Funções associadas ao Set:– lower_bound (const n) - lower_bound (const n) - Retorna um iterador
para o primeiro elemento que é equivalente a 'n' ou definitivamente não irá antes do elemento 'n' no conjunto;
– upper_bound (const n) - upper_bound (const n) - Retorna um iterador ao primeiro elemento que é equivalente a 'n' ou definitivamente irá após o elemento 'n' no conjunto.
77
ProgramaPrograma
#include <bits/stdc++.h>using namespace std;int main() {
freopen("entrada.txt", "r", stdin);set <int> S;set <int> :: iterator it;int i, n, x;scanf("%d", &n);
78
ProgramaPrograma
for (i = 0; i < n; i++){
scanf("%d", &x);S.insert(x);
}printf("Set: ");for (it = S.begin(); it != S.end(); it++){
cout << *it << " ";}cout << endl;return 0;
}
79
Entrada do programaEntrada do programa
Entrada:740302050301050
80
Saída do programaSaída do programa
Saída:Set: 10 20 30 40 50
81
BitsetBitset
• Bitset é um vetor de bool mas cada valor booleano não é armazenado separadamente, em vez disso o bitset otimiza o espaço de modo que cada bool tome apenas 1 bit de espaço, portanto o espaço ocupado pelo bitset bs é menor que o bool bs [N] e vetor bs (N). No entanto, uma limitação do bitset é, N deve ser conhecido em tempo de compilação, ou seja, uma constante (esta limitação não está lá com vector e array dinâmica)
https://www.geeksforgeeks.org/c-bitset-and-its-application/
82
BitsetBitset
• Como o bitset armazena as mesmas informações de maneira comprimida, a operação no bitset é mais rápida que a do array e vetor. Podemos acessar cada bit de bitset individualmente com a ajuda do operador de indexação de array[] que é bs [3] mostra bit no índice 3 do bitset bs como um array simples. Lembre-se que o bitset inicia sua indexação para trás, que é para 10110, 0 para os índices 0 e 3 e 1 para o primeiro e segundo índices.
https://www.geeksforgeeks.org/c-bitset-and-its-application/
83
BitsetBitset
• Podemos construir um bitset usando o número inteiro, bem como a string binária via construtores, que é mostrada no código abaixo. O tamanho do bitset é fixo em tempo de compilação ou seja, não pode ser alterado em tempo de execução.
• A função principal definida para a classe de bitset é operator [], count, size, set, reset e muitos mais.
https://www.geeksforgeeks.org/c-bitset-and-its-application/
84
ProgramaPrograma#include <bits/stdc++.h>using namespace std;int main() {
freopen("entrada.txt", "r", stdin);int i, n, x;bitset <16> B;cout << B << endl;scanf("%d", &n);for (i = 0; i < n; i++){
scanf("%d", &x);cout << x << " - " << bitset<8>(x) << endl;
}return 0;
}
85
Entrada do programaEntrada do programa
Entrada:6352112010
86
Saída do programaSaída do programa
Saída:00000000000000003 - 000000115 - 000001012 - 0000001011 - 0000101120 - 0001010010 - 00001010
87
ProgramaPrograma
#include <bits/stdc++.h>using namespace std;int main() {
bitset<4> bset1(9);bitset<4> bset2(3);cout << bset1 << endl;cout << bset2 << endl;// operador de comparaçãocout << (bset1 == bset2) << endl;cout << (bset1 != bset2) << endl;// operação bitwise e atribuiçãocout << (bset1 ^= bset2) << endl;cout << (bset1 &= bset2) << endl;cout << (bset1 |= bset2) << endl;
88
ProgramaPrograma
// deslocando para a esquerda e para a direitacout << (bset1 <<= 2) << endl;cout << (bset1 >>= 1) << endl;// operador nãocout << (~bset2) << endl;// operador bit a bitcout << (bset1 & bset2) << endl;cout << (bset1 | bset2) << endl;cout << (bset1 ^ bset2) << endl;return 0;
}
89
Saída do programaSaída do programa
Saída:1001001101101000100011110001101100001001110101
90
ExercíciosExercícios
• https://www.urionlinejudge.com.br/judge/en/login
– URI 1110, 1449. Faça os exercícios de Estruturas do URI.