/* File: duedadif.c */
/* Time-stamp: "2001-05-07 15:47:53 calvanes" */
/* Scopo: scrittura su file e lettura da file; uso di rand(), srand() */

/* Simula 100 lanci di due dadi, memorizzando i risultati su un file.
   Poi legge i risultati dal file, ne calcola e stampa la media, e stampa sul
   file "frequenze.txt" le frequenze dei risultati dei lanci.
*/

#include <stdio.h>
#include <stdlib.h>    /* per rand() e srand() */
#include <time.h>      /* per time() */

#define NUM_LANCI 1000


int lancia2Dadi();                          /* Simula il lancio di due dadi. */
void lanciaDadi(char *filelanci);  /* Scrive su file il risultato dei lanci. */
float frequenze(char *filelanci, char *filefreq);
                                     /* Calcola frequenze e media dei lanci. */


int main (void)
{
  char filelanci[13];             /* nome del file per i risultati dei lanci */
  char filefrequenze[13];    /* nome del file per le frequenze dei risultati */
  float media;

  printf("Immetti il nome del file per i risultati dei lanci: ");
  scanf("%12s", &filelanci);
  lanciaDadi(filelanci);

  printf("Immetti il nome del file per le frequenze dei risultati: ");
  scanf("%12s", &filefrequenze);
  media = frequenze(filelanci, filefrequenze);
  printf("La media e` %g\n", media);

  return 0;
}



int lancia2Dadi()
  /* Simula il lancio di due dadi. */
{
  int d1, d2;

  d1 = 1 + rand() % 6;          /* rand() produce un valore tra 0 e RAND_MAX */
  d2 = 1 + rand() % 6;
  return d1 + d2;
}



void lanciaDadi(char *filelanci)
  /* Scrive su file il risultato dei lanci. */
{
  FILE *fp;
  int seed;        /* per inizilizzare il generatore di numeri pseudocasuali */
  int i;           /* indice di ciclo */

  /* inizializzazione del generatore di numeri pseudocasuali */
  printf("Immetti un intero di inizializzazione: ");
  scanf("%u", &seed);
  srand(seed);
  /* srand(time(NULL)) */      /* in alternativa */

  if ((fp = fopen(filelanci, "w")) == NULL) {
    printf("Errore in apertura in scrittura del file %s!\n", filelanci);
    exit(1);
  }

  for (i = 0; i < NUM_LANCI; i++)
    fprintf(fp, "%d\n", lancia2Dadi());

  fclose(fp);
}



float frequenze(char *filelanci, char *filefreq)
  /* Calcola le frequenze dei risultati dei lanci in filelanci e le scrive su
     filefreq. Restituisce la media dei risultati dei lanci. */
{
  int ris;             /* intero letto dal file */
  int somma = 0;       /* somma degli interi letti */
  int frequenze[11] = { 0 };
      /* memorizza le frequenze delle somme ottenute con il lancio di due dadi;
         i possibili valori per la somma sono da 2 a 12, memorizzati negli
         elementi da 0 a 10 del vettore. */
  FILE *fp;
  int i;           /* indice di ciclo */

  if ((fp = fopen(filelanci, "r")) == NULL) {
    printf("Errore in apertura in lettura del file %s!\n", filelanci);
    exit(1);
  }
  for (i = 0; i < NUM_LANCI; i++) {
    fscanf(fp, "%d", &ris);
    somma += ris;
    frequenze[ris - 2]++;
  }
  fclose(fp);

  if ((fp = fopen(filefreq, "w")) == NULL) {
    printf("Errore in apertura in scrittura del file %s!\n", filefreq);
    exit(1);
  }
  fprintf(fp, "Risultato Frequenza\n");
  for (i = 2; i <= 12; i++)
    fprintf(fp, "%9d %9d\n", i, frequenze[i-2]);
  fclose(fp);

  return (float)somma / NUM_LANCI;
}