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

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

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

×