Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
Kletian

Erros em fila circular em C

Recommended Posts

Boa tarde pessoal, tenho um trabalho de estrutura de dados para fazer, sobre filas e listas, mas estou com um pequeno problema.

A proposta do trabalho é fazer um simulador de consultas médicas, com uma fila de médicos (no máximo 3 médicos), uma fila de pacientes (no máximo 10), e seguindo o conceito de fila circular (quando o médico sai da fila em consulta, ele, quando terminar, deve retornar para o fim da fila, e os próximos pacientes que chegarem, tambem devem ir para o fim da fila de pacientes).

 

Eu fiz praticamente uma cópia do algoritmo base de fila circular (que funciona perfeitamente) passado pelo professor, no qual ele adiciona e remove caracteres, mas o problema é que nessa versão que fiz, ele parece não estar fazendo o queue/dequeue circular, mas sim apenas alterando o local de inicio e fim das filas, pois se eu tento adicionar um décimo primeiro paciente na fila (mesmo ja tendo removido alguns), ele não o faz, mas tambem não mostra a mensagem de overflow (já que o tamanho da fila, no dequeue, é diminuido em 1).

 

Alguém pode me dizer onde está o problema? Eu ainda preciso criar uma lista depois, mas acredito que da forma que está, a lista tambem vai apresentar problemas.

#include <stdio.h>#include <stdlib.h>#include <string.h>#define maxmedico 3#define maxdoente 10typedef struct{        char nome[20];        } medico;        typedef struct{        medico mediconome[maxmedico];        int iniciofilamedico;        int fimfilamedico;        int tamanho;        }filamedico;      typedef struct{        medico mediconome2[maxmedico];        int iniciofilamedico2;        int fimfilamedico2;        int tamanho;        }filaauxiliar;typedef struct{        char nome[20];        } doente;        typedef struct{        doente doentenome[maxdoente];        int iniciofiladoente;        int fimfiladoente;        int tamanho;        }filadoente;void inicializafilamedico(filamedico *F){     F->iniciofilamedico=0;     F->fimfilamedico=-1;     F->tamanho=0;     }     void inicializafilaauxiliar(filaauxiliar *F){     F->iniciofilamedico2=0;     F->fimfilamedico2=-1;     F->tamanho=0;     }        void inicializafiladoente(filadoente *F){     F->iniciofiladoente=0;     F->fimfiladoente=-1;     F->tamanho=0;     }     void QueueDoente(filadoente *F, doente doentenome){     if (F->tamanho==maxdoente)        printf ("Overflow na fila\n");        else{             F->fimfiladoente=(F->fimfiladoente+1)%maxdoente;             F->doentenome[F->fimfiladoente] = doentenome;             F->tamanho+=1;             }     }     void DequeueDoente(filadoente *F, doente *doentenome){     if (F->tamanho==0){        printf ("Underflow na fila\n");        doentenome=NULL;        }        else{             *doentenome = F->doentenome[F->iniciofiladoente];             F->iniciofiladoente=(F->iniciofiladoente+1)%maxdoente;             F->tamanho-=1;             }        }void adicionadoente(filadoente *F, doente *doentenome){     QueueDoente(F, (*doentenome));     }void listadoente(doente doentenome){    printf("\nNome: %s", doentenome.nome);}void listatodosdoentes(filadoente *F){    int i;    doente doentenome;    printf("\nLISTA DE DOENTES ESPERANDO ATENDIMENTO:\n");    for(i = F->iniciofiladoente; i< F->fimfiladoente+1; i++){          doentenome = F->doentenome[i];          listadoente(doentenome);        }}     void QueueMedico(filamedico *F, medico mediconome){     if (F->tamanho==maxmedico)        printf ("Overflow na fila\n");        else{             F->fimfilamedico=(F->fimfilamedico+1)%maxmedico;             F->mediconome[F->fimfilamedico] = mediconome;             F->tamanho+=1;             }     }void QueueMedicoAuxiliar(filaauxiliar *F, medico mediconome2){     if (F->tamanho==(maxmedico))        printf ("Overflow na fila\n");        else{             F->fimfilamedico2=(F->fimfilamedico2 +1)%maxmedico;             F->mediconome2[F->fimfilamedico2] = mediconome2;             F->tamanho+=1;                         }       }void DequeueMedico(filamedico *F, medico *mediconome){     if (F->tamanho==0){        printf ("Underflow da na fila\n");        mediconome = NULL;        }        else{             *mediconome = F->mediconome[F->iniciofilamedico];             F->iniciofilamedico=(F->iniciofilamedico+1)%maxmedico;             F->tamanho-=1;             }                  }void DequeueMedicoAuxiliar(filaauxiliar *F, medico *mediconome2){     if (F->tamanho==0){        printf ("Underflow da na fila\n");        mediconome2 = NULL;        }        else{             *mediconome2 = F->mediconome2[F->iniciofilamedico2];             F->iniciofilamedico2=(F->iniciofilamedico2 +1)%maxmedico;             F->tamanho-=1;                          }     }             void adicionamedico(filamedico *F, medico *mediconome){      QueueMedico(F, (*mediconome));     }void adicionamedicoauxiliar(filaauxiliar *F, medico *mediconome2){      QueueMedicoAuxiliar(F, (*mediconome2));     }void listamedico(medico mediconome){    printf("\nNome: %s", mediconome.nome);}void listatodosmedicos(filamedico *F){    int i;    medico mediconome;    printf("\nLISTA DE MEDICOS DISPONIVEIS:\n");    for(i = F->iniciofilamedico ; i< F->fimfilamedico+1; i++){          mediconome = F->mediconome[i];          listamedico(mediconome);        }}void listamedicoauxiliar(medico mediconome2){    printf("\nNome: %s", mediconome2.nome);}void listatodosmedicos2(filaauxiliar *F){    int i;    medico mediconome2;    printf("\nLISTA DE MEDICOS DISPONIVEIS auxiliar:\n");    for(i = F->iniciofilamedico2; i< F->fimfilamedico2+1; i++){          mediconome2 = F->mediconome2[i];          listamedicoauxiliar(mediconome2);        }}     void consultas(filamedico *F, filadoente *J, filaauxiliar *K){          medico auxchar;          medico mediconome = F->mediconome[F->iniciofilamedico];     strcpy(auxchar.nome, mediconome.nome);          doente doentenome = J->doentenome[J->iniciofiladoente];     printf("\n\nMedico %s chamou o paciente %s para consulta\n", mediconome.nome, doentenome.nome);                    adicionamedicoauxiliar(K, &auxchar);     DequeueMedico(F, &mediconome);     DequeueDoente(J, &doentenome);               }     void terminaconsulta(filaauxiliar *F, filamedico *K){     medico auxchar;          medico mediconome2 = F->mediconome2[F->iniciofilamedico2];     strcpy(auxchar.nome, mediconome2.nome);          printf ("\n\nMedico %s terminou o atendimento e esta pronto para atender novamente\n\n", mediconome2.nome);          adicionamedico(K, &auxchar);     DequeueMedicoAuxiliar(F, &mediconome2);     }          void main(){     filamedico fila_1;     filadoente fila_2;     filaauxiliar fila_3;     int i;               inicializafilamedico(&fila_1);     inicializafiladoente(&fila_2);     inicializafilaauxiliar(&fila_3);          medico medico1;     strcpy(medico1.nome, "kiritsugu");     adicionamedico(&fila_1, &medico1);     medico medico2;     strcpy(medico2.nome, "tokiyomi");     adicionamedico(&fila_1, &medico2);     medico medico3;     strcpy(medico3.nome, "kirei");     adicionamedico(&fila_1, &medico3);     doente doente1;     strcpy(doente1.nome, "saber");     adicionadoente(&fila_2, &doente1);     doente doente2;     strcpy(doente2.nome, "gilgamesh");     adicionadoente(&fila_2, &doente2);     doente doente3;     strcpy(doente3.nome, "lancer");     adicionadoente(&fila_2, &doente3);     doente doente4;     strcpy(doente4.nome, "Iskandar");     adicionadoente(&fila_2, &doente4);     doente doente5;     strcpy(doente5.nome, "Caster");     adicionadoente(&fila_2, &doente5);     doente doente6;     strcpy(doente6.nome, "Archer");     adicionadoente(&fila_2, &doente6);     doente doente7;     strcpy(doente7.nome, "Shirou");     adicionadoente(&fila_2, &doente7);          doente doente8;     strcpy(doente8.nome, "Rin");     adicionadoente(&fila_2, &doente8);          doente doente9;     strcpy(doente9.nome, "Ilyasviel");     adicionadoente(&fila_2, &doente9);          doente doente10;     strcpy(doente10.nome, "Sakura");     adicionadoente(&fila_2, &doente10);               listatodosmedicos(&fila_1);     printf("\n\n");     listatodosdoentes(&fila_2);          consultas(&fila_1, &fila_2, &fila_3);     consultas(&fila_1, &fila_2, &fila_3);          listatodosmedicos(&fila_1);     printf("\n\n");     listatodosdoentes(&fila_2);               listatodosmedicos2(&fila_3);          terminaconsulta(&fila_3, &fila_1);          listatodosmedicos(&fila_1);     printf("\n\n");          listatodosmedicos2(&fila_3);          consultas(&fila_1, &fila_2, &fila_3);     terminaconsulta(&fila_3, &fila_1);      listatodosmedicos(&fila_1);     printf("\n\n");     listatodosmedicos2(&fila_3);               listatodosdoentes(&fila_2);     getch();}

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • Consegui descobrir o problema depois de ver um video no youtube sobre estrutura de dados. Ao que parece, o meu #define maxmedico e #define maxdoente estava na verdade definindo a quantidade máxima de consultas diárias, e não a quantidade de elementos da fila. Pra resolver defini ambos como 100, e criei outras duas globais de 3 médicos e 10 pacientes, que usei para fazer a comparação com o tamanho da fila (se tamanho = max), para gerar a mensagem de overflow, e fazer ela andar de forma circular.

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites

    Crie uma conta ou entre para comentar

    Você precisar ser um membro para fazer um comentário






    Sobre o Clube do Hardware

    No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

    Direitos autorais

    Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

    ×