A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

CES-11 ALGORITMOS E ESTRUTURAS DE DADOS Aulas Práticas – 2017

Apresentações semelhantes


Apresentação em tema: "CES-11 ALGORITMOS E ESTRUTURAS DE DADOS Aulas Práticas – 2017"— Transcrição da apresentação:

1 CES-11 ALGORITMOS E ESTRUTURAS DE DADOS Aulas Práticas – 2017
Capítulo II Listas Lineares

2 Exercício 2.1: Armazenamento de conjuntos de números inteiros
Conjuntos de números inteiros podem ser armazenados em listas lineares Seja o seguinte conjunto universo: { } Pode haver conjuntos menores formados por elementos não repetidos deste conjunto

3 Seu armazenamento numa lista linear:
Exemplo: C = { } Seu armazenamento numa lista linear: A entrada de um conjunto como dado em um programa envolve: Digitação e leitura Filtragem das duplicatas e dos elementos que não pertencem ao conjunto universo Armazenamento numa estrutura de dados lista linear 7 16 3 9 12 C

4 Seja o seguinte esqueleto de programa:
/* Inclusao de bibliotecas da linguagem */ #include <stdio.h> #include <stdlib.h> #include <conio.h> /* Declaracoes de conjunto em estrutura contigua */ typedef struct Conjunto Conjunto; struct Conjunto { int Elementos[21], nelem; }; typedef int posicao;

5 /* Prototipos dos operadores do TAD conjunto */
void InicConjunto (Conjunto *); posicao Primeira (Conjunto); posicao Proxima (posicao); posicao Fim (Conjunto); int Elemento (posicao, Conjunto); void InserirNoFinal (int, Conjunto *); posicao Local (int, Conjunto); /* Prototipos de funcoes independentes da estrutura */ Conjunto FormarConjunto (void); void EscreverConjunto (Conjunto); /* Prototipos de outras funcoes */ void Erro (char *); InicConjunto: deixa lista-conjunto vazia, pronta para receber inserções, etc.

6 /* Funcao main */ int main () { char c; Conjunto C1; printf ("Armazenar conjunto? (s/n): "); do c = getche(); while (c!='s' && c!='n' && c!='S' && c!='N'); while (c=='S' || c=='s') { C1 = FormarConjunto (); printf ("\n"); EscreverConjunto (C1); printf ("\n\n"); } printf ("\n\n"); system ("pause"); return 0;

7 /* Definicoes de funcoes independentes da estrutura */
/* FormarConjunto: digitacao e armazenamento dos elementos de um conjunto, eliminando os elementos fora do intervalo [ ] e os elementos repetidos; retorna o conjunto armazenado */ Conjunto FormarConjunto () { Conjunto C; int i, n, elem; InicConjunto (&C); printf ("\n\n\tDigite o numero de elementos: "); scanf ("%d", &n); if (n > 0) { printf ("\n\tDigite os %d elementos: ", n); for (i = 1; i <= n; i++) { scanf ("%d", &elem); if (elem >= 1 && elem <= 20 && Local (elem, C) == Fim (C)) InserirNoFinal (elem, &C); } return C;

8 Exemplo: caso C1 seja a seguinte lista linear:
/* Definicoes de funcoes independentes da estrutura */ /* EscreverConjunto: escreve os elementos de um conjunto*/ void EscreverConjunto (Conjunto C) { posicao p; printf ("{"); for (p = Primeira (C); p != Fim (C); p = Proxima (p)) printf ("%3d", Elemento (p, C)); printf ("}"); } Exemplo: caso C1 seja a seguinte lista linear: Será escrito no vídeo: { } 7 16 3 9 12 C1

9 /* Definicoes de outras funcoes */
/* Funcao para emitir mensagens de erro */ void Erro (char *s) { printf ("\t***** Erro: %s *****\n", s); }

10 Tarefa do Exercício 2.1: escrever as funções operadoras do TAD-lista-conjunto:
InicConjunto, Primeira, Proxima, Fim, Elemento, Local e InserirNoFinal A estrutura é a contígua Consultar os slides do Capítulo II da Apostila Teórica

11 Exercício 2.2: Cálculo da união de 2 conjuntos
Exemplo: sejam os seguintes conjuntos C1 e C2: C1 = { } C2 = { } C = Uniao (C1, C2) = { } O cálculo do conjunto união inclui: Copiar C1 em C Inserir em C todo elemento de C2 que não estiver em C1

12 Exercício 2.2: Cálculo da união de 2 conjuntos
Acrescentar ao programa: /* Prototipos dos operadores do TAD conjunto */ void InicConjunto (Conjunto *); posicao Primeira (Conjunto); posicao Proxima (posicao); posicao Fim (Conjunto); int Elemento (posicao, Conjunto); void InserirNoFinal (int, Conjunto *); void Copiar (Conjunto *, Conjunto); posicao Local (int, Conjunto); 12

13 Exercício 2.2: Cálculo da união de 2 conjuntos
Acrescentar ao programa: /* Prototipos de funcoes independentes da estrutura */ Conjunto FormarConjunto (void); void EscreverConjunto (Conjunto); Conjunto Uniao (Conjunto, Conjunto); 13

14 /* Funcao main */ int main () { char c; printf ("Uniao de 2 conjuntos? (s/n): "); do c = getche(); while (c != 's' && c != 'n' && c != 'S' && c != 'N'); while (c == 'S' || c == 's') { OperacaoUniao (); } printf ("\n\n"); system ("pause"); return 0; A função OperacaoUniao solicita os dados sobre dois conjuntos e chama a função Uniao, que constrói o conjunto-união entre eles (deixa a função main mais compacta).

15 /* Funcao OperacaoUniao */
void OperacaoUniao () { Conjunto C1, C2, C; printf ("\n\nCalculo da uniao de 2 conjuntos\n\n"); printf ("Primeiro Conjunto:\n"); C1 = FormarConjunto (); printf ("\nSegundo Conjunto:\n"); C2 = FormarConjunto (); C = Uniao (C1, C2); printf ("\nUniao ("); EscreverConjunto (C1); printf (", "); EscreverConjunto (C2); printf (") = "); EscreverConjunto (C); printf ("\n\n"); }

16 Escrever a função Copiar, que é operadora do TAD lista-conjunto
/* Uniao: retorna o conjunto uniao dos dois conjuntos fornecidos como argumentos */ Conjunto Uniao (Conjunto C1, Conjunto C2) { Conjunto C; posicao p; int elem; InicConjunto (&C); Copiar (&C, C1); for (p = Primeira (C2); p != Fim (C2); p = Proxima (p)) { elem = Elemento(p, C2); if (Local (elem, C1) == Fim (C1)) InserirNoFinal (elem, &C); } return C; Escrever a função Copiar, que é operadora do TAD lista-conjunto A estrutura é a contígua

17 Intersecção({4 5 12 10 8},{3 12 10 7 4 9}) = {4 12 10}
Exercício 2.3: Incluir no programa um menu com as operações: Intersecção de 2 conjuntos Intersecção({ },{ }) = { } Diferença de 2 conjuntos Diferenca({ },{ }) = {5 8} Complemento de 1 conjunto Complemento({ }) = { }

18 Exemplo de saída com menu de operações:
Operacao com conjuntos? (s/n): s Operacoes: U: Uniao I: Interseccao D: Diferenca C: complemento Digite a opcao: u

19 Calculo da uniao de 2 conjuntos
Primeiro Conjunto: Digite o numero de elementos: 5 Digite os 5 elementos numa soh linha: Segundo Conjunto: Digite o numero de elementos: 4 Digite os 4 elementos numa soh linha: Uniao ({ }, { }) = { }

20 Operacao com conjuntos? (s/n): s
Operacoes: U: Uniao I: Interseccao D: Diferenca C: complemento Digite a opcao: i

21 Calculo da interseccao de 2 conjuntos
Primeiro Conjunto: Digite o numero de elementos: 5 Digite os 5 elementos numa soh linha: Segundo Conjunto: Digite o numero de elementos: 4 Digite os 4 elementos numa soh linha: Interseccao ({ }, { }) = { 2 3}

22 Operacao com conjuntos? (s/n): s
Operacoes: U: Uniao I: Interseccao D: Diferenca C: complemento Digite a opcao: d

23 Calculo da diferenca entre 2 conjuntos
Primeiro Conjunto: Digite o numero de elementos: 5 Digite os 5 elementos numa soh linha: Segundo Conjunto: Digite o numero de elementos: 4 Digite os 4 elementos numa soh linha: Diferenca ({ }, { }) = { }

24 Operacao com conjuntos? (s/n): s
Operacoes: U: Uniao I: Interseccao D: Diferenca C: complemento Digite a opcao: c

25 Calculo do complemento de 1 conjunto
Digite o numero de elementos: 5 Digite os 5 elementos numa soh linha: Complemento ({ }) = { } Operacao com conjuntos? (s/n): n Pressione ...

26 /* Funcao main: diversas operacoes com conjuntos de numeros */
int main () { char c; /* Pedido de operacao */ printf ("Operacao com conjuntos? (s/n): "); do c = getche(); while (c != 's' && c != 'n' && c != 'S' && c != 'N');

27 while (c == 'S' || c == 's') { /* Escolha entre: uniao, interseccao, diferenca e complemento */ ExibirMenu (); c = getche (); switch (c) { case 'U': case 'u': OperacaoUniao (); break; case 'I': case 'i': OperacaoInterseccao (); break; case 'D': case 'd': OperacaoDiferenca (); break; case 'C': case 'c': OperacaoComplemento (); break; default: printf ("Opcao invalida\n\n"); break; } /*Novo pedido de operacao */ printf ("Operacao com conjuntos? (s/n): "); do c = getche(); while (c != 's' && c != 'n' && c != 'S' && c != 'N'); As funções OperacaoInterseccao, OperacaoDiferenca e OperacaoComplemento são análogas à OperacaoUniao

28 Assim como foi feita a função Uniao, chamada pela OperacaoUniao
/* Encerramento do programa */ printf ("\n\n"); system ("pause"); return 0; } Assim como foi feita a função Uniao, chamada pela OperacaoUniao Devem ser feitas as funções Interseccao, Diferenca e Complemento, Chamadas, respectivamente, por OperacaoInterseccao, OperacaoDiferenca e OperacaoComplemento As oito funções acima mencionadas devem ser independentes da estrutura de dados usada para os conjuntos (listas lineares)

29 Exercício 2.4: Trocar a estrutura contígua dos 3 exercícios anteriores pela estrutura encadeada
A estrutura de listas lineares deve ser aquela com um ponteiro para o nó-líder e outro para o último nó 1º. elem 2º. elem nº. elem ## nó-líder C inic fim

30 /* Declaracoes de Conjunto com estrutura encadeada */
typedef struct noh noh; struct noh {int elem; noh *prox;}; typedef struct Conjunto Conjunto; struct Conjunto {noh *inic,*fim;}; typedef noh *posicao; 1º. elem 2º. elem nº. elem ## nó-líder C inic fim

31 Tarefa do Exercício 2.4: reescrever as funções
InicConjunto, Primeira, Proxima, Fim, Elemento, Local, Copiar e InserirNoFinal, na estrutura encadeada definida anteriormente Não é permitido alterar a função main Nem as funções FormarConjunto, EscreverConjunto, OperacaoUniao e Uniao Nem as funções implementadas para as operações de Intersecção, Diferença e Complemento Nem protótipo algum


Carregar ppt "CES-11 ALGORITMOS E ESTRUTURAS DE DADOS Aulas Práticas – 2017"

Apresentações semelhantes


Anúncios Google