2025_Gennaio.c (download)
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define NMIN 2000
#define NMAX 16000
#define B 0.2
void inserimento(const char *msg, int *d, int dmin, int dmax);
void genera_seq(int N, double xi[]);
void smussa_seq(int N, int k, const double xi[], double xis[]);
void stampa_seqs(int N, int k, const double xi[], const double xis[]);
int main() {
    int N, k;
    double xi[NMAX];
    double xis[NMAX];
    srand48(138);
    // la stringa che passo a inserimento() è un template che verrà utilizzato
    // all'interno della funzione per stampare i valori corretti dell'intervallo
    // questa è una tecnica piuttosto avanzata: se avete fatto diversamente
    // non è un problema
    inserimento("Inserisci N (%d <= N <= %d): ", &N, NMIN, NMAX);
    inserimento("Inserisci k (%d <= k <= %d): ", &k, 1, N / 10);
    genera_seq(N, xi);
    smussa_seq(N, k, xi, xis);
    stampa_seqs(N, k, xi, xis);
    return 0;
}
void inserimento(const char *msg, int *d, int dmin, int dmax) {
    do {
        printf(msg, dmin, dmax);
        scanf("%d", d);
    } while(*d < dmin || *d > dmax);
}
void genera_seq(int N, double xi[]) {
    int i;
    for(i = 0; i < N; i++) {
        double r = (2.0 * drand48() - 1.0) * B;
        xi[i] = r + cos(2.0 * M_PI * (double)i / (double)N);
    }
}
void smussa_seq(int N, int k, const double xi[], double xis[]) {
    int i, j;
    int w = 2 * k + 1;
    for(i = k; i <= N - k - 1; i++) {
        double somma = 0.0;
        for(j = i - k; j <= i + k; j++) {
            somma += xi[j];
        }
        xis[i] = somma / (double)w;
    }
}
void stampa_seqs(int N, int k, const double xi[], const double xis[]) {
    FILE *fp = fopen("mediamobile.dat", "w");
    if(fp == NULL) {
        printf("Errore: impossibile aprire mediamobile.dat in scrittura.\n");
        exit(1);
    }
    int i;
    for(i = k; i <= N - k - 1; i++) {
        fprintf(fp, "%d %.4lf %.4lf\n", i, xi[i], xis[i]);
    }
    fclose(fp);
}