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);
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 a, Funcionario 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 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 resp = busca(n,a,name);
printf("%s\n", resp->nome);
printf("%d %.1f\n", resp->horas_mes, resp->valor_hora);
}
to ligado, os casos de testes já tão em ordem.
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…



1 curtida