CES11 ALGORITMOS E ESTRUTURAS DE DADOS Aulas Prticas

  • Slides: 32
Download presentation
CES-11 ALGORITMOS E ESTRUTURAS DE DADOS Aulas Práticas - 2020 Capítulo II Listas Lineares

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

Objetivo do Lab 2 de CES-11/2020 T 1 e T 4: n Implementar um

Objetivo do Lab 2 de CES-11/2020 T 1 e T 4: n Implementar um programa para controle de estoque de uma loja de eletrodomésticos, armazenando as informações numa lista linear - Usar a estrutura encadeada, com ponteiros para o primeiro e o último nó do encadeamento

Objetivo do Lab 2 de CES-11/2020 T 1 e T 4: n Implementar um

Objetivo do Lab 2 de CES-11/2020 T 1 e T 4: n Implementar um programa para controle de estoque de uma loja de eletrodomésticos, armazenando as informações numa lista linear - Encarar lista linear como sendo um tipo abstrato de dados (TAD)

Objetivo do Lab 2 de CES-11/2020 T 1 e T 4: n Implementar um

Objetivo do Lab 2 de CES-11/2020 T 1 e T 4: n Implementar um programa para controle de estoque de uma loja de eletrodomésticos, armazenando as informações numa lista linear - Assim sendo, somente as funções operadoras desse TAD poderão acessar a estrutura interna de uma lista

Objetivo do Lab 2 de CES-11/2020 T 1 e T 4: n Implementar um

Objetivo do Lab 2 de CES-11/2020 T 1 e T 4: n Implementar um programa para controle de estoque de uma loja de eletrodomésticos, armazenando as informações numa lista linear - A função main e as outras funções ficam proibidas de acessar essa estrutura interna

Programa 2. 1: Leitura, ordenação e escrita do estoque inicial n O objetivo deste

Programa 2. 1: Leitura, ordenação e escrita do estoque inicial n O objetivo deste programa é servir como base de testes para algumas funções a serem programadas n Ele conta com funções de leitura, ordenação e escrita do estoque inicial, apropriadas para lista encadeada n Na versão final do programa 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

/* Declarações globais #include */ <stdio. h> <stdlib. h> <conio. h> <string. h> typedef

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

typedef struct noh; struct noh { eletrodomestico eletro; noh *prox; }; o tipo noh

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

/* Prototipos das funcoes auxiliares void As funções auxiliares atuam sobre a variável global

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

void Novo. Estoque () { Muito próxima da função Nova. Lista, posicao p; mas

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

void Ordenar. Estoque () { posicao p, q, min; eletrodomestico menor; for (p =

void Ordenar. Estoque () { 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; É o método Selection-Sort para } encadeamentos, visto em CES-10 Capítulo 11 e adaptado para a variável } global Estoque if (min != p) { min->eletro = p->eletro; p->eletro = menor; } 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

void Listar. Estoque () { Copiar e posicao p; executar este if (Estoque. inic->prox

void Listar. Estoque () { Copiar e posicao p; executar este if (Estoque. inic->prox == NULL) programa printf ("n. Estoque vazion"); else { printf ("n%22 s|%10 sn", "Nome ", "Unidades"); printf ("------------------n"); for (p = Estoque. inic->prox; p != NULL; p = p->prox) printf ("%22 s|%10 dn", p->eletro. nome, p->eletro. unids); } Muito próxima da função printf ("n"); Escrever. Lista, vista também em CES} 10 Capítulo 11, 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 Inicializar. Estoque (); 2)

Lista dos operadores permitidos para a variável Estoque: 1) void Inicializar. Estoque (); 2) void Inserir (eletrodomestico eletro, posicao p); 3) void Deletar (posicao p); 4) void Mais. Unidades (int n, posicao p); 5) void Menos. Unidades (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 ();

1) void Inicializar. Estoque (); n Alocar a variável Estoque, se for o caso,

1) void Inicializar. Estoque (); n 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 n Deixar essa variável vazia n Na estrutura encadeada, o nó-líder deve ser alocado e os ponteiros inic e fim da variável devem apontar para ele n O ponteiro do nó-líder deve ser anulado

2) void Inserir (eletrodomestico eletro, posicao p); n Foi vista nas aulas teóricas, para

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

3) void Deletar (posicao p); n Foi vista nas aulas teóricas, para a estrutura

3) void Deletar (posicao p); n 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 n Neste lab, o elemento deletado não deverá ser retornado n Na estrutura com ponteiro para o último nó, cuidado quando a posição de deleção for a do último elemento n Um novo nó passará a ser o último da lista, logo o ponteiro fim da variável Estoque deve ser alterado

4) void Mais. Unidades (int n, posicao p); n Adicionar mais n unidades ao

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

6) infolocal Local (string nome); n n Retorna duas informações sobre a variável-parâmetro nome,

6) infolocal Local (string nome); n n Retorna duas informações sobre a variável-parâmetro nome, pressupondo que os eletrodomésticos estejam ordenados alfabeticamente nos nós de Estoque: - Informação dizendo se o conteúdo de nome é ou não um eletrodoméstico de Estoque - Informação com 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; struct infolocal {posicao posic; logic estah; };

7) posicao Primeira (); - Posição do primeiro eletrodoméstico de Estoque 8) eletrodomestico Elemento

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 Estoque. Vazio (); - Retorna TRUE, se Estoque estiver vazio, e FALSE, em caso contrário

Exercício 2. 1: Adicionar unidades a um eletrodoméstico do estoque n Solicitar do operador

Exercício 2. 1: Adicionar unidades a um eletrodoméstico do estoque n Solicitar do operador a digitação do nome e do número de unidades a serem adicionadas n O nome deve ser procurado em Estoque (a função Local responde se está e onde está ou deveria estar) n 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 n Se estiver, apenas adicionar o número de unidades digitadas àquelas já em estoque (função

n Acrescentar a seguinte declaração global: typedef struct infolocal; struct infolocal { posicao posic;

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

void main () { char c; printf ("Controle do Estoque de Eletrodomesticosnn"); Novo. Estoque

void main () { char c; printf ("Controle do Estoque de Eletrodomesticosnn"); Novo. Estoque (); Ordenar. Estoque (); Listar. Estoque (); 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 ("nn"); Adicionar. Unidades (); printf ("nn. Adicionar unidades a algum eletrodomestico? (s/n): "); do c = getche (); while (c != 's' && c != 'S' && c != 'n' && c != 'N'); } Listar. Estoque (); printf ("nn"); system ("pause"); return 0; }

Acrescentar a seguinte função: void Adicionar. Unidades () { eletrodomestico eletro; infolocal loc; string

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

Programar as seguintes funções-operadoras para Estoque: n void Inserir (eletrodomestico eletro, posicao p) {-

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

Exercício 2. 2: Dar ao operador a opção de realizar as seguintes operações: n

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

Inicializar. Estoque (); Exibir. Menu (); c = getche (); printf ("nn"); printf ("Digitado:

Inicializar. Estoque (); Exibir. Menu (); c = getche (); printf ("nn"); printf ("Digitado: %cnn", c); Mudar o miolo da while (c != 'F' && c != 'f') { função main para: switch (c) { case 'A': case 'a': Adicionar. Unidades (); break; case 'R': case 'r': Retirar. Unidades (); break; case 'N': case 'n': Numero. Unids. Eletro (); break; case 'L': case 'l': Listar. Estoque (); break; } Exibir. Menu (); Observa-se que as c = getche (); printf ("nn"); funções Novo. Estoque e printf ("Digitado: %cnn", c); Ordenar. Estoque não estão sendo invocadas }

Função Exibir. Menu: n Escrever na tela algo equivalente a: Digite A R N

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

Função Retirar. Unidades: n Deve ser programada em moldes semelhantes à da função Adicionar.

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

Função Retirar. Unidades: n Se o numero de unidades a serem retiradas for menor

Função Retirar. Unidades: n 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 Menos. Unidades) n Se for maior ou igual, deletar do estoque o nó do eletrodoméstico (função Deletar) n Alem disso, se maior, avisar que o numero de unidades retiradas será apenas aquele em estoque

Função Numero. Unids. Eletro: n Deve ser programada em moldes semelhantes à da função

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

Função Numero. Unids. Eletro: n Se estiver, colher a informação do estoque (função Elemento)

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

Função Listar. Estoque: n Deve ser alterada para se tornar independente da estrutura de

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