Necesito dos funciones en ANSI C que conviertan tanto hexadecimal como octal a decimal

Necesito dos funciones en ANSI C ; una que convierta de hexadecimal a decimal y la otra de octal a decimal. Por favor es que tengo que entregar un proyecto y creo que no tengo tiempo suficiente para investigar como hacerlo.. Le explico exactamente en que consiste el programa: primero se lee del teclado un string (array de caracteres) luego si el primer carácter del array es un numero diferente de 0, quiere decir que esta leyendo en decimal y no habría que hacer ninguna modificación, si empezara con 0 quiere decir que se ingreso un numero en octal, y habría que cambiarlo a decimal, luego si se ingresara un string cuyo primer carácter fuera por entonces se estaría ingresando un hexadecimal que habría que cambiarlo a decimal. Por favor necesito esas dos funciones lo antes posible! Le estaré muy agradecido!
Respuesta
1
Aquí te mando el fuente de el programa completo...
Esta compilado con el DEV-C++ 4.9.7.3 (MINGW32 - gcc 3.2)y el Turbo C++ 3.0.
Yo mismo lo ensayé con múltiples números en los distintos sistemas numéricos y en todos me funcionó...
Puede comparar los resultados con los de la calculadora de windows...
No es sino que copie el fuente
Y lo pegue en el block de notas guardándolo con extensión .c y listo...
Cualquier duda que tengas con este comunícamela, lo mismo a la hora de compilar, cualquier fallo que tengas al compilar házmelo saber...
Lo único no estándar del lenguaje que utilice fue la función "getch()", pero la puedes cambiar por cualquier otra que te sirva como por ejemplo "system(pause);"
Declarado en "stdlib.h"...
Ojala te sirva y no sea demasiado tarde...
Bye...!
/* Copiar desde aqui */
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 10
int evaluar(char c)
{
int hex;
switch (c) {
case 'a':
case 'A': hex = 10;
break;
case 'b':
case 'B': hex = 11;
break;
case 'c':
case 'C': hex = 12;
break;
case 'd':
case 'D': hex = 13;
break;
case 'e':
case 'E': hex = 14;
break;
case 'f':
case 'F': hex = 15;
break;
default : hex = c - 48;
} // switch
return (hex);
} // evaluar
long hex(char s[])
{
long hex;
int i = 2, lon = strlen(s);
hex = evaluar(s[1]);
while (i < (lon)) {
hex = (hex * 16) + evaluar(s);
i++;
} // while
return (hex);
} // hex
long octal(char s[])
{
long oct;
int i = 2, lon = strlen(s);
oct = s[1] - 48;
while (i < (lon)) {
oct = (oct * 8) + (s - 48);
i++;
} // while
return (oct);
} // octal
int main()
{
char s[MAX], ss[MAX];
long num;
system("cls");
printf("\n\nDigite el numero en formato DECIMAL - OCTAL -HEXADECIMAL\nNumero = ");
scanf ("%s", s);
if ((s[0] != '0') && (s[0] != 'x') && (s[0] != 'X')) {
num = atol(s);
printf("\nEl numero en base decimal es = %d\nFIN.", num);
}
else if (s[0] == '0') {
num = octal(s);
printf("\nEl numero en base octal ""%s"" es en base decimal %ld\nFIN.", s, num);
}
else {
num = hex(s);
printf("\nEl numero en base hexadecimal ""%s"" es en base decimal %ld\nFIN.", s, num);
} // else
getch();
return 0;
} // main
/* fin del codigo fuente */

2 respuestas más de otros expertos

Respuesta
1
int asc2int(char *s, int base)
{
int acum = 0;
while(isdigit(*s)) {
acum *= base;
acum += *s - '0';
}
} /* asc2int */
Vale para cualquier base entre 2 y 10. Sobre la segunda función, lamento decirte que no te haré toda la práctica. Trabaja tú también un poquito.
Respuesta
1
Octal y hexadecimal son representaciones de enteros. Por tanto se comportan como tales para todas las operaciones. Es decir si tu declaras una variable int a = 0xFF.
puedes actuar como si fuera decimal.
Puedes escribir su valor decimal en pantalla con printf("%d",a);
Y en una cadena nueva con sprintf(decimal,"%d", a).
Ahora también puedes hacerlo matemáticamente tu mismo. Leyendo cada carácter. Por ejemplo:
char *a = "0x358".
soldecimal = atoi(a[2])*16*16+atoi(a[3])*16+atoi(a[4])).
Y en octal lo mismo solo que cambiando el 16 por un 8.
La fórmula es:
abase10 = An*B^n + An-1*B^(n-1) + ....+ A1*B + A0.
Donde n, n-1,... 1,0 son subindices y B es la base original 16 (hexadecimal) 8 (octal).

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas