Baixe o app para aproveitar ainda mais
Prévia do material em texto
1a Questão (Ref.: 201201093768) Pontos: 0,1 / 0,1 As coleções de dados podem ser classificadas em estruturas lineares e estruturas não lineares. Nesse contexto, é correto afirmar que na pilha, uma estrutura não linear, os elementos são colocados e retirados por um único lado da lista, ou seja, pelo topo, que é alterado sempre que um elemento é adicionado ou retirado da pilha. É um tipo de estrutura que tem a ordenação do tipo LILO. a lista é uma estrutura linear cuja implementação pode ser feita por meio de lista ligada em que as estruturas são estáticas ou através de um array para permitir que as estruturas sejam ligadas dinamicamente. na tabela de Hash a chave é transformada num índice inteiro que é usado para acessar os dados. A chave pode ser um string, desde que haja uma função que transforme essa chave num inteiro. É uma estrutura linear. a fila de prioridade é uma versão especial da fila, uma estrutura não linear. Quando se retira um elemento desta estrutura é selecionado aquele que tem maior prioridade, tendo portanto a ordenação do tipo FIFO. tendo uma estrutura não linear, um array dinâmico é criado usando técnicas de alocação e gestão dinâmica de memória. Pode ser redimensionado e é alocado durante o tempo de compilação. 2a Questão (Ref.: 201201826267) Pontos: 0,1 / 0,1 Marque a opção verdadeira para um ponteiro. É uma varável que pode armazenar um endereço de memória ou um valor do tipo inteiro É uma variável que armazena o endereço de um valor do tipo para o qual o ponteiro foi declarado É uma variável que, quando incrementada de uma unidade, sempre incrermenta o seu valor, em termos absolutos, de uma unidade É uma varíavel que armazena como valor necessariamente o endereço onde estará armazenado um outro endereço É uma variável que armazena o endereço de um valor do tipo void 3a Questão (Ref.: 201201113491) Pontos: 0,1 / 0,1 O registro de ativação de uma sub-rotina é o conjunto das informações que devem/precisam ser alocadas em memória. Assinale abaixo a única opção que representa a composição destas informações. ( ) endereço de ponteiro / variáveis locais / endereço inicial ( ) endereço de retorno / valor de retorno / endereço de ponteiro ( ) endereço de retorno / variáveis locais / parâmetros passados ( ) variáveis locais / valor de retorno / endereço de ponteiro ( ) parâmetros passados / endereço inicial / endereço de retorno 4a Questão (Ref.: 201201110480) Pontos: 0,1 / 0,1 Sobre o funcionamento da busca binária, é incorreto afirmar que dividindo seu vetor em duas metades. Se o item for igual ao item que está na metade do vetor, o item não foi encontrado. Se o item for maior que o item que está na metade do vetor procure na segunda metade, ou seja, a da direita. Se o item for igual ao item que está na metade do vetor, o item foi encontrado. Se o item for menor que o item que está na metade do vetor, procure na primeira metade, ou seja, a da esquerda. Se o item for menor ao item que está na primeira posição do vetor, o item não foi encontrado. Gabarito Comentado. 5a Questão (Ref.: 201201830167) Pontos: 0,1 / 0,1 No programa abaixo em C++, que sequência de valores serão impressos ? int x; x = 15; if (x > 0) { int x; x = 25; cout << x << endl; } cout << x << endl; 15 e 15 25 e 15 15 e 25 0 e 5 25 e 25 1a Questão (Ref.: 201201724218) Pontos: 0,1 / 0,1 Pode-se definir uma estrutura heterogênea como sendo um conjunto de elementos, geralmente, agrupados sob uma lógica e associados por um nome. Esses elementos podem ser variáveis simples, matrizes ou ainda outras estruturas. Seja a definição de uma estrutura como: struct aluno { string nome; float nota; }; Suponha ainda que exista um vetor desta estrutura, definido como: aluno vet [100]; Marque a alternativa em que é atribuída de forma correta a nota 5.7 para o décimo primeiro elemento deste vetor. aluno.vet[10].nota=5.7; aluno.vet[10]=5.7; vet[10]=aluno.5.7; vet[10].aluno.nota=5.7 ; vet[10].nota=5.7; 2a Questão (Ref.: 201201102205) Pontos: 0,1 / 0,1 Diferentes tipos de estrutura de dados são adequadas a diferentes tipos de aplicação e algumas são altamente especializadas, destinando-se a algumas tarefas específicas. Dessa forma a definição de Estrutura de Dados está expressa na alternativa: É um modo de utilização de dados nos programas de computador. É um modo de distribuição e organização de dados em uma rede de computador de modo que possam ser usados de modo eficiente. É um modo particular de armazenamento e organização de dados em um computador de modo que possam ser usados de modo eficiente. São os nomes dados as variáveis na montagem de uma rotina. É um modo de deleção de dados em um computador. Gabarito Comentado. 3a Questão (Ref.: 201201724195) Pontos: 0,1 / 0,1 As estruturas de dados podem ser caracterizadas como sendo uma forma organizada de armazenar dados ou informações na memória, de modo a otimizar o acesso a estes. Muitas vezes existem algoritmos de manipulação de dados associados a estas estruturas. Verifique as seguintes sentenças: I-Filas são estruturas que recuperam os dados na ordem direta em que estes foram armazenados. II-As Pilhas são estruturas que recuperam os dados na ordem reversa em que estes foram armazenados. III-As Pilhas são estruturas que recuperam os dados na ordem direta em que estes foram armazenados. IV-As Filas são estruturas que recuperam os dados na ordem reversa em que estes foram armazenados. Marque a alternativa CORRETA: Todas as alternativas estão corretas. As alternativas I e III estão corretas. As alternativas III e IV estão corretas. As alternativas I e II estão corretas As alternativas II e IV estão corretas. 4a Questão (Ref.: 201201177789) Pontos: 0,1 / 0,1 Sobre estrutura de dados, identifique o que está correto afirmar. I. Pilha é uma estrutura de dados com acesso restrito aos seus elementos, uma vez que eles são colocados e retirados por um único lado e são ordenados pelo princípio LIFO (last in first out). Assim, sempre que um elemento é adicionado ou retirado seu topo é alterado. II. Pilha é o tipo de estrutura usada, por exemplo, na avaliação de expressões numéricas, na recursividade e pelos compiladores, na passagem de parâmetros para as funções. III. Registro é uma estrutura básica que permite guardar coleções de dados de diferentes tipos, sendo normalmente utilizado quando um objeto tem diferentes atributos, isto é, contém campos de diferentes tipos. IV. Lista pode conter um número qualquer de elementos, expandindo-se ou contraindo-se conforme o elementos são inseridos ou retirados. Nesse tipo de estrutura, os acessos tanto podem ser feitos sequencialmente como diretamente. V. Fila, assim como a pilha , é uma versão especial de lista, e como tal, seus elementos são ordenados pelo princípio LIFO (last in first out). I, II e III. II, IV e V. I, III e V. I, III, IV e V. II, III, IV e V. Gabarito Comentado. 5a Questão (Ref.: 201201648741) Pontos: 0,1 / 0,1 Leia com atenção as afirmativas abaixo e assinale a resposta correta. I A estrutura de dados que melhor representa os diretórios ou pastas de arquivos do computador é a árvore. II A estrutura de dados FILA é não linear assim como o Grafo. III O termo folha em uma estrutura de dados é usado para um nó sem filhos e que tem grau 0, IV O grau de uma árvore é definido pelo número de subárvores de um nó.V O grafo é uma estrutura de dados que tem limitação para o número de vértices. VI Uma das aplicações da estrutura de dados grafo é a Computação Gráfica. II, IV e V são afirmativas verdadeiras I, III, IV e VI são afirmativas verdadeiras II, IV, V e VI são afirmativas verdadeiras I, II e V são afirmativas verdadeiras I, II, III e VI são afirmativas verdadeiras 1a Questão (Ref.: 201201673748) Pontos: 0,1 / 0,1 Estude atentamente o código a segir: int deciframe(int v[ ], int tam, int e){ int i = 0, f = tam -1, m; while ( i <= f ){ m = ( i + f ) / 2; if ( v[m] == e ) { return m; } if ( e < v[m] ) { f = m - 1; } else { i = m + 1; } }return -1; } Sabendo que a chamada da mesma foi feita com os parâmetros recebendo os seguintes valores, o que ela retornaria? v[10] = {0, 2, 4, 6, 8, 10, 20, 100} tam = 8 e = 6 0 6 4 3 -1 2a Questão (Ref.: 201201826323) Pontos: 0,1 / 0,1 Se i e j são variáveis int e p e q ponteiros para o tipo int, marque V para as opções verdadeiras e F para as opções ilegais p= &*&i; p= &i; i = *&j i= (*&)j *q= &j; 3a Questão (Ref.: 201201758082) Pontos: 0,1 / 0,1 Assinale a alternativa correta sobre tipos abstratos de dados: Um tipo abstrato de dados é composto por um modelo de dados e um conjunto de operadores definidos sobre esses dados. É fundamental que os tipos abstratos de dados proponham um conjunto eficiente de algoritmos para realização de suas operações. Um tipo abstrato de dados é um modo particular de armazenamento e organização de dados em um computador de modo que possam ser usados eficientemente. Um tipo abstrato de dados descreve, além do que se pode fazer com os dados, como as operações serão efetivamente implementadas. Um tipo abstrato de dados deve sempre ser representado por meio dos recursos específicos de uma linguagem de programação. 4a Questão (Ref.: 201201673749) Pontos: 0,1 / 0,1 Estude atentamente o código a segir: int deciframe(int v[ ], int tam, int e){ int i = 0, f = tam -1, m; while ( i <= f ){ m = ( i + f ) / 2; if ( v[m] == e ) { return m; } if ( e < v[m] ) { f = m - 1; } else { i = m + 1; } } return -1; } Sabendo que a chamada da mesma foi feita com os parâmetros recebendo os seguintes valores, o que ela retornaria? v[10] = {0, 2, 4, 6, 8, 10, 20, 100} tam = 8 e = -6 -1 6 4 3 0 5a Questão (Ref.: 201201724220) Pontos: 0,1 / 0,1 Entre os diversos algoritmos de pesquisa existentes, certamente os mais famosos são os da pesquisa sequencial e o da pesquisa binária. A busca ou pesquisa sequencial pode ser aplicada em vetores independente destes estarem ordenados, entretanto a busca binária só se aplica em vetores ordenados. Seja o vetor A= {10,35,41,55,69,70,98}, suponha que o número 70 foi pesquisado pelo algoritmo da busca sequencial e também pelo algoritmo da busca binária, ambos algoritmos realizam testes nos elementos do vetor até achar o que procuram ou definirem que o elemento não se encontra no vetor. Sendo assim marque a alternativa que expressa o número de testes realizados pela busca sequencial e o número de testes realizados pela busca binária, respectivamente, até encontrarem o 70. 5 e 5 7 e 1 6 e 1 6 e 4 6 e 2 1a Questão (Ref.: 201201844355) Pontos: 0,0 / 0,1 Ao criarmos uma rotina para inserir um dado em uma LISTA de dados duplamente encadeada e circular, nos deparamos com as seguintes cuidados: Só poderei inserir no começo ou no fim, mas não no meio. Só poderei inserir no final da lista e nunca no começo ou no meio. Posso inserir no começo, no meio ou no fim. Só poderei inserir no final da lista e no começo somente se ela estiver cheia. Só poderei inserir no final da lista e no começo somente se ela estiver vazia. 2a Questão (Ref.: 201201680520) Pontos: 0,0 / 0,1 if(vet[j] < vet[j-1] ) { aux=vet[j]; vet[j]< vet[j-1]; vet[j-1]=aux; } if(vet[j] < vet[j-1] ) { aux=vet[j]; vet[j-1]= vet[j]; vet[j-1]=aux; } if(vet[j] == vet[j-1] ) { aux=vet[j]; vet[j]= vet[j-1]; vet[j-1]=aux; } if(vet[j-1] < vet[j] ) { aux=vet[j]; vet[j]= vet[j-1]; vet[j-1]=aux; } if(vet[j-1] > vet[j] ) { aux=vet[j]; vet[j]= vet[j-1]; vet[j-1]=aux; } 3a Questão (Ref.: 201201816455) Pontos: 0,1 / 0,1 Estava um aluno estudando Lista Simplesmente Encadeada quando encontrou em um site a definição da struct nodo e de uma função cujo nome você deverá escolher para substituir XXX nas opções abaixo depois que analisar a função, assumindo que teste foi realizado, permitindo que a operação fosse realizada. struct nodo { int info; struct nodo *prox; }; nodo* XXX(nodo *ptr, int valor) { nodo *temp = new nodo; ... temp->info = valor; temp->prox = ptr; return temp; } ListaNo RemoveNo InsereNoFim BuscaNaLista InsereNoFrente Gabarito Comentado. 4a Questão (Ref.: 201201110480) Pontos: 0,0 / 0,1 Sobre o funcionamento da busca binária, é incorreto afirmar que dividindo seu vetor em duas metades. Se o item for menor ao item que está na primeira posição do vetor, o item não foi encontrado. Se o item for igual ao item que está na metade do vetor, o item foi encontrado. Se o item for maior que o item que está na metade do vetor procure na segunda metade, ou seja, a da direita. Se o item for menor que o item que está na metade do vetor, procure na primeira metade, ou seja, a da esquerda. Se o item for igual ao item que está na metade do vetor, o item não foi encontrado. Gabarito Comentado. 5a Questão (Ref.: 201201772460) Pontos: 0,1 / 0,1 Qual a estrutura de dados usada na implementação do método Round Robin do sistema operacional UNIX ? Lista duplamente encadeada Lista simplesmente encadeada Fila Pilha Árvore DISCIPLINA : Estrutura de Dados 1ª. Lista de Exercícios Elaborada por Prof. Jane Tavares Alvarez da Silva Funções e Operações com listas lineares seqüenciais 1) Considere o programa abaixo e depois dê o que se pede: #include <iostream> #include <cstdlib> using namespace std; void Teste1(int ); void Teste2(int &); int Teste3(int); int x = 20; int main() { int numero = 10, outroNumero; Teste1(numero); cout << "Valor de numero (após Teste1) = " << numero << endl; cout << "X = " << x << endl; Teste2(numero); cout << "Valor de numero (após Teste2) = " << numero << endl; cout << "X = " << x << endl; outroNumero = Teste3(numero); cout << "Valor de outro numero (após Teste3) = " << outroNumero << endl; cout << "X = " << x << endl; system("pause"); } void Teste1(int numero) { numero = numero +x ; x++; } void Teste2(int &numero) { int valor = 100; numero = numero + valor; x++; } int Teste3(int n) { int valor = 200; n = n + valor; x--; return n; } Pede-se: a) Identifique as variáveis globais e locais. Quando identificar uma variável local, especifique o escopo da mesma. b) Identifique, em cada função, o tipo de passagemde parâmetros. c) Mostre, passo a passo, o valor de todas as variáveis, indicando o momento em que as variáveis não mais ocupam espaço na memória. d) Diga o que é impresso na tela Solução : a) Variável global : x Variáveis locais : 1) numero e outroNumero – escopo : main. Veja o trecho : int main() { int numero = 10, outroNumero; //continua 2) numero - escopo : Teste1 3) numero e valor – escopo : Teste2 4) n e valor - escopo : Teste3 b) Função main : Não há passagem de parâmetros Função Teste 1 : Passagem de parâmetro por valor Função Teste 2: Passagem de parâmetro por referência FunçãoTeste 3: Passagem de parâmetro por valor c) Ver com o professor(a). d) 2) Considere listas lineares seqüenciais não ordenadas de inteiros não nulos. Faça um programa para : a) Construir duas listas sem repetição de dados. Para isto, implemente uma função de nome inserirSemRepetir que receba como parâmetros: o vetor de dados, o elemento a ser inserido, a quantidade de elementos no vetor e o tamanho máximo definido para o vetor. Note : Deverão ser emitidas mensagens de erro adequadamente. Será preciso fazer uma busca seqüencial para evitar repetição de dados. A função deverá ser chamada repetidamente para criar cada uma das listas b) Imprimir as listas criadas no item a), implementando uma função de nome percorrer, conforme estudado em aula. c) Intercalar as listas criadas, gerando uma terceira lista sequencial. Por exemplo, a 1ª. lista possui os elementos 10, 34 e 5 e a 2ª. lista possui os elementos 4, 7 e 9. A lista resultante será 10, 4,34,7,5 e 9. d) Gerar uma lista que seja a interseção das listas do item a), como em interseção de conjuntos. e) Imprimir as listas geradas nos itens c) e d), usando a função percorrer. f) Gerar uma lista que seja a união das listas do item a) e depois imprimi-la. g) Remover um elemento da lista gerada no item f) através do índice passado. Para isto, implemente uma função com o seguinte protótipo : void removerPeloIndice(int [], int &, int); Parâmetros : - vetor de elementos - quantidade de elementos no vetor - índice do valor a ser removido Após a leitura do índice, verifique sua validade. Caso não seja válido, emita mensagem de erro na main, caso contrário chame a função para realizar a remoção. Solução : #include <iostream> using namespace std; #define TAM 2 //Protótipos void inserirSemRepetir(int [], int , int &, int ); void percorrer(int [], int); int buscaSequencial(int [], int, int); void intercalar(int [], int [], int [], int, int, int &); bool intersecao(int [], int [], int [], int , int , int &); void uniao(int [], int [], int [], int , int , int &); void removerPeloIndice(int [], int &, int); //Prog. principal int main() { int v[TAM], w[TAM], z[2*TAM], inter[TAM], vetUniao[2*TAM], valor, // valor a ser inserido nv, //quantidade de elementos em v nw, // quantidade de elementos em w nz, nUniao, ninter, posicao; //item a) Criar duas listas com elementos não nulos nv = nw = 0; //inicializa a quantidade de elementos das listas //Criar a 1a. lista com elementos não nulos cout << "\n\n############################################################\n\n"; cout << "Criando a primeira lista : " << endl; while (true) { cout << "Digite um valor nao nulo : "; cin >> valor; if (valor > 0) { inserirSemRepetir(v,valor,nv,TAM); if (nv == TAM) //lista cheia { cout << "Lista cheia. "; break; } } else break; } // fim do while //Criar a 2a. lista com elementos não nulos cout << "\n\n############################################################\n\n"; cout << "Criando a segunda lista : " << endl; while (true) { cout << "Digite um valor nao nulo : "; cin >> valor; if (valor > 0) { inserirSemRepetir(w,valor,nw,TAM); if (nw == TAM) { cout << "Lista cheia. "; break; } } else break; } // fim do while //item b) percorrer, ou seja, imprimir os dados de cada lista cout << "\nLista 1 : " ; //Poderia criticar se existe lista ou não percorrer(v,nv); cout << "\nLista 2 : "; //Poderia criticar se existe lista ou não percorrer(w,nw); //item c) intercalar nz = 0; //inicializa a quantidade de elementos em z intercalar(v,w,z,nv,nw,nz); //Poderia criticar se existe lista ou não cout << "\nLista resultante da intercalacao : " ; percorrer(z,nz); //item e) //item d) interseção ninter = 0; bool achou = intersecao(v,w,inter,nv,nw,ninter); cout << "\nVetor resultante da intersecao : "; if (achou) //verifica se existe interseção percorrer(inter,ninter); //item e) else cout << "\nNao houve intersecao." << endl; //item f)uniao nUniao = 0; uniao(v,w,vetUniao,nv,nw,nUniao); if (nUniao != 0) //testa se existe uniao { cout << "\nVetor resultante da uniao : "; percorrer(vetUniao,nUniao); } else cout << "Lista uniao vazia. "; //item g) remover if (nUniao != 0) { do { cout << "\nDigite o indice do elemento a ser removido do vetor uniao : "; cin >> posicao; if (posicao < 0 || posicao >= nUniao) cout << "ERRO: Indice inexistente." << endl; } while (posicao < 0 || posicao >= nUniao); removerPeloIndice(vetUniao,nUniao, posicao); cout << "\nLista (uniao) apos remocao : "; //Poderia testar lista vazia percorrer(vetUniao,nUniao); } else cout << "\nImpossivel remover dado pelo indice da uniao, pois a lista uniao esta vazia. " << endl; cout << endl << endl; system("pause"); } //Definições das funções //Inserção no final da lista, pois não há ordem alguma. // Note a passagem por referência - uso de & void inserirSemRepetir(int v[], int valor, int &n, int tamanho) { int posicao; //testei lista cheia na main posicao = buscaSequencial(v,valor,n); if (posicao < 0) { v[n] = valor; //insere na primeira posição livre n++; //ajusta a quantidade de elementos } else cout << "Nao havera insercao, pois o elemento ja existe na lista." << endl; } //Impressão dos dados da lista void percorrer(int v[], int n) { for (int i = 0; i < n; i++) cout << " " << v[i]; } // Busca sequencial int buscaSequencial(int v[], int valor, int n) { for (int i = 0; i < n; i++) { if (v[i] == valor) //testa se achou return i; //achou e retorna o índice do valor } return -1; //fracasso - não achei o valor } //Intercalação para listas de tamanhos quaisquer void intercalar(int v[], int w[], int z[], int nv, int nw, int &n) { int i; for ( i = 0; i < nv && i < nw; i++) { z[i*2] = v[i]; z[i*2 + 1] = w[i]; n+=2; } if (i == nw) { for (int j = n; i < nv; j++,i++) { z[j] = v[i]; n++; } } if (i == nv) { for (int j = n; i < nw; i++, j++) { z[j] = w[i]; n++; } } } //Interseção bool intersecao(int v[], int w[], int inter[], int nv , int nw , int &n) { bool achou = false; for (int i = 0; i < nv; i++) for (int j = 0; j < nw; j++) if (v[i] == w[j]) { inter[n] = v[i]; achou = true; n++; } return achou; } void uniao(int v[], int w[], int u[], int nv, int nw , int &n) { bool diferentes= false; if (nv == 0) // se o vetor v está vazio, o resultado da uniao é o vetor w { for (int i = 0; i < nw; i++) u[i] = w[i]; n = nw; return; } //se o vetor v não está vazio for (int i = 0; i < nv; i++) //copia todos os elementos de v para u u[i] = v[i]; n = nv; for (int i = 0; i < nw; i++) { for (int j = 0; j < nv; j++) { if (w[i] != v[j]) diferentes = true; else { diferentes = false; break; } } if (diferentes) { u[n] = w[i]; n++; } } } void removerPeloIndice(int u[], int &nUniao, int posicao) { u[posicao] = u[nUniao - 1]; nUniao--; } DISCIPLINA : Estrutura de Dados 1ª. Lista de Exercícios Elaborada por Prof. Jane Tavares Alvarez da Silva Funções e Operações com listas lineares seqüenciais 1) Considere o programa abaixo e depois dê o que se pede: #include <iostream> #include <cstdlib> using namespace std; void Teste1(int ); void Teste2(int &); int Teste3(int); int x = 20; int main() { int numero = 10, outroNumero; Teste1(numero); cout << "Valor de numero (após Teste1) = " << numero << endl; cout << "X = " << x << endl; Teste2(numero); cout << "Valor de numero (após Teste2) = " << numero << endl; cout << "X = " << x << endl; outroNumero = Teste3(numero); cout << "Valor de outro numero (após Teste3) = " << outroNumero << endl; cout << "X = " << x << endl; system("pause"); } void Teste1(int numero) { numero = numero +x ; x++; } void Teste2(int &numero) { int valor = 100; numero = numero + valor; x++; } int Teste3(int n) { int valor = 200; n = n + valor; x--; return n; } Pede-se: a) Identifique as variáveis globais e locais. Quando identificar uma variável local, especifique o escopo da mesma. b) Identifique, em cada função, o tipo de passagem de parâmetros. c) Mostre, passo a passo, o valor de todas as variáveis, indicando o momento em que as variáveis não mais ocupam espaço na memória. d) Diga o que é impresso na tela Solução : a) Variável global : x Variáveis locais : 1) numero e outroNumero – escopo : main. Veja o trecho : int main() { int numero = 10, outroNumero; //continua 2) numero - escopo : Teste1 3) numero e valor – escopo : Teste2 4) n e valor - escopo : Teste3 b) Função main : Não há passagem de parâmetros Função Teste 1 : Passagem de parâmetro por valor Função Teste 2: Passagem de parâmetro por referência FunçãoTeste 3: Passagem de parâmetro por valor c) Ver com o professor(a). d) 2) Considere listas lineares seqüenciais não ordenadas de inteiros não nulos. Faça um programa para : a) Construir duas listas sem repetição de dados. Para isto, implemente uma função de nome inserirSemRepetir que receba como parâmetros: o vetor de dados, o elemento a ser inserido, a quantidade de elementos no vetor e o tamanho máximo definido para o vetor. Note : Deverão ser emitidas mensagens de erro adequadamente. Será preciso fazer uma busca seqüencial para evitar repetição de dados. A função deverá ser chamada repetidamente para criar cada uma das listas b) Imprimir as listas criadas no item a), implementando uma função de nome percorrer, conforme estudado em aula. c) Intercalar as listas criadas, gerando uma terceira lista sequencial. Por exemplo, a 1ª. lista possui os elementos 10, 34 e 5 e a 2ª. lista possui os elementos 4, 7 e 9. A lista resultante será 10, 4,34,7,5 e 9. d) Gerar uma lista que seja a interseção das listas do item a), como em interseção de conjuntos. e) Imprimir as listas geradas nos itens c) e d), usando a função percorrer. f) Gerar uma lista que seja a união das listas do item a) e depois imprimi-la. g) Remover um elemento da lista gerada no item f) através do índice passado. Para isto, implemente uma função com o seguinte protótipo : void removerPeloIndice(int [], int &, int); Parâmetros : - vetor de elementos - quantidade de elementos no vetor - índice do valor a ser removido Após a leitura do índice, verifique sua validade. Caso não seja válido, emita mensagem de erro na main, caso contrário chame a função para realizar a remoção. Solução : #include <iostream> using namespace std; #define TAM 2 //Protótipos void inserirSemRepetir(int [], int , int &, int ); void percorrer(int [], int); int buscaSequencial(int [], int, int); void intercalar(int [], int [], int [], int, int, int &); bool intersecao(int [], int [], int [], int , int , int &); void uniao(int [], int [], int [], int , int , int &); void removerPeloIndice(int [], int &, int); //Prog. principal int main() { int v[TAM], w[TAM], z[2*TAM], inter[TAM], vetUniao[2*TAM], valor, // valor a ser inserido nv, //quantidade de elementos em v nw, // quantidade de elementos em w nz, nUniao, ninter, posicao; //item a) Criar duas listas com elementos não nulos nv = nw = 0; //inicializa a quantidade de elementos das listas //Criar a 1a. lista com elementos não nulos cout << "\n\n############################################################\n\n"; cout << "Criando a primeira lista : " << endl; while (true) { cout << "Digite um valor nao nulo : "; cin >> valor; if (valor > 0) { inserirSemRepetir(v,valor,nv,TAM); if (nv == TAM) //lista cheia { cout << "Lista cheia. "; break; } } else break; } // fim do while //Criar a 2a. lista com elementos não nulos cout << "\n\n############################################################\n\n"; cout << "Criando a segunda lista : " << endl; while (true) { cout << "Digite um valor nao nulo : "; cin >> valor; if (valor > 0) { inserirSemRepetir(w,valor,nw,TAM); if (nw == TAM) { cout << "Lista cheia. "; break; } } else break; } // fim do while //item b) percorrer, ou seja, imprimir os dados de cada lista cout << "\nLista 1 : " ; //Poderia criticar se existe lista ou não percorrer(v,nv); cout << "\nLista 2 : "; //Poderia criticar se existe lista ou não percorrer(w,nw); //item c) intercalar nz = 0; //inicializa a quantidade de elementos em z intercalar(v,w,z,nv,nw,nz); //Poderia criticar se existe lista ou não cout << "\nLista resultante da intercalacao : " ; percorrer(z,nz); //item e) //item d) interseção ninter = 0; bool achou = intersecao(v,w,inter,nv,nw,ninter); cout << "\nVetor resultante da intersecao : "; if (achou) //verifica se existe interseção percorrer(inter,ninter); //item e) else cout << "\nNao houve intersecao." << endl; //item f)uniao nUniao = 0; uniao(v,w,vetUniao,nv,nw,nUniao); if (nUniao != 0) //testa se existe uniao { cout << "\nVetor resultante da uniao : "; percorrer(vetUniao,nUniao); } else cout << "Lista uniao vazia. "; //item g) remover if (nUniao != 0) { do { cout << "\nDigite o indice do elemento a ser removido do vetor uniao : "; cin >> posicao; if (posicao < 0 || posicao >= nUniao) cout << "ERRO: Indice inexistente." << endl; } while (posicao < 0 || posicao >= nUniao); removerPeloIndice(vetUniao,nUniao, posicao); cout << "\nLista (uniao) apos remocao : ";//Poderia testar lista vazia percorrer(vetUniao,nUniao); } else cout << "\nImpossivel remover dado pelo indice da uniao, pois a lista uniao esta vazia. " << endl; cout << endl << endl; system("pause"); } //Definições das funções //Inserção no final da lista, pois não há ordem alguma. // Note a passagem por referência - uso de & void inserirSemRepetir(int v[], int valor, int &n, int tamanho) { //FAZER !! } //Impressão dos dados da lista void percorrer(int v[], int n) { for (int i = 0; i < n; i++) cout << " " << v[i]; } // Busca sequencial int buscaSequencial(int v[], int valor, int n) { //FAZER } //Intercalação para listas de tamanhos quaisquer void intercalar(int v[], int w[], int z[], int nv, int nw, int &n) { int i; for ( i = 0; i < nv && i < nw; i++) { z[i*2] = v[i]; z[i*2 + 1] = w[i]; n+=2; } if (i == nw) { for (int j = n; i < nv; j++,i++) { z[j] = v[i]; n++; } } if (i == nv) { for (int j = n; i < nw; i++, j++) { z[j] = w[i]; n++; } } } //Interseção bool intersecao(int v[], int w[], int inter[], int nv , int nw , int &n) { //FAZER } void uniao(int v[], int w[], int u[], int nv, int nw , int &n) { bool diferentes = false; if (nv == 0) // se o vetor v está vazio, o resultado da uniao é o vetor w { for (int i = 0; i < nw; i++) u[i] = w[i]; n = nw; return; } //se o vetor v não está vazio for (int i = 0; i < nv; i++) //copia todos os elementos de v para u u[i] = v[i]; n = nv; for (int i = 0; i < nw; i++) { for (int j = 0; j < nv; j++) { if (w[i] != v[j]) diferentes = true; else { diferentes = false; break; } } if (diferentes) { u[n] = w[i]; n++; } } } void removerPeloIndice(int u[], int &nUniao, int posicao) { u[posicao] = u[nUniao - 1]; nUniao--; } DISCIPLINA : Estrutura de Dados 4ª. Lista de Exercícios Elaborada por Prof. Jane Tavares Alvarez da Silva Listas lineares sequenciais com structs 1) Escreva um programa em C++ que leia as informações de clientes de uma livraria (nome, código de identificação do cliente, tipo de leitura preferido e telefone), guardando-as em um vetor de nome CLIENTES, sem qualquer ordem. Seu programa deverá, após a criação do vetor, solicitar opções (via teclado) que podem ser: L (listar): nesse caso deverá ser também solicitado um tipo de leitura (C - Ciência, R - Romance, E - Esoterismo ou O - Outros) e deverão ser listados todos os nomes e telefones de clientes que tenham preferência por esse tipo; O (ordenar): os clientes deverão ser ordenados pelo código de identificação. Obs: Essa opção só é válida uma única vez; B (buscar): deverá ser lida uma identificação e deverão ser mostrados o nome e o tipo de leitura preferida do cliente. Caso ele não seja encontrado, apresente uma mensagem de aviso; F (finalizar): o programa termina. 2) Escreva um programa em C++ que leia as informações de clientes de uma livraria (nome, código de identificação do cliente, tipo de leitura preferido e telefone), guardando-as em um vetor ordenado de nome CLIENTES. Seu programa deverá, após a criação do vetor, solicitar opções (via teclado) que podem ser: 1- Ler uma identificação e buscar o cliente (usar busca binária); 2- Retirar um cliente 3- Listar todos os clientes 4- Terminar o programa GABARITO 1) #include <iostream> #include <cctype> using namespace std; #define TAM 200 /* número máximo de clientes */ typedef struct { char nome[40], tipo, /* tipo de leitura : C, R ou ...*/ tel[13]; int codigo; /* código de identificação */ } FICHA ; /* --------------------------------------------------------------- CÓDIGO DAS FUNÇÕES ------------------------------------------------------------------*/ /* FUNÇÃO DE INCLUSÃO EM LISTA NÃO ORDENADA SEM REPETIÇÃO */ int incluir (FICHA clientes[ ], FICHA f, int &pquant) { if (pquant == TAM) return 0 ; //sinaliza sinal de fracasso - lista cheia clientes[pquant] = f; //atribui a struct inteira a primeira área livre do vetor pquant++; return 1; // sinaliza sucesso } /* BUSCA SEQUENCIAL PELO NÚMERO DE IDENTIFICAÇÃO */ int busca_sequencial(FICHA clientes[], int cod, int quant) { int i ; for (i = 0; i < quant; i++) if (clientes[i].codigo == cod) return i; /* retorna o índice - valor de 0 em diante */ return -1; /* retorna -1 caso não ache o código cod passado */ } /* FUNÇÃO QUE REALIZA BUSCA PELO TIPO DE LEITURA */ void busca_sequencial_tipo(FICHA clientes[],char tipo, int quant_de_clientes) { int i; bool achei = false; /* é falso que achei alguém do tipo passado */ for (i = 0; i < quant_de_clientes; i++) if (clientes[i].tipo == tipo) { cout << "\n CLIENTE ... "; cout << "\n Nome : " << clientes[i].nome << "\n Telefone : " << clientes[i].tel; achei = true ; /* é verdade que achei alguém do tipo passado */ } if (!achei) cout <<"\n Não foi encontrado cliente que goste do tipo indicado."; } /* FUNÇÃO QUE REALIZA BUSCA PELA IDENTIFICAÇÃO E IMPRIME OS DADOS PEDIDOS */ void busca_sequencial_codigo(FICHA clientes[],char cod,int quant_de_clientes) { int i; bool achei = false; /* é falso que achei alguém do tipo passado */ for (i = 0; i < quant_de_clientes; i++) if (clientes[i].codigo == cod) { cout << "\n CLIENTE ..." << "\n Nome : " << clientes[i].nome; switch(clientes[i].tipo) { case 'C' : cout << "\n Tipo de leitura : Ciencia" << endl; break; case 'F' : cout << "\n Tipo de leitura : Ficcao" << endl; break; case 'E' : cout << "\n Tipo de leitura : Esoterismo" << endl; break; case 'R' : cout << "\n Tipo de leitura : Romance" << endl; break; case 'O' : cout << "\n Tipo de leitura : Outros" << endl; break; } achei = true ; /* é verdade que achei alguém do tipo passado */ } if (!achei) cout <<"\n Cliente não cadastrado !"; } void troca (FICHA v[], int i, int j) //Função para auxiliar a ordenação { FICHA aux; aux = v[i]; v[i] = v[j]; v[j] = aux; } void ordenar(FICHA v[], int n) //Realiza a ordenação por seleção { int i, j, menor; for (j = 0; j < n-1; j++) { menor = j; for (i = j+1; i < n; i++) if (v[i].codigo < v[menor].codigo) menor = i; troca(v, j, menor); // chamada para a função troca definida acima } } void listarClientes(FICHA v[], int n) { for (int i = 0; i < n; i++) { cout << "\n CLIENTE ... "; cout << "\n Nome : " << v[i].nome << "\n Telefone : " << v[i].tel << "\n Codigo : " << v[i].codigo << endl; } } /*-------------------------------------------------------------- PROGRAMA PRINCIPAL ---------------------------------------------------------------*/ void main(void) { FICHA clientes[TAM], /* vetor para armazenar as fichas dos clientes */ f ; /* uma ficha */ int quant_de_clientes, /* quantidade de clientes */ i , /* índice */ sinal, /* sinal de sucesso ou fracasso */ codigo ; bool jaOrdenou = false; char resp, /* resposta para continuar ou não o cadastro*/ tipo ; /* tipo de leitura preferida */ cout <<"\t PROGRAMA PARA CADASTRAR CLIENTES E ... \n \n"; /* COMPLETE !! */ quant_de_clientes = 0; /* inicializa a quantidade de clientes */ for ( ; ; ) /* começa um loop quase infinito para cadastrar clientes */ { do { printf ("\n Digite o código do cliente (valor maior que zero): "); cin >> f.codigo; i = busca_sequencial(clientes,f.codigo, quant_de_clientes); if (i >= 0) cout <<" \n Código já existente !"; } while (i >= 0 || f.codigo <= 0); getchar(); //limpa o buffer cout << "\n Nome : "; gets(f.nome); cout << "\n Tel : "; gets(f.tel); cout << "\n Tipo de leitura preferida ..." << "\n Digite C (Ciência) ou R (Romance) ou E (Esoterismo) " << "\n ou F (Ficção) ou O (para outras preferências). "; cout <<"\n Tipo => "; f.tipo = toupper(getchar()); /* toupper converte para maiúscula */ sinal = incluir(clientes, f, quant_de_clientes); if (!sinal) /* se sinal igual a zero significa lista cheia */ { cout <<"\n Lista de clientes já está completa (cheia) !"; break; /* sai do for */ } cout <<"\n Deseja continuar cadastrando clientes ? \n Digite P para parar ou ENTER para continuar "; cout <<"\n Resposta => "; getchar(); resp = toupper(getchar()); if (resp == 'P') break; } /* fim do for */ getchar(); cout <<"\n\n**** MENU DE OPÇÕES ****\n" //Melhore, expondo este menu mais vezes <<" Digite L para listar dados dos clientes segundo o tipo de leitura preferida.\n" <<" Digite O para ordenar as fichas dos clientes pelo código de identificação. \n" <<" Digite B para realizar uma busca pela identificação e mostrar ... \n" <<" Digite F para terminar o programa. \n" <<" Opção => "; resp = toupper(getchar()); getchar(); switch (resp) { case 'L' : cout <<"\n Digite o tipo de leitura preferida ... "; cout <<"\n C (Ciência)- R (Romance) - E (Esoterismo) "; cout <<"\n F (Ficção) - O (para outras preferências). "; cout <<"\n Tipo => "; tipo = toupper(getchar()); busca_sequencial_tipo(clientes,tipo,quant_de_clientes); break; /* sai do switch*/ case 'O' : cout <<"\n Ordenando"; if (!jaOrdenou){ jaOrdenou = true; ordenar(clientes,quant_de_clientes); listarClientes(clientes,quant_de_clientes); } else cout << "Lista de clientes já ordenadas."; break; case 'B' : do{ cout <<"\n Digite um código de cliente que deseja pesquisar. "; cin >> codigo; } while (codigo <= 0); /* código válidos são maiores que zero */ busca_sequencial_codigo(clientes,codigo,quant_de_clientes); break; case 'F' : cout <<"\n Fim do programa ! "; exit(0); default : cout <<"\n Digitou uma opção inválida !"; } /* fim do switch */ cout << endl << endl; } /* fim main */ 2) #include <iostream> #include <cctype> using namespace std; #define TAM 200 //definindo uma constante //Criando um tipo typedef struct { char nome[40], tipo, /* tipo de leitura : C, R ou ...*/ tel[13]; int codigo; /* código de identificação */ } FICHA ; //Protótipos int inserirOrdenada(FICHA [], FICHA , int &, int ); //não trabalha com repetição bool buscaSequencialOrdenada(FICHA [], float, int &, int); void percorrer(FICHA [], int); int buscaBinaria(FICHA [], int , int ); void removerOrdenada(FICHA [], int , int & ); //Prog. principal int main() { FICHA clientes[TAM], f; char resp; int n, // número de elementos codigo, sinal, opcao; // opção do menu n = 0; //inicializa a quantidade de elementos da lista cout << "\t\tCadastando clientes " << endl<< endl; for ( ; ; ) /* começa um loop quase infinito para cadastrar clientes */ { cout << "Cliente " << (n+1) << " : " << endl; cout << "\n Digite o codigo do cliente (valor maior que zero): "; cin >> f.codigo; getchar(); cout << "\n Nome : "; gets(f.nome); cout << "\n Tel : "; gets(f.tel); cout << "\n Tipo de leitura preferida ..." << "\n Digite C (Ciência) ou R (Romance) ou E (Esoterismo) " << "\n ou F (Ficção) ou O (para outras preferências). "; cout <<"\n Tipo => "; f.tipo = toupper(getchar()); /* toupper converte para maiúscula */ sinal = inserirOrdenada(clientes,f,n,TAM); if (sinal == -1) /* se sinal igual a zero significa lista cheia */ { cout <<"\n Lista de clientes já está completa (cheia) !"; break; /* sai do for */ } else if (sinal == 0) cout << "Cliente ja cadastrado. " << endl; cout <<"\n Deseja continuar cadastrando clientes ? \n Digite P para parar ou ENTER para continuar "; cout <<"\n Resposta => "; getchar(); resp = toupper(getchar()); if (resp == 'P') break; cout << endl; } /* fim do for */ while (true) { cout << "\n\n############################################################\n\n"; cout << "\t\t\t Menu" << endl << endl; cout << "1- Buscar cliente pelo codigo(busca binaria) \n2- Remover cliente pelo codigo(remocao ordenada) " << "\n3- Percorrer a lista de clientes" << "\n4- Terminar o programa " << endl << endl; cout << "Opcao = > "; cin >> opcao; switch (opcao) { case 1 : int posicao; cout << "Codigo do cliente a ser procurado ? "; cin >> codigo; posicao = buscaBinaria(clientes,codigo,n); if (posicao < 0) cout << "Cliente nao encontrado. " << endl; else cout << "Cliente " << clientes[posicao].nome << " encontrado. " << endl; break; case 2 : cout << "Forneca o codigo do cliente a ser removido : "; cin >> codigo; removerOrdenada(clientes,codigo,n); break; case 3 : cout << "\nLista resultante: " << endl; percorrer(clientes,n); // a lista possui n elementos break; case 4 : cout << "\n\a\aFIM DO PROGRAMA." << endl << endl; break; default : //será a última opção sempre. Não se esqueça !!! cout << "ERRO : opcao invalida." << endl; } //fim do switch if (opcao == 4) break; //sai do while } // fim do while system("pause"); } // Definições das funções bool buscaSequencialOrdenada(FICHA v[], int cod, int & pos, int n) { int i; for (i = 0; i < n && cod > v[i].codigo;i++); pos = i; if (i == n || cod != v[i].codigo) return false; return true; } // Inserção de forma ordenada - mantém a ordem crescente dos dados pelos códigos. // Note que a inserção é sem repetição. //Portanto, não será inserido cliente já existente na lista. int inserirOrdenada(FICHA v[], FICHA f, int &n, int tamanho) { int posicao; if (tamanho == n) // testa se a lista está cheia { return -1; // sai da função – retorna sinal de fracasso } if (buscaSequencialOrdenada(v,f.codigo,posicao, n) == true) { return 0; //sai da função – outro sinal de fracasso } // Se a função não terminar com qualquer return acima, teremos mesmo // assim, a posição de inserção armazenada na variável posicao // Logo abaixo, posicao representa a posição onde o valor deveria // estar na lista, mas não está. for (int i = n; i > posicao; i--) v[i] = v[i-1]; v[posicao] = f; n++; return 1; } //Impressão dos dados da lista - não importa se a lista está ou não ordenada void percorrer(FICHA v[], int n) { for (int i = 0; i < n; i++) { cout << "Codigo : " << v[i].codigo << endl << "Nome : " << v[i].nome << endl << endl << "Telefone : " << v[i].tel << endl; // Coloque a impressão do tipo de leitura } } // Busca binária - apenas para listas ordenadas int buscaBinaria(FICHA v[], int codigo, int n) { int ini = 0, fim = n-1, meio; while (ini <= fim) { meio = (ini + fim) / 2; if (v[meio].codigo == codigo) return meio; if (codigo < v[meio].codigo) fim = meio - 1; else ini = meio + 1; } return -1; } //Remoção Ordenada void removerOrdenada(FICHA v[], int codigo, int& n) { int posicao; if (n == 0) { cout << "Lista vazia." << endl; return; //sai da função } if (buscaSequencialOrdenada(v,codigo,posicao,n) == false) { cout << codigo << " não encontrado. Cliente inexistente. " << endl; return; //sai da função } n--; //decrementa a quantidade de fichas for (int i = posicao; i < n; i++) v[i]= v[i+1]; cout << "Sucesso na remoção. " << endl; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// Ponteiro 3) Considere struct caixa { char c; // refere-se a cor : P (preta) ou B (branca) float preco; } ; caixa *p, *q, *r; caixa x, y, z; Assinale V (verdadeiro) ou F (falso). Caso seja verdadeiro, exemplifique com ilustração gráfica, mas se for falso, reescreva uma possível forma correta. a) r = &x; b) p = r; c) q = y; d) r = NULL; e) p = *x; f) *q = NULL; g) *p = *x; h) z.c = ‘B’; i) rpreco = 12.99; j) p.preco = 99.99; k) (*p)c = ‘P’; GABARITO a) (V) x r b) (V) x r p c) (F) CERTO : q = &y; d) (V) e) (F) CERTO : p = &x; f) (F) CERTO: q = NULL; g) (F) CERTO : *p = x; h) (V) z B i) ( V ) 12.99 r p j) ( F) CERTO : ppreco = 99.99; k) (F) CERTO : pc = ‘P’; DISCIPLINA : Estrutura de Dados – Professora : Jane GABARITOS AULA 1 : FEITO EM AULA, no quadro. Por favor, pegue com quem estava em aula. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// AULA 2 : Faça um programa que crie uma lista de inteiros distintos, através de sucessivas inserções e depois a apresente na saída padrão. Implemente funções para : è Inserir um valor, sem que haja repetição. Para isto, será preciso fazer uma busca seqüencial e inserir o valor passado apenas se o mesmo não for encontrado na lista. Seja void inserirSemRepetir(int [], int , int &, int); Parâmetros: Vetor de dados, elemento a ser inserido, quantidade de dados existentes no vetor e a quantidade máxima alocada para o vetor. Obs.: Obs.: A função buscarSequencial deverá ser chamada dentro da inserirSemRepetir e consequentemente, implementada no programa è Percorrer a lista, imprimindo-a na saída padrão. Seja void percorrer(int [], int ); // Receberá o vetor e a quantidade de dados Solução : #include <iostream> using namespace std; #define TAMANHO 5 //define uma constante TAMANHO que vale 5 //Protótipos void percorrer(int v[], int n); void inserirSemRepeticao(int v[], int valor, int &n, int tamanho); int buscaSequencial(int v[], int valor, int n); //Prog. principal int main() { int v[TAMANHO], valor, //valor a ser inserido em v n, //quantidade de elementos existentes no vetor v posicao; //armazena o inteiro retornado pela função buscaSequencial char resposta; cout << "CRIANDO UMA lista sequencial COM NO MAXIMO " << TAMANHO << " ELEMENTOS." << endl; n = 0; //iniciliza a quantidade de elementos em v while (true) { cout << "Digite um valor : "; cin >> valor; inserirSemRepeticao(v,valor,n,TAMANHO); //chama a função if (n == TAMANHO) { cout << "AVISO : Lista cheia. " << endl; break; //sai do while } cout << "Deseja parar ? Digite P/p para parar ou C/c para continuar ===>>> "; getchar(); //limpa o buffer cin >> resposta; if (resposta == 'P' || resposta == 'p') break; //sai do while } //fim do while cout << "\n\nImprimindo os dados da lista sem repeticoes : "; percorrer(v,n); //chama a função percorrer cout << endl; system("pause"); } //fim do programa principal //Definições das funções void percorrer(int v[], int n) { for (int i = 0; i < n; i++) cout << " " << v[i]; } int buscaSequencial(int v[], int valor, int n) { for (int i = 0; i < n; i++) if (v[i] == valor) //testa se o valor está em v return i; //retorna o índice do valor em v e sai da função //Note que dentro do for só existe o if e dentro do if só existe o return i; return -1; //sai da função retornando um valor impossível para índice. } void inserirSemRepeticao(int v[], int valor, int &n, int tamanho) { int posicao; if (n == tamanho) return; //sai da função - lista cheia posicao = buscaSequencial(v,valor,n); if (posicao < 0) //se não achou o valor em v { v[n] = valor; // insere no final, visto que não ordem. n++; // ajusta a quantidade de elementos em v } else cout << "ERRO: Valor ja existente. " << endl; } //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// AULA 3 : Crie uma lista não ordenada de inteiros, ordene-a pelo bubblesort e depois ofereça um menu com as opções : 1- inserir em lista ordenada 2-remover de lista ordenada 3- pesquisa binária 4 - apresentar os dados da lista 5- terminar o programa. Considerações : è Implementar uma função para cada operação indicada no menu. è Após a implementação e teste do programa, você poderá melhorá-lo, fazendo o menu se repetir várias vezes. (em casa) è Não se esqueça de emitir mensagens de erro para as situações críticas, como por exemplo, lista vazia e lista cheia, entre outras. Solução : #include <iostream> using namespace std; #define TAM 10 //protótipos bool inserirSemOrdem(int [], int , int &, int ); bool inserirOrdenada(int [], int , int &, int ); bool removerOrdenada(int [], int , int &); int buscaBinaria(int [], int , int); void imprimir(int [], int); void bubblesort(int [], int ); //////////////// Programa principal ///////////////////////////////////////// int main() { int v[TAM], //declara um vetor com capacidade para TAM elementos inteiros n , // quantidade de dados em v valor, // valor para inserção opcao, // opção do menu posicao; //variavel que armazenará o retorno da busca char resposta; //indica se continuará criando a lista ou não bool sinal; //serve para sinalizar se houve ou não inserção ou remoção n = 0; // inicializa a quantidade de dados da lista cout << "\tCRIANDO UM VETOR DE ELEMENTOS INTEIROS QUAISQUER SEM ORDEM ALGUMA" << endl; while (true) { cout << "\nValor para insercao (sem ordem) ? "; cin >> valor; sinal = inserirSemOrdem(v,valor,n,TAM); if (sinal == false) //indica lista cheia - é falso que inseriu break; //sai do while se a lista estiver cheia getchar(); //limpa o buffer de entrada cout << "Digite P/p para PARAR ou C/c para CONTINUAR => "; cin >> resposta; if (resposta == 'P' || resposta == 'p') break; } //fim do while cout << "\nOrdenando a lista pelo bubblesort .... " << endl; bubblesort(v,n); do { cout << "\n################################################# " << endl << endl; cout << "\t\t\tMENU" << endl; cout << "1 - Inserir ordenada \n2 - Remover Ordenada \n3 - Pesquisa binaria " << "\n4 - Apresentar os dados da lista \n5 - Terminar o programa. " << endl; cout << "\nOPCAO => "; cin >> opcao; switch (opcao) { case 1 : cout << "Inserindo em lista ja ordenada ... " << endl; cout << "Digite um valor para adicionar à lista : "; cin >> valor; sinal = inserirOrdenada(v,valor, n, TAM); if (sinal == false) cout << "ERRO : insercao com fracasso. " << endl; break; case 2 : cout << "Removendo de lista ordenada .... " << endl; cout << "Digite um valor remover da lista : "; cin >> valor; sinal = removerOrdenada(v,valor, n); if (sinal == false) cout << "ERRO : remocao com fracasso. " << endl; break; case 3 : cout << "Digite um valor para busca : "; cin >> valor; posicao = buscaBinaria(v,valor,n); if (posicao < 0) cout << "\nERRO : " << valor << " nao encontrado. " << endl; else cout << "\nEncontrado o valor " << valor << " na posicao " << posicao << endl; break; // sai do switch case 4: cout << "\nDados da lista : " << endl; imprimir(v,n); break; case 5 : cout << "\nFIM DO PROGRAMA." << endl << endl; break; default : cout << "ERRO : Opcao invalida. " << endl; } //fim do switch } while (opcao != 5); cout << endl << endl; system("pause"); }// FIM DA MAIN //Definições das funções bool inserirSemOrdem(int v[], int valor, int &n, int tamanho) { if (tamanho == n) { cout << "ERRO: Lista cheia."; return false; //sinaliza lista cheia } else { v[n] = valor; //ADICIONA NO FIM DO VETOR n++; //ajusta a quantidade de elementos no vetor return true; //sinaliza lista não cheia } } bool inserirOrdenada(int v[], int valor, int &n, int tam) { int i, posicao; if(n == tam) // testa se o vetor está cheio { cout << "ERRO : Lista cheia." << endl; return false; // entenda o uso de return desta forma } // Procura a posição de inserção i = 0; while (valor > v[i] && i < n) i++; // armazena a posição onde o valor deverá ser armazenado posicao = i; // Desloca os elementos, mantendo a ordem for (i = n; i > posicao; i--) v[i] = v[i-1]; // Insere na posição de inserção v[posicao] = valor; // Incrementa a quantidade n++; return true; } bool removerOrdenada(int v[], int valor, int &n) { int i, posicao; if (n == 0) // testa se o vetor está vazio { cout << "ERRO : Lista vazia." << endl; return false; } posicao = buscaBinaria(v,valor,n); //chamada para a busca binária if (posicao < 0) { cout << "ERRO : Elemento não encontrado." << endl; return false; } // decrementa a quantidade de elementos da lista, já que 1 sairá n--; // desloca os elementos, ajustando a lista for (i = posicao; i < n; i++) v[i] = v[i+1]; return true; } int buscaBinaria(int v[], int valor, int n) { int ini = 0, // inicializa o início do intervalo para a busca fim = n -1, // inicializa o fim da intervalo meio; // armazenará o índice do meio do intervalo while (ini <= fim) { meio = (ini + fim)/2; // determina o meio do intervalo if (v[meio] == valor) //testa se o valor está no meio do vetor return meio; if (valor < v[meio]) //testa se o valor vem antes do meio do vetor fim = meio -1; //redefine o fim, caso o valor possa estar antes do meio else ini = meio+1; //redefine o ini, caso o valor possa estar depois do meio } return -1; // não achou o valor no vetor } void imprimir(int v[], int n) { for (int i = 0; i < n; i++) cout << " " << v[i]; } // ordenaçãovoid bubblesort(int v[], int n) // n é o no. de elementos em v { int i , // índice fim = n - 1, aux; //auxiliar para troca bool trocou = true; // é verdade que trocou - artifício para entrar no loop while (trocou) { trocou = false; // sinaliza que é falso que trocou for (i = 0; i < fim; i++) { if (v[i] > v[i+1]) { aux = v[i]; v[i] = v[i+1]; v[i+1] = aux; trocou = true; } // fim if } // fim for fim--; // decrementa o fim } // fim while } // fim da função AULA 4 : Use seu programa anterior (aula 3 - anterior) e ofereça um menu com as seguintes opções : 1 – Ordenação por troca (Bubblesort) 2- Ordenação por seleção 3- Ordenação por inserção Dessa forma, o usuário poderá escolher a ordenação antes de ir para o 2º. Menu. Note que, uma vez escolhido o método de ordenação, a função adequada deverá ser chamada e executada. Ao final, exiba a lista ordenada pelo método escolhido. Solução : Para a solução desta tarefa, pegue todo o programa da aula 3 e acrescente o que for indicado a seguir : Nos protótipos, adicione : void ordenaSelecao(int v[], int n) ; void ordenaInsercao(int v[], int n); Nas definições das funções, adicione : void ordenaInsercao(int v[], int n) // n é o número de elementos em v { int i, j, aux; for (j = 1; j < n; j++) for (i=j; i > 0 && v[i-1]> v[i]; i--) { aux = v[i-1]; v[i-1] = v[i]; v[i] = aux; } } void ordenaSelecao(int v[], int n) { int i, j, menor, aux; for (j = 0; j < n-1; j++) { menor = j; for (i = j+1; i < n; i++) if (v[i] < v[menor]) menor = i; aux = v[j]; v[j] = v[menor]; v[menor] = aux; } } Dentro da main, substitua o trecho cout << "\nOrdenando a lista pelo bubblesort .... " << endl; bubblesort(v,n); por : int ordenou; cout << "\n################################################# " << endl << endl; cout << "\t\t\tMENU 1 : ESCOLHENDO UMA ORDENACAO" << endl; cout << "1 - BUBBLESORT \n2 - ORDENACAO POR INSERCAO \n3 - ORDENACAO POR SELECAO." << endl; cout << "\nOPCAO => "; cin >> opcao; ordenou = 0; //sinaliza que nao houve ordenação switch (opcao) { case 1 : cout << "Ordenando por trocas ... metodo bubblesort " << endl; bubblesort(v,n); ordenou = 1; //sinaliza que houve ordenação break; case 2 : cout << "Ordenacao por insercao " << endl; ordenaInsercao(v,n); ordenou = 1; //sinaliza que houve ordenação break; case 3 : cout << "Ordenacao por selecao " << endl; ordenaSelecao(v,n); ordenou = 1; //sinaliza que houve ordenação break; default : cout << "AVISO : NENHUMA ORDENACAO SELECIONADA. " << endl; } //fim do switch No case 3 (2º. Menu) , adicione o trecho em azul : case 3 : if (ordenou == 1) //se é verdade que ordenou { cout << "Digite um valor para busca : "; cin >> valor; posicao = buscaBinaria(v,valor,n); if (posicao < 0) cout << "\nERRO : " << valor << " nao encontrado. " << endl; else cout << "\nEncontrado o valor " << valor << " na posicao " << posicao << endl; } else cout << "ERRO : a lista não foi ordenada. "<< endl; break; // sai do switch Aviso geral : Se achar necessário, use este mesmo raciocínio para algum outro trecho do programa, ok ? DISCIPLINA : Estrutura de Dados 3ª. Lista de Exercícios Elaborada por Prof. Jane Tavares Alvarez da Silva FILA FILA SEQUENCIAL SIMPLES 1) Faça um programa em C++ para apresentar um menu várias vezes, com as seguintes opções : MENU 1- Enfileirar um número inteiro positivo. 2- Desenfileirar tudo e imprimir apenas os valores que são múltiplos de 5. 3- Terminar o programa Implemente, adequadamente, cada opção fornecida. 2) Faça um programa em C++ para ler uma sequência de caracteres (vetor de char) e enfileirá-los. Em seguida, desenfileire todos os caracteres e empilhe-os em uma pilha P seguindo as orientações: Converta as letras para maiúsculas antes de empilhá-las Qualquer outro caracter, empilhe sem alteração. Ao final, desempilhe tudo, exibindo o resultado na saída padrão. FILA SEQUENCIAL CIRCULAR 3) Faça um programa em C++ para apresentar um menu várias vezes, com as seguintes opções : MENU 1- Enfileirar um valor inteiro não nulo 2- Desenfileirar um valor, exibindo na tela o seu dobro 3- Desenfileirar tudo, exibindo os valores desenfileirados sem alterações 4- Terminar o programa Implemente, adequadamente, cada opção fornecida usando funções para enfileirar e desenfileirar. 4) Faça um programa que leia um vetor de char e enfileire seus dados em duas filas : fila A (fila simples – de char ) e fila B (fila circular com contador – de inteiros) da seguinte forma: Se o caracter for dígito, converta-o para dígito e enfileire-o em B. Se o caracter for letra, enfileire-o em A. Qualquer outro caracter não deverá ser enfileirado. Ao final, desenfileire as filas B e A, nesta ordem, exibindo os seus dados. DISCIPLINA : Estrutura de Dados 4ª. Lista de Exercícios Elaborada por Prof. Jane Tavares Alvarez da Silva Listas lineares sequenciais com structs 1) Escreva um programa em C++ que leia as informações de clientes de uma livraria (nome, código de identificação do cliente, tipo de leitura preferido e telefone), guardando-as em um vetor de nome CLIENTES, sem qualquer ordem. Seu programa deverá, após a criação do vetor, solicitar opções (via teclado) que podem ser: L (listar): nesse caso deverá ser também solicitado um tipo de leitura (C - Ciência, R - Romance, E - Esoterismo ou O - Outros) e deverão ser listados todos os nomes e telefones de clientes que tenham preferência por esse tipo; O (ordenar): os clientes deverão ser ordenados pelo código de identificação. Obs: Essa opção só é válida uma única vez; B (buscar): deverá ser lida uma identificação e deverão ser mostrados o nome e o tipo de leitura preferida do cliente. Caso ele não seja encontrado, apresente uma mensagem de aviso; F (finalizar): o programa termina. 2) Escreva um programa em C++ que leia as informações de clientes de uma livraria (nome, código de identificação do cliente, tipo de leitura preferido e telefone), guardando-as em um vetor ordenado de nome CLIENTES. Seu programa deverá, após a criação do vetor, solicitar opções (via teclado) que podem ser: 1- Ler uma identificação e buscar o cliente (usar busca binária); 2- Retirar um cliente 3- Listar todos os clientes 4- Terminar o programaPonteiro 3) Considere struct caixa { char c; // refere-se a cor : P (preta) ou B (branca) float preco; } ; caixa *p, *q, *r; caixa x y, z; Assinale V (verdadeiro) ou F (falso). Caso seja verdadeiro, exemplifique com ilustração gráfica, mas se for falso, reescreva uma possível forma correta. a) r = &x; b) p = r; c) q = y; d) r = NULL; e) p = *x; f) *q = NULL; g) *p = *x; h) z.c = ‘B’; i) rpreco = 12.99; j) p.preco = 99.99; k) (*p)c = ‘P’; DISCIPLINA : Estrutura de Dados 5ª. Lista de Exercícios Elaborada por Profa Jane Tavares Alvarez da Silva Listas Lineares Simplesmente Encadeadas (não circulares) Faça um programa em C++ com listas simplesmente encadeadas de inteiros, em que seja solicitada uma quantidade n de nós para a lista. Note que n deve ser um número maior ou igual a zero . Após esta entrada, faça o que se pede: 1) Escreva uma função em C++ para inserir um valor inteiro no início da lista. Esta função deverá ser chamada na main, de dentro de um loop, para que seja construída uma lista com n nós. Não se esqueça de inicializar a lista. Protótipo da função : no* insereFrente(no *, int ); Parâmetros : Ponteiro para o início da lista e o valor inteiro a ser inserido ou adicionado. Retorno : Ponteiro para o início da lista 2) Escreva uma função em C++ para percorrer uma lista simplesmente encadeada e imprimir na tela, todos os seus dados. Protótipo da função : void imprimir(no *); Parâmetro : Ponteiro para o início da lista Retorno : Não há 3) Escreva uma função em C++ para substituir o valor de um nó passado, por um novo valor também informado. Considerando que o 1º. nó é o nó 1, o 2º. nó é o nó 2 e assim, sucessivamente, deverão ser passados como parâmetros : o ponteiro para o início da lista, o no. do nó que sofrerá a substituição e o novo valor. Note que, esta função não retornará valor algum. Considere que ao ser lido, na main, o no. do nó que sofrerá a substituição, este no. deverá ser criticado/testado para que a função somente seja chamada quando o número do nó for maior que zero e menor ou igual que a quantidade de nós da lista. Protótipo da função : void substituir(no *, int , int novoValor); 4) Escreva uma função em C++ para remover o 1º. nó de uma lista simplesmente encadeada não vazia, eliminando-o. Teste, na main, se a lista está vazia e emita mensagem adequada para este caso. Parâmetro: ponteiro para o início da lista Retorno : ponteiro para a lista Note que, neste exercício, não se está interessado no valor armazenado no nó removido, que deve ser eliminado. 5) Escreva uma função em C++ para realizar uma busca ou pesquisa seqüencial na lista, retornando NULL (fracasso na busca) ou o endereço do nó com o valor encontrado (sucesso na busca). Parâmetros: ponteiro para o início da lista e valor a ser procurado Retorno : NULL (fracasso na busca) ou o endereço do nó com o valor encontrado (sucesso na busca). Note que, neste exercício, não se está interessado no valor armazenado no nó removido, que deve ser eliminado. 6) Faça uma função em C++ para contar o número de nós de uma lista simplesmente encadeada qualquer, ou seja, a lista pode estar vazia ou não. Protótipo : int contaNos(no *); Retorno : A quantidade de nós da lista, que pode ser zero. 7) Escreva uma função em C++ para inserir um valor inteiro no fim da lista. Esta função deverá ser chamada na main de dentro de um loop, para que seja construída uma lista com m nós. Não se esqueça de ler a quantidade m de nós e de inicializar a lista. Note que, m dever ser maior ou igual a zero . Protótipo da função : no* insereFim(no *, int ); Parâmetros : Ponteiro para o início da lista e o valor inteiro a ser inserido (ou adicionado). Retorno : Ponteiro para o início da lista 8) Escreva uma função em C++ para remover o último nó de uma lista. Protótipo da função : no* removeFim(no *); Parâmetros : Ponteiro para o início da lista Retorno : Ponteiro para a lista 9) Escreva uma função em C++ para concatenar as duas listas construídas até agora, colocando a lista com m nós no final da lista com n nós. Protótipo : no *concatena(no *, no *); Parâmetros : Ponteiro para o início da 1ª. lista (que pode ser NULL) e ponteiro para o início da 2ª. lista (que pode ser NULL). Retorno : Ponteiro para o início da lista resultante da concatenação Após a chamada desta função na main, imprima os dados da lista resultante da concatenação. DISCIPLINA : Estrutura de Dados 6ª. Lista de Exercícios Elaborada por Profa Jane Tavares Alvarez da Silva Fila dinâmica 1. Faça um programa em C++ para criar uma fila dinâmica de inteiros positivos, através de sucessivas inserções ou enfileiramentos. Ao ser digitado um valor negativo ou nulo, a criação da fila deverá ser encerrada. Não esqueça de tratar fila vazia. Após a criação da fila, faça o que se pede : a) Imprima na tela os dados da fila. b) Desenfileire um valor, apresentando-o na tela, após a mensagem “Elemento desenfileirado “. c) Conte o número de dados da fila. d) Desenfileire tudo, apresentando na tela apenas os dados pares. 2. Faça um programa em C++ para ler a quantidade n de alunos de uma fila dinâmica, sendo que cada aluno é caracterizado pela matrícula (int) e pela média. Uma vez determinado n, que deve ser maior ou igual a zero, enfileire n alunos, solicitando seus dados. Logo em seguida, faça o que se pede : a) imprima todos os dados, de todos os alunos. b) desenfileire todos os alunos, imprimindo na tela a matrícula dos que possuem média superior ou igual a 5. DISCIPLINA : Estrutura de Dados 7ª. Lista de Exercícios Elaborada por Profa Jane Tavares Alvarez da Silva Lista Circular Simplesmente Encadeada 1) Diga o que faz a função Descobrir, que recebe um ponteiro para o último nó de uma lista circular simplesmente encadeada, que pode ser vazia. Em cada caso, dê um exemplo com ilustrações gráficas. Considere o tipo no, já definido em aula. no *Descobrir(no *a, int valor) { no *aux; aux = new no; auxdado = valor; if (a == NULL) { a = aux; alink = a; } else { auxlink = alink; alink = aux; } return a; } // fim da função 2) Faça um programa (aplicação) em C++ para ler a quantidade n de nós de uma lista circular simplesmente encadeada de inteiros, sendo n ≥ 0. A lista deverá ser construída com n nós, através de sucessivas inserções no final. Após sua criação, a lista deverá ser impressa, se possível. Emita mensagem de erro em caso de lista vazia. Nesta questão, implemente 2 funções/operações : a) no *insereFim(no *p, int valor); p aponta para o primeiro nó da lista e valor é o elemento a ser inserido no final da lista. b) void imprime(no *p); 3) Considerando o programa do item 2) acima, em que o ponteiro externo aponta para o primeiro nó da lista (nó mais à esquerda), implemente as seguintes operações (funções) com a lista criada : a) Remova o primeiro nó da lista, imprimindo-a ao final. b) Remova o último nó da lista, imprimindo-a ao final. c) Conte o número de nós da lista d) Procure na lista um valor passado, realizando uma busca ou pesquisa seqüencial. A função deverá retornar NULL ou o endereço do nó com o valor encontrado. DISCIPLINA : Estrutura de Dados 8ª. Lista de Exercícios Elaborada por Profa Jane Tavares Alvarez da Silva Lista Duplamente Encadeada 1) Considere uma lista duplamente encadeada apontada por um ponteiro x e ainda, um nó fora da lista, apontado por um ponteiro p. Sabendo que x aponta para qualquer nó da lista, faça o que se pede : a) Diga o que faz a função Eureka
Compartilhar