Ir ao conteúdo
  • Cadastre-se

Ordenação de Registro em C


Piruka

Posts recomendados

Boa noite galera! ^^ 
 
Minha primeira postagem aqui no fórum. Enfim, estou fazendo um trabalho da faculdade e preciso classificar uma struct em ordem alfabética. A struct é simples, só tem nome e idade. Depois que eu faço a classificação usando o código abaixo, as posições ficam sem valor algum, como se estivessem "vazias". O código é muito grande, por isso vou postar só um trecho do código. Obrigado! (:
 

printf ("Deseja classificar por nome ou idade? ");
         fflush (stdin); gets(resp2);  
         if ((strcmp(resp2, "nome")==0) || (strcmp(resp2, "idade")==0))
         {
              for (i=0; i<=48; ++i)
              {
                  for (j=i+1; j<=49; ++j)
                  {
                      if (strcmp (resp2, "nome") ==0)
                      {
                                 if (strcmp(cad.nome, cad[j].nome) ==1 )
                                 {                                 
                                      strcpy (x.nome, cad.nome);
                                      strcpy (cad.nome, cad[j].nome);
                                      strcpy (cad[j].nome, x.nome);
                                      
                                      x.idade = cad.idade;
                                      cad.idade = cad[j].idade;
                                      cad[j].idade = x.idade;
                                    
                                 }                                                                  
                      }                      
                      else
                      {
                          if (cad.idade > cad[j].idade)
                          {
                                      strcpy (x.nome, cad.nome);
                                      strcpy (cad.nome, cad[j].nome);
                                      strcpy (cad[j].nome, x.nome);
                                      
                                      x.idade = cad.idade;
                                      cad.idade = cad[j].idade;
                                      cad[j].idade = x.idade;
                          }                          
                      }
                  }
              }
              system ("cls");
              printf ("A classifica%c%co foi feita com sucesso! \nOs administrativos foram cadastrados por %s", 135, 198, resp2);
              chamadaMenu ();
         }
         else
         {
             printf ("\n\nO comando %s %c um comando inv%clido!", resp2, 130, 161);
             chamadaMenu ();
         }

 

Link para o comentário
Compartilhar em outros sites

Vendo somente esse trecho do código parece não haver nada de errado. Sugiro que verifique (caso esteja usando ponteiro para alocar as strings) se está fazendo a alocação de maneira correta. Outra coisa interessante no teu caso é que já q você inverte os valores de todos os campos da struct, sugiro que dê uma olhada na função memcpy com ela você pode inverter os registros. Outra sugestão minha é que você imprima como está o registro antes dessa etapa de ordenação e depois para ver se os dados estão realmente nas variaveis. Se for o caso poste outros trechos do código.

Link para o comentário
Compartilhar em outros sites

você pode fazer assim

 

 

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
 
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
 
#define NUM_REGISTROS 3
#define IDADE 1
#define NOME 2
 
typedef struct MeuDado{
char nome[32];
int idade;
} MEUDADO, *PMEUDADO;
 
void ordena( MEUDADO *, const int, const int);
void mostra( MEUDADO*, const int );
 
int main(int argc, char** argv) {
 
MEUDADO arrayDados[NUM_REGISTROS];
char type[20];
 
for( int count = 0; count < NUM_REGISTROS; count++)
{
printf("Digite um nome: ");
scanf("%s", &arrayDados[count].nome);
 
printf("Digite a idade: ");
scanf("%d", & arrayDados[count].idade);
}
 
 
for( int count = 0; count < NUM_REGISTROS; count++)
{
printf("\nDeseja ordenar por nome ou idade?");
scanf("%s", &type);
 
if( strcmp(type, "nome") == 0 || strcmp( type, "idade") == 0)
{
if( strcmp( type, "nome") == 0)
{
ordena( arrayDados, NUM_REGISTROS, NOME); 
 
}
 
if( strcmp( type, "idade") == 0)
{
ordena( arrayDados, NUM_REGISTROS, IDADE);
 
printf("\nResultado: \n");
mostra(arrayDados, NUM_REGISTROS);
}
 
}else
{
 
printf("\nTipo indefinido dd");
}
}
 
 
return 0;
}
 
void mostra( MEUDADO *p, const int SIZE)
{
for( int j = 0; j < SIZE; j++)
{
printf("Nome: %s\nIdade: %d\n\n", p[j].nome, p[j].idade);
}
}
void ordena( MEUDADO *p, const int num, const int type){
void swap( MEUDADO *, MEUDADO *);
 
switch( type )
{
case NOME:
 
break;
case IDADE:
 
for( int a = 0; a < num; a++)
for(int j = 0; j < num; j++)
{
if( p[j].idade > p[j+1].idade)
{
swap( &p[j], &p[j+1]);
}
}
break;
default:
printf("\nTipo invalido! ff");
}
 
}
 
void swap( MEUDADO *p1, MEUDADO *p2)
{
MEUDADO controle;
 
controle = *p2;
*p2 = *p1;
*p1 = controle;
 
}

o codigo acima só faz ordenação por idade. a ordenação por nome fica a cargo de você

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades 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

×
×
  • Criar novo...