+ Responder Tópico
  1. #1
    Membro
    Info Conteúdo e Citações Jogos Mensageiros
    Registro
    Jul 2002
    Mensagens
    1.354
    Verdinhas
    6

    PRoblemas com programacao =( Linguagem C

    Olá amigos!!


    Estou cursando uma matéria na faculdade que é de programacao...

    tipo, eu tenho uma certa facilidade em programacao pq fiz tecnico durante o ensino medio, mas soh aprendi a logica de programacao e VB....
    ou seja, nunca mexi em C
    o programa pedido é bem facinho....
    segue o enunciado para que possam acompanhar o drama:



    Spoiler:
    ENUNCIADO:
    Sua tarefa é escrever um programa que automatize o cálculo das notas dadas pelos juízes numa competição de saltos ornamentais. Nas competições em que o programa será usado os atletas executam um salto com um grau de dificuldade dado pelo salto executado, sendo que sempre serão 3 atletas com notas atribuídas por 5 juízes. Com isso deve-se calcular a nota média de cada atleta, descartando-se a menor e a maior nota. Assim deve-se devolver a nota média (média das notas multiplicada pela dificuldade do salto) de cada atleta, bem como devolver se houve um atleta vencedor (um atleta com nota exclusivamente maior do que a dos outros) ou se houve um empate (um ou mais atletas com notas idênticas).


    Entrada:
    A entrada do programa será composta por 4 linhas:

    a primeira linha indica qual o grau de dificuldade (1.0 a 5.0) do salto executado por cada atleta no formato: dif1 dif2 dif3;
    as outras 3 linhas contém as notas (1.0 a 10.0) dadas aos saltos dos atletas pelo cinco juízes no formato: nota1 nota2 nota3 nota4 nota5.

    Saída:
    Seu programa deverá retornar 4 linhas contendo:

    3 linhas com as médias das notas de cada atleta (com duas casas decimais) no formato: atleta [nº_do_atleta]: [média_do_atleta];
    1 linha dizendo se houve um atleta vencedor ou se houve empate. No caso de vencedor a saída deverá ser: vencedor [nº_do_atleta_vencedor] ; e no caso de empate deverá ser: empate. "



    tipo eu consigo fazer tudo, o programa está lindo porém quando as notas sao dadas em numeros com virgula, o programa nao acusa o campeao, ele simplesmente pula todos os meus "ifs" e nao acusa o campeao ou o empate, mas o problema soh acontece quando tem VIRGULA na media


    sei que é bem trabalhoso ver estas coisas, mas se virem os comentários que eu fiz ao longo do algoritmo, talvez seja fácil para vcs...

    Spoiler:

    #include <stdio.h>
    int main (void){

    float dif1, dif2, dif3;
    float an1, an2, an3, an4, an5;
    float bn1, bn2, bn3, bn4, bn5;
    float cn1, cn2, cn3, cn4, cn5;
    float ma, me;
    double m1, m2, m3;

    scanf("%f %f %f", &dif1, &dif2, &dif3);
    scanf("%f %f %f %f %f", &an1, &an2, &an3, &an4, &an5);
    scanf("%f %f %f %f %f", &bn1, &bn2, &bn3, &bn4, &bn5);
    scanf("%f %f %f %f %f", &cn1, &cn2, &cn3, &cn4, &cn5);
    //aqui eu comparo as notas do atelta 1 para saber qual eh a menor e a maior afim de eliminar as notas necessárias
    ma = an1;
    if (an2>ma){
    ma=an2;
    }
    if (an3>ma){
    ma=an3;
    }
    if (an4>ma){
    ma=an4;
    }
    if (an5>ma){
    ma=an5;
    }

    me = an1;
    if (an2<me){
    me=an2;
    }
    if (an3<me){
    me=an3;
    }
    if (an4<me){
    me=an4;
    }
    if (an5<me){
    me=an5;
    }

    m1 = ((an1 + an2 + an3 + an4 + an5 - ma - me))*dif1/3.0;

    //aqui eu comparo as notas do atelta 2 para saber qual eh a menor e a maior afim de eliminar as notas necessárias

    ma = bn1;
    if (bn2>ma){
    ma=bn2;
    }
    if (bn3>ma){
    ma=bn3;
    }
    if (bn4>ma){
    ma=bn4;
    }
    if (bn5>ma){
    ma=bn5;
    }

    me = bn1;
    if (bn2<me){
    me=bn2;
    }
    if (bn3<me){
    me=bn3;
    }
    if (bn4<me){
    me=bn4;
    }
    if (bn5<me){
    me=bn5;
    }


    m2 = ((bn1 + bn2 + bn3 + bn4 + bn5 - ma - me))*dif2/3.0;


    //aqui eu comparo as notas do atelta 3 para saber qual eh a menor e a maior afim de eliminar as notas necessárias
    ma = cn1;
    if (cn2>ma){
    ma=cn2;
    }
    if (cn3>ma){
    ma=cn3;
    }
    if (cn4>ma){
    ma=cn4;
    }
    if (cn5>ma){
    ma=cn5;
    }

    me = cn1;
    if (cn2<me){
    me=cn2;
    }
    if (cn3<me){
    me=cn3;
    }
    if (cn4<me){
    me=cn4;
    }
    if (cn5<me){
    me=cn5;
    }


    m3 = ((cn1 + cn2 + cn3 + cn4 + cn5 - ma - me))*dif3/3.0;
    //aqui eu vejo qual média é a maior entre os atletas.
    ma=m1;
    if (m2>ma){
    ma=m2;
    }
    if (m3>ma){
    ma=m3;
    }
    //imprimo as notas
    printf("atleta 1: %.2f\n", m1);
    printf("atleta 2: %.2f\n", m2);
    printf("atleta 3: %.2f\n", m3);


    //aqui que DEVE estar o problema, deve haver algum conflito entre o tipo de variavel de ma e de m1, mas sinceramente nao sei qual é este problema! =(

    if (ma==m1) {
    if (ma!=m2 && ma!=m3){
    printf("vencedor: 1");
    } else printf("empate");
    }
    else if (ma==m2){
    if (ma!=m1 && ma!=m3){
    printf("vencedor: 2");
    } else printf("empate");
    }
    else if (ma==m3){
    if (ma!=m1 && ma!=m2){
    printf("vencedor: 3");
    } else printf("empate");
    }

    printf ("\n");
    system ("pause");
    return 0;
    }


    se alguem puder dar uma mao, ficaria mto grato =)

  2. # Publicidade
    Publicidade

  3. #2
    Membro
    Info Conteúdo e Citações Jogos Mensageiros
    Registro
    Mar 2003
    Mensagens
    380
    Verdinhas
    35

    Ja tentou mudar as variáveis double m1, m2, m3; para float?

    Eu li teu código e não vi nada anormal. Não vejo a necessidade de usar double já que float possui casas decimas suficientes para resolver o teu problema. Talvez o problema seja na comparação entre uma variavel float e outra double e ele se perca nessa comparação.

  4. #3
    Membro
    Autor do tópico
    Info Conteúdo e Citações Jogos Mensageiros
    Registro
    Jul 2002
    Mensagens
    1.354
    Verdinhas
    6

    huuuum

    eumudei as variaveis ma e me para double...

    ehauheuahaue

    eh que o programa q corrige a licao tava dando erro quadno eut ransformava m1 m2 e m3 em float, nao sei pq....

    agora tudo deu certo, vlw!! =)

  5. #4
    Membro
    Info Conteúdo e Citações Jogos Mensageiros
    Registro
    Mar 2001
    Mensagens
    767
    Verdinhas
    6

    cara, é problema de precisao.. nunca use "==" quando estiver lidando com dois floats, ou dois doubles... é muito facil ocorrer erro de precisao nesses casos..

    bom.. a solução é vc escolher um range..

    primeiro: Ou bote tudo double ou bote tudo float..

    segundo: escolha um range.. por exemplo.. se o maximo de precisao que o juiz pode dar de diferença é 0,1 faça o range para 10^-2:

    if (ma>=(m1+0.01) &&ma<=(m1+0.01)) {
    if ((ma>=(m2+0.01) &&ma<=(m2+0.01 )|| (ma>=(m3+0.01) &&ma<=(m3+0.01 )){
    printf("empate");
    } else printf("vencedor: 1");
    }

    para esse problema pode resolver botar tudo na mesma variavel.. mas quando vc faz muitas contas de dividir com floats.. provavelmente vc poderia querer que 3.1456 seja igual a 3.1457, mas se vc usar o == vai dar errado...

    um exemplo típico é de simulação de colisão... uma bola nunca colide com uma parede em um programa, ela simplesmente entra no seu range que vc considera uma colisão.. oq visualmente nao dá pra perceber... pois distancia 0 e 10^-5, visualmente é 0 por exemplo
    Última edição por CBA_Nunes : 31-08-2008 às 14:24

+ Responder Tópico Ir para o Fórum

Assuntos do tópico

Compartilhar

Permissões