Buscar

ATIVIDADE DISCURSIVA ESTRUTURA DE DADOS

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 16 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 16 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 16 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Questão A
Uma FILA é uma estrutura de dados “linear” na qual os elementos são inseridos por uma de suas extremidades e são removidos pela outra. Normalmente os elementos entram pelo fim da fila e são removidos pelo começo dela, mas este processo pode ser invertido também.
Temos muitos exemplos de filas no mundo real, como no caixa de um supermercado, no banco, na entrada de uma escola.
Questões:
Esta questão visa verificar sua habilidade de fazer um teste de mesa para filas:
Faça uma sequencia de 15 operações de inserção e remoção de elementos, aleatoriamente. Mostre o estado da fila a cada passo. Se a fila ficar vazia, não tem problema; apenas deixe isto indicado.
Por exemplo:
Se a sua fila for de clientes
Operação 1: insert(“Ademir”);
Fila == Inicio: Ademir :Fim
Operação 2: insert(“Janaína”);
Fila == Inicio: Ademir, Janaína :Fim
Operação 3: remove();
Fila == Inicio: Janaína :Fim
            ...
Dicas:
•   Você deve escolher o tipo de elemento e a sequência de operações.
•   Procure deixar sua fila com pelo menos 4 elementos em algum momento.
•   O exercício pode terminar com a fila contendo diversos elementos.
 
Questão B
Uma LISTA é uma estrutura de dados “linear” na qual os elementos são inseridos e removidos em qualquer lugar da mesma.
Questões:
Vamos testar na prática algo similar ao realizado no exercício anterior, mas com as listas.
Aqui você deve fazer um programa em linguagem C ou C++ que contenha as seguintes estruturas:
 
a)  Escolha uma STRUCT de sua preferência para compor os dados de sua lista. Esta struct deve conter pelo menos 2 campos diferentes. Crie um vetor desta struct para ser sua lista, ou use nós com alocação dinâmica.
b)  Faça 2 rotinas; uma que permita inserir um novo elemento apenas no início da lista; outra apenas no fim. Passe o novo elemento por parâmetro.
c)  De forma similar, faça mais 2 rotinas: uma que permita remover um elemento do início da lista; outra apenas do final.
d)  Crie uma função para mostrar toda a sua lista num determinado momento.
e)  Faça uma sequência de 15 operações de inserção e/ou remoção no main. Vá mostrando a sua lista após cada operação, da mesma forma que foi feito na questão A.
 
Dicas:
•   Suas rotinas devem trabalhar com parâmetros sempre que possível.
•   Você pode escolher os campos de sua estrutura e a sequência de operações a ser realizada no main.
•   Procure deixar sua fila com pelo menos 4 elementos em algum momento.
•   O exercício pode terminar com a lista contendo diversos elementos.
•          Procure testar sua lista como “vazia” em algum momento.
QUESTÃO A
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
 
 
typedef enum {FALSE, TRUE} bool;
 
 
#define DuracaoDaSimulacao       200
#define ProbabilidadeDeEntrada     0.2
#define TempoMinAtendimento        5
#define TempoMaxAtendimento       20
 
 
typedef struct {
   int numeroCliente;
   int instanteEntrada;
   int tempoDeAtendimento;
} clienteT;
 
 
typedef struct {
   queueT   *fila;
   clienteT *clienteAtivo;
   int       tempo;
   int       numeroDeClientes;
   int       numeroDeAtendidos;
   int       somaTemposDeEspera;
   int       somaComprimentos;
} dadosDaSimulacaoT;
 
 
void   ExecutaSimulacao( dadosDaSimulacaoT *sim);
void   ColocaClienteNaFila( dadosDaSimulacaoT *sim);
void   ProcessaFila( dadosDaSimulacaoT *sim);
void   AtendeCliente( dadosDaSimulacaoT *sim);
void   DispensaCliente( dadosDaSimulacaoT *sim);
void   Randomize( void);
int    RandomInteger( int low, int high);
double RandomReal( double low, double high);
bool   RandomChance( double p);
 
bool traceFlag;
 
 
int main( int argc, char *argv[]) {
   dadosDaSimulacaoT dados;
 
   if (argc >= 2 && strcmp( argv[1], "-t") == 0) traceFlag = TRUE;
   else traceFlag = FALSE;
 
   Randomize();
   ExecutaSimulacao( &dados);
 
   printf( "\n");
   printf( "Resultados da simulação, dados os seguintes parâmetros:\n");
   printf( "   DuracaoDaSimulacao:     %4d\n",     
          (int) DuracaoDaSimulacao);
   printf( "   ProbabilidadeDeEntrada: %7.2f\n",
          (double) ProbabilidadeDeEntrada);
   printf( "   TempoMinAtendimento:    %4d\n",     
          (int) TempoMinAtendimento);
   printf( "   TempoMaxAtendimento:    %4d\n",
          (int) TempoMaxAtendimento);
   printf( "\n");
   printf( "Clientes atendidos:        %4d\n",
          dados.numeroDeAtendidos);
   printf( "Tempo médio de espera:     %7.2f\n",
          (double) dados.somaTemposDeEspera / dados.numeroDeAtendidos);
   printf( "Comprimento médio da fila: %7.2f\n",
          (double) dados.somaComprimentos / DuracaoDaSimulacao);
   return 0;
}
 
 
void ExecutaSimulacao( dadosDaSimulacaoT *sim) {
   sim->fila = NewQueue();
   sim->clienteAtivo = NULL;
   sim->numeroDeClientes = 0;
   sim->numeroDeAtendidos = 0;
   sim->somaTemposDeEspera = 0;
   sim->somaComprimentos = 0;
   for (sim->tempo = 0; sim->tempo < DuracaoDaSimulacao; sim->tempo++) {
      if (RandomChance( ProbabilidadeDeEntrada))
         ColocaClienteNaFila( sim);
      ProcessaFila( sim);
   }
   FreeQueue( sim->fila);
}
 
 
void ColocaClienteNaFila( dadosDaSimulacaoT *sim) {
   clienteT *c;
   sim->numeroDeClientes++;
   c = malloc( sizeof (clienteT));
   c->numeroCliente = sim->numeroDeClientes;
   c->instanteEntrada = sim->tempo;
   c->tempoDeAtendimento =
      RandomInteger( TempoMinAtendimento, TempoMaxAtendimento);
   Enqueue( sim->fila, c);
   if (traceFlag)
      printf( "%4d: Cliente %d entra na fila\n",
             sim->tempo, sim->numeroDeClientes);
}
 
 
void ProcessaFila( dadosDaSimulacaoT *sim) {
   if (sim->clienteAtivo == NULL) {
      if (!QueueIsEmpty( sim->fila))
         AtendeCliente( sim);
   } else {
      if (sim->clienteAtivo->tempoDeAtendimento == 0)
         DispensaCliente( sim);
      else
         sim->clienteAtivo->tempoDeAtendimento--;
   }
   sim->somaComprimentos += QueueLength( sim->fila);
}
 
 
void AtendeCliente( dadosDaSimulacaoT *sim) {
   clienteT *cli;
   cli = Dequeue( sim->fila);
   sim->clienteAtivo = cli;
   sim->numeroDeAtendidos++;
   sim->somaTemposDeEspera += (sim->tempo - cli->instanteEntrada);
   if (traceFlag)
      printf( "%4d: Cliente %d chega ao caixa\n",
             sim->tempo, cli->numeroCliente);
}
 
 
void DispensaCliente( dadosDaSimulacaoT *sim) {
   if (traceFlag)
      printf( "%4d: Cliente %d deixa o caixa\n",
             sim->tempo, sim->clienteAtivo->numeroCliente);
   free( sim->clienteAtivo);
   sim->clienteAtivo = NULL;
}
 
 
void Randomize( void) {
    srand( (int) time( NULL));
}
 
 
double RandomReal( double low, double high) {
    double d;
    d = (double) rand() / ((double) RAND_MAX + 1);
    return low + d * (high - low);
}
 
int RandomInteger( int low, int high) {
    int k;
    double d;
    d = (double) rand() / ((double) RAND_MAX + 1);
    k = d * (high - low + 1);
    return low + k;
}
 
 
bool RandomChance( double p) {
    return RandomReal( 0, 1) < p;
}
 
Resultados de um teste:
	   5: Cliente 1 entra na fila
   5: Cliente 1 chega ao caixa
  16: Cliente 1 deixa o caixa
  17: Cliente 2 entra na fila
  17: Cliente 2 chega ao caixa
  18: Cliente 3 entra na fila
  19: Cliente 4 entra na fila
  20: Cliente 5 entra na fila
  21: Cliente 6 entra na fila
  32: Cliente 2 deixa o caixa
   .
   .
   .
 180: Cliente 13 deixa o caixa
 181: Cliente 14 chega ao caixa
 185: Cliente 34 entra na fila
 191: Cliente 14 deixa o caixa
 192: Cliente 15 chega ao caixa
 193: Cliente 35 entra na fila
                                                             
Resultados da simulação, dados os seguintes parâmetros:          
   DuracaoDaSimulacao:      200
   ProbabilidadeDeEntrada:    0.20
   TempoMinAtendimento:       5
   TempoMaxAtendimento:      20
 
Clientes atendidos:          15
Tempo médio de espera:       50.60
Comprimento médio da fila:    9.53QUESTÃO B
#include <stdio.h>
#include <stdlib.h>
struct Node{
            int num;
            struct Node *prox;
};
typedef struct Node node;
 
int tam;
 
void inicia(node *LISTA);
int menu(void);
void opcao(node *LISTA, int op);
node *criaNo();
void insereFim(node *LISTA);
void insereInicio(node *LISTA);
void exibe(node *LISTA);
void libera(node *LISTA);
void insere (node *LISTA);
node *retiraInicio(node *LISTA);
node *retiraFim(node *LISTA);
node *retira(node *LISTA);
 
 
int main(void)
{
            node *LISTA = (node *) malloc(sizeof(node));
            if(!LISTA){
                        printf("Sem memoria disponivel!\n");
                        exit(1);
            }else{
            inicia(LISTA);
            int opt;
           
            do{
                        opt=menu();
                        opcao(LISTA,opt);
            }while(opt);
 
            free(LISTA);
            return 0;
            }
}
 
void inicia(node *LISTA)
{
            LISTA->prox = NULL;
            tam=0;
}
 
int menu(void)
{
            int opt;
           
            printf("Escolha a opcao\n");
            printf("0. Sair\n");
            printf("1. Zerar lista\n");
            printf("2. Exibir lista\n");
            printf("3. Adicionar node no inicio\n");
            printf("4. Adicionar node no final\n");
            printf("5. Escolher onde inserir\n");
            printf("6. Retirar do inicio\n");
            printf("7. Retirar do fim\n");
            printf("8. Escolher de onde tirar\n");
            printf("Opcao: "); scanf("%d", &opt);
           
            return opt;
}
 
void opcao(node *LISTA, int op)
{
            node *tmp;
            switch(op){
                        case 0:
                                   libera(LISTA);
                                   break;
                                  
                        case 1:
                                   libera(LISTA);
                                   inicia(LISTA);
                                   break;
                       
                        case 2:
                                   exibe(LISTA);
                                   break;
                       
                        case 3:
                                   insereInicio(LISTA);
                                   break;            
                                  
                        case 4:
                                   insereFim(LISTA);
                                   break;
                                  
                        case 5:
                                   insere(LISTA);
                                   break;
                       
                        case 6:
                                   tmp= retiraInicio(LISTA);
                                   printf("Retirado: %3d\n\n", tmp->num);
                                   break;
                                  
                        case 7:
                                   tmp= retiraFim(LISTA);
                                   printf("Retirado: %3d\n\n", tmp->num);
                                   break;
                       
                        case 8:
                                   tmp= retira(LISTA);
                                   printf("Retirado: %3d\n\n", tmp->num);
                                   break;
                       
                        default:
                                   printf("Comando invalido\n\n");
            }
}
 
int vazia(node *LISTA)
{
            if(LISTA->prox == NULL)
                        return 1;
            else
                        return 0;
}
 
node *aloca()
{
            node *novo=(node *) malloc(sizeof(node));
            if(!novo){
                        printf("Sem memoria disponivel!\n");
                        exit(1);
            }else{
                        printf("Novo elemento: "); scanf("%d", &novo->num);
                        return novo;
            }
}
 
 
void insereFim(node *LISTA)
{
            node *novo=aloca();
            novo->prox = NULL;
           
            if(vazia(LISTA))
                        LISTA->prox=novo;
            else{
                        node *tmp = LISTA->prox;
                       
                        while(tmp->prox != NULL)
                                   tmp = tmp->prox;
                       
                        tmp->prox = novo;
            }
            tam++;
}
 
void insereInicio(node *LISTA)
{
            node *novo=aloca();          
            node *oldHead = LISTA->prox;
           
            LISTA->prox = novo;
            novo->prox = oldHead;
           
            tam++;
}
 
void exibe(node *LISTA)
{
            system("clear");
            if(vazia(LISTA)){
                        printf("Lista vazia!\n\n");
                        return ;
            }
           
            node *tmp;
            tmp = LISTA->prox;
            printf("Lista:");
            while( tmp != NULL){
                        printf("%5d", tmp->num);
                        tmp = tmp->prox;
            }
            printf("\n        ");
            int count;
            for(count=0 ; count < tam ; count++)
                        printf("  ^  ");
            printf("\nOrdem:");
            for(count=0 ; count < tam ; count++)
                        printf("%5d", count+1);
           
                       
            printf("\n\n");
}
 
void libera(node *LISTA)
{
            if(!vazia(LISTA)){
                        node *proxNode,
                                     *atual;
                       
                        atual = LISTA->prox;
                        while(atual != NULL){
                                   proxNode = atual->prox;
                                   free(atual);
                                   atual = proxNode;
                        }
            }
}
 
void insere(node *LISTA)
{
            int pos,
                        count;
            printf("Em que posicao, [de 1 ate %d] voce deseja inserir: ", tam);
            scanf("%d", &pos);
           
            if(pos>0 && pos <= tam){
                        if(pos==1)
                                   insereInicio(LISTA);
                        else{
                                   node *atual = LISTA->prox,
                                                *anterior=LISTA;
                                   node *novo=aloca();
                                                
                                   for(count=1 ; count < pos ; count++){
                                                           anterior=atual;
                                                           atual=atual->prox;
                                   }
                                   anterior->prox=novo;
                                   novo->prox = atual;
                                   tam++;
                        }
                                  
            }else
                        printf("Elemento invalido\n\n");              
}
 
node *retiraInicio(node *LISTA)
{
            if(LISTA->prox == NULL){
                        printf("Lista ja esta vazia\n");
                        return NULL;
            }else{
                        node *tmp = LISTA->prox;
                        LISTA->prox = tmp->prox;
                        tam--;
                        return tmp;
            }
                                              
}
 
node *retiraFim(node *LISTA)
{
            if(LISTA->prox == NULL){
                        printf("Lista ja vazia\n\n");
                        return NULL;
            }else{
                        node *ultimo = LISTA->prox,
                                    *penultimo = LISTA;while(ultimo->prox != NULL){
                                   penultimo = ultimo;
                                   ultimo = ultimo->prox;
                        }
                                    
                        penultimo->prox = NULL;
                        tam--;
                        return ultimo;                      
            }
}
 
node *retira(node *LISTA)
{
            int opt,
                        count;
            printf("Que posicao, [de 1 ate %d] voce deseja retirar: ", tam);
            scanf("%d", &opt);
           
            if(opt>0 && opt <= tam){
                        if(opt==1)
                                   return retiraInicio(LISTA);
                        else{
                                   node *atual = LISTA->prox,
                                                *anterior=LISTA;
                                                
                                   for(count=1 ; count < opt ; count++){
                                               anterior=atual;
                                               atual=atual->prox;
                                   }
                                  
                        anterior->prox=atual->prox;
                        tam--;
                        return atual;
                        }
                                  
            }else{
                        printf("Elemento invalido\n\n");
                        return NULL;
            }
}
Comentários
Comentário:
Questão A - vale 1,5
Sua resposta atende ao que foi pedido na questão.
Nota: 1,5

Outros materiais

Materiais relacionados

Perguntas relacionadas

Materiais recentes

Perguntas Recentes