Ir ao conteúdo

Posts recomendados

Postado

Olá gente, 

Estou com dificuldade para programar e exibir os dados dos atletas que a questão pede em ordem decrescente. Dei uma olhada em outros fóruns e utilizei a solução que encontrei porém ainda assim não funciona.

Segue a questão:

Crie uma estrutura representando um atleta. Ela deve conter nome, esporte, idade e altura. Escreva um programa que leia os dados de cinco atletas e os exiba por ordem de idade, do mais velho para o mais novo.

 

Segue meu código (coloquei que seriam apenas 3 atletas para o teste ser mais rápido):

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
typedef struct{
	char nome[40], esporte[30];
	int idade;
	float altura;
}atleta;
void decrescente(atleta *atletas){
	int i,j;
	atleta aux;
	for(int i=1;i>3;i++){
		j=i;
		aux=atletas[j];
		while((j>0)&&(aux.idade<atletas[j-1].idade)){
			atletas[j]=atletas[j-1];
			j--;
		}
		atletas[j]=aux;
	}
	for(i=3;i>=0;i--){
		printf("%s, %d anos, %.2f m. Modalidade: %s.\n", atletas[i].nome, atletas[i].idade, atletas[i].altura, atletas[i].esporte);
	}
}
int main(){
	atleta atletas[3];
	setlocale(LC_ALL,"Portuguese");
	int aux;
	for (int i=0;i<3;i++){
		printf("Olá!\nPor favor, insira seu nome: ");
		scanf("%s",&atletas[i].nome);
		printf("%s, qual o seu esporte?: ",atletas[i].nome);
		scanf("%s",&atletas[i].esporte);
		printf("%s, insira sua idade: ",atletas[i].nome);
		scanf("%d",&atletas[i].idade);
		printf("%s, insira a sua altura: ",atletas[i].nome);
		scanf("%f", &atletas[i].altura); printf("\n\n");
	}
	printf("ORDENANDO EM ORDEM DECRESCENTE\n\n");
	decrescente(atletas);
	system("pause");
}

  

Postado

Sobre sue programa

 

Tem muito dos "problemas" comuns aos programas que vemos aqui no forum. 

 

sugiro considerar

void decrescente(atleta* atletas)
{
    int    i, j;
    atleta aux;
    for (int i = 1; i > 3; i++)
    {
        j   = i;
        aux = atletas[j];
        while ((j > 0) &&
               (aux.idade < atletas[j - 1].idade))
        {
            atletas[j] = atletas[j - 1];
            j--;
        }
        atletas[j] = aux;
    }
    for (i = 3; i >= 0; i--)
    {
        printf(
            "%s, %d anos, %.2f m. Modalidade: %s.\n",
            atletas[i].nome, atletas[i].idade,
            atletas[i].altura, atletas[i].esporte);
    }
}
  • Essa função por exemplo tem uma variável com o ingênuo nome de i global à função e outra dentro do primeiro loop. NUNCA deixe isso acontecer. O primeiro i desaparece dentro do primeiro loop, no segundo loop usa uma variável que pode ter um valor importante e vai se perder. Nem todos seus programas vão ter umas poucas linhas. Não deixe isso acontecer
     
  • até incluiu stdlib então porque não usar qsort()? sort em si parece nada ter a ver com o seu exercício e assim não parece preciso incluir no programa uma função de sort
     
  • não use system() nunca. Não estará fazendo nada nem aprendendo nada
     
  • não pare seu programa NO FIM. Ao rodar o programa no terminal ou em um script por exemplo ele vai ficar lá parado ou o usuário vai ter que teclar um ENTER a mais? Se seu IDE não pode ser configurado para não fechar a janela da console ao final apenas use outro.
     
  • TESTE sempre o retorno de scanf(). É ingênuo seguir adiante
     
  • TESTE seu programa com constantes. NUNCA escreva um programa interativo. Só vai perder muito tempo --- como está perdendo --- ao pro exemplo ter que inventar campos para os atletas TODA vez que for testar o programa
     
  • Escreva em torno dos dados. Está claro que seu dado é uma equipe de N alunos. Então é claro que se tiver isso ANTES de começar a escrever o código terá muito mais facilidade...
     
  • evite declarar mais de uma variável por linha. Não ajuda em nada e linhas são grátis
     
  • evite void: retorne algo, como um código de erro ou algo objetivo
     
  • main() deve ser a primeira função de seu programa, sempre. E se possível em um arquivo separado porque assim pode testar sua lógica com vários programas de poucas linhas...

 

 

 

  • Procure usar alguma convenção para o nome de struct. É muito comum por exemplo reservar a primeira letra em maiúscula para esses casos. E vale a pena: por isso é uma convenção quase universal
     

 

  • Curtir 1
Postado

@Leucosia Utilize o algoritmo de bubble sort para organizar o vetor, e depois imprimi-lo.

 

Exemplo

#include <stdio.h>

#define QUANTIDADE 10

int numeros[QUANTIDADE] = {
    43,
    55,
    4,
    21,
    68,
    53,
    14,
    32,
    11,
    10
};

void
bolha(int *n, int q_numeros);

int main(void)
{
    int contador;
    printf("Numeros sem organizacao\n");
    for (contador = 0; contador < QUANTIDADE; contador++) {
        printf("%i, ", numeros[contador]);
    }
    putchar('\n');
    
    bolha(numeros, QUANTIDADE);
    
    printf("Numeros organizados com o bubbleSort\n");
    for (contador = 0; contador < QUANTIDADE; contador++) {
        printf("%i, ", numeros[contador]);
    }
    putchar('\n');
    getchar();
    return(0);
}

void
bolha(int *n, int q_numeros)
{
    int contador, troca;
    do {
        troca = 0;
        for (contador = 0; contador < q_numeros-1; contador++) {
            if (n[contador] > n[contador+1]) {
                int tmp = n[contador];
                n[contador] = n[contador+1];
                n[contador+1] = tmp;
                troca++;
            }
        }
    } while (troca);
}

 

Postado

Use mais funções em seu programa. É muito mais simples. No mínimo sabe que vai precisar mostrar a equipe antes e depois do sort para poder saber se funcionou. 

 

E uma função para ler os dados dos atletas não seria surpresa. Assim poderia testar seu programa SEM um programa interativo....

Postado
6 horas atrás, kgin disse:
    putchar('\n');
    getchar();
    return(0);

 

Isso ao final do programa sem qualquer instrução tem o efeito ao final do programa de ficar lá parado por toda eternidade até alguém cancelar ou teclar ENTER por imaginar que travou...

 

image.png.1a7490b04c8114196e86f8ac2c20f536.pngO cursor fica lá piscando e o programa não termina nunca.

 

Como eu disse no post anterior, se isso é uma "solução" para quando não se sabe qual o comando para manter a tela da console aberta ao rodar um programa no IDE seria o caso de ver no manual ou postar uma questão em algum forum. E se o IDE não consegue fazer isso seria o caso de simplesmente usar outro melhor.

 

Note que

  • sobra uma vírgula ao final do printf() e se for algo que vá gerar uma nota por certo não ficou bom, e de todo modo não parece muito elegante. Como o tamanho do vetor é conhecido basta por exemplo mostrar o primeiro sem a vírgula... 🤔 e os demais com a vírgula antes...
  • a ordem do enunciado é descendente então poderia simplesmente inverter a comparação mesmo sendo um exemplo
  • usar contador global nos dois loops é frágil e não é um bom costume para quem está iniciando. E quase todo loop for tem um contador e pode ser meio chato ficar repetindo contador toda hora. Por alguma razão essas variáveis quase sempre tem uma letra ou duas só e são declaradas no próprio for
     
    int numeros[QUANTIDADE] = {43, 55, 4,  21, 68,
                               53, 14, 32, 11, 10};
  • nunca declare nada global. Isso é proibido em toda parte, escolas e empresas, Declare o vetor em main()
     
  • como o vetor vai ser acessado um número por vez pode ser mais claro declarar int numero[] porque numero[x] sempre vai ser um único int
     
  • e nesses casos é mais eficiente deixar o compilador contar o tamanho e escrever
        int numero[] = { 43, 55, 4, 21, 68, 53, 14, 32, 11, 10 };
        unsigned qtd = sizeof(numero) / sizeof(numero[0]);


     

  • evite duplicar código: claro que está mostrando duas vezes o vetor e só muda o título então pode usar uma função e passar o título
     

  • não precisa de chaves para envolver uma única expressão. Prefira o simples

Veja essa função:
 

void mostra(int num[], int qtd, const char* tit)
{
    printf("%s\n[%i", tit, num[0]);
    for (int c = 1; c<qtd; c++) printf(", %i", num[c]);
    puts("]");
}

 

Ela resolve o problema da vírgula solta no final e você pode passar o título direto.

 

bolha()

 

Ao invés de

 

void
bolha(int *n, int q_numeros)
{
    int contador, troca;
    do {
        troca = 0;
        for (contador = 0; contador < q_numeros-1; contador++) {
            if (n[contador] > n[contador+1]) {
                int tmp = n[contador];
                n[contador] = n[contador+1];
                n[contador+1] = tmp;
                troca++;
            }
        }
    } while (troca);
}

 

Pode ser mais legível escrever

 

void bolha(int n[], int q_numeros)
{
    char troca;
    do {
        troca = 0;
        for (int i = 0; i < q_numeros - 1; i += 1)
            if (n[i] < n[i + 1])
            {
                int tmp  = n[i];
                n[i]     = n[i + 1];
                n[i + 1] = tmp;
                troca    = 1;
            }
    } while (troca);
}

 

Por que?

 

  • o argumento é um vetor então é melhor declarar como tal. Declarar o argumento como ponteiro introduz uma fragilidade porque um ponteiro não é um array. Um array de certo modo é um ponteiro --- pointer decay --- mas não é simétrico.
  • troca é digital: se for zero ao final do loop indica que estava tudo em ordem, já que não trocou nenhum
  • não precisa das chaves no for porque o único comando é o if
  • não precisa de duas variáveis globais na função porque o contador só é usado dentro do loop

main()

 

Usando a função que eu mostrei e essas sugestões se pode escrever

 

int main(void)
{
    int numero[] = { 43, 55, 4, 21, 68, 53, 14, 32, 11, 10 };
    unsigned qtd = sizeof(numero) / sizeof(numero[0]);
    mostra(numero,qtd,"Numeros sem organizacao");
    bolha(numero, qtd);  // ordena
    mostra(numero, qtd, "Numeros ordenados");
    return 0;
}


 Que é provavelmente mais simples de ler e entender.

 

Um exemplo completo

 

É o mesmo código, apenas com as mudanças que expliquei

 

Saída:

 

Clube>teste
Numeros sem organizacao
[43, 55, 4, 21, 68, 53, 14, 32, 11, 10]
Numeros ordenados
[68, 55, 53, 43, 32, 21, 14, 11, 10, 4]
C:Clube>

 

Note que estão em ordem decrescente, com os números entre [ ] e a vírgula final sumiu.

 

O código completo

 

#include <stdio.h>

void bolha(int n[], int q_numeros);
void mostra(int[],int, const char*);

int main(void)
{
    int numero[] = { 43, 55, 4, 21, 68, 53, 14, 32, 11, 10 };
    unsigned qtd = sizeof(numero) / sizeof(numero[0]);
    mostra(numero,qtd,"Numeros sem organizacao");
    bolha(numero, qtd);  // ordena
    mostra(numero, qtd, "Numeros ordenados");
    return (0);
}

void bolha(int n[], int q_numeros)
{
    char troca;
    do {
        troca = 0;
        for (int i = 0; i < q_numeros - 1; i += 1)
            if (n[i] < n[i + 1])
            {
                int tmp  = n[i];
                n[i]     = n[i + 1];
                n[i + 1] = tmp;
                troca    = 1;
            }
    } while (troca);
}

void mostra(int num[], int qtd, const char* tit)
{
    printf("%s\n[%i", tit, num[0]);
    for (int c = 1; c<qtd; c++) printf(", %i", num[c]);
    puts("]");
}

 

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