Ir ao conteúdo

Posts recomendados

Postado

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
Postado

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
Postado

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
Postado

@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
Postado

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

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?

 

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

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
Postado

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
  • Membro VIP
Postado
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
Postado
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
Postado
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)

Postado
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!

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

Postado
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
Postado
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
  • Membro VIP
Postado
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
Postado

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
Postado

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,

  • Membro VIP
Postado
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
Postado
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

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

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!