Convertisseur de nombre de base en base

Contenu du snippet

Ce Convertisseur rudimentaire permet de changer un nombre écrit dans une base de départ entière comprise entre 2-64 en une autre base comprise entre 2-64. Interface en ligne de commande rudimentaire (scanf, printf), les bases supérieures a 36 sont en mode 123abcABC et la base 63/64 est en mode 123abcABC+/ (voir base_tab) pour me simplifier la tâche.

Source / Exemple :


#include <stdio.h>
#include <assert.h>
#include <stdlib.h>

char base_tab[64] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '+', '/'};

int power(int b, int e)
{
	int i, result = 1;
	for (i = 0; i < e; i++)
		result *= b;
	return result;
}

int max_pow(int numb, int base2)
{
	int result = 1;
	
	if (numb == 0)
		return 0;
	else
	{
		int result = 1;
		while (result <= numb)
			result *= base2;
		
		return (result/base2);
	}
}

int m_pow(int numb, int base)
{
	int result = 0, gaga = 1;
	
	if (numb == 0)
		return 0;
	else
	{
		while (gaga <= numb)
		{
			gaga *= base;
			result++;
		}
		
		return --result;
	}
}	

int next_numb(int numb, int base2, int maxpow)
{
	int a;
	int result = 0;
	
	while (result <= numb)
		result += maxpow;
	return (result/maxpow - 1);
}

int pad_num(int maxpow, int base2)
{
	if (maxpow == 1)
		return 1;
	else
	{
		printf("%d", 0);
		return pad_num(maxpow/base2, base2);
	}
}

int recurse(int numb, int base2, int maxpow)
{
	int nn;
	if (numb == 0)
		return 1;
	else
	{
		nn = next_numb(numb, base2, maxpow);
		printf("%c", base_tab[nn]);
		numb -= nn * maxpow;
		if (numb == 0 && maxpow != 1)
			pad_num(maxpow, base2);
		return recurse(numb, base2, maxpow/base2);
	}
}

int b10(char *unumb, int base1)
{
	int L, a, result = 0;
	char *p;
	L = strlen(unumb) - 1;
	p = unumb;
	
	while (p[0] != '\0')
	{
		a = (int)p[0];
		assert((a > 46 && a < 59) || (a > 64 && a < 91) || (a > 94 && a < 123) || a == 43);
		if (a < 58)
			a -= 0x30;
		else if (a < 91)
			a -= 0x37;
		else if (a < 123)
			a -= 0x57;
		else if (a == 43)
			a = 62;
		else if (a == 47)
			a = 63;
		
		if (a >= base1)
		{
			printf("%s\n", "Chiffres interdits dans le nombre de depart, aucun chiffre ne peut etre superieur ou egal a la valeurs de la base...");
			assert(a < base1);
		}
		
		result += a * power(base1, L--);
		p++;
	}
	return result;
}

int main(void)
{
	int numb, base1, base2;
	char unumb[100];
	
	printf("%s:  ", "Entrez un nombre");
	scanf("%s", &unumb);
	printf("%s:  ", "Entrez la base de depart");
	scanf("%d", &base1);
	printf("%s:  ", "Entrez la base d'arrivee");
	scanf("%d", &base2);
	
	if (unumb == 0)
	{
		printf("%d\n", 0);
		return 0;
	}
	assert(base1 > 1 && base1 < 65 && base2 > 1 && base2 < 65);
	
	numb = b10(unumb, base1);
	if (base1 == 10)
		printf("\n\tBase 10: %s\n\tBase %d: ", unumb, base2);
	else if (base2 == 10)
		printf("\n\tBase %d: %s\n\tBase 10: ", base1, unumb);
	else
		printf("\n\tBase %d: %s\n\tBase 10: %d\n\tBase %d: ", base1, unumb, numb, base2);
	
	recurse(numb, base2, max_pow(numb, base2));
	putchar('\n');
	putchar('\n');
	system("pause");
	return 0;
}

Conclusion :


Ecrit en une soirée (3h environ), sur une idée originale d'un ami essayant de faire le même petit programme mais en cherchant a convertir le nombre de manière aléatoire, donc plus couteuse en temps, ce programme fonctionne bien et verifier même que le nombre entré appartient bien a la base de départ, donc qu'aucun de ses chiffres est égal ou supérieur a la base de départ marquée par l'utilisateur (ex 123 en base 2 :S).
Rien a ajouter, je n'ai plus de questions... :-)

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.