sidneimarques 0 Denunciar post Postado Maio 22, 2006 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
ricci ottadnot 4 Denunciar post Postado Maio 23, 2006 eu naum testei mas pelo q analizei na funçao pesquisa, na linha tab_nome[k] = x.nome;tab_nome eh vetor do tipo inteiro e x.nome eh uma string.. talvez seja isto, nao?! Compartilhar este post Link para o post Compartilhar em outros sites
sidneimarques 0 Denunciar post Postado Maio 23, 2006 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
ricci ottadnot 4 Denunciar post Postado Maio 23, 2006 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