Advertisement
bsddeamon

bag.c

Jan 7th, 2016
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.24 KB | None | 0 0
  1. #include "MonDallas.h"
  2.  
  3. // getchar() et printf().
  4. #include <stdio.h>
  5.  
  6. // srand(), rand(), init_mempool()
  7. // malloc() et free().
  8. #include <stdlib.h>
  9.  
  10. // isdigit().
  11. #include <ctype.h>
  12.  
  13. // assert().
  14. #include <assert.h>
  15.  
  16. // Echange le contenu pour deux
  17. // indexes d'un tableau sans utiliser de
  18. // variable temporaire (avec des
  19. // "OU exclusifs").
  20. #define ASWAP(i, j) do { \
  21.   array[i] ^= array[j]; \
  22.   array[j] ^= array[i]; \
  23.   array[i] ^= array[j]; \
  24. } while (0);
  25.  
  26. // Reserve 256 bytes de SRAM interne.
  27. UC xdata malloc_mempool[0x100];
  28.  
  29. // Tableau a visibilite globale utilisant la
  30. // SRAM interne.
  31. xdata UC * array = NULL;
  32.  
  33. // Melange recursivement le contenu
  34. // d'un tableau de taille n.
  35. void shuffle(UC n);
  36.  
  37. // Gere la recuperation des entrees,
  38. // leur validation, leur conversion,
  39. // puis fournit un nombre entre 0 et 100,
  40. // le tout simplement et recursivement.
  41. UC get_number(UC i, UC accum, UC input);
  42.  
  43. void main(void) {
  44.   UI entropy = 0; // Source de hasard.
  45.   UC i = 0; // Compteur multi-usages.
  46.   UC size; // Input (taille du tableau).
  47.  
  48.   // Blabla...
  49.   SCON0 = 0x50;
  50.   TMOD |= 0x20;
  51.   TH1 = 0xFF;
  52.   PCON = 0x80;
  53.   TR1 = 1;
  54.   TI_0 = 1;
  55.  
  56.   // Donne acces au 1K SRAM interne.
  57.   PMR |= 0x01;
  58.  
  59.   // Initialisation de la memoire
  60.   // dynamique.
  61.   init_mempool(&malloc_mempool, sizeof(malloc_mempool));
  62.  
  63.   printf("Pese sur P3.3...\n");
  64.  
  65.   // Incremente le compteur tant que
  66.   // le bouton n'est pas pese.
  67.   while (P3_3) entropy++;
  68.  
  69.   // Initialisation "aleatoire"
  70.   // du generateur.
  71.   srand(entropy);
  72.  
  73.   while (1) { // Boucle infinie.
  74.  
  75.     printf("Entre un nombre entre 0 et 100 et pese sur \"Enter\"...\n");
  76.  
  77.     size = get_number(0, 0, getchar());
  78.     assert(size < 101);
  79.  
  80.     // Cree un tableau d'unsigned chars
  81.     // dynamiquement.
  82.     array = malloc(sizeof(UC) * size);
  83.  
  84.     // Erreur si on manque de memoire.
  85.     assert(array);
  86.  
  87.     // Initialise chaque valeur du
  88.     // a son propre index.
  89.     for (i = 0; i < size; i++) array[i] = i;
  90.  
  91.     // Melange le tableau.
  92.     shuffle(size);
  93.  
  94.     // Imprime le tableau a l'ecran.
  95.     printf("Indexes melanges:\n[%d", (UI)(array[0]));
  96.     for (i = 1; i < size; i++) printf(", %d", (UI)(array[i]));
  97.     printf("]\n\n");
  98.  
  99.     // Libere la memoire allouee
  100.     // dynamiquement au tableau.
  101.     free(array);
  102.   }
  103. }
  104.  
  105. // Algorithme recursif pour melanger le
  106. // contenu d'un tableau:
  107. // n = "taille du tableau".
  108. // Echange les variables aux indexes
  109. // (n - 1) et (nombre aleatoire entre
  110. // 0 et (n - 1)) jusqu'a (n == 1).
  111. void shuffle(UC n) {
  112.   UC m = n - 1; // Decrementation.
  113.   if (n > 1) { // Condition de terminaison.
  114.     // n = (nombre aleatoire entre 0 et m)
  115.     do { n = (UC)(rand() % (m + 1));
  116.     // tant que n n'est pas different de m.
  117.     } while (n == m);
  118.     ASWAP(m, n); // Brassage.
  119.     shuffle(m); // Recursion(n = n - 1).
  120.   }
  121. }
  122.  
  123. // Initialisation:
  124. // get_number(0, 0, getchar());
  125. // Accumule les nombres entres en
  126. // multipliant la valeur accumulee
  127. // par 10 a chaque recursion tout en
  128. // testant la validite des entrees.
  129. UC get_number(UC i, UC accum, UC input) {
  130.   if ((i > 2) || (input == '\n')) return accum;
  131.   else {
  132.     assert(isdigit(input));
  133.     return get_number(i + 1, (accum * 10) + (input - '0'), getchar());
  134.   }
  135. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement