#include #include #include #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); }