Media movel em C.

1. Media movel em C.

Borg Nost
Borgnost

(usa Outra)

Enviado em 30/06/2012 - 15:23h

Então, eu não entendo muita coisa de C e meu professor pediu pra fazer um programa em C pra conseguir representar o cálculo da média móvel simples, só que eu to quebrando a cabeça e não estou conseguindo.
Eu preciso armazenar os valores em um vetor de 1000 posições, ler valores positivos e deve parar quando for imformado um valor negativo, até aqui tudo bem, OU quando chegar ao limite do vetor.

Agora essa parte está complicando e realmente eu não estou conseguindo, se alguém poder ajudar e me indicar um caminho...

*Em seguida deve ler o número de períodos que serão considerados no cálculo. Observe que o número de períodos deve ser compatível com o tamanho do vetor. Cuidado com os limites (extremidades) do vetor.

*Calcular e escrever o novo vetor, lembrando que a cada novo cálculo, o valor que ocupava a posição antiga é descartado.


Bom, andei pesquisando sobre a média móvel e pelo que eu entendi e, meio por cima do que o professor falou é, no vetor de 1000 posições o usuario vai informar o numero de periodos para fazer o cálculo, ex: se ele informar 3, o calculo deve pegar a posição 3 do vetor e uma posição anterior e uma posterior (posição 2 e 4 do vetor) e fazer a média... caso informe 5, deve pegar duas posição anteriores e duas posteriores alem da posição 5 (pegar posição 3,4 e 6,7) e assim por diante... Foi o que eu entendi, se alguém poder dar uma ajuda eu agradeceria muito. E se eu estiver errado sobre a média móvel, me corrijam.

Obrigado.


  


2. Re: Media movel em C.

???
gokernel

(usa Linux Mint)

Enviado em 30/06/2012 - 15:44h

Olá, primeiro seja bem vindo a nossa comunidade você que se cadastrou hoje (30/06/2012) ...

Acredito que o professor já lhe instruiu sobre a "base" ... então para obter ajuda é melhor você postar o código da base que talvez alguém possa ajudar.

Abraço !!!!


3. Ponteiros podem ajudar

Estevão Dominique Ribeiro Dias
estevaodrdias

(usa openSUSE)

Enviado em 30/06/2012 - 17:27h

Você pode passear melhor pela matriz com um ponteiro... Mas apenas se você souber o que está fazendo para não gerar falhas de segmentação. Abaixo um exemplo de como fazer - um programa que fiz para ajudar um amigo. Se não ajudar, use variáveis auxiliares para acessar os endereços da matriz no laço, e outra para guardar os valores e outra para o cálculo... as vezes é preciso testar construindo um código mais simples possível para entender melhor como resolver o problema e depois pensar em deixar o código mais agradável, numa versão final.

/*
main.c
Sáb 02 Jun 2012 19:35:03 BRT
Estevão Dominique Ribeiro Dias at estevaodrdias@gmail.com

Recebe um mês e um ano no formato mm/aaaa e retorna o número de dias nesse mês levando em
consideração se o ano é ou não bissexto. Um ano é bissexto quando é múltiplo de 4 e não
múltiplo de 100, ou também quando é múltiplo de 400.

Há uma lista de anos para testar em http://www.ponteiro.com.br/bisse.php
*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int
main(int argc, char **argv)
{
// Data digitada pelo usuário.
char data[] = "mm/aaaa";

// Mês fornecido pelo usuário
char mes[] = "mm";

// Ano fornecido pelo usuário.
char ano[] = "aaaa";

// Resultado dos testes que vão verificar se o ano digitado pelo usuário é ou não bissexto.
int ano_bissexto = 0;

// Utilizada nos loops. Declarada aqui por que em C devemos declarar nossas variáveis antes de
// qualquer outra declaração.
int contador = 0;

// Matriz contendo o total de dias nos meses do ano para facilitar a impressão do resultado.
// Note que o primeiro elemento na matriz é zero para que não seja necessário alterar o mês
// informado pelo usuário, por exemplo,
// <code>return dias_mes[mes + 1];</code>.
int dias_mes[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

// Um ponteiro nos possibilita trabalhar de forma muito mais fácil com cadeias de caracteres. A
// variável pdata aponta para o primeiro elemento na matriz data.
char *pdata = &data[0];

// Imprime a mensagem de boas vindas na tela.
fprintf(stdout, "Insira uma data no formato: %s\n", data);

// Lê a data.
gets(data);

// Verifica se o formato da data inserido pelo usuário está correto. Se o usuário deseja saber
// quantos dias tem fevereiro e digitou, por exemplo 2/2012, deveria digitar 02/2012, então o
// programa exibe um erro e finaliza. EXIT_FAILURE contém o valor 1, que indica que o programa
// terminou após um erro.
if(data[2] != '/') {
fprintf(stderr, "%s\n%s\n",
"Atenção, o formato da data deve ser mm/aaaa",
"Ex: 02/2012");
system("PAUSE");
return EXIT_FAILURE;
}

// Aqui utilizamos o ponteiro para a variável data para obter porções dessa matriz, e copiar o
// que está antes e depois da barra na matriz para as variáveis ano e mês.
strncpy(mes, pdata, 2);
pdata += 3;
strncpy(ano, pdata, 4);

// Exibe os dados inseridos nas variáveis mês e ano para sabermos como se comportou o bloco de
// código acima. Isso não é relevante para o usuário, portanto pode ser comentado antes de
// gerar a versão final do programa. Ou, de uma forma mais elegante pode ser inserido entre
// macros <code>#ifdef FOO</code> e <code>#endif</code>. Assim só será exibida se usarmos a
// opção <code>-DFOO</code> do compilador.
fprintf(stdout, "\n%s: %s\n%s: %s\n",
"Mês digitado", mes, "Ano digitado", ano);

// Verifica se o mês digitado é maior que doze gerando um erro se for e finalizando o programa.
if(atoi(mes) > 12) {
fprintf(stderr, "%s: %s!\n", "Mês digitado inválido", mes);
system("PAUSE");
return EXIT_FAILURE;
}

// Aqui verificamos se o ano é ou não bissexto. Se for, o valor na variável de controle
// ano_bissexto será verdadeiro. Primeiro verifico se o ano é múltiplo de cem, se for verifico
// se ele é múltiplo de quatrocentos. Se não for verifico se é múltiplo de quatro.
if(atoi(ano) % 100 == 0) {
if(atoi(ano) % 400 == 0)
ano_bissexto = 1;
}
else if(atoi(ano) % 4 == 0)
ano_bissexto = 1;

// Se o mês for fevereiro, e o ano for bissexto, então imprimimos vinte e nove e finalizamos o
// programa.
if(atoi(mes) == 2 && ano_bissexto) {
fprintf(stdout, "%s %s\n",
"A quantidade de dias no mês digitado é: ", "29");
system("PAUSE");
return EXIT_SUCCESS;
}

// Caso contrário imprimimos o valor no endereço correspondente ao mês digitado pelo usuário
// na matriz <code>dias_mes</code>.
fprintf(stdout, "%s %d\n", "A quantidade de dias no mês digitado é: ",
dias_mes[atoi(mes)]);

system("PAUSE");

return EXIT_SUCCESS;
}

Tente resolver - sabe aquele capa do livro Compiladores com o dragão? Destrua ele, brother! Ou dome-o. Leia as mensagens do compilador com atenção e corrija os pontos indicados um por um. Se ainda assim não conseguir coloque o código, as mensagens de erro e questão completa, dai poderemos te ajudar melhor.


4. Re: Media movel em C.

Perfil removido
removido

(usa Nenhuma)

Enviado em 30/06/2012 - 18:00h

Acabei de ver essa pergunta em outro fórum.
Pergunta não, o texto igual.
O que é uma média movel mesmo???? :evil:


5. Re: Media movel em C.

Perfil removido
removido

(usa Nenhuma)

Enviado em 01/07/2012 - 11:19h

na média móvel simples são usados apenas os valores anteriores a partir do ponto a ser calculado, veja:

A B C D E F G H I J
1 5 2 4 7 8 0 3 8 5

supondo que devemos calcular a média móvel simples de 3 períodos no ponto E da tabela acima:
pegamos os últimos 3 valores:
C D E
2 4 7
somamos esses valores e dividimos pelo total de períodos:
(2+4+7)/3 ~= 4,3

mas vamos supor agora que precisamos calcular a MMS no ponto F, também de 3 períodos:
D E F
4 7 8
(4+7+8)/3 ~= 6,3

se não for especificado nenhum ponto, por exemplo, calcule a MMS de 2 períodos:
devemos calcular a MMS do ponto B até o ponto J.

B => (A+B)/2 = (1+5)/2 = 3
C => (B+C)/2 = (5+2)/2 = 3,5
D => (C+D)/2 = (2+4)/2 = 3
.
.
.
J => (I+J)/2 = (8+5)/2 = 6,5

e se fossem 4 períodos, calculamos do ponto D até o ponto J:

D => (A+B+C+D)/4 = (1+5+2+4)/4 = 3
E => (B+C+D+E)/4 = (5+2+4+7)/4 = 4,5
.
.
.
J => (G+H+I+J)/4 = (0+3+8+5)/4 = 4

http://www.financasnet.com.br/index.php?page=article&id=222
fiz um exemplo usando os dados da tabela no link acima para 5 períodos:

#include<stdio.h>

float mediaMovelSimples(float *p, int l) {

int i;
float soma = 0;

for(i=l; i>0; i--) {
soma += *p;
p--;
}

return soma/l;
}
/*===============================================================*/
int main() {

float dados[22] = {24.16, 24.55, 24.43, 24.34, 24.29, 24.19, 23.72, 23.90, 24.13, 24.10, 24.05, 23.77, 24.68, 24.84, 25.10, 26.71, 26.74, 26.68, 26.63, 26.60, 27.15, 26.93};

int i, periodo;
periodo = 5;

for(i=periodo-1; i<22; i++)
printf("%.2f\n", mediaMovelSimples(&dados[i], periodo));

return 0;
}

estude e entenda bem os conceitos de MMS e ponteiros, e tente adaptar esse exemplo ao seu código.


6. Re: Media movel em C.

Perfil removido
removido

(usa Nenhuma)

Enviado em 01/07/2012 - 22:26h

Muito bom!

Tinha visto uma outra explicação.


7. Re: Media movel em C.

Borg Nost
borgnost

(usa Outra)

Enviado em 04/07/2012 - 13:16h

Obrigado thiagocf, dei uma pesquisada e com o teu exemplo consegui, tinha umas coisas a mais que pedia também. Depois coloco aqui pra mostrar como ficou. Obrigado a os outros também que ajudaram.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts