Comunidad Underground Hispana  

Retroceder   Comunidad Underground Hispana > Programacion > Carbide C/C#/C++


Tema Cerrado Crear Nuevo Tema
 
Compartir en twitter LinkBack Herramientas Desplegado
Antiguo 02-mar-2011, 02:16   #1
Recien llegado
 
Fecha de Ingreso: marzo-2011
Amigos 0
Mensajes: 12
Gracias: 2
Agradecido 0 veces en 0 mensajes.
Predeterminado [Solucionado] Pasar de hexadecimal a decimal en C

Necesito un programa que me pase de hexadecimal a decimal dos caracteres introducidos por teclado con SCANF, para ello tengo que usar dos funciones, la primera la llamo hexa_Deci, que la uso para devolver el valor decimal de los caracteres introducidos en decimal, y la segunda vale_o_no, que la uso para restringuir los caracteres introducidos por teclado, de manera que si no fuera hexadecimal lo que uso con SCANF saltase un error(PRINTF en pantalla)


Lo que yo hago en vale_o_no, es una funcion de tipo char a la que como parametros le doy los caracteres introducidos por teclado( car1,car2), y con la que si los caracteres introducidos son correctos devuelvo el caracter 's' y si son incorrectos devuelvo 'n', supongo que habra otras formas mas sencillas de hacerlo, pero se me ha ocurrido asi,
luego cuando volvemos a la funcion main, hago que salte el error si lo devuelto con vale_o_no es 'n' y dejo que el programa siga si lo devuelto es 's',
una vez ahi entra en hexa_Deci, donde finalmente ya devuelvo el valor de los caracteres hexadecimales,
el problema es que al compilar me da dos warning:
"
hexDec5.c: In function ‘hexa_Deci’:
hexDec5.c:106: warning: ‘cont’ may be used uninitialized in this function
hexDec5.c: In function ‘main’:
hexDec5.c:11: warning: ‘cont’ is used uninitialized in this function
"


Código:
#include<stdio.h>
#define K 16
int hexa_Deci(char car1,char car2);
char vale_o_no(char car1,char car2);
int main()
{
/*El programa dara el valor decimal de dos valores hexadecimales introducidos por teclado*/
char car1;
char car2;
int cont;
int resultado=cont;
char valeOno;
    do{

printf("introduzca dos caracteres por teclado: (en caso de querer salir introduzca los caracteres `qq`)");// Damos valores a las variables tipo char.
scanf(" %c %c", &car1,&car2);

valeOno= vale_o_no(car1,car2);
if(valeOno=='n')
    puts("caracteres invalidos");

if(valeOno=='s')
{    
resultado= hexa_Deci(car1,car2);
 }
            
 if(resultado==cont)
   puts("error");

 if(resultado!=cont)
    printf("el valor es: %d \n",resultado);
    
 }while((car1!='q')||(car2!='q'));
      
return 0;
}
char vale_o_no(char car1,char car2)
{
char valor;
if(((car1>='0')&&(car1<='9'))||((car1>='A')&&(car1<='F'))||((car1>='a')&&(car1<='f')))
    {
    if(((car2>='0')&&(car2<='9'))||((car2>='A')&&(car2<='F'))||((car2>='a')&&(car2<='f')))    
    valor='s';
    }
// la variable valor la usaremos para en la funcion principal si queremos que el programa siga o no
    else
    valor='n';


return (valor);                
}

int hexa_Deci(char car1,char car2)
{
int valor1;
int valor2;
int valor;
int control1=0;//creo dos variables con las que me aseguro que los caracteres introducidos son correctos.(CONTROL1 Y CONTROL2)
int control2=0;
int cont;
                        
if((car1>='0')&&(car1<='9'))
    {
    valor1= car1 -'0';
     control1=0;
    }
    else if((car1>='A')&&(car1<='F'))
        {
        valor1=    car1-'A' +10;    
        control1=0;
        }    
            else if((car1>='a')&&(car1<='f'))
            {
            valor1=car1- 'a'+10;
            control1=0;
            }
                else
                control1=1;


                
if((car2>='0')&&(car2<='9'))
    {    
    valor2= car2 -'0';
    control2=0;
    }
    else if((car2>='A')&&(car2<='F'))
        {        
        valor2= car2 -'A' + 10;
        control2=0;
        }
            else if((car2>='a')&&(car2<='f'))
            {            
            valor1=car1- 'a'+10;
            control2=0;
            }            
                else
                control2=1;
if((control1==1)&&(control2==1))
    {
if(control1==1)
    puts("error en el primer caracter");
if(control2==1)
    puts("error en el segundo caracter");
    
    valor=cont;    
    }
if((control1==0)&&(control2==0))
    {
    valor= (K*valor1)+ valor2;
    }
    return (valor);
}
  
perdon por el tochito, y bueno gracias!
Sant está desconectado  
Antiguo 02-mar-2011, 17:04   #2
Moderador
 
Avatar de ajr784
 
Fecha de Ingreso: marzo-2007
Amigos 5
Mensajes: 1.740
Gracias: 31
Agradecido 362 veces en 314 mensajes.
Predeterminado Respuesta: Pasar de hexadecimal a decimal en C

Lo que dice el compilador es que count no está inicializada. Una variable en C, cuando se declara tiene basura (ésto quiere decir que no podés confiar en que esa variable va a tener un valor que vos pensás que vas a tener, por ejemplo un entero a 0). Tu como programador, debes específicamente inicializar la variable.
Código:
int count = 0; // o cualquier valor que te plazca.
  
__________________
Cita:
Yo soy del mundo, mundo de los locos. Está de moda y están todos como locos
-- Veneno - Tan Bionica --
ajr784 está desconectado  
Antiguo 02-mar-2011, 20:47   #3
Moderador
 
Avatar de Fashion
 
Fecha de Ingreso: junio-2007
Amigos 4
Mensajes: 2.056
Gracias: 55
Agradecido 840 veces en 327 mensajes.
Predeterminado Respuesta: Pasar de hexadecimal a decimal en C

Cita:
Iniciado por Sant Ver Mensaje
Lo que yo hago en vale_o_no, es una funcion de tipo char a la que como parametros le doy los caracteres introducidos por teclado( car1,car2), y con la que si los caracteres introducidos son correctos devuelvo el caracter 's' y si son incorrectos devuelvo 'n', supongo que habra otras formas mas sencillas de hacerlo, pero se me ha ocurrido asi,
luego cuando volvemos a la funcion main, hago que salte el error si lo devuelto con vale_o_no es 'n' y dejo que el programa siga si lo devuelto es 's',
una vez ahi entra en hexa_Deci, donde finalmente ya devuelvo el valor de los caracteres hexadecimales,
el problema es que al compilar me da dos warning:
"
hexDec5.c: In function ‘hexa_Deci’:
hexDec5.c:106: warning: ‘cont’ may be used uninitialized in this function
hexDec5.c: In function ‘main’:
hexDec5.c:11: warning: ‘cont’ is used uninitialized in this function
"


Código:
#include<stdio.h>
#define K 16
int hexa_Deci(char car1,char car2);
char vale_o_no(char car1,char car2);
int main()
{
/*El programa dara el valor decimal de dos valores hexadecimales introducidos por teclado*/
char car1;
char car2;
int cont;
int resultado=cont;
  
perdon por el tochito, y bueno gracias!
Reemplazalo por:

Código:
int cont = 0;
int resultado = 0;
  
Más abajo dentro de la función "hexa_Deci", también tienes un cont, el cual debería ser:
Código:
int cont = 0;
  
A simple vista noto que tu programa depende de los datos que el usuario ingrese, si bien es cierto los hexadecimales contienes letras (A, B, C,D, F) en mayúsculas pero si el usuario ingresa las letras en minúsculas lo más probable es que muestre un resultado erróneo, implementa un código para solucionar ese pequeño inconveniente, y si es posible haz que solo se ingrese datos que pertenecen a los hexadecimales (0, 1, 2, 3....... 9, A ,B ,C ,D ,F).
__________________

[Solo usuarios registrados pueden ver los links. REGISTRARSE]

Fashion está desconectado  
Antiguo 03-mar-2011, 03:16   #4
Recien llegado
 
Fecha de Ingreso: marzo-2011
Amigos 0
Mensajes: 12
Gracias: 2
Agradecido 0 veces en 0 mensajes.
Predeterminado

okay, ya he entendido el significado de los warning, pero el problema de igualar cont a lo que sea, es como si restringuiera un poco el campo, me refiero al poner el cero, ya excluiria el cero hexadecimal al hacer correr el problema?


Si en la proxima tirada ponia los caracteres 'q' 'q' el programa salia, pero me repetia el valor de resultado, pues ya estaba guardado en memoria en la vuelta anterior, lo he solucionado poniendole if ( en el caso de que fueran correctos los caracteres introducidos) en todo el resto del programa asi si quiero introducir qq, no me dice el valor de nuevo
Código:
#include<stdio.h>
#define K 16
int hexa_Deci(char car1,char car2);
char vale_o_no(char car1,char car2);
int main()
{
/*El programa dara el valor decimal de dos valores hexadecimales introducidos por teclado*/
char car1;
char car2;
int cont=0;
int resultado=cont;
char valeOno;
    do{

printf("introduzca dos caracteres por teclado: (en caso de querer salir introduzca los caracteres `qq`)");// Damos valores a las variables tipo char.
scanf(" %c %c", &car1,&car2);

valeOno= vale_o_no(car1,car2);
if(valeOno=='n')
    {
    if((car1=='q')&&(car2=='q'))
        puts("salimos del programa");
    else
    puts("caracteres invalidos");
    }
if(valeOno=='s')
    {    
resultado= hexa_Deci(car1,car2);
 
            
 if(resultado==cont)
   puts("error");

 if(resultado!=cont)
    printf("el valor es: %d \n",resultado);
    }
 }while((car1!='q')||(car2!='q'));
      
return 0;
}
char vale_o_no(char car1,char car2)
{
char valor;
if(((car1>='0')&&(car1<='9'))||((car1>='A')&&(car1<='F'))||((car1>='a')&&(car1<='f')))
    {
    if(((car2>='0')&&(car2<='9'))||((car2>='A')&&(car2<='F'))||((car2>='a')&&(car2<='f')))    
    valor='s';
    }
// la variable valor la usaremos para en la funcion principal si queremos que el programa siga o no
    else
    valor='n';


return (valor);                
}

int hexa_Deci(char car1,char car2)
{
int valor1;
int valor2;
int valor;
int control1=0;//creo dos variables con las que me aseguro que los caracteres introducidos son correctos.(CONTROL1 Y CONTROL2)
int control2=0;
int cont=0;
                        
if((car1>='0')&&(car1<='9'))
    {
    valor1= car1 -'0';
     control1=0;
    }
    else if((car1>='A')&&(car1<='F'))
        {
        valor1=    car1-'A' +10;    
        control1=0;
        }    
            else if((car1>='a')&&(car1<='f'))
            {
            valor1=car1- 'a'+10;
            control1=0;
            }
                else
                control1=1;


                
if((car2>='0')&&(car2<='9'))
    {    
    valor2= car2 -'0';
    control2=0;
    }
    else if((car2>='A')&&(car2<='F'))
        {        
        valor2= car2 -'A' + 10;
        control2=0;
        }
            else if((car2>='a')&&(car2<='f'))
            {            
            valor1=car1- 'a'+10;
            control2=0;
            }            
                else
                control2=1;
if((control1==1)&&(control2==1))
    {
if(control1==1)
    puts("error en el primer caracter");
if(control2==1)
    puts("error en el segundo caracter");
    
    valor=cont;    
    }
if((control1==0)&&(control2==0))
    {
    valor= (K*valor1)+ valor2;
    }
    return (valor);
}
  
Cita:
A simple vista noto que tu programa depende de los datos que el usuario ingrese, si bien es cierto los hexadecimales contienes letras (A, B, C,D, F) en mayúsculas pero si el usuario ingresa las letras en minúsculas lo más probable es que muestre un resultado erróneo, implementa un código para solucionar ese pequeño inconveniente, y si es posible haz que solo se ingrese datos que pertenecen a los hexadecimales (0, 1, 2, 3....... 9, A ,B ,C ,D ,F).
mmm... no te entiendo, bueno te entiendo, pero nose como interpretarlo en el programa, eso se hace con un else if((car1>='a')&&(car1<='f')) y otro tal que
else if((car2>='a')&&(car2<='f')), no? perdona pero no te entiendo bien

SALUDOS
Y GRACIAS POR RESPONDER
Sant está desconectado  
Antiguo 03-mar-2011, 15:24   #5
Moderador
 
Avatar de ajr784
 
Fecha de Ingreso: marzo-2007
Amigos 5
Mensajes: 1.740
Gracias: 31
Agradecido 362 veces en 314 mensajes.
Predeterminado Respuesta: Pasar de hexadecimal a decimal en C

Cita:
okay, ya he entendido el significado de los warning, pero el problema de igualar cont a lo que sea, es como si restringuiera un poco el campo, me refiero al poner el cero, ya excluiria el cero hexadecimal al hacer correr el problema?
La pregunta fue, ¿a qué se debe el warning?, la respuesta es a que cont (perdón, pensé que era count) no está inicializada y estabas haciendo uso de la misma. Supongamos algo como:
Código:
int cont;
char opcion;
printf("Inicializar cont a 0? (si n, inicializa a 10)");
scanf("%c", &opcion);
if(opcion = 'y'){
  cont = 0;
}else{
  cont = 10;
}

// blah blah con el código
if (cont == 10){
  // bla bla bla
}
  
no da warning, pues inicialicé cont a un valor (a algo que yo se cual es o a algo que el usuario que está usando el programa sabe qué es). Cosas como éstas?:
Código:
int cont;
char opcion;
printf("Inicializar cont a 0?");
scanf("%c", &opcion);
if(opcion = 'y'){
  cont = 0;
}

// blah blah con el código
if (cont == 0){
  // bla bla bla
}
  
Tu programa tiene un pequeño error, cont puede valer 0 por dos razones:
1º) porque efectivamente inicializaste la variable en el if y
2º) porque existía basura dentro de la variable que justo se interpreta como 0 (por más difícil que ésto pueda parecer).
No sabes en realidad el comportamiento del programa.

Todo ésto es en C en general y no tu problema en particular (si habré sufrido en mis prácticas con variables no inicializadas).

En cuanto a tu problema particular (qué valor debe tener cont), requiere un análisis/lectura de tu código que (por ahora) no voy a realizar (amen de que no entiendo cuál es el problema que estás planteando).
__________________
Cita:
Yo soy del mundo, mundo de los locos. Está de moda y están todos como locos
-- Veneno - Tan Bionica --
ajr784 está desconectado  
Antiguo 04-mar-2011, 03:00   #6
Recien llegado
 
Fecha de Ingreso: marzo-2011
Amigos 0
Mensajes: 12
Gracias: 2
Agradecido 0 veces en 0 mensajes.
Predeterminado Respuesta: Pasar de hexadecimal a decimal en C

mmmm.. verás, ya entendí el problema de los warning, pero al darle un valor a la variable cont, es como si restringuiera, me explico, por ejemplo: si le doy el valor cero, y yo doy por pantalla el valor cero, pues ya le estoy quitando el cero como hexadecimal, si le diera a cont el valor 10, ya le estaria "quitando" al programa el valor A en hexadecimal, ya que aunque el caracter A, es correcto, al devolver el valor al estar cont=10( es ejemplo) restringo el resultado.

A eso me referia, la verdad es que el programa funciona correctamente con todos los valores mayuscula, pero como comentaste con los minuscula da error, y esto no se como arreglarlo, ya que fui restringuiendo los valores para minuscula con por ejemplo

Código:
(car1>='a')&&(car1<='f')
  
y asi con cada una de las variables "car"

saludos y gracias por la paciencia!!

Cita:
Iniciado por ajr784 Ver Mensaje
La pregunta fue, ¿a qué se debe el warning?, la respuesta es a que cont (perdón, pensé que era count) no está inicializada y estabas haciendo uso de la misma. Supongamos algo como:
Código:
int cont;
char opcion;
printf("Inicializar cont a 0? (si n, inicializa a 10)");
scanf("%c", &opcion);
if(opcion = 'y'){
  cont = 0;
}else{
  cont = 10;
}

// blah blah con el código
if (cont == 10){
  // bla bla bla
}
  
no da warning, pues inicialicé cont a un valor (a algo que yo se cual es o a algo que el usuario que está usando el programa sabe qué es). Cosas como éstas?:
Código:
int cont;
char opcion;
printf("Inicializar cont a 0?");
scanf("%c", &opcion);
if(opcion = 'y'){
  cont = 0;
}

// blah blah con el código
if (cont == 0){
  // bla bla bla
}
  
Tu programa tiene un pequeño error, cont puede valer 0 por dos razones:
1º) porque efectivamente inicializaste la variable en el if y
2º) porque existía basura dentro de la variable que justo se interpreta como 0 (por más difícil que ésto pueda parecer).
No sabes en realidad el comportamiento del programa.

Todo ésto es en C en general y no tu problema en particular (si habré sufrido en mis prácticas con variables no inicializadas).

En cuanto a tu problema particular (qué valor debe tener cont), requiere un análisis/lectura de tu código que (por ahora) no voy a realizar (amen de que no entiendo cuál es el problema que estás planteando).
Sant está desconectado  
Antiguo 04-mar-2011, 12:41   #7
Moderador
 
Avatar de ajr784
 
Fecha de Ingreso: marzo-2007
Amigos 5
Mensajes: 1.740
Gracias: 31
Agradecido 362 veces en 314 mensajes.
Predeterminado Respuesta: Pasar de hexadecimal a decimal en C

Cita:
mmmm.. verás, ya entendí el problema de los warning, pero al darle un valor a la variable cont, es como si restringuiera, me explico
La verdad no, no te explicas. Pero a como está tu programa ahora, y a como explicas tu situación de no inicializar la variable, estás "restringiendo" (lo que quieras decir con eso) a un valor basura al momento que tu programa consulte esa variable (llámese valor basura a cualquier cosa que esté en ese lugar de memoria que puede ser interpretado como un número entero, ej: puede ser 0, puede ser 10, puede ser 22932, puede ser -23922, puede ser.... y así podemos seguir, no sabés qué valor tiene y no podés hacer conjeturas sobre ese valor... bah si podés pero no debes pues no sabrás qué es lo que tu programa hace).

Bien, visto que sabés a qué se debe el warning (y que esa era la pregunta principal), vamos a lo de las letras:
Cita:
verdad es que el programa funciona correctamente con todos los valores mayuscula, pero como comentaste con los minuscula da error, y esto no se como arreglarlo,
Existen varias formas de saber si una letra se encuetra entre un rango dado (siempre hablando de letras del abecedario, sin incluir ñ y sin incluir signos de puntuación), una puede ser:
Código:
if((car1 >= 'a' && car1 <= 'f') || (car1 >= 'A' && car1 <= 'F')){
    // el caracter está entre a y f, NO INCLUYE NÚMEROS.
}else{
   //otro caracter distinto.
}
  
Otra solución es usar toupper (o tolower), ejemplo con toupper
Código:
if(toupper(car1) >= 'A' && toupper(car1) <= 'F') {
   // caracter entre A y F
}else{
  // caracter distinto
}
  
__________________
Cita:
Yo soy del mundo, mundo de los locos. Está de moda y están todos como locos
-- Veneno - Tan Bionica --
ajr784 está desconectado  
Antiguo 04-mar-2011, 15:17   #8
Recien llegado
 
Fecha de Ingreso: marzo-2011
Amigos 0
Mensajes: 12
Gracias: 2
Agradecido 0 veces en 0 mensajes.
Predeterminado Respuesta: Pasar de hexadecimal a decimal en C

Cita:
Iniciado por ajr784 Ver Mensaje
La verdad no, no te explicas. Pero a como está tu programa ahora, y a como explicas tu situación de no inicializar la variable, estás "restringiendo" (lo que quieras decir con eso) a un valor basura al momento que tu programa consulte esa variable (llámese valor basura a cualquier cosa que esté en ese lugar de memoria que puede ser interpretado como un número entero, ej: puede ser 0, puede ser 10, puede ser 22932, puede ser -23922, puede ser.... y así podemos seguir, no sabés qué valor tiene y no podés hacer conjeturas sobre ese valor... bah si podés pero no debes pues no sabrás qué es lo que tu programa hace).

Bien, visto que sabés a qué se debe el warning (y que esa era la pregunta principal), vamos a lo de las letras:

Existen varias formas de saber si una letra se encuetra entre un rango dado (siempre hablando de letras del abecedario, sin incluir ñ y sin incluir signos de puntuación), una puede ser:
Código:
if((car1 >= 'a' && car1 <= 'f') || (car1 >= 'A' && car1 <= 'F')){
    // el caracter está entre a y f, NO INCLUYE NÚMEROS.
}else{
   //otro caracter distinto.
}
  
Otra solución es usar toupper (o tolower), ejemplo con toupper
Código:
if(toupper(car1) >= 'A' && toupper(car1) <= 'F') {
   // caracter entre A y F
}else{
  // caracter distinto
}
  
Lo de toupper es una funcion? no se nada sobre eso...
La forma anterior a la de toupper es como yo lo tenia hecho en mi codigo, con las sentecias if(else if).
Bueno voy a intentar explicarme a ver si consigo que me entiendas va?
Hago algo asi como una traza( creo que se llama asi):
Meto por pantalla el 00( por poner un ejemplo, que ya sabemos que es 0 en hexadecimal), todo ello con scanf hasta ahi bien, ahora hacemos la llamada a la funcion vale_o_no, esta funcion lo que hace es devolver el caracter "s" o "n" dependiendo que los caracteres hayan, o no hayan sido valido, como "00" es valido el programa sigue corriendo, ahora hacemos la llamada a la funcion
hexa_Deci esta funcion devolvera un valor en funcion de lo que metamos por pantalla, si fuera incorrecto devolvera cont que es 0, si no lo fuera pues una vez en main, imprimiriamos el resultado devuelto, que seria el valor en decimal de los caracteres hexadecimales introducidos, ahora pues el bucle do-while se repetira hasta que le proporcionemos a scanf los caracteres "qq", vale
....
pues ahora trato de explicarte lo que te comentaba antes, lo referido a inicializar variables, cont esta inicializada(cont=0), a lo que yo me referia es que si yo meto el caracter(valor) 0, pues cuando hexa_Deci devuelva el valor
si devuelve 0, en la funcion principal, 0 es cont, y aca esta mi duda,: de como cont es cero si el mensaje salta como incorrecto (Creo que lo suyo seria usar variables globales, pero no debo hacerlo), o si al la funcion hexa_Deci devolver el valor dado por la variable valor da lo mismo aunque este valor sea 0,

La verdad es que es como si estuviera rizando un rizo, lo se, pero me lio bastante.
Por si de esa forma tampoco entendiste a ver si asi: Resultado( la variable) recibe un valor devuelto por hexa_Deci, supongamos que al final a resultado se le ha devuelto el valor 0, pues como cont=0 mi duda es si entraria en la parte de selectiva de los if( if(resultado==cont) o if(resultado!=cont) ) a ver
si a la nose que vez me consegui explicar bien

GRACIAS SOBRE TODO POR TU PACIENCIA!!

bueno mira te copio el codigo tal y como lo tengo ahora:
Código:
#include<stdio.h>
#define K 16
int hexa_Deci(char car1,char car2);
char vale_o_no(char car1,char car2);
int main()
{
/*El programa dara el valor decimal de dos valores hexadecimales introducidos por teclado*/
char car1;
char car2;
int cont=0;
int resultado=0;
char valeOno;
    do{

printf("introduzca dos caracteres por teclado: (en caso de querer salir introduzca los caracteres `qq`)");// Damos valores a las variables tipo char.
scanf(" %c %c", &car1,&car2);

valeOno= vale_o_no(car1,car2);
if(valeOno=='n')
    puts("caracteres invalidos");

if(valeOno=='s')
{    
resultado= hexa_Deci(car1,car2);
 }
            
 if(resultado==cont)
   puts("error");

 if(resultado!=cont)
    printf("el valor es: %d \n",resultado);
    
 }while((car1!='q')||(car2!='q'));
      
return 0;
}
char vale_o_no(char car1,char car2)
{
char valor;
if(((car1>='0')&&(car1<='9'))||((car1>='A')&&(car1<='F'))||((car1>='a')&&(car1<='f')))
    {
    if(((car2>='0')&&(car2<='9'))||((car2>='A')&&(car2<='F'))||((car2>='a')&&(car2<='f')))    
    valor='s';
    }
// la variable valor la usaremos para en la funcion principal si queremos que el programa siga o no
    else
    valor='n';


return (valor);                
}

int hexa_Deci(char car1,char car2)
{
int valor1;
int valor2;
int valor;
int control1=0;//creo dos variables con las que me aseguro que los caracteres introducidos son correctos.(CONTROL1 Y CONTROL2)
int control2=0;
int cont=0;
                        
if((car1>='0')&&(car1<='9'))
    {
    valor1= car1 -'0';
     control1=0;
    }
    else if((car1>='A')&&(car1<='F'))
        {
        valor1=    car1-'A' +10;    
        control1=0;
        }    
            else if((car1>='a')&&(car1<='f'))
            {
            valor1=car1- 'a'+10;
            control1=0;
            }
                else
                control1=1;


                
if((car2>='0')&&(car2<='9'))
    {    
    valor2= car2 -'0';
    control2=0;
    }
    else if((car2>='A')&&(car2<='F'))
        {        
        valor2= car2 -'A' + 10;
        control2=0;
        }
            else if((car2>='a')&&(car2<='f'))
            {            
            valor1=car1- 'a'+10;
            control2=0;
            }            
                else
                control2=1;
if((control1==1)&&(control2==1))
    {
if(control1==1)
    puts("error en el primer caracter");
if(control2==1)
    puts("error en el segundo caracter");
    
    valor=cont;    
    }
if((control1==0)&&(control2==0))
    {
    valor= (K*valor1)+ valor2;
    }
    return (valor);
}
  
Sant está desconectado  
Antiguo 04-mar-2011, 15:47   #9
Moderador
 
Avatar de ajr784
 
Fecha de Ingreso: marzo-2007
Amigos 5
Mensajes: 1.740
Gracias: 31
Agradecido 362 veces en 314 mensajes.
Predeterminado Respuesta: Pasar de hexadecimal a decimal en C

Ahora entiendo tu problema (y no te sientas mal, es normal que se te rompa la cabeza con eso). Tu problema es que tu función Hexa_deci devuelve un unico valor pero también quieres que detecte el error, ahí es donde juega todo un tema aparte*

Tu problema es sencillo, ya chequeas antes (vale_o_no) que los caracteres sean correctos, así que en resultado sabes que si o si te va a llegar valores correctos:
Código:
if(vale_o_no(car1, car2) == 's'){
    if(car1 != q){
        resultado= hexa_Deci(car1,car2);
        printf("Resultado = %d\n", resultado);
    }
}else{
   printf("Uno de los datos ingresados está mal\n");
}
  
No variable cont.
Observa que antes de llamar a hexa_Deci, verifico que car1 no sea q, pues ahí asumo que quieres salir (qq), también asumo que vale o no me chequea que si car1 es q car2 debe ser también q sino devuelvo (según tu) una n.

--------------------------------------------------------------------------------------
* En tema aparte, los sistemas operativos (sólo se los tipo *nix, Linux y Minix por ejemplo), resuelven éste problema con la variable global errno, supongamos que tienes una llamada al sistema que devuelve únicamente números positivos y el 0 es un valor correcto también... ¿cómo detecto que la llamada a la función no falló?, checkeando luego de la llamada el valor de dicha variable global errno. Otra solución puede ser el pasaje de parámetro por referencia, así pasas una variable y al volver la función chequeas que haya terminado todo bien. Pero tu problema es mucho más sencillo, así que no te lies con ésto.
__________________
Cita:
Yo soy del mundo, mundo de los locos. Está de moda y están todos como locos
-- Veneno - Tan Bionica --
ajr784 está desconectado  
El Siguiente Usuario Agradeció a ajr784 Por Este Mensaje:
Sant (14-mar-2011)
Antiguo 04-mar-2011, 18:27   #10
Moderador
 
Avatar de Fashion
 
Fecha de Ingreso: junio-2007
Amigos 4
Mensajes: 2.056
Gracias: 55
Agradecido 840 veces en 327 mensajes.
Predeterminado Respuesta: Pasar de hexadecimal a decimal en C

Cita:
Iniciado por Sant Ver Mensaje
Cita:
A simple vista noto que tu programa depende de los datos que el usuario ingrese, si bien es cierto los hexadecimales contienes letras (A, B, C,D, F) en mayúsculas pero si el usuario ingresa las letras en minúsculas lo más probable es que muestre un resultado erróneo, implementa un código para solucionar ese pequeño inconveniente, y si es posible haz que solo se ingrese datos que pertenecen a los hexadecimales (0, 1, 2, 3....... 9, A ,B ,C ,D ,F).
mmm... no te entiendo, bueno te entiendo, pero nose como interpretarlo en el programa, eso se hace con un else if((car1>='a')&&(car1<='f')) y otro tal que
else if((car2>='a')&&(car2<='f')), no? perdona pero no te entiendo bien
El código es correcto, te lo mencione solo para que lo tengas en cuenta y evites posibles inconvenientes más adelante.

El cambió que le haría a tu función "vale_o_no" sería:

Código:
char vale_o_no(char car1,char car2)
{
	if(((car1>='0')&&(car1<='9'))||((car1>='A')&&(car1<='F'))||((car1>='a')&&(car1<='f')))
    {
		if(((car2>='0') && (car2<='9')) || ((car2>='A') && (car2<='F')) || ((car2>='a') && (car2<='f'))) 
		return 's';
    }
	return 'n';	
}
  
Cita:
Iniciado por Sant Ver Mensaje
mmmm.. verás, ya entendí el problema de los warning, pero al darle un valor a la variable cont, es como si restringuiera, me explico, por ejemplo: si le doy el valor cero, y yo doy por pantalla el valor cero, pues ya le estoy quitando el cero como hexadecimal, si le diera a cont el valor 10, ya le estaria "quitando" al programa el valor A en hexadecimal, ya que aunque el caracter A, es correcto, al devolver el valor al estar cont=10( es ejemplo) restringo el resultado.

A eso me referia, la verdad es que el programa funciona correctamente con todos los valores mayuscula, pero como comentaste con los minuscula da error, y esto no se como arreglarlo, ya que fui restringuiendo los valores para minuscula con por ejemplo
Ahora con respecto a si se pierde ó no el 0 hexadecimal cuando usas "int cont=0;", lo mejor sería que uses "int cont=-1;" despues de todo estás usando la variable "cont" solo para verificar si algo es correcto ó no, es como un bool (verdadero ó falso).

Analizando un poco tu codigo existen más errores, demoraría explicandote, así que mejor te dejo el codigo modificado y luego nos dices si funciona.

Código:
#include<stdio.h>
#define K 16
int hexa_Deci(char car1,char car2);
char vale_o_no(char car1,char car2);
int main()
{
/*El programa dara el valor decimal de dos valores hexadecimales introducidos por teclado*/
char car1;
char car2;
//	int cont=0;
int cont=-1;
//	int resultado=cont;
int resultado;
char valeOno;
    do{
resultado=cont; //Se agrega para reiniciar resultado
printf("introduzca dos caracteres por teclado: (en caso de querer salir introduzca los caracteres `qq`)");// Damos valores a las variables tipo char.
scanf(" %c %c", &car1,&car2);

valeOno= vale_o_no(car1,car2);
if(valeOno=='n')
    puts("caracteres invalidos");

if(valeOno=='s')
{    
resultado= hexa_Deci(car1,car2);
 }
            
 if(resultado==cont)
   puts("error");

 if(resultado!=cont)
    printf("el valor es: %d \n",resultado);
    
 }while((car1!='q')||(car2!='q'));
      
return 0;
}
char vale_o_no(char car1,char car2)
{
//char valor;
if(((car1>='0')&&(car1<='9'))||((car1>='A')&&(car1<='F'))||((car1>='a')&&(car1<='f')))
    {
    if(((car2>='0')&&(car2<='9'))||((car2>='A')&&(car2<='F'))||((car2>='a')&&(car2<='f')))    
    //valor='s';
    return 's';
    }
    return 'n';
// la variable valor la usaremos para en la funcion principal si queremos que el programa siga o no
    //else
    //valor='n';


//return (valor);                
}

int hexa_Deci(char car1,char car2)
{
//int valor1;
//int valor2;
//int valor;
int valor1 = 0;
int valor2 = 0;
int valor = 0;
//int control1=0;//creo dos variables con las que me aseguro que los caracteres introducidos son correctos.(CONTROL1 Y CONTROL2)
//int control2=0;
//int cont=0;
int control1=-1;//creo dos variables con las que me aseguro que los caracteres introducidos son correctos.(CONTROL1 Y CONTROL2)
int control2=-1;
int cont=-1;
                        
if((car1>='0')&&(car1<='9'))
    {
    valor1= car1 -'0';
     control1=0;
    }
    else if((car1>='A')&&(car1<='F'))
        {
        valor1=    car1-'A' +10;    
        control1=0;
        }    
            else if((car1>='a')&&(car1<='f'))
            {
            valor1=car1- 'a'+10;
            control1=0;
            }
                else
                control1=1;


                
if((car2>='0')&&(car2<='9'))
    {    
    valor2= car2 -'0';
    control2=0;
    }
    else if((car2>='A')&&(car2<='F'))
        {        
        valor2= car2 -'A' + 10;
        control2=0;
        }
            else if((car2>='a')&&(car2<='f'))
            {            
            //valor1=car1- 'a'+10; //Error al usar valor1, operación duplicada
            valor2=car2- 'a'+10;
            control2=0;
            }            
                else
                control2=1;
if((control1==1)&&(control2==1))
    {
if(control1==1)
    puts("error en el primer caracter");
if(control2==1)
    puts("error en el segundo caracter");
    
    valor=cont;    
    }
if((control1==0)&&(control2==0))
    {
    valor= (K*valor1)+ valor2;
    }
    return (valor);
}
  
PD: Cualquier duda que tengas, lo comentas.
__________________

[Solo usuarios registrados pueden ver los links. REGISTRARSE]

Fashion está desconectado  
Antiguo 06-mar-2011, 14:12   #11
Recien llegado
 
Fecha de Ingreso: marzo-2011
Amigos 0
Mensajes: 12
Gracias: 2
Agradecido 0 veces en 0 mensajes.
Predeterminado Respuesta: Pasar de hexadecimal a decimal en C

Cita:
Iniciado por Fashion Ver Mensaje
El código es correcto, te lo mencione solo para que lo tengas en cuenta y evites posibles inconvenientes más adelante.

El cambió que le haría a tu función "vale_o_no" sería:

Código:
char vale_o_no(char car1,char car2)
{
    if(((car1>='0')&&(car1<='9'))||((car1>='A')&&(car1<='F'))||((car1>='a')&&(car1<='f')))
    {
        if(((car2>='0') && (car2<='9')) || ((car2>='A') && (car2<='F')) || ((car2>='a') && (car2<='f'))) 
        return 's';
    }
    return 'n';    
}
  
Ahora con respecto a si se pierde ó no el 0 hexadecimal cuando usas "int cont=0;", lo mejor sería que uses "int cont=-1;" despues de todo estás usando la variable "cont" solo para verificar si algo es correcto ó no, es como un bool (verdadero ó falso).

Analizando un poco tu codigo existen más errores, demoraría explicandote, así que mejor te dejo el codigo modificado y luego nos dices si funciona.

Código:
#include<stdio.h>
#define K 16
int hexa_Deci(char car1,char car2);
char vale_o_no(char car1,char car2);
int main()
{
/*El programa dara el valor decimal de dos valores hexadecimales introducidos por teclado*/
char car1;
char car2;
//    int cont=0;
int cont=-1;
//    int resultado=cont;
int resultado;
char valeOno;
    do{
resultado=cont; //Se agrega para reiniciar resultado
printf("introduzca dos caracteres por teclado: (en caso de querer salir introduzca los caracteres `qq`)");// Damos valores a las variables tipo char.
scanf(" %c %c", &car1,&car2);

valeOno= vale_o_no(car1,car2);
if(valeOno=='n')
    puts("caracteres invalidos");

if(valeOno=='s')
{    
resultado= hexa_Deci(car1,car2);
 }
            
 if(resultado==cont)
   puts("error");

 if(resultado!=cont)
    printf("el valor es: %d \n",resultado);
    
 }while((car1!='q')||(car2!='q'));
      
return 0;
}
char vale_o_no(char car1,char car2)
{
//char valor;
if(((car1>='0')&&(car1<='9'))||((car1>='A')&&(car1<='F'))||((car1>='a')&&(car1<='f')))
    {
    if(((car2>='0')&&(car2<='9'))||((car2>='A')&&(car2<='F'))||((car2>='a')&&(car2<='f')))    
    //valor='s';
    return 's';
    }
    return 'n';
// la variable valor la usaremos para en la funcion principal si queremos que el programa siga o no
    //else
    //valor='n';


//return (valor);                
}

int hexa_Deci(char car1,char car2)
{
//int valor1;
//int valor2;
//int valor;
int valor1 = 0;
int valor2 = 0;
int valor = 0;
//int control1=0;//creo dos variables con las que me aseguro que los caracteres introducidos son correctos.(CONTROL1 Y CONTROL2)
//int control2=0;
//int cont=0;
int control1=-1;//creo dos variables con las que me aseguro que los caracteres introducidos son correctos.(CONTROL1 Y CONTROL2)
int control2=-1;
int cont=-1;
                        
if((car1>='0')&&(car1<='9'))
    {
    valor1= car1 -'0';
     control1=0;
    }
    else if((car1>='A')&&(car1<='F'))
        {
        valor1=    car1-'A' +10;    
        control1=0;
        }    
            else if((car1>='a')&&(car1<='f'))
            {
            valor1=car1- 'a'+10;
            control1=0;
            }
                else
                control1=1;


                
if((car2>='0')&&(car2<='9'))
    {    
    valor2= car2 -'0';
    control2=0;
    }
    else if((car2>='A')&&(car2<='F'))
        {        
        valor2= car2 -'A' + 10;
        control2=0;
        }
            else if((car2>='a')&&(car2<='f'))
            {            
            //valor1=car1- 'a'+10; //Error al usar valor1, operación duplicada
            valor2=car2- 'a'+10;
            control2=0;
            }            
                else
                control2=1;
if((control1==1)&&(control2==1))
    {
if(control1==1)
    puts("error en el primer caracter");
if(control2==1)
    puts("error en el segundo caracter");
    
    valor=cont;    
    }
if((control1==0)&&(control2==0))
    {
    valor= (K*valor1)+ valor2;
    }
    return (valor);
}
  
PD: Cualquier duda que tengas, lo comentas.
La verdad es que la forma en la que has puesto a la funcion vale_o_no me gusta bastante mas, ahora lo que he hecho es que si introducimos con scanf 'qq' pues el programa salga directamente sin decir "error", "error 1er caracter" y "error en el 2o caracter"

Tu codigo es correcto, pues funciona como tiene que funcionar, pero hay cosas que no entiendo, como el igualar a lo que sea las variables control1 y control2, esto no es necesario no? Lo pregunto porque segun creo estas variables siempre van a terminar igualadas a 0 o 1 no?

Y ahora lo otro, lo otro se trata de hacer el mismo programa pero que en vez de convertir dos caracteres convierta cuatro, esto es facil, pues solo tengo que crear mas variables (car3 car4 control3 control4) y aumentar algo el codigo, pero mi duda viene al final, pues yo se que la "formula" ->
"valor=(k*valor1)+valor2" Yo se que funciona, lo que nose es como "construir" la formula para cuatro caracteres

Muchas gracias por la paciencia
saludos
Sant está desconectado  
Antiguo 11-mar-2011, 00:08   #12
Moderador
 
Avatar de Fashion
 
Fecha de Ingreso: junio-2007
Amigos 4
Mensajes: 2.056
Gracias: 55
Agradecido 840 veces en 327 mensajes.
Predeterminado Respuesta: Pasar de hexadecimal a decimal en C

Cita:
Iniciado por Sant Ver Mensaje
Tu codigo es correcto, pues funciona como tiene que funcionar, pero hay cosas que no entiendo, como el igualar a lo que sea las variables control1 y control2, esto no es necesario no? Lo pregunto porque segun creo estas variables siempre van a terminar igualadas a 0 o 1 no?
Tanto control1 y control2 actúan como si fueran un bool (verdadero ó falso) para saber si algo se cumple ó no, pero al colocarlo de está manera:
Código:
int control1=0;
int control2=0;
int cont=0;
  
Existían un problema y es que al igualarlos a "0", entraba a la siguiente condición:
Código:
if((control1==0)&&(control2==0))
  
y así no tomaba en cuenta si se cumplía ó no las anteriores condiciones, por eso lo coloque de la siguiente manera:
Código:
int control1=-1;
int control2=-1;
int cont=-1;
  
Cita:
Iniciado por Sant Ver Mensaje
Y ahora lo otro, lo otro se trata de hacer el mismo programa pero que en vez de convertir dos caracteres convierta cuatro, esto es facil, pues solo tengo que crear mas variables (car3 car4 control3 control4) y aumentar algo el codigo, pero mi duda viene al final, pues yo se que la "formula" ->
"valor=(k*valor1)+valor2" Yo se que funciona, lo que nose es como "construir" la formula para cuatro caracteres

Muchas gracias por la paciencia
saludos
Eso lo tienes que analizar, revisa cuidadosamente tu código, cualquier error que tengas, lo comentas.
__________________

[Solo usuarios registrados pueden ver los links. REGISTRARSE]

Fashion está desconectado  
El Siguiente Usuario Agradeció a Fashion Por Este Mensaje:
Sant (14-mar-2011)
Antiguo 14-mar-2011, 15:33   #13
Recien llegado
 
Fecha de Ingreso: marzo-2011
Amigos 0
Mensajes: 12
Gracias: 2
Agradecido 0 veces en 0 mensajes.
Predeterminado

Bueno ya he solucionado todo respecto al programa es que puse un par de variables cambiadas de nombre en sitios distintos,
MUCHAS GRACIAS
Sant está desconectado  
Tema Cerrado

Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder mensajes
No puedes subir archivos adjuntos
No puedes editar tus mensajes

Los Códigos BB están Activado
Las Caritas están Activado
[IMG] está Activado
El Código HTML está Desactivado
Trackbacks están Activado
Pingbacks están Activado
Refbacks están Activado



Temas Similares
Tema Autor Foro Respuestas Último mensaje
Como pasar de windows 7 home a Windows 7 Ultimate milaras21 Software 3 19-mar-2011 16:06
Ayuda con Transformacion de un entero (long) a hexadecimal y binario D_monte Java 2 02-oct-2010 11:42



Portal Hacker
Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.0