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

Apresentações semelhantes


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

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

2 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

3 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

4 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

5 /* 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

6 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

7 /* 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

8 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

9 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

10 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

11 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 ();

12 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

13 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

14 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

15 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

16 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;};

17 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

18 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)

19 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

20 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;

21 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

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

23 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

24 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

25 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:

26 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

27 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

28 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

29 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

30 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

31 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


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

Apresentações semelhantes


Anúncios Google