Boa noite, estou com duvida quanto a busca binaria e recuperação por backup. Alguém poderia me ajudar na implementação do código?
Meu código é esse abaixo...
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include<locale.h>
#include<windows.h>
struct funcionario{
char nome[30];
int codigo;
float salario;
int e;
};
int main(void){
setlocale(LC_ALL,"");
struct funcionario f,fi,fj;
FILE *fptr,*fpraux,*fprback;
int i,j,n,low,high,mid;
char nomeaux[30],op,opcao;
do{
system("cls");
printf("1=[Cadastro]\n");
printf("2=[Consulta]\n");
printf("3=[Alteração]\n");
printf("4=[Exclusão Lógica]\n");
printf("5=[Exclusão Física]\n");
printf("6=[Ordenação]\n");
printf("7=[Busca Binária]\n");
printf("8=[Recuperar Backup]\n");
printf("9=[Sair]\n");
op=getche();
switch(op){
case'1':if((fptr=fopen("funciona.bi","rb+"))==NULL)
{
if((fptr=fopen("funciona.bi","wb"))==NULL)
{
printf("\n erro");
exit(1);
}
}
system("cls");
printf(" Entre Com o Nome : ");
fflush(stdin);
fgets(f.nome,40,stdin);
fflush(stdin);
printf(" Codigo: ");
scanf("%d",&f.codigo);
printf(" Salario: ");
scanf("%f",&f.salario);
f.e=0;
fseek(fptr,0,2);
fwrite(&f,sizeof(f),1,fptr);
fclose(fptr);
break;/*Cadastro*/
case '2':if((fptr=fopen("funciona.bi","rb"))==NULL)
{
printf("\n erro");
getch();
exit(1);
}
system("cls");
fseek(fptr,0,0);
while(fread(&f,sizeof(f),1,fptr))
{
if(f.e==0){
printf("\n---------------------------");
printf("\n Nome: %s",f.nome);
printf("\n Código: %.2d",f.codigo);
printf("\n Salário: %.2f",f.salario);
}
}
getch();
fflush(stdin);
fclose(fptr);
break;/*Consulta*/
case '3':if((fptr=fopen("funciona.bi","rb+"))==NULL)
{
printf("\n erro");
exit(1);
}
printf("\nEntre com o nome do funcionario para alocar salario: ");
fflush(stdin);
fgets(nomeaux,40,stdin);
fflush(stdin);
fseek(fptr,0,0);
while(fread(&f,sizeof(f),1,fptr)){
if(strcmp(f.nome,nomeaux)==0)
if(f.e==0){
printf("entre com o novo salario");
scanf("%f",&f.salario);
fseek(fptr,ftell(fptr)-sizeof(f),0);
fwrite(&f,sizeof(f),1,fptr);
fseek(fptr,0,2);
}
}
fclose(fptr);
break;
case '4':if((fptr=fopen("funciona.bi","rb+"))==NULL)
{
printf("\n erro");
exit(1);
}
printf("\nEntre com o nome do funcionário para excluir logicamente: ");
fflush(stdin);
fgets(nomeaux,40,stdin);
fflush(stdin);
fseek(fptr,0,0);
while(fread(&f,sizeof(f),1,fptr)){
if(strcmp(f.nome,nomeaux)==0)
if(f.e==0){
f.e=1;
fseek(fptr,ftell(fptr)-sizeof(f),0);
fwrite(&f,sizeof(f),1,fptr);
fseek(fptr,0,2);
}
}
fclose(fptr);
break;
case '5':
if((fptr=fopen("funciona.bi","rb+"))==NULL){
printf("\n erro");
exit(1);
}
if((fpraux=fopen("auxili.bi","wb"))==NULL){
printf("\n erro");
exit(1);
}
if((fprback=fopen("back.bi","rb+"))==NULL){
if((fprback=fopen("back.bi","wb"))==NULL){
printf("\n erro");
exit(1);
}
}
while(fread(&f,sizeof(f),1,fptr)){
if(f.e==0){
fseek(fpraux,0,2);
fwrite(&f,sizeof(f),1,fpraux);
}
else{fseek(fprback,0,2);
fwrite(&f,sizeof(f),1,fprback);
}
}
fclose(fptr);
fclose(fpraux);
fclose(fprback);
remove("funciona.bi");
rename("auxili.bi", "funciona.bi");
break;
case '6':
if((fptr=fopen("funciona.bi","rb+"))==NULL){
printf("\n erro");
exit(1);
}
fseek(fptr,0,2);
n=ftell(fptr)/sizeof(f);
for(i=0 ; i<n-1; i++)
for(j=0; j<n; j++){
fseek(fptr, i*sizeof(f),0);
fread(&fi,sizeof(f),1,fptr);
fseek(fptr,j*sizeof(f),0);
fread(&fj,sizeof(f),1,fptr);
if(strcmp(fi.nome, fj.nome) > 0){
fseek(fptr, i*sizeof(f),0);
fwrite(&fj,sizeof(f),1,fptr);
fseek(fptr,j*sizeof(f),0);
fwrite(&fj,sizeof(f),1,fptr);
}
}
fclose(fptr);
break;
case '7': //busca binaria
if((fptr=fopen("funciona.bi","rb+"))==NULL){
printf("\n erro");
exit(1);
}
int x,e,pos, binario, elem;
printf("\nEntre com o nome do funcionario: ");
fflush(stdin);
fgets(nomeaux,40,stdin);
fflush(stdin);
fseek(fptr,0,0);
while(fread(&f, sizeof(f),1,fptr)){
if(strcmp(f.nome,nomeaux)== 0)
if(f.e==0){
low= 0;
high= n-1;
while(low <= high){
mid = (low + high)/2;
if (nomeaux[mid] > elem){
high= mid - 1;
}else if (nomeaux[mid] < elem){
low= mid + 1;
}else{
return mid;
}
}
return -1;
}
while(fread(&f, sizeof(f),1,fptr)){
if(strcmp(f.nome,nomeaux)== 0)
if(f.e==0){
printf("\n---------------------------");
printf("\n Nome: %s",f.nome);
printf("\n Código: %.2d",f.codigo);
printf("\n Salário: %.2f",f.salario);
}
}
}
getch();
fflush(stdin);
fclose(fptr);
break;
case '8': //recuperação backup
if((fprback=fopen("back.bi","rb"))==NULL){
printf("\n erro");
exit(1);
}
system("cls");
fseek(fprback,0,2);
while(fread(&f,sizeof(f),1,fprback)){
if(f.e==0){
printf("\n---------------------------");
printf("\n Nome: %s",f.nome);
printf("\n Código: %.2d",f.codigo);
printf("\n Salário: %.2f",f.salario);
}
}
getch();
fflush(stdin);
fclose(fprback);
break;
defaut:
printf("\nOpção %c Invalida",op);
break;
}
}while(op!='9');/*Sair*/
system("cls");
printf("Saindo.");
Sleep(400);
system("cls");
}