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

Cadenas y Caracteres / Soluciones del Capítulo 7




Visitors to VTC.com will be able to view all introductory videos for each training course.
Free Trial Members will gain access to first three chapters for each training course.
Full Access Members have full access to VTC.com’s entire library of video tutorials.


Learn More

Subtitles of the Movie

ÀComo le fue? Estas son las soluciones a los 4 ejercicios. Este es el archivo "ascii1.c" que solo lee el nombre completo del usuario. Este es el mismo ejemplo del inicio del capitulo. Teniamos un ejercicio para eliminar esta nueva linea, asi que veamos como hacerlo sin utilizar la variable llamada "len". ÀEs posible? De hecho vamos a hacerlo sin utilizar variables, asi que tambien eliminamos esta otra. Incluimos la funcion "strlen" donde estaba la variable "len". Este codigo representa el indice del arreglo, pero tambien es el resultado de la funcion. Solo quiero mostrarle que es posible hacerlo de esta manera. Aqui no necesitamos la variable "len". Revisamos cada caracter del nombre ingresado, es decir, vamos a recorrer la cadena utilizando un ciclo "for" hasta llegar a un caracter "null", el cual puede ser este. si ha ingresado una nueva linea. Desplegamos la representacion decimal del caracter "name[i]". Este es un arreglo de caracteres, pero los desplegamos mediante el codigo "%d". Aqui tenemos un truco: aunque no parezca, aqui incluimos una nueva linea al final; de hecho, tenemos un par de comillas dobles consecutivas para representar una cadena vacia, asi que no existen caracteres en esa cadena a excepcion del caracter de terminacion "null". Recuerde que la funcion "puts" incluye una nueva linea al final sin importar la cadena que desplegamos, asi que al no desplegar nada, la funcion "puts" incluye una nueva linea al final de cualquier manera. Veamos si funciona. Compilamos, ejecutamos, ingresamos "Mark Virtue" y obtenemos un grupo de numeros. El numero 97 representa la letra "a" y observe que hemos eliminado la nueva lineaÉ porque asi lo especificamos. Aqui tambien tenemos otra nueva linea y el caracter de espacio que es el numero 32É o el numero 20 en formato hexadecimal. Ahora tenemos el archivo "ascii2.c" que despliega el conjunto de caracteres ASCII. Tal vez haya tenido algunos problemas averiguando cuales son los caracteres especiales. Veamos. Vamos a desplegar el conjunto de caracteres ASCII de 0 a 256. Observe que esta variable es de tipo "int". Podria ser "char", pero veamos la razon por la cual no funcionaria. Es un poco dificil explicarlo: el tipo de datos "char" solo puede tener 256 numeros diferentesÉ de 0 a 255, los cuales tecnicamente van desde -128 hasta 127, pero en este caso digamos que son desde 0 hasta 255. Comenzamos con 0 y ejecutamos este ciclo "for" sumando 1 hasta llegar a 255. Seguiremos sumando 1 hasta llegar al numero mas grande posible. ÀQue ocurre al sumar 1 al numero mas grande posible? Regresamos al numero mas bajo posible, en este caso 0. En este ejemplo la operacion 255 + 1 es 0. Aqui verificamos de nuevo si tenemos el valor 0, y si la condicion es verdadera, seguiremos ejecutando el ciclo. De hecho, nunca podremos salir de el porque la variable "i" nunca sera mayor o igual que 256. Esto se debe a que "i" es de tipo "char" y no puede ser mayor o igual que 256. Espero que lo comprenda. Vamos a continuar. Ahora vamos a asegurarnos de no desplegar los caracteres especiales y los reemplazaremos por un espacio para poder reconocerlos. Estos son todos los caracteres especiales mencionados en los manuales de referencia del C. Existe otro denominado caracter "bell"; no se si usted lo ha notado, pero al desplegar los datos la computadora emite un sonido similar a una campanillaÉ para indicar que el caracter "bell" ha sido desplegado. Este es representado por el numero 7 en la memoria. Al desplegarlo, la computadora emite un sonido. Usted puede averiguar su funcionamiento si desea. No conozco estos dos caracteres pero seguramente desordenaran el resultado, asi que tambien los desplegaremos. En su lugar ubicaremos 2 espacios para asi incluir el espacio entre caracteres. Si no se trata de ninguno de estos caracteres, simplemente desplegamos el caracter en si representado por la variable entera "i". Esta es la parte mas importante y el objetivo del ejercicio. Utilizamos "switch" y no varias sentencias "if" con "i = n", "i = r", "i = t", "i = f", "i = b", "i = z", "i = 26" o "i = 27". Esta seria una sentencia "if" demasiado extensa y complicada de escribir. Es mas preciso escribirlo asi. Veremos que en el C, al utilizar una sentencia "switch"É este codigo es mucho mas eficiente y se ejecuta mucho mas rapido. Intente averiguar la razon cuando pueda. Desplegamos los caracteres y cada 16 de ellos incluimos una nueva linea. ÀComo sabemos que llegamos al numero 16? Tomamos el contador del ciclo y lo dividimos por 16. Si obtenemos el residuo 0É este debe ser divisible por 16, y ya que obviamente contamos de 0 a 15 porque siempre comenzamos en 0, debemos sumar 1 a ese valor. En tal caso incluimos una nueva linea como vimos en el ejercicio anteriorÉ y esto es todo. Veamos si funciona. Compilamos, ejecutamos y obtenemos el conjunto de caracteres ASCII. Faltan lo caracteres 7, 8, 9, 10, 11 y del 26 al 27. Ya que algunos no estan ubicados perfectamente, dejare que usted corrija las posiciones a manera de ejercicio avanzado. Sin embargo, no luce mal. Observe que estos caracteres no desplegables de hecho se pueden mostrar de alguna forma. Si intentamos desplegar solo los caracteres desplegables no obtendriamos este grupo de caracteres porque no son desplegables. Vamos a continuar. Este es el archivo "convert.c" que convierte el nombre del usuario a mayusculas, a letra capital, etc. Esto es muy sencillo: se ingresa el nombre, eliminamos la nueva linea como hicimos ingeniosamenteÉ y ahora convertimos a mayusculas. Es muy sencillo. Recorremos la cadena mediante el ciclo "for" hasta llegar al caracter "null", tomamos el caracter en cuestion, ejecutamos la funcion "toupper" y lo reemplazamos. Tal vez usted desplego el caracter en este punto en vez de convertirlo al escribir "toupper name[i]". Eso esta bien, aunque esta manera de hacerlo en un poco mas flexible porque la cadena es variable, asi que es mejor convertirla en vez de solo desplegarla como si hubiera sido convertida. A continuacion desplegamos los resultados con una nueva linea al final. Ahora veamos la letra capital. Esta es un poco mas dificil porque debemos recordar la posicion actual dentro de la cadena. Si encontramos un espacio en blanco en el texto, el siguiente caracter debe ser convertido a mayusculas, pero si el caracter anterior no es un espacio en blanco, este debe aparecer en minusculas, convirtiendolo si es necesario. Necesitamos una variable booleana que genere un valor verdadero o falso dependiendo si el caracter anterior es un espacio. Tambien podriamos hacerlo siguiendo el rastro del caracter anterior y almacenandolo dentro de una variable llamada "lastchar", pero esta utilizacion de un indicador funciona correctamente. Este valor debe ser verdadero y debemos pretender que no existe un caracter anterior, pues no hemos comenzado a leer la cadena. Debemos pretender que el caracter anterior es un espacio de manera que el primer caracter sea convertido a letra capital, asi que tenemos un truco en la inicializacion. Recorremos la cadena como hicimos con esta otra cadena, y si encontramos un espacio en blanco, primero ejecutamos este codigo. Si encontramos un espacio en blanco de cualquier tipo, activamos el indicador y simplemente continuamos. No es necesario realizar ninguna conversion y continuamos con el siguiente caracter de la cadena. Si llegamos a este punto no es necesario ejecutar una clausula "else" porque ejecutamos esta sentencia "continue"É para continuar con este codigo. Si no me cree, intente averiguar lo que ocurre en este caso. No necesitamos una clausula "else" al llegar a este punto pues probablemente el siguiente caracter no es un espacio en blanco. Ahora verificamos el caracter anterior, y si este es un espacio, lo convertimos a mayusculas. De lo contrario, lo convertimos a minusculas. No debemos olvidar que este codigo verifica si el caracter no es un espacio. De nuevo desplegamos el resultado y esto es todo. Compilamos, ejecutamos e ingresamos "Mark Virtue". Esta vez ingresamos el nombre con las mayusculas y las minusculas mezcladas: "mARk viRTuE". Observe que el resultado es correcto. Excelente. Ahora sigamos con el proyecto del curso que es bastante sencillo. Este programa es muy sencillo. De hecho, es mas sencillo que los ejercicios anteriores. Veamos las modificaciones. Tenemos algunas funciones "puts" y "fputs" aqui. Para eliminar la nueva linea al final de la preguntaÉ utilizamos "scanf"; podriamos utilizar "gets" pero tendriamos que leerla dentro de una cadena y solo examinar el primer caracter. Aqui simplemente verificamos si la variable "type" convertida a mayusculas es la letra capital "Y" y luego salimos del ciclo. Si no es el caso incluimos ingeniosamente una nueva linea. Aqui tenemos unas funciones "fputs" y "fgets"É y observe que esta es la cadena que estamos leyendo. Recuerde que este es un arreglo bidimensional o un arreglo de cadenas. Esta es la parte sencilla de la funcion "fgets". Recuerde que en este punto el texto debe representar el tamano del arregloÉ o cuantos caracteres contiene, asi que utilizamos la funcion del C "sizeof" que aun no hemos visto. La veremos con detalle en el proximo capitulo, pero su objetivo es indicar el tamano en bytes del elemento ubicado a su derecha, en este caso el arreglo. Esta funcion nos indica el tamano del arreglo en bytes, que es exactamente lo que queremos. Asi no tenemos que averiguarlo. Nos desplazamos hacia arriba y observe que tenemos 61 caracteres. Regresamos abajo y tenemos que la variable "type" es 61. Esta es un cuestion de mantenimiento y no de ahorro de tiempo, pues si el valor 61 no es suficiente y necesitamos mas espacio como 81 o 101É o menos espacio como solo 21, al realizar esa modificacion obtendremos un error, es especial si lo cambiamos por un numero menor. Observe que en este codigoÉ tenemos el valor 61, asi que si arriba lo cambiamos a 21, el programa probablemente se bloqueara. Debemos recordar regresar aqui, lo cual podria ser frustrante, asi que es mucho mas facil hacerlo asi. Si lo cambiamos arriba, ese valor se cambia automaticamente aqui. Espero que comprenda esta ventaja. Esta es una funcion "fgets"É para eliminar la nueva linea exactamente como hicimos antes, es decir con este codigo ingenioso que vimos en un ejercicio de un modulo anterior. Observe que para esta cadena tenemos unos corchetes de apertura y de cierre aqui y aqui. Este es el mismo codigo que utilizamos para eliminar la nueva linea del ejercicio anterior. Esta es la cadena al igual que esta. Usted podra entenderloÉ y no es necesaria otra explicacion porque ya vimos la apariencia de un arreglo bidimensional y como referenciarlo. Lo mismo ocurre con el artista y el numero de pistas que solo modificamos al incluir unas funciones "fputs"É en vez de las funciones "printf" aqui y aqui. Realizamos una pequena conversion a mayusculas en la respuesta ingresadaÉ y la comparamos con las letras en mayuscula "A" o "S". Usted estara de acuerdo con que esto es correcto. Tampoco debemos olvidar que esta es una letra "A" en mayuscula y el resto es igual. Podemos utilizar aqui el resultado "s" al no ejecutar ningun codigo "%d" o "%s", asi que podemos utilizar una funcion "puts" porque esta es mas rapida. Lo mismo ocurre en estas otras lineas. Esto es muy sencillo.

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