Home
Username:
Password:
C Programming (Español) Tutorials

Elementos Básicos de un Programa del C / Más de las Funciones "printf" y "scanf"

Subtitles of the Movie

En este modulo veremos las funciones "printf" y "scanf", pues no hemos visto todas las opciones disponibles al respecto. He preparado un archivo llamado "printf.c" ubicado en la carpeta "Chapter3" del CD. Esta es una demostracion del uso de la funcion "printf". Veremos diferentes tipos de datosÉ como "int", "double" y las cadenas. Incluso, como un subconjunto de las cadenas, hablaremos acerca del formateo de caracteres. Veremos diferentes maneras de trabajar con estos valores como 415, 3.14 y en especial la variable "len" mas adelante. Tambien veremos diferentes maneras de desplegar la cadena "Hello" utilizando la funcion "printf". Comenzamos con las cadenas. Nos desplazamos hacia abajo y aqui desplegamos esta cadenaÉ que consta de 30 digitos. La desplegamos en la pantalla como una referencia, de manera que al ver el resultado creadoÉ podamos compararlo con algun otro valor. Primero desplegamos la cadena en si seguida por 4 pequenas flechas para indicar donde finaliza. Obviamente, la primera flecha indica el final de la cadena, pero en un momento veremos la razon para ubicar las otras flechas. Veamos si funciona. Compilamos el proyecto, lo ejecutamos y obtenemos 30 digitos en la pantallaÉ junto a la palabra "Hello". Este es el final de la cadena. Mas adelante veremos estos otros elementos. Nos desplazamos hacia abajo y tenemos el codigo "%10s" a diferencia del codigo "%s" que vimos. Este numero mayor indica que queremos que la cadena se despliegue en un numero minimo de caracteres, 10 en este caso. Veamos este aspecto; ejecutamos el programaÉ y observe que obtenemos un minimo de 10 caracteres: 5 espacios y 5 letras. Es importante recordar que la cadena esta alineada a la derecha. Este codigo "-10s" indica una alineacion a la izquierda. Veamos. Obtenemos la palabra a la izquierda y 5 espacios despues de ella. Luego tenemos el codigo ".3s" en vez de "10s". Observe el punto en ".3s". Este se refiere a la maxima cantidad de numeros decimales que van a ser desplegados. Este es el minimo numero de caracteres que vamos a desplegar. Veamos. Obtenemos un maximo de 3 caracteres desplegados. Finalmente tenemos un codigo especial que es un poco avanzado. Observe que hemos reemplazado el numero 3 por un asterisco. Este indica el numero de caracteres necesarios para que este sea un parametro entero. Aqui tenemos que el valor de la variable "len" es 7, asi que desplegamos un maximo de 7 caracteres. Vamos a verificarlo. Se despliegan 5 caracteres porque solo es necesaria esa cantidad. Estas son las opciones mas importantes disponibles al desplegar cadenas. Ahora veamos como desplegar otras cadenas. En la parte inferior tenemos las opciones de formateo de enteros. De nuevo tenemos la linea de referencia y el codigo "%d" que despliega el valor 415 de la memoria. Ejecutamos el proyecto y obtenemos el numero 415. Bien. De nuevo desplegamos un campo con un ancho de 10, es decir, un minimo de 10 caracteres completados con espacios si es necesario. Verificamos y obtenemos exactamente 10 espacios aqui antes que el numero 415. Luego tenemos el codigo "010d" para desplegar un campo con un ancho de 10, es decir, un minimo de 10 caracteres. En vez de completar con espacios, completamos con ceros. Veamos. Es casi el mismo resultado, pero en vez de espacios obtenemos 7 ceros. Este tambien es similar. Asignamos 7 a la variable "len" y recuerde que esto es equivalente al codigo "%7d". Ya vimos con las cadenas que el codigo "%7d" despliega un campo con un ancho de 7; aqui obtenemos un campo de 7 caracteres, pero no tan largo como el completado con espacios. El codigo "%-10d" indica una alineacion a la izquierda en vez de a la derecha. Obtenemos 7 espacios ubicados a la izquierda. Finalmente tenemos el codigo ".1d". Con las cadenas el codigo "0.3" despliega un maximo de 3 caracteres, asi que aqui desplegamos un maximo de 1 caracter. Veamos si obtenemos algo inesperado: Obtenemos 415. ÀQue ocurre con el maximo de 1 caracter? En los resultados numericos, es importante desplegar el numero actual. Si solo queremos desplegar 1 digito, debemos indicar si este es el 4 como en 400 o el 5 como en 415. La funcion "printf" decidio que al desplegar 1 solo numero se mostrara el numero completo si este es un entero. De hecho, no podemos especificar un valor maximo mas pequeno que el numero en si. Este valor maximo 1 no tiene ningun efecto. Ahora continuamos con el despliegue de un caracter individual. Recuerde que no tenemos ningun caracter individual. No tenemos ningun valor "char" sino una cadena de 30 valores de tipo "char". Vamos a utilizar uno de esos valores "char". En las opciones de formateo de caracteres tenemos la linea de referencia. "%c" que no hemos visto. Esta despliega 1 caracter, pero Àcual de ellos? ÀPuede usted decir a cual caracter se refiere el codigo "string"? Recuerde que este se refiere al primer caracter de la cadena, pues los arreglos siempre comienzan en 0 y no en 1. El 0 indica el primer elemento del arreglo. Vamos a desplegar la primera letra de la cadena "Hello" que tenemos aqui, es decir, la letra "H". Veamos si funciona. Obtenemos correctamente el caracter "H". Este codigo es igual al anterior y despliega 1 caracter en un campo con un ancho de 10. Observe que obtenemos 9 espacios y la letra "H" alienados a la derecha. Si queremos alinear a la izquierda, utilizamos el codigo "-10c". Ahora veamos las operaciones con numeros de punto flotante. Podemos especificar las posiciones decimales y el ancho que vamos a desplegarÉ mediante el codigo "%f". Veamos el despliegue de numeros de tipo "float". En este caso desplegamos un valor "double", asi que la letra "f" se refiere a este tipo de datos. No hemos visto la utilizacion del codigo "%f", asi que veamos el resultado. Obtenemos 3.141590, es decir, 6 posiciones decimales y un punto. El codigo "%10f" despliega un campo con el ancho 10 completado con espacios al final si es necesario. Aqui los tenemos al inicio. El codigo "%10.3f" no especifica un valor minimo o maximoÉ sino el ancho de un campo seguido por un numero de posiciones decimales. Veamos lo que ocurre. Lo ejecutamos y obtenemos un campo con un ancho de 10 y 3 posiciones decimales. El programa funciona bien. Finalmente, el codigo "10.8f" especifica mas posiciones decimales de los que tenemos en el numero. Veamos lo que ocurre con el proyecto. El resultado se completa con ceros al final como esperamos. Veamos el ultimo codigo que podemos utilizar: "%%". Si queremos desplegar un signo de porcentaje en una cadena con la funcion "printf"É utilizamos el codigo "%%". Dicho codigo es util si necesitamos desplegar un signo de porcentaje mediante la funcion "printf". No hemos visto todas las posibilidades de la funcion "printf", pero estas son las opciones que utilizamos en un 98% dentro de la programacion. Existen otras para desplegar valores hexadecimales, representaciones octales, numeros con signo versus numeros sin signo y representaciones de apuntadores, pero estas no se utilizan muy a menudo, asi que no las veremos en este punto. Ahora veamos la funcion "scanf". Este es el archivo "scanf.c" que veremos para demostrar como esta funcion lee la entrada de datos por parte del teclado. No veremos con detalle la funcion "scanf" porque esta no se utiliza comunmente para el ingreso de datos. No es muy utilizada actualmente, asi que Àque utilizamos en cambio? Esa es una buena pregunta. Para estas acciones, "scanf" es la unica que realiza el trabajo por nosotros. Quiero recalcar que esto no lo hacen la mayoria de las personas. Aqui tenemos de nuevo las variables "x" y "y" y no les asignamos valores porque los leeremos desde el teclado. Tenemos otra cadena de 100 caracteres de longitud, asi que tendremos 99 caracteres, o tal vez 98 si el usuario desea incluir un caracter de nueva linea. Veamos una entrada de datos de cadenas: incluimos la instruccion "Enter one word" y luego leemos la palabra ingresada. Tal vez usted haya practicado este aspecto por su cuenta, pero el codigo "%s" solo leera una palabra. Si por ejemplo ingresamos el nombre "Mark Virtue"É o uno similar, solo se leera y almacenara la palabra "Mark" en la cadena y no la frase completa "Mark Virtue". Aunque es extrano, asi esta definida la funcion "scanf". Esta no incluye primeros espacios en blanco, como espacios, tabulaciones o incluso el caracter de nueva lineaÉ y tampoco los lee en absoluto. Solo almacena la palabra en la cadena por nosotros. Si queremos leer una linea de texto completa, como si pedimos al usuario el nombre completoÉ con espacios y demas, debemos realizar un proceso mas complejo como este: en vez del codigo "%s" escribimos "%[^\n]". Recuerde que la barra diagonal invertida y la letra "n" indican una nueva linea. Este codigo lee una nueva linea sin incluirla en si, sino solo el texto incluido en ella, asi que incluimos unas llaves alrededor y un signo de kilates que indica una negacion. Este indica una negacion en cuanto a la funcion "scanf". Aqui se leeÉ cualquier numero de caracteres hasta llegar a una nueva linea, es decir, se leen todos los caracteres que no representan una nueva linea. El signo de kilates omite las nuevas lineas. Es un poco complejo, pero es la unica manera de hacerlo con la funcion "scanf". Luego incluimos "The text you entered was" y desplegamos el texto ingresado. Veamos si funciona. Compilamos, ejecutamos e ingresamos la palabra "Mark". Este no es el resultado que esperamos. Aparece "Enter many words" y se desplego la palabra "Mark" en vez de esperar. Voy a cerrar esta ventana. Lo que ocurre es que la funcion "scanf"É ha ubicado exitosamente la palabra "Mark" dentro de la cadena, pero despues de ingresarla incluimos una nueva lineaÉ y esta no fue leida por "scanf". Al llegar a esta funcion "scanf". esta lee el texto pero no incluye el caracter de nueva linea. Al encontrar dicho caracter se detiene la lectura, asi que no se ha leido nada desde el tecladoÉ y se detiene el programa como acabamos de ver. Esto es facil de resolver: ya vimos como hacerlo con la funcion "fflush(stdin)". "stdin" se refiere a la entrada de datos estandar, comunmente desde el teclado. Descartamos los datos del teclado que no han sido leidos y ejecutamos de nuevo. Ingresamos la palabra "Mark" y ahora luce un poco mejor. Ahora ingresamos las palabras "Mark Virtue" y obtenemos "The text you entered was Mark Virtue". El programa funciona bien. Ahora veamos los enteros. Ya vimos la entrada de datos enteros. Tenemos "Please enter a number" y el codigo "%d". Recuerde que el ampersand es importanteÉ y que no lo utilizamos al trabajar con cadenas. Existe una razon que no veremos ahoraÉ porque involucra apuntadores y direcciones de memoria, lo cual seria confuso en este momento. Las cadenas son los unicos elementos que no utilizan el signo ampersand. Luego tenemos la frase "The number you entered was". Compilamos, ejecutamos e ingresamos el numero 234. El programa funciona bienÉ y tambien parece ser automatico. Ahora veamos la entrada de caracteres. Tenemos la instruccion "Please enter a single character" y el codigo "%c" como en la funcion "printf". Necesitamos un lugar para almacenarlo, y aunque parezca confuso, aun utilizamos el ampersandÉ porque no estamos leyendo una cadena. Aunque no parezca, solo estamos leyendo un caracter. Solo prescindimos del ampersand cuando leemos cadenas completas, pero al leer un solo caracter tambien debemos utilizarlo como los demas. ÀDonde vamos a almacenar ese caracter? Vamos a hacerlo en el elemento "string". Recuerde que "string" es un arreglo de caracteres mientras que "string" es un solo caracter. Vamos a insertar ese caracter dentro del primer elemento del arreglo. Podriamos haber declarado una variable de un solo caracter para almacenarlo y esta tambien funcionaria bien. Al desplegarlo, lo hacemos desde el mismo lugar, pues "string" representa a un solo caracter. Estas comillas sencillas no son necesarias y solo estan alli por decoracion. Estoy seguro de que usted entendera este codigo. La funcion "scanf" puede leer multiples caracteres a la vez, pero debe hacerlo dentro de un arreglo de caracteres. Debemos notar una gran diferencia entre un arreglo de caracteres y una cadena. Un arreglo de caracteres no es mas que eso. Una cadena es un arreglo de caracteres con un caracter de terminacion "null" al final. Podemos hacer esto con cadenas, pero no con arreglos de caracteres. Podemos utilizar las funciones "strcpy", "strlen", "printf", etc. con cadenas, pero estas no funcionan con arreglos de caracteres por no tener un caracter de terminacion "null". Si queremos ingresar multiples caracteres utilizando la funcion "scanf", debemos hacerlo dentro de una cadena. Esto puede parecer confuso si no contamos con un entendimiento del mapa de memoria de la computadora. Basta decir que vamos a leer 4 caracteres. Esta linea de codigo es exactamente igual a esta otra linea porque leemos los caracteres dentro del elemento "string". De hecho, no podemos leerlos todos dentro de dicho elemento. El primer caracter se ubica en el elemento "string", el segundo en "string", el tercero en "string" y el cuarto en "string". ÀComo ocurre esto de manera automatica? Al entender el funcionamiento de la memoriaÉ probablemente lo sabremos, pero lo veremos en el capitulo dedicado a los apuntadores. Por ahora tendremos que memorizar este aspecto del CÉ o al menos de la funcion "scanf". Para leer multiples caracteres a la vezÉ debemos hacerlo dentro de un arreglo de caracteres. Se ubicaran 4 caracteres dentro de ese arreglo sin ningun caracter de terminacion "null" al final. Solo se leeran los 4 caracteres. El quinto caracter, o caracter de terminacion "null", sera aleatorio y la funcion "scanf" lo especificara por nosotros. Este solo es valido para leer esos 4 caracteres, uno a la vez y no podemos tratarlos como una cadena. Podriamos incluir manualmente un caracter "null" en la quinta posicion, o "string", y tratar los caracteres en conjunto, pero no lo haremos asi. Simplemente leeremos 4 caracteres dentro de las primeras 4 posiciones de este arreglo, aunque aqui utilizamos la palabra "string". Se que es confuso, pero no tendremos una cadena sino solo 4 caracteres dentro de un arreglo. Luego los desplegaremos mediante los codigos "%c", "%c", "%c", "%c" y los elementos 0, 1, 2 y 3. Veamos si funciona. Compilamos, ejecutamos y obtenemos la frase "Please enter a single character". Ingresamos la letra "M" y aparece "The character that you entered was M". Luego ingresamos 1, 2, 3 y 4. Aparece la frase "The characters you entered were 1 2 3 4". Bien. Finalmente veamos como leer un numero decimal o un numero de punto flotante desde el teclado. Esto es casi igual que leer un numero entero. Solo debemos recordar que este codigo "%f", al utilizar la funcion "printf", despliega un valor de tipo "double" o "float", pero al leer un valor utilizando el codigo "%f", la variable a la cual nos referimos debe ser de tipo "float" y no "double". Al utilizar de nuevo el codigo "%f" para desplegarla, esta puede ser "float" o "double". Esta es una norma que debemos recordar. Esto es muy sencillo y casi igual que con un entero. Veamos. Aparece "Please enter a decimal number:". Ingresamos 1.2 y obtenemos "The number you entered was 1.200000". Podemos eliminar esos ceros si queremos. Ya sabemos como hacerlo. Tenemos 5 ceros; podemos cambiarlos con el codigo "%.1" para desplegar una sola posicion decimal. Ejecutamos, ingresamos 1.2 y obtenemos 1.2. Si ingresamos 1.23456 tambien obtendremos 1.2. Vamos a conservar el valor anterior. Con los numeros de punto flotante concluimos el modulo de las funciones "printf" y "scanf".

Tutorial Information

Course: C Programming (Español)
Author: Mark Virtue
SKU: 33759
ISBN: 1-933736-81-X
Release Date: 2007-04-16
Duration: 21.5 hrs / 139 lessons
Captions: Available on CD and Online University
Compatibility: Vista/XP/2000, OS X, Linux
QuickTime 7, Flash 8

VTC Sign up & Benefits

  • Unlimited Access
  • 98,729 Video Tutorials (23,265 free)
  • Video Available as Flash or QuickTime
  • Over 1026 Courses
  • $30 for One Month Access
  • Multi-User Discounts Available