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

Ciclos / Soluciones del Capítulo 5




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

Veamos las soluciones a los ejercicios del capitulo 5. Vamos a verlos uno por uno. Este es el primero de los 5 ejercicios de ciclos que propuse. Este es el mas sencilloÉ y lo he llamado "loops1.c". Declaramos la variable "number" de tipo "long"É en caso de que los numeros con los que trabajamos sean demasiado grandes. En esta computadora los tipos "int" y "long" tienen el mismo tamano, pero este no siempre es el caso. En una computadora de 16 bits, el tipo "int" va hasta 32000 mientras que el tipo "long" va a hasta 2 billones. Si vamos a manipular numeros muy grandes utilizamos el tipo "long". Vamos a continuar. Este es un ciclo "for". Si "number" es igual a 1 desplegamos todos los numeros hasta el final incluyendo el 100; incrementamos en 1 cada vez y desplegamos cada valor en una linea por separado. Aqui tenemos la nueva linea. No voy a verificar si este funciona, pues seguramente usted podra hacerlo. Veamos el archivo "loops2.c". Este no es mucho mas complejo, pues esta vez solicitamos el numero inicial y la cantidad de numeros. A estas variablesÉ las llamamos "start" y "count". Tenemos dos nuevas variables leidas desde el tecladoÉ comenzando con "start" y ejecutando el incremento "start + count". Observe que verificamos si "number" es menor que "start + count" y no menor o igual que este. Solo verificamos si es menor. Piense por que durante un momento. No voy a explicarlo, pero recuerde que solo desplegamos 10 numeros y que los incrementamos y desplegamos de la misma manera. Es muy sencillo. Continuamos con el archivo "loops3.c"É donde comenzamos a dificultar el programa. Demos un vistazo. Tenemos las mismas 3 variables y otra llamada "divisor". Este es el numero inicial que intentaremos dividir por cada numero a la vez. Una vez masÉ leemos los dos numeros mediante el mismo ciclo "for". Aqui tenemos el comentario respectivo. Hallamos los divisores al verificar todos lo numeros desde 1 hasta dicho valor. Por ejemplo desplegamos los divisores de 10. Aqui no incluimos una nueva lineaÉ porque los desplegaremos en una lista separada por espacios. Necesitamos un ciclo dentro de otro ciclo porque por cada uno de estos numerosÉ tendremos que verificarlos todos incluyendo el valor en si para ver si es un divisor. Muy bien, vamos a verificarlo. Igualamos a 1 la variable "divisor" y la incrementamos hasta llegar a "number"É incluyendo el valor mismo. El incremento es "divisor = divisor + 1". Este es el codigo mas ingenioso. Le pedi encontrar una manera de hallar si un numero se puede dividir exactamente por otro. La solucion consiste en el operador del modulo. Con este operador, si un valor es divisible exactamente, el modulo es 0. Recuerde que el modulo es el residuo que queda de una division. Si el residuo es 0, la division es exacta. Si al dividir la variable "number" por la variable "divisor" obtenemos 0, la division es exacta, asi que desplegamos la variable "divisor" seguida por un espacio en caso de que halla otro divisor. Al recorrer totalmente el ciclo se habran desplegado todos los divisores, asi que finalizamos esta linea con un salto de linea. Esto es todo. Veamos si funciona. Compilamos y ejecutamos. Aparece "Please enter a number to start at". Digamos que comenzamos en 1 hasta 12. Parece que funciona. Veamos el numero 6. Tenemos 1, 2, 3 y 6. Estan todos los divisores exactos de 6. Para 10 tenemos 1, 2, 5 y 10. El programa funciona. Continuamos con el siguiente ejercicioÉ que he llamado "loops4.c". Aqui debemos determinar si un numero es o no primo. La manera de hacerlo consiste en contar los divisores. Si obtenemos 2 divisores, es decir el numero 1 y el valor mismo, entonces este es primo. Es razonable. Vamos a hacerlo. Aqui incluimos otra variableÉ que va a ser un contador. Cada vez que encontremos un nuevo divisor, sumamos 1 a este contador para llevar la cuenta de los mismos. Al final verificamos cuantos divisores obtenemos. Veamos el codigo. Estas lineas son igualesÉ y aqui tenemos una nueva lineaÉ para determinar el numero de divisores. Hasta ahora este numero en particular es 0, pues lo inicializamos cada vez que se ejecuta el ciclo. Esta inicializacion ocurre cada vez que se recorre el ciclo. Esta linea es igual que en el ejemplo anteriorÉ y aqui tenemos una linea adicional. Si la variable "divisor" es un divisor del numero, no solo la desplegamosÉ sino que sumamos 1 a la cuenta de los divisores. Es razonable. Al final desplegamos todos los divisores de este numero en particularÉ y verificamos si solo existen dos de ellos. En tal caso desplegamos un asterisco. Los dos divisores son el numero 1 y el valor mismo. Esto lo define como un numero primo. El numero 1 no es primoÉ porque la definicion de tales numeros indica que el 1 no es un numero primo. Luego desplegamos una nueva linea despues del asterisco, el cual puede ser opcional. Veamos si funciona. Compilamos, ejecutamosÉ y comenzamos en 1 hasta el numero 12. Observe que obtenemos un asterisco en los numeros 2, 3, 5, 7 y 11. Si no me equivoco. todos estos son numeros primos. Ahora veamos el aspecto de la eficiencia. Ejecutamos de nuevo el programa y apareceÉ "Please enter a number to start at". Vamos a intentar con 1 billon. Primero ingresamosÉ 6 numeros para completar 1 millonÉ y agregamos 3 ceros para llegar a 1 billon. Vamos a desplegar 10 numeros. Veamos. Preste atencion al tiempo que toma el despliegue de cada numero. Por el momento se estan generando los divisoresÉ del primero numero, es decir 1 billon. Esto tarda bastante tiempoÉ y podriamos estar aqui mucho tiempo hasta ver los 10 numeros. Voy a interrumpir el programa pulsando las teclas "Ctrl+C". Continuaremos con el siguiente ejercicioÉ porque este se ejecuta muy despacio. Este es el archivo final que he llamado "loops5.c". Antes de ver el codigo, veamos si este se ejecuta mas rapido. Ejecutamos el proyectoÉ y comenzamos en 1 billon. Ingresamos 1, 2, 3, 4, 5, 6, 7, 8 y 9 ceros. Luego apareceÉ "Please enter the number of numbers" y de nuevo ingresamos 10. Observe que este es mas rapido que antes. Ya ha terminado. Obtenemos los 10 numeros requeridosÉ y se nos indica que el numero 1 billon 9 es primo. Excelente. Veamos cual es el truco. ÀComo hice que este fuera mas rapido? Nos desplazamos hasta esta nueva linea y aqui lo tenemos. Debemos observarla apropiadamente para comprender lo que ocurre. Primero configuramos la variable "max"É que tambien es de tipo "long". Le asignamos la variable "number" que contendra el numero 1 billonÉ y la variable "divisor" no cuenta hasta llegar a la variable "number". sino hasta la variable "max". Al inicio del ciclo "number" es igual a "max", asi que "divisor" contara hasta llegar a "number", pero en este caso el valor de "max" puede cambiarÉ y tal vez no tengamos que contar hasta el valor de "number"É sino solo hasta el valor de "max". Veamos. Si este valor divide a "number" exactamente, desplegamos el valor de "number". Al hacerlo, tambien podemos desplegar la otra mitad. Veamos un ejemplo. Si por ejemplo verificamos si 2 divide exactamente a 12 y lo comprobamos, no solo podremos desplegar ese 2 sino tambien 6 porque 2 por 6 es 12. ÀPor que no desplegar ambos numeros? Podemos desplegar uno arriba y el otro abajo, pero debemos asegurarnos de que no sean iguales. Si por ejemplo verificamos si 3 divide a 9 y lo comprobamos, desplegamos el numero 3 pero no querremos desplegarlo de nuevo porque 3 por 3 es 9. Debemos asegurarnos de que la variable "divisor" no sea igual que "number" dividido por "divisor". Piense en el ejemplo de 3 por 3 igual a 9 para comprender este aspecto. Luego sumamos 1 a la cuenta de divisores. Aqui obtenemos 2 divisores, es decir el numero en si por 2 y el 6. 2 por 6 es igual a 12, pero esta vez solo contamos los pares de divisoresÉ y no la cuenta de todos los divisores. Ahora veamos el codigo mas ingenioso. Este es el codigo que hace que el programa sea tan eficiente. Aqui cambiamos la asignacion de la variable "max". Recuerde que "max" es el valor maximo de ejecucion de este ciclo, pues no tenemos que recorrerlo hasta 12 veces. Si 2 divide exactamente a 12 generando como resultado el numero 6, teoricamente nunca tendremos que recorrerlo mas de 6 veces. ÀLo comprende? No tiene sentido verificar si 7 divide exactamente a 12 porque no es posible. Lo mismo ocurre si intentamos verificar si 11 divide exactamente a 12. De esto se trata. Cada vez que verificamos un numero, reducimos la variable "max" al dividir a "number" por dicho valor. Pienselo de esta manera: digamos que contamos todos los divisores exactos del numero 12. La primera vez apenas obtendremos el valor 1. La segunda vez obtendremos el valor 2. La variable "divisor" sera 2, y 12 dividido por 2 es 6, asi que el maximo numero de recorridos sera 6. Luego verificaremos el divisor 3. 12 divido por 3 es 4, asi que ahora solo tendremos que contar hasta 4 en el siguiente recorrido del ciclo. Esto es muy interesante. Al realizar los calculos matematicos, veremos que solo tendremos que contar hasta la raiz cuadrada del numeroÉ aproximadamente. La raiz cuadrada de 12 no es un numero par pero no importa. Con el numero 12, nunca tendremos que contar mas de 4 veces. Si tenemos 1 billon nunca tendremos que contar mas veces que su raiz cuadrada. ÀCual es? No lo se, asi que voy a pausar la leccion para averiguarlo. Estamos de regreso y la raiz cuadrada esÉ aproximadamente 31600. No tenemos que contar hasta 1 billonÉ sino solo hasta 31000. Esto significa un aumento de velocidad bastante considerable. Esto es todo al respecto. Antes veamos la sentencia "divisor" igual a 2. Aqui contamos los pares de divisores, y si solo obtenemos uno, esto indica que el numero es primo, asi que desplegamos un asterisco. Esto es todo. Veamos brevemente el proyecto para terminar con este capitulo. Aqui tenemos de nuevo el archivo "database.c"É que he modificado ligeramente. Este se encuentra en la carpeta "Chapter5" y tenemos el mismo codigoÉ pero solo con una ligera modificacion. Aqui tenemos un ciclo "forever" y una sentencia "break"É para detenerlo solo hasta que el usuario haya ingresado "a" o "s" como vimos. No es necesario explicarlo. Continuamos con el siguiente capitulo.

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