:.Leer De Teclado.:

Bueno, hasta el momento todos los ejemplos han requerido que dentro del código estén “alambrados” los datos para realizar las operaciones pertinentes. Así que ahora, para continuar en cosas más interesantes, vamos a aprender a leer de tecladó información que nos dé el usuario.

Para controlar los flujos de Entrada y Salida (E/S, I/O -Input/Output), contamos con varias funciones, una de ellas la hemos venido trabajando un poco, printf, y hay otras para imprimir datos, que después usaré, no me gustan pero en algunas ocasiones algunas son de utilidad. En fin, les presentaré la media naraja de printf, el scanf.

¿Cómo funciona? Fácil, de manera estrechamente similar a printf. Su sintaxis es sencilla, requiere un formato que indique “dónde y cómo” estarán dispuestos los datos a recoger y necesita que le pasemos la(s) variable(s) donde almacenará esos datos. Algo así:

scanf(“%Algo Cosas %Algo2”,&var1,&var2);

Se debe de hacer caso al “&” que precede al identificador de las variables que indicamos serán los “receptores” de los datos que nos entregue el usuario, es algo muy importante porque esa notación implica que no estamos señalando “la variable” como tal sino que le estamos dicendo que guarde esos datos en la dirección de memoria asociada a esa variable, eso se le conoce como “apuntador” -puntero, pointer-, que se verá más adelante, de momento quiero dejarlo así: No se olviden del “&” cuando usen el scanf -hay una excepción, pero la trataré poco a poco-.

Al igual que el printf, el formato y los tipos de variable que estamos ocupando deben ser identificados correctamente u ocurren cosas inesperadas, si queremos leer un float y le indicamos que guarde la información en un int, pues … “se come” los decimales en el mejor de los casos, salen cosas extrañas. A veces debermos usar ‘trucos’ para evitar que quien use nuestro programa al meter datos “extraños” provoque malos funcionamientos, de momento, empezaremos con cosas sencillas que impliquen pedir datos al usuario, como este programa:

Picture 2011-12-17 21 58 43

Click en la Imagen para Ampliar

Nos entrega algo así:

Picture 2011-12-17 22 00 31

Click en la Imagen para Ampliar

Algo curioso con el programa, debido a cómo estámos pidiendo los datos y demás, si colocamos un dato “no-entero” como el primer número que nos pide, el programa hace cosas feas, si se lo colocamos como el segundo número, ya no tanto, como he dicho, debemos ser cuidadosos, esa es una forma de pedir los datos, pero… a duras penas usamos el formato, ¿no? qué tal si pedimos los 2 números en una sola línea:

Picture 2011-12-17 22 06 38

Click en la Imagen para Ampliar

Nos entrega algo así:

Picture 2011-12-17 22 06 56

Click en la Imagen para Ampliar

Bueno, comentaré por qué puede ser, en los primeros posts coloqué una tabla de valores para los tipos de variable, si la revisamos, vemos que el int ocupa mucho menos memoria que un float, por ejemplo, y si metes un dato “que no corresponde” y saturas el espacio de memoria, como les dije ahí, ocurren cosas inesperadas, si pones un float como segundo número, se desborda, toma la parte entera del dato y quién sabe por dónde se meten los bits extra que no le cupieron al int, el programa tiene comportamientos extraños y se pone a imprimir basura en lugar de lo que le mandamos.

Bueno, sigamos, así como el printf, el scanf puede utilizarse para formatos y no nada más “de una en una variable”, además, podemos considerar que no siempre necesitamos TODA la línea que leamos -especialmente de archivos- sino nada más una parte. Un ejemplo rápido: En un texto que lleva la contabilidad de un pequeño negocio tenemos:
Negocio Chanito
20/10/2011 – Ganancia $2000 – Gasto $1200

“Negocio Chanito” no nos interesa, la fecha sí… aunque vemos que lleva diagonales, nos interesa la ganancia, pero no el signo de pesos, también el gasto, pero ni los espacios ni los guiones tampoco. Eso podría leerse así

scanf(“%d/%d/%d – [A-Z a-z] $%f – [A-Z a-z] $%f);
Si mal no me equivoco, le indicamos que hay 3 enteros, separados por una diagonal, luego un espacio, un guión, un espacio, texto en mayúsculas y minúsculas, un espacio, un $, un flotante, espacio, guión, texto mayúsculas y minúsculas, $, flotante.

¿Qué hacemos? Aprovechamos un texto “legible al ojo humano”, sencillo y tomamos de él lo que necesitamos, muchas veces hay que hacerlo así, en especial en los ficheros.

Hasta el momento, hemos trabajado con Enteros, Flotantes, Caracteres -algunos, sí-, pero ¿qué pasa si queremos leer una palabra completa? Si corremos este programa tan increíblemente simple, nos encontramos con algo muy feo u.u:

Picture 2011-12-17 22 24 31

Click en la Imagen para Ampliar

Picture 2011-12-17 22 24 48

Click en la Imagen para Ampliar

Resulta que el programa nos hace caso, lee un %c, un char e imprime lo mismo, un char, entonces, toma el primer caracter de la palabra que le damos y es lo que guarda, consecuentemente, es lo que imprime. ¿Entonces estamos destinados a solo tener un char en una variable? La respuesta correcta es sí, pero hay algunas “ayudas” que nos proporciona C para que podamos trabajar con strings a pesar de que no maneje variables de ese tipo como tal. ¿Cómo? Valiéndose de Arreglos -Arrays, Formaciones, como gusten-, tema al que estamos a punto de llegar. Ilustraré en un solo programa la forma errónea y la forma correcta de leer e imprimir un string usando un “tamaño predeterminado” para nuestra cadena.

Picture 2011-12-17 22 58 23

Click en la Imagen para Ampliar

Nos entrega:

Picture 2011-12-17 22 58 40

Click en la Imagen para Ampliar

Este programa es “peligroso”, lleva dos maneras de trabajar, si los dos scanf funcionaran como el primero, únicamente leyendo ” %s”, si uno coloca 2 palabras separadas por un espacio “como esta”, “como” se guardaría en palabra1, “esta” se guardaría en palabra2, y si pones más ¿a dónde se va? para otros lados :s. Ahora, si estuviera solamente la parte que lee a palabra1, no habría problema. Una prueba vale mas que mil palabras:

Picture 2011-12-17 23 04 12

Click en la Imagen para Ampliar

palabra1 captura lo primero, lo demás, SIN AVISAR lo captura palabra2 y lo imprime. Por eso es que yo procuro NUNCA usar la notación sencilla ” %s” y suelo usar, para cada vez que leo texto, la segunda notación ” %[^\n]”, que, si la colocan para las 2 partes del código, soluciona el bug, cada petición guarda únicamente lo que le corresponde y no se pasa información a un lado donde no va. Esto es solamente por comentario, como siempre, ahorita no se le ve tanta utilidad, pero después aparecen este tipo de errores y uno debe andar por la web y en libros para averiguar cómo diablos es que ocurre y, aún mejor que la causa, cómo solucionarlo.

Repito, hay otras funciones que “simplifican” la lectura y escritura de cadenas, algunos las prefieren, a mí no me llaman mucho la atención. En otro momento las colocaré, son :
gets(); puts(); (get string, put string), y unas para los chars, getch(); putc(); (aunque putc() se usa, me parece, para Ficheros).

Es todo de momento, ya podemos modificar códigos fuente viejos, podemos pedir un nombre y luego imprimir un “Hola Mundo”, pero con el nombre. Después trataré de hacer un “apartado” de ejercicios propuestos y de ejemplos desde cosas muy básicas a otra ya no tanto que ayuden a la práctica, porque de verdad que aprender a programar requiere mucha teoría pero también muchísima práctica, que de los errores aprendemos mucho y aunque yo no sepa tanto -no manejo registros ni otras características de ‘programación a bajo nivel’, trato de irlas aprendiendo para utilizarlas en su momento-, la experiencia me lo ha dicho muchas veces. Bueno, nos leemos pronto, de ser posible mañana subo otra entrada, ahora sobre Sentencias de Control y posteriormente de Arreglos. Saludos.

Anuncios

~ por wkats en diciembre 17, 2011.

Una respuesta to “:.Leer De Teclado.:”

  1. Bueno, muy bueno

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

 
A %d blogueros les gusta esto: