[C] Repeticao desnecessaria na Funcao. - C/C#/C++ - Clube do Hardware
Repeticao desnecessaria na Funcao.
C Repeticao desnecessaria na Funcao.
Por UmPrograma, 28 de julho de 2018 em C/C#/C++
Estava resolvendo o exercicio de media, simples. No entanto, a função criada esta lendo o dobro do que deveira.
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.*/
printf("Informe quantos numeros serao lidos: ");
float media(int a);
media(a);
printf("A media da quantidade de numeros digitados e de %f.\n", media(a));
float media (int a){
float vet[a];
printf("Numero %d: ", i);
scanf("%f", &vet[i]);
}while(vet[i]<0);
q+=vet[i];
return q/(a);
Agradecido por ajudar....
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:
Valor atual lido;
Soma dos valores lidos;
Número de valores lidos;
Média dos valores lidos.
* 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.
float media (float vet[], int a){
printf("A media da quantidade de numeros digitados e de %f.\n", media(vet, a));
- 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.
@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.
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.
Na prática é só um jeito diferente de fazer a mesma coisa.
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?
@AnsiC Como assim limitar as entradas?
Estou lendo Li do enunciado que você mesmo posta postou junto ao algoritmo original em post#1
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?
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.
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.
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.
O real argumento para não usar vetor é por que nesse programa ele não é necessário.
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.
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.
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.
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...
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.
@isrnick Foi isso que eu pensei. é......
@AnsiC Mas na hora do for, ficaria como? Deixaria em branco na condicao de parada.
Fiz um codigo a parte aqui usando while.
int num,i=1,j=0, soma=0;
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)
Finalmente, EU CONCORDO!
Entendi, então a função seria:
float media (){
float q=0, val=0;
q += val;
} while(val > 0);
return q/(i);
Como são só números positivos 0 também não entra.
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 .
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:
EOF: Fim do Arquivo
Valor negativo: ... -1
Valor não numérico na lista: a, b, c #
9 minutos atrás, Josesousa disse:
Muito bem observado, os valores negativos são simplesmente ignorados.
8 minutos atrás, Josesousa disse:
"Número" se refere ao número lido.
Seria exatamente isso:
Seguindo a lógica do @AnsiC a função seria:
} while(scanf("%f", &val));
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,
Do @Simon Viegas e @AnsiC só muda a condição de parada... Uma usa número negativo ou zero, outra qualquer coisa que não seja um número válido.
Uma usa número negativo,
Observação: "número não positivo".
13 minutos atrás, Simon Viegas disse:
Em 28/07/2018 às 22:38, isrnick disse:
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.