#include #include #include /* esercitazione5.c Copyright (C) 2008 by Giovanni.Organtini@roma1.infn.it This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #define N 100000 #define L 10 #define M 100 /* notare l'uso delle parentesi. Questo nel codice diventa (100000/100) */ #define K (N/M) main() { int data[N]; int dist[L] = {0}; float medie[K] = {0}; FILE *f; /* puntatori per l'accesso ai dati dell'array principale */ int * p = data; int * pend = data + N; /* puntatori per l'accesso all'array medie di float */ float *px, *pxend; /* variabili varie */ int i, j; /* genera i dati. La generazione di numeri interi si fa usando l'operatore modulo */ while (p < pend) { *p++ = rand() % L; } /* riempie l'array dist (avremmo potuto farlo contestualmente alla generazione, ma il compito chiede di farlo in due operazioni distinte */ p = data; while (p < pend) { dist[*p++]++; } /* scrive la distribuzione su file. Usa un for perche' sono pochi elementi */ f = fopen("flat.dat", "w"); for (i = 0; i < L; i++) { fprintf(f, "%d\n", dist[i]);; } fclose(f); /* inizia a ripercorrere il file di dati */ p = data; /* M sottoinsiemi */ for (j = 0; j < M; j++) { /* per ciascun sottoinsieme e' diverso l'ultimo elemento. Il primo e' automaticamente definito dall'ultimo dell'iterazione precedente. L'ultimo elemento si trova k posti a destra del primo. */ pend = p + K; /* calcola la media */ while (p < pend) { medie[j] += *p++; } medie[j] /= K; } /* riempie l'array dist con le frequenze dei valori medi arrotondati all'intero piu' piccolo */ for (i = 0; i < L; i++) { dist[i] = 0; } px = medie; pxend = medie + M; while (px < pxend) { dist[(int)floor(*px++)]++; } /* scrive la distribuzione su file. Usa un for perche' sono pochi elementi */ f = fopen("gauss.dat", "w"); for (i = 0; i < L; i++) { fprintf(f, "%d\n", dist[i]);; } fclose(f); }