Jump to content
Fórum Script Brasil
  • 0

organizando uma struct em ordem alfabética


sarahbortoloti
 Share

Question

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 to comment
Share on other sites

1 answer to this question

Recommended Posts

  • 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share



  • Forum Statistics

    • Total Topics
      149.9k
    • Total Posts
      646.8k
×
×
  • Create New...