• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Biscoito111

Adicionar Cliente

9 mensagens neste tópico

Boas pessoal :P

Eu não consigo fazer esta função. Alguém me pode ajudar.Tenho dificuldade em por por ordem alfabética.

Trabalho no Microsoft Visual Studio 2003, linguagem C.

Desenvolva uma função que adicione um novo cliente ao ficheiro de clientes do banco. A

função recebe como argumento o nome do ficheiro e a estrutura com a informação sobre o novo

cliente (os campos da estrutura já estão preenchidos). O ficheiro original está ordenado

alfabeticamente pelo nome dos clientes. A função deve garantir que a estrutura com informação

do novo cliente é inserida no ficheiro na posição correcta, de modo a que este continue ordenado.

Obrigado :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mostra o que já fizeste, e onde estás a ter dificuldades.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu aqui ponho po fim do ficheiro mas como faço pa meter na ordem alfabetica?

int adiciona_cliente(char b[],struct cliente x)
{
FILE *f,*g;
struct cliente c;

f = fopen(b,"rb");
if(f==NULL)
{
	printf("Erro no acesso ao ficheiro\n");
	return 0;
}

g = fopen("temp.dat", "wb");
if(g==NULL)
{
	printf("Erro no acesso ao ficheiro\n");
	return 0;
}
while(fread(&c,sizeof(cliente), 1, f)==1)
	fwrite(&c,sizeof(cliente),1,g);
fseek(g,sizeof(cliente),SEEK_END);
while(fread(&c,sizeof(cliente), 1, f)==1)
	fwrite(&x,sizeof(cliente),1,g);

fclose(f);
fclose(g);

remove(b);
rename("temp.dat",b);

return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crias uma lista de clientes e lês todos os clientes do ficheiro de entrada. Tens a garantia, dada pelo enunciado, que os clientes no ficheiro estão por ordem alfabética.

Depois lês o novo cliente, percorres a lista até encontrares um cliente cujo nome comparado com o novo seja maior (strcmp), e inseres o novo cliente antes desse.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o k eu nao percebo ek como ek eu comparo se por exemplo quero introduzir maria e la no ficheiro esta liliana e quero introduzir maria depois de liliana.como faço pa por maria depois d liliana comparando k maria é maior k liliana?

sim, eu conheço o strcmp mas da pa fazer isso do maior com essa instrucao?

e nao estou a trabalhar com listas.é so memso com ficheiros

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ah. Então vais lendo um a um como estás a fazer, e a comparar com o novo cliente. Quando leres um que seja maior, escreves o novo para o ficheiro de saída, e depois escreves todos os que ainda não leste do ficheiro de entrada.

Se conheces a função strcmp, sabes que funciona por comparação lexicográfica, o que significa que retorna um valor menor que zero se o 1º parâmetro tiver um valor inferior ao 2º, maior que zero se o 1º parâmetro tiver um valor superior ao 2º, e zero se forem iguais.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

hum nao sabia bem isso.obrigado.ajudastem-me no que queria :thumbsup:

Faço assim entao ??

int adiciona_cliente(char b[],struct cliente x)
{
  FILE *f,*g;
  struct cliente c;

  f = fopen(b,"rb");
  if(f==NULL)
  {
     printf("Erro no acesso ao ficheiro\n");
     return 0;
  }
  g = fopen("temp.dat", "wb");
  if(g==NULL)
  {
     printf("Erro no acesso ao ficheiro\n");
     return 0;
  }
  else
  {
     while(fread(&c,sizeof(struct cliente), 1, f)==1)
     {
        fwrite(&c,sizeof(struct cliente),1,g);
        if(strcmp(x.nome,c.nome)>0)
           fwrite(&c,sizeof(struct cliente),1,g);
     }
  }
  fclose(f);
  fclose(g);

  remove(b);
  rename("temp.dat",b);

  return 0;
}

Alguem k me responda p.f.f.

:thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não exactamente. Vê bem o que esse código faz: enquanto conseguir ler do ficheiro de entrada, vai ler o que escreveu no ficheiro de saída; depois testa se o nome do cliente a inserir tem um valor maior do que aquele que acabou de escrever, e se tiver escreve-o; de seguida repete tudo o que foi descrito.

Há 2 problemas com essa implementação: 1º tens a condição ao contrário, e 2º vais escrever o novo cliente varias vezes.

Tens que implementar 2 ciclos: o 1º com duas condições (conseguir ler do ficheiro de entrada e o nome que leu ser inferior ao do novo cliente) que vai escrevendo os nomes lidos; quando este terminar, escreve o novo cliente; depois tens o 2º ciclo, que lê o resto do ficheiro de entrada e o escreve para o de saída.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora