Ir ao conteúdo
  • Cadastre-se
Josesousa

C Repeticao desnecessaria na Funcao.

Recommended Posts

Hey, guys. :)

 

Estava resolvendo o exercicio de media, simples. No entanto, a função criada esta lendo o dobro do que deveira. 

Segue o codigo. 

 

Obs: O erro, possivelmente, esta na funcao ja que a leitura se dar dentro dela. (acredito)

 

/**17. Faça uma função que leia um número não determinado de valores positivos e retorna a média aritmética dos
 mesmos.*/
#include <stdio.h>
main (){
    int a;
    printf("Informe quantos numeros serao lidos: ");
    scanf("%d", &a);

    float media(int a);
    media(a);

    printf("A media da quantidade de numeros digitados e de %f.\n", media(a));
}
float media (int a){
    int i;
    float vet[a];
    float q=0;

    for(i=0;i<a;i++){
        do{
            printf("Numero %d: ", i);
            scanf("%f", &vet[i]);
        }while(vet[i]<0);
    }
    for(i=0;i<a;i++){
        q+=vet[i];
    }
    return q/(a);
}

Agradecido por ajudar.... :D

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Do algoritmo o que se tem é que, a função está lendo lê determinadas vezes (a) nunhuma lista de tamanho determinado a. Lógica parcialmente certa. Porque o certo é que leia indeterminados não determinados valores positivos, e para isso não é se quer necessário uso vetores.

 

4 variáveis bastam:

  1. Valor atual lido;
  2. Soma dos valores lidos;
  3. Número de valores lidos;
  4. Média dos valores lidos.

 

 

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Aqui está:

 

/**
 * 17. Faça uma função que leia um número não determinado de valores positivos 
 * e retorna a média aritmética dos mesmos.
**/
#include <stdio.h>

float media (float vet[], int a){
    int i;
    float q=0;

    for(i=0;i<a;i++){
        q+=vet[i];
    }
    
    return q/(a);
}

int main (){
    int a, i;
    float vet[a];
    printf("Informe quantos numeros serao lidos: ");
    scanf("%d", &a);

    for(i=0;i<a;i++){
        do{
            printf("Numero %d: ", i);
            scanf("%f", &vet[i]);
        }while(vet[i]<0);
    }

    printf("A media da quantidade de numeros digitados e de %f.\n", media(vet, a));
    
    return 0;
}

- Reorganizei o código, definindo a função na sequência clássica.

- Retirei a leitura dos dados de dentro da função media, fazendo ela fazer apenas o trabalho que se espera dela, ou seja calcular a média.

- int main() e return 0.

  • Obrigado 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

@AnsiC Sim eu poderia ir lendo os valores e ja somando, para depois realizar a media. Evitaria realmente a criacao de mais variaveis. Muito inteligente e Muito bom. Obrigado. 

 

@isrnick Consegui aqui, ainda mantive a ordem, entretanto eu tive que colocar um valor para a variavel 'A' de inicio, mesmo que depois acaba sendo escrito outro valor por "cima" . Pois sem um valor de inicio nao rodava. (estranho, ja que a sua leitura era logo em seguida)

Obs: Eu normalmente quando passo o vetor para uma funcao em faco da seguinte forma:

void qualquerFuncao (int *vet);

Interessante a forma como você passou. Muito legal.

  • Obrigado 1
  • Confuso 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente tem um problema no código que postei, está definindo float vet[a] sem a ter um valor, pra corrigir isso basta mudar essa declaração do vetor vet para depois que a já tiver um valor.

 

Segue corrigido:

/**
 * 17. Faça uma função que leia um número não determinado de valores positivos 
 * e retorna a média aritmética dos mesmos.
**/
#include <stdio.h>

float media (float vet[], int a){
    int i;
    float q=0;

    for(i=0;i<a;i++){
        q+=vet[i];
    }
    
    return q/(a);
}

int main (){
    int a, i;
  
    printf("Informe quantos numeros serao lidos: ");
    scanf("%d", &a);

    float vet[a];
  
    for(i=0;i<a;i++){
        do{
            printf("Numero %d: ", i);
            scanf("%f", &vet[i]);
        }while(vet[i]<0);
    }

    printf("A media da quantidade de numeros digitados e de %f.\n", media(vet, a));
    
    return 0;
}

 

adicionado 1 minuto depois
10 minutos atrás, Josesousa disse:

Obs: Eu normalmente quando passo o vetor para uma funcao em faco da seguinte forma:


void qualquerFuncao (int *vet);

Interessante a forma como você passou. Muito legal.

 

Na prática é só um jeito diferente de fazer a mesma coisa.

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, Josesousa disse:

Sim eu poderia ir lendo os valores e ja somando, para depois realizar a media. Evitaria realmente a criacao de mais variaveis. Muito inteligente e Muito bom. Obrigado. 

E a parte de ilimitar as entradas não tem importância?

  • Confuso 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
5 minutos atrás, AnsiC disse:

E a parte de ilimitar as entradas não tem importância?

@AnsiC Como assim limitar as entradas? 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou lendo Li do enunciado que você mesmo posta postou junto ao algoritmo original em post#1

 

Veja:

Em 28/07/2018 às 19:24, Josesousa disse:

/**17. Faça uma função que leia um número não determinado de valores positivos e retorna a média aritmética dos mesmos.*/

Ou seja, o usuário teoricamente não sabe quando números vão ser serão digitados [ilimitar: não por limite], é um número de valores "ilimitado" no sentido de que vai entrando entrará até não ter mais, e eu (usuário) não sei quantos serão. Daí usar vetores não faz sentido é despropósito, se isso for ignorado, então fará sentido o uso de vetores. Entendeu?

 

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 minuto atrás, Josesousa disse:

@AnsiC Como assim limitar as entradas? 

Seria "ilimitar" as entrada, ou seja deixar sem limite.

Sem usar vetor e ir somando diretamente os números teoricamente permitiria digitar uma quantidade arbitrariamente grande de números, mas com vetor fica limitado ao tamanho do vetor.

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
7 minutos atrás, AnsiC disse:

Daí usar vetores não faz sentido, se isso for ignorado então fará sentido o uso de vetores.

Para ser mais preciso, não faz sentido o uso de vetores se consideramos o rendimento. Porém é aceitável.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas @AnsiC para lidar com quantidade variáveis de números foi usado um vetor com tamanho variável para se adaptar a quantidade de números que serão usado, qualquer que seja. Claro isso ainda é limitado pelo tamanho máximo que um vetor pode ter, mas se realmente quisermos considerar casos extremos também poderíamos usar malloc().

 

Mas esse enunciado não faz muito sentido se lido literalmente, pois a quantidade de números deve ser determinada em algum ponto no programa, a menos que queira fazer um loop infinito e ir imprimindo uma nova média toda vez que um número for digitado. Ainda assim uma hora a soma iria estourar o valor máximo da variável int.

adicionado 2 minutos depois

O real argumento para não usar vetor é por que nesse programa ele não é necessário.

  • Obrigado 2

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu também tenho, minha própria compreensão do problema que não inclui vetores. Mais como post original tem vetores isso torna-se particular até que outro poste surja. Ainda assim seguramente o uso de vetores é menor opção de escala custo x beneficio.

 
 
9 minutos atrás, isrnick disse:

Mas @AnsiC para lidar com quantidade variáveis de números foi usado um vetor com tamanho variável ...

Na aproximação de um valor definido, a complexidade para nós é não definir.

adicionado 7 minutos depois

Ou mais precisamento segundo o problema, e minha compreensão:  não determinado. Contudo posso aceita que não determinado seja o mesmo que variável.

  • Curtir 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
2 horas atrás, Josesousa disse:

/**17. Faça uma função que leia um número não determinado de valores positivos e retorna a média aritmética dos mesmos.*/

 

O enunciado é o x da questão..

 

Do que eu entendi:

- A leitura dos dados, verificações e cálculos é para ser feito na função. O que é diferente de "usar uma função para calcular a média";

- A função basicamente deveria ir lendo números reais (float) e acumulando até que um número não seja positivo. Não precisa vetor para esse contexto. Aí calcula e retorna a média. Ler "quantos numeros serao lidos" é justamente o oposto do que foi pedido... ^_^

  • Obrigado 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 28/07/2018 às 21:56, isrnick disse:

pois a quantidade de números deve ser determinada em algum ponto no programa

Acho que é bem por aqui; pois deva existir exite um símbolo: o valores negativos, ou # que determina o fim das entradas, sendo que não fui eu (usuário) que informou a quantidade, mais existe um símbolo para tanto.

 

Ainda sim é só um sugestão.

 

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
3 minutos atrás, isrnick disse:

Mas esse enunciado não faz muito sentido se lido literalmente, pois a quantidade de números deve ser determinada em algum ponto no programa, a menos que queira fazer um loop infinito e ir imprimindo uma nova média toda vez que um número for digitado. Ainda assim uma hora a soma iria estourar o valor máximo da variável int.

@isrnick Foi isso que eu pensei.  :wiggle:  é......

 

@AnsiC Mas na hora do for, ficaria como? Deixaria em branco na condicao de parada.

 

Fiz um codigo a parte aqui usando while.

Exemplo: 

#include <stdio.h>

int main(void) {
  int num,i=1,j=0, soma=0;
  float media;


while(i==1){
printf("Digite um numero: ");
  scanf("%d", &num);
  j++;
  soma=soma+num;
  media=soma/j;
  printf("\nA media e %f\n", media);
}
}

 

(interessante a forma como voce ver o problema, no inicio em ate cheguei a pensar que estava faltando algo, pois como o prof vai verificar se o programa nunca acaba, ai fiz no vetor)

Compartilhar este post


Link para o post
Compartilhar em outros sites
3 minutos atrás, Simon Viegas disse:

 

O enunciado é o x da questão..

 

Do que eu entendi:

- A leitura dos dados, verificações e cálculos é para ser feito na função. O que é diferente de "usar uma função para calcular a média";

- A função basicamente deveria ir lendo números reais (float) e acumulando até que um número não seja positivo. Não precisa vetor para esse contexto. Aí calcula e retorna a média. Ler "quantos numeros serao lidos" é justamente o oposto do que foi pedido... ^_^

Finalmente, EU CONCORDO!

Compartilhar este post


Link para o post
Compartilhar em outros sites
9 minutos atrás, Simon Viegas disse:

 

O enunciado é o x da questão..

 

Do que eu entendi:

- A leitura dos dados, verificações e cálculos é para ser feito na função. O que é diferente de "usar uma função para calcular a média";

- A função basicamente deveria ir lendo números reais (float) e acumulando até que um número não seja positivo. Não precisa vetor para esse contexto. Aí calcula e retorna a média. Ler "quantos numeros serao lidos" é justamente o oposto do que foi pedido... ^_^

 

Entendi, então a função seria:

 

/**
 * 17. Faça uma função que leia um número não determinado de valores positivos 
 * e retorna a média aritmética dos mesmos.
**/
#include <stdio.h>

float media (){
    int i = 0;
    float q=0, val=0;
  
    do{
        i++;
        q += val;
        printf("Numero %d: ", i);
        scanf("%f", &val);
    } while(val > 0);
  
    return q/(i);
}

Como são só números positivos 0 também não entra.

Compartilhar este post


Link para o post
Compartilhar em outros sites
6 minutos atrás, Simon Viegas disse:

... e acumulando até que um número não seja positivo...

Mas se esta acumulando, acredito que nao tenha como o numero ficar negativo. Não sei bem, mas acho isso meio estranho.

Seria o caso realmente utilizar de algum caracter para sair do loop., como disso o @AnsiC .

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
17 minutos atrás, Josesousa disse:

Mas na hora do for, ficaria como? Deixaria em branco na condicao de parada.

Exatamente, pois a interrupção vem de 3 possibilidades:

  1. EOF: Fim do Arquivo
  2. Valor negativo: ... -1
  3. Valor não numérico na lista: a, b, c #

 

 

adicionado 2 minutos depois
9 minutos atrás, Josesousa disse:

Mas se esta acumulando, acredito que nao tenha como o numero ficar negativo. Não sei bem, mas acho isso meio estranho.

Muito bem observado, os valores negativos são simplesmente ignorados.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
8 minutos atrás, Josesousa disse:

Mas se esta acumulando, acredito que nao tenha como o numero ficar negativo. Não sei bem, mas acho isso meio estranho.

 

"Número" se refere ao número lido.

 

Seria exatamente isso:

11 minutos atrás, isrnick disse:

 

Entendi, então a função seria:


/**
 * 17. Faça uma função que leia um número não determinado de valores positivos 
 * e retorna a média aritmética dos mesmos.
**/
#include <stdio.h>

float media (){
    int i = 0;
    float q=0, val=0;
  
    do{
        i++;
        q += val;
        printf("Numero %d: ", i);
        scanf("%f", &val);
    } while(val > 0);
  
    return q/(i);
}

Como são só números positivos 0 também não entra.

 

  • Curtir 1
  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seguindo a lógica do @AnsiC a função seria:

 

/**
 * 17. Faça uma função que leia um número não determinado de valores positivos 
 * e retorna a média aritmética dos mesmos.
**/
#include <stdio.h>

float media (){
    int i = 1;
    float q=0, val=0;
  
    do{
        if (val > 0) {
            i++;
            q += val;
        }
        printf("Numero %d: ", i);
    } while(scanf("%f", &val));
  
    return q/(i);
}

 

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi agora.

No que eu tinha feito la em cima de exemplo de uma soma de numeros "infinitos" coloquei diretamente a media dentro do laço para que voce impresso em seguida da leitura.

Ai no caso acima, atende melhor o exercicio pedia. GENIAL,

Compartilhar este post


Link para o post
Compartilhar em outros sites
6 minutos atrás, isrnick disse:

Uma usa número negativo,

 

Observação: "número não positivo".

adicionado 2 minutos depois

Pois:

13 minutos atrás, Simon Viegas disse:

Como são só números positivos 0 também não entra.

  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites
Em 28/07/2018 às 22:38, isrnick disse:

Seguindo a lógica do @AnsiC a função seria:

Se supusermos por um instante que, essa lista hipotética tenha valores numéricos do conjunto dos reais, ignorar os não positivos é bem mais aceitável, assim se interrompe apenas quando encontrasse EOF, nessa hipotese suponho que a lista tem de tudo; você está lendo de um file input que não é somente do teclado. Tudo isso são questões subjacente que muito provavelmente não seria avaliada em um estado de exercício introdutório. Fica como mais uma sugestão para outra questão.  

> . <

 

 

Por exemplo no windows podes fazer assim: 

media_eof.exe < numeros_reais.txt: Ou seja, você está estou redirecionando [ < ] o stdin para o arquivo txt, usando operador do prompt.

 

  • Curtir 1

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

×