[ Foro de C ]

Cordial saludo Profesor Nacho

20-Apr-2011 17:47
oscar gomez
2 Respuestas

Buenos Dias profesor Nacho Cabanes.
Gracias,por su generosa ayuda que tanto nos brindas.

Profesor es que no entiendo muy bien lo del codigo ascii en este fragmento de codigo y me gustaria mucho recibir como siempre tu ayuda para ver si puedo entender de que se trata o como se trabaja en estos casos.
La cuestion es en el siguiente codigo se pretende dado un numero telefonico combinado de letras y digitos se imprima el numero formado de digitos solamente.Las relaciones letras-digitos son dadas a continuacion:

2 ABC, 3 DEF, 4 GHI, 5 JKL, 6 MNO, 7 PQR, 8 STU, 9 VWX , 0 YZ

EJEMPLO:
dado el numero telefonico 444CINE la salida del programa es:
4442463


#include <stdio.h>
#include <string.h>
#include <ctype.h>

int main()
{
 char telefono[10]
 int i;
 scanf("%s",telefono);
 
 for(i=0;i<strlen(telefono);i++)
 {
   if(!isdigit(telefono[i])
     {
       telefono[i]=(((telefono[i]-'A')/3)+2)%10;
       telefono[i]+=48;
     }
     printf("%c",telefono[i]);
   }
 return 0;
}

BIEN YO ENTIENDO HASTA CUANDO SE PREGUNTA SI EL CARACTER DE telefono[i] no es un digito, es decir ...if(!isdigit(telefono[i])

lo que no entiendo nada es que se hace con las dos lineas:
       telefono[i]=(((telefono[i]-'A')/3)+2)%10;
       telefono[i]+=48;
por que se le resta 'A'??
y por que se incrementa telefono[i]+=48;
por que el 48? en fin profesor que me gustaria muchisimo si me puedes ayudar a entenderlo, es que es un ejercicio resuelto de un libro que investigando mas para hacer ejercicios di con el.
Mil gracias por tu ayuda.


21-Apr-2011 12:01
Nacho Cabanes (+83)

Para entender ese programa, tendrás que localizar una tabla ASCII, para saber a qué número equivale cada letra.

Por ejemplo, si quieres convertir cada letra a un número que empiece en 0 (A=0, B=1, C=2, D=3, E=4, ...) lo podrías conseguir con:

cifra = telefono[i]-65;

porque el código ASCII de la A mayúscula es el 65, o bien directamente, como el lenguaje C es flexible y te permite hacer operaciones conjuntas entre letras y números, puedes hacer cosas como

cifra = telefono[i]-'A';

Si quieres agrupar de 3 en 3 (A=0, B=0, C=0, D=1, E=1, ...), puedes dividir la operación anterior entre 3:

cifra = (telefono[i]-'A') / 3;

Y si no quieres que se empiece a contar desde cero sino desde otro número (como el 2) basta con que lo sumes:

cifra = ((telefono[i]-'A') / 3) + 2;

Pero eso tiene el problema de que a las letras Y y Z les correspondería "10", que tiene dos cifras, en vez de "0", así que te puedes quedar sólo con la última cifra si miras el resto de la división entre 10:

cifra = (((telefono[i]-'A') / 3) + 2) % 10;

Con eso ya has convertido cada bloque de tres letras a un número del 2 al 0. Pero si lo que quieres es escribir el correspondiente carácter en pantalla, no debes mostrar el carácter número 2, sino el carácter "2", que es el 50 del código ASCII. Por eso deberías terminar con

letra = cifra + 48;

o bien con

letra = cifra + '0';


Para un principiante, sería más razonable resolver este ejercicio usando "switch...case", que es más legible aunque más lento, y esquivar las dificultades del código ASCII.


Por cierto, intenta que tus consultas tengan títulos más descriptivos, indicando el problema en vez de "saludo". Ayudará a que se te pueda responder antes.


21-Apr-2011 15:16
oscar gomez

Mil gracia profesor Macho super entendible tu explicacion muy completa me quedo claro mil gracias por tu ayuda y tu tiempo






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)