Ir para conteúdo

POWERED BY:

Arquivado

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

Pablo Honey

Problema em Lista - strcmp nao compara nada...

Recommended Posts

Boa tarde amigos tudo na paz? Venho novamente aqui pedir auxilio num codigo. O problema consiste em que, preciso excluir um funcionario contido numa lista, excluir tendo como chave o cpf, ou seja preciso digitar o cpf do funcionario e entao ele mim da' uma resposta com a posiçao e com o nome do funcionario... So assim farei a exclusao... O problema e' que quando tempo comparar os cpfs ele nao encontra nada nada nada.... E o engraçado e' que eu mudando o objeto de busca para salario que e' float deu certinho ele mim voltou o nome e a posiçao.... Entao peço que se possivel , analizem o meu codigo o que estou errando? Qual o problema... outra coisa que nao sei fazer e' ordenar em lista.... teria condiçao de algume mim explicar... Vou postar o codigo completo mais a lista.txt. Desde ja meu muito obrigado...

 

Funçao com problema = remover e ordena;

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int d;

typedef struct

{
		char cpf[20];
		char nome[40];
		char setor[40];
		 float salario;
}func;

typedef struct
{
		int primeiro,ultimo;

		func *item;

}tipolista;

void fazlistavazia(tipolista *lista)
{

	 lista->primeiro=0;
	 lista->ultimo = lista->primeiro;
 }

int verificalistavazia(tipolista *lista)

{
	return( lista->primeiro==lista->ultimo);
 }
int menu()

{   
	int num;

	printf("\n SISTEMA DE GERENCIAMENTO DE FUNCIONARIO\n");

	printf("\n   01-Inserir Funcionario: ");
	printf("\n   02-Imprimir Funcionario: ");
	printf("\n   03-Remover Funcionario: ");
	printf("\n   04-Procurar Funcionario: ");
	printf("\n   05-Funcionarios Ordenados: ");
	printf("\n   06-Soma dos Salarios: ");
	printf("\n   07-Sair e Salvar Alteracoes: ");
	printf("\nDigite a opcao: ");

	__fpurge(stdin);
	scanf("%d",&num);
	return(num);

}
void insere(tipolista *lista)
{
   if (lista->ultimo >=d)

	  {

		printf ("Arquivo cheio!!\n");

		return;

	   }
	  
	 printf("\n	 Informe o CPF: ");
	__fpurge(stdin);
	gets(lista->item[lista->ultimo].cpf);
	 printf("\n	 Informe o nome do Funcionario: ");
	 __fpurge(stdin);
	 gets(lista->item[lista->ultimo].nome);
	 printf("\n	 Informe o salario do Funcionairo: ");
	 //__fpurge(stdin);
	 scanf("%f",&lista->item[lista->ultimo].salario);
	 printf("\n	 Informe o setor do Funcionario: ");
	 __fpurge(stdin);

	 gets(lista->item[lista->ultimo].setor);

	 }

void somasalario(tipolista *lista)
{
	int i;
	float soma=0;
	for(i=0;i<lista->ultimo;i++){
	soma=soma + (lista->item[i].salario);
	}
	printf("\nSoma Total do Salario dos Funcionarios= R$ %.2f",soma);
	
}

void remover(tipolista *lista)
{
	char cpf[20];
	int i;
	
	printf("\nDigite o CPF do Funcionario a ser removido: ");
	__fpurge(stdin);
	gets(cpf);
	
	printf("\n%s",cpf);
	
	for (i=0;i<lista->ultimo;i++){

	if (strcmp(lista->item[i].cpf,cpf)==0){
		
		printf("Posicao= %d",i);
		printf("\nNome do Funcionario = %s",lista->item[i].cpf);
		
		}
}
	printf("\nnao encontrado");
	printf("\ncontinuar codigo para remover");
}

void ordena(tipolista *lista)
{
	  int i;
	  float aux;
	  float vot;
	  for(i=0;i<lista->ultimo-1;i++){
	  if (lista->item[i].salario>lista->item[i+1].salario){
	  aux=lista->item[i+1].salario;
	  lista->item[i+1].salario = lista->item[i].salario;
	  vot = aux;
	  }
	  printf("%f\n",vot);
	  }
	  
	  }
	  
void imprime(tipolista *lista)

{
	 int i;
	 
	 printf("\n		 FUNCIONARIOS CADASTRADOS \n\n");
	 for (i=0;i<lista->ultimo;i++)
	  {
	  printf("CPF: %s",lista->item[i].cpf);
	  printf("NOME: %s",lista->item[i].nome);
	  printf("SALARIO:R$ %.2f",lista->item[i].salario);
	  printf("\nSETOR: %s",lista->item[i].setor);
	  printf("\n");

	  }
}

main(){
	int i,d;
	 int opc;
	 char linha[80];
	 tipolista mylista;
	 
	 FILE*arq;
	 arq=fopen("lista.txt","r");
	 fgets(linha,80,arq);
	 sscanf(linha,"%d",&d);
	 printf("%d\n",d);
	 printf("aqui");	 
	 fazlistavazia(&mylista);
		  mylista.item=calloc(d,sizeof(func));
		
		for(mylista.ultimo=0;mylista.ultimo<d;mylista.ultimo++){

	 	fgets(mylista.item[mylista.ultimo].cpf, 20, arq);
		fgets(mylista.item[mylista.ultimo].nome, 80, arq);
		fgets(linha, 80, arq);
		sscanf(linha,"%f",&mylista.item[mylista.ultimo].salario);
		fgets(mylista.item[mylista.ultimo].setor, 40,arq);

					  }

		//fclose(arq);
		
	 do{

					  opc=menu();

					  switch(opc){

							 case 1:

								  insere(&mylista);

								  break;

							 case 2:

								  imprime(&mylista);								  
								  break;

							 case 3:

								  remover(&mylista);
								  break;
								
							 case 4:
							 	 // procura(&mylista);
							 	  
							 	  break;

							 case 5:
								  ordena(&mylista);
								  break;
								
							 case 6:
							 	  somasalario(&mylista);

								 break;

							 }

						   //  salvar (tipolista);

							} while(opc!=7);
							 }

lista.txt

 

5

123.987.098-09
RODRIGO DE SOUZA GANDRA
1500.78
CONTABILIDADE
123.987.098-09
RODRIGO DE SOUZA GANDRA
1500.78
CONTABILIDADE
723.987.098-15
PEDRO PAULO RANGEL
500.00
TESOURARIA
123.987.098-09
MARIA MENDONÇA DE SOUZA
400.15
FATURAMENTO
456.987.098-11
FELIPE DE MATTOS
700.76
CONTABILIDADE

Compartilhar este post


Link para o post
Compartilhar em outros sites

nossa Pablo vo ser sincero q naum sei!

fiz diversos testes aki e soh retornaram q naum encontraram!

qnd eu tiver + tempo eu continuo testando!

 

c você conseguir descobrir antes me conte hein http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

A principio não vi nada de errado.

Voce poderia usar o if com strcmp assim:

 

if (!strcmp(lista->item[i].cpf,cpf)

Com isso somente se o retorno for 0, ou seja, strings iguais o if será executado.

Isso é o mesmo que voce colocou.

 

Esses erros com strings geralmente são do não fechamento delas com \0,

to meio sem tempo, mas vou tentar testar esse código pra voce.

 

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigos obrigado pela atenção... esse problema ainda persisti em meu codigo, inclusive já enviei para alguns professores e eles não conseguiram dar uma opinião concreta... e o pior que esse problema atrapa o codigo todo, por exemplo, não consigo localizar para remover nem localizar dados sobre um usuario. Valeu pela força... http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Desde já agradeço... http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

O erro está em retirar as informações do arquivo e coloca-las na lista corretamente.

Para verificar isso basta listar os funcionarios e verá que em cpf está sendo amazenado o departamento.

 

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

 

 

Amigos obrigado pela atenção... esse problema ainda persisti em meu codigo, inclusive já enviei para alguns professores e eles não conseguiram dar uma opinião concreta... e o pior que esse problema atrapa o codigo todo, por exemplo, não consigo localizar para remover nem localizar dados sobre um usuario. Valeu pela força... http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif Desde já agradeço... http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

fiz + teste e ainda naum vi o problema:

pq msm c você digitar TESOURARIA com um espaço a +

vai dar 11 caracteres o msm q tem no txt!

e o strlen retorna 11 nos 2 e msm assim naum funfa!

vo levar isso pros mew profs na facu verem!

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seguinte,

o fgets está copiando um caracter a mais, se não me engano deve ser o "\n".

Para consertar faça isso logo após a leitura.

 

tam = strlen(mylista.item[mylista.ultimo].cpf);
	mylista.item[mylista.ultimo].cpf[tam-1] = '\0';

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seguinte,

o fgets está copiando um caracter a mais, se não me engano deve ser o "\n".

Para consertar faça isso logo após a leitura.

 

tam = strlen(mylista.item[mylista.ultimo].cpf);
	mylista.item[mylista.ultimo].cpf[tam-1] = '\0';

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

Kandrade... valeu cara mas não resolveu não...quitZAUMMM valeu pela força tb... Não teve jeito não funfou de jeito nenhum, então o que fiz... mandei aparecer na tela todos os cpfs com a posição e assim eu escolhia uma posição para excluir. Já avisei o meu professor ele tb não conseguiu resolver o erro. É assim mesmo... obrigado pela atenção...

 

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

Compartilhar este post


Link para o post
Compartilhar em outros sites

realmente eu testei oq o mestre Kandrade disse e deu certo localizow!

sua função remover eu fiz assim agora, após a alteração:

void remover(tipolista *lista)
{
	char cpf[20];
	int i,iaux=0,ia=0;
	getchar();
	printf("\nDigite o CPF do Funcionario a ser removido: ");
	gets(cpf);
	for (i=0;i<lista->ultimo;i++) if (!strcmp(lista->item[i].cpf,cpf)) {iaux =1;ia=i;}
	if (iaux==1){	printf("Posicao= %d",ia);
	printf("\nNome do Funcionario = %s",lista->item[ia].cpf);}
  else {
	printf("\nnao encontrado");
	printf("\ncontinuar codigo para remover"); }
}

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.