Ir para conteúdo
Fórum Script Brasil
  • 0

organizando uma struct em ordem alfabética


sarahbortoloti

Pergunta

Boa noite !

Faço Ads e estou resolvendo uma lista de struct para a aula.

Fiz um exercicío simples de cadastro , alocação dinâmica e impressão , só que ele n está dando certo , pois a impressão deve ser feita em ordem alfabética e eu fiz pelo algoritmo bubble sort só que n está ordenando , será que alguém poderia dar uma olhada e ver o que tem de errado o porque de não estar ordenando ?


#include<stdio.h>
#include<stdlib.h>
#include<locale.h>
#include<string.h>
#define X 3
  
 typedef struct pessoa
 {
 char nome[40];
 char endereco[100];
 char telefone[13];
 
 //struct definida;
 };
 
 void preenche(pessoa *p) ;
 void mostra(pessoa *p);
 void bublesort(pessoa *p);
 int main() // programa principal;
 {    
  setlocale(LC_ALL,"portuguese");
  pessoa *p=NULL; // iguala a Null para inicializar o ponteiro p;
  p=(pessoa*)malloc(sizeof(pessoa)*X); // alocação dinâmica;
  int a;
  
  for(a=0;a<(X);a++)
  {
  preenche(&p[a]); // acessa diretamente o end de *p;
  }
  
bublesort(p); // ordena struct
mostra(p);

}

 
 void preenche(pessoa *p) 
 {    
    char lixo[2]; // limpa o buffer;
     printf("Insira seu nome \n");
     scanf("%s",p->nome);
gets(lixo);
    printf("Insira cidade,bairro, rua e nº\n");
     gets(p->endereco);
     printf("Insira O DDD e em seguida seu telefone\n");
     gets(p->telefone);
gets(lixo); //limpa
 system("cls");
 }
 
void mostra(pessoa *p)
{
    int a;
    for(a=0;a<X;a++)
    {
        printf("Nome %s \n ",p->nome);
        printf("Endereço %s \n",p->endereco);
        printf("Tel : %s\n",p->telefone);
p++;    
        // imprime a struct;
    }
}


void bublesort(pessoa *p)
{    pessoa aux; 
    int i, j;
    for ( i=X-1; i > 0; i-- )
    {
            for ( j=0; j < i; j++ )
            {

                if (strcmp (p[j].nome , p[j+1].nome )<0)
                {
                    strcpy(aux.nome,p[j].nome);
                    strcpy(aux.endereco,p[j].endereco);
                    strcpy(aux.telefone,p[j].telefone);
                     
                    strcpy(p.nome,p[j].nome);
                    strcpy(p.endereco,p[j].endereco);
                    strcpy(p.telefone,p[j].telefone);
                     
                    strcpy(p[j].nome,aux.nome);
                    strcpy(p[j].endereco,aux.endereco);
                    strcpy(p[j].telefone,aux.telefone);
                     

                 }
            }

     }
}

 

Link para o comentário
Compartilhar em outros sites

1 resposta a esta questão

Posts Recomendados

  • 0
#include<stdio.h>
#include<stdlib.h>
#include<locale.h>
#include<string.h>
#define X 3

struct Pessoa {
    char nome[40];
    char endereco[100];
    char telefone[13];
};//struct definida;

typedef struct Pessoa pessoa;

void preenche ( pessoa *p );
void mostra ( pessoa *p );
void bublesort ( pessoa *p );

void foo(pessoa *p){
    printf( "->%s", p[0+1].nome );
}

int main() { // programa principal;
    setlocale ( LC_ALL, "portuguese" );
    pessoa *p = NULL; // iguala a Null para inicializar o ponteiro p;
    p = ( pessoa* ) malloc ( sizeof ( pessoa ) * X ); // alocação dinâmica;
    int a;
    
    //Descomentar
    //for ( a = 0; a < ( X ); a++ ) {
    //    preenche ( &p[a] ); // acessa diretamente o end de *p;
    //}

    //Auto fill =) Borrar depois ate fin de auto fill 
    strcpy(p[0].nome, "raul");
    strcpy(p[1].nome, "gilberto");
    strcpy(p[2].nome, "filiverto");

    strcpy(p[0].endereco, "rua 3");
    strcpy(p[1].endereco, "rua 2");
    strcpy(p[2].endereco, "rua 1");
    
    strcpy(p[0].telefone, "333333333");
    strcpy(p[1].telefone, "222222222");
    strcpy(p[2].telefone, "111111111");            
    //fin de autofill
    
    
    bublesort ( p ); // ordena struct
    mostra ( p );
    
    free(p);
    return 0;
}


void preenche ( pessoa *p ) {
    char lixo[2]; // limpa o buffer;
    printf ( "Insira seu nome \n" );
    scanf ( "%s", p->nome );
    gets ( lixo );
    printf ( "Insira cidade,bairro, rua e nº\n" );
    gets ( p->endereco );
    printf ( "Insira O DDD e em seguida seu telefone\n" );
    gets ( p->telefone );
    gets ( lixo ); //limpa
    system ( "cls" );
}

void mostra ( pessoa *p ) {
    int a;
    
    for ( a = 0; a < X; a++ ) {
        printf ( "Nome %s \n ", p->nome );
        printf ( "Endereço %s \n ", p->endereco );
        printf ( "Tel: %s\n\n", p->telefone );
        p++;
        // imprime a struct;
    }
    
}


void bublesort ( pessoa *p ) {
    pessoa aux;
    int i, j;
    
    for ( i = 0; i <= X-1; i++ ) {
        for ( j = 0; j < X-1; j++ ) {
            if ( strcmp ( p[j].nome, p[j + 1].nome ) > 0 ) {
                strcpy ( aux.nome, p[j].nome );
                strcpy ( p[j].nome, p[j+1].nome );
                strcpy ( p[j+1].nome, aux.nome );

                strcpy ( aux.endereco, p[j].endereco );
                strcpy ( p[j].endereco, p[j+1].endereco );
                strcpy ( p[j+1].endereco, aux.endereco );
                
                strcpy ( aux.telefone, p[j].telefone );
                strcpy ( p[j].telefone, p[j+1].telefone );
                strcpy ( p[j+1].telefone, aux.telefone );
            }
        }
    }
    
}

 

Como eu sou preguiçoso e não gosto muito de ficar preenchendo dados, introduzi eles no próprio código para fazer provas mais rapidamente, elimine

    //Auto fill =) Borrar depois ate fin de auto fill 
    strcpy(p[0].nome, "raul");
    strcpy(p[1].nome, "gilberto");
    strcpy(p[2].nome, "filiverto");

    strcpy(p[0].endereco, "rua 3");
    strcpy(p[1].endereco, "rua 2");
    strcpy(p[2].endereco, "rua 1");
    
    strcpy(p[0].telefone, "333333333");
    strcpy(p[1].telefone, "222222222");
    strcpy(p[2].telefone, "111111111");            
    //fin de autofill

 

...e tire os comentários de

    //Descomentar
    //for ( a = 0; a < ( X ); a++ ) {
    //    preenche ( &p[a] ); // acessa diretamente o end de *p;
    //}

...para que seu programa fique como antes(Pedir dados ao usuario).

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...