Download @mod.procedur

Back to the list

   1 : * @MOD      PROCEDUR  MAUGIS    07/03/27    21:15:19     5671           
   2 : 'DEBPROC' @MOD I J ;
   3 : * Petite procédure donnant n modulo m
   4 : *
   5 : * Types possibles : entiers, flottants, listreel, listenti
   6 : *
   7 : * si on donne deux scalaires, si l'un des deux est flottant, on
   8 : * convertit l'autre en flottant.
   9 : * idem pour des listes.
  10 : *
  11 : 
  12 : * indicateur comme quoi on n'a que des entiers en entrée
  13 :   lent = faux ;
  14 :   'SI' ( ('EGA' ('TYPE' i) 'ENTIER') 'OU'
  15 :          ('EGA' ('TYPE' i) 'LISTENTI') ) ;
  16 :     'SI' ( ('EGA' ('TYPE' j) 'ENTIER') 'OU'
  17 :            ('EGA' ('TYPE' j) 'LISTENTI') ) ;
  18 :        lent = vrai ;
  19 :     'FINSI' ;
  20 :   'FINSI' ;
  21 : 
  22 : * on convertit tout en flottants
  23 :   i     = i * 1. ;
  24 :   j     = j * 1. ;
  25 : 
  26 : * indicateur comme quoi on veut un scalaire en sortie
  27 :   lscal = faux ;
  28 : 
  29 : * on convertit tout en liste
  30 :   'SI' ('NEG' ('TYPE' i) 'LISTREEL') ;
  31 :     'SI' ('NEG' ('TYPE' j) 'LISTREEL') ;
  32 :       lscal = vrai ;
  33 :       i   = 'PROG' i ;
  34 :       j   = 'PROG' j ;
  35 :       n   = 1 ;
  36 :     'SINON' ;
  37 :       n   = 'DIME' j ;
  38 :       i   = 'PROG' n * i ;
  39 :     'FINSI' ;
  40 :   'SINON' ;
  41 :     'SI' ('NEG' ('TYPE' j) 'LISTREEL') ;
  42 :       n   = 'DIME' i ;
  43 :       j   = 'PROG' n * j ;
  44 :     'SINON' ;
  45 :       n   = 'DIME' i ;
  46 :       'SI' ('NEG' n ('DIME' j)) ;
  47 :          'ERREUR' 'Les deux listes ne sont pas de la même longueur' ;
  48 :       'FINSI' ;
  49 :     'FINSI' ;
  50 :   'FINSI' ;
  51 : 
  52 :   'SI' (('MINIMUM' J) '<EG' 0) ;
  53 :      'ERREUR' 'le modulo doit être strictement positif' ;
  54 :   'FINSI' ;
  55 : 
  56 :   ratio = I / J ;
  57 : 
  58 : * correction nécessaire due à la différence entre l'opérateur ENTI et la
  59 : * partie entière d'un réel, pour les valeurs négatives, sauf pour les
  60 : * valeurs entières négatives (qui sont correctes). 
  61 : 
  62 :   li1   = 'PROG' n * 1. ;
  63 :   ineg  = 'MASQUE' ratio 'INFERIEUR' 0. ;
  64 :   ieg   = 'MASQUE' ratio 'EGALE'     (('ENTIER' ratio)*1.) ;
  65 :   rati2 = (('ENTIER' ratio)*1.) + ((ieg - li1) * ineg) ;
  66 : 
  67 :   MOD   = I - ( rati2 * J ) ;
  68 : 
  69 :   'SI' lent ;
  70 : *   conversion en listenti (pas de pb car le résultat est positif)
  71 :     mod2 = mod ;
  72 :     MOD  = 'ENTIER' mod2 ;
  73 :     'DETRUIT' mod2 ;
  74 :   'FINSI' ;
  75 :   'SI' lscal ;
  76 : *   conversion en scalaire
  77 :     mod2 = MOD ;
  78 :     MOD  = 'MINIMUM' mod2 ;
  79 :     'DETRUIT' mod2 ;
  80 :   'FINSI' ;
  81 : 
  82 : * Ménage
  83 :   'DETRUIT' li1 ;
  84 :   'DETRUIT' ineg ;
  85 :   'DETRUIT' ieg ;
  86 :   'DETRUIT' ratio ;
  87 :   'DETRUIT' rati2 ;
  88 :   
  89 : 'FINPROC' MOD ;
  90 :  

© Cast3M 2003 - All rights reserved.
Disclaimer