Ir ao conteúdo
  • Cadastre-se

C Em busca do erro


Cristina2000

Posts recomendados

Olá.

Eu estou com um problema nesse programa. Eu quero que o programa imprima o return .

No caso 1 ou 2 ou 3 ou 4. Só que não importa o valor da media que se digite ele retorna sempre zero

#include <stdio.h>
#include <stdlib.h>
float media(float);

int main()
{
    float med,c;
    printf("Digite a media\n");
    scanf("%f",&med);
    media(med);
    printf("A media do aluno retorna %f\n",media(med));
    return 0;
}

float media(float a){
    float b;
    if(a<60)
        b=0;
    if(a>=60 && a<=69)
        b=1;
    if(a>=40 && a<=79)
        b=2;
    if(a>=80 && a<=89)
        b=3;
    if(a>=90)
        b=4;
    return b;
}

 

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

@Cristina2000

1 hora atrás, Cristina2000 disse:

Só que não importa o valor da media que se digite ele retorna sempre zero

Retorna 0 se você inserir um valor menor que 40. Você mesma estabeleceu essa condição na sua função.

Por que chamou a função antes de imprimir o valor de retorno da mesma? Isso não tem efeito nenhum.

  • Curtir 2
Link para o comentário
Compartilhar em outros sites

1 hora atrás, Cristina2000 disse:

Eu quero que o programa imprima o return

 

Não. Você quer que o programa imprima o valor retornado pela função.

 

Sua função pode melhorar: entenda que não há razão para 5 comandos if() para algo tão simples. E isso aumenta muito a chance de erro e prejudica a legibilidade. 


E faz muitas contas e testes a toa.

  • Se a for menor que 60 qual o propósito de testar o valor de a mais 4 vezes?
  • Se você não mostra o valor de a como vai saber se media() calculou certo? O printf() tem que mostrar a entrada também ;) 
  • Se o valor de b só serve para o return qual o propósito de existir b?
  • scanf() retorna um valor e você precisa ler: se não veio nada vai calcular a média de que?
  • porque chama media(med) antes do printf() e depois dentro do printf() de novo?
  • para que o float c?
  • mostre os valores que leu para ter mais segurança
  • não perca tempo lendo para testar seu programa. Faça o simples. Já sabe o que precisa testar: os limites dos intervalos. Então teste. Depois leia. 
  • porque usa intervalos conflitantes? Para a = 60 por exemplo
    • (a>=60  && a<=69) vai passar no segundo if e fazer b=1;
    • mas (a>=40 && a<=79) então vai fazer b = 2

Fica muito difícil de entender...
 

Escreva em torno dos dados.


Compare: 

 


float media(float a)
{
    float b;
    if(a<60)  b=0;
    if(a>=60 && a<=69)   b=1;
    if(a>=40 && a<=79)   b=2;
    if(a>=80 && a<=89)   b=3;
    if(a>=90)  b=4;
    return b;
}

 

Com
 

float media2(float a)
{
    if(a>=90) return 4.;
    if(a>=80 && a<=89) return 3.;
    if(a>=70 && a<=79) return 2.;
    if(a>=60 && a<=69) return 1.;
    
    return 0.;
}	// media()

 

Não é mais simples de ler? E tem menos chance de errar um else ou uma condição do if().

 

E para testar?

 

Veja isso:
 

#include <stdio.h>
#include <stdlib.h>
float media(float);

int main()
{
    // float med;
    // printf("Digite a media\n");
    // scanf("%f",&med);
    // printf("Leu: %f\n", med);
    // printf("A media() retornou %f\n",media(med));

    const float valor[10] = 
    { 40., 59., 60., 61., 70., 79., 80., 90., 345.5, 0. };
    
    for( int i=0; i<10; i+= 1)
        printf("Para %f media() retornou %f\n",
            valor[i], media(valor[i])
        );

    return 0;
}

float media(float a){
    if(a>=90) return 4.;
    if(a>=80 && a<=89) return 3.;
    if(a>=70 && a<=79) return 2.;
    if(a>=60 && a<=69) return 1.;
    
    return 0.;
}

 

Não é mais fácil preencher os valores de teste:
 

    const float valor[10] = 
    { 40., 59., 60., 61., 70., 79., 80., 90., 345.5, 0. };
 

 

e depois escrever um comando só:
 

    for( int i=0; i<10; i+= 1)
        printf("Para %f media() retornou %f\n",
            valor[i], media(valor[i])
        );

 

e conferir de uma vez vendo na tela
 

Para 40.000000 media() retornou 0.000000
Para 59.000000 media() retornou 0.000000
Para 60.000000 media() retornou 1.000000
Para 61.000000 media() retornou 1.000000
Para 70.000000 media() retornou 2.000000
Para 79.000000 media() retornou 2.000000
Para 80.000000 media() retornou 3.000000
Para 90.000000 media() retornou 4.000000
Para 345.500000 media() retornou 4.000000
Para 0.000000 media() retornou 0.000000


e se estiver certo só aí tirar os comentários do scanf() e ler do teclado, porque já sabe que o cálculo está ok? 

 

 

 

  • Curtir 2
  • Amei 1
Link para o comentário
Compartilhar em outros sites

@Lucca Rodrigues Oi Lucas. Você tem razão só que essa chamada na realidade não existe. Isso aconteceu porque eu estava fazendo várias mudanças e tentativas para corrigir o erro. E no momento em que copiei o código para colocar aqui esqueci de apagar essa chamada, não era para ela estar ali. 

@arfneto Olá. Obrigada pelas informações. O float c e a chamada da função antes do printf estão aí por engano. Eu fiquei mexendo no programa várias vezes tentando fazê-lo funcionar e no momento em que copiei o código esqueci de retirar essas alterações que havia feito. 

if(a>=90) return 4.;

Eu fiz dessa forma, que mencionou,  num primeiro momento, e fiquei bastante surpresa por não funcionar. Então eu achei que a sintaxe estava incorreta e acrescentei a variável b. 

Eu vi a solução que colocou usando vetor. É realmente muito mais eficiente. Eu já estudei vetores e sei usá-los. Só que eu estou fazendo esses exercícios de um livro e esses exercícios no livro estão  antes do ensino dos vetores e são para praticar funções somente. Eu acho importante treiná-los sem os vetores para ir treinando o raciocínio, mesmo que na maioria das vezes fosse bem mais fácil usar os vetores. Eu acredito que com uma base bem sólida, ficará mais fácil o meu aprendizado à medida que a complexidade dos exercícios for aumentando. 

Muito obrigada, pela ajuda. Tenha um ótimo domingo. 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

34 minutos atrás, Cristina2000 disse:

Eu acho importante treiná-los sem os vetores para ir treinando o raciocínio

 

41 minutos atrás, Cristina2000 disse:

Eu acredito que com uma base bem sólida, ficará mais fácil o meu aprendizado à medida que a complexidade dos exercícios for aumentando


🤔 é uma opinião.

 

Eu também tenho uma: não vai aprender nada seguindo esse caminho. Não vai reforçar nenhum conceito. Não vai treinar nenhum raciocínio. Nada. É como programar sem usar funções ou evitar conceitos que não aprendeu ainda. Ou andar com um pé só.

No geral nesse campo você tem um problema e vai à documentação para procurar uma solução e ver o que pode ser feito. Seja o livro, o forum, um mecanismo de busca. E a partir daí você escreve sua solução.  "Não aprendi isso ainda" e frases assim não tem suporte na prática: imagino que você, como eu e todos, vai estar sempre aprendendo e é mais eficiente virar a página e ver o que tem adiante antes de começar um programa. 


Em geral a gente recebe por desempenho. E mesmo que não esteja recebendo produtividade vai fazer sua vida mais simples.


O vetor que usei nada tem a ver com o programa.

Estava mostrando como pode testar o programa com os intervalos importantes usando o próprio programa. Isso nem iria para o programa definitivo, já que vai ler os valores do teclado. Só estou tentando te mostrar que não usar isso de ler valores do teclado durante os testas da função que calcula a media. Não é esperto. Só vai perder tempo e eficiência digitando valores a olho no terminal a cada teste:

 

image.png.ba6bb43859b6982624773eb6c5941138.png

Depois que a função estiver testada você tira isso e lê os valores normalmente. Era isso o que eu tentava te mostrar.

40 minutos atrás, Cristina2000 disse:

Eu fiz dessa forma, que mencionou,  num primeiro momento, e fiquei bastante surpresa por não funcionar


Eu também ficaria.
 

 


Bom domingo!

 

 

Link para o comentário
Compartilhar em outros sites

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