Ir ao conteúdo
  • Cadastre-se

C Programa em C para ranking


Ir à solução Resolvido por Lucca Rodrigues,

Posts recomendados

Postado

Olá pessoal, estou com dificuldade para finalizar um programa. O enunciado do programa é o seguinte:

"Em um campeonato de surf extremamente difícil, cada bateria é disputada por 3 surfistas sendo que cada um deles pode pegar apenas 1 onda. Essa onda é avaliada por 5 jurados e cada um dá uma nota entre 0 e 10. Você, que não surfa mas programa, foi contratado para calcular o resultado final da bateria. O programa que você vai escrever para fazer esse cálculo deve ter duas funções principais (pode ter outras também):

 

1. Uma função que recebe o vetor de 5 notas de um surfista, calcula e retorna a sua média. Pelas regras do campeonato a maior e a menor notas são descartadas, sendo utilizadas para o cálculo da média somente as 3 notas intermediárias.

2. Uma função que recebe um vetor com as 3 médias dos surfistas calculadas no passo anterior, computa e exibe na tela o ranking final. O resultado deve apresentar, quem ficou em primeiro, segundo e terceiro e as médias de cada surfista.

 

Dicas: Você pode ignorar casos de empate na hora de fazer o ranking final."

 

O código que eu consegui desenvolver é o seguinte:

#include <stdio.h>
#include <locale.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#define MAX 4

//calcula a media
float media (float notas[MAX], int tam)
{
    int maior = 0, menor = 10, i;
    float media = 0;

     for(i=0 ; i>=tam ; i++)
    {
        printf("%.2f\n", notas[i]);

        for(i=0 ; i>=tam ; i++)
        {
            media = media + notas[i];
            if (notas[i] < menor)
            {
                menor = notas[i];
            }
            else
            {
                maior = notas[i];
            }
        }
    }
    //printf("%f %f\n", menor, maior);
     media = (media - menor - maior)/3;
    return media;
}

//calcula o vencedor e imprime na tela o ranking
int vencedor (float medias[2], int tam)
{
    int i;
    if (medias[0] > medias[1] && medias[0] > medias[2] && medias[1] > medias[2])
    {
        printf("\n1º lugar = surfista 1 com média %.2f", medias[0]);
        printf("\n2º lugar = surfista 2 com média %.2f", medias[1]);
        printf("\n3º lugar = surfista 3 com média %.2f\n", medias[2]);
    }
    else if (medias[0] > medias[1] && medias[0] > medias[2] && medias[2] > medias[1])
    {
        printf("\n1º lugar = surfista 1 com média %.2f", medias[0]);
        printf("\n2º lugar = surfista 3 com média %.2f", medias[2]);
        printf("\n3º lugar = surfista 2 com média %.2f\n", medias[1]);
    }
    else if (medias[1] > medias[0] && medias[1] > medias[2] && medias[0] > medias[2])
    {
        printf("\n1º lugar = surfista 2 com média %.2f", medias[1]);
        printf("\n2º lugar = surfista 1 com média %.2f", medias[0]);
        printf("\n3º lugar = surfista 3 com média %.2f\n", medias[3]);
    }
    else if (medias[1] > medias[0] && medias[1] > medias[2] && medias[2] > medias[0])
    {
        printf("\n1º lugar = surfista 2 com média %.2f", medias[1]);
        printf("\n2º lugar = surfista 3 com média %.2f", medias[3]);
        printf("\n3º lugar = surfista 1 com média %.2f", medias[0]);
    }
    else if (medias[2] > medias[0] && medias[2] > medias[1] && medias[0] > medias[1])
    {
        printf("\n1º lugar = surfista 3 com média %.2f", medias[2]);
        printf("\n2º lugar = surfista 1 com média %.2f", medias[0]);
        printf("\n3º lugar = surfista 2 com média %.2f\n", medias[1]);
    }
    else if (medias[2] > medias[0] && medias[2] > medias[1] && medias[1] > medias[0])
    {
        printf("\n1º lugar = surfista 3 com média %.2f", medias[2]);
        printf("\n2º lugar = surfista 2 com média %.2f", medias[1]);
        printf("\n3º lugar = surfista 1 com média %.2f\n", medias[0]);
    }
    else
    {
        printf("\nOcorreu algum erro");
    }


}

int main(){

srand ( time ( NULL ) );
setlocale(LC_ALL, "Portuguese");

int i;
float surf1[MAX], surf2[MAX], surf3[MAX], m1, m2, m3, medias[2];

//lê as notas
    for(i=0 ; i<=MAX ; i++)
        {
            printf("Digite a %dº nota de surfista 1: ", i+1);
            scanf("%f" , &surf1[i]);
        }

    printf("\n");

    for(i=0 ; i<=MAX ; i++)
        {
            printf("Digite a %dº nota de surfista 2: ", i+1);
            scanf("%f" , &surf2[i]);
        }

    printf("\n");

    for(i=0 ; i<=MAX ; i++)
        {
            printf("Digite a %dº nota de surfista 3: ", i+1);
            scanf("%f" , &surf3[i]);
        }

    //envia as notas para a função e armazena a média em uma variável
    m1 = media(surf1, MAX);
    printf("Média do surfista 1: %.2f\n", m1);
    m2 = media(surf2, MAX);
    printf("Média do surfista 2: %.2f\n", m2);
    m3 = media(surf3, MAX);
    printf("Média do surfista 3: %.2f\n", m3);

    vencedor(medias, 2);

return 0;
}

 

O cálculo da média aparentemente está todo errado, mas não sei como consertar. Alguém pode me ajudar?

agradeço desde já :DD

  • Curtir 1
  • Solução
Postado

@Julia_Lucia Não são 5 notas? Por que então os vetores de float surf1, surf2 e surf3 tem espaço para 4 notas somente? A constante MAX deveria ser 5.

E por que o vetor das médias tem espaço para 2 médias somente? Acho que você não entendeu muito bem como funcionam vetores:

O primeiro elemento do vetor tem índice 0, o segundo, índice 1, e assim por diante, digamos algo como:

int notas[5];

Logo, o comprimento desse vetor é 5, começando pelo índice 0 e indo até 4.

 

1 hora atrás, Julia_Lucia disse:

1. Uma função que recebe o vetor de 5 notas de um surfista, calcula e retorna a sua média.

O argumento é o vetor de 5 notas, nada mais.

1 hora atrás, Julia_Lucia disse:

//calcula a media
float media (float notas[MAX], int tam)

Você já sabe que o comprimento é 5, então você não precisa que o comprimento seja argumento da função.

Daí, bastam 2 loops: 1 para obter a maior e a menor nota, outro para efetuar a soma das médias.

 

1 hora atrás, Julia_Lucia disse:

2. Uma função que recebe um vetor com as 3 médias dos surfistas calculadas no passo anterior, computa e exibe na tela o ranking final.

O argumento desta outra função é um vetor com as 3 médias, então nada de colocar o tamanho do vetor como argumento de novo.

1 hora atrás, Julia_Lucia disse:

//envia as notas para a função e armazena a média em uma variável
m1 = media(surf1, MAX);
printf("Média do surfista 1: %.2f\n", m1);
m2 = media(surf2, MAX);
printf("Média do surfista 2: %.2f\n", m2);
m3 = media(surf3, MAX);
printf("Média do surfista 3: %.2f\n", m3);

vencedor(medias, 2);

Você não precisa dessas variáveis m1, m2 e m3, em vez disso, faça algo como:

float medias[3];

medias[0] = media(surf1);
printf("Média do surfista 1: %.2f\n", medias[0]);
medias[1] = media(surf2);
printf("Média do surfista 2: %.2f\n", medias[1]);
medias[2] = media(surf3);
printf("Média do surfista 3: %.2f\n", medias[2]);

vencedor(medias);

 

Têm algumas coisas desnecessárias nesse seu programa, como mais da metade das bibliotecas (que não estão em uso), e também aquela função srand() dentro da main(), ela não tem uso nesse programa.

 

Para fazer a função vencedor(), você pode usar essa árvore de possibilidades:

image.png.bb20e6273d2c81b210a5d312c48c7968.png

Onde 'a' corresponde à medias[0], 'b' corresponde à medias[1] e 'c' corresponde à medias[3].

Por fim, sua função vencedor() deve ser do tipo void(), já que ela não tem retorno.

 

Teste isso:

#include <stdio.h>
#include <locale.h>

#define MAX 5

// Calcula a média
float media (float notas[MAX])
{
    int maior = 0, menor = 10, i;
    float media = 0;

    // Obter maior e menor nota
    for(i = 0; i < MAX; i++)
    {
        if (menor > notas[i])
        {
            /* Se a variável menor for maior
            que a nota em questão, novo valor
            é atribuído */
            menor = notas[i];
        }
        /* Note que são 2 condições separadas,
        uma não depende da outra, então
        nada de if e else */
        if (maior < notas[i])
        {
            /* Se a variável maior for menor
            que a nota em questão, novo valor
            é atribuído */
            maior = notas[i];
        }
    }
    // Obter a soma
    for(i = 0; i < MAX; i++)
    {
        if(notas[i] != menor && notas[i] != maior){
            /* Se a nota for diferente da menor
            e da maior nota, efetuar a soma */
            media += notas[i];
        }
    }

    media /= 3;
    return media;
}

// Calcula o vencedor e imprime na tela o ranking
void vencedor (float medias[3])
{
    // Árvore de possibilidades
    if (medias[0] > medias[1]){
        if(medias[1] > medias[2]){
            printf("\n1º lugar = surfista 1 com média %.2f", medias[0]);
            printf("\n2º lugar = surfista 2 com média %.2f", medias[1]);
            printf("\n3º lugar = surfista 3 com média %.2f\n", medias[2]);
        } else if(medias[0] > medias[2]){
            printf("\n1º lugar = surfista 1 com média %.2f", medias[0]);
            printf("\n2º lugar = surfista 2 com média %.2f", medias[2]);
            printf("\n3º lugar = surfista 3 com média %.2f\n", medias[1]);
        } else{
            printf("\n1º lugar = surfista 1 com média %.2f", medias[2]);
            printf("\n2º lugar = surfista 2 com média %.2f", medias[0]);
            printf("\n3º lugar = surfista 3 com média %.2f\n", medias[1]);
        }
    } else if (medias[1] > medias[2]){
        if(medias[2] > medias[0]){
            printf("\n1º lugar = surfista 1 com média %.2f", medias[1]);
            printf("\n2º lugar = surfista 2 com média %.2f", medias[2]);
            printf("\n3º lugar = surfista 3 com média %.2f\n", medias[0]);
        } else{
            printf("\n1º lugar = surfista 1 com média %.2f", medias[1]);
            printf("\n2º lugar = surfista 2 com média %.2f", medias[0]);
            printf("\n3º lugar = surfista 3 com média %.2f\n", medias[2]);
        }
    } else{
        printf("\n1º lugar = surfista 1 com média %.2f", medias[2]);
        printf("\n2º lugar = surfista 2 com média %.2f", medias[1]);
        printf("\n3º lugar = surfista 3 com média %.2f\n", medias[0]);
    }
}

int main(){

    setlocale(LC_ALL, "Portuguese");

    int i;
    float surf1[MAX], surf2[MAX], surf3[MAX], medias[3];

    // Lê as notas
    for(i = 0; i < MAX; i++)
    {
        printf("Digite a %dº nota do surfista 1: ", i+1);
        scanf("%f" , &surf1[i]);
    }

    printf("\n");

    for(i = 0; i < MAX; i++)
    {
        printf("Digite a %dº nota do surfista 2: ", i+1);
        scanf("%f" , &surf2[i]);
    }

    printf("\n");

    for(i = 0; i < MAX; i++)
    {
        printf("Digite a %dº nota do surfista 3: ", i+1);
        scanf("%f" , &surf3[i]);
    }

    // Envia as notas para a função e armazena as médias em um vetor
    medias[0] = media(surf1);
    printf("Média do surfista 1: %.2f\n", medias[0]);
    medias[1] = media(surf2);
    printf("Média do surfista 2: %.2f\n", medias[1]);
    medias[2] = media(surf3);
    printf("Média do surfista 3: %.2f\n", medias[2]);

    vencedor(medias);

    return 0;
}
  • Curtir 2
  • Obrigado 1
Postado
1 hora atrás, Lucca Rodrigues disse:

@Julia_Lucia Não são 5 notas? Por que então os vetores de float surf1, surf2 e surf3 tem espaço para 4 notas somente? A constante MAX deveria ser 5.

E por que o vetor das médias tem espaço para 2 médias somente? Acho que você não entendeu muito bem como funcionam vetores:

O primeiro elemento do vetor tem índice 0, o segundo, índice 1, e assim por diante, digamos algo como:


int notas[5];

Logo, o comprimento desse vetor é 5, começando pelo índice 0 e indo até 4.

 

O argumento é o vetor de 5 notas, nada mais.

Você já sabe que o comprimento é 5, então você não precisa que o comprimento seja argumento da função.

Daí, bastam 2 loops: 1 para obter a maior e a menor nota, outro para efetuar a soma das médias.

 

O argumento desta outra função é um vetor com as 3 médias, então nada de colocar o tamanho do vetor como argumento de novo.

Você não precisa dessas variáveis m1, m2 e m3, em vez disso, faça algo como:


float medias[3];

medias[0] = media(surf1);
printf("Média do surfista 1: %.2f\n", medias[0]);
medias[1] = media(surf2);
printf("Média do surfista 2: %.2f\n", medias[1]);
medias[2] = media(surf3);
printf("Média do surfista 3: %.2f\n", medias[2]);

vencedor(medias);

 

Têm algumas coisas desnecessárias nesse seu programa, como mais da metade das bibliotecas (que não estão em uso), e também aquela função srand() dentro da main(), ela não tem uso nesse programa.

 

Para fazer a função vencedor(), você pode usar essa árvore de possibilidades:

image.png.bb20e6273d2c81b210a5d312c48c7968.png

Onde 'a' corresponde à medias[0], 'b' corresponde à medias[1] e 'c' corresponde à medias[3].

Por fim, sua função vencedor() deve ser do tipo void(), já que ela não tem retorno.

 

Teste isso:


#include <stdio.h>
#include <locale.h>

#define MAX 5

// Calcula a média
float media (float notas[MAX])
{
    int maior = 0, menor = 10, i;
    float media = 0;

    // Obter maior e menor nota
    for(i = 0; i < MAX; i++)
    {
        if (menor > notas[i])
        {
            /* Se a variável menor for maior
            que a nota em questão, novo valor
            é atribuído */
            menor = notas[i];
        }
        /* Note que são 2 condições separadas,
        uma não depende da outra, então
        nada de if e else */
        if (maior < notas[i])
        {
            /* Se a variável maior for menor
            que a nota em questão, novo valor
            é atribuído */
            maior = notas[i];
        }
    }
    // Obter a soma
    for(i = 0; i < MAX; i++)
    {
        if(notas[i] != menor && notas[i] != maior){
            /* Se a nota for diferente da menor
            e da maior nota, efetuar a soma */
            media += notas[i];
        }
    }

    media /= 3;
    return media;
}

// Calcula o vencedor e imprime na tela o ranking
void vencedor (float medias[3])
{
    // Árvore de possibilidades
    if (medias[0] > medias[1]){
        if(medias[1] > medias[2]){
            printf("\n1º lugar = surfista 1 com média %.2f", medias[0]);
            printf("\n2º lugar = surfista 2 com média %.2f", medias[1]);
            printf("\n3º lugar = surfista 3 com média %.2f\n", medias[2]);
        } else if(medias[0] > medias[2]){
            printf("\n1º lugar = surfista 1 com média %.2f", medias[0]);
            printf("\n2º lugar = surfista 2 com média %.2f", medias[2]);
            printf("\n3º lugar = surfista 3 com média %.2f\n", medias[1]);
        } else{
            printf("\n1º lugar = surfista 1 com média %.2f", medias[2]);
            printf("\n2º lugar = surfista 2 com média %.2f", medias[0]);
            printf("\n3º lugar = surfista 3 com média %.2f\n", medias[1]);
        }
    } else if (medias[1] > medias[2]){
        if(medias[2] > medias[0]){
            printf("\n1º lugar = surfista 1 com média %.2f", medias[1]);
            printf("\n2º lugar = surfista 2 com média %.2f", medias[2]);
            printf("\n3º lugar = surfista 3 com média %.2f\n", medias[0]);
        } else{
            printf("\n1º lugar = surfista 1 com média %.2f", medias[1]);
            printf("\n2º lugar = surfista 2 com média %.2f", medias[0]);
            printf("\n3º lugar = surfista 3 com média %.2f\n", medias[2]);
        }
    } else{
        printf("\n1º lugar = surfista 1 com média %.2f", medias[2]);
        printf("\n2º lugar = surfista 2 com média %.2f", medias[1]);
        printf("\n3º lugar = surfista 3 com média %.2f\n", medias[0]);
    }
}

int main(){

    setlocale(LC_ALL, "Portuguese");

    int i;
    float surf1[MAX], surf2[MAX], surf3[MAX], medias[3];

    // Lê as notas
    for(i = 0; i < MAX; i++)
    {
        printf("Digite a %dº nota do surfista 1: ", i+1);
        scanf("%f" , &surf1[i]);
    }

    printf("\n");

    for(i = 0; i < MAX; i++)
    {
        printf("Digite a %dº nota do surfista 2: ", i+1);
        scanf("%f" , &surf2[i]);
    }

    printf("\n");

    for(i = 0; i < MAX; i++)
    {
        printf("Digite a %dº nota do surfista 3: ", i+1);
        scanf("%f" , &surf3[i]);
    }

    // Envia as notas para a função e armazena as médias em um vetor
    medias[0] = media(surf1);
    printf("Média do surfista 1: %.2f\n", medias[0]);
    medias[1] = media(surf2);
    printf("Média do surfista 2: %.2f\n", medias[1]);
    medias[2] = media(surf3);
    printf("Média do surfista 3: %.2f\n", medias[2]);

    vencedor(medias);

    return 0;
}

Muito obrigada!!!!

Dê fato, tenho dificuldade de entender vetores 😕

Fiz ainda algumas modificações no código:

#include <stdio.h>
#include <locale.h>

#define MAX 5

// Calcula a média
float media (float notas[MAX])
{
    int maior = 0, menor = 10, i;
    float media = 0;

    // Obter maior e menor nota
    for(i = 0; i < MAX; i++)
    {
        media = media + notas [i];
        if (menor > notas[i])
        {
            /* Se a variável menor for maior
            que a nota em questão, novo valor
            é atribuído */
            menor = notas[i];
        }
        /* Note que são 2 condições separadas,
        uma não depende da outra, então
        nada de if e else */
        if (maior < notas[i])
        {
            /* Se a variável maior for menor
            que a nota em questão, novo valor
            é atribuído */
            maior = notas[i];
        }
    }
    //calcula a media
    media = (media - menor - maior) / 3;
    return media;
}

// Calcula o vencedor e imprime na tela o ranking
void vencedor (float medias[3])
{
    // Árvore de possibilidades
    if (medias[0] > medias[1]){
        if(medias[1] > medias[2]){
            printf("\n1º lugar = surfista 1 com média %.2f", medias[0]);
            printf("\n2º lugar = surfista 2 com média %.2f", medias[1]);
            printf("\n3º lugar = surfista 3 com média %.2f\n", medias[2]);
        } else if(medias[0] > medias[2]){
            printf("\n1º lugar = surfista 1 com média %.2f", medias[0]);
            printf("\n2º lugar = surfista 3 com média %.2f", medias[2]);
            printf("\n3º lugar = surfista 2 com média %.2f\n", medias[1]);
        } else{
            printf("\n1º lugar = surfista 3 com média %.2f", medias[2]);
            printf("\n2º lugar = surfista 1 com média %.2f", medias[0]);
            printf("\n3º lugar = surfista 2 com média %.2f\n", medias[1]);
        }
    } else if (medias[1] > medias[2]){
        if(medias[2] > medias[0]){
            printf("\n1º lugar = surfista 2 com média %.2f", medias[1]);
            printf("\n2º lugar = surfista 3 com média %.2f", medias[2]);
            printf("\n3º lugar = surfista 1 com média %.2f\n", medias[0]);
        } else{
            printf("\n1º lugar = surfista 2 com média %.2f", medias[1]);
            printf("\n2º lugar = surfista 1 com média %.2f", medias[0]);
            printf("\n3º lugar = surfista 3 com média %.2f\n", medias[2]);
        }
    } else{
        printf("\n1º lugar = surfista 3 com média %.2f", medias[2]);
        printf("\n2º lugar = surfista 2 com média %.2f", medias[1]);
        printf("\n3º lugar = surfista 1 com média %.2f\n", medias[0]);
    }
}

int main(){

    setlocale(LC_ALL, "Portuguese");

    int i;
    float surf1[MAX], surf2[MAX], surf3[MAX], medias[3];

    // Lê as notas
    for(i = 0; i < MAX; i++)
    {
        printf("Digite a %dº nota do surfista 1: ", i+1);
        scanf("%f" , &surf1[i]);
    }

    printf("\n");

    for(i = 0; i < MAX; i++)
    {
        printf("Digite a %dº nota do surfista 2: ", i+1);
        scanf("%f" , &surf2[i]);
    }

    printf("\n");

    for(i = 0; i < MAX; i++)
    {
        printf("Digite a %dº nota do surfista 3: ", i+1);
        scanf("%f" , &surf3[i]);
    }

    // Envia as notas para a função e armazena as médias em um vetor
    medias[0] = media(surf1);
    printf("Média do surfista 1: %.2f\n", medias[0]);
    medias[1] = media(surf2);
    printf("Média do surfista 2: %.2f\n", medias[1]);
    medias[2] = media(surf3);
    printf("Média do surfista 3: %.2f\n", medias[2]);

    vencedor(medias);

    return 0;
}

Eu reparei que quando as notas de um surfista eram todas iguais, o programa não funcionava corretamente, então modifiquei o cálculo da média. Além disso, alguns dos printfs estavam com o resultado trocado, por exemplo, a média do surfista 1 aparecia como a média do surfista 2 e coisas do tipo.

Sem sua ajuda eu não teria conseguido! Obrigada mesmo!!!

  • Curtir 3
Postado

Como o tópico foi marcado como resolvido, vou deixar uma outra possível solução:

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

#define QTD_NOTAS 5
#define QTD_SURFISTAS 3


typedef struct {
    char nome[100];
    int notas[QTD_NOTAS];
    double media;
} Surfista;


void calcularMedias(Surfista *surfistas);

int compararIntCrescente(const void *a, const void *b);

int compararDoubleDecrescente(const void *a, const void *b);

void imprimirRanking(Surfista *surfistas);


int main() {
    Surfista surfistas[QTD_SURFISTAS] = {
            (Surfista) {"Surfista 1", {5, 7, 3, 4, 5}, 0.0},
            (Surfista) {"Surfista 2", {1, 9, 10, 4, 5}, 0.0},
            (Surfista) {"Surfista 3", {0, 9, 4, 2, 3}, 0.0}
    };

    calcularMedias(surfistas);

    // Ordena os surfistas por media decrescente
    qsort(surfistas, QTD_SURFISTAS, sizeof(Surfista), compararDoubleDecrescente);

    imprimirRanking(surfistas);
    return EXIT_SUCCESS;
}


void calcularMedias(Surfista *surfistas) {
    if (surfistas == NULL) return;

    for (int i = 0; i < QTD_SURFISTAS; ++i) {
        // Ordena as notas
        qsort(surfistas[i].notas, QTD_NOTAS, sizeof(int), compararIntCrescente);

        // O loop ignora a primeira e ultima posicao
        for (int j = 1; j < QTD_NOTAS - 1; ++j) {
            surfistas[i].media += surfistas[i].notas[j];
        }

        // Ignora as duas notas que nao foram somadas
        surfistas[i].media /= QTD_NOTAS - 2;
    }
}

int compararIntCrescente(const void *a, const void *b) {
    int *i1 = (int *) a;
    int *i2 = (int *) b;

    if (i1 < i2) {
        return -1;
    } else if (i1 > i2) {
        return 1;
    } else {
        return 0;
    }
}

int compararDoubleDecrescente(const void *a, const void *b) {
    Surfista *s1 = (Surfista *) a;
    Surfista *s2 = (Surfista *) b;

    if (s1->media < s2->media) {
        return 1;
    } else if (s1->media > s2->media) {
        return -1;
    } else {
        return 0;
    }
}

void imprimirRanking(Surfista *surfistas) {
    if (surfistas == NULL) return;
    
    printf("Ranking: \n");
    
    for (int i = 0; i < QTD_SURFISTAS; ++i) {
        printf("Surfista {");
        printf("nome: %s, ", surfistas[i].nome);
        printf("notas: [");

        for (int j = 0; j < QTD_NOTAS; ++j) {
            printf("%2i", surfistas[i].notas[j]);
            if (j + 1 < QTD_NOTAS) printf(", ");
        }

        printf("], ");
        printf("media: %.2f", surfistas[i].media);
        printf("} \n");
    }
}

 

  • Curtir 1
  • Amei 1
Postado

VOu dar uma solução melhor ainda:
 

Spoiler

Estude o mais básico de programação. Cuidado com pegar soluções prontas, seu futuro depende disso!

 

Postado

@cpusam

8 horas atrás, cpusam disse:

Estude o mais básico de programação. Cuidado com pegar soluções prontas, seu futuro depende disso!

Bem... A autora do tópico mostrou-se empenhada o suficiente pra me motivar a ajudá-la.

Acredito que não dei a solução pronta, mas expliquei os erros e mostrei o código da autora com algumas modificações para que ficasse como o enunciado sugere, e acho que ela entendeu o que eu expliquei :D

  • Curtir 2
  • Amei 1
Postado

Outra alternativa com ordenação com base na média da estrutura,

 

#include <stdio.h>

#define SURFISTA 3
#define NOTA 5

typedef struct{
    int id;
    float media;
    float nota[NOTA];
}Surfista;

void ordena(Surfista *, int);

int main() {
    Surfista sf[SURFISTA];
    int i = 0;
    
    while(i < SURFISTA){
        int j = 0;
        float soma = 0, maior, menor;
        sf[i].id = i + 1;
        while(j < NOTA){
            float nota;
            printf("Nota %d do surfista %d: ",j+1,i+1);
            scanf("%f",&nota);
            if(!j){
                menor = maior = nota;
            }
            if(nota<menor){menor=nota;}
            if(nota>maior){maior=nota;}
            soma += nota;
            sf[i].nota[j] = nota;
            j++;
        }
        sf[i].media = (soma - menor - maior)/(NOTA - 2);
        printf("\n");
        i++;
    }
    ordena(sf,SURFISTA);
    
    printf(
        "Primeiro: surfista %d, media = %.2f\n"
        "Segundo:  surfista %d, media = %.2f\n"
        "Terceiro: surfista %d, media = %.2f\n",
        sf[0].id, sf[0].media,
        sf[1].id, sf[1].media,
        sf[2].id, sf[2].media
    );
    return 0;
}

void ordena(Surfista *s, int qtd){
    int i = 0;
    while(i < qtd){
        int j = 0;
        while(j < (qtd - 1)){
            if(s[j].media < s[j + 1].media){
                Surfista aux = s[j];
                s[j] = s[j + 1];
                s[j + 1] = aux;
            }
            j++;
        }
        i++;
    }
}

 

  • Curtir 1
  • Obrigado 1
Postado

@Lucca Rodrigues Espero que sim, porque não há nada tão ruim quanto na vida de umm profissional em crescimento quanto aceitar respostas prontas. Já vi bons talentos se perderem por conta da mania besta de aceitar resposta pronta, por isso que passei evitar dar qualquer tipo de respostas que NÃO faça a pessoa pensar por si mesma.

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