martes, 15 de abril de 2008

¿Cómo diferenciar entre letras y números?

Sí, tanto letras y números son caracteres. Cada caracter, tiene asociado un código. Esto esta contenido en la tabla ASCII.
Entonces, si conozco el código correcto, podré diferenciar entre una letra o un dígito. Si nos fijamos en la tabla, los dígitos están entre el rango 48, 57 (del 0 al 9), las letras minúsculas en el rango 97, 122 y las mayúsculas 65, 90.
Un algoritmo para diferenciar entre letras y dígitos podría ser el siguiente:

  1. leer caracter de entrada
  2. compararlo con el rango de dígitos
    1. Si es verdadero, imprimir un mensaje de "es un número"
    2. Si no, preguntar por el rango de letras mayúsculas
      1. Si es verdadero, imprimir un mensaje de "es una letra mayúscula"
      2. Si no, preguntar por el rango de letras minúsculas
        1. Si es verdadero, imprimir un mensaje de "es una letra minúscula
        2. Si no, imprimir "es otro caracter".
La idea de preguntar por los tres rangos, es que entre las letras minúsculas y las mayúsculas, existen otros caracteres, así que es mejor asegurarse.

Un programa que realice esta acción podría ser el siguiente:

#include
/*
Este programa diferencia entre letras y números ingresados por teclado,
diferenciando el contenido de la variable, basándose en que, cada caracter
posee un código definido (ASCII).
*/

main()
{
char variable='0';
printf("ingresa una letra o número\n");
scanf("%c",&variable);
printf("el codigo asociado es %d\n",variable);

if(variable<=57 && variable>=48) //variable esta en el rango de digitos
printf("ingresaste un digito \n");
else if(variable<=90 && variable >=65) //variable esta en el rando de letra mayúscula
printf("INGRESASTE UNA LETRA MAYUSCULA\n");
else if(variable<=122 && variable >=97)
printf("ingresaste una letra minuscula\n");
else
printf("ingresaste otra cosa, que no es ni letra ni numero\n");
}

Existen funciones en C\C++ que emulan este procedimientos, isdigit por ejemplo. Aquí dejo un link al respecto

lunes, 14 de abril de 2008

Sobre Manejo de Strings 1

Cuando comparamos entidades, debemos tener presente su naturaleza. En el caso de comparar perros con gatos, nos podríamos encontrar con sorpresas, como las diferencias de tamaño, la lengua del gato y el gusto por el agua. Particularmente, si comparamos números no tenemos grandes problemas en usar relaciones lógicas (<, >, =, etc..).
Por ejemplo, si queremos encontrar un año ingresado por teclado, entre otros almacenados previamente, en un arreglo de enteros, podemos pensar en el siguiente algoritmo:

  1. Leer año a buscar
  2. Mientras no llegue al final
  • comparar el año en el arreglo con el año a buscar
  • si es el buscado, imprimir un mensaje y colocar la bandera de encontrado en 1
  • si no, seguir
3. preguntar por el valor de la bandera, si esta en 0, imprimir un mensaje "el año ingresado no se encuentra, o si esta en 1, algun mensaje de despedida.

El código sería algo como esto:

#include
/*
este programa muestra una búsqueda secuencial de un entero ingresado por teclado
entre un conjunto de enteros almacenados en un arreglo. Cada vez que se encuentra
el número en el arreglo, se imprime junto a su posición.
*/

#define MAX 7

main()
{
int datos[]={1994,1993,1999,2007,2003,2005,2001};
int yearBuscar=0;
int encontrado=0;

int i;
printf("Ingrese el anio a buscar: ");
scanf("%d",&yearBuscar);

for(i=0;i
if(yearBuscar==datos[i])
{
printf("\n %d en la posición %d",datos[i],i+1);
encontrado=1;
}

if(!encontrado)
printf("\nel valor no ha sido encontrado \n");
else
printf("\ngracias por utilizar este programa\n");

}

Uno de los puntos cruciales de este programa es la comparación en el if... lo cual es posible gracias a que tenemos dos entidades del mismo tipo, dos enteros. Veamos un caso parecido, pero ahora, con strings.

Tenemos en un arreglo de strings una lista de nombres, debemos encontrar un nombre ingresado por teclado. Nuestro algoritmo quedaría así:

  1. Leer nombre a buscar
  2. Mientras no se termine el arreglo
  • comparar el nombre en el arreglo con el nombre a buscar
  • si es el mismo, imprimir un mensaje y colocar la bandera de encontrado en 1
  • si no, seguir
3. preguntar por el valor de la bandera, si esta en 0, imprimir un mensaje "el nombre ingresado no se encuentra, o si esta en 1, algun mensaje de despedida.

Ahora bien, para poder utilizar la misma lógica de comparar entidades, podemos ahorrarnos varias líneas de código utilizando la librería string.h
Como necesitamos comparar dos strings, usaremos una de las funciones que esta librería nos provee strcmp ; esto es como decir "string compare", compara strings.

Veamos nuestro código:

#include
#include
/*
este programa muestra una búsqueda secuencial de un string ingresado por teclado
entre un conjunto de strings almacenados en un arreglo. Cada vez que se encuentra
el string en el arreglo, se imprime junto a su posición.
*/

#define MAX 7
#define MAXLETRAS 12

main()
{
char *datos[]={"pedro","maria","valentina","juan","rocío","manuel", "cote"};
char nameBuscar[MAXLETRAS];
int encontrado=0;

int i;
printf("Ingrese el nombre a buscar: ");
scanf("%s",nameBuscar);

for(i=0;i
if(strcmp(nameBuscar,datos[i]) == 0)
{
printf("\n %s en la posición %d",datos[i],i+1);
encontrado=1;
}

if(!encontrado)
printf("\nel valor no ha sido encontrado \n");
else
printf("\ngracias por utilizar este programa\n");
}

A modo de resumen, la función strcmp sirve para comparar string, retorna un entero, dependiendo el "orden" en que los string a comparar esten puestos en los argumentos. Es por esto que, si el entero retornado por la función es cero, podemos afirmar que los string son iguales.