Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

sidneimarques

com agenda em c [pesquisa binaria]

Recommended Posts

Bom dia galera!

 

fiz este código, que deve ser uma agendinha simples com recurso de busca, estou fazendo a pesquisa binaria, porém no momento da compilação o gcc retorna um erro na parte de ordenação:

 

171 F:\Pessoal\c\contatos.c [Warning] assignment makes integer from pointer without a cast

 

aqui esta o codigo, se alguém puder me ajudar, fico agradecido!

 

 

#include<stdio.h>#include<ctype.h>#include<stdlib.h>#include<string.h>#define TAMANHO 1000struct list	{	char nome[40];	char endereco[40];	char tel_res[30];	char tel_cel[3];	char email[10];	}list[TAMANHO], x, xi, xmin;//struct list list[TAMANHO], x, xi, xmin;FILE *fp;void mostra_nomes(), recebe_dados(),pesquisa(),ordena();int troca (int *a, int *b), menu();main (){	char choice;   	/*CRIA O ARQUIVO OU ABRE UM EXISTENTE*/      	fp=fopen("agenda.dat", "r+b");	if (!fp)	{   fp=fopen("agenda.dat", "w+b");   if (!fp)	   {	  printf("Nao foi possivel abrir o arquivo.%s\n");	  return 1;	   }	}      	for(;;) {   choice=menu();   switch(choice) {	   case 'i' : recebe_dados();	  break;	   case 'p' : pesquisa();	  break;	   case 't' : exit(0);\	   default : printf("\a\a\a\t\nOpcao Invalida!\n\n\n");   }	}}/*Poe os nome na lista*/void recebe_dados()  {   	   	register int i,j;   	for(i=0;i<TAMANHO;i++)   if(!*list[i].nome) break;	      if(i==TAMANHO)   {	   printf("Lista Cheia!");	   return;   }      printf("Nome: ");   gets(list[i].nome);      printf("Endereco: ");   gets(list[i].endereco);      printf("Fone Residencial: ");   gets(list[i].tel_res);      printf("Celular: ");   gets(list[i].tel_cel);      printf("e-mail: ");   gets(list[i].email);   		//GRAVA OS DADOS NO ARQUIVO		fseek(fp, 0, SEEK_END);//PROCURA O FIM DO ARQUIVO   		fwrite(&list[i],sizeof(list), 1, fp);//ESCREVE NO ARQUIVO		fflush(fp);//DESCARREGA O BUFFER	     }/*Mostra a Listavoid mostra_nomes(){	register int t;	   	for(t=0;t<TAMANHO;t++)	{   if(*list[t].nome)   {   FILE *fp;   rewind(fp);   fread(&list[t], sizeof(list), 1, fp);	   {	  if (feof(fp))	  printf("Erro de leitura no arquivo.\n");	   }	   printf("%s\n", list[t].nome);	   printf("%s\n", list[t].endereco);	   printf("%s\n", list[t].tel_res);	   printf("%s\n", list[t].tel_cel);	   printf("%s\n\n", list[t].email);   }	}}*//*mostra o menu*/int menu(){	char s[80];   	do	{   printf("(I)nserir\n");   printf("(V)isuzalizar Lista\n");   printf("(P)esquisar\n");		printf("(T)erminar\n");   printf("Selecione uma opcao: ");      gets(s);	}   	while(!strchr("ivot", tolower(*s)));	return tolower(*s);}void pesquisa(){	// struct list x[TAMANHO];	 int id_nome, inicio, final, meio,  jmin, telefone;	 int tab_nome[TAMANHO], tabreg[TAMANHO];	 int k,i, j;	 	 	 /* le todo o arquivo, guardando apenas a identificação do produto	 e o número do registro*/	 k = 0;	 while (fread(&list, sizeof(struct list), 1, fp))	 {	 		   tab_nome[k] = x.nome;		   tabreg[k] = k;		   k++;	 }// o arquivo tem k registros (0, 1, 2, ..., k - 1)telefone = k;// ordena tab_nome permutando também tabregfor (i = 0; i < k - 1; i++){// minimo a partir de i   jmin = i;   for (j = i + 1; j <= k - 1; j++)	   if (tab_nome[j] < tab_nome[jmin]) jmin = j;// troca elemento j com jmintroca (&tab_nome[i], &tab_nome[jmin]);troca (&tabreg[i], &tabreg[jmin]);}/* agora que a tabela está ordenada, basta fazer busca binária no// elementoprocurado neesta tabela, e ler o registro caso ele existaprocura registros até que seja digitado um númeero negativo*/while (1){	  // entra com o número de identificação do registro	  printf("\nDigite o nome a ser pesquisado: ");	  scanf("%d", &id_nome);	  if (id_nome < 0) break;// faz busca binaria na tabelainicio = 0;final = telefone - 1;while (inicio <= final){	  // testa com o elemento do meio	  meio = (inicio + final) / 2;	  if (tab_nome[meio] == id_nome)		 {						// achou portanto posiciona no registro a ser lido						fseek(fp, tabreg[meio] * sizeof(struct list), 0);						// le o registro e mostra o registro						fread(&x, sizeof(struct list), 1, fp);						printf("\n registro encontrado em %5d:%5d - %.20s - %5d - %10.2lf", tabreg[meio], x.nome, x.tel_res, x.tel_cel, x.endereco, x.email);						break;		 }else // verifica se está abaixo ou acima	 if (tab_nome[meio] > id_nome) final = meio - 1;	 else inicio = meio + 1;}// verifica se saiu do while porque encontrou ou nãoif (inicio > final) printf("Nao existe esse nome!");    }}int troca (int *a, int *b){	 int aux = *a; *a = *b; *b = aux;}

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim... resolvi este problema de tipos...

 

porém a busca não funciona, compila e tal mas não busca os nomes.... eis o novo código(melhorado)

 

se puder ajudar fico agradecido!

 

#include<stdio.h>#include<ctype.h>#include<stdlib.h>#include<string.h>#define TAMANHO 1000struct list 	{	char nome[40];	char endereco[40];	char tel_res[30];	char tel_cel[3];	char email[10];	}list[TAMANHO], x, xi, xmin; //struct list list[TAMANHO], x, xi, xmin;FILE *fp; void mostra_nomes(), recebe_dados(),pesquisa(),ordena();int menu();void troca (char *a, char *b);main (){	char choice;		/*CRIA O ARQUIVO OU ABRE UM EXISTENTE*/			fp=fopen("agenda.dat", "r+b");	if (!fp)	{	fp=fopen("agenda.dat", "w+b");	if (!fp)		{		printf("Nao foi possivel abrir o arquivo.%s\n");		return 1;		}	}			for(;;) {	choice=menu();	switch(choice) {		case 'i' : recebe_dados();		break;		case 'p' : pesquisa();		break;		case 't' : exit(0);\		default : printf("\a\a\a\t\nOpcao Invalida!\n\n\n");	}	}}/*Poe os nome na lista*/void recebe_dados()  {		   	register int i,j;		for(i=0;i<TAMANHO;i++)	if(!*list[i].nome) break;			if(i==TAMANHO) 	{		printf("Lista Cheia!");		return;	}		printf("Nome: ");	gets(list[i].nome);		printf("Endereco: ");	gets(list[i].endereco);		printf("Fone Residencial: ");	gets(list[i].tel_res);		printf("Celular: ");	gets(list[i].tel_cel);		printf("e-mail: ");	gets(list[i].email);			//GRAVA OS DADOS NO ARQUIVO		fseek(fp, 0, SEEK_END);//PROCURA O FIM DO ARQUIVO			fwrite(&list[i],sizeof(list), 1, fp);//ESCREVE NO ARQUIVO		fflush(fp);//DESCARREGA O BUFFER			}/*mostra o menu*/int menu(){	char s[80];		do	{	printf("(I)nserir\n");	printf("(V)isuzalizar Lista\n");	printf("(P)esquisar\n");	printf("(T)erminar\n");	printf("Selecione uma opcao: ");		gets(s);	}		while(!strchr("ivpt", tolower(*s)));	return tolower(*s);}void pesquisa(){	 int id_nome, inicio, final, meio,   telefone;	 char tab_nome[TAMANHO][40] ,pesq[TAMANHO],y[TAMANHO], resp;// x[TAMANHO];	 int tabreg[TAMANHO],jmin;	 int i, k, comeco, acha, j;	 	 	 /* le todo o arquivo, guardando apenas o nome*/	 k = 0;	 while (fread(&x, sizeof(list), 1, fp))	 {	 		   strcpy(tab_nome[k],  x.nome);		   tabreg[k] = k;		   k++;	 } 	   //Ordenacao	for(i=0; i<= k-1;i++)	   {		for(j=i+1; j<= k-1; j++)		   {			if(strcmp(tab_nome[i],tab_nome[j])==0)				{				 strcpy(y,tab_nome[i]);				 strcpy(tab_nome[i],tab_nome[j]);				 strcpy(tab_nome[j],y);	 			}			}		}     do	  {	  printf("\nEntre com o nome a ser pesquisado:" );	  gets(pesq);	  comeco=k;	  final=k-1;	  acha=0;			while((comeco<=final) && (acha==0))		{		 meio=(comeco+final)/2;		   if((strcmp (pesq, tab_nome[meio]))==0)			acha=1; // ACHOU		   else 			  if((strcmp (pesq, tab_nome[meio]))<0)			final=meio-1;			  else			comeco=meio+1;		}	  if(acha==1)		printf("\n A pesquisa foi localizada na posicao %i", meio);	  else		printf("\n A pesquisa nao foi localizada. "); 		printf("\n Deseja continuar? [S]im ou [N]ao");		scanf("%c",&resp);	 }	while(resp=='s' || resp=='S');	return 0;}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom primeiro..

a funçao pesquisa() eh do tipo void, entao naum tem q retornar nada.. beleza..

 

analise o trecho dentro da funçao pesquisa()

comeco=k;	  final=k-1;	  acha=0;			while((comeco<=final) && (acha==0))		{
a variavel comeco(k) eh maior q final(k-1)..

teu codigo nunca vai entrar no while p fazer a pesquisa...

 

flw http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

veja se deu certo..

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.