Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
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
  • Autor do tópico
  • 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

     

    Editado por TYSQUARE89
    • Curtir 1

    Compartilhar este post


    Link para o post
    Compartilhar em outros sites
  • Autor do tópico
  • 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);
    
    }

     

    Editado por TYSQUARE89
    • 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
  • Autor do tópico
  • 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

    @Henrique N Mendes     sim,  mas ali está x[  qualquer coisa ]. o nome é só na hora de comparar, e funciona sim teste aí .

    Editado por devair1010
    • 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






    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

    ×