Ir ao conteúdo
  • Cadastre-se
diogo moura

C Como ordenar com Certas decisões ?

Recommended Posts

A questão pede que leia nome(sem espaço) e numero(inteiro) e se ordenado pelo numero e caso o número fosse igual seria ordenado por ordem alfabética, tentei fazer mas não consegui

 

O meu código

 

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

struct pessoas
{
	char nome[100];
	int nota;
};


int main(int argc, char** argv)
{
	struct pessoas pessoa[100];
	int teste, aux;
	char a[100];
	scanf("%d", &teste);

	for(int i = 0; i < teste; i++)
	{
		scanf("%s %d", pessoa[i].nome, &pessoa[i].nota);
	}


	for(int i = 0; i < teste; i++)
	{
		for(int j = i + 1; j < teste; j++)
		{
			if(pessoa[i].nota == pessoa[j].nota)
			{
				strcpy(a, pessoa[i].nome);
				strcpy(pessoa[i].nome, pessoa[j].nome);
				strcpy(pessoa[i].nome, a);
			}
			else if(pessoa[i].nota > pessoa[i].nota)
			{
				aux = pessoa[i].nota;
				pessoa[i].nota = pessoa[j].nota;
				pessoa[j].nota = aux;
			}
		}
	}
	
	for(int i = 0; i < teste; i++)
	{
		printf("%s  %d\n",pessoa[i].nome,pessoa[i].nota);
	}
	return 0;
}

   

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

caso o número seja igual você em que fazer um strcmp dos nomes e decidir qual é o maior. Se persistir o empate, considere o ítem com o menor subscrito como menor.

 

adicionado 2 minutos depois
18 minutos atrás, diogo moura disse:

strcpy(a, pessoa[i].nome); strcpy(pessoa[i].nome, pessoa[j].nome); strcpy(pessoa[i].nome, a)

Esse codigo e o que troca o nome de um pelo nome do outro
Ele só deve ser utilizado depois de um if usando strcomp

algo assim

x = strcomp( um nome, outro nome)

se  x indica que um nome é menor que outro nome, troca

se x indica ue outro nome é menor , troca

se x indica que 'sao iguais, pegue o nome que tá no menor subscrito

 

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seria assim ? @Boko Moko

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

struct pessoas
{
	char nome[100];
	int nota;
};


int main(int argc, char** argv)
{
	struct pessoas pessoa[100];
	int teste, aux;
	char a[100];
	scanf("%d", &teste);

	for(int i = 0; i < teste; i++)
	{
		scanf("%s %d", pessoa[i].nome, &pessoa[i].nota);
	}


	for(int i = 0; i < teste; i++)
	{
		for(int j = i + 1; j < teste; j++)
		{
			if(pessoa[i].nota == pessoa[j].nota)
			{
				if(strcmp(pessoa[i].nome, pessoa[j].nome) == 1)
				{
					strcpy(a, pessoa[i].nome);
					strcpy(pessoa[i].nome, pessoa[j].nome);
					strcpy(pessoa[i].nome, a);
				}
			}
			else if(pessoa[i].nota > pessoa[j].nota)
			{
				aux = pessoa[i].nota;
				pessoa[i].nota = pessoa[j].nota;
				pessoa[j].nota = aux;
			}
		}
	}

	for(int i = 0; i < teste; i++)
	{
		printf("%s  %d\n", pessoa[i].nome, pessoa[i].nota);
	}
	return 0;
}

, acho que não deu certo 

  • Amei 1
  • Triste 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@diogo moura    seu código está bom, mas faltou mover o número quando move a palavra e vice versa ,  então seu código com algumas modificações ficaria assim  :

#include <stdio.h>
#include <string.h>
struct pessoas
{
    char nome[100];
    int nota;
};
int main(){
    struct pessoas pessoa[100];
    int teste, aux,j,i;
    char a[100];
    scanf("%d",&teste);
    for(i = 0; i < teste; i++){
        scanf("%s %d", pessoa[i].nome, &pessoa[i].nota);
    }
    for(i = 0; i < teste; i++){
        for(j = i + 1; j < teste; j++){
            if(pessoa[i].nota == pessoa[j].nota){
                if(strcmp(pessoa[i].nome,pessoa[j].nome)>0){
                    strcpy(a, pessoa[i].nome);
                    strcpy(pessoa[i].nome, pessoa[j].nome);
                    strcpy(pessoa[j].nome, a);
                    aux = pessoa[i].nota;
                    pessoa[i].nota = pessoa[j].nota;
                    pessoa[j].nota = aux;
                }
            }
            else
                if(pessoa[i].nota > pessoa[j].nota){
                    aux = pessoa[i].nota;
                    pessoa[i].nota = pessoa[j].nota;
                    pessoa[j].nota = aux;
                    strcpy(a, pessoa[i].nome);
                    strcpy(pessoa[i].nome, pessoa[j].nome);
                    strcpy(pessoa[j].nome, a);
                }
        }
    }
    for(i = 0; i < teste; i++){
        printf("%s ",pessoa[i].nome);
        for(j=0;j<10-strlen(pessoa[i].nome);j++){/*está com um warning aqui, não consegui tirar */
            printf("-");
        }
        printf("> %d\n",pessoa[i].nota);
    }
    return 0;
}

 

  • Curtir 3

Compartilhar este post


Link para o post
Compartilhar em outros sites
37 minutos atrás, devair1010 disse:

mas faltou mover o número quando move a palavra e vice versa

Bem lembrado

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro 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 publicações 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

×