Busca em Vetor de Ponteiros em C

5 respostas Resolvido
cprogramação
M

Considere um tipo que representa um funcionario de uma empresa, definido pela estrutura a seguir:

typedef struct funcionario Funcionario;
struct funcionario {
char nome[81]; // nome do funcionario
float valor_hora; // valor da hora de trabalho em Reais
int horas_mes; // horas trabalhadas em um mês
};

Escreva uma função que faça uma busca binária em um vetor de ponteiros para o tipo Funcionario, cujos elementos estão em ordem alfabética dos nomes dos funcionários. Esta função deve receber como parâmetros o número de funcionários, o vetor e o nome do funcionário que se deseja buscar, e deve ter como valor de retorno um ponteiro para o registro do funcionário procurado. Se não houver um funcionário com o nome procurado, a função deve retornar NULL. A função deve obedecer ao seguiinte protótipo:

Funcionario* busca (int n, Funcionario** v, char* nome);

5 Respostas

M

Segue meu código, não encontro o erro
typedef struct funcionario Funcionario;

struct funcionario{

char nome[81];

float valor_hora;

int horas_mes;

};
static int comp(char <em>a, Funcionario</em> b){

return strcmp(a,b->nome);

}
Funcionario* busca(int n, Funcionario** v, char* nome){

int i, ini, fim, meio, cmp;

ini = 0;

fim = n - 1;

while(ini <= fim){

meio = (ini + fim) / 2;

cmp = comp(nome,v[meio]);

if(cmp < 0)

fim = meio - 1;

else if(cmp > 0)

ini = meio + 1;

else

return v[meio];
}
return NULL;

}

int main(){

int i, n;

char name[85];

scanf("%d", &n);

Funcionario *a[n];

for(i = 0; i < n; i++){

Funcionario <em>vet = malloc(sizeof(Funcionario));

a[i] = vet;

scanf("%s", vet->nome);

scanf("%d", &vet->horas_mes);

scanf("%f", &vet->valor_hora);

}

scanf("%s", name);

Funcionario</em> resp = busca(n,a,name);

printf("%s\n", resp->nome);

printf("%d %.1f\n", resp->horas_mes, resp->valor_hora);

}
I

Observação: a busca binária só funciona em vetor ordenado.

1 - Programação Descomplicada - Busca em Vetor de Struct
2 - IME/USP - Busca Binária

M

to ligado, os casos de testes já tão em ordem.

I
Solucao aceita

Bom, já que não teve uma solução, lá vai…

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

typedef struct funcionario Funcionario;
struct funcionario{
    char nome[81];
    float valor_hora;
    int horas_mes;
};

int comparador(char* nome, Funcionario* f){
    return strcmp(nome, f->nome);
}

Funcionario* busca(int n, Funcionario** v, char* nome){
    int comparacao;
    int inicio = 0;
    int fim = n - 1;
    int meio = (inicio + fim + 1) / 2;

    while(inicio <= fim){
        comparacao = comparador(nome, v[meio]);
        
        if(comparacao == 0)
            return v[meio];

        else if(comparacao < 0)
            fim = meio - 1;
        else
            inicio = meio + 1;

        meio = (inicio + fim + 1) / 2;
    }
    return NULL;
}

void limpar(int n, Funcionario** a){
    int i;
    for(i = 0; i < n; i++)
        free(*a);

    free(a);
}

int main(){
    int i, n;
    char nomeInformado[81];
    Funcionario* funcionario = NULL;

    printf("\nInforme o número de funcionários: ");
    scanf("%d", &n);
    setbuf(stdin, NULL);

    Funcionario* a[n];

    for(i = 0; i < n; i++){
        Funcionario* vetor = (Funcionario*) malloc(sizeof(Funcionario));
        a[i] = vetor;

        printf("\nNome: ");
        scanf("%[^\n]81s", vetor->nome);
        setbuf(stdin, NULL);

        printf("Valor da hora: ");
        scanf("%f", &vetor->valor_hora);
        setbuf(stdin, NULL);

        printf("Carga horária mensal: ");
        scanf("%d", &vetor->horas_mes);
        setbuf(stdin, NULL);
    }

    printf("\nInforme o nome a ser pesquisado: ");
    scanf("%s", nomeInformado);
    setbuf(stdin, NULL);

    funcionario = busca(n, a, nomeInformado);
    if(funcionario != NULL)
        printf("\t\nNome: %s\t\nValor/h: %.2f\t\nHoras/mês: %d", funcionario->nome, funcionario->valor_hora, funcionario->horas_mes);
    else
        printf("\t\nFuncionário não cadastrado!");

    limpar(n, a);

    printf("\n\n");
    system("pause");
    return 0;
}

Rodando…

image

image

image

M

vlw brother!

Criado 11 de dezembro de 2019
Ultima resposta 13 de dez. de 2019
Respostas 5
Participantes 2