Ir ao conteúdo

Posts recomendados

Postado

A questão pede que eu ordene por distância(da menor para a maior), pela região (em ordem alfabética) e por último pelo nome, tentei fazer sem sucesso

 

 

O meu código

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct p
{
	char nome[100];
	char rosa[100];
	int distancia;
};

int distancia(const void *a , const void *b);
int rosa(const void *c , const void *d);
int pornome(const void *e, const void *f);

int main(int argc, char** argv)
{
	int teste, i;
	while(scanf("%d", &teste) != EOF)
	{
		struct p pessoas[teste];

		for(i = 0; i < teste; i++)
		{
			scanf("%s %s %d", pessoas[i].nome, pessoas[i].rosa, &pessoas[i].distancia);
		}
		qsort(pessoas, teste, sizeof(struct p), distancia);
		qsort(pessoas, teste, sizeof(struct p), rosa);
		qsort(pessoas, teste, sizeof(struct p), pornome);
		for(i = 0; i < teste; i++)
		{
			printf("%s\n", pessoas[i].nome);
		}
	}
	return 0;
}

int distancia(const void *a, const void *b)
{
	if((*(struct p*)a).distancia == (*(struct p *)b).distancia)
		return 0;
	else if((*(struct p*)a).distancia < (*(struct p *)b).distancia)
		return -1;
	else
		return 1;
}

int rosa(const void *c, const void *d)
{
	int	r = strcmp((*(struct p*)c).rosa, (*(struct p *)d).rosa);
	if (r == 0)
		return 0;
	else if(r < 0)
		return -1;
	else
		return 1;
}

int pornome(const void *e, const void *f)
{
	int	c = strcmp((*(struct p*)e).nome, (*(struct p *)f).nome);
	if (c == 0)
		return 0;
	else if(c < 0)
		return -1;
	else
		return 1;
}

5a6cc80582bab_Semttulo.png.7d4cb1382606ac3a00d574ac2f965984.png

 

  • Curtir 1
  • 2 semanas depois...
Postado

Oi, o seu código está funcionando corretamente. Eu adicionei algumas linhas para ilustrar melhor.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct p
{
	char nome[100];
	char rosa[100];
	int distancia;
};

int distancia(const void *a , const void *b);
int rosa(const void *c , const void *d);
int pornome(const void *e, const void *f);

int main(int argc, char** argv)
{
	int teste, i, ord;
	while(scanf("%d", &teste) != EOF)
	{
		struct p pessoas[teste];

		for(i = 0; i < teste; i++)
		{
			scanf("%s %s %d", pessoas[i].nome, pessoas[i].rosa, &pessoas[i].distancia);
		}

      while(1)
      {

         printf("1- ordenar por distancia\n");
         printf("2- ordenar por regiao\n");
         printf("3- ordenar por nome\n");
         printf("4- sair\n");

         scanf("%d", &ord);

         switch(ord){
            case 1:
         		qsort(pessoas, teste, sizeof(struct p), distancia);

		         for(i = 0; i < teste; i++)
		         {
			         printf("%-11s\t%s\t%d\n", pessoas[i].nome, pessoas[i].rosa, pessoas[i].distancia);
		         }

               break;
            case 2:
         		qsort(pessoas, teste, sizeof(struct p), rosa);

		         for(i = 0; i < teste; i++)
		         {
			         printf("%-11s%s\t%d\n", pessoas[i].nome, pessoas[i].rosa, pessoas[i].distancia);
		         }

               break;
            case 3:
         		qsort(pessoas, teste, sizeof(struct p), pornome);

		         for(i = 0; i < teste; i++)
		         {
			         printf("%-11s%s\t%d\n", pessoas[i].nome, pessoas[i].rosa, pessoas[i].distancia);
		         }

               break;
            case 4:
                return 1;
            default:
               break;
         }

      }

	}
	return 0;
}

int distancia(const void *a, const void *b)
{
	if((*(struct p*)a).distancia == (*(struct p *)b).distancia)
		return 0;
	else if((*(struct p*)a).distancia < (*(struct p *)b).distancia)
		return -1;
	else
		return 1;
}

int rosa(const void *c, const void *d)
{
	int	r = strcmp((*(struct p*)c).rosa, (*(struct p *)d).rosa);
	if (r == 0)
		return 0;
	else if(r < 0)
		return -1;
	else
		return 1;
}

int pornome(const void *e, const void *f)
{
	int	c = strcmp((*(struct p*)e).nome, (*(struct p *)f).nome);
	if (c == 0)
		return 0;
	else if(c < 0)
		return -1;
	else
		return 1;
}

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

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...