begin process at 2012 02 12 12:44:21
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > CONVERTISSEUR DE NOMBRE DE BASE EN BASE

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... :-)


 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture CONVERTISSEUR NOMBRE ARABE EN NOMBRE ROMAIN par vivi168
Source avec Zip CONVERTISSEUR NOMBRE ARABE => NOMBRE ROMAIN (1 À 4999) par Calli95
Source avec Zip BASE DE DONNÉES FICHIER par xasm
Source avec Zip CLASS POUR INTERACTION AVEC BASE DONNÉE MYSQL par MrCapo
Source avec Zip Source avec une capture CONVERSION D'UN NOMBRE D'UNE BASE QUELCONQUE VERS UNE AUTRE par Abrahamz

Commentaires et avis

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

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...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
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

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 1,498 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales