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:  
Yan David

C Resolução para questão de fila

Recommended Posts

Questão:

O tribunal eleitoral precisa de alguma maneira organizar pessoas que farão recadastramento biométrico. Faça um programa que leia o nome e a idade de pessoas que serão colocados em uma fila de espera para fazer o recadastramento. O programa deverá pôr em uma estrutura as pessoas abaixo de 65 anos e as pessoas cuja idade for maior ou igual que 65 anos, cuidando para que estas últimas sejam atendidas primeiro.

 

Alguém me ajuda a terminar esse código, por favor.

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>

struct Eleitor{
    int idade;
    char nome[30]; 
}eleitor;

struct Elemento{
    Eleitor *dados;
    struct Elemento *proximo;
}elemento;

struct Fila{
    Elemento *inicio;
    Elemento *final;
};

typedef struct Fila fila;
fila * cria_fila (){
    fila *fi = (fila *) malloc (sizeof(fila));
    if(fi != NULL){
        fi->inicio = NULL;
        fi->final = NULL;
    }
    return fi;
}

int fila_vazia(fila * fi){
    if(fi == NULL) return 1;
    if(fi->inicio == NULL)
    return 1;
    return 0;
}

int insere_fila (fila *fi, Eleitor *el){
    if (fi == NULL)
        return 0;
    Elemento *no;
    no = (Elemento *) malloc (sizeof(Elemento));
    if(no == NULL)
        return 0;
    no->dados = el;
    no->proximo = NULL;
    if(fi->final == NULL){
        fi->inicio = no;
    }else{
        fi->final->proximo = no;
        fi->final = no;
    }
    return 1;
}

void retira_fila (fila *fi) {
    Elemento *elemento;
    if (!fi->inicio == NULL) {
        elemento = fi->inicio;
        fi->inicio = elemento->proximo;
        free(elemento);
        // -> Se a fila acabou devemos atualizar o final
        if (fi->inicio == NULL)
            fi->final = NULL;
    }
}

void mostrar_fila (fila *fi) {
    int i = 0;
    Elemento *elemento;
    printf("\n\n Listando...\n\n");
    printf("---------------------------------\n");
    if (fi->inicio == NULL) {
        printf ("A Fila esta vazia!\n");
    } else {
        elemento = fi->inicio;
        while(elemento != NULL) {
            i++;
            printf("[%i] -> %d - %s\n", i, elemento->eleitor.idade, elemento->eleitor.nome);
            elemento = elemento->proximo;
        }
    }
    printf("---------------------------------\n");
}

int menu() {
    int procedimento;
    printf("(0) Sair\n(1) Abrir fila\n(2) Inserir eleitor\n(3) Atender eleitor\n(4) Exibir fila\n\nInsira o valor do procedimento desejado: ");
    scanf("%d", &procedimento);
    return procedimento;
}

int main() {
    char aux1[30];
    int aux2, procedimento;
    procedimento = menu();
    switch (procedimento) {
    case 1:
        fila *novaFila = cria_fila();
    break;
    case 2:
        eleitor *novoEleitor = (eleitor *)malloc(sizeof(eleitor));
        printf ("Informe o nome do eleitor: ");
        gets(aux1);
        printf ("Informe a idade do eleitor: ");
        scanf("%d", &aux2);
        strcpy(novoEleitor->nome, aux1);
        novoEleitor->idade= aux2;
        insere_fila(novaFila, novoEleitor);
    break;
    case 3:
        retirar_fila();
    break;
    case 4:
        mostrar_fila();
    break;
    }
    return 0;
 }

 

Editado por Simon Viegas
Olá! Favor ler tópico e seguir orientações sobre POSTAGEM DE CÓDIGOS: http://www.clubedohardware.com.br/announcement/27-poste-seus-c%C3%B3digos-corretamente/

Compartilhar este post


Link para o post
Compartilhar em outros sites
struct Eleitor{
    int idade;
    char nome[30];
    int prioridade;
}eleitor;

tu pode criar uma fila de prioridade, se a pessoa tiver menos de 65 o prioridade recebe 0 senão 1

e no retirar_fila() primeiro verifica a partir do inicio se tiver alguém com prioridade, se tiver ele será o próximo a ser atendido, senão atende normalmente o primeiro da fila

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá a todos.

 

14 horas atrás, Gabriel_Moro disse:

tu pode criar uma fila de prioridade, se a pessoa tiver menos de 65 o prioridade recebe 0 senão 1

e no retirar_fila() primeiro verifica a partir do inicio se tiver alguém com prioridade, se tiver ele será o próximo a ser atendido, senão atende normalmente o primeiro da fila

 

Nesse caso terás uma redundância desnecessária, pois a prioridade está intrinsecamente relacionada a idade. Logo, não precisa da variável (não deve ter)... basta apenas verificar a sua idade e ver se encaixa na prioridade ou não.

 

Simplificando: onde supostamente iria ter "se prioridade=1 faça", deveria ter "se idade>IDADE_PRIORIDADE faça".

 

 

ADENDO: da mesma forma que normalmente se perguntaria a "data de nascimento", não a idade. A idade é fruto do cálculo com o dia atual, basta subtrair!... da mesma forma que a prioridade (idoso?) é baseado com a faixa de idade (65 anos) com a idade atual do eleitor (que foi por sua vez já calculado).

 

 

 

No aguardo.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
  • Autor do tópico
  • Meu código ainda está em andamento, implementei na função de mostrar a fila uma forma de mostrar as prioridades primeiro, porém ainda não pensei na forma de retirar as prioridades primeiro na hora de chamar a função retirar. Quem tiver alguma ideia de como implementar isso... estou aceitando!

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <conio.h> 
    #include <string.h>
    
    struct Eleitor { 
        int idade; 
        char nome[30];
        int prioridade; 
    };
    struct Item { 
        Eleitor eleitor; 
        struct Item *proximo; 
    };
    struct Fila { 
        Item *inicio; 
        Item *fim; 
    };
    
    void Inicializar(Fila **fila) { 
        // -> Recebe a fila por referencia 
        //    para inicializá-la 
        *fila = (Fila *) malloc(sizeof(Fila)); 
        (*fila)->inicio = NULL; 
        (*fila)->fim = NULL; 
    }
    int EstaVazia(Fila *fila) { 
        return fila->inicio == NULL; 
    }
    void Inserir(Fila *fila, Eleitor elemento) { 
        Item *novo; 
        novo = (Item *)malloc(sizeof(Item));  
        // -> Verifica se a memória foi alocada com sucesso 
        if (novo != NULL) {
         
            strcpy(novo->eleitor.nome, elemento.nome); 
            novo->eleitor.idade = elemento.idade;
      	novo->eleitor.prioridade = elemento.prioridade;
            novo->proximo = NULL;
            if(EstaVazia(fila)) { 
                // -> Primeiro Item da Fila. 
                fila->inicio = novo; 
                fila->fim = novo; 
            } else { 
                // -> Ultimo item da Fila 
                fila->fim->proximo = novo; 
                fila->fim=novo; 
            } 
        } 
    }
    void Retirar(Fila *fila) { 
        Item *item;
        if(!EstaVazia(fila)) { 
            item = fila->inicio; 
            fila->inicio = item->proximo; 
            free(item);
            // -> Se a fila acabou devemos atualizar o final 
            if (fila->inicio == NULL) 
                fila->fim = NULL; 
        } 
    }
    void MostrarFila(Fila *fila) { 
        int i = 0; 
        Item *item; 
           
        system("cls");
        printf("# Fila de eleitores #\n\n"); 
        printf("---------------------------------\n");
        if (EstaVazia(fila)) { 
            printf ("Nao ha eleitores na fila!\n"); 
        } else {       
            item = fila->inicio;
            i = 1;
            while(item != NULL) {
                if (item->eleitor.prioridade == 1) {
                    printf("[%i] -> Idade: %i | Nome: %s\n", i, item->eleitor.idade, item->eleitor.nome); 
                    i++;
                }
                item = item->proximo;            
            }
            
            item = fila->inicio;
            
            while (item != NULL) {
                if (item->eleitor.prioridade == 0) {
                    printf("[%i] -> Idade: %i | Nome: %s\n", i, item->eleitor.idade, item->eleitor.nome); 
                    i++; 
                }
                item = item->proximo;
            }
             
        }
        printf("---------------------------------\n"); 
    }
    
    void Menu() { 
        printf("# Tribunal Eleitoral #\n\n(1) Adicionar eleitor \n(2) Atender eleitor \n(3) Listar eleitores na fila\n(4) Finalizar atendimento \nEscolha a opcao desejada: "); 
    }
    
    int main() {    
        Fila *fila = NULL; 
        int opcao; 
        Eleitor eleitor;
        Inicializar(&fila); 
        Menu(); 
        scanf("%i", &opcao);
        while (opcao != 4) {
            switch (opcao) {
             
                case 1:
                    system("cls");
                    printf("# Adicionar eleitor #\n\n"); 
                    printf("Insira a idade do eleitor: "); 
                    scanf("\n%i", &eleitor.idade);
                    printf("Insira o nome do eleitor: "); 
                    scanf("\n%s", &eleitor.nome);
                    
                    if (eleitor.idade >= 65) {
                        eleitor.prioridade = 1;
                    } else {
                        eleitor.prioridade = 0;
                    }
                    
                    Inserir(fila, eleitor);
                    printf("\nO eleitor foi inserido na fila com sucesso!\n\n");
                    system("pause");
                    system("cls"); 
                    Menu();
                break;
                             
                case 2: 
                    Retirar(fila);
                    system("cls");
                    printf("Primeiro eleitor da fila atendido com sucesso!\n\n");
                    system("pause");
                    system("cls"); 
                    Menu();
                break;
                case 3:
                    MostrarFila(fila);
                    system("pause");
                    system("cls");
                    Menu();
                break;
                default:
                    system("cls");
                    printf("Escolha invalida!\n\n"); 
                    Menu(); 
                break; 
            }
            scanf("%i", &opcao);    
        } 
    }

     

    Editado por Yan David

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • Eu vi um outro tópico com uma dúvida que acho que é parecida com a minha.

    Porém como posso implementar isso no meu código exposto acima?

     

    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

    ×