elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda en en ejercicio de programacion
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda en en ejercicio de programacion  (Leído 2,610 veces)
eaguel

Desconectado Desconectado

Mensajes: 33


Ver Perfil
Duda en en ejercicio de programacion
« en: 12 Noviembre 2012, 20:31 pm »

Hola buenas tardes, a ver si me podéis echar una mano con este programa
Código
  1. #include <stdio.h>
  2. #define CTE 16
  3. #define ERROR
  4. #define NOERROR
  5.  
  6. int main ()
  7.  
  8. {
  9.  
  10. char car1 = '0';
  11. char car2 = '0';
  12. int valor1 = 0;
  13. int valor2 = 0;
  14. int valor = 0;
  15. int cuno;
  16. int cdos;
  17.  
  18. printf ("Introduzca un valor en Hexadecimal:");
  19. scanf ("%c%c", &car1, &car2);
  20.  
  21. if ( ( ('0' <= car1) && (car1 <= '9') ) || ( ('A' <= car1) && (car1 <= 'F') ) || ( ('a' <= car1) && (car1 <= 'f') ) || ( ('0' <= car2) &&  (car2 <= '9') ) || ( ('A' <= car2) && (car2 <= 'F') ) || ( ('a' <= car2) && (car2 <= 'f') ) )
  22. {
  23. if ( ('0' <= car1) && (car1 <= '9') )
  24. valor1 = car1 - '0';
  25.  
  26. else if  ( ('A' <= car1) && (car1 <= 'F') )
  27. valor1 = car1 - 'A' + 10;
  28. else
  29. valor1 = car1 - 'a' + 10;
  30.  
  31. if ( ('0' <= car2) &&  (car2 <= '9') )
  32. valor2 = car2 - '0';
  33.  
  34. else if  ( ('A' <= car2) && (car2 <= 'F') )
  35. valor2 = car2 - 'A' + 10;
  36. else
  37. valor2 = car2 - 'a' + 10;
  38.  
  39.  
  40. valor = CTE * valor1 + valor2;
  41.  
  42. printf("El valor decimal de 0x%c%c es %d\n", car1, car2, valor);
  43. }
  44. else if ( ( ('0' > car1) && (car1 > '9') ) || ( ('A' > car1) && (car1 > 'F') ) || ( ('a' > car1) && (car1 > 'f') ) )
  45. {
  46. printf ("Error en el primer valor introducido\n");
  47. }
  48. else if ( ( ('0' > car2) &&  (car2 > '9') ) || ( ('A' > car2) && (car2 > 'F') ) || ( ('a' > car2) && (car2 > 'f') ) )
  49. {
  50. printf ("Error en el segundo valor introducido\n");
  51. }
  52.  
  53. return 0;
  54.  
  55. }
  56.  

se supone que tiene que decir error en el primer valor introducido si esta mal el primero o error en el segundo si es el segundo, la idea del programa es convertir un número hexadecimal en decimal.
el problema es que cuando escrimo 1g me dice que es 32 y no me dice error en el segundo valor introducido


« Última modificación: 12 Noviembre 2012, 20:33 pm por eaguel » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Duda en en ejercicio de programacion
« Respuesta #1 en: 13 Noviembre 2012, 02:03 am »

El error es logico y se debe a la condición de la sentencia "if":
Código
  1. if ((('0' <= car1) && (car1 <= '9')) || (('A' <= car1) && (car1 <= 'F')) || ( ('a' <= car1) && (car1 <= 'f')) || (('0' <= car2) &&  (car2 <= '9') ) || ( ('A' <= car2) && (car2 <= 'F') ) || ( ('a' <= car2) && (car2 <= 'f')))

Antes de seguir un consejo: utiliza la función "isxdigit" (prototipo en <ctype.h>) para realizar la verificación. Al hacerlo la condición se reduce a:
Código
  1. if (isxdigit(car1) || isxdigit(car2)){
Espero ahora veas el error: realizas la conversión de los dos dígitos si alguno es valido.

Para solucionarlo hay que cambiar el uso del operador OR "||" por un AND "&&", con ello la condición sera verdadera solo si ambos operandos son verdaderos (en buen cristiano: solo si ambos caracteres son dígitos hexadecimales).

Un saludo


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
eaguel

Desconectado Desconectado

Mensajes: 33


Ver Perfil
Re: Duda en en ejercicio de programacion
« Respuesta #2 en: 16 Noviembre 2012, 08:20 am »

Eso ya lo arregle, gracias.
Pero ahora tengo otro problema mayor, copio el codigo
Código
  1. #include <stdio.h>
  2. #define CTE 16
  3. int main ()
  4.  
  5. {
  6.  
  7. char car1 = '0';
  8. char car2 = '0';
  9. int valor1 = 0;
  10. int valor2 = 0;
  11. int valor = 0;
  12.  
  13. do
  14. {
  15.  printf ("Introduzca un valor en Hexadecimal:");
  16.  scanf ("%c%c", &car1, &car2);
  17.  if ( ( ( ( car1 <= '9') && (car1 >= '0') ) || ( (car1 >= 'A') && ( car1 <= 'F') ) || ( (car1 >= 'a') && (car1 <= 'f') ) ) && ( ( (car2 >= '0') && (car2 <= '9') ) || ( (car2 >= 'A') || (car2 <= 'F') ) || ( (car2 >= 'a') || (car2 <= 'f') ) ) )
  18.  
  19. {
  20.   if ( ('0' <= car1) && (car1 <= '9') )
  21. valor1 = car1 - '0';
  22.  
  23.     else if  ( ('A' <= car1) && (car1 <= 'F') )
  24. valor1 = car1 - 'A' + 10;
  25.  
  26.     else
  27. valor1 = car1 - 'a' + 10;
  28.  
  29.     if ( ('0' <= car2) &&  (car2 <= '9') )
  30. valor2 = car2 - '0';
  31.  
  32.     else if  ( ('A' <= car2) && (car2 <= 'F') )
  33. valor2 = car2 - 'A' + 10;
  34.  
  35.     else
  36. valor2 = car2 - 'a' + 10;
  37.  
  38.  
  39.  
  40.    valor = CTE * valor1 + valor2;
  41.  
  42.    printf("El valor decimal de 0x%c%c es %d\n", car1, car2, valor);
  43.  
  44. }
  45.  if ( ( (car1 > '9' || car1 < '0') || car1 > 'F') || (car1 > 'f'))
  46.   {
  47.    printf ("Error en el primer valor introducido\n");
  48.   }
  49.  if ( ( (car2 > '9' || car2 < '0') &&  (car2 > 'f') ) )
  50.   {
  51.   printf ("Error en el segundo valor introducido\n");
  52.   }
  53. }
  54. while ( (car1 != 'q') && (car2 != 'q');
  55.  
  56. return 0;
  57.  
  58. }
  59.  

Ahora debería hacer un bucle para que me pidiera que introduzca un valor hasta que escriba "qq" pero cuando entra en el bucle se me distorsionan los valores, por ejemplo:
Un ejemplo de modo de funcionamiento correcto sería:
Código
  1. Introduzca el numero hexadecimal: 12
  2. El valor decimal de 0x12 es 18
  3. Introduzca el numero hexadecimal: 1B
  4. El valor decimal de 0x1B es 27
  5. Introduzca el numero hexadecimal: 1b
  6. El valor decimal de 0x1b es 27
  7. Introduzca el numero hexadecimal: 1G
  8. Error en el segundo valor introducido
  9. Introduzca el numero hexadecimal: g1
  10. Error en el primer valor introducido
  11. Introduzca el numero hexadecimal: Gg
  12. Error en el primer valor introducido
  13. Error en el segundo valor introducido
  14. Introduzca el numero hexadecimal: A1
  15. El valor decimal de 0xA1 es 161
  16. Introduzca el numero hexadecimal: A2
  17. El valor decimal de 0xA2 es 162
  18. Introduzca el numero hexadecimal: AB
  19. El valor decimal de 0xAB es 171
  20. Introduzca el numero hexadecimal: qq
  21.  


Cuando yo lo hago el primer valor si me da correcto, pero a partir de ay da un montón de errores y otro problema que tengo que no se corregir es que me considera que 'b' no es menor que  'F'

PD: gracias por la ayuda
En línea

Ferno


Desconectado Desconectado

Mensajes: 375


Ver Perfil
Re: Duda en en ejercicio de programacion
« Respuesta #3 en: 16 Noviembre 2012, 16:18 pm »

Sobre el primer problema. Es probable que se de debido a que no se limpia el buffer luego de cada scanf (y, así, se lee algún caracter de salto de línea en el medio). Prueba incluir esta línea luego de cada scanf:

Código
  1. while ((c = getchar()) != '\n');

Siendo "c" alguna variable que declares.

Sobre el problema que 'b' no es menor a 'F', en realidad es un problema con el algoritmo, debido que, justamente, el caracter 'b' (minúscula) efectivamente es MAYOR que 'F'. En la tabla ASCII las mayúsculas representan un código menor y así es como se comparan los caracteres. Por ende, deberías de ayudarte con las funciones tolower() o toupper() (cambiar de mayúscula a minúscula y viceverza) para terminar el code.

Saludos!
En línea

eaguel

Desconectado Desconectado

Mensajes: 33


Ver Perfil
Re: Duda en en ejercicio de programacion
« Respuesta #4 en: 17 Noviembre 2012, 12:46 pm »

He solucionado el problema introduciendo dos variables nuevas cuno y cdos.
Ahora me piden que e de el resultado de un número hexadecimal de 4 carácteres, pero me da un error en el resultado, por ejemplo aaaa tendría que ser 43690 y a mi me da 734
Código
  1. #include <stdio.h>
  2. #define CTE 16
  3. #define NOERROR 1
  4. #define ERROR 0
  5. int hexValidos (char car1, char car2, char car3, char car4);
  6.  
  7. int main ()
  8.  
  9. {
  10.  
  11. char car1 = '0';
  12. char car2 = '0';
  13. char car3 = '0';
  14. char car4 = '0';
  15.  
  16. hexValidos (car1, car2, car3, car4);
  17.  
  18. return 0;
  19.  
  20. }
  21.  
  22. int hexValidos (char car1, char car2, char car3, char car4)
  23.  
  24. {
  25. int valor1  = 0;
  26. int valor2  = 0;
  27. int valor3  = 0;
  28. int valor4  = 0;
  29. int valor   = 0;
  30. int cuno    = NOERROR;
  31. int cdos    = NOERROR;
  32. int ctres   = NOERROR;
  33. int ccuatro = NOERROR;
  34.  
  35. do
  36. {
  37.   printf("Introduzca cuatro caracteres hexadecimales:");
  38.   scanf("\n%c%c%c%c", &car1, &car2, &car3, &car4);
  39.  
  40.   if((('0' <= car1) && (car1 <= '9')) || (('A' <= car1) && (car1 <= 'F')) || (('a' <= car1) && (car1 <= 'f')))
  41.    {
  42.       if ( ('0' <= car1) && (car1 <= '9') )
  43.         {
  44.            valor1 = car1 - '0';
  45.         }
  46.        else if ( ('A' <= car1) && (car1 <= 'F'))
  47.         {
  48.            valor1 = car1 - 'A' + 10;
  49.         }
  50.        else if ( ('a' <= car1) && (car1 <= 'f'))
  51.         {
  52.            valor1 = car1 - 'A' + 10;
  53.         }
  54.     }
  55.  
  56.   else if ((car1 == 'q') && (car2 == 'q') && (car3 == 'q') && (car4 == 'q'))
  57.     {
  58.     }
  59.  
  60.   else
  61.    {
  62.      cuno = ERROR;
  63.      printf("Invalido\n");
  64.    }
  65.  
  66.   if((('0'<=car2) && (car2<='9')) || (('A'<=car2) && (car2<='F')) || (('a'<=car2) && (car2<='f')))
  67.    {
  68.        if ( ('0' <= car2) && (car2 <= '9') )
  69.         {
  70.            valor2 = car2 - '0';
  71.         }
  72.        else if ( ('A' <= car2) && (car2 <= 'F'))
  73.         {
  74.            valor2 = car2 - 'A' + 10;
  75.         }
  76.        else if ( ('a' <= car2) && (car2 <= 'f'))
  77.         {
  78.            valor2 = car2 - 'a' + 10;
  79.         }
  80.    }
  81.   else if ((car1 == 'q') && (car2 == 'q') && (car3 == 'q') && (car4 == 'q'))
  82.     {
  83.     }
  84.   else
  85.    {
  86.     cdos = ERROR;
  87.     printf("Invalido\n");
  88.    }
  89.  
  90.   if((('0' <= car3) && (car3 <= '9')) || (('A' <= car3) && (car3 <= 'F')) || (('a' <= car3) && (car3 <= 'f')))
  91.    {
  92.        if ( ('0' <= car3) && (car3 <= '9') )
  93.         {
  94.            valor3 = car3 - '0';
  95.         }
  96.        else if ( ('A' <= car2) && (car2 <= 'F'))
  97.         {
  98.            valor3 = car3 - 'A' + 10;
  99.         }
  100.        else if ( ('a' <= car3) && (car3 <= 'f'))
  101.         {
  102.            valor3 = car3 - 'a' + 10;
  103.         }
  104.    }
  105.   else if ((car1 == 'q') && (car2 == 'q') && (car3 == 'q') && (car4 == 'q'))
  106.     {
  107.     }
  108.   else
  109.    {
  110.     ctres = ERROR;
  111.     printf("Invalido\n");
  112.  
  113.    }
  114.   if((('0' <= car4) && (car4 <= '9')) || (('A' <= car4) && (car4 <= 'F')) || (('a' <= car4) && (car4 <= 'f')))
  115.    {
  116.        if ( ('0' <= car4) && (car4 <= '9') )
  117.         {
  118.            valor4 = car3 - '0';
  119.         }
  120.        else if ( ('A' <= car4) && (car4 <= 'F'))
  121.         {
  122.            valor4 = car4 - 'A' + 10;
  123.         }
  124.        else if ( ('a' <= car4) && (car4 <= 'f'))
  125.         {
  126.            valor4 = car4 - 'a' + 10;
  127.         }
  128.    }
  129.   else if ((car1 == 'q') && (car2 == 'q') && (car3 == 'q') && (car4 == 'q'))
  130.     {
  131.     }
  132.   else
  133.    {
  134.     ccuatro = ERROR;
  135.     printf("Invalido\n");
  136.    }
  137.  
  138.  
  139.   if ((cuno != ERROR) && (cdos != ERROR) && (ctres != ERROR) && (ccuatro != ERROR))
  140.    {
  141.       valor = CTE * valor1 + valor2 + valor3 + valor4;
  142.       printf("El valor decimal de 0x%c%c%c%c es %d\n", car1, car2, car3, car4, valor);
  143.    }
  144. }
  145. while ( (car1 != 'q') && (car2 != 'q') && (car3 != 'q') && (car4 != 'q') );
  146.  
  147. return valor;
  148. }
  149.  
« Última modificación: 17 Noviembre 2012, 13:07 pm por eaguel » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Duda en en ejercicio de programacion
« Respuesta #5 en: 20 Noviembre 2012, 23:57 pm »

No quiero sonar grosero pero, honestamente, el programa es demasiado largo para la operación a realizar. Como ya te comente lo puedes reducir bastante utilizando la función "isxdigit".

El primer error se encuentra al obtener el primer dígito:
Código
  1. } else if ( ('a' <= car1) && (car1 <= 'f') ) {
  2.   valor1 = car1 - 'A' /* <== */ + 10;
  3. }
  4.  

El segundo al calcular el valor del numero:
Código
  1. #define CTE 16
  2.  
  3. /* ... */
  4.  
  5. valor = CTE * valor1 + valor2 + valor3 + valor4;

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
eaguel

Desconectado Desconectado

Mensajes: 33


Ver Perfil
Re: Duda en en ejercicio de programacion
« Respuesta #6 en: 21 Noviembre 2012, 10:07 am »

Muchas gracias ya conseguí hacerlo, gracias por la ayuda
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
ejercicio de programacion C++
Programación C/C++
a666 2 2,786 Último mensaje 27 Mayo 2010, 19:46 pm
por @synthesize
Duda en un ejercicio de programación « 1 2 »
Programación C/C++
eaguel 15 6,234 Último mensaje 1 Noviembre 2012, 13:56 pm
por eaguel
Duda ejercicio basico de programacion
Programación Visual Basic
arts 2 1,718 Último mensaje 24 Enero 2013, 21:03 pm
por arts
Duda ejercicio basico de programacion
.NET (C#, VB.NET, ASP)
arts 5 2,873 Último mensaje 25 Enero 2013, 16:59 pm
por arts
Duda con ejercicio de programacion (c++)
Programación C/C++
anonimo115 1 1,622 Último mensaje 2 Febrero 2017, 16:27 pm
por ivancea96
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines