Ir ao conteúdo
  • Cadastre-se
Henrique N Mendes

C RESOLVIDO Ordenação alfabética com struct c

Recommended Posts

Olá Clube do Hardware. Bem, esses dias estava finalizando um procedimento para listar um vetor de struct em ordem alfabética, porém quando tento fazer do meu "jeito", não funciona, também tentei implementar o buble ou selectionsort, mas eu surro o código inteiro e não faço ideia de como coloca-lo dentro do código, por isso venho aqui pedir o auxílio para vocês... A ideia do procedimento é o seguinte, além desse, no qual to com dúvida, há um procedimento de se cadastrar, óbvio, e cada vez que cadastro eu uso uma variável "ativo" inteira, para que quando o cadastro for efetuado com sucesso ele mude esse valor ativo para 1, por isso que vão encontrar "ativo" fazendo parte da checagem de listagem.  É um projeto de um banco, e só to apanhando nesse procedimento, o resto já fiz... :( Pls help

Aqui vai o código:

 

typedef struct {

  char nconta[8]; //Número da conta
  float saldo; //Saldo cliente
  char nome[61]; //Nome cliente
  char cpf[12]; //Cpf cliente
  char telefone[12]; //Telefone cliente
  int ativo;

}Usuario;


void listarClientes(Usuario *x){

    system("cls");

    int i,j;
    char sNomeAux[61];

    printf("\n-------Lista de clientes--------\n\n");

    for(i=0;i<MAX;i++){
        for(j=i; j>0; j--){

            if( strcoll(x[j].nome, x[j-1].nome) < 0){
              strcpy(sNomeAux,x[j].nome);
              strcpy(x[j].nome,x[j-1].nome);
              strcpy(x[j-1].nome,sNomeAux);
            }

            if(x[i].ativo==1){

            fflush(stdin);
            printf("\n\n--------Cliente [%d]------------\n",i+1);
            fflush(stdin);
            printf("\nNúmero da Conta: %s",x[i].nconta);
            printf("\nNome: %s\n",x[i].nome);
            printf("CPF: %s\n",x[i].cpf);
            printf("Telefone: %s\n",x[i].telefone);
            printf("Saldo: %f\n",x[i].saldo);
            printf("\n--------------------------------\n\n");

            }
        }
    }
}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já tentou usar assim:

for(i=0;i<MAX;i++){ 
	for(j=(i+1); j<MAX; j++){
    	if( strcoll(x[i].nome, x[j].nome) < 0){
              strcpy(sNomeAux,x[i].nome);
              strcpy(x[i].nome,x[j].nome);
              strcpy(x[j].nome,sNomeAux);
          	  i = 0; //reseta i para verificar de novo
            }
      	...
     ...
 ...

Veja que o i é sempre um menor que j, então se a lista for assim:

1 - Joao

2 - Aria

3 - Pedro

 

Aria e Joao são trocados, depois i volta para 1, e verifica com João e Pedro...

 

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ele simplesmente não ordena, não sei se está na minha declaração ou no procedimento de listar, mas continua sem aparecer ordenado. Segue o código: 

 

void listarClientes(Usuario *x){

    system("cls");

    int i;


    printf("\n-------Lista de clientes--------\n\n");

    for(i=0;i<MAX;i++){

        x=ordenalista(x); // Lembrando que já tentei tanto dentro do for, quanto fora.

        if(x[i].ativo==1){

        printf("\n\n--------Cliente [%d]------------\n",i+1);
        fflush(stdin);
        printf("\nNúmero da Conta: %s",x[i].nconta);
        printf("\nNome: %s\n",x[i].nome);
        printf("CPF: %s\n",x[i].cpf);
        printf("Telefone: %s\n",x[i].telefone);
        printf("Saldo: %f\n",x[i].saldo);
        printf("\n--------------------------------\n\n");

        }
    }



}






Usuario* ordenalista(Usuario *x){

    int i,j;
    sNomeaux[61];

    for(i=0;i<MAX;i++){
        for(j=(i+1); j<MAX; j++){

            if( strcmp(x[i].nome, x[j].nome) < 0 ){
              strcpy(sNomeaux,x[i].nome);
              strcpy(x[i].nome,x[j].nome);
              strcpy(x[j].nome,sNomeaux);
              i=0;
        //reseta i para verificar de novo
            }


        }
    }

    return x;

}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Henrique N Mendes Ali na função strcmp, deve ser assim:

...
	int i,j;
    char sNomeaux[61];

    for(i=0;i<MAX;i++){
        for(j=(i+1); j<MAX; j++){
            if( strcmp(x[i].nome, x[j].nome) > 0 ){
              strcpy(sNomeaux,x[i].nome);
              strcpy(x[i].nome,x[j].nome);
              strcpy(x[j].nome,sNomeaux);
              i=0;
        //reseta i para verificar de novo
            }
        }
    }
...

 

Testei aqui e funcionou:

image.png.537d0423da2c31c8329bd6844d64fb56.png

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara tentei criar na função de ordenar a lista exatamente como seu código e não foi, no nome fica invisível :(, logo após isso tentei jogar dentro do procedimento de listar, mas não tá indo, dessa vez ele imprimiu coisa nada a ver ahdushguh ex: cliente [101] ...

 

Segue o código: 

 

void listarClientes(Usuario *x){

    system("cls");

    int i,j;
    char sNomeaux[61];

    printf("\n-------Lista de clientes--------\n\n");

    for(i=0;i<MAX;i++){

        if(x[i].ativo==1){


        for(i=0;i<MAX;i++){
            for(j=(i+1); j<MAX; j++){
                if( strcmp(x[i].nome, x[j].nome) > 0 ){
                    strcpy(sNomeaux,x[i].nome);
                    strcpy(x[i].nome,x[j].nome);
                    strcpy(x[j].nome,sNomeaux);
                    i=0;
        //reseta i para verificar de novo
            }
        }
    }

        printf("\n\n--------Cliente [%d]------------\n",i+1);
        fflush(stdin);
        printf("\nNúmero da Conta: %s",x[i].nconta);
        printf("\nNome: %s\n",x[i].nome);
        printf("CPF: %s\n",x[i].cpf);
        printf("Telefone: %s\n",x[i].telefone);
        printf("Saldo: %f\n",x[i].saldo);
        printf("\n--------------------------------\n\n");

        }
    }



}


void cadastro(Usuario* x){
 	
  	system("cls");

    float saldof=0.0;
    char conta[8];
    char nome[61]; //Nome cliente
    char cpf[12]; //Cpf cliente
    char telefone[12]; //Telefone cliente
    int chec,i;

    do{
		printf("Digite sua conta:\n");
        gets(conta);

        fflush(stdin);
        printf("\nNome:\n");
        gets(nome);


        while(strlen(nome) == 0){
            printf("Digite alguma coisa, seu cabra...\n");
            gets(nome);
        }
		printf("\nDigite o seu cpf:\n");
        gets(cpf);

        while(strlen(cpf) == 0){
            printf("Digite alguma coisa, seu cabra...\n");
            gets(cpf);
        }
		
      	printf("\nDigite seu CPF:\n");
        gets(telefone);

        while(strlen(telefone) == 0){
            printf("Digite alguma coisa, seu cabra...\n");
            gets(telefone);
        }

        for(i=0; i<MAX; i++){
            if(cliente[i].ativo==0){
                getchar();
                strcpy(x[i].nconta,conta);
                strcpy(x[i].nome,nome);
                strcpy(x[i].cpf,cpf);
                strcpy(x[i].telefone,telefone);
                x[i].ativo=1;
               break;

            }
        }

        x->saldo= saldof;

        system("cls");

        printf("Seu número da conta é: %s  [ATENÇÃO: NÃO DEIXE DE ANOTAR]",conta);
        printf("\n\n\nCADASTRO REALIZADO COM SUCESSO...\n\n\n");

        printf("Digite 1 para continuar a fazer mais cadastros.\nDigite 0 para voltar ao menu.\n");
        scanf("%d",&chec);

        system("cls");


    }while(chec!=0);

}

              
           

Será que seja algo no cadastro? pois eu não consigo entender o porquê de não está imprimindo ordenado

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Nossa senhora, desculpe... Mas você acabou misturando as coisas, segue:

Usuario* ordenalista(Usuario *x){

    int i,j;
    char sNomeaux[61];

    for(i=0;i<MAX;i++){
        for(j=(i+1); j<MAX; j++){
            if( strcmp(x[i].nome, x[j].nome) > 0 ){
              strcpy(sNomeaux,x[i].nome);
              strcpy(x[i].nome,x[j].nome);
              strcpy(x[j].nome,sNomeaux);
              i=0; //reseta i para verificar de novo
            }
        }
    }
    return x;
}
void listarClientes(Usuario *x){

    system("cls");
    int i;

  	ordenalista(x);
    printf("\n-------Lista de clientes--------\n\n");

    for(i=0;i<MAX;i++){
        if(x[i].ativo==1){
        	printf("\n\n--------Cliente [%d]------------\n",i+1);
        	fflush(stdin);
       		printf("\nNúmero da Conta: %s",x[i].nconta);
        	printf("\nNome: %s\n",x[i].nome);
        	printf("CPF: %s\n",x[i].cpf);
        	printf("Telefone: %s\n",x[i].telefone);
        	printf("Saldo: %f\n",x[i].saldo);
        	printf("\n--------------------------------\n\n");
    	}
    }
}


void cadastro(Usuario* x){
 	
  	system("cls");

    float saldof=0.0;
    char conta[8];
    char nome[61]; //Nome cliente
    char cpf[12]; //Cpf cliente
    char telefone[12]; //Telefone cliente
    int chec,i;

    do{
		printf("Digite sua conta:\n");
        gets(conta);

        fflush(stdin);
        printf("\nNome:\n");
        gets(nome);


        while(strlen(nome) == 0){
            printf("Digite alguma coisa, seu cabra...\n");
            gets(nome);
        }
		printf("\nDigite o seu cpf:\n");
        gets(cpf);

        while(strlen(cpf) == 0){
            printf("Digite alguma coisa, seu cabra...\n");
            gets(cpf);
        }
		
      	printf("\nDigite seu CPF:\n");
        gets(telefone);

        while(strlen(telefone) == 0){
            printf("Digite alguma coisa, seu cabra...\n");
            gets(telefone);
        }

        for(i=0; i<MAX; i++){
            if(cliente[i].ativo==0){
                getchar();
                strcpy(x[i].nconta,conta);
                strcpy(x[i].nome,nome);
                strcpy(x[i].cpf,cpf);
                strcpy(x[i].telefone,telefone);
                x[i].ativo=1;
        		x[i]->saldo= saldof;
                break;
            }
        }

        system("cls");

        printf("Seu número da conta é: %s  [ATENÇÃO: NÃO DEIXE DE ANOTAR]",conta);
        printf("\n\n\nCADASTRO REALIZADO COM SUCESSO...\n\n\n");

        printf("Digite 1 para continuar a fazer mais cadastros.\nDigite 0 para voltar ao menu.\n");
        scanf("%d",&chec);

        system("cls");


    }while(chec!=0);

}

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@Henrique N Mendes      você pode usar a posição zero do struct para auxiliar na hora de ordenar o struct, então você precisa deixar a posição zero sem nada e comece a colocar os dados a partir da posição 1, e se você quer ordenar pelo nome então seria assim :

#include <stdio.h>
#include <string.h>
#define  MAX 10
typedef struct {
    char  nconta[8];    /*//Número da conta */
    float saldo;        /*//Saldo cliente   */
    char  nome[61];     /*//Nome cliente    */
    char  cpf[12];      /*//Cpf cliente     */
    char  telefone[12]; /*//Telefone cliente*/
    int   ativo;
}Usuario;
Usuario x[100];
int cont=1;
void cadastrar(){
    char flag='s';
    printf("Vamos Cadastrar Clientes\n");
    do{
        printf("Digite O Nome ");
        fflush(stdin);
        gets(x[cont].nome);
        fflush(stdin);
        printf("Digite O Numero Da Conta ");
        gets(x[cont].nconta);
        printf("Digite O CPF ");
        fflush(stdin);
        gets(x[cont].cpf);
        printf("Digite O Telefone ");
        fflush(stdin);
        gets(x[cont].telefone);
        printf("Digite O Saldo ");
        fflush(stdin);
        scanf("%f",&x[cont].saldo);
        x[cont].ativo=1;
        cont++;
        printf("Quer Cadsastrar Outro Cliente S/N ");
        fflush(stdin);
        scanf("%c",&flag);
    }while(flag=='s');
}
void listarClientes(/*Usuario *x*/){
    system("cls");
    int i,j;
    printf("\n-------Lista de clientes--------\n\n");
    for(i=1;i<cont;i++){
        for(j=i+1;j<cont;j++){
            if( strcoll(x[i].nome, x[j].nome) > 0){
                x[0] = x[i];
                x[i] = x[j];
                x[j] = x[0];
            }
        }
    }
    for(i=1;i<cont;i++){
        printf("\n--------Cliente [%d]------------\n",i+1);
        printf("Número da Conta --> : %s\n",x[i].nconta  );
        printf("Nome -------------> : %s\n",x[i].nome    );
        printf("CPF --------------> : %s\n",x[i].cpf     );
        printf("Telefone ---------> : %s\n",x[i].telefone);
        printf("Saldo ------------> : %.2f\n",x[i].saldo );
        printf("\n--------------------------------\n"    );
    }
}
int main(){
    cadastrar();
    listarClientes();
    return 0;
}

 

  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu to há uma semana trabalhando nisso, mas tá difícil de sair... To ficando nervoso já :( 

adicionado 8 minutos depois

@devair1010  Cara, ele ordena dessa forma mesmo ? tipo x[0] = x, porque tipo, especificamente, não deveria ser o x[qualquer coisa].nome?

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×