Buscar

exemplos de algorítimo para calcular media móvel?

💡 1 Resposta

User badge image

Renan de Matos

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

int main()
{
FILE *file_in;
FILE *file_out;

char line[256];

float num[5];
float media;

file_in = fopen("entrada.txt", "r");
if (!file_in)
{
printf("Erro ao tentar abrir o arquivo de entrada\n");
return 1;
}

file_out = fopen("saida.txt", "a");
if (!file_out)
{
printf("Erro ao criar o arquivo de saida\n");
return 1;
}

fgets(line, 256, file_in);

sscanf(line, "%f %f %f %f %f", &num[0], &num[1], &num[2], &num[3], &num[4]);

media = (num[0] + num[1] + num[2] + num[3] + num[4])/5;

fprintf(file_out, "%f", media);

fclose(file_in);
fclose(file_out);

return 0;
}

Uma explicação da parte mais importante do exemplo:

Supondo um arquivo de entrada com a seguinte linha:
123.57 879.543 0.4908 65.8998 1232.6578

fgets(line, 256, file_in);
Lê a primeira linha do arquivo de entrada (entrada.txt) que deve existir antes de rodar o programa.
A função fgets() lê uma linha e "pula" para a próxima linha de file_in, se você chamasse fgets(line, 256, file_in) de novo você estaria lendo a segunda linha de file_in(entrada.txt) e então a função "pularia" para a terceira linha.


sscanf(line, "%f %f %f %f %f", &num[0], &num[1], &num[2], &num[3], &num[4]);
Aqui é onde ocorre a conversão de string para um numero real, line é a linha lida anteriormente do arquivo com fgets(), repare que fiz 5 %f um para cada valor do vetor num.
Então como exitem 5 numeros na linha lida de entrada.txt, o vetor ficará inicializado assim:
num[0] = 123.57 (numero da 1 coluna da 1 linha)
num[1] = 879.543 (numero da 2 coluna da 1 linha)
num[2] = 0.4908 (numero da 3 coluna da 1 linha)
num[3] = 65.8998 (numero da 4 coluna da 1 linha)
num[4] = 1232.6578 (numeor da 5 coluna da 1 linha)

Observer aqui:
(numero da 1 coluna da 1 linha)
Se você tivesse chamadop fgets() duas vezes antes de chamar sscanf(), nós estariamos com os valores da segunda linha e não da primeira.
Então conforme seja alinha que estamos lendo
num[0] será o valor da primeira coluna da linha que estamos lendo
num[1] será o valor da segunda coluna da linha que estamos lendo
num[2] será o valor da terceira coluna da linha que estamos lendo
num[3] será o valor da quarta coluna da linha que estamos lendo
num[4] será o valor da quinta coluna da linha que estamos lendo

Para se ler mais linhas você deve usar um loop (while, for, etc)
Por exemplo, supondo que file_in tenha NO MINIMO 4 linhas com valores, leia eles e mostre no terminal:
int i; /* Serve para contar o numero de linhas */
for (i = 0; i < 4; i++)
{
/* Le uma linha e guarda em line */
fgets(line, 256, file_in);
/* Converte para numeros */
sscanf(line, "%f %f %f %f %f", &num[0], &num[1], &num[2], &num[3], &num[4]);
/* mostra no terminal */
printf("%f %f %f %f %f\n", num[0], num[1], num[2], num[3], num[4]); 
}

Agora supondo que queremos ler 4 linhas de file_in (entrada.txt) mas no arquivo só existam 3, então devemos verificar se chegou ao final do arquivo com feof() que retorna verdadeiro se chegou o final do arquivo falso caso contrário:
int i;
for (i = 0; i < 4 && !feof(file_in); i++)
{
/* Le uma linha e guarda em line */
fgets(line, 256, file_in);
/* Converte para numeros */
sscanf(line, "%f %f %f %f %f", &num[0], &num[1], &num[2], &num[3], &num[4]);
/* mostra no terminal */
printf("%f %f %f %f %f\n", num[0], num[1], num[2], num[3], num[4]); 
}

Usando o mesmo codigo de agora pouco, mas retirando o printf(), vamos fazer a media aritmetica da coluna 1, precisamos de uma variavel que guarde a soma(soma) dos termo e outra que diga quantos termos foram somado (i):
Lembrando que queremos a media da coluna 1 = num[0]
int i;
float soma = 0; /* inicializa com 0 */
for (i = 0; i < 4 && !feof(file_in); i++)
{
/* Le uma linha e guarda em line */
fgets(line, 256, file_in);
/* Converte para numeros */
sscanf(line, "%f %f %f %f %f", &num[0], &num[1], &num[2], &num[3], &num[4]);
/* Soma o numero que está na coluna 1 com o valor atual de soma
num[0] é a coluna 1, tambem pode ser num[1](coluna 2) */
soma = soma + num[0];
}
/* O valor de i indica quantos numeros foram somados */
printf("Media = %f\n", soma/i);


Poderiamos tambpém ter criado uma variavel chamada media e guardariamos nela a media aritmetica:
int i;
float soma = 0; /* inicializa com 0 */
float media = 0; /* inicializa com 0 */
for (i = 0; i < 4 && !feof(file_in); i++)
{
/* Le uma linha e guarda em line */
fgets(line, 256, file_in);
/* Converte para numeros */
sscanf(line, "%f %f %f %f %f", &num[0], &num[1], &num[2], &num[3], &num[4]);
/* Soma o numero que está na coluna 1 com o valor atual de soma */
soma = soma + num[0];
}
/* O valor de i indica quantos numeros foram somados */
media = soma/i;
printf("Media = %f\n", media);


Com o valor da media obtido, também poderiamos escrever ela no final de saida.txt(file_out) com fprintf():
fprintf(file_out, "%f\n", media);

No fim da execução do programa como não vamos mais usar os arquivos, basta agora fechar todos com fclose():
fclose(file_in);
fclose(file_out);

E retornar um valor ao sistema:
return 0;

0
Dislike0

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

✏️ Responder

SetasNegritoItálicoSublinhadoTachadoCitaçãoCódigoLista numeradaLista com marcadoresSubscritoSobrescritoDiminuir recuoAumentar recuoCor da fonteCor de fundoAlinhamentoLimparInserir linkImagemFórmula

Para escrever sua resposta aqui, entre ou crie uma conta

User badge image

Outros materiais