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

Slides:



Advertisements
Apresentações semelhantes
Listas encadeadas Prof. Rosana Palazon.
Advertisements

Listas duplamente encadeadas
Introdução à Computação - Jorge Macêdo
David Menotti Algoritmos e Estruturas de Dados I DECOM – UFOP
David Menotti Estruturas de Dados I DECOM – UFOP
Estruturas de Dados I Prof.: Sergio Pacheco Prof.: Sergio Pacheco 1 1.
Listas com Ponteiros Listas encadeadas Listas circulares.
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2013 Capítulo XI Encadeamento de Estruturas por Ponteiros.
Armazenamento de Dados em Arquivos
Slides: Prof. João Fabro UTFPR - Curitiba
Armazenamento de Dados em Arquivos
Slides: Prof. SIMÃO Revisão: Prof. João Fabro
Slides: Prof. João Fabro UTFPR - Curitiba
Fundamentos de Programação 1
ALGORITMOS E ESTRUTURAS DE DADOS
Listas Encadeadas Raquel O. Prates, Luiz Chaimowicz, Jussara Almeida
Educação Profissional Técnica de Nível Médio Curso Técnico de Informática
Capítulo VI – Variáveis Indexadas 6.1 – A necessidade de variáveis indexadas 6.2 – Vetores e matrizes 6.3 – Aplicações com vetores numéricos 6.4 – Aplicações.
Prof. Alessandro Gonçalves
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2014 Capítulo IX Subprogramação e Recursividade.
CES-10 INTRODUÇÃO À COMPUTAÇÃO Aulas Práticas – 2014 Capítulo X Encadeamento de Estruturas por Ponteiros.
Fundamentos de Programação 1 Slides 19 Prof. SIMÃO Jean Marcelo SIMÃO Linguagem C “Arquivos Binários”.
Fundamentos de Programação 1 Slides 7 Prof. SIMÃO Jean Marcelo SIMÃO Linguagem C “Funções”
Fundamentos de Programação 1 Slides 21 Prof.ª Fabiany e Prof. SIMÃO Linguagem C “Lista Encadeada”.
Fundamentos de Programação 1 Slides 22 Prof.ª Fabiany e Prof. SIMÃO Linguagem C “Lista Duplamente Encadeada - Projeto com vários Arquivos”.
Fundamentos de Programação 1 Slides 18 Prof. SIMÃO Jean Marcelo SIMÃO Linguagem C “Arquivos Seqüências ou de Texto ”. 1.
1 Aula 08 Conteúdo de Suporte ao Trabalho 2 Prof. Filipe Mutz.
Estrutura de Dados (DPADF 0056) Aula 7 – Encadeamento de Memória Universidade Federal de Santa Maria Colégio Agrícola de Frederico Westphalen Curso Superior.
Capítulo II Listas Lineares Gerais CES-11 ALGORITMOS E ESTRUTURAS DE DADOS.
Estrutura de Dados (DPADF 0056) Aula 8 – Estr. Clássicas - Lista Universidade Federal de Santa Maria Colégio Agrícola de Frederico Westphalen Curso Superior.
INF1007: Programação 2 8 – Listas Encadeadas
CES-11 ALGORITMOS E ESTRUTURAS DE DADOS Aulas Práticas – 2017
CES-11 ALGORITMOS E ESTRUTURAS DE DADOS Aulas Práticas – 2016
Vetores e Matrizes em C/C++
Fundamentos de Programação 1
INF1007: Programação 2 2 – Alocação Dinâmica
INE5408 Estruturas de Dados
Estruturas de Decisão.
INE5408 Estruturas de Dados
Capítulo II – Listas Lineares Gerais
Estrutura de Dados Revisão
CES-11 ALGORITMOS E ESTRUTURAS DE DADOS Aulas Práticas
CES-11 ESTRUTURAS DE DADOS Aulas Práticas
FUNDAMENTO DE PROGRAMAÇÃO
CES-11 ALGORITMOS E ESTRUTURAS DE DADOS Aulas Práticas
Fundamentos de Programação 1
FUNDAMENTO DE PROGRAMAÇÃO PROF. BRUNO DE CASTRO H. SILVA
FUNDAMENTO DE PROGRAMAÇÃO PROF. BRUNO DE CASTRO H. SILVA
FUNDAMENTO DE PROGRAMAÇÃO
Capítulo IV – Árvores Gerais
CES-11 ALGORITMOS E ESTRUTURAS DE DADOS Aulas Práticas – 2017
Programação de Computadores I – Arquivos
Capítulo IV – Árvores Gerais
CES-11 ALGORITMOS E ESTRUTURAS DE DADOS Aulas Práticas
Algoritmos e Estruturas de Dados I
PROGRAMAÇÃO I UNIDADE 3.
Algoritmos e Programação MC102
CES-11 ALGORITMOS E ESTRUTURAS DE DADOS Aulas Práticas
Listas Encadeadas.
CES-11 ALGORITMOS E ESTRUTURAS DE DADOS Aulas Práticas – 2017
Fundamentos de Programação 1
Função de buscar elemento na lista simplesmente encadeada
CES-11 ALGORITMOS E ESTRUTURAS DE DADOS
Programação de Computadores I – Arquivos
CES-11 ALGORITMOS E ESTRUTURAS DE DADOS Aulas Práticas
DHD – Desenvolvimento em Hardware
Prof. Rafael Mesquita Fila Prof. Rafael Mesquita
Linguagem C Linguagem Imperativa
DHD – Desenvolvimento em Hardware
CES-11 ALGORITMOS E ESTRUTURAS DE DADOS Aulas Práticas – 2019
Transcrição da apresentação:

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

Objetivo do Lab 2 de CES-11/2016 T2: Implementar dois programas para controle de estoque de uma loja de eletrodomésticos, armazenando as informações numa lista linear 1º Programa: usando estrutura encadeada, com ponteiros para o primeiro e o último nó do encadeamento

Objetivo do Lab 2 de CES-11/2016 T2: Implementar dois programas para controle de estoque de uma loja de eletrodomésticos, armazenando as informações numa lista linear 2º Programa: usando estrutura contígua

Programa 2.1: Leitura, ordenação e escrita do estoque inicial O objetivo deste programa é servir como base de testes para algumas funções a serem programadas Ele conta com funções de leitura, ordenação e escrita do estoque inicial, apropriadas somente para lista encadeada Nas versões finais dos programas do Lab 2, as duas primeiras dessas funções deverão ser dispensadas e a função de escrita deverá ser tornada independente da estrutura escolhida A variável Estoque (de tipo lista) é global e não deverá ser passada como argumento para nenhuma função

/* Declarações globais */ #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h> typedef char logic; const logic TRUE = 1, FALSE = 0; typedef char string[20]; typedef struct eletrodomestico eletrodomestico; struct eletrodomestico { string nome; int unids; }; Cada eletrodoméstico do estoque terá duas informações: nome e número de unidades estocadas

o tipo noh nome unids eletro prox typedef struct noh noh; struct noh { eletrodomestico eletro; noh *prox; }; typedef struct lista lista; struct lista { noh *inic, *fim; typedef noh *posicao; lista Estoque; o tipo noh nome unids eletro prox Estoque eletro

/* Prototipos das funcoes auxiliares */ void NovoEstoque (void); void OrdenarEstoque (void); void ListarEstoque (void); /* Funcao principal */ int main () { printf ("Controle do Estoque de Eletrodomesticos\n\n"); NovoEstoque (); OrdenarEstoque (); ListarEstoque (); printf ("\n\n"); system ("pause"); return 0; } As funções auxiliares atuam sobre a variável global Estoque e não têm parâmetros

void NovoEstoque () { posicao p; int i, n; p = Estoque.inic = (noh *) malloc (sizeof (noh)); printf ("Numero de aparelhos: "); scanf ("%d", &n); if (n > 0) for (i = 1; i <= n; i++) { p->prox = (noh *) malloc (sizeof (noh)); p = p->prox; printf ("\nNome e a quantidade do %d aparelho: ", i); setbuf (stdin, NULL); scanf ("%s%d", p->eletro.nome, &p->eletro.unids); } p->prox = NULL; Estoque.fim = p; Muito próxima da função NovaLista, mas não retorna a lista formada Encadeia os nós a partir do campo inic da variável global Estoque Dois valores lidos para cada nó: o nome e as unidades de um eletrodoméstico Deve-se acertar o ponteiro fim da variável Estoque

void OrdenarEstoque () { posicao p, q, min; eletrodomestico menor; for (p = Estoque.inic->prox; p != NULL && p->prox != NULL; p = p->prox) { for (menor = p->eletro, min = p, q = p->prox; q != NULL; q = q->prox) { if (strcmp (q->eletro.nome, menor.nome) < 0) { menor = q->eletro; min = q; } if (min != p) { min->eletro = p->eletro; p->eletro = menor; É o método Selection-Sort para encadeamentos, visto em CES-10 e adaptado para a variável global Estoque Comentários sobre esta função não serão feitos, pois ela é usada apenas como apoio à programação de diversas funções e será dispensada no final

Copiar e executar este programa void ListarEstoque () { posicao p; if (Estoque.inic->prox == NULL) printf ("\nEstoque vazio\n"); else { printf ("\n%22s|%10s\n", "Nome ", "Unidades"); printf ("-----------------------------------\n"); for (p = Estoque.inic->prox; p != NULL; p = p->prox) printf ("%22s|%10d\n", p->eletro.nome, p->eletro.unids); } printf ("\n"); Copiar e executar este programa Muito próxima da função EscreverLista, mas não tem parâmetro; trabalha com a variável global Estoque No final da programação, ela deverá ser tornada independente de estrutura de dados

Lista dos operadores permitidos para a variável Estoque: 1) void InicializarEstoque (); 2) void Inserir (eletrodomestico eletro, posicao p); 3) void Deletar (posicao p); 4) void MaisUnidades (int n, posicao p); 5) void MenosUnidades (int n, posicao p); 6) infolocal Local (string nome); 7) posicao Primeira (); 8) eletrodomestico Elemento (posicao p); 9) posicao Proxima (posicao p); 10) posicao Fim (); 11) logic EstoqueVazio ();

1) void InicializarEstoque (); Alocar a variável Estoque, se for o caso, deixando-a em condições de ser usada para inserções, deleções e outros operadores Deixar essa variável vazia Na estrutura encadeada, o nó-líder deve ser alocado e os ponteiros inic e fim da variável devem apontar para ele O ponteiro do nó-líder deve ser anulado Na estrutura contígua, o campo Ultimo deve ser zerado

2) void Inserir (eletrodomestico eletro, posicao p); Foi vista nas aulas teóricas, para a estrutura sem o ponteiro para o último nó Na estrutura com esse ponteiro, cuidado ao inserir na posição de fim de lista Um novo nó passará a ser o último da lista, logo o ponteiro fim da variável Estoque deve ser alterado Essa função só será chamada quando garantidamente a variável p for uma posição em Estoque

3) void Deletar (posicao p); Foi vista nas aulas teóricas, para a estrutura sem o ponteiro para o último nó, a função Deletando, que retornava o elemento deletado Neste lab, o elemento deletado não deverá ser retornado Na estrutura com ponteiro para o último nó, cuidado quando a posição de deleção for a do último elemento Um novo nó passará a ser o último da lista, logo o ponteiro fim da variável Estoque deve ser alterado Essa função só será chamada quando garantidamente a variável p for uma posição em Estoque

4) void MaisUnidades (int n, posicao p); Adicionar mais n unidades ao eletrodoméstico da posição p Essa função só será chamada quando garantidamente a variável p for uma posição em Estoque 5) void MenosUnidades (int n, posicao p); Retirar n unidades do eletrodoméstico da posição p

6) infolocal Local (string nome); Retorna duas informações sobre a variável-parâmetro nome, pressupondo que os eletrodomésticos estejam ordenados alfabeticamente nos nós de Estoque: O conteúdo de nome é ou não um eletrodoméstico de Estoque Qual a posição que nome ocupa ou deveria ocupar em Estoque Essas informações devem ficar guardadas numa estrutura do tipo infolocal, conforme a seguinte declaração: typedef struct infolocal infolocal; struct infolocal {posicao posic; logic estah;};

7) posicao Primeira (); - Posição do primeiro eletrodoméstico de Estoque 8) eletrodomestico Elemento (posicao p); - Eletrodoméstico da posição p em Estoque 9) posicao Proxima (posicao p); - Posição seguinte à p no Estoque 10) posicao Fim (); - Posição após à do último eletrodoméstico de Estoque 11) logic EstoqueVazio (); - Retorna TRUE, se Estoque estiver vazio, e FALSE, em caso contrário

Exercício 2.1: Adicionar unidades a um eletrodoméstico do estoque Solicitar do operador a digitação do nome e do número de unidades a serem adicionadas O nome deve ser procurado em Estoque (a função Local responde se está e onde está ou deveria estar) Se o eletrodoméstico não estiver no estoque, deve ser inserido um nó para ele com as informações digitadas (função Inserir); a ordem alfabética não pode ser quebrada Se estiver, apenas adicionar o número de unidades digitadas àquelas já em estoque (função MaisUnidades)

Acrescentar a seguinte declaração global: typedef struct infolocal infolocal; struct infolocal { posicao posic; logic estah; }; Acrescentar os seguintes protótipos de funções: void AdicionarUnidades (void); void Inserir (eletrodomestico, posicao); void MaisUnidades (int, posicao); infolocal Local (string); Trocar a função main por aquela do slide a seguir

void main () { char c; printf ("Controle do Estoque de Eletrodomesticos\n\n"); NovoEstoque (); OrdenarEstoque (); ListarEstoque (); printf ("Adicionar unidades a algum eletrodomestico? (s/n): "); do c = getche (); while (c != 's' && c != 'S' && c != 'n' && c != 'N'); while (c == 's' || c == 'S') { printf ("\n\n"); AdicionarUnidades (); ("\n\nAdicionar unidades a algum eletrodomestico? (s/n): "); } ListarEstoque (); printf ("\n\n"); system ("pause"); return 0;

Acrescentar a seguinte função: void AdicionarUnidades () { eletrodomestico eletro; infolocal loc; string nome; int unids; printf ("Adicao de unidades a um eletrodomestico\n\n"); printf ("Nome: "); setbuf (stdin, NULL); gets (nome); printf ("Unidades adicionadas: "); scanf ("%d", &unids); loc = Local (nome); if (loc.estah == TRUE) MaisUnidades (unids, loc.posic); else { strcpy (eletro.nome, nome); eletro.unids = unids; Inserir (eletro, loc.posic); } Observa-se que esta função: Independe da estrutura de dados escolhida Garante que a ordem alfabética seja mantida Pode dispensar as funções NovoEstoque e OrdenarEstoque

Programar as seguintes funções-operadoras para Estoque: void Inserir (eletrodomestico eletro, posicao p) {- - - - -} void MaisUnidades (int unids, posicao p) infolocal Local (string nome)

Exercício 2.2: Dar ao operador a opção de realizar as seguintes operações: Adicionar unidades de um eletrodoméstico Retirar unidades de um eletrodoméstico Pedir informações sobre o numero de unidades de um eletrodoméstico Listar todo o estoque Encerrar as operações

Mudar o miolo da função main para: InicializarEstoque (); ExibirMenu (); c = getche (); printf ("\n\n"); printf ("Digitado: %c\n\n", c); while (c != 'F' && c != 'f') { switch (c) { case 'A': case 'a': AdicionarUnidades (); break; case 'R': case 'r': RetirarUnidades (); break; case 'N': case 'n': NumeroUnidsEletro (); break; case 'L': case 'l': ListarEstoque (); break; } ExibirMenu (); Mudar o miolo da função main para: Observa-se que as funções NovoEstoque e OrdenarEstoque não estão sendo invocadas

Escrever na tela algo equivalente a: Função ExibirMenu: Escrever na tela algo equivalente a: Digite A - para adicionar unidades a um eletrodomestico R - para retirar unidades de um eletrodomestico N - para informar o numero de unidades de um eletrodomestico L - para listar todo o estoque F - para encerrar as operacoes: Sua opcao:

Função RetirarUnidades: Deve ser programada em moldes semelhantes à da função AdicionarUnidades Deve ser independente da estrutura de dados Deve solicitar do operador a digitação do nome e do número de unidades a serem retiradas O nome deve ser procurado em Estoque (a função Local responde se está e onde está ou deveria estar) Se o eletrodoméstico não estiver no estoque, deve ser emitida uma mensagem de erro

Função RetirarUnidades: Se o numero de unidades a serem retiradas for menor que o numero de unidades no estoque, subtrair o número de unidades digitadas daquelas já em estoque (função MenosUnidades) Se for maior ou igual, deletar do estoque o nó do eletrodoméstico (função Deletar) Alem disso, se maior, avisar que o numero de unidades retiradas será apenas aquele em estoque

Função NumeroUnidsEletro: Deve ser programada em moldes semelhantes à da função AdicionarUnidades Deve ser independente da estrutura de dados Deve solicitar do operador a digitação do nome do eletrodoméstico cujo número de unidades deseja-se conhecer O nome deve ser procurado em Estoque (a função Local responde se está e onde está ou deveria estar) Se o eletrodoméstico não estiver no estoque, deve ser emitida uma mensagem de erro

Função NumeroUnidsEletro: Se estiver, colher a informação do estoque (função Elemento) Em seguida, escrever na tela o nome e o número de unidades do eletrodoméstico colhido

Função ListarEstoque: Deve ser alterada para se tornar independente da estrutura de dados Poderá usar devidamente as funções-operadoras de listas EstoqueVazio, Primeira, Fim, Proxima e Elemento Funções-operadoras da lista Estoque: Devem ser programadas todas aquelas que assim ainda não foram A estrutura de dados é a encadeada apresentada no início deste documento

Exercício 2.3: Trocar a estrutura de dados do programa do exercício anterior pela estrutura contígua para listas lineares Declarações: const int MAXELETROS = 100; typedef struct lista lista; struct lista { eletrodomestico Eletros [MAXELETROS]; int Ultimo }; typedef int posicao; lista Estoque; Alterar no programa anterior apenas a estrutura de dados para listas e para posição e as funções operadoras da lista Estoque Ficam proibidas quaisquer alterações: Nas structs eletrodomestico e infolocal Nas funções main, ExibirMenu, AdicionarUnidades, RetirarUnidades, NumeroUnidsEletro e ListarEstoque