next up previous contents
suivant: Prise en main de monter: Corrigés des programmes précédent: Vigenere   Table des matières

Changement de base

bases.c


#include<stdio.h>

#define BASE 27

/************************************************/

/*
  Retourne le rang de la lettre a dans l'alphabet.
  'a' est de rang 1, 'b' de rang 2, etc.
*/

char rankOfLetter(char a)
{
  return a - 'a' + 1;
}

/************************************************/

/*
  Retourne la lettre de rang r dans l'alphabet.
*/

char letterOfRank(char r)
{
  return r + 'a' - 1;
}


/************************************************/

/*
  Convertit le nombre nb en base 27, place 
  les lettres calculees dans la chaine c.
  (ne pas oublier le 0 a la fin de c...)
*/

void base27Of10(char* c, unsigned long nb)
{
  if (nb == 0)
    {
      *c = 0;
    }
  else
    {
      *c = letterOfRank(nb%BASE);
      base27Of10(c + 1, nb / BASE);
    }
}

/************************************************/

/*
  Convertit en base 10 le message contenu dans c.
*/

unsigned long base10Of27(char* c)
{
  if (*c == 0)
    return 0;
  return rankOfLetter(*c) + BASE*base10Of27(c + 1);
}

/************************************************/

/*
  Convertit en base 10 le mot "abcdfg", puis le 
  reconvertit de nouveau en base 27.
*/

int main(int argc, char** argv)
{
  char /*c[7] = "abcdfg",*/ d[700];
  unsigned long b10 = base10Of27(argv[1]);  
  printf("%lu\n", b10);
  base27Of10(d, b10);
  printf("%s\n", d);
  return 0;
}


next up previous contents
suivant: Prise en main de monter: Corrigés des programmes précédent: Vigenere   Table des matières
klaus 2010-08-05