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

Problemas com ordenação


Alexandre Prezzi

Pergunta

Bom dia..

Pessoal to precisando fazer um programinha que leia o nome de 5 pessoas e suas respectivas idades, ate ai tudo bem.. após é preciso que ele ordene em ordem alfabética

Consigo ordenar a coluna dos nomes, porem as idades nao acoampanham.. 

Como faço para que as idades acompanhem as idades .. 

Editado por Alexandre Prezzi
Link para o comentário
Compartilhar em outros sites

4 respostass a esta questão

Posts Recomendados

  • 0

Vou tentar ser mais claro... 

Esse codigo le 3 nomes e suas respectivas idades..  por exemplo
Eduardo  20 

Ana  30

Carlos  10

Ele ordena os nomes em ordem alfabética .. porem as idades não são ordenadas de acordo com os nomes...   fica assim

Ana   20

Carlos    30

Eduardo   10     

e eu gostaria que ficasse

Ana   20
Carlos    30

Eduardo   10

Desde ja agradeço

#include <stdio.h>
#include <string.h>//necessário para strncat
#include <conio.h>
int main (void)
{
   char nm[3][20], aux[20];
   char idade[3][2];
   int i,j;

for (i = 0; i < 3; i++) {
   printf("\nNome %i: ", i+1);
   scanf("%s", nm[i]);
   
   printf("\nIdade %i: ", i+1);
   scanf("%s", idade[i]);
}




for (i = 1; i < 3; i++) { /* 3 = qtde de palavras */
   for (j = 1; j < 3; j++) {
      // verifica se tem que ser depois, se for troca de posição
      if (strcmp(nm[j - 1], nm[j]) > 0) {
         strcpy(aux, nm[j - 1]);
         strcpy(nm[j - 1], nm[j]);
         strcpy(nm[j], aux);
      }
   }
}

// só mostrar a matriz
for (i = 0; i < 3; i++){
	printf("\n%s - %s", nm[i], idade[i]);
	
}

}

 

1 hora atrás, vangodp disse:

Não entendi nada >_<

mas nem eu...  hehe fui extremamente confuso na forma de escrever minha duvida..  mais abaixo acredito estar melhor explicado.

Link para o comentário
Compartilhar em outros sites

  • 0

Ola @Alexandre Prezzi, realmente é possível resolver esse tipo de problema fazendo uso de variáveis auxiliares, porem, creio eu q trabalhar com structs para gerar tuplas(registros) seja melhor, apesar da logica para criar o programa ser mais complexa doq usando variaveis auxiliares, sua praticidade depois de pronto é muito maior.

**Comenta e descomenta as linhas de codigo logo abaixo dos "for" e o programa vai se organizar ;P**

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#define NOMEMAX 50 //quantas letras o nome da pessoa pode ter no maximo
#define PESSOASMAX 3 //quantas pessoas vai existir no nosso vetor


//Aqui a gente cria a estrutura, no caso ela so tem nome e idade, mas pode facilmente ser complementada
typedef struct 
{
	char* nome;
	int idade;
}td_Registro;


td_Registro* CriaRegistro(); //Aqui se aloca o espaco para o registro, no caso sempre q se quiser criar uma "Pessoa" nova, vc chama essa funcao
void IniciaRegistro(td_Registro* registro); //No caso essa funcao nao é exatamente necessaria, porem pode evitar erros sutis
void TrocaRegistro(td_Registro* pessoa1, td_Registro* pessoa2); //Faz a troca do registro

td_Registro* CriaRegistro()
{
	td_Registro* retorno = (td_Registro*)malloc(sizeof(td_Registro));//aloca o registro
	retorno->nome = (char*)malloc(sizeof(char) * NOMEMAX);
	
	IniciaRegistro(retorno);
	
	return retorno;
}

void IniciaRegistro(td_Registro* registro)
{
	registro->nome[0] = '\0';
	registro->idade   = 0;
}

void PreencheRegistro(char nome[], int idade, td_Registro* pessoa)
{
	strcpy(pessoa->nome, nome);
	pessoa->idade = idade;
}

void TrocaRegistro(td_Registro* pessoa1, td_Registro* pessoa2)
{
	td_Registro* registroAuxiliar = CriaRegistro();
	
	strcpy(registroAuxiliar->nome, pessoa1->nome);
	registroAuxiliar->idade = pessoa1->idade;
	
	strcpy(pessoa1->nome, pessoa2->nome);
	pessoa1->idade = pessoa2->idade;
	
	strcpy(pessoa2->nome, registroAuxiliar->nome);
	pessoa2->idade = registroAuxiliar->idade;
}

void MostraRegistros(td_Registro* registros[])
{
	int i;
	
	for(i = 0; i < PESSOASMAX; i++)
	{
		printf("Numero: %d\t", i);
		printf("Nome: %s\t", registros[i]->nome);
		printf("Idade: %d\n", registros[i]->idade);
	}
}

int main()
{
	int i, a;
	
	//Ja com as funcoes prontas, fica bem simples a execucao do programa
	
	//1º a gente cria o vetor de registros q a gente quer usar( antes que alguem escreva que uma lista seria uma saida mais inteligente, quero dizer q vc esta certo =D )
	//***só cuide quando for usar, pq é necessario q seja um vetor de ponteiros, ja que os espacos estao sendo alocados dinamicamente***
	td_Registro* registros[PESSOASMAX];
	
	//2º iniciamos cada ponteiro do registro fazendo uso de um for
	for(i = 0; i < PESSOASMAX; i++)
		registros[i] = CriaRegistro();
	//Agora nosso vetor ja esta criado e corretamente iniciado
	
	//3º preenchemos o vetor com os valores que o usuario digitar ou de forma manual aki pelo codigo, no nosso caso vamos fazer por aki msmo
	PreencheRegistro("Eduardo", 20, registros[0]);
	PreencheRegistro("Ana", 30, registros[1]);
	PreencheRegistro("Carlos", 10, registros[2]);
	
	//Agora diagmos q eu queira organizar por ordem alfabetica
	// for(i = 0; i < PESSOASMAX-1; i++)
		// for(a = i+1; a < PESSOASMAX; a++)
			// if(toupper(registros[i]->nome[0]) > toupper(registros[a]->nome[0]))
				// TrocaRegistro(registros[i], registros[a]);
	
	//Agora digamos q eu queira ordenar por idade de forma crescente
	// for(i = 0; i < PESSOASMAX-1; i++)
		// for(a = i+1; a < PESSOASMAX; a++)
			// if(registros[i]->idade > registros[a]->idade)
				// TrocaRegistro(registros[i], registros[a]);
			
	//Mostra os registros
	MostraRegistros(registros);

	return 0;
}

 

Espero que vc tenha percebido pq trabalhar desta forma é mto melhor doq usando variaveis auxiliares, a menos que seja para projetos mto pequenos, evite trabalhar daquela forma. 

Embaixo eu vou corrigir o seu codigo inicial, caso vc prefira continuar trabalhando daquela forma:

OBS: pq vc colocou char na idade??? o.O

Enfim, acho q era assim que vc queria

#include <stdio.h>
#include <string.h>//necessário para strncat
#include <conio.h>

int main (void)
{
   char nm[3][20], aux[20];
   int idade[3], auxIdade;
   int i,j;

   strcpy(nm[0], "Eduardo");
   idade[0] = 20;
   
   strcpy(nm[1], "Ana");
   idade[1] = 30;
   
   strcpy(nm[2], "Carlos");
   idade[2] = 10;

 
	for (i = 0; i < 2; i++) { //O primeiro loop vai passar por todo o vetor, menos o ultimo
	   for (j = i+1; j < 3; j++) {//O segundo loop vai fazer as comparações
		  // verifica se tem que ser depois, se for troca de posição
		  if (strcmp(nm[i], nm[j]) > 0) {
			//Voce só efetua a troca do nome, precisa trocar a idade tbm, para isso precisa criar o um auxiliar para a idade tbm
			 strcpy(aux, nm[j]);
			 auxIdade = idade[j];
			 
			 strcpy(nm[j], nm[i]);
			 idade[j] = idade[i];
			 
			 strcpy(nm[i], aux);
			 idade[i] = auxIdade;
		  }
	   }
	}

	// só mostrar a matriz
	for (i = 0; i < 3; i++){
		printf("\n%s - %d", nm[i], idade[i]);
		
	}

}

 

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
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...