Ir ao conteúdo
  • Cadastre-se
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;
 }

 

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);    
    } 
}

 

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

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





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

×