Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

CONVERTISSEUR DE NOMBRE DE BASE EN BASE


Description

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

  • #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;
  • }
#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... :-)
 

Commentaires et avis

signaler à un administrateur
Commentaire de omnia le 20/08/2008 14:51:59

bonjour,

pour infos "(ex 123 en base 2 :S)."
123 n'est pas un nombre en base 2 :)

je sais je titille :p

signaler à un administrateur
Commentaire de juju12 le 20/08/2008 16:47:13

c'est exactement ce qu'il voulait dire : si tu entres 123 alors que tu es en base 2 alors comportement indéfini.

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Lecture d'une base de donnée DBase IV en VC++ [ par Pits ] Bonjour,Je cherche à lire une base de donnée DBase IV en Visual C++. Est ce que c'est possible ?Si OUI, comment ?Merci. Lecture et ecriture d'une base de données access [ par thino ] SalutJe voudrai avoir un code pour accéder à ma base de données sur access par la methode d'accès DAO. Acceder à une base de donnée [ par anspauldou ] SalutJe voudrai avoir les étapes pour accéder à une base de données ACCESS 97 par code Visual C++ avec exemple à l'appui.Merci d'avance ouverture de base Access [ par denis ] salut!voila mon probleme :j'ai cree une dll dans laquelle il y a une ouverture de base access au moyen d'une classe qui dérive de la classe CRecordset Liens entre 2 tables sous Base Oracle [ par Charly06 ] Bonjour ma question est la suivante : Comment créer un lien entre 2 tables, sachant que je suis sous Oracle. D'avance merci comment écrire dans la base registre ??? [ par wres ] salut,je voulais juste savoir comment faire pour créer une clé dans la base de registre de windows!merci d'avance !wres comment créer une chaîne dans une clé dans la base registre ? [ par wres ] salut,je voulais savoir comment créer une chaîne, une valeur binaire ou un DWORD dans une clé de la base de registre ?car j'arrive à créer une clé mai pb de base de donnee en C [ par tequ13 ] j'aimerais savoir comment faire pour charger des fichiers (*.txt) a l'ouverture d'un programme pour ensuite les comparer et repérer les doublons pour Qui à l'intention de créer un projet simple sur les base de données ? [ par Lallthis ] Le genre de projet où on ouvre un base, on écris dedans,et on recherche un élément. Acceder a une base de donnéééééééééééééééééééééééééééééées [ par Ansdou ] SalutAider moi je vous en prie. N y a t il pas un autre moyen d'acceder a une base de données ACCESS 97 sans passer par l'assistant ? Si cela est poss


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,484 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.