|
Trouver une ressource
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
Information sur la source
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
Sources en rapport avec celle ci
Commentaires et avis
|
Téléchargements
Logiciels à télécharger sur le même thème :
|