Posuvný register

Hod kockou


Program   EXE

/* pripojenie potrebných hlavičkových súborov */
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

/* budeme používa? 5 - prvkový posuvný register */
#define N 5

typedef struct uzol {
   int x;
   struct uzol *dalsi;
}  TUzol;

-----------------------------------------------------------------------------------
void vytvor_register(TUzol **z, TUzol **k)
{
  TUzol *pom;
  int i;

  printf("\nZadaj zaciatocne hodnoty xi z mnoziny {1, 2, 3, 4, 5, 6}\n");

  *z  = (TUzol*)malloc(sizeof(TUzol));
  printf("x0 = ");
  scanf("%d", &((*z)->x));
  (*z)->dalsi = NULL;
  *k = *z;

  for (i = 2; i <= N; i++) {
    pom = (TUzol*)malloc(sizeof(TUzol));
    if (i < N) {
      printf("x%d = ", i-1);
      scanf("%d", &(pom->x));
    }

    (*k)->dalsi = pom;
    pom->dalsi = NULL;
    *k = pom;
  }
}
-----------------------------------------------------------------------------------
void posun_vlavo(TUzol **z, TUzol **k) 
{
  TUzol *pom;

  pom = *z;
  *z = (*z)->dalsi;
  free((void*)pom);

  pom = (TUzol*)malloc(sizeof(TUzol));
  (*k)->dalsi = pom;
  pom->dalsi = NULL;
  *k = pom;
}
-----------------------------------------------------------------------------------
int nove_x(TUzol *z)  /* rekurentný vz?ah */
{
  int x = 7*z->x + z->dalsi->dalsi->dalsi->x + 991;    
  return ((x % 6) + 1);
}
-----------------------------------------------------------------------------------
void main(void) /* hlavný program */
{
  TUzol *zac, *kon;
  int pocetnost[6] = {0, 0 , 0, 0, 0, 0};
  long PocetPokusov, i;

  zac = kon = NULL;

  clrscr();
  printf("Hod hracou kockou - generator pseudonahodnych cisel\n\n");
  printf("x4 = f(x0, x1, x2, x3)\n\n");
  printf("Pocet pokusov: ");
  scanf("%ld", &PocetPokusov);
  vytvor_register(&zac, &kon);
  clrscr();

  /* prvý pokus */
  kon->x = nove_x(zac);
  printf("%d", kon->x);
  pocetnost[kon->x - 1]++;

  /* ostatné pokusy */
  for (i = 2; i <= PocetPokusov; i++) {
    posun_vlavo(&zac, &kon);
    kon->x = nove_x(zac);
    printf("%d", kon->x);
    pocetnost[kon->x - 1]++;
  }

  /* výstup */
  printf("\n\nRelativne pocetnosti nahodnych udalosti:\n\n");
  for (i = 0; i<6; i++) {
    printf("Padnutie cisla %ld ...... %8.4f %%\n", i+1, 100*(float)pocetnost[i]/PocetPokusov);
  }
  getch();
}