Descargue como PDF, TXT o lea en línea desde Scribd
Descargar como pdf o txt
Está en la página 1de 188
ALGORcTMlCA PARA PROGRAMAClcN lng.
Yamil Armando Cerquera Rojas
Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 1 de 188 MODULO : ALGORI TMI CA PARA PROGRAMACI ON POR : YAMI L ARMANDO CERQUERA ROJAS yacer [email protected] DOCENTE UNI VERSI DAD SURCOLOMBI ANA http: / / www.usco.edu.co Neiva Huila - Colombia 2002
Para cualquier comentario o sugerencia se podrn dirigir al e-mail del autor yacer [email protected] Agradecimientos especiales a LUCAS MOREA WebMaster del servidor monografas.com por la oportunidad del LI NK. Adicional puedes encontrar este texto en formato PDF en una de las siguientes direcciones electrnicas. ht t p: / / www.abcdat os.com/ t ut or i al es/ programaci on/ vari os.ht ml ht t p: / / www.abcdat os.com/ t ut or i al es/ t ut ori al / l 4834.ht ml ht t p: / / www.arnal ot .net / ar chi vos/ pdf / al gor i t mi ca.pdf ht t p: / / www.i l ust r ados.com/ publ i caci ones/ EpVAl VAFVVoxLagCbR.php ht t p: / / www.psi qui at r i a.com/ enl aces/ f i l t er / 85/ 651/ ht t p: / / www.monogr af i as.com/ comput aci on/ programaci on/ mor e2.ht ml ht t p: / / i ngeni er i a.usco.edu.co ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 2 de 188 Este mdulo esta siendo utilizado por docentes como gua para asignaturas de programacin con estudiantes de diversas Universidades de Latinoamerica: Armando Cuellar: [email protected]. Gracias por publicar este documento me esta sirviendo mucho para mi clase de programacin que estoy cursando actualmente, la verdad si me a sido de mucha ayuda. saludos desde la Universidad Autnoma de Nuevo Leon (Mxico) Carlos Alburez [email protected] Agradeciendo la atencin a la presente desde Guat emal a Guillermo y Raquel Arevalo [email protected] hola Buenos das ayer finalmente pudimos resolver el problemita, muchas gracias por su ayuda. Ahora necesito saber como se hace la potencia negativa ejemplo: 5^ -5 Estudio en el Politcnico de Occidente. Managua Marta rodas [email protected] Hola te saludo desde El Sal vador. Francisco Jose Barrios [email protected] hola gracias por tratar de ayudarme, estudio en una escuela arquidiocesana, es administrada por religiosos, pero con subvencin del gobierno, soy de Venezuela, de la ciudad de Mar acaibo, estado de Zulia. Urbanizacin El Recreo. Av. Urdaneta. Qta. La Calceta. Valencia, Carabobo. Venezuel a iutepal [email protected] necesito el algoritmo del juego dots and boxes, conocido como el juego de los puntitos, por favor si esta a tu alcance ayudarnos me puedes escribir a este correo. Espero tu respuesta. gracias. Carlos Rojas [email protected] : Estudiante de I ng. de Sistemas del Per. Lissette Baquerizo Baquerizo Molineros [email protected] Deseo saber como puedo hacer un programa en seudocodigo que recepte fechas y que indique el da de la semana calcular el nmero de das entre fechas mostrar el calendario del mes de cada fecha. Por favor necesito que me ayuden con este programa si es posible para mana es que lo necesito de urgenc ia porque es para pasar mi semestre es urgente por favor. soy de Guayaqui l , Ecuador LUZ [email protected] Cordiales saludos de parte de lvn Cofre, estudiante de la Universidad Tcnica Estatal de Quevedo(U.T.E.Q.) en Ecuador Camilo Torres [email protected] me dirijo a usted para informarle que su trabajo sobre algoritmos es muy bueno, pero necesito pedirle que me ayude a resolver unos problemas de algoritmos con su respectivo diagrama de flujo y su explicacin. Argent i na Cecilia Hernndez [email protected] Emil Guisow [email protected] Heber Matamoro Burgos [email protected] Huber Galeon [email protected] Gracias por publicar Algortmica para programacin. Jessica tolentino [email protected] Por favor quiero que me enves ejercicios de algortmica de varios tipo s porque el curso que estoy llevando es un poco pesado y quiero problemas para resolver y asi tener un mejor panorama sobre algoritmos. Gracias de antemano. Karin S. [email protected] Hola quisiera saber si me pueden ayudar, estudio bachillerato en computacin y nos dejaron que investigramos ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 3 de 188 Luis Armando Martnez [email protected] Lo felicito por su archivo en pdf para Algortmica para programacin. Agradeciendo su cooperacin de antemano saludos desde Panam, estudiante de Universidad Colombiana ubicada en Panam Miguel Vsquez [email protected] Hola Yamil espero me puedas ayudar: Quisera saber el algoritmo para invertir un nmero ingresado Ejemplo: ingreso 456 y debe aparecerme 654 tengo que hacerlo sin utilizar funciones de cadena. Gracias Secretaria Comercial [email protected] Estoy tratando de abrir su trabajo pero no me permite mirar nada de lo que hay en el. Tiene usted alguna forma de enviarme su trabajo por Internet si no es mucha molestia. Mil Gracias Stephanie Caroline Guadrn Magaa [email protected] Hola, mi nombre es Stephanie Guadrn y tengo un trabajo universitario sobre la programacin, en su trabajo "Algortmica para Programacin" que he hallado en monografas.com, est todo cuanto yo busco, no s si pueda enviarme alguna referencia bibliogrfica, o si tiene el trabajo en Word, puesto que no puedo leer el trabajo, no tengo el programa en que fue creado. Muchsimas gracias por su atencin. Se despide atentamente Vicente Martnez [email protected] Gracias por el trabajo Wendy palacios [email protected] por favor necesito problemas resueltos de algortmica de una funcin, si lo envas no lo mandes zipiado, ok, gracias De cerca de 25.000 visitas que se han realizado del presente documento en el servidor de monografias.com ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 4 de 188 A continuacin se relacion an los ejercicios que han sido desarrollados en el presente texto con el fin de que cada estudiante tenga una idea de lo que se ha desarrollado antes de iniciar con la revisin del mismo. LI STADO DE PROGRAMAS DESARROLLADOS EJERClClOS DE ESTRUCTURAS ASlGNAClcN 1. Desarrolle un algoritmo que le permita leer dos valores y escribir la suma de los dos. 2. Desarrolle un algoritmo que le permita leer un valor entero, calcular su cuadrado y escribir dicho resultado. 3. Desarrolle un algoritmo que le permita leer un valor para radio (R), calcular el rea (A) de un crculo A = Rl y escribir su valor. 4. Determinar la hipotenusa de un tringulo rectngulo conocidas las longitudes de sus dos catetos. Desarrolle los correspondientes algoritmos. 5. Desarrolle un algoritmo que le permita leer un valor que represente una temperatura expresada en grados Celcius y convierta dicho valor en un valor expresado en grados Fahrenheit. 6. Desarrolle un algoritmo que le permita calcular el rea de un tringulo en funcin de las longitudes de sus lados previamente ledos desde el teclado. 7. Desarrolle un algoritmo que le permita determinar el rea y volumen de un cilindro cuyo radio (R) y altura (H) se leen desde teclado. 8. Desarrolle un algoritmo que le permita calculas el rea (A) de un segmento de crculo. EJERClClOS DE ESTRUCTURAS DE DEClSlcN 1. Desarrolle un algoritmo que le permita leer un valor cualquiera N y escribir si dicho nmero es par o impar. 2. Desarrolle un algoritmo que le permita leer un valor cualquiera N y escribir en la pantalla si dicho nmero es Positivo o Negativo 3. Desarrolle un algoritmo que le permita leer un valor cualquiera N y escribir si dicho nmero es mltiplo de Z. 4. Desarrolle un algoritmo que le permita leer un valor cualquiera N y escribir si dicho nmero es comn divisor de otros dos valores ledos W y Z ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 5 de 188 5. Desarrolle un algoritmo que le permita leer un valor cualquiera N y escribir si dicho nmero es comn mltiplo de M y P. M y P tambin se deben leer desde el teclado. 6. Desarrolle un algoritmo que le permita leer dos valores A y B y que escriba cual de los dos valores ledos es el mayor 7. Desarrolle un algoritmo que le permita leer dos valores A y B y escriba cual de los dos valores ledos es el menor 8. Desarrolle un algoritmo que le permita leer 2 valores A y B e indicar si uno de los dos divide al otro exactamente 9. Desarrolle un algoritmo que le permita leer dos valores A y B e indicar si el resultado de dividir la suma del los dos nmeros entre la resta del primer nmero con el segundo es exacta. 10. Desarrolle un algoritmo que le permita leer dos valores A y B e indicar si la suma de los dos nmeros es par 11. Desarrolle un algoritmo que le permita leer dos valores A y B e indicar cual de las dos restas (B-A) o (A-B) es positiva 12. Desarrolle un algoritmo que le permita leer tres valores y almacenarlos en las variables A, B, C respectivamente. El algoritmo debe indicar cual es el mayor. Para este caso se asume que los tres valores ledos por el teclado son valores distintos. 13. Desarrolle un algoritmo que le permita leer tres valores A, B, C e indicar cual es el menor 14. Desarrolle un algoritmo que le permita leer tres valores A, B, C diferentes e indicar cual es valor del centro 15. Desarrolle un algoritmo que le permita leer tres valores A, B, C e indicar si uno de los tres divide a los otros dos exactamente 16. Desarrolle un algoritmo que le permita leer tres valores A, B, C e indicar si la suma de dos nmeros cualquiera es igual al tercero. 17. Si se tiene la funcin: c bx ax f(x) 2 , el valor de x se calcula as: a ac b b x 2 4 2 , la expresin dentro del radical se le llama discriminante de la ecuacin. Las dos races son real es y desiguales, reales e iguales o imaginarias, segn que el discriminant e sea positivo, cero o negativo. Desarrolle un algoritmo que lea valores para y determine si hay posible solucin para x de dicha funcin. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 6 de 188 EJERClClOS DE ESTRUCTURAS CcCLlCAS 1. Desarrolle un algoritmo que le permita escribir alternadamente Sl y NO 10 veces. 2. Desarrolle un algoritmo que le permita realizar la escritura de los primeros 100 nmeros naturales. 3. Desarrolle un algoritmo que le permita realizar la suma a los primeros N nmeros impares. 4. Calcular la siguiente sumatoria para n trminos: 1 2 + 3 4 + 5 6 +7 8 +9 10 + ... 5. Desarrolle un algoritmo que calcule el promedio a los primeros N nmeros naturales. 6. Desarrolle un algoritmo que le permita sacar y escribir el cuadrado de cada uno de los primeros N nmeros naturales. 7. Desarrolle un algoritmo que le permita leer un valor entero positivo N y calcule su factorial. 8. Desarrolle un algoritmo que le permita leer un valor entero positivo N y decir si es primo o no. 9. Desarrolle un algoritmo que le permita realizar la escritura de los primeros N nmeros Primos. 10. Desarrolle un algoritmo que le permita leer un valor entero positivo N y verifique si es mximo comn divisor de W y Z. 11. Desarrolle un algoritmo que le permita leer un valor entero N y lo invierta usando estructuras cclicas y funciones. Por ejemplo que lea 1234 y escriba 4321. 12. Desarrolle un algoritmo que le permita leer un valor entero positivo N dado en base decimal y convertirlo a base binaria. 13. Leer un nmero entero y almacenarlo en la variable N y leer una base numrica cualquiera en la variable Base. Pasar el valor N a Base Base. 14. Desarrolle un algoritmo que le permita leer un valor entero positivo N y sacar su cuadrado sumando los primeros N impares. 15. Desarrolle un algoritmo que le permita leer un valor entero positivo N y calcular su cuadrado sumando N veces N. 16. Desarrolle un algoritmo que le permita leer N valores y calcular la media aritmtica n x x x x n / ) .... ( 3 2 1 ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 7 de 188 17. Leer un nmero entero (entero largo) positivo e invertirlo. Por ejemplo, si el nmero es 15429852, se debe obtener como resultado 25892451. Es similar al ejercico 12 pero en este no se usan funciones. 18. Desarrolle un algoritmo que le permita leer N valores y calcule con dichos valores la media geomtrica n n x x x x * ... * * * 3 2 1 EJERCI CI OS PARA CODI FI CAR 1. Desarrolle un algoritmo que le permita leer N valores, sumar todos los valores y decir cual es el nmero mayor, cual es el menor y cual es la suma. 2. Desarrolle un algoritmo que le permita leer N valores y escriba los que sean mltiplos de 5. 3. Desarrolle un algoritmo que le permita leer N valores y escribir independientemente el promedio de pares e impares. 4. Desarrolle un algoritmo que le permita leer N valores y al final escribir si el mayor valor de los datos ledos es par o impar 5. Genere la serie de fibonnacci iniciando con valores 1 y 2. Cada nmero de la serie generada es la suma de los dos anteriores. 6. ... ! 3 2 1 ! 2 2 1 2 1 1 3 2 e 7. ...... ! 4 ! 3 ! 2 1 4 3 2 x x x x e x 8. ...... ! 4 ) ( ! 3 ) ( ! 2 ) ( ) ( 1 4 3 2 ) ( x sin x sin x sin x sin e x si n 9. ... ! 7 ! 5 ! 3 ) ( 7 5 3 x x x x x Sin 10. ... ! 7 ! 5 ! 3 ) ( 7 5 3 x x x x x Sinh 11. ... ! 6 ! 4 ! 2 1 ) ( 6 4 2 x x x x Cos 12. ... ! 6 ! 4 ! 2 1 ) ( 6 4 2 x x x x Cos ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 8 de 188 Cual qui er suger enci a o ej er ci ci o adi ci onal que crean conveni ent e adi ci onar y/ o explicar con ms detalle en el presente texto, por favor remitir al e-mail yacer [email protected] y con gusto acatar lo sugerido. CONTENI DO lNTRODUCClcN 11 OBJETIVOS Y CONTENIDO 13 PARA QUE SlRVE LA PROGRAMAClcN 14 QUE ES LA PROGRAMAClcN 15 QUE ES UN LENGUAJE DE PROGRAMAClcN 16 NIVELES DE LOS LENGUAJES 17 TlPOS DE PROGRAMAClcN 18 EL SECRETO DE PROGRAMAR ESTC EN LA ESTRUCTURAClcN 19 ELEMENTOS BCSlCOS DE UN PROGRAMA 20 ELEMENTOS BCSlCOS DE UN PROGRAMA EN C 22 main() 23 La dir ectiva #I nclude: 24 Definicin de variables identificadores: 24 Pal abr as cl ave en C 25 Vari abl es gl obales: 27 Vari abl es Locales: 27 Prototipo de funcin: 28 Enunci ados del programa: 28 Ejercicios de uso de la funcin printf() 30 ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 9 de 188 Definicin de funcin: 31 Comentarios: 31 ESTRUCTURAS ESTCTlCAS DE DATOS 36 TIPOS DE DATOS 37 PREDEFI NI DOS POR LOS LENGUAJES 37 TIPOS DE DATOS ENTEROS 37 TIPOS DE DATOS REALES 38 TIPOS DE DATOS CHAR 38 TIPOS DE DATOS STRING 39 TIPOS DE DATOS BOOLEAN 40 TI POS DEFI NI DOS POR EL USUARI O: 41 DATOS DE TIPO SUBRANGO: 41 DATOS DE TIPO ENUMERADO 41 ALGORITMOS Y PROGRAMAS 47 DlSEO DE PROGRAMAS: 47 DI AGRAMAS DE FLUJO 48 REGLAS DE PROGRAMAClcN: 50 PROGRAMAClcN ESTRUCTURADA 50 ESTRUCTURAS DE PROGRAMAClcN 52 ESTRUCTURA DE ASlGNAClcN 52 Expresiones simples 52 Expresiones compl ej as 53 ESTRUCTURA DE DEClSlcN 83 Estructura Sencil la: 83 Operadores de Relacin: 83 Operadores Lgicos: 84 Estructuras de decisin anidadas: 85 Ejercicios Aplicando Estructuras de Decisin 86 ESTRUCTURAS CcCLlCAS 123 Ci clos con control antes 123 Ciclos con control despus: 123 Estructuras cclicas anidadas: 124 Estructura cclica FOR-ENDFOR 125 ESTRUCTURA DE SELECClcN MULTlPLE 167 ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 10 de 188 FUNCIONES 170 Definicin 170 Llamadas por val or 174 Llamadas por referenci a 174 Creacin de Bibliotecas propias: 177 Funci ones recursivas y Algori tmos Recursi vos 179 ARREGLOS 181 Definicin 181 Arregl os Unidi mensionales 181 Tipo_de_dato nombre_variable [tamao] 182 arreglos bidi mensional es 184 Arregl os multi dimensi onal es 185 lnicializacin de arreglos con tamao 186 lnicializacin de arreglos sin tamao 187 ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 11 de 188 EL lenguaje C es el resultado de un proceso de desarrollo que inici con un lenguaje denominado BCPL escrito por Martin Richards. Este influenci a otro llamado B (inventado por Ken Thompson). En los aos 70 para el primer sistema UNlX en un DEC PDP-7; ste lenguaje llev a la aparicin del C. El primer compilador de C fue escrito por Kernighan y Dennis Ritchie en 1972 en la ATT para un DEC PDP-11 y escribi el propio sistema operativo en C. Con la popularidad de las microcomputadoras muchas compaas comenzaron a implementar su propio C por lo cual surgieron discrepancias entre s. Por esta razn ANSl (American National Standars lnstitute), estableci un comit en 1983 para crear una definicin no ambi gua del lenguaje C e independiente de la mquina que pudiera utilizarse en todos los tipos de C. Algunos de las C existentes son: Ansi C Zortech C++ Quick C C++ Turbo C Turbo C ++ Borland C Microsoft C Visual C C Builder Los cdigos presentados en este libro estn basados en el C, Turbo pascal y C para MatLab, los cuales pueden utilizarse en todos los tipos de C y Pascal existentes en el mercado. C es un lenguaje de programacin de nivel medio ya que combina los elementos del lenguaje de alto nivel con la funcionalidad del ensamblador. Su caracterstica principal es ser port able, es decir, es posible adaptar los programas escritos para un tipo de computadora en otra. Otra de sus caractersticas principales es elser estructurado, es decir, el programa se divide en mdulos (funciones) independientes entre s. El lenguaje C inicialmente fue creado para la programacin de: - Sistemas operativos - lntrpretes - Editores - Ensambladores - Compiladores - Administradores de bases de datos. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 12 de 188 Actualmente, debido a sus caractersticas, puede ser utilizado para todo tipo de programas. Como principal objetivo, este libro trata de vulgarizar el lenguaje C colocndolo al alcance de todos los estudiosos de cualquier nivel o profesionales de la programacin con conocimientos mnimos informticos. Para ello, a lo largo de los diferentes capt ulos, se trata al lenguaje no como algo aislado en si mismo, sino relacionado especficamente con la Metodologa de la Programacin y la Estructura de Datos, fu entes indispensables del conocimiento profundo de cualquier lenguaje de programacin. El trmino vulgarizar, que aqu se utiliza, no significa en modo alguno eliminar la teora del lenguaje y descender al terreno prctico olvidando la misma, si no completamente teora y practica mediante la inclusin de todos los ejemplos oportunos y las aclaraciones necesarias aunque estas puedan parecer, a veces, superfluas e incluso dadas por sabidas. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 13 de 188 Este libro tiene un objetivo fundamental: I ntroducir y explicar los conceptos fundamentales de las estructuras de programacin utilizadas en los diferentes de lenguajes de programacin de microcomputadoras. El libro esta diseado para ser utilizado de diversas formas: Como libro de texto, libro complementario, libro de problemas de programacin, libro de anlisis numrico o bien como libro de introduccin a la programacin de computadoras. El seguimiento de este libro no requiere ningn conocimiento previo de programacin de computadoras, aunque, si se utiliza como libro de problemas puede complementarse con algn libro de mayor contenido terico relativo a algo ritmos, estructuras de datos o bien lenguajes de programacin. El libro esta dividido en varios captulo s que abarcan los conceptos esenciales de las estructuras de programacin en los diferentes lenguajes comnmente utilizados en la programacin de computadoras. En la primera parte se trata lo relacionado con los smbolos utilizados en la diagramacin o solucin de problemas a nivel simblico (Diagramas de flujo). En la segunda parte se desarrollarn algunos ejercicios donde se muestra de manera prctica la utilizacin de dichos smbolos Una tercera parte donde se analizan las estructuras de asignacin Una cuarta parte donde se analizan las estructuras de decisin Una quinta parte donde se analizan las estructuras repetitivas o cclicas Una sexta parte donde se analizan las estructuras de seleccin mltiple. Cada uno de los captulos esta diseado de tal forma que el lector entienda de manera clara y sencilla el uso de cada uno de las estructuras mencionadas anteriormente. De igual forma cada uno de los captulos estar soportado con una buena cantidad de ejercicios resueltos que aclaran la forma correcta de utilizacin de dichas estructuras. A cada uno de los ejercicios que se plantean en el presente libro, se le har un anlisis de su solucin de manera mecnica, se llevar a un anlisis simblico y luego se desarrollar el algoritmo al nivel de diagramas de flujo, Seudo lenguajes, Seudo cdigos y Cdigos. Para esta ltima parte se codificar cada ejercicio en Turbo Pascal, Lenguaje C y Cdigo para ser ejecutado en MatLab. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 14 de 188 Una persona piensa y se comporta obedeciendo a un secuencial lgico. Un computador realiza tareas y maneja datos en memoria obedeciendo a una secuencia de pasos lgicos para lo cual ha sido programado. Programacin de computadoras es la ciencia que le permite a una persona programar una computadora para que resuelva tareas de manera rpida. Un programa de computadora se puede definir como una secuencia de instrucciones que indica las acciones o tareas que han de ejecutarse para dar solucin a un problema determinado. Programar computadoras es indispensable en cualquier rea de la ingeniera, ya que diferentes problemas que se puedan presentar tardan tiempo resolverlos de manera manual. La computadora resuelve problemas de acuerdo como se le haya programado de manera rpida. Se puede decir que la solucin a un proble ma es considerado como un algoritmo. Un algoritmo entonces es el conj unto de operaciones y procedimientos que deben seguirse para resolver un problema. La palabra "algoritmo" deriva del nombre latinizado del gran matemtico rabe Mohamed I bn Moussa Al Kow Rizmi, el cual escribi sobre entre los aos 800 y 825 su obra Quitab Al Jabr Al Mugabala, donde se recoga el sistema de numeracin hind y el concepto del cero. Fue Fibonacci, el que tradujo su obra al latn y la inici con las palabras: Algoritmi dicit. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 15 de 188 La definicin anterior deja muchas co sas que decir. Para llegar a tener una secuencia de instrucciones que den solucin a un problema es necesario ejecutar varias etapas. Etapa de anlisis: En esta etapa el pr ogramador debe entender claramente el problema. Saber que es lo que se quiere resolver. (Analizar) Etapa de Solucin general: Escribir la serie de pasos que sean necesarios para dar solucin al problema. Estos pasos se pueden desarrollar a travs de un Diagrama de flujo (Utilizando smbolos) a travs de un seudo lenguaje (Utilizando Lenguaje comn). A lo anterior es lo que se conoce con el nombre de Algoritmo. Etapa de prueba: Consiste en chequear el algoritmo paso a paso para estar seguro si la solucin da solucin verdaderamente el problema. (Prueba de escritorio). Etapa de implementacin especfica: Cons iste en traducir el algoritmo a un lenguaje de programacin. (Codificar). Etapa de prueba: Consiste en ejecutar el programa en un computador y revisar los datos arroj ados para ver si son correctos y hacer los ajustes necesarios. (I mplementar). Etapa de uso: Consiste en instalar el programa de manera definitiva para el uso por parte del usuario. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 16 de 188 Se puede definir un lenguaje de programacin como un conjunto de reglas normas, smbolos y palabras especiales utilizadas para construir un programa y con l, darle solucin a un problema determinado. El lenguaje de programacin es el encargado de que la computadora realice paso a paso las tareas que el programador a diseado en el algoritmo. Se puede decir que un lenguaje de programacin es el intermediario entre la mquina y el usuario para que este ltimo pueda resolver problemas a travs de la computadora haciendo uso de palabras (funciones) que le traducen dicho programa a la computadora para la realizacin de dicho trabajo. Diferencia entre el lenguaje algortmico y el informtico. El lenguaje algortmico es aquel por medio del cual se realiza un anlisis previo del problema a resolver y encontrar un mtodo que permita resolverlo. El conjunto de todas las operaciones a realizar, y el orden en el que deben efectuarse, se le denomina algoritmo. El lenguaje informtico es aquel por medio del cual dicho algoritmo se codifica a un sistema comprensible por el ordenador o computadora . Este tipo de lenguaje es ms cercano a la mquina que al ser humano y se puede distinguir distintos tipos de lenguajes, dependiendo de la proximidad a la mquina. Se denomina lenguaje de alto nivel aquel que es ms cercano a la comprensin humana y lenguaje de bajo nivel a aquellos que son ms comprensibles por la mquina. Es por ello que el 'C' es tan potente y rpido, pues las funciones principales representan las funciones ms bsicas del ordenador. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 17 de 188 Desde que se desarrollaron las mquin as programables se han desarrollado lenguajes con los cuales las personas puedan dar rdenes a stas. En su orden los lenguajes de programacin se pueden clasificar as: Lenguaje de mquina: Las primeras computadoras se programaban en cdigo de mquina. Se puede decir que los programas eran diseados en cdigo binario. Eran difciles de leer, difciles de entender y por su puesto difciles de corregir. Los programas se caracterizaban por ser pequeos. Lenguajes de Bajo Nivel: Para dar solucin a lo difcil que era programar en cdigo mquina, se desarroll un lenguaje cono cido como lenguaje ensamblador. Este lenguaje era encargado de tomar algunas palabras comunes a una persona y traducirlas al cdigo mquina. Lo anterior facilitara un poco la escritura de programas. Lenguajes de alto nivel: Como las personas resuelven problemas y se comunican en lenguajes naturales (espaol, ingles, francs, etc.), se desarrollaron lenguajes de programacin que estuvieran mas cerca de sta manera de resolver problemas. De los lenguajes de alto nivel se puede citar el Basic, Cobol, Fortran, Pascal, Turbo Pascal, C, Modula, Ada. Como se hace necesario traducir el programa a lenguaje de mquina, en los lenguajes de alto nivel esa operacin la realiza algo que se conoce con el nombre de Compilador. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 18 de 188 Dependiendo del lenguaje de programacin que se elija, se puede hablar del tipo de programacin que se va a realizar. Secuencial: Se considera programacin secuencial a los programas que se disean con instrucciones que van unas detrs de otras. Las lneas se ejecutan una a una en secuencia. Ejemplos tales como Basic, Cobol. Estructurada: Se considera programacin estructurada a la programacin que se hace por mdulos. Cada mdulo realiza alguna tarea especfica y cuando se necesite esa tarea simplemente se hace el llamado a ese mdulo independiente de que se tengan que ejecutar los dems. Ejemplos tales como: Turbo PASCAL, C, Modula, Ada. Orientada a Objetos: Se considera programacin orientada a objetos aquellos lenguajes que permiten la utilizacin de objetos dentro del diseo del programa y el usuario puede pegar a cada objeto c digo de programa. Ejemplos de estos lenguajes se pueden mencionar el Visual Basic o Visual C de la Microsoft, C Builder de la Borland I nternacional, Java, Xml entre otros. Lgica o de lenguaje natural: son aquellos programas que se disean con interfaces tal que la persona o usuario puede ordenar a la mquina tareas en un lenguaje natural. Pueden interactuar como una persona pero nunca llegan a producir conocimiento. Ejemplo como Prolog (Programming Logic). Estos lenguajes se desarrollaron con base en las estructuras de sus antecesores. Recorren o navegan las bases de datos obedeciendo a reglas. I nteligencia Artificial: Los programas de inteligencia artificial Son programas que se acercan a la inteligencia humana. Estos programas son capaces de desarrollar conocimiento. Este tipo de lenguajes trabajan similar a la mente humana. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 19 de 188 Turbo Pascal y C por su diseo son lenguajes estructurados. C y Turbo PASCAL no permiten al programador enlazar sentencias de cualquier manera. Existe una estructura bsica que cada programa debe seguir (Estructura de un programa) y el compilador es estricto a la hora de hacer cumplir estas reglas. Un programa ha de ser codificado en varias partes y cada una de ellas debe ir en el lugar que le corresponde. La idea fundamental del lenguaje C y Turbo Pascal es crear programas que sean comprendidos sin necesidad de emplear docenas de pginas de diagramas de flujo y miles de explicaciones. Esta manera de realizar los programas es a lo que denomina como "PROGRAMAClcN ESTRUCTURADA". Aunque se pueda llegar a realizar programas que aparentan tener una estructura (ser estructurados), Turbo Pascal y C son lenguajes que exige su utilizacin. La programacin estructurada le permite realizar pequeas rutinas especficas para cada tarea que se quiera realizar, y a cada una de esas rutinas se les da un nombre (I dentificador) para cuando el programador la requiera slo la llame con su nombre y automticamente se ejecutar. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 20 de 188 En el mbito general, un programa codificado o escrito bajo cualquier lenguaje de programacin estructurado consta bsicamente de dos secciones: Seccin encabezado Seccin cuerpo de programa La seccin de encabezado es usada pa ra declarar, mencionar o identificar las variables con sus respectivos tipos y/ o las constantes que se vayan a utilizar en el desarrollo del programa, as como tambi n el nombre de las funciones y/ o los procedimientos que ejecutarn las instrucci ones de los diferentes algoritmos que va a tener dicho programa. Adems en esta seccin se declaran los archivos de inclusin (Archivos generalmente con extensin .h hablando de lenguaje C) que permiten el uso de algunas funciones que son necesarias para el desarrollo en si del programa. I gualmente se especifican las estructuras de datos complejas que se vayan a manejar. En la seccin cuerpo de programa realmente se describen todos los procedimientos y/o funciones que se van a ejecutar dentro del programa as como tambin el cdigo del programa principal. Como cuerpo de programa es indispensable que haya parte principal ( ) mientras que los procedimientos y/ o funciones son opcionales. La mejor forma de aprender un lenguaje es programando con l. El programa ms sencillo que se puede escribir en C es el siguiente: main() { } Como se puede imaginar, este programa no hace nada, pero contiene la parte ms importante de cualquier programa en C y adems, es el ms pequeo que se puede escribir y que se compile correctamente. En el se define la funcin main, que es la que ejecuta el sistema operativo al llamar a un programa C. El nombre de una funcin C siempre va seguida de parntesis, tanto si tiene argumentos ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 21 de 188 como si no. La definicin de la funcin est formada por un bloque de sentencias, que esta encerrado entre llaves { } . ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 22 de 188 El siguiente ejemplo ilustra algunos componentes que con mayor frecuencia se usan cuando se trata de codificar programas utilizando el lenguaje de programacin C. Cada una de las lneas es numerada para efectos posteriores. Al momento de transcribir en el compilador no es necesaria la numeracin. 1. /* Programa que calcula el producto de dos nmeros ingresados por teclado*/ 2. #include stdio.h 3. int a,b,c; 4. int producto(int x, int y); 5. main() 6. { 7. /* pide el primer nmero */ 8. printf(digite un nmero entre 1 y 100); 9. scanf(%d,&a); 10. 11. /* pide el segundo nmero */ 12. printf(digite un nmero entre 1 y 100); 13. scanf(%d,&b); 14. 15. / * calcula y despliega el producto * / 16. c = producto(a,b); 17. printf(\n%d por %d = %d, a, b, c); 18. } 19. 20. /* funcin que calcula y regresa el producto de sus dos argumentos */ 21. int producto(int x, int y) 22. { 23. return(x* y); 24. } ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 23 de 188 Aunque cada programa es distinto, todos tienen caractersticas comunes. Los elementos bsicos de un programa codificado en lenguaje C son los siguientes tomando el ejemplo anteriormente descrito: La funcin main() (lnea 5 y cuyo cuerpo esta entre lneas 6 a la 18) La directiva #include (lnea 2) Definicin de variables (lnea 3) Prototipo de funcin (lnea 4) Enunciados del programa (lnea 8,9,12,13,16,17,23) Definicin de funcin (lnea 21 24) Comentarios (Lnea 1,7,11,15,20) Veamos en que consiste cada uno: mai n( ) La palabra mai n es muy importante y debe aparecer solo una vez en todo programa C. En C, todo el cdigo est basado en funciones. El programa principal no es la excepcin. ) indica el comienzo de la funcin principal del programa la cual se delimita con llaves. Este componente es obligatorio en cualquier programa que se compile con lenguaje C. En su forma simple la funcin consiste en la palabra seguida de parntesis y las instrucciones que ejecutan se encuentran demarcadas por las dos llaves . Sin embargo no todos los programas tienen esta tradicional funcin; los programas de Windows escritos en C y C++ disponen de una funcin de inicio llamada winmain() en lugar de la tradicional main(): Ejemplos de cmo se usa frecuentemente la funcin main son los siguientes: # incl ude < st di o. h> i nt mai n( ) { printf ("Esta es una lnea de texto."); getch(); ret urn 0; } # incl ude < st di o. h> void main( ) { printf ("Esta es una lnea de texto."); getch(); } ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 24 de 188 En el primer caso se le est indicando al compilador que la funcin main devolver un valor entero (int) cuando esta sea ejecutada, por tal razn es que se coloca la funcin y el valor de 0 al final para indicar que el valor devuelto corresponde a 0. En el segundo caso se le est indicando al compilador que la funcin main no devolver valor alguno (void) cuando esta sea ejecutada. En este caso particular no es necesaria la funcin . La di r ect i va # I ncl ude: La directiva da instrucciones al compilador C para que aada el contenido de un archivo de inclusin al programa durante la compilacin. Un archivo de inclusin es un archivo de disco separado que contiene informacin necesaria para el compilador. Varios de estos archivos (Algunas veces llamados archivos de encabezado) se proporcionan con el compilador. Nunca se necesita modificar la informacin de estos archivos y esta es la razn por la cual se mantienen separados del c digo fuente. Todos los archivos de inclusin deben tener la extensin (.h) por ejemplo # i ncl ude st di o.h. En el caso de el archivo de inclusin le indica al compilador que se han incluido funciones estndares de entrada i=input y salida o=output que podr utilizar en el desarrollo del programa por ejemplo (funciones como printf(), scanf()) Se usa la directiva para darle instrucciones al compilador que aada un archivo especfico al programa durante la compilacin. La directiva , en este programa de ejemplo, significa aada el contenido del archivo . Not a: Definicin de variables identificadores: Una variable identificador es un nombre asignado a una posicin de almacenamiento de datos. El programa utiliza variables para guardar varios tipos de datos durante la ejecucin del programa . En C, una variable debe ser definida antes de que pueda ser usada. Una definicin de variable le informa al compilador el nombre de la variable y el tipo de datos que va a guardar. En el programa de ejemplo la definicin de la lnea 3, "int a, b,c; " define tres variables, llamadas a, b, y c que guardar cada una un valor de tipo entero. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 25 de 188 Las variables se pueden declarar en la zona de encabezado de un programa o al inicio de una funcin o un procedimiento. Hay que aclarar que algunas estructuras de programacin permiten la definicin de variables dentro de ellas. Dos reglas se deben tener en mente cuando se define nombre a los identificadores: 1. El tamao de los caracteres alfabticos es importante. Usar PRI NCI PAL para el nombre de una variable bajo C, no es lo mismo que usar pr i nci pal , como tampoco es lo mismo que usar Pr I nCi PaL. Las tres palabras se refieren a variables o identificadores diferentes. 2. De acuerdo al estndar ANSl-C, al d arle nombre a un identificador solo sern significativos los primeros 31 caracteres, todo caracter mas all de este lmite ser ignorado por cualquier compilador que cumpla la norma ANSI -C Un elemento importante es el smbolo de subrayado _ que puede utilizarse como parte del nombre de una variable variable_A, contribuyendo notablemente a la legibilidad del cdigo resultante. Es utili zado por algunos, pero no por todos los programadores experimentados. Algunos subrayados sern utilizados en este curso a manera de ilustracin o descripcin de programa. Debido a que una gran parte de los escritores de compiladores utilizan el subrayado como primer carcter para los nombres de variables internas de sistema, es aconsejable evitar el uso del subrayado para iniciar un identificador y as evitar la posibilidad de una confusin de nombres en la etapa de compilacin, ms especfico, los identificadores con doble subrayado __ estn reservados para uso del compilador as como los identificadores que empiezan con un subrayado seguido de una letra mayscula _A. Esto es importante, respetar sta sencilla regla evitar depurar errores innecesarios. Pal abr as cl ave en C El estndar ANSl-C define un total de 32 palabras clave, que estn reservadas para uso exclusivo del compilador C. A continuacin se da una referencia de la totalidad de las 32 palabras clave definidas por el estndar ANSl-C, sta gua da una definicin breve de cada pala bra. Diversos fabricantes de compiladores C suelen incluir una cantidad variable de palabras reservadas para sus propios compiladores, sin embargo stas palabras reservadas no estn soportadas por el estndar ANSl-C y por lo tanto no se tratan en ste libro. Se puede clasificar las palabras clave del ANSl-C de acuerdo a su funcin, en primer lugar estn las palabras que definen un tipo especfico de dato: ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 26 de 188 int: un tipo de dato entero con signo de 16, 32 64 bits, dependiendo del compilador. En sistemas de 16 bits su rango de valores es de -32768 a 32767. Para sistemas de 32 bits el rango se de -2147483648 a 2147483647. En sistemas de 64 bits el rango ser de 1.7 +/ -308 . Actualmente son muy pocos los compiladores con capacidad de manejar datos de tipo int de 64 bits, lo usual son sistemas de 16 32 bits. float: Un nmero real de 32 bits cuyo rango va de 3.4 +/ -38 . Generalmente su precisin es de 7 dgitos. long: Un nmero entero de 32 bi ts de rango igual a -2147483648 a 2147483647. double: Un nmero de 64 bits y de rango igual a 1.7 +/ -308 con una precisin en general de 15 dgitos. short: Un nmero de 16 bits de rango igual a -32768 a 32767. char: Un tipo de dato especfico para manejo de caracteres de 8 bits de rango igual a -128 a 127. unsigned: Modificador que se aplica a los tipos de datos enlistados arriba, su efecto es eliminar el signo a el tipo de dato aplicado, por ejemplo, para un tipo de dato int podemos especificar unsigned int en cuyo caso el rango para el tipo de dato int cambia de ser -2147483648 a 2147483647, por ste nuevo rango: 0 a 4294967295. signed: Modificador que forza al compilador a utilizar un tipo de dato con signo si antes se declar como de tipo unsigned. volatile: Especifica una variable que almacena datos cuyo contenido puede cambiar en cualquier momento sea por la accin del programa como reaccin de la interaccin del usuario con el programa. const: Especifica una variable cuyo contenido no puede cambiar bajo ninguna circunstancia. enum: Especifica un conjunto de variables que toman valores en un orden especfico y consecutivo. static: Especifica una variable que slo puede cambiar por efecto del programa. typedef: Define un tipo de dato para fcil manejo del programador basado en los datos definidos por el compilador. Muy til cuando se programa en lenguajes diferentes al ingls. sizeof: Funcin que devuelve el tamao en bytes del tipo de dato al que se aplica. Otro conjunto de palabras clave sirve para especificar instrucciones propias de C con carcter de control del flujo de datos: if: lnstruccin condicional. else: Se utiliza conjuntamente con la instruccin if. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 27 de 188 switch: Estructura condicional. case: Define los elementos de una estructura condicional . default: Define las acciones a ejecutar no especificadas por una instruccin dentro de una estructura condicional break: Obliga a salir de una estructura condicional for: Bucle que se ejecuta tantas veces como se cumplan las condiciones especificadas dentro del parntesis de la instruccin. while: Bucle condicional que se ejecuta conforme la condicin entre el parntesis sea cierta. do: Bucle condicional que se ejecuta en conjunto con la instruccin while. continue: lnstruccin para suspender un ciclo de un bucle. goto: lnstruccin que ejecuta un salto a otra parte del cdigo. El siguiente conjunto de palabras clave designa una serie de instrucciones que implementan diversas construcciones tiles en C struct: Define una estructura. return: Especifica el dato que devuelve una funcin. union: Un tipo de dato compuesto de otros datos definidos. register: Permite almacenar un dato en el registro del sistema. extern: Especifica una variable funcin que se encuentra en un archivo fuente diferente. void: Especifica que una funcin no devuelve valor alguno. auto: Una de las cuatro clases de almacenamiento de datos, auto es la opcin por defecto, las otras tres son register, static y extern. Adicionalmente su compilador puede definir algunas palabras clave, mismas que estarn enlistadas en la documentacin del mismo. Las variables globales son aquellas variables que se definen o declaran en la zona de encabezado de cualquier programa en C, incluso en pascal. Estas variables pueden ser utilizadas en cualquier parte del programa, igualmente puede ser modificado su valor desde cualquier instruccin. : Las variables son consideradas como locales cuando su declaracin se hace al inicio de una funcin o al iniciar un procedimiento o funcin. Las variables que hayan sido declaradas como locales solo sern reconocidas por el procedimiento o funcin donde se hizo dicha declaracin. En ninguna otra parte del programa se puede hacer uso de ellas. Si intenta hacer uso de una variable local fuera del ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 28 de 188 procedimiento o funcin donde fue declarada entonces el compilador marcar un error del siguiente tipo: Error c:\yam\C\Bin\001.cpp 7: Undefi ned symbol x in function main() Un reciente cambio de regla de aproximacin del comit de ANSl de C++ afecta la visibilidad de una variable que se declara en una instruccin como . El siguiente cdigo generar un error de compilador. Un prototipo de funcin proporciona al compilador C el nombre y los argumentos de una funcin contenida en el programa, y debe aparecer antes de que la funcin sea usada. Un prototipo de funcin es diferente de una definicin de funcin que contiene las instrucciones actuales que hacen a la funcin. El prototipo de funcin debe llevar (;). Not a: Un prototipo de funcin debe llevar (;) en la seccin de encabezado. Cuando se desarrolla en el cuerpo del programa no debe llevar (; ) El trabajo real de un programa escrito en leguaje C, es realizado por sus enunciados. Los enunciados de C despliegan informacin en la pantalla, leen valores entrados desde el teclado, ej ecutan operaciones matemticas, llaman funciones, leen archivos de disco y hacen todas las otras operaciones que un programa necesita ejecutar. pr int f ( ) : El enunciado es una funcin de la biblioteca que despliega informacin en la pantalla. Acepta un string de formato y cualquier nmero de argumentos. Estos argumentos se aplican a cada uno de los especificadores de formato contenidos en . Un especificador de formato toma la forma %[ ] [ ] [ . ] [ h| l] . El tipo puede ser: ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 29 de 188 d, i ent ero decimal con signo o ent ero oct al sin signo u ent ero decimal sin signo x entero hexadecimal sin signo (en minsculas) X entero hexadecimal sin signo (en maysculas) f coma flot ant e en la forma [ - ] dddd.dddd e coma flot ant e en la forma [ - ] d. dddd e[ + / - ] ddd g coma flotante segn el valor E como e pero en maysculas G como g pero en maysculas c un carcter s cadena de caracteres terminada en '\0' % imprime el carcter % p punt ero Los pueden ser los caracteres: + siempre se imprime el signo, t ant o + como - - justifica a la izquierda el resultado, aadiendo espacios al final blank si es posit ivo, imprime un espacio en lugar de un signo + # especifica la forma alt ernat iva En el campo se especifica la anchura mnima de la forma: n se imprimen al menos n caract eres. 0n se imprimen al menos n caract eres y si la salida es menor, se ant eponen ceros * la lista de parmetros proporciona el valor Hay dos modificadores de tamao, para los tipos enteros: l imprime un ent ero long h imprime un ent ero short De forma sencilla se puede decir que el enunciado puede desplegar como mensaje, una simple cadena de texto o mezclar texto con valores de una o ms variables del programa, la salida siempre debe formatearse entre las comillas. Las variables que contienen los valores que se deben mostrar, se escribirn por fuera de las comillas y si son varias entonces se deben separar por comas. Ej : (este es un simple comentario); (El cuadrado de %d es igual a %d,a,a*a); ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 30 de 188 En el ejemplo anterior es necesario que se conozca el valor de la variable que debi haber sido declarada de tipo %d. Ejercicios de uso de la funcin printf() Busca los errores en este programa: i nt mai n( ) { /* Aqu va el bloque de inst rucciones de la funcin principal */ Printf( "Hola principiantes en programacin C \n" ); ret ur n( 0) ; } Solucin: Si se compila el cdigo anterior en lenguaje C, se obtendr un error que indicar que no se ha definido la funcin . (). Esto es porque no se incluy la librera con la directiva #include. (En algunos compiladores no es necesario incluir esta directiva, pero es una buena costumbre hacerlo). Si se corrige el cdigo incluyendo la librera y se vuelve a compilar se obtendr un nuevo error. #include stdio.h i nt mai n( ) { /* Aqu va el bloque de instrucciones de la funcin principal */ printf( "Hola principiantes en programacin \n" ); r et ur n( 0) ; } Esta vez indicar el mismo error indicando desconocimiento de la funcin . Esta vez el problema es de las maysculas que se ha indicado antes. Lo correcto es escribir con minsculas. Parece una tontera, pero seguro que dar ms de un problema. Hay un grupo de smbolos, que son trat ados como caracteres individuales, que especifican algunos caracteres especiales del cdigo ASCll y son utilizados dentro de la instruccin printf. Los ms importantes son: \a Al erta \b Espacio atrs (Retroceso) \f Salto de pgina \n Salto de lnea \r Retorno de carro \t Tabulacin horizontal (Tab) \v Tabulacin vertical \\ Barra invertida \' Comilla simple \" Comillas dobles ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 31 de 188 \OOO Visualiza un carcter cuyo cdigo ASCll es OOO en octal \xHHH Visualiza un carcter cuyo cdigo ASCll es HHH en hexadecimal scanf ( ) : El enunciado es otra funcin de la librera o biblioteca . Ella lee datos desde el teclado y asigna los datos a una o ms variables del programa. Ej: scanf(%d,&a); scanf(%d %d,&a,&b); En el primer ejemplo se lee un valor entero y este es asignado a la direccin de la variable a. En el caso del segundo ejemplo se leen dos datos enteros y cada valor es almacenado en las variable y respectivamente. Una funcin es una seccin de cdigo independiente y auto contenida que es escrita para ejecutar determinada tarea. Cada funcin tiene un nombre y el cdigo de cada funcin es ejecutado incluyendo el nombre de la funcin, en una instruccin de programa. A esto se le llama llamado de la funcin. La funcin denominada producto, es una funcin definida por el usuario. Tal como lo indica su nombre las funciones definidas por el usuario son escritas por el programador durante el desarrollo del programa. Esta funcin es simple, ya que todo lo que hace es multiplicar dos valores y regresar el resultado de dicha multiplicacin al programa que la llam. El C tambin incluye funciones de biblioteca que son parte del paquete del compilador C. Las funciones de biblioteca ejecutan la mayora de las tareas comunes (como la entrada / salida de la pantalla el teclado y disco) que necesita el programa. En el programa de ejemplo y son funciones de biblioteca. Agregar comentarios al cdigo C de un programa puede hacerlo mas entendible al usuario que este leyendo cdigo, pero care nte de significado para el compilador, por lo que se indica al compilador ignorar completamente los comentarios encerrndolos en caracteres especiales. La combinacin de lnea diagonal y asterisco se usa en C para delimitar comentarios . Sirve para escribir informacin que referencie al programa, pero que no forme parte de l como instruccin o como dato. Por ejemplo especificar que hace el programa, ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 32 de 188 quien lo elabor, en que fecha, que versin es, etc. El compilador ignora lo que haya como comentario en el momento de hacer la compilacin del programa. Ejemplo para C: / * Este es un comentario * / En el caso de otra interfaces como MatLab los comentarios simplemente se declaran escribiendo un % al iniciar cada lnea que quedar como comentario. Ejemplo para Matlab: % Este es un comentario Para este caso en particular el programa Matlab cambia el color de la letra de la lnea que haya quedado como comentario. : Es la declaracin de todas las instrucciones que conforman un programa. Todas las sentencias van separadas por (; ), en renglones separados o de manera seguida. Definicin de funciones creadas por el programador utilizadas en main(): Finalmente, se procede a definir el contenido de las funciones utilizadas dentro de main(). Estas contienen los mismos elementos que la funcin principal. Despus de cada asignacin o funcin es imprescindible colocar un punto y coma (;) ya que ste es un terminador de proposiciones. En caso de que no se escriba, se marcar un error a la hora de compilar el programa. En C, los comandos, palabras reservadas o funciones deben ser escritos con letras minsculas, tal como se hizo en el programa de ejemplo. En el lenguaje Turbo Pascal no interesa de qu modo se escriban. En el caso de las variables o las funciones definidas por el usuario la situacin es similar para el caso del lenguaje C, no es lo mismo: Apellido - apellido APELLlDO Aunque para nosotros es lo mismo, el compilador de C, los toma como tres nombres distintos. Por tanto, asegrese de mandar llamar las variables o funciones exactamente de la misma forma en que las declar. En el caso del los lenguajes Turbo Pascal y Basic no diferencian entre maysculas y minsculas o sea que para dichos lenguajes lo mismo es "A" que "a". Ej empl os: a) En el siguiente ejemplo se despliega o muestra un mensaje de bienvenida en la posicin 20 sobre el eje X (Horizontal) y 10 sobre el eje Y (Vertical) de ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 33 de 188 la pantalla y se espera 2.5 segundos aproximadamente mientras el usuario observa dicho mensaje. / * Est e e sun programa que escribe en l a pant all a una bi enveni da * / # incl ude < st di o.h> # incl ude < coni o. h> # i ncl ude < dos. h> mai n( ) { clr scr( ) ; got oxy( 20, 10) ; printf("BlENVENlDO AL CURSO DE C ESTCNDAR"); delay( 2500) ; } La funcin delay en el ejemplo anterior permite indicarle a la mquina cuando ejecute dicha funcin, que se espere 2.5 segundos aproximadamente mientras el usuario lee lo que esta presentado en la pantalla. Pasado los dos segundos el compilador continuar la ejecucin de la siguiente lnea. Es necesario incluir la librera dos.h a traves de la directiva include. b) El siguiente programa le pregunta por su nombre y los aos que tienes. Al final da como respuesta el nmero de das vividos y le coloca un mensaje para que termine el programa. Por la forma que se detiene el programa (getch()) hasta que no se pulse una tecla la computadora no terminara la ejecucin del programa. # i ncl ude< st dio. h> # i ncl ude< coni o. h> mai n( ) { char nombre[ 50] ; i nt edad; clr scr( ) ; got oxy( 10, 5) ; printf("Cmo te llamas?\n "); scanf( "%s", &nombr e) ; got oxy( 10, 6) ; printf("Cuntos aos tienes?\n"); scanf( " %i ", &edad) ; edad = edad * 365; got oxy( 10, 8) ; printf("%s, has vivido %d das",nombre,edad); got oxy( 40, 22) ; pri nt f( "Pul sa cual quier t ecla para t erminar. . . " ) ; get ch( ) ; } ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 34 de 188 Los parmetros %s y %d corresponden a los tipos de datos que se leen o escriben. Tenga en cuenta que la instruccin de lectura la variable se acompaa del smbolo & (&edad, &nombre), mientras que en la instruccin de escritura solo se coloca la variable En la seccin de tipos de datos podr encontrar los diferentes tipos de datos as como sus parmetros. c) El siguiente ejemplo permite la captura por teclado de 3 nmeros cada uno de ellos almacenados en un nombre de variable diferente y al final se entrega el promedio de dichos valores. # i ncl ude< st dio. h> # i ncl ude< coni o. h> mai n( ) { f loat numer o; f loat pr omedi o= 0; clr scr( ) ; got oxy( 10, 5) ; printf("Dame el primer nmero: "); scanf ( " %f" , &numero) ; promedio+ = numero; got oxy( 10, 6) ; printf("Dame el segundo nmero: "); scanf ( " %f" , &numero) ; promedio+ = numero; got oxy( 10, 7) ; printf("Dame el tercer nmero: "); scanf ( " %f" , &numero) ; promedio + = numero; promedio = pr omedi o/ 3; got oxy( 10, 8) ; pri nt f( "El promedio es %f" , promedio) ; got oxy( 40, 22) ; print f( "Presione cual quier t ecl a para t erminar .. . " ) ; get ch( ) ; } Si el ejemplo anterior lo desea correr bajo MatLab tiene que guardarlo en un archivo tipo m en el directorio Work de Matlab o en el directorio donde haya configurado en Set Path de la Opcin de men File. Una vez guardado bajo cualquier nombre, entonces simplemente en el prompt del matlab lo ejecuta llamando el archivo por el nombre guardado. % est e pr ogr ama es ej ecut ado baj o Mat lab promedio= 0; n= i nput ( 'Dame el 1 nmero:' ) ; promedi o= promedio+ n; n= i nput ( 'Dame el 2 nmero: ' ) ; promedi o= promedio+ n; n= i nput ( 'Dame el 3 nmero: ' ) ; promedi o = promedi o+ n; promedi o = pr omedi o/ 3; ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 35 de 188 f pr int f ( 'El promedio es %f \n' , pr omedio) ; f pr int f ( ' Presione t ecl a para terminar...\n' ) ; pause d) El siguiente ejemplo convierte un nmero capturado por teclado en sistema numrico decimal al sistema octal utilizando parmetros que ofrece el lenguaje C para dicha conversin. # i ncl ude< st dio. h> # i ncl ude< coni o. h> mai n( ) { i nt numero; clr scr( ) ; got oxy( 10, 5) ; printf("Digite un nmero entero en decimal: "); scanf( " %i" , &numero) ; got oxy( 10, 6) ; printf("\n\n Su representacin en octal es %o"); got oxy( 40, 22) ; print f( "Presione cual quier t ecl a para t er minar. . . ") ; get ch( ) ; } e) El siguiente ejemplo escribe un mensaje de advertencia sobre algo al usuario y lo mezcla con algunos sonidos que son familiares. # i ncl ude < dos. h> # i ncl ude< coni o. h> i nt mai n( void) { clr scr( ) ; got oxy( 28, 11) ; printf(" P E L l G R O ! "); sound( 250) ; delay( 600) ; sound( 80) ; delay( 600) ; delay( 600) ; nosound( ) ; ret urn ( 0) ; } ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 36 de 188 Se denominan estticas las estructuras de datos simples, o complejas, que una vez definidas dentro de un programa, permanecen inalteradas durante la ejecucin del mismo, sin poder variar, por tanto, su posicin en memoria, ni su longitud en bytes, declarada al especificar el tipo de la misma. En este sentido, y de menor a mayor complejidad, son estructuras estticas tradicionales de datos: - Las variables de carcter - Las variables numricas enteras - Las variables numricas de punto flotante o reales - Las variables de tipo cadena (string) - Las matrices (arrays), formadas por elementos contiguos en memoria de uno de los tipos citados anteriormente - Los registros y archivos Tradicionalmente se han definido como dinmicas las estructuras de cola, pila y rbol por permitir la variacin del nmero de sus elementos, dentro de ciertos lmites, durante la ejecucin del programa. Por lo complejo que resulta el manejo de todo tipo de estructuras, en este libro se menciona tan solo los tipos de estructuras simples que son los mas manejados para la solucin de problemas comunes a lngeniera. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 37 de 188 En el presente captulo se har un recuento del tipo de datos usados en los lenguajes de programacin con el fin de que el usuario pueda en un momento dado entender el tipo de datos utilizado en la mayor parte de ejercicios solucionados en el presente libro. Se visualizara para cada lenguaje en particular el tipo de dato que maneja al igual que sus rangos. Se dar cuenta que la mayora maneja los datos con la misma filosofa y la variacin de unos a otros esta dado solo por la sintaxis que se use para hacer referencia a ellos. La gran variedad de datos que trae consigo un lenguaje de programacin hace que el programador escoja el tipo mas adecuado para la aplicacin que est desarrollando. El rango de datos que maneja cada tipo, indica al usuario que escoger. Los datos se pueden agrupar en los siguientes tipos. PREDEFI NI DOS POR LOS LENGUAJES: ENTEROS DECI MALES DE CADENA BOLANOS DEFI NI DOS POR EL USUARI O SUBRANGO ENUMERADOS Los tipos enteros largos son ms precisos, pero los enteros cortos son ms simples, rpidos y ocupan menos memoria. El valor extremo del rango de cada uno de los enteros est dado por el espacio que ocupa dicho entero en memoria, veamos. Un byte de memoria esta formado por 8 bits. Cada uno de estos bit pueden ser un bit 0 o un bit 1. las combinaciones que podemos tener en un byte (8 bit) podran ir desde: ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 38 de 188 0 0 0 0 0 0 0 0 a 1 1 1 1 1 1 1 1 (8 bits ceros) (8 bits unos) Si se pasa el conj unto de bits (Sistema Binario) a Sistema decimal se tiene que el rango que se maneja ahora ir desde: 0 a 255 (decimal correspondiente a (decimal correspondiente a los 8 bits ceros) los 8 bits unos) Como el rango anterior est utilizando todos los ocho bits del byte para almacenamiento de datos, slo toma da tos enteros positivos, no hay forma de reservar ningn campo bit para el signo. En el caso del entero corto, por utilizar siete bits para almacenamiento de datos, el octavo es usado para signar datos (signo mas o menos). Por tanto solo dispone en memoria de 7 bit para almacenar (bits unos) o (bits ceros). El rango manejado en sistema binario con siete (7) bit ir desde 0000000 hasta el 1111111, que en sistema decimal corresponde al rango de 0 al 127, o sea 128 datos enteros positivos. Como se deja un bit reservado para manejo de signo, entonces los datos negativos sern 128 tambin que irn en rango desde el -1 al -128. El rango definitivo de enteros positivos y negativos para el tipo de dato entero corto ser desde -128 al 127. Los nmeros reales son aquellos datos que tienen parte decimal. Un real se caracteriza porque siempre tiene dgitos antes y despus del punto. Cada uno de los lenguajes de programacin tiene un grupo para este tipo de datos. Al igual que los enteros, los reales se diferencian unos de otros por el rango que cada uno de ellos maneja. Vea tabla de tipos de datos. Se define como Char a cualquier caracter o smbolo que conforman la tabla denominada ASCI I . Una variable que se defina como tipo Char puede almacenar un solo caracter especificado entre apstrofes. {'A'}. Cada caracter se almacena en memoria RAM como un byte o dicho de otra manera cada caracter se almacena en una posicin de memoria. Por ser un solo byte, el nmero de caract eres diferentes que se pueden almacenar es de 256. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 39 de 188 correspondiendo a los valores que van de 0 a 255 (en sistema decimal) o 00000000 a 11111111 (en sistema binario). El conjunto de caracteres de la tabla ASCll se agrupan en dos bloques as: El primer bloque conformado por los caracteres de control. Corresponden a ste bloque los caracteres del cdigo ASCll que van de 1 a 31. El segundo bloque conformado por los caracteres bsicos o caracteres imprimibles. Van del cdigo ASCll 32 al 126, se introducen directamente por el teclado. El tercer bloque conformado por caracteres del cdigo ASCll ampliado. Para hacer referencia a ellos en turbo PASCAL se preceden del signo #. Para asignar cualquier caracter ASCI I a una variable de tipo Char existen varias formas as: A := 'g'; { Se asigna el caracter g a la variable A} B : = A; { Se asigna el valor de A, a la variable B} C := #65; {Se asigna el caracter nmero 65 de la tabla ASCI I a la variable C} Los tipos de datos cadena { String} son secuencia de caracteres que puede llegar a tener una longitud mxima de 255. Cada caracter de esta cadena ocupa un byte en memoria, y la cadena ocupa tantos Bytes como caracteres le hayan asignado. Las cadenas se pueden definir del tamao que se necesite. El comportamiento de los String es similar al de los arreglos. Nombre := 'Pedro Prez'; La anterior cadena tiene 11 caracteres, por tanto va a ser una variable que ocupa 11 Bytes en memoria. Una variable de tipo cadena al ser definida en la seccin de variables se le est asignando un tamao fijo en cuanto al nmero mximo de caracteres que puede almacenar en un momento determinado. Ejemplo para lenguaje pascal: var Nom : String[ 20] ; Dir : String; ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 40 de 188 Ejemplo para lenguaje C char nom[ 10] ; Cuando se define de tipo y se restringe el nmero de caracteres, en el caso de nom tan solo a 20, se esta indicando al compilador que dentro del programa, mximo se le debe asignar una cadena de 20 caracteres o menos. Si un usuario asigna mas de lo que se estableci, simplemente se desechan los caracteres que sobren a la derecha. En el caso de la segunda definicin (Dir), no se est restringiendo su tamao por tanto es una variable que puede almacenar el mximo de caracteres para variables de este tipo (255); Vale anotar que durante la ejecucin de un programa se puede modificar la longitud de la variable tipo String. Algunas funciones de Turbo Pascal aplicadas a cadenas son las siguientes: Fillchar: Funcin que llena el buffers de la variable de una caracter determinado. Si en un momento determinado se quisiera llenar la variable Nom con letras 'A' en lugar de hacer la asignacin Nom:='AAAAAAAAAAAAAAAAAAAA', se puede realizar as: Fillchar(Nom,20,'A'); Se le est diciendo que llene la variable Nom con 20 caracteres 'A'. si no se conoce el tamao de la variable entonces se puede utilizar as: Fillchar(Nom,sizeof(Nom),'A'); Se utiliza la funcin Sizeof para indicar que llene totalmente la variable Nom con el caracter 'A'. Algunos lenguajes de programacin poseen este tipo de dato. El tipo slo tiene dos valores posibles: False (00) True(01). Una variable que se declare de tipo tendr asignado siempre uno de los dos valores, o verdadero o falso, y ocupa un solo byte de memoria RAM. program lgica; var op : bool ean; begi n op : = 2< 3; { op t oma el val or de True} I f op t hen Writ e( ' ver dader o! 2 es menor que t res' ) else write('El computador est loco!'); end. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 41 de 188 En el ejemplo anterior se le asigna a Op un valor lgico que depende de la evaluacin que se haga de ver si 2 es menor que 3. Como efectivamente es menor entonces se le asigna el valor de TRUE a op, y al evaluarlo en el si condicional (I f) ejecuta la sentencia que est del lado del entonces (then en algunos lenguajes), de lo contrario algo raro andar pasando con su computador. La estructura ms sencilla de definir es un subconj unto de datos tipo ordinal, esta estructura recibe el nombre de subrango. Si se escogen dos valores vlidos, estos dos valores ms todos los que queden entre los dos, forman el subrango de datos. Los datos que queden entre los datos definidos como inicio y final, corresponden a los datos que estn entre esos dos valores en la tabla ASCll. Por ejemplo los siguientes son datos tipo subrango. Type Maysculas = 'A' .. 'Z'; Minsculas = 'a' .. 'z'; NumLiteral = '0' .. '9' NumDigito = 0 .. 9 En el caso anterior, se est definiendo una estructura Maysculas que tiene definidos caracteres que son A, B, C, D, E....Z; otra estructura Minsculas que tiene definidos caracteres que son a, b, c, d, e, f, g, h.....z y as sucesivamente. Cuando se declaran subrangos con apstrofes, se est indicando que se trata de caracteres (Char), si se quitan los apstrofes se tratar de nmeros, caso del tipo NumDigito. Un tipo enumerado se puede considerar como un tipo ordinal definido por el programador. Consiste en una lista de datos cuyos nombres no se pueden repetir. En el caso anterior es fcil declarar rangos porque ya est n predefinidos en un cdigo llamado ASCll, pero cuando se trate de otro tipo de datos, se hace necesaria su enumeracin. Ej.: resulta difcil declarar una variable para que tome como valores las frutas que estn entre Mora .. Tomate; realmente no se podra. Para ste caso se hace necesario enume rar todos los valores que puede tomar esa variable. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 42 de 188 Type fruta = (anon, mango, meln, mora, fresa, limn, naranja); color= (rojo, naranja, amarillo, verde, violeta, azul, negro); La lista que forma un tipo enumerado se da siempre entre parntesis LENGUAJE C+ + Los tipos de datos bsicos definidos por C son caracteres, nmeros enteros y nmeros en coma flotante. Los caracteres son representados por char, los enteros por short, int, long y los nmeros en coma flotante por float y double. Los tipos bsicos disponibles y su tamao son: TIPO DESCRIPCION TAMAO EN BlTS Char Carcter (normalmente 8 bits) Short Entero corto con signo (normalmente 16 bits) Int Entero con signo (depende de la implementacin) Unsi gned Entero sin signo (depende de la implementacin) Long Entero largo con signo (normalmente 32 bits) Float Flotante simple (normalmente 32 bits) Double Flotante doble (normalmente 64 bits) Posibles combinaciones de los tipos b sicos de datos en lenguaje C y los modificadores con los tamaos y rango de bits comunes se muestran en la siguiente tabla. Algunos de ellos pueden ser alterados por los modificadores short, signed, unsigned, long. Si se utiliza un modificador Short se antepone al modificar %h, Si se utiliza el modificador long %l, Para el unsigned el modificador %u. El uso incorrecto de los modificadores %d y %u, dar que los valores asignados a los identificadores pueden ser modificados. La palabra unsigned en realidad es un modificador aplicable a tipos enteros, aunque si no se especifica un tipo se supone int. Un modificador es una palabra clave de C que indica que una variable, o funcin, no se comporta de la forma normal. Hay tambin un modificador signed , pero como los tipos son por defecto con signo, casi no se utiliza. Las variables son definidas utilizando un identificador de tipo seguido del nombre de la variable. float cels, farh; int A,B; unsigned int x,y; long double a,b; ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 43 de 188 Modificador Tipo Tam en Bits Rango Lect Escr Char 8 -128..127 %c %c Unsigned char 8 0..255 Signed char 8 -128..127 I nt 16 -32768..32767 %d %i %d %i unsigned int 16 0..65535 short int 16 -32768..32767 %hd %hd unsigned short 16 -32768..32767 %d %d unsigned short 16 0..65535 %u %u unsigned short int 16 0..65535 %u %u long int 32 -2,147,483,648..2,147,483,647 unsigned long int 32 0..4,294,967,295 %lu %lu float 32 3.4E-38..3.4E+38 %f %f double 64 1.7E-308..1.7E+308 %lf long double 80 3.4E-4932..1.1E+4932 %Lf %Lf Bool 1 True o false Hay que aclarar que si se define una variable tipo y se usa el modificador st r ing, sta variable puede almacenar cadenas de caracteres. Solo los tipos de datos y aceptan nmeros con punto flotante (valores con fracciones decimales), en tanto que los otros tipos manejan nicamente enteros. Aunque es valido asignar un valor que contenga una fraccin decimal a un dato de tipo , dicha fraccin se elimina y solo se asigna la parte entera. Ejemplos de declaracin de variables son: x,y; int y,k,a; x,y; w=10; Se puede al momento de declarar una variable asignarle un valor cualquiera, En el ejemplo anterior se declara la variable w de tipo entero y de una se inicializa con un valor igual a 10. Las variables en lenguaje C se declaran como locales a procedimientos o funciones y globales en el encabezado del programa. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 44 de 188 LENGUAJE TURBO PASCAL NOMBRE RANGO TAM FORMATO (desde - hasta) (Byte) I nteger -32.768..32.767 2 Entero con signo Word 0..65.535 2 Entero sin signo Shortint 128..127 1 Entero corto con signo Byte 0..255 1 Entero corto sin signo Longint -2.147.483.648..2.147.483.647 4 Entero largo con signo NOMBRE RANGO TAM CI FRAS (desde - hasta) Bytes SI GNI FI CATI VAS Real 2.9 e 39 1.7 e 38 6 11-12 Single 1.5 e 45 3.4 e 38 4 7-8 * Double 5.0 e 324 1.7 e 308 8 15-16 * Extended 1.9 e 4851 1.1 e 4932 10 19-20 * Comp -9.2 e 18 9.2 e 18 8 18-19 * Solo disponible con un coprocesador matemti co 80x87 o en ni vel de copr ocesador si mul ado. Los tipos de datos reales diferentes al real, solo se pueden usar cuando existe u coprocesador matemtico o una emulacin del mismo mediante el uso de las directivas $N+ y $E-. Lo anterior gracias a que Turbo Pascal a partir de la versin 5.0 emula en software el chip coprocesador matemtico permitiendo utilizar los diferentes tipos de datos reales para ejecutar aplicaciones en mquinas que no posean este chip coprocesador. Ejemplos de la forma como se declaran los datos en Turbo pascal. Var X :char; Y :string(10); A :byte; B,c :integer; D :double; E :extended; ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 45 de 188 VI SUAL BASI C: Posibles combinaciones de los tipos bsicos de datos en basic y todos sus sucesores hasta visual basic y los modificadores con los tamaos y rango de bits comunes. Los tipos bsicos de datos en lenguaje son: lnteger, long, single, double, currency, string, byte, boolean, date, object y variant Ti po Tam byt e Rango Ti po Car ac Byte 1 0..255 I nteger 2 -32768..32767 % Long 4 -2147483648..2147483647 & Single 4 -3.4E+38..3.4E+38 Double 8 -1.79E-308..1.79E+308 Currency 1 -22337203685477.58..922337203685477.58 String 2 0..65535 $ Boolean 2 True o False Date 8 1/ enero/ 100 .. 31/ diciembre/ 9999 Object 4 cualquier referencia a objeto Variant 16 con nmeros, 22 con caracteres Ejemplos de declaracin de variables son: Dim X as integer Dim X as byte Dim X as double, Y as string La declaracin de variables en las versiones de Visual Basic se hacen locales a Objetos, generales a Formas o Globales a Proyectos. Las variables globales comparten variables entre formas diferentes que contenga el proyecto. En las dems versiones de Basic anteriores se declaran generales a todo el programa que se desarrolle. En Matlab se manejan casi los mismos datos que manejan en el lenguaje C. Para saber que tipo de formato se puede usar, simplemente digite en el prompt del MatLab la instruccin y enter ( ). Se mostrar una pantalla con informacin sobre formatos utilizados en MatLab. help format FORMAT Set output format. All computations in MATLAB are done in double precision. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 46 de 188 FORMAT puede ser usado para escoger entre diferentes formatos de salida como sigue; FORMAT Por defecto, es lo mismo que short. FORMAT SHORT formato de punto fijo con 5 dgitos. pi ans = 3.1416 FORMAT LONG formato de punto fijo con 15 digitos. pi ans = 3.14159265358979 FORMAT SHORT E formato de punto flotante con 5 dgitos. pi ans = 3.1416e+000 FORMAT LONG E formato de punto flotante con 15 dgitos pi ans = 3.141592653589793e+000 FORMAT SHORT G Best of fixed or floating point format con 5 digitos. pi ans = 3.1416 FORMAT LONG G Best of fixed or floating point format con 15 digitos. pi ans = 3.14159265358979 FORMAT HEX formato Hexadecimal pi ans = 400921fb54442d18 FORMAT + los smbolos +, - y blank son impresos para elementos positivos, negativos y zero. Partes imaginarias son ignoradas. FORMAT BANK formato fijo para dlares y centavos. pi ans = 3.14 FORMAT RAT Aproximacin por fraccionarios de enteros pequeos. pi ans = 355/ 113 El format RAT da el fraccionario mas aproximado al valor expuesto. En este caso el valor de . No olvide que a pesar de que ac se escribe en maysculas cuando use el MatLab deber escribir las funciones en minscula. Spacing: FORMAT COMPACT Suppress extra line-feeds. FORMAT LOOSE Puts the extra line-feeds back in. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 47 de 188 La principal razn para que las personas aprendan lenguajes de programacin es utilizar la computadora como una herramienta para la resolucin de problemas. Dos fases pueden ser identificadas en este proceso. 1. Fase de resolucin del problema 2. Fase de implementacin en una microcomputadora El resultado de la primera fase es el diseo de un algoritmo para resolver el problema. Un algoritmo se puede considerar como el conj unto de instrucciones que conducen a la solucin de un problema determinado. Dichas instrucciones deben tener una secuencia lgi ca para poder llegar a la solucin real. El algoritmo se puede expresar de diversas maneras. Mediante smbolos, utilizando un lenguaje determinado para hablar la solucin, describir sintticamente dicha solucin o simplemente escribindolo en cualquier c digo valido para algn lenguaje de programacin. La ltima forma de descri bir el algoritmo es a lo que se le denomina PROGRAMA. El diseo de programas no es tarea difcil. Un programa se construye teniendo en cuenta dos cosas que me facilitan cualquier lenguaje de programacin: Las Estructuras de Programacin y las Estructuras de Datos. La utilizacin eficiente de cada una de las estructuras antes mencionadas permiten dar solucin a cualquier problema que se desee resolver. En este libro se tratar con profundidad las estructuras de programacin y se utilizara algunas estructuras de datos que sean necesarias para la solucin de los ejemplos que se resuelvan. (Bsicamente tienen que ver con variables simples y arreglos) En la fase de resolucin de cada uno de los ejemplos se incluyen etapas as: 1. Anlisis del problema 2. Diseo del algoritmo Diagrama de flujo Seudo lenguaje Cdigo Pascal Lenguaje C++ 3. Verificacin o prueba de escritorio ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 48 de 188 Un diagrama de flujo es un dibuj o que utiliza smbolos estndar de diagramacin de algoritmos para computador, en el que cada paso del algoritmo se visualiza dentro del smbolo adecuado y el orden en que estos pasos se ejecutan. Se indica su secuencia conectndolos con flechas llamadas lneas de flujo porque indican el flujo lgico del algoritmo. En esencia el diagrama de flujo es un medio de presentacin visual y grfica de flujo de datos, a travs de un algoritm o, las operaciones ejecutadas dentro del sistema y la secuencia en que se ejecutan. Se puede decir tambien que un diagrama de flujos o un organigrama es una representacin semigrfica del algoritmo en cuestin. Esto facilita la visin descriptiva de la ejecucin del programa, as como la generacin de la traza del algoritmo. Se denomina traza de un algoritmo a la ejecucin manual de un programa obteniendo para cada paso un resultado. Los smbolos utilizados en los diagramas han sido normalizados por las organizaciones ANSI (American National I nstitute) y por I SO (I nternational Standard Organization) aunque el uso de esos Estndar es voluntario. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 49 de 188 ScMBOLOS UTlLlZADOS EN LA CONSTRUCClcN DE DlAGRAMAS DE FLUJO Para iniciar y Terminar un algoritmo Para representar un proceso Para toma de decisiones: Smbolo utilizado tanto en decisiones como en estructuras cclicas Para representar entrada de datos Para representar salidas de datos lndican la direccin de flujo en un diagrama, adems conecta todos los smbolos del diagrama Conector entre diagramas Conector dentro de un diagrama ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 50 de 188 Desde que las ideas de Knuth, Dijkstra y Wirth fueron consolidadas en el campo informtico, las reglas para la construccin de algoritmos han ido variando constantemente y de igual forma los lenguajes de programacin, en general se han ido adaptando a estas reglas o tcnicas de programacin. Las reglas que se deben considerar en una buena programacin son: 1. Disear algoritmos en etapas yendo de lo general a lo particular (mtodo descendente) 2. Dividir el algoritmo en partes independientes -mdulos- y tratar cada mdulo independientemente. 3. Establecer y utilizar la solucin de problemas tcnicas de programacin estructuradas 4. Dar especial importancia a las estructuras de datos 5. Describir completamente cada algoritmo 6. Verificar o realizar la prueba de escritorio a cada algoritmo desarrollado. Un programa puede ser considerado como el conjunto de Est ruct ur as de dat os mas el conj unto de Estructuras de programacin ms el Encabezado que exige cada lenguaje en particular. La programacin estructurada es el conjunto de tcnicas para desarrollar programas fciles de escribir, verificar, leer y mantener Se puede concretar mas la definicin diciendo que la programacin estructurada es el conjunto de tcnicas que incluye: Un nmero limitado de estructuras de programacin Diseo descendente Descomposicin modular con independencia de los mdulos El teorema de Bohm y Jacopini establece que un programa propio puede ser escrito utilizando solo tres tipos de estructuras de control: Secuencial Selectiva Repetitiva Hoy me atrevera a decir que un programa propio puede ser escrito utilizando lo siguiente: ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 51 de 188 Declaraciones: Libreras de inclusin Declaracin de funciones y/o procedimientos Definicin de constantes y/o variables Estructuras de programacin: Asignacin Decisin Cclicas De seleccin mltiple Estructuras de datos: Estticas simples Dinmicas Registros Arreglos Archivos Funciones: Predefinidas por el lenguaje Definidas por el usuario. Generalmente cuando el algoritmo o solucin de un problema determinado se deja en trminos de diagrama de flujo, Seudo lenguaje e incluso en Seudo cdigo se puede trabajar nicamente con estructuras de programacin. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 52 de 188 Tambin llamadas estructuras de control por algunos autores. Son aquellas que le permiten a un usuario ejecutar tareas que a la final le permiten dar solucin a problemas que se quieran resolver usando microcomputadoras. En general se puede decir que las estructuras de programacin son herramientas que el lenguaje le provee al usuario para solucionar problemas haciendo uso de computadoras. Las estructuras de programacin que tienen la mayora de los lenguajes son cuatro as: Estructuras de Asignacin Estructuras de Decisin Estructuras Cclicas Estructuras de Seleccin mltiple. Esta estructura se conoce tambin como sentencia en algunos lenguajes estructurados. Las estructuras de asignacin, son utilizadas en el cuerpo de programa, procedimientos esclavos o funciones. Una estructura de este tipo consiste en la asignacin de una expresin a un identificador (comnmente llamado variable) vlido en un lenguaje de programacin. La parte de esta estruc tura solamente puede estar ocupada por una variable. Toda variable, literal o constante aparecer formando la expresin al lado derecho. Variable = Expresin La expresin ms simple consiste en un solo concepto: una simple variable, constante literal, constante numrica o constante simblica. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 53 de 188 Pl Constante simblica definida por algunos lenguajes. '20' Constante literal definida por el usuario. 20 Constante numrica definida por el usuario. l Variable definida de algn ti po ofrecido por los lenguajes. Las complejas consisten en expresiones simples conectadas o relacionadas con operadores bien sean matemticos o relacionales. Ejemplos: A + B (A + B) * (C + B) Oper adores Un operador es un smbolo que le da instrucciones al lenguaje de programacin para que ejecute alguna operacin, o accin, en uno o ms operandos. Un operando es algo sobre lo cual acta un operador (podra considerarse como una expresin) Permite evaluar una expresin y calculado su valor guardarlo en una posicin de memoria asignando dicho valor al nombre de una variable. Dicho de otra manera, el valor calculado de la expresin queda refe renciado a la variable a la cual se le asigna. La forma general de uso es: Lenguaj e C Lenguaj e Pascal Variable = Expresin lenguaje C Variable:= Expresin en Pascal. X = Y X := Y En un programa codificado en algn lenguaje, la estructura de asignacin del ejemplo anterior no significa que X es igual a Y. En cambio significa "asigne el valor de Y a X". ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 54 de 188 En cualquier lenguaje de programacin el lado derecho representa cualquier expresin y el lado izquierdo debe ser un nombre de variable declarado previamente y valido en el lenguaje de programacin. Los distintos operadores permiten formar expresiones tanto aritmticas como lgicas. Los operadores aritmticos y lgicos son: +, - Suma, resta ++, -- Incremento, decremento (Operador Unario) *, /, % Multiplicacin, divisin, mdulo >>, << Rotacin de bits a la derecha, izquierda. & AND booleano | OR booleano ^ EXOR booleano ~ Complemento a 1 ! Complemento a 2, NOT lgico ==, != Igualdad, desigualdad &&, || AND, OR lgico <, <= Menor, menor o igual >, >= Mayor, mayor o igual En estos operadores deben tenerse en cuenta la precedencia de operadores y las reglas de asociatividad, que son las normales en la mayora de lenguajes. Adems hay toda una serie de operadores aritmticos con asignacin, como pueden ser += y ^ =. Cada lenguaje en particular involucra otra serie de operadores tales como: Basic: ^ : Exponenciacin Lenguaje C: ++ : I ncremento en uno - - : Decremento en uno ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 55 de 188 % : Mdulo: Toma la parte residuo de una divisin: Ej: Si se divide 11 entre 4 da de resultado 2 y sobra de residuo 3. Si se hace X=11%3 entonces X tomar el valor residuo de 3. El siguente ejemplo realizado en codigo C, muestra algunas formas de utilizacin de operadores y sus respectivos valores o incidencias sobre variables segn el caso. # include <stdio.h> void main() { int a,b,c,suma,producto,division,modulo; /* Sentencias de asignacin */ a = 2; / * Se asigna el valor de 2 a la variable a * / a = a+2; / * ahora a vale 4 * / b = 2* a+1; / * b se le asigna el valor de 9 = (2* 4+1) * / / * Operaciones * / /* Se escribir en la siguiente instruccin el valor de 13 */ suma = a+b; printf("Resultado suma = %d\n", suma); /* Se escribir en la siguiente instruccin el valor de 36 */ producto = a* b; printf("Resultado producto = %d\n", producto); division = b/ a; /* Se escribir en la siguiente instruccin el valor de 2 */ printf("Resultado division entera = %d\n", division); / * Escribe la parte entera porque se trata de variable que han sido definidas como enteras * / modulo = b%a; /* Se escribir en la siguiente instruccin el valor de 1 */ printf("Resultado modulo = %d (%d)\n", modulo, b - (b/a)*a); / * Escribe la parte del residod e vivir 9 entre 4 o sea 1. I gualmente porque se trata de variables que han sido definidas como enteras * / /* Asignacin + Operacin */ a * = b; / * a = a* b * / a / = b; / * a = a/ b * / a += b; / * a = a+b * / a -= b; / * a = a-b * / ++a; a++; / * a = a+1 * / --a; a--; / * a = a-1 * / / * Operaciones Unarias * / b = ++a; / * I ncremento antes de asignacion * / c = a++; / * I ncremento despues de asignacion * / b = --a; / * Decremento antes de asignacion * / c = a--; / * Decremento despues de asignacion * / } La operacin Unaria (lnremento o Decremento) antes de la asignacin hace que se cambie el valor de la variable antes de ser asignada. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 56 de 188 Por ejemplo si a vale 3 y realizamos la asignacin b=++a; entocnes b queda con el valor de 4, y si se asigna a c=--a, entonces c vale 2. Las siguientes instrucciones realizan exactamente lo mismo: A = A +1; A + = 1; A++; ++A; Lenguaje pascal Mod : Para tomar la parte residual de una divisin. Similar al % del C. Div : Para tomar la parte entera de una divisin. Adems de los operadores citados, comunes a otros lenguajes de programacin, C utiliza tambin, el operador sizeof(), que le permitir conocer la longitud, en bytes, que un tipo de dato ocupa en memoria. As, por ejemplo; sizeof(variable) Devolver 2 si la variable ha sido definida de tipo entera (int), 4 si la variable ha sido declarada de tipo real (float) y as sucesivamente para todos los tipos manejados por C. El valor devuelto por sizeof() depende del compilador utilizado; no obstante, este operador que se puede utilizar con variables predefinidas por el sistema o definidas por el usuario, asegura la portabilidad del programa entre sistemas. Anlogamente: sizeof(tipodedato) Retornar un valor que corresponder al espacio reservado por el compilador para el tipo de dato especificado en el momento de compilar el programa. Asi: sizeof(float) Devolver 4 que, como se puede observar en la tabla de tipo de datos, el valor corresponde al nmero de bytes que se reservan en memoria para cada variable que se declare del tipo de dato float. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 57 de 188 El lenguaje C se diseo para sustituir en muchos trabajos al lenguaje ensamblador. Por ello, soporta un juego completo de operadores capaz de manejar los datos al nivel de bits. Las operaciones al nivel de bits soportan solamente los datos de tipo caracter (char) y entero (int) con sus variantes. Son los siguientes: & AND binario | OR binario (ascii 124) ^ XOR binario (ascii 94) ~ NOT binario (tilde, ascii 126) >> Desplazamiento de bits a derecha << Desplazamiento de bits a izquierda Los operadores AND OR y NOT se comportan igual que los anteriormente definidos pero al nivel de bits. La tabla de verdad de estos operadores es la siguiente. X Y X&Y X/ Y X^ Y ~ X 0 0 0 0 0 1 0 1 0 1 1 1 1 1 1 1 0 0 1 0 0 1 1 0 Los operadores de desplazamiento de bits mueven todos los bits de una variable a la izquierda o a la derecha un nmero fijo de posiciones segn se especifique. Los formatos de estas instrucciones son los siguientes: NombreVariable>> NumeroPosicionesDerecha En una expresin que contiene mas de un operador aritmtico diferente el computador evala dicha expresin de acuerdo a la siguiente jerarqua de operadores. = Jerarqua ms baja + - / * % mod div Negacin (-), ++, - - ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 58 de 188 Exponenciacin Jerarqua ms alta La tabla anterior indica que la primera operacin aritmtica que realiza, sera la exponenciacin, luego la operacin de negacin y las operaciones unarias del lenguaje C, luego la multiplicacin y/o la divisin, luego las sumas y las restas y por ltimo la asignacin quien tiene la jerarqua mas baja, es decir que seria la ultima operacin que realizara la computadora. Cuando en una expresin existen operadores de igual jerarqua la computadora los resuelve de izquierda a derecha. Si la expresin contiene agrupadores (o sea parntesis), se destruye primero los parntesis resolviendo lo que est dentro de ellos y luego seguir resolviendo las operaciones de acuerdo a lo descrito anteriormente. Ejemplo: X = 3 La expresin anterior es sencilla. Consta tan solo de una variable X definida de un tipo entero y una expresin constante igual a tres. En el ejemplo anterior se tiene un solo operador, por tanto el microprocesador asigna el valor de 3 a la variable X. Visto simblicamente se puede representar en un rbol de la siguiente manera Para tener una mejor idea del orden en que efecta cada una de las operaciones en una estructura de asignacin es necesario identificar el tipo de notacin con la cual trabaja el microprocesador. Es la notacin con la cual escribimos todas las expresiones. En esta notacin los operadores estn entre los operandos Si se realiza el recorrido en el rbol de l ejemplo anterior se puede decir que la expresin estara escrita en notacin infija haciendo el siguiente recorrido: I z - Ce - De o sea X = 3 = 3 X I Ce De ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 59 de 188 Es la notacin que utiliza el microproce sador para resolver todas las expresiones que se asignen a una variable en una estructura de asignacin o simplemente al solucionar una expresin. En esta notacin los operadores estas despus de los operandos. Si se realiza el recorrido en el rbol de l ejemplo anterior se puede decir que la expresin estara escrita en notacin postfija haciendo el siguiente recorrido: lz - De- Ce o sea X 3 = (Expresin en notacin Postfija) X = 3 + 5 La expresin anterior consta de dos partes. Una variable X a la cual se le asignar (=) la expresin de la derecha. Antes de asignar un valor a la variable X el computador tendr que resolver dicha expresin (3 + 5). En el ej emplo anterior el microprocesador ej ecuta primero la suma y el resultado lo asigna por ultimo a la variable X. Visto simblicamente, la estructura de asignacin se puede representar en un rbol de la siguiente manera Si la expresin de la derecha, o sea 3+5 se hace igual a W. Se puede representar el rbol del ejemplo de la siguiente manera: X + 3 5 = + 3 5 = W X = W ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 60 de 188 Si se expresa el anterior rbol en notacin infija se tendr: X= W Si se representa en notacin postfija se tendr : X W = Quiere decir lo anterior, que primero se resolver la expresin W y luego se asignar el valor encontrado en dicha evaluacin a la variable X. Ahora si se resuelve el rbol de la expresin se tendr: Notacin infija Notacin postfija W = 3 + 5 W = 3 5 + Tomando toda la expresin se tendr entonces: Notacin infija Notacin postfija X = 3 + 5 X 3 5 + = Observando la ltima expresin, se notar que el microprocesador evaluar en notacin postfija la estructura de asignacin y los operadores los ejecuta de izquierda a derecha operando los dos operandos inmediatamente anteriores, o sea que sumar 3 y 5 y dicho valor (8), lo asignar a X. Si se tiene la expresin X = A + B / C * E + F / G * H y se asigna al identificador W la expresin A + B / C * E + F / G * H, la estructura de asignacin se puede representar de la siguiente manera: En la expresin W = A + B / C * E + F / G * H, se tienen varios operadores repetidos, caso particular la suma (+) que est presente dos veces. Si al identificador Y se le asigna la expresin B / C * E y al identificador Z se le asigna la expresin F / G * H , la expresin inicial puede escribirse entonces de la siguiente manera. X = A + Y + Z Tenga en cuenta que si hay operadores de igual jerarqua el microprocesador los resuelve de izquierda a derecha. X = W ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 61 de 188 Al representar esta expresin en un rbol se tendr lo siguiente: Si se hace el recorrido en notacin postfija al rbol que representa la expresin anterior quedar de la siguiente manera: X A Y + Z + = En el rbol anterior se puede observar que las operaciones se realizan de abajo hacia arriba o sea que primero se realiza la suma de A con Y. A este resultado se le suma el valor de Z y por ltimo se asigna dicho valor a la variable X. Donde Y y Z representan las expresiones: Y = B / C * E Z = F / G * H Si se involucran las expresiones Y y Z definidas anteriormente, el rbol quedar de la siguiente manera: X = + + Z A Y X = + + A * / E B C * / H F G ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 62 de 188 Si se hace el recorrido al rbol en notacin postfija, la expresin quedar de la siguiente manera: X A B C / E * + F G / H * + = Para pasar de notacin infija a notacin postfija, la mquina utiliza la teora de colas para dicho trabajo. Se utiliza para tal efecto las listas de pila y cola. Las pilas es la teora de manejo de datos en donde el ltimo dato que ingresa a la lista, es el primer dato que sale de ella (Last I n First Out - LI FO) y las colas es la teora de manejo de informacin en donde el primer dato en entrar, es el primer dato en salir. (First I n First Out - FI FO). Teniendo en cuenta lo anterior se trabajar de la siguiente manera para realizar el traslado de una expresin en notacin infija a notacin postfija. Cada uno de los operandos y operadores se van almacenando en un a lista de cola de entrada (LlFO). Una vez los datos ah entonces se empiezan a pasar cada uno de los trminos as: Cada operando pasar directamente a la cola de salida y cada operador pasa a una pila de espera de operadores. Hay que tener en cuenta que cuando un operador llega a la pila de operadores, dicho operador desplaza a la cola de salida todos aquellos operadores que sean de igual o mayor jerarqua. "Ver jerarqua de operadores". Todo operador debe esperar en la pila de operadores, es decir el operador que llega de la lista de cola de entrada, necesariamente debe esperar en la lista de pila de operadores. Retomando el ejemplo anterior se tendr lo siguiente: Lista de cola de ENTRADA (FI FO) : X = A + B / C * E + F / G * H Cab Cola Los identificadores " Cab" y " Col a" indican los elementos que se encuentran en la Cabeza "primer elemento en entrar" y Cola "ltimo elemento en entrar" respectivamente de la Lista de cola en referencia. En el caso de la Lista de Pila el elemento que se encuentra listo a salir "ltimo en entrar" ser apuntado por el identificador Tope. En teora de Colas el elemento que est en la cabeza, fue el primer elemento en entrar a la lista y el elemento que est en la cola, fue el ltimo elemento que entr en dicha lista. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 63 de 188 Si se pasan los dos primeros elementos de la lista de entrada, es decir el operando " X" a la lista de cola de salida y el operador " = " a la lista de pila de espera de operadores, las listas quedarn as: Lista de cola de ENTRADA (FI FO) : A + B / C * E + F / G * H Cab Cola Pila de espera (LI FO) : = TOPE Lista de cola de SALI DA (FI FO) : X Cab Cola Para este primer paso, el operando "X" pas directamente a la cola de salida. En estos momentos por ser el nico elemento que existe en la lista de cola de salida, es considerado como cabeza y cola de la misma. Y el operador "=" paso a la pila de espera (es de anotar nuevamente que todo operador debe hacer espera en la pila de operadores). Un segundo par de elementos de la cola de entrada sern enviados a la cola y pila de salida as: " A +" Lista de cola de ENTRADA (FI FO) : B / C * E + F / G * H Cab Cola Pila de espera : + = TOPE ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 64 de 188 El operador (+) que lleg a la pila de espera de operadores, no desplaz el operador "=" que estaba en el tope de la pila, porque dicho operador "=" es de menor jerarqua que el operador "+". Lista de cola de SALI DA (LI FO) : X A Cab Cola Observando lo anterior, en la cola de salida hay dos operandos "X A" y en la pila de espera dos operadores "+ =". Un tercer par de elementos de la cola de entrada sern enviados a la cola y pila de salida as: "B /" Lista de cola de ENTRADA (FI FO) : C * E + F / G * H Cab Cola Pila de espera : / + = TOPE El operador que lleg a la pila de espera no desplaza ningn operador de ella ya que los que se encuentran a la espera son de menor jerarqua. Lista de cola de SALI DA (LI FO) : X A B Cab Cola Un cuarto par de elementos de la cola de entrada sern enviados a la cola y pila de salida as: Lista de cola de ENTRADA (FI FO) : E + F / G * H Cab Cola Pila de espera : * + = TOPE Lista de cola de SALI DA (LI FO) : X A B C / Cab Cola ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 65 de 188 Al llegar a la pila de espera el operador (* ) desplaza a la cola de salida al operador (/) que se encontraba en el tope de la pila porque es de igual jerarqua. Un quinto par de elementos de la cola de entrada sern enviados a la cola y pila de salida as: Lista de cola de ENTRADA (FI FO) : F / G * H Cab Cola Pila de espera : + = TOPE Lista de cola de SALI DA (LI FO) : X A B C / E * + Cab Cola Al pasar de la cola de entrada el operador "+" a la pila de espera, este desplaza a la cola de salida los operadores "* " y "+" que se encuentran en el tope de la pila ya que son de mayor e igual jerarqua respectivamente. Primero desplazar el operador "*" y por ltimo desplaza al operador "+". Si se contina pasando par de elementos hacia las respectivas listas se tendr lo siguiente: Lista de cola de ENTRADA (FI FO) : G * H Cab Cola Pila de espera : / + = TOPE Lista de cola de SALI DA (LI FO) : X A B C / E * + F Cab Cola El operador (/) pas a la pila de espera. El no desplaza ningn operador porque el que est en el tope de la pila es de menor jerarqua. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 66 de 188 Lista de cola de ENTRADA (FI FO) : H Cab Cola Pila de espera : * + = TOPE Lista de cola de SALI DA (LI FO) : X A B C / E * + F G / Cab Cola Ahora nos queda tan solo un operando en la lista de cola de entrada. Al pasar a la cola de salida y quedar vaca la lista de cola de entrada, se procede a vaciar la lista de pila de operadores en su orden. primero saldrn los ltimos que entraron as: Lista de cola de SALI DA (LI FO) : X A B C / E * + F G / H * + = Cab Cola ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 67 de 188 PLANTEAMlENTOS Y EJECUClcN DE PROGRAMAS Cuando se inicia en el fascinante mundo de la programacin de computadoras, es necesario a la hora de construir algoritmos primero que todo intentar plantear al nivel de smbolos dicha solucin. A la construccin con los smbolos indicados es a lo que se conoce con el nombre de Diagrama de flujo. Recuerde que un algoritmo es la secuencia lgica de pasos que se sigue en la solucin de un problema determinado. En los siguientes ejercicios se ver la forma de aplicar la simbologa de los diagramas de flujo en la solucin de problemas de tipo matemtico sencillos. Aunque parezcan sencillos es una manera de adentrar un poco en el conocimiento de la diagramacin estructurada. En dichos ejercicios se utilizarn funciones que permitan la entrada de datos por el teclado como medio estndar de entrada de datos de la mquina y funciones que me permitan manejar la pantalla como medio de salida mas utilizado en las computadoras para presentar informacin. Adicional a las funciones de entrada y salidas de datos se utilizar la Estructura de asignacin en la solucin de pequeas expresiones de tipo matemtico. En los siguientes ejercicios se realiza el diseo de algoritmos al nivel de diagrama de flujo, Seudo lenguaje, Seudo cdigo y C digo en el lenguaje Pascal, C y alguno bajo MatLab, que dan solucin a cada una de las preguntas planteadas. 1. Desarrolle un algoritmo que le permita leer dos valores en las variable A y B, y le permita escribir el resultado de la suma de los dos. Anlisis: Para dar solucin a este ejercicio es necesario realizar tres tareas: Leer los valores que para el caso concreto del ejemplo son dos (2), Calcular la suma de dichos valores y por ltimo escribir el resultado obtenido de dicha suma. Cada una de las tareas planteadas se enmarca dentro de un smbolo utilizado en diagramacin as: La lectura de cada dato desde el teclado se almacenar en variables, una guardar el primer valor que para el desarrollo se ha identificado con el nombre A y la otra el guardar el segundo valor que se ha denominado o identificado con el nombre B (estas operaciones se representarn en el smbolo de lectura. Tambin se puede representar cada operacin en smbolos aparte). ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 68 de 188 El clculo de la suma se realizar y su valor ser almacenado en la variable identificada como C (esta operacin se representar en el smbolo de proceso) y por ltimo, el valor de resp uesta almacenado en la variable C, ser escrito en la pantalla (esta operacin se representa en el smbolo de escritura). Vea el diagrama siguiente. Diagrama de Flujo Seudo lenguaje Seudo cdigo I nicio Leer(A,B) C=A+B Escribir(C) Fin Cdigo Turbo Pascal: Cdigo Lenguaje C++: pr ogr am cuadr ado; # i ncl ude " coni o.h" uses cr t ; # i ncl ude " st di o.h" var A,B,C:r eal ; i nt A,B,C; Begi n mai n( ) cl r scr ; { got oxy( 10,10) ; cl r scr( ) ; write( Digite un nmero entero A ); gotoxy(10,10); readln(A); printf("Digite un nmero entero "); got oxy( 10,11) ; scanf ( " % d" ,&A) ; write( Digite un nmero entero B ); gotoxy(10,11); readln(B); printf("Digite un nmero entero "); C: = A+ B; scanf ( " % d" ,&B) ; got oxy( 10,12) ; C= A+ B; write( La suma es: ,C); gotoxy(10,12); r epeat unt i l keypr essed; pri nt f ( " La suma es: % d " ,C) ; get ch( ) End } INICIO A,B C=A+B C FIN I nicio Leer un valor y guardarlo en la variable A y leer un segundo valor y guardarlo en el identificador B Realizar la suma de A con B y guardar su valor en la variable C Escribir el valor de C Fin ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 69 de 188 En el ejercicio anterior se hubiera podido escribir directamente el valor de la suma sin necesidad de almacenarlo previamente en la variable C utilizando para ello la siguiente sentencia. Write(La suma es: ,A+B); gotoxy(10,12); Repeat unt i l keypr essed; pri nt f ( " La suma es: % d " ,A+ B) ; Tenga en cuenta que si lo hace de esta manera, no estar utilizando estructura de asignacin alguna. En el caso de que se desee realizar bajo cdigo MatLab, se digitan las instrucciones en la ventana del editor y se graba el archivo bajo un nombre en el directorio work de MatLab. En el caso del ejemplo se grab bajo el nombre . Una vez se haya salvado, se digita en el prompt del matlab el nombre bajo el cual fu grabado (eje1_libre) y se ejecuta automticamente lnea por lnea. 2. Desarrolle un algoritmo que le permita leer un valor entero, calcular su cuadrado y escribir dicho resultado. Anlisis: En el ejercicio planteado, se puede identificar como tareas a realizar tres, es decir cada una de las tres acciones solicitadas. Leer, Calcular y Escribir. Cada uno de los procesos mencionados se describen en smbolo respectivo quedando el diagrama de flujo de la siguiente manera. Es necesario aclarar que cada proceso corresponde a una estructura de Asignacin. En el caso del ej ercicio el calcular el cuadrado. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 70 de 188 Cdigo Turbo Pascal: Cdigo Lenguaje C++: # i ncl ude " mat h.h" Pr ogr am cuadrado; # i ncl ude " coni o.h" uses cr t ; # i ncl ude " st di o.h" var N,R: r eal ; i nt N,R; begi n mai n( ) cr scr ; { gt oxy( 10,10) ; cl r scr ( ) ; wite( Digite un nmero entero N); gotoxy(10,10); radln(N); printf("Digite un nmero entero N"); R= exp( 2* l n( N) ) ; scanf ( " % d" ,&N) ; got oxy( 10,12) ; R= pow( N,2) ; write( El cuadrado del numero es: ,R); gotoxy(10,12); r epeat unt i l keypr essed; pri nt f ( " El cuadr ado es: % d " ,R) ; get ch( ) end } Algoritmo: Diagrama de flujo Seudo lenguaje Seudo cdigo: I nicio Leer( N); R = Nl; Escribir (R) Fin En el caso de que se desee realizar bajo cdigo MatLab, se digitan las instrucciones en la ventana del editor y se graba el archivo bajo un nombre en el directorio work de MatLab. INICIO N R = Nl R FIN I nicio Leer un valor numrico entero y almacenarlo en la variable N. Calcular el cuadrado del nmero ledo, almacenado en la variable N, y su resultado almacenarlo en la variable R. Escriba el valor encontrado, ( ), que se encuentra almacenado en la variable R. Fin ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 71 de 188 En el caso del ejemplo se grab bajo el nombre . Una vez se tenga grabado se digita en el prompt del matlab dicho nombre y se da enter. El cdigo se ejecuta automticamente lnea por lnea. El valor de 5 es digitado por el usuario tan pronto se lo indique la computadora. 3. Desarrolle un algoritmo que le permita leer un valor para radio (R), calcular el rea (A) de un crculo A = Rl y escribir su valor. Anlisis: En el ejercicio se identifican como tareas las tres acciones solicitadas. Leer, Calcular y Escribir. Cada uno de los procesos mencionados se describen en el smbolo respectivo quedando el diagrama de flujo de la siguiente manera. Algoritmo: Diagrama de flujo: Seudo lenguaje: INICIO R A = *Rl A FIN I nicio Leer el valor del radio y guardarlo en la variable R Calcular el valor del rea aplicando la formula *Rl y almacenar dicho valor en la variable A Escribir el valor encontrado para el rea guardado en la variable A. Fin ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 72 de 188 Seudo cdigo: I nicio Leer( R) A = *Rl Escribir (A) Finalizar En el caso de que se desee realizar bajo cdigo MatLab, se digitan las instrucciones en la ventana del editor y se graba el archivo bajo un nombre en el directorio work de MatLab. En el caso del ejemplo anterior se grabaron las instrucciones bajo el nombre de archivo . Una vez grabado, se digita en el indicador del matlab dicho nombre y se pulsa la tecla enter. El cdigo se ejecuta automticamente lnea por lnea. El valor de 4 es digitado por el usuario tan pronto se lo indique la computadora. Al finalizar la ejecucin de las instrucciones aparece de nuevo el indicador indicando que puede continuar utilizando matlab. Cdigo Turbo Pascal: Cdigo Lenguaje C++: # i ncl ude " mat h.h" Program rea; #include "conio.h" Uses cr t ; Const pi = 3.1415926; # i ncl ude " st di o.h" Var R,A:r eal ; f l oat R, A; Begi n mai n( ) cl rscr ; { got oxy( 10,10) ; cl r scr ( ) ; write(Digite el valor de Radio R); gotoxy(10,10); r eadl n( R) ; pr i nt f ( " Di gi t e el Radi o R" ) ; A = pi * exp( 2* l n( R) ) ; scanf ( " % f " ,&R) ; got oxy( 10,12) ; A = pi * pow( R,2) ; write( El valor del rea es: ,A); gotoxy(10,12); repeat until keypressed; printf("El rea es: %f ", A); get ch( ) ; End. } ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 73 de 188 4. Determinar la hipotenusa de un tringulo rectngulo conocidas las longitudes de sus dos catetos. Desarrolle los correspondientes algoritmos. Anlisis: En el ejercicio se puede definir como tareas las tres acciones solicitadas. "Leer, Calcular y Escribir", Leer cada uno de los valores de los dos catetos y almacenarlos en cada uno de los identificadores definidos para el caso, calcular la hipotenusa aplicando la frmula correspondiente almace nando su valor en el identificador del caso y escribir el valor encontrado para la hipotenusa como respuesta. Cada una de las acciones se describen dentro del smbolo respectivo, quedan do el diagrama de flujo de la siguiente manera. Algoritmo: Cuando se requiere desarrollar operaciones matemticas tanto en el diagrama de fluj o como en el Seudo lenguaje se dejan planteadas tal y cual como se escriben normalmente de manera simblica. En el momento de codificar dicho algoritmo se traduce el smbolo a la funcin correspondiente en el lenguaje. Caso especfico del ejemplo anterior la raz cuadrada en cdigo es sqrt y el smbolo es el que conocemos " . Para el desarrollo del siguiente ejercicio se trabajar con las siguientes variables: CatA : Cateto del triangulo CatB : Cateto del triangulo Hip : Hipotenusa del triangulo Diagrama de flujo Seudo lenguaje INICIO CatA, CatB 2 2 CatB CatA Hip Hi p FIN I nicio Leer el valor de cada cateto y almacenarlo en la variable CatA y CatB Calcular el valor de Hip con la formula indicada Escribir el valor de la Hip Fin ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 74 de 188 Seudo cdigo En el seudo cdigo se dejan planteadas las operaciones tal y cual se hizo en el diagrama de flujo o en el seudo lenguaje. I nicio Leer(CatA,CatB) 2 2 CatB CatA HIP Escribir(Hip) Fin Cdigo Turbo Pascal: " programa que calcula el rea de un trin gulo rectn gul o conoci endo el val or de sus cat et os." program rea; uses cr t ; var Cat A,Cat B,HI P:r eal ; Begi n cl r scr ; got oxy( 10,10) ; write(Digite el valor CatetoA); r eadl n( Cat A) ; got oxy( 10,12) write(Digite el valor CatetoB); Readln(CatB); Hi p= ))) ln( * 2 exp( )) ln( * 2 (exp( CatB CatA sqrt got oxy( 10,14) ; write( El valor HlPOTENUSA= ,HlP); r epeat unt i l keypr essed; End. Cdigo Lenguaje C++: /* Programa que calcula el valor del rea de un tringulo rectngulo conociendo sus catetos */ # i ncl ude " mat h.h" # i ncl ude " coni o.h" # i ncl ude " st di o.h" f l oat Cat A,Cat B,HI P; mai n( ) { cl rscr ( ) ; got oxy( 10,10) ; pr i nt f ( " Di gi t e el val or Cat et oA" ) ; scanf ( &Cat A) ; got oxy( 10,12) ; pr i nt f ( " Di gi t e el val or Cat et oB" ) ; scanf ( &Cat B) ; ) 2 ) 2 , ( ( ) pow(CatB, CatA pow sqrt HIP got oxy( 10,14) ; pr i nt f ( " El val or de HI POTENUSA= % f " ,HI P) ; get ch( ) ; } ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 75 de 188 Para digitarlo en MatLab es necesario guardar el siguiente cdigo en el directorio Work de MatLab y ejecutarlo desde el prompt del MatLab digitando solo el nombre con el cual fue guardado. cat a=i nput ( ' Di gi t e el val or Cat et o A : ' ) ; cat b=i nput ( ' Di gi t e el val or Cat et o B : ' ) ; hi p=sqr t ( cat a^2+cat b^2) ; f pr i nt f ( 'El valor de HlPOTENUSA = %f \n' , hi p) ; Si necesita ayuda en el prompt digite help sqrt o help sym/ sqrt.m 5. Desarrolle un algoritmo que le permita leer un valor que represente una temperatura expresada en grados Celcius y convierta dicho valor en un valor expresado en grados Fahrenheit. Anlisis: En el ejercicio planteado, las tareas a realizar son: Leer, convertir y Escribir. Tareas: Leer la temperatura en grados Celcius Calcular la conversin a grados Fahrenheit Escribir el valor encontrado Algoritmo: Diagrama de flujo Seudo lenguaje INICIO C F = 9/5C + 32 F FIN I nicio Leer los grados centgrados y almacenarlos en la variable c Asignar a la variable f la conversin de grados centgrados a Fahrenheit dado por la frmula 9/5c+32 Escribir el valor de la variable f Fin ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 76 de 188 Seudo cdigo I nicio Leer(C) F = 9/ 5* C + 32 Escribir(F) Fin Al momento de definir el tipo de variables a utilizar, hay que tener en cuenta que en lenguaj e C cuando se divide dos variables de tipo entero el resultado igualmente ser del tipo entero. Bajo MatLab, guarda el siguiente cdigo en un archivo y lo llama desde el prompt del MatLab. C = i nput ( 'Digite el valor expresado en Grados C : ' ) ; f = c* 9/ 5+32; f pr i nt f ( 'El valor en grados Farenheith es : %8.3f\n' , f ) ; Cdi go Tur bo Pascal : pogram conver t i r; ues cr t ; vr C,F: r eal ; Begi n cl r scr ; got oxy( 10,10) ; write(Digite el valor expresado en Grados C); r eadl n( C) ; F = C* 9/ 5+ 32; got oxy( 10,12) ; write(El valor en grados farenheit es : ,F); r epeat unt i l keypr essed; End. /* Cdigo Lenguaje C: */ # i ncl ude " coni o.h" # i ncl ude " st di o.h" f l oat c, f ; mai n( ) { cl rscr ( ) ; got oxy( 10,10) ; printf(Digite el valor expresado en Grados C); scanf ( " % f " ,&c) ; f = c* 9/ 5+ 32; got oxy( 10,12) ; printf(El valor en grados Farenheith es: %f , f); get ch( ) ; } ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 77 de 188 Nota: En el ejercicio anterior en la instruccin fprintf, El formato 8.3f le indica a la computadora que se utilizarn 8 espacios para escribir el valor de la variable f, y de los ocho espacios se utilizan 3 campos para las cifras decimales. El \n indica que cuando termine salte el indicador a una nueva lnea (New Line). Si se omite la instruccin \n entonces el indicador quedar unido al ltimo digito escrito para la variable f. 6. Desarrolle un algoritmo que le permita calcular el rea de un tringulo en funcin de las longitudes de sus lados previamente ledos desde el teclado. Anlisis: Para darle solucin al problema planteado primero se leen los valores de los tres lados del tringulo, luego se procede a calcular el valor de su rea en funcin de los valores ledos, aplicando la frmula correspondiente y por ltimo se da orden de escribir el valor calculado. Tareas: Leer los lados Calcular el rea Escribir el valor calculado Algoritmo: Diagrama de flujo Seudo Lenguaje INICIO A,B, p= (A+B+C)/2 A FIN AREA= p(p-A)(p-B)(p-C) I nicio Leer(a,b,c) Hacer p=(A+B+C)/ 2 Calcular el valor del rea dada por la frmula Escribir (a) Fin ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 78 de 188 En MatLab se guardar las siguientes lneas en un archivo y l uego se l l ama par a ser ej ecut ado. A = i nput ( ' Di gi t e el cat et o a : ' ) ; b = i nput ( ' Di gi t e el cat et o b : ' ) ; c = i nput ( ' Di gi t e el cat et o c : ' ) ; p = ( a+b+c) / 2; ar ea = sqr t ( p* ( p- a) * ( p- b) * ( p- c) ) ; f pr i nt f ( 'El valor del rea es : %8.3f\n' , ar ea) ; 7. Desarrolle un algoritmo que le permita determinar el rea y volumen de un cilindro cuyo radio (R) y altura (H) se leen desde teclado. Anlisis: Para dar solucin al ejercicio planteado es necesario leer el valor del radio y el valor de la altura del cilindro desde algn medio de entrada de datos a la computadora, generalmente el teclado. Una vez se tengan almacenados los dos valores en memoria del computador se procede a calcular el rea y el volumen aplicando las frmulas respectivas. I niciar Leer valores de R y H Calcular el volumen y rea Escribir los valores respectivos Finalizar Cdigo Turbo Pascal: pr ogr am Ar ea; uses cr t ; var C,AREA,p : r eal ; Begi n cl r scr ; got oxy( 10,10) ; write(Digite el valor de A); r eadl n( A) ; got oxy( 10,12) write(Digite el valor de B); r eadl n( B) ; got oxy( 10,14) write(Digite el valor de C); r eadl n( C) ; p= ( A+ B+ C) / 2 AREA: = )) ( * ) ( * ) ( * ( C p B p A p p sqrt got oxy( 10,16) ; write(El valor del rea es : ,AREA); r epeat unt i l keypr essed; End. Cdigo Lenguaje C++: # i ncl ude " coni o.h" # i ncl ude " st di o.h" f l oat A,B,C,AREA,p; mai n( ) { cl r scr ( ) ; got oxy( 10,10) ; pr i nt f ( " Di gi t e el val or de A" ) ; Scanf ( &A) ; got oxy( 10,12) pr i nt f ( " Di gi t e el val or de B" ) ; Scanf ( &B) ; got oxy( 10,14) pr i nt f ( " Di gi t e el val or de C" ) ; Scanf ( &C) ; p= ( A+ B+ C) / 2 AREA= )) ( * ) ( * ) ( * ( C p B p A p p sqrt got oxy( 10,16) ; printf("El valor del rea es: %f ", AREA); get ch( ) ; } ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 79 de 188 Algoritmo: Diagrama de flujo Seudo lenguaje Seudo cdigo I nicio Leer(R, H) VOL= *RlH AREA= 2* * RH Escribir(AREA, VOL) Fin Cdigo Turbo Pascal: Progr am Ar ea_ Vol umen; Uses cr t ; var AREA,VOL: r eal ; Begi n cl r scr ; got oxy( 10,10) ; write(Digite el valor de R); r eadl n( R) ; got oxy( 10,12) write(Digite el valor de H); r eadl n( H) ; VOL := * R* R * H AREA := 2 * * R* H got oxy( 10,16) ; write(El valor del area es : ,AREA); got oxy( 10,17) ; write(El valor del Volumen es : ,VOL); r epeat unt i l keypr essed; End. Cdigo Lenguaje C++: / * Pr ogr ama Ar ea_Vol umen * / # i ncl ude " coni o.h" # i ncl ude " mat h.h" # i ncl ude " st di o.h" f l oat R,H,AREA,VOL; mai n( ) { cl r scr ( ) ; got oxy( 10,10) ; pr i nt f ( " Di gi t e el val or de R" ) ; r eadl n( R) ; got oxy( 10,12) pr i nt f ( " Di gi t e el val or de H" ) ; r eadl n( H) ; VOL= * pow( R,2)* H AREA= 2 * * R* H got oxy( 10,16) ; printf("El valor del rea es : %f",AREA); got oxy( 10,17) ; pr i nt f ( " El val or del vol umen es : % f " ,VOL) ; get ch( ) ; } INICIO R,H VOL= * Rl H AREA,VOL FIN AREA= 2* R H I nicio Leer el valor de Radio (R) y Altura (H) Calcular el Volumen aplicando la frmula Calcular el valor del rea aplicando la frmula respectiva Escribir el valor del Crea y del Volumen Finalizar ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 80 de 188 Para desarrollarlo en MatLab se graba el siguiente cdigo en un archivo que despus ser ejecutado desde el prompt del MatLab. R = input('Digite el valor de R :'); H = input('Digite el valor de H :'); VOL = pi* R^ 2* H; AREA = 2* pi* R* H; fprintf('El rea del cilindro es : %f \n' ,AREA); fprintf('El volumen del cilindro es : %f \n' ,VOL); 8. Desarrolle un algoritmo que le permita calculas el rea (A) de un segmento de crculo. Anlisis: Para calcular el rea de un segmento de crculo lo primero que hay que hacer es leer el valor del radio del vinculo y leer el valor de X que es la distancia del centro al segmento. Una vez ledo dichos valores se calcula aplicando la frmula respectiva y por ltimo se escribe el valor del rea. Tareas: Leer (X y r) Calcular (Area) Escribir Algoritmo: Diagrama de flujo Seudo lenguaje INICIO x,r A= ( * rl )/2 [x rl - xl + rl Sin -1 (x / r)] A FIN I nicio Leer el valor de X y r Calcular el valor de rea Escribir el valor de Area (A) Fin ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 81 de 188 Otras salidas literales como salidas con datos numricos reemplazando la funcin "printf" son: printf("El valor del rea es %f",A); cout<<"el valor del rea es"<<A; puts (A); Hay que tener en cuenta que hay que incluir las libreras de estas funciones. Otras formas de entrar datos reemplazando la funcin "scanf" son: Es importante que se tenga en cuenta algunas de las funciones matemticas mas utilizadas en los lenguajes para el desarrollo de problemas. Cdigo Turbo Pascal: Pr ogr am Ar ea_ Segment o_Cir cul ar; Uses cr t ; Var x,r ,A: real ; Begi n cl r scr ; got oxy( 10,10) ; write(Digite el valor de R); r eadl n( r ) ; got oxy( 10,12) write(Digite el valor de X); r eadl n( x) ; A= ( *r*r)/2 (sqrt(r*r- x* x)+r* r* asin (x / r)) got oxy( 10,16) ; write(El valor del rea es : ,A); r epeat unt i l keypressed; End. Cdigo Lenguaje C++: / * Pr og Area_Segment o_ Ci rcul ar * / # i ncl ude " coni o.h" # i ncl ude " st di o.h" f l oat R,H,A,VOL; mai n( ) { cl r scr ( ) ; got oxy( 10,10) ; pr i nt f ( " Di gi t e el val or de R " ) ; scanf ( " % f " ,&r ) ; got oxy( 10,12) pr i nt f ( " Di gi t e el val or de X " ) ; scanf ( " % f " ,&x) ; A= ( * rl)/2 [sqrt(r*r x*x)+r*r*asin (x / r)] got oxy( 10,16) ; printf("El valor del rea es : % f " ,A) ; gect h( ) ; } ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 82 de 188 at an2 t oma dos argument os x e y y devuelve la arcot angent e de y/ x en radianes. exp( x) devuelve el valor e elevado a x. acos(x) retorna el arco coseno del parmetro x. asin(x) retorna el arco seno del parmetro x. atan(x) retorna el valor de la arco tangente del parmetro x. cos(x) retorna el coseno del ngulo x. cosh(x) retorna el coseno hiperblico del parmetro x. sin(x) retorna el seno del ngulo x. sinh(x) retorna el seno hiperblico del parmetro x. tan(x) retorna la tangente del ngulo x. tanh(x) retorna la tangente hiperblica del parmetro x. log(x) retorna el logaritmo natural del parmetro x. log10(x) retorna el logaritmo en base 10 del parmetro x. pow(x,y) toma dos parmetros x e y y devuelve el valor xy sqrt(x) retorna la raz cuadrada del parmetro x. Para poder utilizar una de las funciones descritas anteriormente es necesario incluir en el encabezado del programa a travs de la directiva incluye el archivo math.h, claro est hablando del lenguaje de programacin C.. #include <math.h>
#include math.h ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 83 de 188 Cuando el programador desea especificar dos caminos alternativos en un algoritmo se deben utilizar estructuras de decisin. Una estructura de decisin dirige el flujo de un programa en una cierta direccin, de entre dos posibles, en funcin de un valor booleano. En lenguajes de programacin estructurados la estructura condicional es la lF / ELSE. La clusula ELSE en esta estructura es optativa. La forma en que trabaja esta sentencia resulta casi evidente a partir de la lgica de la lengua inglesa: Si (lF) la expresin booleana resulta cierta (TRUE), entonces la sentencia se ejecuta. Si la expresin booleana resulta falsa (FALSE), el control pasa a la siguiente (en orden descendente) instruccin del programa. Forma general de uso: Si (Condicin) entonces Ejecuta bloque de instrucciones uno Si_no Ejecuta blo que de instrucciones dos Fin si Una estructura de decisin por sencilla o compleja que sea debe tener solo una entrada y una salida. (Vea estructura de diagrama anterior). Un bloque de instrucciones (Denominado tarea 1 y 2 en el diagrama anterior) puede ser un conj unto de estructuras de cualquier clase (asignacin, Decisin, Cclicas o de seleccin mltiple) que se ejecutan unas tras de otras. El bloque de instrucciones tarea1 se ejecuta en caso de que la condicin que se coloque sea verdadera, En caso de ser falsa la evaluacin de la condicin se ejecuta el bloque de instrucciones tarea2. Una condicin tiene que ver directamente con una pregunta. La pregunta se forma mnimo con dos operandos y un operador de relacin. Condicin Entonces Si_No Tarea 2 Tarea 1 ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 84 de 188 Para tales efectos los operadores de relacin utilizados en los lenguajes son: Pascal Lenguaje C Mayor > > Menor < < Mayor o igual >= >= Menor o igual <= <= I gual = == Diferente <> != As, con base en los operadores de relacin descritos, algunos ejemplos de preguntas o condiciones son: Pascal Lenguaje C a>b a>b A es mayor que B? b>c b>c B es mayor que C? a=4 a==4 A es igual a 4? b<>c b!=c B es diferente de C? Tambin se pueden desarrollar condiciones con varias preguntas. Para el efecto anterior es necesario plantear las dos preguntas tal como se indic y relacionarlas con operadores lgicos. Los operadores lgicos utilizados en los lenguajes estructurados son: Pascal Lenguaje C y and && or || No not != Con base en lo anteriormente expuesto, las preguntas o condiciones compuestas podran quedar de la siguiente manera. Pascal Lenguaj e C (a>b) and (b>c) ((a>b)&&(b>c)) "A es mayor que B y B es mayor que C" (a<b) or (b<c) ((a<b)| | (b<c)) "A es menor que B y B es menor que C" ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 85 de 188 Para el lenguaje C Las condiciones es necesario que estn entre parntesis. Una estructura de decisin puede est ar anidada dentro de otra estructura de decisin. Hay que tener en cuenta que el anidamiento sea total. El inicio y el final de la estructura anidada debe quedar totalmente dentro del inicio y el final de la estructura que permite dicho anidamiento. Se debe mantener el concepto que una estructura de decisin debe tener una sola entrada y una sola salida tanto para la estructura que anida como para la estructura anidada. En el diagrama anterior se puede observar una estructura anidada del lado verdadero de la condicin de la primera decisin. Seudo lenguaje de la estructura de decisin anidada. Si (Condicin 1) entonces Si (Condicin 2) entonces Ejecuta bloque de instrucciones tarea 1 Si_no Ejecuta bloque de instrucciones tarea 2 Fin_si Si_no Ejecuta blo que de instrucciones tarea 3 Fin si. Condicin 1 Entonces Si_No Tarea 3 Condicin 2 Entonces Si_No Tarea 2 Tarea1 ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 86 de 188 En el anterior Seudo lenguaje se puede observar que el anidamiento es total o sea que el inicio de la condicin y el final estn totalmente encajados dentro del lado verdadero de la primera estructura. Para los siguientes ejercicios utilice el siguiente planteamiento 1. Desarrolle un algoritmo que le permita leer un valor numrico cualesquiera que sea almacenado en el identificador N y escribir si dicho valor numrico es par o impar. Anlisis: Para resolver el ejercicio planteado hay que leer primero el valor numrico y almacenarlo en una variable de tipo entero (N), En el caso del ejemplo se ha definido de tipo int para C e integer para pascal. Para determinar si el nmero es par, la divisin de dicho nmero por dos (2) debe ser exacta. Por tanto, la decisin de saber si la divisin es exacta o no, la debe tomar el computador usando el smbol o respectivo en el diagrama. (En los diagramas se utilizar el smbolo % para representar el residuo de la divisin de dos operandos, en este caso de la divisin de N y 2). Una vez resuelva la asercin el computador, escribir si es par o impar el nmero ledo y que se encuentra almacenado en el el identificador (variable) N. Algoritmo: Diagrama de flujo Seudo lenguaje INICIO N Es impar FIN N%2=0 Es par Si No I nicio Leer un valor numrico y almacenarlo en la variable N Si el residuo de dividir a N entre 2 igual a cero Escriba que es par Sino Escriba que es impar Fin ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 87 de 188 Cdigo Lenguaje C /* programa para decir si un nmero es par o i mpar * / # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt N; mai n( ) { cl r scr ( ) ; got oxy( 10,10) ; printf("Digite un nmero "); scanf ( " % d" ,&N) ; got oxy( 10,12) ; i f ( N% 2= = 0) printf("el nmero es par"); el se printf("el nmero es impar"); get ch( ) ; } Cdigo Turbo Pascal: Progr am par _i mpar ; Uses cr t ; Var N: i nt eger ; Begi n cl r scr ; got oxy( 10,10) ; write(Digite un nmero ); r eadl n( N) ; got oxy( 10,12) i f N mod 2 = 0 t hen write(El nmero es par) esl e write(El nmero es impar); r epeat unt i l keypr essed; End. Seudo cdigo I nicio Leer (N) Si (N residuo 2 = 0) entonces Escriba (N es par) Si_no Escriba (N es impar) Fin_si Fin Si se desarrolla bajo programacin MatLab, el cdigo se guarda bajo un nombre de archivo tipo m en el directorio work del MatLab y se ejecuta desde el indicador del matlab, escribiendo el nombre del archivo y dando enter. N = input('Digite un nmero '); if mod(N,2) == 0 fprintf('el nmero es par \n'); else fprintf('el nmero es impar \n'); end Es importante resaltar la diferencia que existe entre = y ==, el primero para asignar y el segundo para comparar. En el caso del MatLab la sentencia if se cierra con un end, ya que no trabaja con marcas como lo hace C { y } o Pascal ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 88 de 188 Begin y end. En el caso de C o Pascal omiten las marcas cuando hay una sola instruccin por alguna de las dos opciones. 2. Desarrolle un algoritmo que le permita leer un valor numrico cualesquiera, almacenarlo en el identificador (variable) N de tipo entera y escribir en la pantalla si dicho nmero es Positivo o Negativo Anlisis: Para resolver el ejercicio planteado hay que leer primero el valor numrico y almacenarlo en un identificador (variable) N. Para establecer si dicho nmero es positivo o no, simplemente se compara el identificador con cero. En caso de que sea mayor o igual a cero entonces el valor numrico almacenado en N ser positivo, y para el caso contrario el valor numrico ser negativo. Algoritmo: Diagrama de flujo Seudo lenguaje Seudo cdigo I nicio Leer(N) Si (N>=0) entonces Escriba("Es positivo") Sino Escriba("Es negativo") Fin si INICIO N Es negati vo FIN N>=0 Es positi vo No Si I nicio Leer un valor numrico y almacenarlo en la variable N Si el nmero es mayor o i gual a cero Escriba que es positivo Si no Escriba que es negativo Fin ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 89 de 188 Fin El siguiente cdigo lo guarda bajo un nombre de archivo tipo m en el directorio work de MatLab y ejectelo desde el prompt del MatLab, digitando el nombre del archivo. N = input('Digite un nmero '); if N>=0 fprintf('el nmero es positivo \n'); else fprintf('el nmero es negativo \n'); end 3. Desarrolle un algoritmo que le permita leer un valor numrico cualquiera N y escribir si dicho nmero es mltiplo de Z. Anlisis: Para resolver el ejercicio planteado anteriormente, hay que leer primero el valor del nmero y almacenarlo en una variable (N). Luego leer otro valor y almacenarlo en la variable Z. Para saber si el nmero almacenado en la variable N es mltiplo del nmero almacenado en Z, se hace la divisin entre Z y N, si la Cdigo en Turbo Pascal Pr ogr am posi t i vo_Negat i vo; Uses cr t ; Var N: i nt eger; Begi n cl r scr ; got oxy( 10,10) ; write(Digite un nmero ); r eadl n( N) ; got oxy( 10,12) i f N > = 0 t hen write(El nmero es positivo) esl e write(El nmero es negativo); r epeat unt i l keypr essed; End. Cdigo Lenguaje C / * pr ogr ama posi t i vo o negat i vo * / # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt N; mai n( ) { cl r scr( ) ; got oxy( 10,10) ; pri nt f ( " Di gi t e un numer o " ) ; scanf ( " % d" ,&N) ; got oxy( 10,12) ; i f ( N> = 0) printf("el nmero es positivo"); el se printf("el nmero es negativo"); get ch( ) ; } ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 90 de 188 divisin es exacta entonces N es mltiplo de Z, de lo contrario N no ser mltiplo de Z. Algoritmo: Diagrama de flujo Seudo lenguaje Seudo cdigo I nicio Leer (N,Z) Si (N residuo Z=0) entonces Escriba (N es mltiplo de Z) Sino Escriba(N no es mltiplo de Z) Fin si Fin Cdigo Turbo Pascal: Pr ogr am mul t i pl o_de_Z; Uses cr t ; Z,N: i nt eger ; Begi n cl r scr ; got oxy( 10,10) ; write(Digite un nmero N); Readl n( N) ; got oxy( 10,11) ; write(Digite un nmero Z); Readl n( Z) ; got oxy( 10,12) ; i f N mod Z = 0 t hen write(N es mltiplo de Z) Esl e write(N no es mltiplo de Z); r epeat unt i l keypressed; End. Cdigo Lenguaje C /* Programa mltiplo_de_Z */ # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt N,Z; mai n( ) { cl r scr ( ) ; got oxy( 10,10) ; printf("Digite un nmero N "); scanf ( " % d" ,&N) ; got oxy( 10,11) ; printf("Digite un nmero Z "); scanf ( " % d" ,&Z) ; got oxy( 10,12) ; i f ( N% Z= = 0) printf("N es mltiplo de Z"); el se printf("N no es mltiplo de Z"); get ch( ) ; } INICIO N,Z No es mltiplo FIN N%Z=0 Es mltiplo No Si I nicio Leer un valor y almacenarlo en la variable N y leer otro valor y almacenar en la variable Z Si la divisin entre N y Z es exacta escriba N es mltiplo de Z Sino Escriba N no es mltiplo de Z Fin_Si Fin ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 91 de 188 4. Desarrolle un algoritmo que le permita leer un valor numrico cualesquiera N y escribir si dicho nmero es comn divisor de otros dos valores numricos ledos y almacenados en los identificadores W y Z Anlisis: Para resolver el ejercicio planteado, hay que leer un primer valor numrico y almacenarlo en el identificador (variable) N. Luego se procede a leer otros dos valores numricos y almacenarlos en las variables W y Z respectivamente. Para conocer si el valor almacenado en la variable N es comn divisor de W y Z, se chequea si la divisin entre W/ N y Z/ N son exactas. En caso de ser exactas entonces el valor numrico almacenado en el identificador (variable) N es comn divisor de los dos valores almacenados en W y Z. En caso contrario no lo ser. Para el caso del ejercicio todos los identificadores sern declarados del tipo entero. Algoritmo: Diagrama de flujo Seudo lenguaje Seudo cdigo I nicio Leer (W,Z,N) Si (W residuo N=0 y Z residuo N=0) entonces Escriba (N es comn divisor de W y Z) Sino Escriba(N no es comn divisor de W y Z) INICIO W,Z,N No es comun divi sor FIN W%N=0 y Z%N=0 Es comun di visor No Si I nicio Leer 3 valores numricos y almacenarlos en las variables W, Z y N. Si W residuo N es igual a 0 y Z residuo N es igual a 0 Escriba N es comn divisor de W y Z Si_no Escriba N no es comn divisor de W y Z Fin_si Fin. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 92 de 188 Fin si Fin Para ejecutar este programa desde MatLab recuerde guardarlo bajo un nombre de archivo de extensin .m y ejecutarlo desde el prompt del MatLab. No olvide configurar en el Set Path el directorio donde queda guardado el archivo. N = input('Digite un nmero N '); W = input('Digite un nmero W '); Z = input('Digite un nmero Z '); if (mod(W,N)==0) & (mod(Z,N)==0) fprintf('N es comn divisor de W y Z \n' ); else fprintf('N no es comn divisor de W y Z \n'); end En la pantalla de ejecucin del MatLab se ver lo siguiente, si da los valores descritos en el ejemplo. Note que el archivo fue guardado con el nombre PD5. Cdigo Turbo Pascal: Progr am comun di vi sor ; Uses cr t ; Var W,Z,N: i nt eger ; Begi n cl r scr ; got oxy( 10,10) ; write(Digite un nmero N );Readln(N); got oxy( 10,11) ; write(Digite un nmero W );Readln(W); got oxy( 10,12) ; write(Digite un nmero Z );Readln(Z); got oxy( 10,14) ; i f ( W mod N = 0) and ( Z mod N= 0) t hen write(N es comn divisor de W y Z) Esl e write(N no es comn divis de W y Z ); r epeat unt i l keypr essed; End Cdigo Lenguaje C / * Progr ama comun di vi sor * / # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt W,Z,N; mai n( ) { cl r scr ( ) ; got oxy( 10,10) ; printf("Digite nmero N ");scanf("%d",&N); got oxy( 10,11) ; printf("Digite nmero W ");scanf("%d",&W); got oxy( 10,12) ; printf("Digite nmero Z ");scanf("%d",&Z); got oxy( 10,14) ; i f ( W% N= = 0 && Z% N= = 0) printf("N es comn divisor de W y Z"); el se printf("N no es comn divisor de W y Z"'); get ch( ) ; } ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 93 de 188 ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 94 de 188 5. Desarrolle un algoritmo que le permita leer un valor cualquiera N y escribir si dicho nmero es comn mltiplo de M y P. M y P son valores que tambin se deben leer desde el teclado. Anlisis: Para dar solucin, primero se deben leer los valores. En N se almacena un valor y en las variables M y P se almacenarn los otros dos valores de los cuales se desea saber si N es comn mltiplo o no. Para poder saber si N es mltiplo habr que realizar una divisin y preguntar si dicha divisin es exacta o no, con cada uno de los dos valores (N/M y N/P). Si cada divisin es exacta entonces escribir que N es comn mltiplo de M y P o en caso contrario decir que N no es comn mltiplo. Algoritmo: Diagrama de flujo Seudo lenguaje Seudo cdigo I nicio Leer(N,M,P) Si (N residuo M =0 y N residuo P =0) entonces Escriba( N es comn mltiplo de M y P) Si_no Escriba( N no es comn mltiplo de M y P) Fin si Fin INICIO N,M,P N no es comn mltiplo N%M=0 y N%P=0 N es comn mltiplo No Si FIN I nicio Leer un nmero (N) y otros dos y almacenarlos en las variables M y P Si la divisin entre (N,M) y (N,P) es exacta Entonces Escriba N es comn mltiplo de M y P Si_no Escriba N no es comn mltiplo de M y P Fin_si Fin ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 95 de 188 No olvide que para ejecutar este programa desde MatLab, debe guardarlo bajo un nombre de archivo de extensin .m y ejecutarlo desde el prompt del MatLab. Debe estar configurado en el Set Path del MatLab el directorio donde queda guardado el archivo. N = i nput ( 'Digite un nmero N ' ) ; W= i nput ( 'Digite un nmero W ' ) ; Z = i nput ( 'Digite un nmero Z ' ) ; i f ( mod( N, W) ==0) & ( mod( N, Z) ==0) f pr i nt f ( 'N es comn mltiplo de W y Z \n' ) ; el se f pr i nt f ( 'N no es comn mltiplo de W y Z \n' ) ; end En la pantalla de ejecucin del MatLab se ver lo siguiente, si da los valores descritos en el ejemplo. Note que el archivo fue guardado con el nombre PD6. Cdigo Lenguaje C /* Programa comn_mltiplo_de_M_y_P */ # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt N,M,P; mai n( ) { cl r scr ( ) ; got oxy( 10,10) ; printf("Digite un nmero N "); scanf ( " % d" ,&N) ; got oxy( 10,11) ; printf("Digite un nmero M "); scanf ( " % d" ,&M) ; got oxy( 10,12) ; printf("Digite un nmero P "); scanf ( " % d" ,&P) ; got oxy( 10,13) ; i f ( N% M= = 0 && N% P= = 0) printf("N es mltiplo de M y P"); el se printf("N no es mltiplo de M y P"); get ch( ) ; } Cdigo Turbo Pascal: Program comn_mltiplo_de_M_y_P; Uses cr t ; Var N,M,P: i nt eger ; Begi n cl r scr ; got oxy( 10,10) ; write(Digite un nmero N); r eadl n( N) ; got oxy( 10,11) ; write(Digite un nmero M); r eadl n( M) ; got oxy( 10,12) ; write(Digite un nmero P); r eadl n( P) ; got oxy( 10,13) ; i f ( N mod M= 0) and ( N mod P= 0) t hen write(N es mltiplo de M y P) el se write(N no es mltiplo de M y P); r epeat unt i l keypressed; End ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 96 de 188 6. Desarrolle un algoritmo que le permita leer dos valores numricos siendo almacenados en los identificadores A y B respectivamente y que escriba cual de los dos valores ledos es el mayor Anlisis: Para dar solucin al anterior ej ercicio, primero se deben leer los dos valores y almacenar cada uno de ellos en una variable. Para el caso del desarrollo se almacenar un valor en la variable A y el otro en la variable B. Para poder saber cual de los dos valores es mayor simplemente se comparan las dos variables y se escribir cual de las dos es la mayor. Algoritmo: Diagrama de flujo Seudo lenguaje Seudo cdigo I nicio Leer(A,B) Si (A>B) entonces Escriba (A es el mayor) Si_no Escriba (B es el mayor) Fin Si Fin INICIO A,B B es el mayor FIN A>B A es el mayor No Si I nicio Leer dos valores numricos y almacenarlos en las variables A y B Si A>B Entonces Escriba A es el mayor Si_no Escriba B es el mayor Fin_si Fin ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 97 de 188 Si se desarrolla el ejercicio anterior bajo cdigo MatLab, se daran las sigeuitnes instrucciones. Recuerde que se debe guardar en un archivo con extensin M en un directorio configurado en el Set Path de MatLab, y hacer el llamado desde el prompt del MatLab tal como se muestra en la ventana siguiente. A=i nput ( 'Digite un nmero A ' ) ; B=i nput ( 'Digite un nmero B ' ) ; i f A>B f pr i nt f ( 'A es el mayor \n' ) el se f pr i nt f ( 'B es el mayor \n' ) end La figura anterior muestra la ejecucin del archvio desde el indicador del MatLab . El valor 5 y el valor 9 se deben escribir cuando se ejecute el archivo. La computadora pregunta cada valor en el momento de ejecutar cada una de las instrucciones. Cdi go Lenguaj e C / * progr ama cual _ de_l os_dos_es_mayor * / # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt A,B; mai n( ) { cl rscr ( ) ; got oxy( 10,10) ; printf("Digite un nmero A "); scanf ( " % d" ,&A) ; got oxy( 10,11) ; printf("Digite un nmero B "); scanf ( " % d" ,&B) ; got oxy( 10,12) ; i f ( A> B) pri nt f ( " A es el mayor " ) ; el se pri nt f ( " B es el mayor " ) ; get ch( ) ; } Cdigo Turbo Pascal: pr ogr am cual _de_l os_dos_es_mayor ; uses cr t ; var A,B: I nt eger ; begi n cl r scr ; got oxy( 10,10) ; write(Digite un nmero); r eadl n( A) ; got oxy( 10,11) ; write(Digite otro nmero); r eadl n( B) ; got oxy( 10,12) ; i f A> B t hen write(A es el mayor) el se write(B es el mayor); r epeat unt i l keypr essed; end ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 98 de 188 7. Desarrolle un algoritmo que le permita leer dos valores numricos que sean almacenados en los identificadores (variables) A y B y escriba cual de los dos valores ledos es el menor Anlisis: Este ejercicio es similar al anterior, primero se deben leer los dos valores y almacenar cada uno de ellos en un identificador (variable). En el caso del ejemplo el primer valor se almacena en la variable A y el segundo en la variable B. Para poder determinar cual de los dos valores es menor, se comparan las dos variables con un operador de relacin (<), dependiendo del operador utilizado se escribir cual de los dos valores es menor o mayor. Se supone que los dos valores ledos son diferentes. En el caso del ejemplo se utiliza el operador de relacin <. Algoritmo: Diagrama de flujo Seudo lenguaje Seudo cdigo I nicio Leer(A,B) Si (A<B) entonces Escriba(A es el menor) Sino Escriba(B es el menor) Fin Si Fin INICIO A,B B es menor FIN A<B A es menor No Si I nicio Lea dos valores y almacene los valores en las variables A y B. Si la condicin (A<B) es verdadera Escriba A es el menor Sino Escriba B es el menor Fin ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 99 de 188 Resuelto el ejercicio anterior con instrucciones de Matlab quedar as: A = i nput ( 'Digite un nmero A ' ) ; B = i nput ( 'Digite un nmero B ' ) ; i f ( A>B) f pr i nt f ( 'A es mayor\n' ) ; el se f pr i nt f ( 'B es mayor\n' ) ; end 8. Desarrolle un algoritmo que le permita leer 2 valores A y B e indicar si uno de los dos divide al otro exactamente Anlisis: Para dar solucin al anterior ej ercicio, primero se deben leer los dos valores y almacenar cada uno de ellos en una variable. Para el caso del desarrollo se almacenar un valor en la variable A y el otro en la variable B. Para saber si uno de los dos divide exactamente al otro se examina primero el caso en que B divida exactamente a A; se compara el residuo, si es cero se escribir que divide exactamente a A de lo contrario se examina el caso en que A divida exactamente a B. Se compara nuevamente el residuo, si es cero se escribir "A divide exactamente a B" sino "ninguno de los dos divide exactamente al otro". Se supone que los dos valores ledos son diferentes. Cdigo Lenguaje C / * Pr ogr ama cual _de_l os_dos_es_menor * / # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt A,B; mai n( ) { cl r scr ( ) ; got oxy( 10,10) ; pr i nt f ( " Di gi t e un numero A " ) ; scanf ( " % d" ,&A) ; got oxy( 10,11) ; pr i nt f ( " Di gi t e un numero B " ) ; scanf ( " % d" ,&B) ; got oxy( 10,12) ; i f ( A< B) pri nt f ( " A es el menor " ) ; el se pri nt f ( " B es el menor " ) ; get ch( ) ; } Cdigo Turbo Pascal: pr ogr am cual _de_l os_dos_es_menor ; Uses cr t ; Var A,B: I nt eger ; begi n cl r scr ; got oxy( 10,10) ; write(Digite un nmero A ); r eadl n( A) ; got oxy( 10,11) ; write(Digite un nmero B ); r eadl n( B) ; got oxy( 10,12) ; i f A< B t hen write(A es el menor) el se write(B es el menor); r epeat unt i l keypr essed; end ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 100 de 188 Algoritmo: Diagrama de flujo Seudo lenguaje I nicio Leer dos valores. El uno almacenarlo en la variable A y el otro en la variable B Si la divisin entre A y B es exacta Entonces Escribir que B divide exactamente a A Sino Si la divisin entre B y A es exacta Entonces Escribir que A divide exactamente a B Si_no Escribir que no se dividen exactamente. Fin_si Fin_si Fin Seudo cdigo I nicio Leer (A,B) Si A residuo B=0 entonces Escriba (B divide exactamente a A) Si_no Si B residuo A=0 entonces Escriba (A divide exactamente a B) Si_no Escriba (No se dividen exactamente) Fin_si Fin_si Fin A,B Ni nguno divi de al otro exactamente FIN A%B=0 B di vide Exactamente a A No Si B%A=0 A di vide Exactamente a B Si No ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 101 de 188 Del ejercicio anterior, observe detenidamente que una estructura de decisin se encuentra anidada completamente dentro de otra. En los lenguajes de programacin estruc turados, el anidamiento de estructuras debe ser total. Es decir una estructura debe quedar totalmente inserta dentro de otra. La estructura if de color mor ado en el cdigo anterior, est inserta (Anidada) dentro del else de la estructura de color azul. La estructura en este caso, se considera como una sola instruccin por lo tanto no lleva marcas de inicio y final en el else donde se encuentra anidada. Desarrollado el ejercicio anterior bajo MatLab quedar de la sigueitne manera: A = i nput ( 'Digite un nmero A ' ) ; B = i nput ( 'Digite un nmero B ' ) ; i f ( mod( A, B) ==0) f pr i nt f ( 'B divide exactamente a A \n' ) ; el se i f ( mod( B, A) ==0) f pr i nt f ( 'A divide exactamente a B\n' ) ; el se f pr i nt f ( 'No se dividen exactamente\n' ) ; end end No olvide que el archivo se debe guardar en un directorio que se encuentre configurado dentro del Set Path del paquete MatLab. Cdigo Lenguaje C /* Programa divisin exacta */ # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt A,B; mai n( ) { cl r scr ( ) ; got oxy( 10,10) ; printf("Digite un nmero A "); scanf ( " % d" ,&A) ; got oxy( 10,11) ; printf("Digite un nmero B "); scanf ( " % d" ,&B) ; got oxy( 10,12) ; i f ( A% B= = 0) pr i nt f ( " B di vi de exact ament e a A" ) ; el se i f ( B% A= = 0) pr i nt f ( " A di vi de exact ament e a B" ) ; el se pri nt f ( " Ni nguno de l os dos di vi de exact ament e al ot r o" ) ; get ch( ) ; } Cdigo Turbo Pascal: program divisin_exacta; Uses cr t ; Var A,B: i nt eger ; begi n cl r scr ; got oxy( 10,10) ; write(Digite un nmero); r eadl n( A) ; got oxy( 10,11) ; write(Digite otro nmero); r eadl n( B) ; got oxy( 10,12) ; i f A mod B= 0 t hen write(B divide exactamente a A) el se i f B mod A= 0 t hen write(A divide exactamente a B) el se write(Nin guno de l os dos di vi de exactamente al otro); r epeat unt i l keypr essed; end ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 102 de 188 9. Desarrolle un algoritmo que le permita leer dos valores numricos A y B e indicar si el resultado de dividir la suma del los dos nmeros entre la resta del primer nmero con el segundo es exacta. Anlisis: Primero se leen los dos valores almacenando cada uno de ellos en una variable o identificador, para el caso del ejercicio, el primer valor es almacenado en la variable A y el segundo valor es almacenado en la variable B. Para determinar si la divisin de las expresiones (A+B)/(A-B) es exac ta, se chequea el residuo. En caso de que el residuo sea igual a cero es porque la divisin es exacta, de lo contrario la divisin no es exacta. Algoritmo: Diagrama de flujo Seudo lenguaje Seudo cdigo I nicio Leer (A,B) Si (A+B) residuo (A-B)=0 entonces Escriba (La divisin es exacta) Si_no Escriba (La divisin es inexacta) Fin_si Fin INICIO A,B FIN ((A+B)% (A-B))=0 No Si La divisin no es exacta La divisin es exacta I nicio Leer dos valores. El uno almacenarlo en la variable A y el otro en la variable B Si la divisin entre A+B y A-B es exacta Escribir que La divisin es exacta Sino Escribir que no se dividen Exactamente. Fin_si Fin ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 103 de 188 Cdigo Lenguaje C /* Programa divisin exacta */ # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt A,B; mai n( ) { cl r scr( ) ; got oxy( 10,10) ; printf("Digite un nmero A "); scanf ( " % d" ,&A) ; got oxy( 10,11) ; printf("Digite un nmero B "); scanf ( " % d" ,&B) ; got oxy( 10,12) ; i f ( ( A+ B) % ( A- B) = = 0) printf("La divisin es exacta"); el se printf("La divisin es inexacta"); get ch( ) ; } Cdigo Turbo Pascal: program divisin_exacta; Uses cr t ; Var A,B: i nt eger ; begi n cl r scr ; got oxy( 10,10) ; write(Digite un nmero); r eadl n( A) ; got oxy( 10,11) ; write(Digite otro nmero); r eadl n( B) ; got oxy( 10,12) ; i f ( A+ B) mod ( A- B) = 0 t hen write(La divisin es exacta) el se write(La divisin es inexacta); r epeat unt i l keypressed; end ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 104 de 188 10. Desarrolle un algoritmo que le permita leer dos valores A y B e indicar si la suma de los dos nmeros es par Anlisis: Primero se leen los dos valores almacenando cada uno de ellos en una variable, en el caso del ejercicio, el primer valor se almacena en la variable A y el segundo se almacena en la variable B. Al sumarlos para saber si el resultado es par o impar se divide entre dos chequeando para esto el residuo. Si el residuo es cero es porque el valor es par y si el residuo es uno es porque el valor es impar. Algoritmo: Diagrama de flujo Seudo lenguaje Seudo cdigo I nicio Leer (A y B) Si (A+B)%2=0 entonces Escribir (La suma es par) Sino Escribir (La suma es impar) Fin Si Fin INICIO A,B FIN La suma es par No Si (A+B)% 2=0 La suma es impar I nicio Leer dos valores y almacenarlos en las variables A y B Si el residuo de (A+B)/ 2 es igual a =0 entonces Escribir La suma es par Sino Escribir La suma es impar Fin Si Fin ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 105 de 188 Cdigo Lenguaje C / * Pr ogr ama suma par * / # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt A,B; mai n( ) { cl r scr ( ) ; got oxy( 10,10) ; printf("Digite un nmero A "); scanf ( " % d" ,&A) ; got oxy( 10,11) ; printf("Digite un nmero B "); scanf ( " % d" ,&B) ; got oxy( 10,12) ; i f ( ( A+ B) % 2= = 0) pri nt f ( " La suma es par " ) ; el se pri nt f ( " La suma es i mpar " ) ; get ch( ) ; } Cdigo Turbo Pascal: pr ogr am suma_par ; Uses cr t ; Var A,B: i nt eger ; begi n cl r scr ; got oxy( 10,10) ; write(Digite un nmero); r eadl n( A) ; got oxy( 10,11) ; write(Digite otro nmero); r eadl n( B) ; got oxy( 10,12) ; i f ( ( A+ B) mod 2= 0 t hen write(La suma es par) el se write(La suma es impar); r epeat unt i l keypr essed; end ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 106 de 188 11. Desarrolle un algoritmo que le permita leer dos valores A y B e indicar cual de las dos restas (B-A) o (A-B) es positiva Anlisis: Ledos los dos valores, y almacenado s cada uno de los valores en las variables respectivas A y B, se procede a comparar una de las dos restas, si dicha resta es positiva se escribe el mensaje o si no se escribe lo contrario. Algoritmo: Diagrama de flujo Seudo lenguaje Seudo cdigo I nicio Leer (A y B) Si A-B>=0 entonces Escribir(A - B es positiva) Sino Escribir(B - A es positiva) Fin Si Fin I nicio Leer dos valores y almacenarlos en l variables A y B Si la resta A menos B es mayor o igual a 0 entonces Escribir la resta de A menos B es positiva Sino Escribir La resta de B menos A es positiva Fin Si Fin INICIO A,B FIN No Si (A-B)>=0 (B-A) es positiva (A-B) es positiva ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 107 de 188 Cdigo Lenguaje C / * Pr ogr ama rest a posi t i va * / # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt A,B; mai n( ) { cl r scr( ) ; got oxy( 10,10) ; printf("Digite un nmero A "); scanf ( " % d" ,&A) ; got oxy( 10,11) ; printf("Digite un nmero B "); scanf ( " % d" ,&B) ; got oxy( 10,12) ; i f ( A- B> = 0) pr i nt f ( " A - B es posi t i va" ) ; el se pr i nt f ( " B - A es posi t i va" ) ; get ch( ) ; } Cdigo Turbo Pascal: pr ogr am r est a_posi t i va; Uses cr t ; Var A,B: i nt eger ; begi n cl r scr ; got oxy( 10,10) ; write(Digite un nmero A ); r eadl n( A) ; got oxy( 10,11) ; write(Digite un nmero B ); r eadl n( B) ; got oxy( 10,12) ; i f ( A - B) > = 0 t hen write(A - B es positiva) el se write(B - A es positiva); r epeat unt i l keypressed; end ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 108 de 188 Para los siguientes algoritmos, los valores A, B y C deben ser ingresados diferentes. 12. Desarrolle un algoritmo que le permita leer tres valores y almacenarlos en las variables A, B, C respectivamente. El algoritmo debe indicar cual de los tres valores leidos es el mayor. Para el desarrollo del presente ejercicio se asume que los tres valores ledos por el teclado son valores distintos. Anlisis: Es necesario leer los tres valores a comparar, cada uno de ellos se almacena en una variable o identificador diferente. Para el ejercicio sern A, B y C. Para saber si A es el valor mayor se compara con las variables B y C respectivamente (se usa el operador de relacin >). En caso de ser mayor se escribe el mensaje de que A es la variable que contiene el valor mayor, en caso contrario se sigue verificando otra variable, en este caso se procede a verificar B para determinar si B contiene el dato mayor. (Esto se realiza con otra estructura de decisin, y si no por defecto se dir que C es la variable que contiene el mayor valor, asumiendo que los tres valores almacenados son diferentes. Algoritmo: Diagrama de flujo INICIO A,B,C C es el mayor FIN No Si B es el mayor Si No B>A y B>C A>B y A>C A es el mayor Seudo cdigo I nicio Leer (A, B y C) Si A>B y A>C entonces Escribir(A es el mayor) Sino Si B>A y B>C entonces Escribir (B es el mayor) Sino Escribir (C es el mayor) Fin Si Fin Si Fin Seudo lenguaje I nicio Leer tres valores y almacenarlos en las variables A, B y C Si A es mayor que B y A es mayor que C Escribir A es el mayor Sino Si B es mayor que A y B es mayor que C Escribir B es el mayor Sino Escribir C es el mayor Fin Si Fin Si Fin ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 109 de 188 Si se digita el ejerccio anterior bajo codigo MatLab quedar as: A = i nput ( 'Digite un nmero A ' ) ; B = i nput ( 'Digite un nmero B ' ) ; C = i nput ( 'Digite un nmero B ' ) ; i f ( ( A>B) &( A>C) ) f pr i nt f ( 'A es el mayor \n' ) ; el se i f ( ( B>A) &( B>C) ) f pr i nt f ( 'B es el mayor\n' );\ el se f pr i nt f ( 'C es el mayor\n' ) ; end end Recuerde que el archivo se debe guardar bajo extensin m, y debe quedar guardado en un directorio que se encuentre configurado en el SetPath de MatLab para poder ejecutarlo desde el prompt, con solo digitar el nombre del archivo y pulsar la tecla enter. Cdigo Lenguaje C / * Progr ama mayor * / # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt A,B,C; mai n( ) { cl r scr ( ) ;got oxy( 10,10) ; printf("Digite un nmero A "); scanf ( " % d" ,&A) ;got oxy( 10,11) ; printf("Digite un nmero B "); scanf ( " % d" ,&B) ;got oxy( 10,12) printf("Digite un nmero C "); scanf ( " % d" ,&C) ;got oxy( 10,13) ; i f ( A> B && A> C) pr i nt f ( " A es el mayor " ) ; el se i f ( B> A && B> C) pr i nt f ( " B es el mayor " ) ; el se pr i nt f ( " C es el mayor " ) ; get ch( ) ; } Cdigo Turbo Pascal: progr am mayor ; Uses cr t ; Var A,B,C: i nt eger ; begi n cl r scr ; got oxy( 10,10) ; write(Digite un nmero A ); r eadl n( A) ; got oxy( 10,11) ; write(Digite un nmero B ); r eadl n( B) ; got oxy( 10,12) ; write(Digite un nmero C ); r eadl n( C) ;got oxy( 10,13) ; i f ( A > B) and ( A> C) t hen write(A es el mayor) el se i f ( B> A) and ( B> C) t hen write(B es el mayor) el se write(C es el mayor); r epeat unt i l keypr essed; end ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 110 de 188 13. Desarrolle un algoritmo que le permita leer tres valores A,B,C diferentes e indicar cual es el menor Anlisis: Es similar al ejercicio anterior, con diferencia en la asercin realizada. En este se verificar si una variable contiene el menor valor con respecto a las otras dos. lgualmente se asume que los valores ledos son diferentes. Algoritmo: Diagrama de flujo INICIO A,B,C FIN No Si B es el menor Si No B<A y B<C A<B y A<C A es el menor C es el menor Seudo Cdigo I nicio Leer (A, B y C) Si A<B y A<C entonces Escribir(A es el menor) Sino Si B<A y B<C entonces Escribir (B es el menor) Sino Escribir (C es el menor) Fin Si Fin Si Fin Seudo Lenguaje I nicio Leer tres valores y almacenarlos en las variables A, B y C Si A es menor que B y A es menor que C entonces Escribir A es el menor Sino Si B es menor que A y B es menor que C entonces Escribir B es el menor Sino Escribir C es el menor Fin Si Fin Si Fin ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 111 de 188 Si se desarrolla en cdigo MatLab quedar asi: A = i nput ( 'Digite un nmero A ' ) ; B = i nput ( 'Digite un nmero B ' ) ; C = i nput ( 'Digite un nmero B ' ) ; i f ( ( A<B) &( A<C) ) f pr i nt f ( 'A es el menor \n' ) ; el se i f ( ( B<A) &( B<C) ) f pr i nt f ( 'B es el menor\n' ) ; el se f pr i nt f ( 'C es el menor\n' ) ; end end Cdigo Lenguaje C / * Pr ogr ama menor * / # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt A,B,C; mai n( ) { cl r scr ( ) ; got oxy( 10,10) ; printf("Digite un nmero A "); scanf ( " % d" ,&A) ; got oxy( 10,11) ; printf("Digite un nmero B "); scanf ( " % d" ,&B) ; got oxy( 10,12) ; printf("Digite un nmero C "); scanf ( " % d" ,&C) ; got oxy( 10,13) ; i f ( A< B && A< C) pr i nt f ( " A es el menor " ) ; el se i f ( B< A && B< C) pr i nt f ( " B es el menor " ) ; el se pr i nt f ( " C es el menor " ) ; get ch( ) ; } Cdigo Turbo Pascal: pr ogr am menor ; Uses cr t ; Var A,B,C: i nt eger ; begi n cl r scr ; got oxy( 10,10) ; write(Digite un nmero); r eadl n( A) ; got oxy( 10,11) ; write(Digite otro nmero); r eadl n( B) ; got oxy( 10,12) ; write(Digite otro nmero); r eadl n( C) ; got oxy( 10,13) ; i f ( A< B) and ( A< C) t hen write(A es el menor) el se i f ( B< A) and ( B< C) t hen write(B es el menor) el se write(C es el menor); r epeat unt i l keypressed; end ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 112 de 188 14. Desarrolle un algoritmo que le permita leer tres valores numricos diferentes, almacenarlos en los identificadores A,B,C respectivamente e indicar cual es valor del centro Anlisis: Una vez ledos los valores en cada uno de los indicadores (variables A,B,C) se procede a comparar cada uno de ellos con los otros dos para verificar si es valor del centro o no. Un valor es del centro si es menor que uno y mayor que otro o el caso contrario. lgualmente se asume que los tres valores ledos son diferentes. Algoritmo: Diagrama de flujo Seudo lenguaje I nicio Leer tres valores y almacenarlos en las variables A, B y C Si A es < que B y A es mayor que C A es mayor que B y A es menor que C Escribir A es el valor del centro Sino Si B es < que A y B es > que C B es mayor que A y B es menor que C Escribir B es el valor del centro Sino Escribir C es el valor del centro Fin Si Fin Si Fin INICIO A,B,C FIN No Si B es el centro Si No (B<A y B>C) (B>A y B<C) (A<B y A>C) (A>B y A<C) A es el centro C es el centro ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 113 de 188 Seudo cdigo I nicio Leer (A, B y C) Si A<B y A>C o A>B y A<C entonces Escribir(A es el centro) Sino Si B<A y B>C B>A y B<C entonces Escribir (B es el centro) Sino Escribir (C es el centro) Fin Si Fin Si Fin Cdigo Turbo Pascal: pr ogr am val or _cent r o; Uses cr t ; Var A,B,C: i nt eger ; begi n cl r scr ; got oxy( 10,10) ; write(Digite un nmero A ); r eadl n( A) ; got oxy( 10,11) ; write(Digite un nmero B ); r eadl n( B) ; got oxy( 10,12) ; write(Digite un nmero C ); r eadl n( C) ; got oxy( 10,13) ; i f ( A< B) and( A> C) or ( A> B) and( A< C) then write(A es el centro) el se i f ( B< A) and ( B> C) or ( B> A) and ( B< C) then write(B es el centro) else write(C es el centro); r epeat unt i l keypr essed; end Cdigo Lenguaje C / * Pr ogr ama val or cent r o * / # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt A,B,C; mai n( ) { cl r scr( ) ; got oxy( 10,10) ; printf("Digite un nmero A "); scanf ( " % d" ,&A) ; got oxy( 10,11) ; printf("Digite un nmero B "); scanf ( " % d" ,&B) ; got oxy( 10,12) ; printf("Digite un nmero C "); scanf ( " % d" ,&C) ; got oxy( 10,13) ; i f ( ( A< B && A> C) | ( A> B && A< C) ) pri nt f ( " A es el cent r o" ) ; el se i f ( ( B< A && B> C) | ( B> A && B< C) ) pri nt f ( " B es el cent ro" ) ; el se pri nt f ( " C es el cent r o" ) ; get ch( ) ; } ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 114 de 188 19. Desarrolle un algoritmo que le permita leer tres valores A,B,C e indicar si uno de los tres divide a los otros dos exactamente Anlisis: Ledos los tres valores y almacenados en cada una de las variables (I dentificadores) A, B y C respectivamente se procede a verificar si cada uno de ellos divide exactamente a los otros dos. La divisin es exacta si el residuo de la divisin respectiva es igual a cero. Algoritmo: Diagrama de flujo INICIO A,B,C FIN No Si Si No A%B=0 y C%B=0 B%A=0 y C%A=0 A divi de a los otros dos exactamente B divi de a los otros dos exactamente Si No A%C=0 y B%C=0 C divide a los otros dos exactamente Ninguno di vide a l os otros dos exactamente ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 115 de 188 Tanto el seudo lenguaje como el seudo c digo deben quedar de acuerdo como se haya realizado el diagrama de fluj o. Es importante para que al realizar la prueba de escritorio nos de lo que diagramamos. Seudo lenguaje I nicio Leer tres valores y almacenarlos en las variables A, B y C Si B residuo A es igual a cero y C residuo A es igual a cero Entonces A divide exactamente a B y C Sino Si A residuo B es igual a cero y C residuo B es igual a cero Escribir B divide exactamente a A y C Sino Si A residuo C es igual a cero y B residuo C es igual a cero Escribir C divide exactamente a A y B Sino Escribir no hay divisin exacta Fin _Si Fin_Si Fin Seudo cdigo I nicio Leer (A, B y C) Si B%A=0 y C%A=0 entonces Escribir(A divide exactamente a B y C) Sino Si A%B=0 y C%B=0 entonces Escribir (B divide exactamente a A y C) Sino Si A%C=0 y B%C=0 entonces Escribir (C divide exactamente a B y A) Sino Escribir (No hay divisin exacta) Fin Si Fin Si Fin Si Fin ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 116 de 188 Cdigo Turbo Pascal: pr ogr am di vi si on_exact a; Uses cr t ; Var A,B,C: i nt eger ; begi n cl r scr ; got oxy( 10,10) ; write(Digite un nmero); r eadl n( A) ; got oxy( 10,11) ; write(Digite otro nmero); r eadl n( B) ; got oxy( 10,12) ; write(Digite otro nmero); r eadl n( C) ; got oxy( 10,13) ; i f ( B mod A= 0) and( C mod A= 0) t hen write(A divide exactamente a C y B) el se i f ( A mod B= 0) and ( C mod B= 0) t hen write(B divide exactamente a A y C) el se i f ( A mod C= 0) and ( B mod C= 0) t hen write(C divide exactamente a A y B); el se write(no hay divisin exacta); r epeat unt i l keypr essed; end Nota: En el ejercicio anterior se hace uso de preguntas que involucran tanto a operadores tanto de relacin como operadores lgicos. Esto es importante ya que la solucin no queda tan compleja y no se queda ninguna opcin sin contemplar. Cdigo Lenguaje C /* Programa divisin exacta */ # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt A,B,C; mai n( ) { cl r scr ( ) ; got oxy( 10,10) ; printf("Digite un nmero A "); scanf ( " % d" ,&A) ; got oxy( 10,11) ; printf("Digite un nmero B "); scanf ( " % d" ,&B) ; got oxy( 10,12) ; printf("Digite un nmero C "); scanf ( " % d" ,&C) ; got oxy( 10,13) ; i f ( B% A= = 0 && C% A= = 0) pri nt f ( " A di vi de exact ament e a C y B" ) ; el se i f ( A% B= = 0 && C% B= = 0) pri nt f ( " B di vi de exact ament e a A y C" ) ; el se i f ( A% C= = 0 && B% C= = 0) pr i nt f ( " C di vi de exact ament e a A y B" ) ; el se printf("no hay divisin exacta"); get ch( ) ; } ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 117 de 188 20. Desarrolle un algoritmo que le permita leer tres valores A,B,C e indicar si la suma de dos nmeros cualquiera es igual al tercero. Anlisis: Primero se deben leer los tres valores y almacenar cada valor en una variable. En el caso del ejemplo se guardarn los valores en los identificadores A,B, y C. luego se proceder a realizar las diferentes comparaciones. Es de anotar que al resolver el ejercicio, queda un doble anidamiento. Es decir un I f queda dentro de otro y ese a su vez esta anidaddodentro de otro. El ejercicoo se hubiera podido realizar tambien sin necesidad de anidamiento. Algoritmo: Diagrama de flujo INICIO FIN A, B, C A + B = C C + B = A A + C = B A + B es i gual al tercero A + C es igual al tercero C + B es igual al tercero En ningn caso la suma de dos nmeros cualquiera es igual al tercero ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 118 de 188 Seudo lenguaje I nicio Leer tres valores y almacenarlos en las variables A, B y C Si A mas B es igual C entonces Entonces Escribir La suma de A con B es igual a C Sino Si A+C es igual B entonces Escribir la suma de A con C es igual a B Sino Si C mas B es igual A Escribir la suma de C con B es igual a A Sino Escribir En ningn caso la suma es igual Fin _Si Fin_Si Fin Seudo cdigo I nicio Leer (A, B y C) Si A+B=C entonces Escribir(la suma de A+B=C) Sino Si A+C=B entonces Escribir (La suma de A+C=B) Sino Si C+B=A entonces Escribir (La suma de C+B=A) Sino Escribir (En ningn caso la suma es igual) Fin Si Fin Si Fin Si Fin ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 119 de 188 Cdigo Turbo Pascal: pr ogr am val or _cent r o; Uses cr t ; Var A,B,C: i nt eger ; begi n cl r scr ; got oxy( 10,10) ; write(Digite un nmero A ); r eadl n( A) ; got oxy( 10,11) ; write(Digite un nmero B ); r eadl n( B) ; got oxy( 10,12) ; write(Digite un nmero C ); r eadl n( C) ; got oxy( 10,13) ; i f ( A+ B= C) t hen write(A + B = C) el se i f ( A + C= B) t hen write(A + C = B) el se i f ( C+ B= A) t hen write(C + B = A) El se write(en ningn caso hay suma igual) r epeat unt i l keypr essed; end Cdigo Lenguaje C / * Progr ama val or cent r o * / # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt A,B,C; mai n( ) { cl r scr ( ) ; got oxy( 10,10) ; printf("Digite un nmero A "); scanf ( " % d" ,&A) ; got oxy( 10,11) ; printf("Digite un nmero B "); scanf ( " % d" ,&B) ; got oxy( 10,12) ; printf("Digite un nmero C "); scanf ( " % d" ,&C) ; got oxy( 10,13) ; i f ( A+ B= = C) pr i nt f ( " La suma de A+ B= C" ) ; el se i f ( A+ C= = B) pri nt f ( " La suma de A+ B= C" ) ; el se i f ( C+ B= = A) pr i nt f ( " La suma de C+ B= A" ) ; el se pri nt f ( " En ni ngun caso hay suma i gual " ) ; get ch( ) ; } ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 120 de 188 21. Si se tiene la funcin: c bx ax f(x) 2 , el valor de x se calcula as: a ac b b x 2 4 2 , la expresin dentro del radical se le llama discriminante de la ecuacin. Las dos races son reales y desiguales, reales e iguales o imaginarias, segn que el discriminante sea positivo, cero o negativo. Desarrolle un algoritmo que lea valores para a,b,c y determine si hay posible solucin para x de dicha funcin. Anlisis: Ledos los tres valores en las variable a,b y c respectivamente se procede a realizar los chequeos tendientes a ver si las operaciones implcitas en el ejercicio se pueden o no realizar. Por ejemplo hay que verificar que la parte que est dentro del radical no sea negativa y que el valor de divisor "2a" no sea igual a cero. Si verificada esas dos acciones se pueden realizar las operaciones se procede a sacar cada uno de los valore de X, uno con el signo positivo y otro con el signo negativo. Algoritmo: Diagrama de flujo INICIO A, B, C Bl - 4AC <0 Las races son i magi narias A =0 Las races son reales igual es a ac b b X 2 4 1 2 X = -B /2A X Si Si No No FIN a ac b b X 2 4 2 2 Las races son reales di ferentes X1 Y X2 ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 121 de 188 Seudo lenguaje I nicio Leer tres valores y almacenarlos en las variables A, B y C Si B al cuadrado - 4 veces A por C es menor que cero entonces Escribir Las races son imaginarias Sino Si B al cuadrado - 4 veces A por C es igual a cero entonces Hacer X igual a -B dividido 2 por a Escribir la races son reales e iguales a X Sino Hacer a ac b b X 2 4 1 2 Hacer a ac b b X 2 4 2 2 Escribir races reales iguales a X1 y x2 Fin _Si Fin_Si Fin Seudo cdigo I nicio Leer (A, B y C) Si 0 4 2 ac b entonces Escribir (Races imaginarias) Sino Si a=0 entonces a b X 2 / Escribir (Races reales iguales a X) Sino a ac b b X 2 4 1 2 a ac b b X 2 4 2 2 Escribir (Races reales X1 y X2) Fin Si Fin Si Fin ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 122 de 188 Cdigo Turbo Pascal: pr ogr am val or _cent r o; Uses cr t ; Var A,B,C: i nt eger ; begi n cl r scr ; got oxy( 10,10) ; write(Digite un nmero A ); r eadl n( A) ; got oxy( 10,11) ; write(Digite un nmero B ); r eadl n( B) ; got oxy( 10,12) ; write(Digite un nmero C ); r eadl n( C) ; got oxy( 10,13) ; i f ( b* b- 4* a* c< 0) t hen write(Races imaginarias) el se i f ( a= 0) t hen begi n X:= - b/ ( 2* a) write(Races reales iguales a X) end el se begi n X1: = ( - b+ ( sqr t ( b* b-4* a* c) ) / ( 2* a) ; X2:= ( -b- ( sqr t ( b* b-4* a* c) ) / ( 2* a) ; write(raices reales igual a X1 y X2); end; r epeat unt i l keypr essed; end El siguiente cdigo soluciona el anterior ejercicio, con instrucciones para ser ejecutado desde el prompt del Matlab. Recuerde que tiene que guardarlo en un archivo tipo m y luego llamar el archivo desde el prompt digitando el nombre y pulsando enter. a = i nput ( 'Digite un nmero A ' ) ; b = i nput ( 'Digite un nmero B ' ) ; c = i nput ( 'Digite un nmero C ' ) ; i f b^2- 4* a* c<0 f pr i nt f ( 'Races imaginarias\n' ) ; el se i f ( a==0) x=- b/ ( 2* a) ; f pr i nt f ( 'Races reales iguales a X = %f\m' , x) ; el se x1=- b+sqr t ( b* b- 4* a* c) / ( 2* a) ; x2=- b- sqr t ( b* b- 4* a* c) / ( 2* a) ; f pr i nt f ( 'Races reales igual a X1 = %f y X2 = %f\n' , x1, x2) ; end end Cdi go Lenguaj e C / * Pr ogr ama val or cent r o * / # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt A,B,C; mai n( ) { cl r scr ( ) ; got oxy( 10,10) ; printf("Digite un nmero A "); scanf ( " % d" ,&A) ; got oxy( 10,11) ; printf("Digite un nmero B "); scanf ( " % d" ,&B) ; got oxy( 10,12) ; printf("Digite un nmero C "); scanf ( " % d" ,&C) ; got oxy( 10,13) ; i f ( b* b- 4* a* c< 0) pr i nt f ( " Rai ces i magi nar i as" ) ; el se i f ( a= = 0) { X= - b/ ( 2* a) ; pr i nt f ( " Rai ces r eal es i gual es a X" ) ; } el se { X1= - b+ sqr t ( b* b- 4* a* c) / ( 2* a) ; X2= - b- sqr t ( b* b- 4* a* c) / ( 2* a) ; pr i nt f ( " r ai ces r eal es i gual a X1 y X2" ) ; } get ch( ) ; } ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 123 de 188 Los procesos repetitivos son la base del uso de las computadoras. En estos procesos se necesita normalmente contar los sucesos, acciones o tareas internas del ciclo. Una estructura cclica o estructura repe titiva es aquella que le permite al programador repetir un conjunto o bloque de instrucciones, un nmero determinado de veces mientras una condicin dada sea cierta o hasta que una condicin dada se cumpla. Se debe establecer un mecanismo para terminar las tareas repetitivas. Dicho mecanismo es un control que se evala cada vez que se realiza un ciclo. La condicin que sirve de control puede ser verificada antes o despus de ejecutarse el conjunto de instrucciones o sentencias. En caso de que la verificacin o evaluacin resulte verdadera se repite el ciclo o caso de ser falsa lo terminar. Las estructuras cclicas cuyo control es ta antes del ciclo, son estructuras que realizan la evaluacin antes de ejecutar el bloque de instrucciones que tiene que repetir. Dependiendo de la evaluacin que se realice se ejecutara o no dicho conjunto de instrucciones. Es posible que no se realice ni una sola vez ese conjunto de instrucciones. En el caso del MatLab solo trabaja con estructuras cuyo control est antes del ciclo (For y While) Las estructuras cclicas cuyo control esta despus del ciclo, son estructuras que realizan la evaluacin despus de ejecutar el bloque de instrucciones que se desea repetir. Con este tipo de control se obliga a la ejecucin al menos de una vez del bloque de instrucciones. El nmero de ciclos que se realiza puede ser definido previamente o no definido. Para el caso de que el ciclo sea definido en el nmero de veces que se repetir, se debe trabajar un contador para que lleve la cuenta del nmero de tareas. En caso de no tener definido el nmero de ciclos previamente, se tendr que definir muy bien el control a fin de evitar que se quede en un nmero indefinido de ciclos y se bloquee la computadora (LOOP) ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 124 de 188 Una estructura cclica puede estar anidada dentro de otra estructura cclica o de decisin sin problemas. Hay que tener en cuenta que el anidamiento debe ser total. Forma general de la estructura cclica con control antes del ciclo INICIO VAR INICIO CONTROL <= INCREMENTO TAREA FIN > I nicio lnicializacin de variable que cuenta las veces que se repetir las tareas Control de la variable inicio con el final del numero de tarea I nicio Tarea o tareas a realizar I ncremento de la variable que llevara el ciclo Fin FI N INICIO VAR INICIO CONTROL <= INCREMENTO TAREA FIN > I nicio lnicializacin de variable que cuenta las veces que se repetir las tareas Hacer Tarea o tareas a realizar I ncremento de la variable que llevara el ciclo Control de la variable que inicia con el final del numero de tarea FI N ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 125 de 188 Forma general de la estructura ccl ica con control despus del ciclo El enunciado FOR es una construccin de programacin del C que ejecuta un bloque de uno o ms enunciados una determinada cantidad de veces. A veces es llamado ciclo for, debido a que la ejecucin del programa por lo general hace ciclos por los enunciados mas de una vez. Si bien este bucle no se incluye en el Seudo cdigo clsico, con ligeras variantes, es prcticamente adoptado por todos los lenguajes. Por ello, tratamos aqu este bloque con sus posibles modalidades y su Seudo cdigo, no estndar, correspondiente. Un enunciado FOR tiene la siguiente estructura: for (inicial; condicin; incremento) enunciado En el caso del MatLab el FOR esta definido as: for (inicial: incremento: final) enunciado end Si no se define el incremento, el Matlab asume un valor por defecto de 1. inicial, condicin e incremento son expresiones del C, y enunciado es un enunciado simple compuesto del C. Cuando se encuentra un enunciado for durante la ejecucin del programa suceden los siguientes eventos: 1. la expresin inicial es evaluada. Lo inicial es por lo general un enunciado de asignacin que pone una variable a un valor determinado. 2. La expresin de condicin es evaluada. La condicin es tpicamente una expresin relacional. 3. Si la condicin evala a falso, el enunciado for termina y la ejecucin pasa al primer enunciado que se encuentra a continuacin del for. 4. Si la condicin evala a cierto se ejecutan los enunciados que se encuentran dentro del for. 5. La expresin de incremento es evaluada y la evaluacin regresa al paso dos. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 126 de 188 1. Desarrolle un algoritmo que le permita escribir alternadamente Sl y NO 10 veces. Anlisis: Para poder escribir alternadamen te la palabra Si y la palabra NO, es necesario buscar un mecanismo de control para saber cuando se debe escribir SI y cuando se debe escribir NO. Para resolver el presente ejercicio, se asume que se escribir 5 veces la palabra Sl y 5 veces la palabra NO y el mecanismo de control ser con una variable tal que; cuando el valor de dicha variable sea 1 escribe SI y con el valor -1 escribe NO. Se inicializa una variable con el valor de 1 (X=1), para indicar que se inicia escribiendo SI y cada vez que escriba un valor se cambie el signo de la variable (X=-X), tal que la prxima vez escriba NO y as sucesivamente. Y para lograr escribir 10 veces (Repetir la tarea de escritura 10 veces) se hace una variable que se inicie en 1 que seria la primera palabra (SI ) a escribir y finalice en 10 que seria la ltima palabra a escribir (NO) incrementando de uno en uno dicha variable cada vez que escriba una de las dos palabras. El ciclo se trabajar as: La variable o identificador que se utilizar para control del nmero de veces que se repetir la tarea ser la l. I nicia con I =1 Finaliza con I =10 I ncrementa la I en uno o sea I =I +1 Dentro del ciclo se da la orden para escribir SI o NO. Vale la pena anotar que dentro del ciclo deber haber una estructura anidada de decisin con el fin de determinar si se ha de escribir Sl o NO. lgualmente vale aclarar que si se desea escribir 10 veces SI y 10 veces NO, entonces se modifica el INICIO TAREA FIN i =1 i<=4 i =i +1 / * Progr ama que escr i be l os cuat ro pr i mer os nmeros */ # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt i ; mai n( ) { cl r scr ( ) ; f or ( i = 1; i < = 4; i + + ) pr i nt f ( " % d " ,i ) ; get ch( ) ; } ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 127 de 188 diagrama simplemente dejando en uno de los lados de la estructura de decisin el incremento de la variable I . Algoritmo: Diagrama de flujo Seudo lenguaje Seudo cdigo I nicio X =1 i =1 Mientras i <=10 haga I nicio Si X = 1 entonces Escribir(SI ) Si no Escribir(NO) Fin de SI X = -X i= i+1 Fin_Mientras Fin Nota: lntente pasarlo a cdigo pascal y cdigo C. I nicio Asignar a X el valor de 1 Asignar a la variable i el valor de 1 Mientras el valor de i sea menor o igual a 10 Haga I nicie las instrucciones del ciclo Si X es igual a 1 Escriba la palabra SI Si_no Escriba la palabra NO Fin de Si Cambie el signo de X I ncremente el valor de i en uno Finalice las instrucciones del ciclo Fin INICIO X=1 I : 10 <= X = -X SI FIN > I=1 NO X = 1 I=I+1 ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 128 de 188 2. Desarrollar un algoritmo que realice la escritura de los primeros 100 nmeros naturales. Anlisis: Para poder escribir los primeros 100 nmeros entero s, primero hay que generar dichos valores. Una forma de generar los valores, es haciendo uso de las estructuras ciclicas. Hacer una variable que se inicie en 1, en raz a que seria el primer valor a escribir y el control para que finalice, sera con 100, ya que es el ltimo nmero necesitado, incrementando de uno en uno dicha variable. El incremento se hace para poder ir desde el inicio hasta el final o en otras palabras para poder llevar la cuenta del nmerode tareas que se van realizando I nicia con I =1 Finaliza con I =100 I ncrementa la I en uno o sea I =I +1 Dentro del ciclo se da la orden para escribir el valor de la variable I . Algoritmo: Diagrama de flujo Seudo lenguaje La tarea de escribir i y de incrementar la variable i en uno, se repetir mientras la condicin i sea menor o igual a 1 00 (mientras i<=100) se cumpla. Seudo cdigo I nicio i=1 Mientras i<=100 haga I nicio Escribir(i) i= i+1 Fin_Mientras Fin I nicio Asignar a la variable i el valor de 1 Mientras el valor de i sea menor o igual a 100 Haga I nicie las instrucciones del ciclo Escriba el valor de i I ncremente el valor de i en uno Finalice las instrucciones del ciclo Fin INICIO i =1 i : 100 < i =i+1 i FIN > <= ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 129 de 188 Par a Mat l ab si mpl ement e se def i ne l a var i abl e i , y se i ndi ca en el FOR donde i ni ci a y donde t er mi na, El i ncr ement o como no se def i ne, el Mat l ab asume un i ncr ement o de 1. f or i =1: 100 f pr i nt f ( ' %d ' , i ) ; end En el caso de utilizacin de la funcin while, se programa si mi l ar a Lenguaj e C si n l os mar cador es de i ni ci o y f i nal . i =1; whi l e i <=100, f pr i nt f ( '%d\n' , i ) ; i =i +1; end Cdi go Tur bo Pascal con el cont r ol ant es del ci cl o: Program escrinbe_100_nmeros; Uses cr t ; var I :i nt eger; Begi n cl r scr ; i : = 1; whi l e i < = 100 do begi n wr i t e( i : 3) ; i = i + 1; end; r epeat unt i l keypressed; End. Cdi go Turbo Pascal con el control despus del ci cl o: Program escrinbe_100_nmeros; Uses cr t ; Var I : i nt eger ; Begi n cl r scr ; i : = 1; r epeat wr i t e( i :3) ; i = i + 1; unt i l i > 100; r epeat unt i l keypr essed; End. /* Cdigo Lenguaje C con Cont r ol ant es del ci cl o Escr i be 100 numeros * / # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt i ; mai n( ) { cl r scr ( ) ; i = 1; whi l e ( i < = 100) { pr i nt f ( " % d " ,i ) ; i + + ; } get ch( ) ; } /* Cdigo Lenguaje C con Control despus del ciclo Escr i be 100 numer os * / # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt i ; mai n( ) { cl rscr ( ) ; i = 1; do { pr i nt f ( " % d " ,i ) ; i + + ; } whi l e ( i < = 100) ; get ch( ) ; } /* Cdigo Lenguaje C con Est r uct ur a f or Escr i be 100 numer os * / # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt i ; mai n( ) { cl rscr ( ) ; f or ( i = 1; i < = 100 ; i + + ) pr i nt f ( " % d " ,i ) ; get ch( ) ; } ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 130 de 188 3. Desarrolle un algoritmo que le permita realizar la suma a los primeros N nmeros impares. Anlisis: Al igual que en ejercicio anterior es necesario apoyarse en una estructura de tipo cclica a fin de poder dar solucin al problema. La idea es desarrollar la estructura para N veces y de la variable que lleve la cuenta generar los nmeros impares buscando la relacin entre la cuenta y el nmero como tal. El primer trmino es el 1, el segundo el tres, el tercero el cinco y as sucesivamente hasta llegar al ensimo trmino que es el 2*N-1. Algoritmo: Diagrama de flujo Seudo lenguaje Seudo cdigo I ni cio Leer N; S=0; i=1 Mientras i<=N hacer I nicio Num=2* i-1; S=S+Num; i = i+1 Fin_Mientras Escribir(S) Fi n I NI CI O S=0 i =1 i : N N < Num =2 * i -1 S = S+Num i = i +1 S FI N > I ni ci o Leer un nmero y almacenarlo en la variable N Asignar a la variable S el valor de 0 Asignar a la variable i el valor de 1 Mientras el valor de la variable i sea menor o igual al valor de la variable N haga I nicio de las instrucciones del ciclo Asigne a la variable Num el valor de 2 * i - 1 Asigne a la variable S el valor que hay Almacenado en S mas el valor almacenado en la variable Num I ncremente el valor de la variable i en 1 Fin de las instrucciones del ciclo Escriba el valor almacenado en S Fi n ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 131 de 188 Codi go par a Mat l ab s=0; i =1; N=i nput ( 'Digite un nmero ' ) ; whi l e i <=N, num=2* i - 1; s=s+num; i =i +1; end f pr i nt f ( '%d\n' , s) Cdigo Turbo Pascal con el control ant es del ci cl o: Pr ogram suma_N_i mpares; Uses cr t ; var num,s,N,I :i nt eger; Begi n cl r scr ; got oxy( 10,10) ; write(Digite un valor ); r eadl n( N) ; s:= 0; i : = 1; whi l e i < = N do begi n num:= 2* i - 1; s= s+ num; i = i + 1; end; got oxy( 10,20) ; write(La suma es ,s); r epeat unt i l keypr essed; End. Cdigo Turbo Pascal con el control despus del ciclo: Progr am suma_N_i mpares; Uses cr t ; Var num,s,N,I : i nt eger ; Begi n cl r scr ; got oxy( 10,10) ; write(Digite un valor ); r eadl n( N) ; s:= 0; i := 1; r epeat num:= 2* i -1; s:= s+ num; i = i + 1; unt i l i > N; got oxy( 10,20) ; write(La suma es ,s); r epeat unt i l keypr essed; End. Cdigo Lenguaje C con Cont r ol ant es del ci cl o / * Pr ogr ama suma N i mpar es * / # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt num,s,N,i ; mai n( ) { cl r scr ( ) ; got oxy( 10,10) ; pri nt f ( " Di gi t e un val or " ) ; scanf("%d,&N); s= 0; i = 1; whi l e ( i < = N) { num= 2* i - 1; s= s+ num; i + + ; } got oxy( 10,20) ; pr i nt f ( " La suma es % d" ,s) ; get ch( ) ; } Cdigo Lenguaje C con Control despus del ciclo / * Pr ogr ama suma N i mapr es * / # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt num,s,N,i ; mai n( ) { cl r scr ( ) ; got oxy( 10,10) ; pr i nt f ( " Di gi t e un val or " ) ; scanf("%d,&N); i = 1; s= 0; do { num= 2* i - 1; s= s+ num; i + + ; } whi l e ( i < = N) ; got oxy( 10,20) ; pr i nt f ( " La suma es % d" ,s) ; get ch( ) ; } ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 132 de 188 4. Calcular la siguiente sumatoria para n trminos: 1 2 + 3 4 + 5 6 +7 8 +9 10 + ........ Anlisis: En el ejercicio planteado hay que buscar un mecanismo de alternar el signo. Cada vez que se genere un ciclo nuevo el signo para la sumatoria vara. Es necesario apoyarse en una estructura de tipo cclica a fin de poder dar solucin al problema. La idea es desarrollar la estructura para repetir N veces la tarea y de la variable que lleve la cuenta generar el signo alternado. Diagrama de flujo Seudo lenguaje Seudo cdigo I nicio Leer N; Sig+1; S=0; i=1 Mientras i<=N hacer I nicio S=S+i * Sig; Sig = -Sig; i= i+1 Fin_Mientras Escribir(S) Fin I nicio Leer un numero y almacenarlo en la variable N Asignar a la variable S el valor de 0 Asignar a la variable Sig el valor de 1 (Positivo) Asignar a la variable i el valor de 1 Mientras el valor de la variable i sea menor o igual al valor de la variable N haga I nicio de las instrucciones del ciclo Asigne a la variable s el valor que hay Almacenado en S mas el valor almacenado en la variable i Cambie el signo a la variable Sig I ncremente el valor de la variable i en 1 Fin de las instrucciones del ciclo Escriba el valor almacenado en S Fin INICIO S=0 i=1 i : N N <= S = S+i*Si g Sig = -Sig i = i +1 S FIN > Sig=1 ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 133 de 188 s=0; si g=1; i =1; Cdigo para Matlab. N=i nput ( 'Digite un nmero ' ) ; whi l e i <=N, s=s+i * si g; si g=- si g; i =i +1; end f pr i nt f ( '%d\n' , s) Cdigo Lenguaje C con Cont r ol ant es del ci cl o / * Pr ogr ama suma N numer os + - * / # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt num,s,Si g,N,i ; mai n( ) { cl r scr ( ) ; got oxy( 10,10) ; pri nt f ( " Di gi t e un val or " ) ; scanf("%d,&N); s= 0; Si g= 1; i = 1; whi l e ( i < = N) { s= s+ num; Si g+ - Si g; i + + ; } got oxy( 10,20) ; pr i nt f ( " La suma es % d" ,s) ; get ch( ) ; } Cdigo Lenguaje C con Control despus del ciclo / * Pr ogr ama suma N numer os + - * / # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt num,s,Si g,N,i ; mai n( ) { cl r scr ( ) ; got oxy( 10,10) ; pr i nt f ( " Di gi t e un val or " ) ; scanf("%d,&N); i = 1;Si g= 1;s= 0; do { s= s+ num; Si g= - Si g; i + + ; } whi l e ( i < = N) ; got oxy( 10,20) ; pr i nt f ( " La suma es % d" ,s) ; get ch( ) ; } Cdigo Turbo Pascal con el control ant es del ci cl o: Pr ogr am suma_N_numer os+ - ; Uses cr t ; var num,s,Si g,N,I : i nt eger ; Begi n cl r scr ; got oxy( 10,10) ; write(Digite un valor ); r eadl n( N) ; s:= 0;Si g= 1;i := 1; whi l e i < = N do begi n s= s+ i * Si g; Si g= - Si g; i = i + 1; end; got oxy( 10,20) ; write(La suma es ,s); r epeat unt i l keypressed; End. Cdigo Turbo Pascal con el control despus del ciclo: Progr am suma_N_numer os+ - ; Uses cr t ; Var num,s,Si g,N,I : i nt eger ; Begi n cl r scr ; got oxy( 10,10) ; write(Digite un valor ); r eadl n( N) ; s:= 0;Si g= 1;i := 1; r epeat s:= s+ i * Si g; Si g= - Si g; i = i + 1; unt i l i > N; got oxy( 10,20) ; write(La suma es ,s); r epeat unt i l keypressed; End. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 134 de 188 5. Desarrolle un algoritmo que calcule el promedio a los primeros N nmeros naturales. Anlisis: Para dar solucin al ejercicio se procede de la siguiente forma: Se debe generar una estructura cclica que se encargue de contar el nmero de trminos a sumar, en el caso del ejercicio ser de N. La cuenta de los trminos coincide con el valor a sumar, es decir la variable que se va a encargar de contar los trminos sirve adems como generadora de los trminos a sumar. Se acumularn dichos nmeros generados y al final se promediara dicha sumatoria entre el nmero de trminos sumados. Algoritmo: Diagrama de flujo Seudo cdigo INICIO S=0 i=1 i : N N <= P = S / N S = S+i S,P FIN > i++ I nicio Leer N S=0 i=1 Mientras i<=N hacer I nicio S=S+i i= i+1 Fin_Mientras P=S/ N Escribir(S,P) ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 135 de 188 Cdi go Tur bo Pascal con el Cont r ol ant es del ci cl o: Program promedio_de_N_nmeros; Uses cr t ; var s,N,I : i nt eger ; p : r eal ; Begi n cl r scr ; got oxy( 10,10) ; write(Digite un valor ); r eadl n( N) ; s:= 0; i : = 1; whi l e i < = N do begi n s:= s+ i ; i := i + 1; end; p:= s/ N; got oxy( 10,20) ; write(El promedio es ,p); r epeat unt i l keypr essed; End. Control Cdigo Turbo Pascal con el despus del ciclo: Program promedio_de_N_nmeros; Uses cr t ; Var s,N,I : i nt eger ; p : r eal ; Begi n cl r scr ; got oxy( 10,10) ; write(Digite un valor ); r eadl n( N) ; s: = 0; i : = 1; r epeat s:= s+ num; i : = i + 1; unt i l i > N; p:= s/ N; got oxy( 10,20) ; write(El promedio es ,p); r epeat unt i l keypr essed; End. Cdi go Lenguaj e C con Cont r ol ant es del ci cl o / * Pr ogr ama suma N i mpar es * / # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt s,N,i ; f l oat p; mai n( ) { cl r scr ( ) ; got oxy( 10,10) ; pr i nt f ( " Di gi t e un val or " ) ; scanf("%d,&N); s= 0; i = 1; whi l e ( i < = N) { s= s+ i ; i + + ; } p= s/ N; got oxy( 10,20) ; pr i nt f ( " El pr omedi o es % f " ,p) ; get ch( ) ; } Cdigo Lenguaje C con Control despus del ciclo / * Pr ogr ama suma N i mapres * / # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt s,N,i ; f l oat p; mai n( ) { cl r scr ( ) ; got oxy( 10,10) ; pri nt f ( " Di gi t e un val or " ) ; scanf("%d,&N); i = 1; s= 0; do { s= s+ i ; i + + ; } whi l e ( i < = N) ; p= s/ N; got oxy( 10,20) ; pr i nt f ( " El pr omedi o es % f " ,p) ; get ch( ) ; } ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 136 de 188 6. Desarrolle un algoritmo que le permita sacar y escribir el cuadrado de cada uno de los primeros N nmeros naturales. Anlisis: Para dar solucin al ejerci cio se procede de la siguiente forma: Se debe generar una estructura cclica que se encargue de generar cada uno de los trminos a los cuales se les va a sacar cuadrado. La variable encargada de contar los trminos en la estructura cclica sirve como variable que guarda cada termino al cual se le saca el cuadrado. Algoritmo: Diagrama de flujo Seudo lenguaje Seudo cdigo I nicio Leer N i=1 Mientras i<=N hacer I nicio Num= i * i Escribir(Num) i= i+1 Fin_Mientras Fin INICIO i=1 i : N N <= Num = i * i i=i+1 Num FIN > I nicio Leer un valor y almacenarlo en la variable N Hacer i igual a 1 Mientras i sea menor o igual a N hacer I nicio del ciclo Hacer Num igual a i * i Escribir el valor de Num Hacer i igual a i mas 1 Fin del ciclo mientras Fin ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 137 de 188 Cdigo Turbo Pascal con el control ant es del ci cl o: Pr ogr am cuadr ado_de_N_numeros; Uses cr t ; var N,Num,I : i nt eger ; Begi n cl r scr ; got oxy( 10,10) ; write(Digite un valor ); r eadl n( N) ; i : = 1; whi l e i < = N do begi n Num: = i * i ; got oxy( 10,12+ i ) ; write(EL cuadrado es ,Num); i := i + 1; end; r epeat unt i l keypr essed; End. Cdigo Turbo Pascal con el control despus del ciclo: Progr am cuadr ado_de_N_numer os; Uses cr t ; var N,Num,I : i nt eger; Begi n cl r scr ; got oxy( 10,10) ; write(Digite un valor ); r eadl n( N) ; i : = 1; r epeat Num: = i * i ; got oxy( 10,12+ i ) ; write(EL cuadrado es ,Num); i := i + 1; unt i l i > N; r epeat unt i l keypr essed; End. Cdigo Lenguaje C con Cont r ol ant es del ci cl o / * Pr ogr ama cuadrado de N numer os * / # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt Num,N,i ; mai n( ) { cl r scr ( ) ; got oxy( 10,10) ; pr i nt f ( " Di gi t e un val or " ) ; scanf ( " % d" ,&N) ; i = 1; whi l e ( i < = N) { Num= i * i ; got oxy( 10,12+ i ) ; pr i nt f ( " EL cuadr ado de % d es % d " ,i ,Num) ; i + + ; } get ch( ) ; } Cdigo Lenguaje C con Control despus del ciclo / * Pr ogr ama cuadr ado de N Numer os * / # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt Num,N,i ; mai n( ) { cl r scr ( ) ; got oxy( 10,10) ; pr i nt f ( " Di gi t e un val or " ) ; scanf ( " % d" ,&N) ; i = 1; do { Num= i * i ; got oxy( 10,12+ i ) ; pr i nt f ( " EL cuadr ado de % d es % d" ,i ,Num) ; i + + ; } whi l e ( i < = N) ; get ch( ) ; } ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 138 de 188 7. Desarrolle un algoritmo que le permita leer un valor entero positivo N y entregue como resultado el clculo de su factorial. Anlisis: El tipo de operacin que se repite en este ejercicio, es la multiplicacin, por tanto se inicia una variable con el valor de 1, ya que este valor no afecta el resultado final. Dicha variable es S y como generador de la serie de trminos a multiplicar se tiene la misma variable que llevar la cuenta del nmero de tareas. Algoritmo: Diagrama de flujo Seudo lenguaje Seudo cdigo I nicio Leer N S=1 i=1 Mientras i<=N hacer I nicio S=S * i; i= i+1 Fin Escribir(S) Fin INICIO S=1 i=1 i : N N <= S = S*i i=i+1 S FIN > I nicio Leer un valor y almacenarlo en la variable N. A este valor se calcular su factorial Asignar a la variable S el valor de 1 Asignar a la variable i el valor de 1 Mientras el valor de i sea menor o igual que el valor de N hacer I nicio de instrucciones del ciclo mientras Asignar a s el valor de S por i I ncrementar el valor de i en uno. Finalizar las instrucciones del ciclo Escribir el valor de S Fin ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 139 de 188 Cdigo para Matlab Cdigo Turbo Pascal con el control ant es del ci cl o: Progr am Fact or i al _de_N; Uses cr t ; var N,S,i : i nt eger ; Begi n cl r scr ; got oxy( 10,10) ; write(Digite un valor ); r eadl n( N) ; i : = 1;S:= 1; whi l e i < = N do begi n S: = S* i ; i := i + 1; end; got oxy( 10,12) ; write(EL factorial es ,S); r epeat unt i l keypr essed; End. Cdigo Turbo Pascal con el control despus del ciclo: Progr am Fact or i al _de_N; Uses cr t ; var S,N,i : i nt eger ; p : r eal ; Begi n cl r scr ; got oxy( 10,10) ; write(Digite un valor ); r eadl n( N) ; i : = 1; S:= 1; r epeat S:= S* i ; i := i + 1; unt i l i > N; got oxy( 10,12) ; write(EL factorial es ,S); r epeat unt i l keypr essed; End. Cdigo Lenguaje C con Control despus del ciclo / * Pr ogr ama Fact or i al de N * / # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt S,N,i ; mai n( ) { cl r scr ( ) ; got oxy( 10,10) ; pr i nt f ( " Di gi t e un val or " ) ; scanf ( " % d" ,&N) ; i = 1; S= 1; do { S= S* i ; i + + ; } whi l e ( i < = N) ; got oxy( 10,12+ i ) ; pr i nt f ( " EL f act or i al es % d" ,S) ; get ch( ) ; } Cdigo Lenguaje C con Cont r ol ant es del ci cl o / * Pr ogr ama f act or i al de N * / # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt S,N,i ; mai n( ) { cl r scr ( ) ; got oxy( 10,10) ; pr i nt f ( " Di gi t e un val or " ) ; scanf ( " % d" ,&N) ; i = 1; S= 1; whi l e ( i < = N) { S= S* i ; i + + ; } got oxy( 10,12) ; pr i nt f ( " EL f act or i al es % d " ,S) ; get ch( ) ; } s=1; i =1; N=i nput ( 'Digite un nmero ' ) ; whi l e i <=N, s=s* i ; i =i +1; end f pr i nt f ( 'El Factorial de N es %d\n' , s) ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 140 de 188 8. Desarrolle un algoritmo que le permita leer un valor entero positivo N y decir si dicho valor es un nmero primo o no. Anlisis: Un nmero es primo cuando es divisible tan solo por la unidad y por si mismo. Para determinar si un nmero es primo o no, se realiza la verificacin de la divisin de dicho nmero con el rango de datos comprendidos entre el dos y la mitad del nmero. Si existe algn valor de dicho rango, que divida exactamente a nuestro nmero entonces, este no ser primo. Si al finalizar dicha revisin no hay ningn valor que lo divida exactamente, entonces nuestro nmero ser primo. La revisin se hace hasta la mitad del nmero ya que de la mitad hacia arriba ningn valor lo divide exactamente. Algoritmo: Diagrama de flujo Seudo cdigo I nicio Leer N S=0 J=2 Mientras J<=N%2 hacer I nicio Si N / J=0 S=S+1 J=J+1 Fin Si S=0 Escribir(N es primo) Sino Escribir(N es primo) Fin_Si Fin INICIO N S=0 FIN J=2 J: N / 2 N%J=0 S= S+1 J= J+1 S=0 <= > N no es pri mo N es pri mo Si No No Si ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 141 de 188 Cdi go Tur bo Pascal con cont r ol ant es del ci cl o: Program nmero_primo; Uses cr t ; var N,S,J : i nt eger ; Begi n cl r scr ; got oxy( 10,10) ; wri t e( " Di gi t e un val or N " ) ; r eadl n( N) ; J= 2; S: = 0; whi l e J< = N mod 2 do begi n i f N mod J = 0 t hen S: = S+ 1; J: = J+ 1; end; got oxy( 10,12) ; i f S= 0 t hen write(N es primo) el se write(N no es primo ); r epeat unt i l keypr essed; End. Cdigo Turbo Pascal con control despus del ciclo: Program nmero_primo Uses cr t ; Var S,N,J : i nt eger ; Begi n cl r scr ; got oxy( 10,10) ; write(Digite un valor ); r eadl n( N) ; J: = 2; S:= 0; Repeat begi n i f N mod J = 0 t hen S: = S+ 1; J: = J+ 1; end; unt i l J> ( N mod 2) ; got oxy( 10,12) ; i f S= 0 t hen write(N es primo) el se write(N no es primo ); r epeat unt i l keypr essed; End. Cdigo Lenguaje C con control despus del ciclo / * Pr ogr ama numer o pr i mo * / # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt S,N,J; mai n( ) { cl r scr ( ) ; got oxy( 10,10) ; pri nt f ( " Di gi t e un val or N " ) ; scanf ( " % d" ,&N) ; J= 2; S= 0; do { i f ( N% J= = 0) S= S+ 1; J+ + ; } whi l e ( J< N/ 2) ; got oxy( 10,12) ; i f ( S= = 0) pri nt f ( " N es pr i mo" ) ; el se pr i nt f ( " N no es pr i mo" ) ; get ch( ) ; } Cdigo Lenguaje C con control ant es del ci cl o / * Pr ogr ama numer o pri mo * / # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt S,N,J; mai n( ) { cl r scr ( ) ; got oxy( 10,10) ; pr i nt f ( " Di gi t e un val or N " ) ; scanf ( " % d" ,&N) ; J= 2; S= 0; whi l e ( J< = N/ 2) { i f ( N% J= = 0) S= S+ 1; J+ + ; } got oxy( 10,12) ; i f ( S= = 0) pr i nt f ( " N es pr i mo" ) ; el se pr i nt f ( " N no es pr i mo" ) ; get ch( ) ; } ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 142 de 188 9. Desarrolle un algoritmo que le permita realizar la escritura de los primeros N nmeros Primos. Anlisis: En este ejercicio se involucra el concepto anterior de nmero primo y se est adicionando una estructura cclica que se encargara de contar los N nmeros primos que se desean escribir. Algoritmo: Diagrama de flujo INICIO i=1 i : N N <= S=0 i++ Num FIN > J=2 J: Num/2 Num=1 S= S+1 J= J+1 S=0 Num++ <= > Num%J Si Si N N ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 143 de 188 Seudo cdigo I nicio Leer(N) Num=1 i=1 mientras i<=1 hacer inicio S=0 J=2 Mientras j<= Num/ 2 hacer inicio I f Num%j=0 entonces S=S+1 j=j+1 fin_mientras si S=0 entonces inicio Escriba(num) I =i+1 fin_si Num=Num+1 fin_mientras fin / * Pr ogr ama que escr i be l os primeros N nmeros primos */ # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt i ,j ,Num,N,S; mai n( ) { cl r scr ( ) ; got oxy( 10,6) ; pr i nt f ( " Di gi t e un val or N " ) ; scanf ( " % d" ,&N) ; Num= 1; i = 1; whi l e ( i < = N) { S= 0; j = 2; whi l e ( j < = Num/ 2) { i f ( Num% j = = 0) S= S+ 1; j + + ;} i f ( S= = 0) { pr i nt f ( " % d " ,Num) ; i + + ; } Num+ + ; } get ch( ) ; } ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 144 de 188 INICIO Dif=W-Z FIN MCD=1 Di f:0 W%Dif=0 y Z%Di f=0 MCD=Dif MCD=N > <= N no es MCD N es MCD Si No No Si N,W,Z Dif=0 Di f=Dif-1 10. Desarrolle un algoritmo que le permita leer un valor entero positivo N y verifique si es mximo comn divisor de otros dos valores ledos y almacenados en W y Z. Anlisis: Existen diferentes maneras de verificar si un nmero es el mximo comn divisor de otros dos valores. Una manera es hallar la diferencia entre dichos valores y comenzar a verificar de esa diferencia hacia atrs si existe un valor que divida a los dos exactamente. En el momento de encontrar dicho valor el algoritmo no verifica ms. En caso de ex istir un valor que los divida, al final se compara con el valor de N, si es igual es porque N es el MCD. Algoritmo Diagrama de flujo ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 145 de 188 /* Programa que verifica si un nmero N es mximo comn divisor de W y Z */ # i ncl ude " coni o.h" # i ncl ude " st di o.h" # i ncl ude " mat h.h" i nt Di f ,N,W,Z,MCD; mai n( ) { cl r scr ( ) ; got oxy( 10,6) ; pr i nt f ( " Di gi t e un val or N " ) ; scanf ( " % d" ,&N) ; got oxy( 10,8) ; pr i nt f ( " Di gi t e un val or W " ) ; scanf ( " % d" ,&W) ; got oxy( 10,10) ; pr i nt f ( " Di gi t e un val or Z " ) ; scanf ( " % d" ,&Z) ; Di f = abs( W- Z) ; MCD= 1; whi l e ( Di f > 0) { i f ( W% Di f = = 0 && Z% Di f = = 0) { MCD= Di f ; Di f = 0; } el se Di f = Di f - 1; } got oxy( 10,12) ; i f ( MCD= = N) pr i nt f ( " N es MCD " ) ; el se pr i nt f ( " N no es MCD " ) ; get ch( ) ; } ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 146 de 188 11. Desarrolle un algoritmo que le permita leer un valor entero positivo N dado en base decimal y convertirlo a base binaria. Anlisis: Para convertir un nmero repres entado en base decimal (10) a base binaria (2) es necesario dividir el nmero inicial ( ), consecutivamente por 2 hasta llegar a un valor de 0. Se toma en una variable el residuo de dividir el nmero entre dos y el residuo de la divisin exacta se va escribiendo, Luego se retoma en la variable donde estaba el nmero inicialmente, el valor entero que resulte de la divisin. A manera de ejemplo, se lee en una variable el valor 15, inicialmente se divide entre 2, el residuo es 1, entonces se escribe dicho 1 y la variable retoma el valor 7 que es la parte entera de dividir 15 en 2. Esto se hace sucesivamente hasta llegar a dividir 1 entre 2 para escribir el residuo 1 y la parte entera 0. Nota: Vale la pena aclarar que en lenguaje C el operador % deja el valor del residuo y el operador / deja la parte entera si la variable en la cual se almacena ha sido declarada de tipo entero. Algoritmo Diagrama de flujo Seudo lenguaje INICIO N : 0 N > R = N%2 N = N/2 R FIN <= I nicio Leer un valor y almacenarlo en N Mientras N >0 hacer I nicio Hacer R igual al residuo de dividir a N entre 2 Escribir el residuo R Hacer el numero N igual a la parte entera de N Divido 2 Fin mientras Fin ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 147 de 188 /* Programa que lee un nmero y dicho nmero a base binaria */ # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt N,R,col ; mai n( ) { cl rscr ( ) ; col = 70; got oxy( 10,6) ; pri nt f ( " Di gi t e un val or N " ) ; scanf ( " % d" ,&N) ; got oxy( 10,8) ; pr i nt f ( " El deci mal % d en base bi nar i a es" ,N) ; whi l e ( N> 0) { R= N% 2; got oxy( col ,10) ; pr i nt f ( " % d" ,R) ; col = col - 4; N= N/ 2; } get ch( ) ; } ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 148 de 188 12. Desarrolle un algoritmo que le permita leer un valor entero N y lo invierta usando estructuras ciclicas. Para este caso se hace uso de funciones que tiene el lenguaje C. Anlisis: Para la solucin del presente ejer cicio, es necesario trabajar teniendo en cuenta la caracterstica de los tipos de datos enteros. . lgualmente es necesario trabajar con el operador (%) para conseguir el residuo. Pasos a seguir: Primero se lee un valor entero largo y se almacena en la variable N. El parmetro de lectura es %ld. Se inicializa un indicador (variable) J con el valor de 0. Esta variable ser la encargada de fomar el nmero invertido. Haciendo uso de la herramienta ciclica, se procede a dividir el nmero originalmente leido hasta que este se vuelva 0. Por eso el control se realiza con el valor de 0. Mientras el nmero sea mayor que cero se procede a realizarlas operaciones que son repetitivas. En el ciclo, se almacena en la variable R el valor del residuo de dividir el nmero entre 10. Por ejemplo si se lee 521, en R quedar el valor de 1 la primera vez que se ejecute el ciclo. Luego se divide el nmero entre 10 y se toma la parte enterra (por ser de tipo entero) o sea que en caso del ejemplo N quedar con el valor de 52. Luego en J se deja el valor anterior por 10 ms el residuo. Esto es para ir acumulando el residuo al lado derecho.
I nicio Leer un valor y almacenarlo en N I nicializar un valor J con 0 Mientras N >0 hacer I nicio Hacer R igual al residuo de dividir a N entre 10 Dividir el numero entre 10 Hacer J igual al valor anterior por 10 mas el residuo Fin mientras Escribir el valor almacenado en J. Fin I NI CI O N : 0 N > R = N % 10 J FI N <= J=J*10+R J = 0 N=N / 10 ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 149 de 188 #include "conio.h" #include "stdio.h" long int N,J,R; main() { clrscr(); gotoxy(10,10); printf("Digite el nmero "); scanf("%ld",&N); J=0; while (N>0) { R=N%10; N=N/10; J=J*10+R; } gotoxy(10,12); printf("El nmero invertido es : %ld",J); getch(); } Similar al cdigo anterior, se puede resolver el ejercicio haciendo uso de procedimientos. Un procedimiento para leer el nmero original ( ), Otro procedimiento invierte el nmero ( ) y otro procedimiento escribe el valor invertido ( ). #include "conio.h" #include "stdio.h" void leer(); void escribir(); void invertir(); long int N,J=0; /* Las variables se pueden inicializar tan pronto son declaradas */ int R; main() { leer(); invertir(); escribir(); getch(); } void leer() { clrscr(); gotoxy(5,5); scanf("%ld",&N); }
void escribir () { gotoxy(5,10); printf("%ld",J); } void invertir() { while (N>0) { R=N%10; N/=10; /* Operacin equivalente a N=N/10 */ J=J*10+R; } } ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 150 de 188 13. Leer un nmero entero y almacenarlo en la variable N y leer una base numrica cualquiera en la variable Base. Pasar el valor N a Base Base. Anlisis: Para la solucin del presente ejercicio se sigue de forma similar el procedimiento anterior, con la diferencia que se va a dividir consecutivamente por el valor de la base y no por dos como se hizo en el anterior. Diagrama de flujo Seudo lenguaje /* Programa que lee un nmero y una base y convierte dicho nmero a esa base * / # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt N,base,R,col ; mai n( ) { cl rscr ( ) ; col = 70; got oxy( 10,6) ; pr i nt f ( " Di gi t e un val or N " ) ; scanf ( " % d" ,&N) ; got oxy( 10,8) ; pri nt f ( " Di gi t e una base " ) ; scanf ( " % d" ,&base) ; got oxy( 10,10) ; pr i nt f ( " El deci mal % d en base % d es :" ,N,base) ; whi l e ( N> 0) { R= N% base; got oxy( col ,12) ; pr i nt f ( " % d" ,R) ; col = col - 4; N= N/ base; } get ch( ) ; } I nicio Leer un valor y almacenarlo en N y una base y almacenarla en la variable Base Mientras N >0 hacer I nicio Hacer R igual al residuo de dividir a N entre 2 Escribir el residuo R Hacer el numero N igual a la parte entera de N Divido 2 Fin mientras Fin I NI CI O N : 0 N, Base <= R = N%Base R FI N > N = N / Base ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 151 de 188 14. Desarrolle un algoritmo que le permita leer un valor entero positivo N y sacar su cuadrado sumando los primeros N impares. Anlisis: Diagrama de flujo Seudo lenguaje / * pr ogr ama que escr i be el cuadr ado de un nmero sumando N impares */ # i ncl ude " coni o.h" / * pr ogr ama que l ee un val or N y cal cul e su cuadr ado * / # i ncl ude " st di o.h" i nt i ,N,S; mai n( ) { cl r scr ( ) ; got oxy( 10,6) ; pri nt f ( " Di gi t e un val or N " ) ; scanf ( " % d" ,&N) ; S= 0; i = 1; whi l e ( i < = N) { S= S+ ( 2* i - 1) ; i + + ; } got oxy( 10,8) ; pr i nt f ( " El cuadr ado de % d es % d " ,N,S) ; get ch( ) ; } INICIO N S=0 i : N S i=1 S = S+ (2*i-1) i = i+1 < > FIN I nicio Leer un valor y almacenarlo en N Hacer S igual a 0 Hacer i igual a 1 Mientras i sea menor o igual a N hacer I nicio Hacer S igual a S mas 2 por i menos 1 Hacer i igual a i mas 1 Fin mientras Escribir el valor de S Fin ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 152 de 188 15. Desarrolle un algoritmo que le permita leer un valor entero positivo N y calcular su cuadrado sumando N veces N. Anlisis : Para desarrollar el ejercicio basta con declarar un acumulador para llevar la suma de los N trminos y generar un ciclo que se repita las N veces. Diagrama de flujo Seudo lenguaje / * pr ogr ama que escr i be el cuadr ado de un nmero sumando N veces el nmero */ # i ncl ude " coni o.h" / * pr ogr ama que l ee un val or N y cal cul e su cuadr ado sumando N veces * / # i ncl ude " st di o.h" i nt i ,N,S; mai n( ) { cl r scr ( ) ; got oxy( 10,6) ; pr i nt f ( " Di gi t e un val or N " ) ; scanf ( " % d" ,&N) ; S= 0; i = 1; whi l e ( i < = N) { S= S+ N; i + + ; } got oxy( 10,8) ; pr i nt f ( " El cuadr ado de % d es % d " ,N,S) ; get ch( ) ; } INICIO N S=0 i : N S i=1 S = S+ N i = i+1 < > FIN I nicio Leer un valor y almacenarlo en N Hacer S igual a 0 Hacer i igual a 1 Mientras i sea menor o igual a N hacer I nicio Hacer S igual a S ms N Hacer i igual a i ms 1 Fin mientras Escribir el valor de S Fin ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 153 de 188 16. Desarrolle un algoritmo que le permita leer N valores y calcular la media aritmtica n x x x x n / ) .... ( 3 2 1 Anlisis : para poder calcular el valor de la media aritmtica a N valores almacenados en una variable tipo vector, es necesario leer y acumular dichos valores dentro de una estructura cclica y al finalizar el ciclo calcular el valor del promedio dividiendo el valor acumulado entre el nmero de valores ledos. Para el caso del ejemplo los valores se deben leer directamente desde el teclado. Las tareas a ejecutar Dentro del ciclo son : Leer Acumular Fuera del ciclo son : Promediar Escribir Diagrama de flujo Seudo lenguaje I nicio Leer un valor y almacenarlo en N Hacer S igual a 0 Hacer i igual a 1 Mientras i sea menor o igual a N hacer I nicio Leer un valor y almacenarlo en Num Hacer S igual a S + Num Hacer i igual a i ms 1 Fin mientras Hacer media igual a S dividido N Escribir el valor de Media Fin I NI CI O S=0 i=1 N <= Media = S/N S = S+ Num Media FI N > i++ Num i : N ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 154 de 188 17. Leer un nmero entero (entero largo) positivo e invertirlo. Por ejemplo, si el nmero es 15429852, se debe obtener como resultado 25892451 Anlisis: Se debe leer el valor en una variable de tipo entero largo. La razon de lo anterior es el maximo valor que puede almacenar una variable de dicho tipo. Ahora la tarea a realizar es dividir por 10 el valor mientras el nmero sea mayor a 10 y obtner el residuo en otra variable. Y en otra variable realizar la operacin contraria es decir ir multiuplicando por 10 el residuo y sumando el nuevo residuo. Como ejemplo pequeo se tiene 15, al divi dir 15 entre 10 da 1 la parte entera de la divisin y el residuo es 5. El valor acumulado lo multiplicamos por 10 y le sumamos el ltimo residuo. Como se inicia con un valor acumulado de 0 entonces la primera operacin queda 0*/10+5 es deci r 5. Ahoira al dividir 1 entre 10 da 0 y el residuo es 1. El acumulado que es 5 se multiplica por 10 y se le suma el ltimo residuo es decir 1 y da 51. No es necesario realizar ms ciclos en razon que el nmero original quedo en 0. En este ejercico se realiza el ejercicio sin funciones. /* programa Calcula la media aritmtica */ # i ncl ude " coni o.h" # i ncl ude " st di o.h" i nt N, i , Num; f l oat Medi a, S; mai n( ) { cl r scr( ) ; got oxy( 10,10) ; printf("Digite El numero de trminos a promediar "); scanf ( " % d" ,&N) ; S= 0; i = 1; whi l e ( i < = N) { got oxy( 10,12) ;cl r eol ( ) ; printf("Digite el %d nmero ",i); scanf ( " % d" ,&Num) ; S= S+ Num; i + + ; } Medi a= S/ N; got oxy( 10,14) ; printf("La media Aritmtica es %f",Media); get ch( ) ; } ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 155 de 188 Las tareas a ejecutar Dentro del ciclo son : dividir el valor original Multiplicar por 10 el valor final Fuera del ciclo son : Leer el valor original Escribir el vbalor invertido #i ncl ude " coni o. h" #i ncl ude " st di o. h" l ong i nt num, acum, r es; mai n( ) { cl r scr ( ) ; got oxy( 5, 5) ; pr i nt f ( " Di gi t e el dat o a i nver t i r " ) ; got oxy( 31, 5) ; scanf ( " %l d" , &num) ; acum = 0; whi l e ( num>0) { r es = num- ( num/ 10) * 10; num = ( num- r es) / 10; acum = acum* 10+r es; } got oxy( 5, 10) ; pr i nt f ( " El dat o ya i nver t i do es %l d" , num2) ; get ch( ) ; } I NI CI O acum=0 num:0 num > num=(num-res)/10 acum FI N <= acum=acum*10+res res=num-(num/10)*10 ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 156 de 188 /* programa Calcula la media geomtrica */ # i ncl ude " coni o.h" # i ncl ude " st di o.h" # i ncl ude " mat h.h" i nt N, i , Num; f l oat Medi a, S; mai n( ) { cl r scr ( ) ; got oxy( 10,10) ; printf("Digite El nmero de trminos a promediar "); scanf ( " % d" ,&N) ; S= 0; i = 1; whi l e ( i < = N) { got oxy( 10,12) ; cl r eol ( ) ; printf("Digite el %d nmero ",i); scanf ( " % d" ,&Num) ; S= S* Num; i + + ; } Medi a = pow( S,1/ N) ; got oxy( 10,14) ; printf("La media Geomtrica es %f",Media); get ch( ) ; } 18. Desarrolle un algoritmo que le permita leer N valores y calcule con dichos valores la media geomtrica n n x x x x * ... * * * 3 2 1 Anlisis: Leer los n valores no tendr inconvenientes, porque se sabe que con la ayuda de una estructura de programacin cclica se puede realizar esta labor. Ahora la tarea a realizar es la multiplicacin sucesiva de los trminos que se irn a leer. En razn de lo anterior es necesario declarar una variable que servir de acumulador de la multiplicacin sucesiva con un valor inicial de 1, ya que este valor no afectar el resultado final. Al final del ciclo se realizar el clculo de la media geomtrica. Las tareas a ejecutar Dentro del ciclo son : Leer Acumular multiplicacin Fuera del ciclo son : Calcula la media Escribir el resultado Algoritmo Diagrama de flujo Cdigo INICIO S=1 i=1 i : N N <= Mediageo= N s S = S*Num Mediageo FIN > i++ Num ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 157 de 188 CODI FI CAR EN C LOS SI GUIENTES EJERCICI OS 1. Desarrolle un algoritmo que le permita leer N valores, sumar todos los valores y decir cual es el nmero mayo r, cual es el menor y cual es la suma. Anlisis: El desarrollar algoritmos nos permite plantearlos de mltiples maneras. En el caso del ejercicio planteado es necesario leer un primer valor y asumir a ese valor como mayor y a su vez como menor. Luego se desarrolla la lectura de los N-1 valor restantes y cada vez que se tenga un nuevo valor se compara para saber si es mayor o menor de los almacenados anteriormente. Esta tarea se desarrolla con la ayuda de una estructura de decisin. Diagrama de flujo INICIO S=Num ; i=1 i : N-1 <= S = S+ Num FIN > i++ Num May =Num Men =Num Num>M May=Num Men=Num Num<M Si Si No No Men, May, N,Num ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 158 de 188 2. Desarrolle un algoritmo que le permita leer N valores y escriba los que sean mltiplos de 5. Anlisis: Apoyados en una estructura de programacin cclica se leen los N valores y con una estructura de decisin se decide si el nmero ledo es o no mltiplo de cinco (5) para escribirlo en caso afirmativo. Es de anotar que se desarrolla el ejercicio con una estructura completamente anidada dentro de otra, los valores ledos no son almacenados en ningn identificador en razn que con ellos no se realiza ninguna operacin despus de su lectura. Diagrama de flujo INICIO i=1 i : N N <= Num FIN > i++ Num Num%5=0 Si No ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 159 de 188 3. Desarrolle un algoritmo que le permita leer N valores y escribir independientemente el promedio de pares e impares. Anlisis: Apoyados en una estructura de programacin cclica se leen los N valores y dentro del ciclo se verifica si es par o impar para as mismo acumularlo en variables independientes. lgualmente se van contando el nmero de trminos pares e impares por aparte. Al final se promediara la suma de cada uno entre el nmero de trminos. Cada tarea se ha ce por aparte con variables diferentes. Diagrama de flujo INICIO I=0 i=1 i : N N <= P=P+1 FIN > i++ Num Par=0 Imp=0 Num%2=0 Par=Par+Num Prom_par=Par/P Si No Prom-par, Prom-impar P=0 Imp=Imp+Num I=I+1 Prom_i mp=Imp/I ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 160 de 188 4. Desarrolle un algoritmo que le permita leer N valores y al final escribir si el mayor valor de los datos ledos es par o impar Anlisis: Se desarrolla la lectura de los N trminos con una estructura de programacin cclica. Como se trata de mantener el mayor valor, es necesario asumir inicialmente el primer valor como mayor almacenndolo en la variable May, y de ah en adelante cada vez que se lea un nuevo valor compararlo con May, por si es mayor entonces cambiar el valor a dicha variable. Al final del ciclo se chequea si dicho valor es par o impar. Diagrama de flujo INICIO i=1 i : N-1 N <= FIN > i++ Num May=Num Num>May May=Num Si No El mayor es par Num May%2=0 El mayor es i mpar ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 161 de 188 5. Genere la serie de fibonnacci iniciando con valores 1 y 2. Cada nmero de la serie generada es la suma de los dos anteriores. Anlisis: La serie de fibonnacci inicia la generacin de nmeros a partir de dos valores iniciales. Cada nuevo valor generado es igual a la suma de los dos anteriores. En ese sentido el primer valor generado ser igual a la suma de los dos valores iniciales. Si se trata de generar N valores pues se apoya en una estructura cclica que le permita realizar esas N tareas. Ej: 0,1 (valores iniciales) 1,2,3,5,8,13,21,34 (8 valores generados) Diagrama de flujo INICIO N V 1 =1 i : N V 3 i=1 V 3 = V 1 + V 2 <= > FIN V 2 =2 V 1 = V 2 V 2 = V 3 i = i+1 ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 162 de 188 6. ... ! 3 2 1 ! 2 2 1 2 1 1 3 2 e 7. ...... ! 4 ! 3 ! 2 1 4 3 2 x x x x e x INICIO N S=0 i : N S i=0 S = S+ N i i i 0 ) ! ( * 2 1 i = i+1 < > FIN INICIO X, i , N S=0 i : N S i=0 S = S+ N i i i X 0 ! i = i+1 <= > FIN ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 163 de 188 8 ...... ! 4 ) ( ! 3 ) ( ! 2 ) ( ) ( 1 4 3 2 ) ( x sin x sin x sin x sin e x si n 10. ... ! 7 ! 5 ! 3 ) ( 7 5 3 x x x x x Sin INICIO X,i, S=0 i : N S i=0 S =S+ N i i i X 0 ! )) (sen( i = i+1 < > FIN INICIO X,i, S=0 i : N S i=1 S =S+ 1 1 1 2 1 * )! 1 2 ( i N i i i X i = i+1 < > FIN ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 164 de 188 10. ... ! 7 ! 5 ! 3 ) ( 7 5 3 x x x x x Sinh 11. ... ! 6 ! 4 ! 2 1 ) ( 6 4 2 x x x x Cos INICIO X,i ,N S=0 i : N S i=1 S =S+ N i i i X 1 1 2 )! 1 2 ( i = i+1 < > FIN INICIO X,i ,N S=0 i : N S i=0 S =S+ i N i i i X 1 * )! 2 ( 0 2 i = i+1 < > FIN ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 165 de 188 12. ... ! 6 ! 4 ! 2 1 ) ( 6 4 2 x x x x Cos Los polinomios de legendre se calculan por medio de las frmulas: 1 0 p x p 1 ....... 2 1 ) 1 ( ) 1 2 ( n n n p n n xp n n p donde n=2,3,4... y X es cualquier nmero entre -1 y 1. Desarrolle un algoritmo que genere una tabla de n p vs X, para cualquier valor de n hasta n=10; generando 201 valor de n p en cada tabla, para valores igualmente distanciados de x (esto es hacer x= -1,-0.99,-0.98,....0,0.01,0.02,...0.99,1). El coeficiente binomial i n para enteros no negativos n e i (donde i<=n) se define como: ! )! ( ! i i n n i n INICIO X, N S=0 i : N S i=0 S =S+ N i i i X 0 2 )! 2 ( i = i+1 < > FIN ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 166 de 188 Se tienen dos nmeros almacenados en las variables A y B. Desarrolle un algoritmo que permita dividir A con B pero utilizando el mtodo de restas sucesivas. El computador debe mostrar el resultado de la divisin en su parte entera y en su parte residual. Aplicaciones en lngeniera Las races reales de una ecuacin se pueden calcular por diferentes mtodos uno de ellos es de Newton Raphson ) ( ) ( 1 n n n n X f X f X X Donde Xn es el valor asumido inicialmente. La lntegral de una funcin se puede calcular de la siguiente manera. Mtodo rectangular: n= nmero de rectngulos n i i b a x f x dx x f 1 )) ( ( ) ( donde ) 2 / ) 1 * 2 ( ( x i a x i Mtodo trapecial: n= nmero de trapecios 1 1 )) ( 2 ) ( ) ( ( 2 ) ( n i i b a x f b f a f x dx x f donde x i a x i Mtodo de simpson: n= nmero de arcos de parbola n i i i b a x f x f b f a f h dx x f 1 2 1 2 )) ( 2 ) ( ( 2 ) ( ) ( ( 3 ) ( donde 2 / x h ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 167 de 188 Aunque el bloque if-else puede resolver mltiples comparaciones escalonadas, su uso puede ser engorroso y producir errores cuando las comparaciones son numerosas. El bloque switch permite un cdigo mas compacto y de mayor claridad interpretativa. El formato general del bloque es el siguiente: Switch (expresin entera) { case constante1: bloque de sentencias1; break; case constante2: bloque de sentencias2; break; case constante3: bloque de sentencias3; break; case constante4: bloque de sentencias4; break; default bloque de sentencias por defecto; } Donde expresin entera es una expresin que devuelve un valor tipo entero o constante de caracter. Constante N es un nmero entero o una constante de carcter. Break es una orden imperativa de salida de bloque. Default indica que de no cumplirse ninguna de las condiciones el programa ejecutara el bloque de sentencias por defecto. La diferencia de la estructura switch con el if son las siguientes: la sentencia switch solo puede comprobar la igualdad no pueden existir dos sentencias case en el mismo switch las constantes de tipo carcter se convierten automticamente en enteros. Ejemplo: ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 168 de 188 # include "conio.h" # include "stdio.h" void menu(); void rectangular(); void trapezoidal(); void simpson(); void limites(); float funcion(float x); char op; float i,dx,xi,n,li,ls,area,s; main() { do { menu(); switch (op) { case '1':rectangular(); break; case '2':trapezoidal(); break; case '3':simpson(); break; } } while (op!='0'); } void menu() { clrscr(); gotoxy(10,6);printf("Menu Principal"); gotoxy(10,10);printf("1. Integral modelo Rectangular"); gotoxy(10,11);printf("2. Integral modelo Trapezoidal"); gotoxy(10,12);printf("3. I ntegral modelo Simpson"); gotoxy(10,13);printf("0. Opcion de Salir"); gotoxy(10,20);printf("Digite una opcion [ ] "); gotoxy(29,20);op=getch(); } void limites() { clrscr(); gotoxy(10,2);printf("Digitada de parametros para solucion a integral"); gotoxy(10,5);printf("Digite el limite inferior : ");scanf("%f",&li); gotoxy(10,7);printf("Digite el limite superior : ");scanf("%f",&ls); gotoxy(10,9);printf("Digite el nm ero de subareas : ");scanf("%f",&n); dx=(ls-li)/ n; gotoxy(10,11); printf("El valor del dx es %f ",dx); } void rectangular() ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 169 de 188 { limites(); s=0; i=1; while (i<=n) { xi=(li+(2* i-1)* dx/ 2); s=s+funcion(xi); i++; } area=s* dx; gotoxy(10,15);printf("El valor de integral por rectangulos es %f",area); getch(); } void trapezoidal() { limites(); s=funcion(li)+funcion(ls); i=1; while (i<=n-1) { xi=(li+i* dx); s=s+2* funcion(xi); i++; } area=s* dx/ 2; gotoxy(10,15); printf("El valor de integral por trapecios es %f",area); getch(); } void simpson() { limites(); s=funcion(li)-funcion(ls); i=1; while (i<=n) { xi=(li+i* dx); s=s+4* funcion(li+(2* i-1)* dx/ 2)+2* funcion(li+i* dx); i++; } area=s* dx/ 6; gotoxy(10,15);printf("El valor de integral por arcos de parbola es %f",area); getch(); } float funcion(float x) { float f; f= x* x-4; return f;} ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 170 de 188 En C, una funcin es un bloque de instrucciones que realizan una tarea especfica la cual se maneja como una unidad lgica. Esta unidad, regresa opcionalmente un valor de acuerdo al proceso que realice. C es un programa de funciones, todo se hace a partir de ellas. La principales main() la cual, utiliza a otras que se encuentran definidas en las bibliotecas (todas las instrucciones que maneja C). Adems de stas, se puede definir nuestras propias funciones. De esta manera se dividen tareas grandes de computacin en varias ms pequeas lo que da como resultado que el programa sea ms fcil de entender y se pueda manejar ms eficientemente. Adems, al subdividir los programas en funciones, stas pueden ser reutilizadas en otros programas. En esta unidad se muestra como crear nuestras propias funciones. La forma general para definir una funcin es: Especificador_tipo Nombre_de_la_funcin (declaracin de parmetros) { cuerpo de la funcin } El especificador_de_tipo : este especificador de tipo de la funcin define la clase de valor que regresa la funcin. El valor puede ser cualquier tipo que maneje el lenguaje C. En caso de que no se especifique ninguno, la funcin devuelve por omisin un entero. Ej: Si el valor a retornar es un decimal entonces definimos la funcin de tipo float. Si el valor a retornar es un entero entonces definimos la funcin de tipo int. Y as sucesivamente Nombre_de_la_funcin : es la palabra con la que se identificar la funcin. Cada funcin tiene un nombre nico. Con ese nombre, en cualquier otra parte del ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 171 de 188 programa se pueden ejecutar los enunciados contenidos en la funcin. A esto se le conoce como la llamada de la funcin. Una funcin puede ser llamada desde el interior de otra funcin. Una funcin es independiente. Una funcin puede ejecutar su trabajo sin interferencia de, y sin interferir con, otras partes del programa. Una funcin ejecuta una tarea especfica. Esta es la parte fcil de la definicin. Una tarea es un trabajo concreto que un programa debe ejecutar como parte de su operacin general, como enviar una lne a de texto a la impresora, ordenar un arreglo en orden numrico o calcular una raz cubica. Una funcin puede regresar un valor al programa que la llama. Cuando el programa llama a una funcin, se ejecutan los enunciados que contiene. Estos, en caso de que se desee, pueden pasar informacin de regreso al programa que la llama. Declaracin de parmetros : La declaracin de parmetros es un conjunto de variables separados por comas y con un tipo de dato especfico que reciben los valores de los argumentos cuando se llama a la funcin. Una funcin puede carecer de parmetros en cuyo caso los parntesis estarn vacos tanto al declarar como al mandar llamar a la funcin. Por ejemplo: float multiplicacin (float multiplicando,float multiplicador) { multiplicando=multiplicando* multiplicador; return(multiplicando); } La funcin est declarada de tipo float porque es la clase de valor que va a regresar. Multiplicando y multiplicador es el nombre que le vamos a darlos valores que recibir la funcin para trabajar con ellos, los cuales son declarados dentro de los parntesis. Por ltimo se define el cuerpo de la funcin (delimitndose con llaves) En este caso, se asigna el resultado de la multiplicacin a multiplicando para ahorrar memoria (se declara una variable menos) y regresa el valor obtenido por medio de la sentencia return. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 172 de 188 Return Esta sentencia se utiliza para devolver valores generados en una funcin al programa desde donde se hizo el llamado de la funcin. Tambin sirven para salir de la funcin donde se encuentra y continuar con la instruccin posterior a la funcin que lo llam. En la funcin anterior return(multiplicando); return multiplicando; devuelve el contenido de multiplicando al programa principal. En caso de que slo se quiera salir de la funcin, no es necesario indicarle parmetros, basta con return();. Todas la funciones, excepto las de tipo void (Es el tipo de datos que no tiene valor) generan valores que se transmiten al programa principal. Estos valores son de tipo int (entero) por omisin, pero puede regresarlos de todo tipo si as se declara; por ejemplo, en la funcin del ejemplo, la funcin regresa un valor de tipo float (flotante). Cuando se quiere utilizar el valor que devuelve la funcin en el programa principal, es necesario asignar la funcin a una variable del tipo de dato que va a regresar la funcin. # include "conio.h" # include "stdio.h" # include "math.h" float fun(float x); float X,Z; main() { clrscr(); gotoxy(10,6); printf("Digite un valor X "); scanf("%f",&X); Z=fun(X); printf("La funcion evaluada en %4.2f es = %10.3f",X,Z); getch(); } float fun(float x) { float fx; fx=pow(x,7)-4* pow(x,3)+3* x; return fx; } Reglas de las funciones - Una funcin puede tomar cualquier nmero de parmetros, o ninguno. En caso de tener varios parmetros solo devolver un valor. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 173 de 188 - Una funcin se puede disear para qu e devuelva un valor, sin que sea obligatorio que lo haga. - Si una funcin tiene un tipo de devolucin void, no devolver ningn valor. Cuando intenta obtener un valor de una funcin con tipo de devolucin void, se produce un error de compilacin. Una funcin que devuelva void no necesita contener una instruccin return, aunque puede tenerla si as lo desea. Ambos mtodos son aceptables. Si no incluye una instruccin return, la funcin se devuelve automticamente cuando llega al final del bloque de funcin (la llave de cierre). - No se puede declarar funciones dentro de funciones ya que todas estn al mismo nivel. - Tampoco se puede ingresar al cdigo de una funcin si estamos fuera de la misma. - Las variables que se declaran en las funciones, son locales y no pueden ser utilizadas fuera de esa funcin. - Se pueden pasar variables a las funciones por valor, por apuntador o por referencia. Adems, si se utiliza una funcin dos o ms veces, la segunda vez que se llame a la funcin las variables locales no contendrn el valor que obtuvieron al ejecutar la primera vez la funcin y as sucesivamente ya que se crean al entrar a la funcin y se destruyen al salir. Si el llamado a la funcin se hace desde dentro de la misma funcin, los datos de las variables que estn dentro de la funcin se mantendrn. : Es muy comn que las funciones utilicen argumentos es decir, que necesiten de algn valor o valores externos dentro de su propio cdigo. Estos valores se pasan mediante variables llamadas parmetros formales de la funcin las cuales se declaran dentro de los parntesis que suceden al nombre de la funcin o bien, despus de estos y antes de la llave de comienzo. Asegrese de que de que los argumentos utilizados al declarar la funcin sean del mismo tipo que los usados para llamar la funcin. Si hay algn error en los tipos, el compilador no mandar mensaje de error pero se obtendrn resultados inesperados. Puedes utilizar a las variables que son parmetros formales como cualquier otra variable local es decir, se les puede hacer asignaciones o usarlos en cualquier expresin permitida por C. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 174 de 188 Existen dos formas de pasar argumentos a una funcin: La primera es por medio de las llamadas por valor: Consiste en slo pasar el contenido de la variable utilizada como argumento a la subrutina. De esta manera, los cambios efectuados en los parmetros de la funcin no afectan a las variables (globales) que se utilizaron para hacer la llamada a la funcin. # include "conio.h" # include "stdio.h" float cuadrado(float X); float Z,X; main() { clrscr(); gotoxy(10,2);printf("Cuadrado de un nmero"); gotoxy(10,5);printf("Digite el primer nmero : ");scanf("%f",&X); Z=cuadrado(X); gotoxy(10,9);printf("El cuadrado de %f es %f",X,Z); getch(); } float cuadrado(float y) { float X; X=y* y; return X; } La segunda forma es mediante las llamadas por referencia en la cual, lo que se pasa a la subrutina es la direccin de la variable que se est mandando como parmetro. De esta manera, los cambios que sufra el parmetro dentro de la subrutina, se efectuarn tambin en la variable que se introdujo como parmetro. La forma de pasar una llamada por referencia es pasando un puntero al argumento, de esta manera, lo que pasar es la direccin de la variable en vez de su contenido. Para esto, los parmetros se declaran de tipo puntero. / * Ejemplo de funciones por valor y por referencia* / / * Calcula dos veces el procentaje de gastos, la primera vez utilizando una funcin por valor y la segunda por referencia*/ ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 175 de 188 #include<stdio.h> porcentaj e_xvalor(float ingreso, float egreso) { egreso=((egreso/ ingreso)* 100) printf("Usted gasta el %.2f por ciento de lo quegana",egreso); } porcentaje_xref(float * ingreso,float * egreso) { * egreso=(((* egreso)/ (* ingreso))* 100); printf("Usted gasta el %.2f por ciento de lo quegana",egreso); } main() { float entrada,salida; clrscr(); printf("Entradas: "); scanf("%f",&entrada); printf("Salidad: "); scanf("%f",&salida); porcentaje_xvalor(entrada,salida); /*Llamada a la funcin porcentaje utilizando paso de parmetros por valor* / printf("\n\n"); porcentaje_xref(&entrada,&salida); / * Utilizacin de la funcin porcentaje con paso de parmetros por referencia*/ getch(); } En el programa anterior, realizamos la misma tarea dos veces pero de diferente manera. En porcentaje_xvalor(entrada,salida) mandamos el contenido de entrada y salida a la funcin donde son recibidos por ingr eso y egreso respectivamente. De esta manera, el clculo del porcentaje se hace internamente es decir, utilizando las variables definidas en la funcin. Tanto entrada como salida, no se modifican. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 176 de 188 La funcin porcentaje_xref(&entrada,&salida) tambin obtiene el mismo resultado, pero en este caso, en vez de pasar los valores existentes en las variables, pasamos su direccin; por lo que trabajamos directamente con ellas dentro de la funcin an cuando las llamemos de diferente manera( ingresos y egresos). En esta ocasin, las variables globales si se modifican. Para comprobar esto, despus de compilar elprograma (que no muestre errores), en vez de ejecutarlo con Ctrl-F9, dale F8, esto te permitir correr el programa paso a paso. Para ver los valores que van tomando las variables, teclea Ctrl-F7 y escribe el nombre de la variable que desees observar tal cual aparezca en el programa luego pulsa <ENTER>. Aparecer una ventana en la parte inferior de tu programa en la cual se indicar el estado o valor de lao las variables que hayas especificado. Observars que despus de haber ejecutado, la funcin porcentaje_xvalor, el contenido de las variables no cambiar mientras que despus de haber ejecutado porcentaje_xref, salida se ver modificada porque le asignamos un valor dentro de la funcin. En realidad, tanto las funciones que utilizan paso de parmetros por valor como las que utilizan el paso por referencia, pueden hacer las mismas cosas. Lo nico que cambia es la manera en que trabajan en la memoria de la computadora. Lo que tenemos que tener en cuenta para saber cul utilizar, es si queremos que las variables que utilizaremos en el parmetro de la funcin se modifiquen o no. No olvide que las variables que pase como parmetros deben ser del mismo tipo de las que estn declaradas dentro de los parntesis de la funcin. Ejemplo2: # include "conio.h" # include "stdio.h" void cambio(float * num1,float * num2); float numero1,numero2; main() { clrscr(); gotoxy(10,2);printf("Digitada de dos nmeros"); gotoxy(10,5);printf("Digite el primer nmero : ");scanf("%f",&numero1); gotoxy(10,7);printf("Digite el segundo nmero : ");scanf("%f",&numero2); cambio(&numero1,&numero2); gotoxy(10,9);printf("El primer nmero ahora es %f\n",numero1); ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 177 de 188 gotoxy(10,10);printf("El segundo nmero ahora es %f\n",numero2); getch(); } void cambio(float * num1,float * num2) { float * temp; * temp=* num1; * num1=* num2; * num2=* temp; } Si se quiere utilizar funciones definidas por el usuario en varios programas, se puede hacer, creando una biblioteca propia. Esto se logra de la siguiente manera: Define tus funciones en un nuevo archivo. Manda llamar las libreras estndar de C, que necesites. No utilice la funcin main(). Complalo Cuando la compilacin sea exitosa, se generar un arch ivo con el mismo nombre que el tuyo pero con la terminacin Obj. Este archivo deber ser incluido preferentemente en el mismo directorio que se encuentre la biblioteca. En caso contrario, se debe dar la ruta en la seccin Directorios del men Options. En el programa donde quieras utilizar esta unidad slo tendrs que mandarla llamar al principio del programa de la siguiente manera: #include "nombre_archivo" Despus de esto, puedes llamar a las funciones que tengas definidas en esta librera normalmente sin tener que declararlas al principio del programa. Adems de funciones, en la biblioteca tambin puede definir constantes, macros, etc. I ntenta pasar a una biblioteca las funciones que hemos visto en este mdulo para que puedas utilizarlas posteriormente. Programa ejemplo: En el programa que se muestra a continuacin, se convierte un nmero en hexadecimal a su representacin decimal. Es una demostracin muy sencilla de lo ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 178 de 188 que es una funcin ya que en este manual existen otros programas que contienen funciones en los cuales podrs reafirmar este conocimiento. Complalo y ejectalo para que puedas comprenderlo mejor. /*Programa que convierte un nmero en hexadecimal a decimal*/ #include<math.h> #include<string.h> #include<conio.h> void main() { char hexa[ 10] ; float numero; clrscr(); printf("Nmero hexadecimal (maysculas): "); gets(hexa); numero=hex_dec(hexa); printf("\nEn decimal es : %.0f",numero); } float hex_dec(char cadena[ ] ) { int i,j ; char letra; float decimal=0; float temp=0; i=strlen(cadena); for (j=0;i>0;j++,i--) { letra=cadena[ i-1] ; switch(letra) { case 1:temp=(1* pow(16,j)); break; case 2:temp=(2* pow(16,j)); break; case 3:temp=(3* pow(16,j)); break; case 4:temp=(4* pow(16,j)); break; case 5:temp=(5* pow(16,j)); break; case 6:temp=(6* pow(16,j)); break; case 7:temp=(7* pow(16,j)); break; case 8:temp=(8* pow(16,j)); break; case 9:temp=(9* pow(16,j)); break; case 0:temp=(0* pow(16,j)); break; case 'A':temp=(10* pow(16,j)); break; case 'B':temp=(11* pow(16,j)); break; case 'C':temp=(12* pow(16,j)); break; case 'D': temp=(13* pow(16,j)); break; ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 179 de 188 case 'E':temp=(14* pow(16,j)); break; case 'F':temp=(15* pow(16,j)); break; } decimal+=temp; } return(decimal); } Una funcin que se llama a si misma un nmero indefinido de veces, que se controla por la variacin de un cierto valo r de una o varias variables dentro de la misma funcin, recibe el nombre de funcin recursiva. Un clsico ejemplo de recursividad es el clculo del factorial de un nmero entero. Si bien la recursividad puede aadir br illantez a los programas, tenga en cuenta que su uso aumenta el trabajo de la pila y en muchos casos podr realizar la tarea con mayor facilidad acudiendo a un mtodo de iteracin clsica Ejemplo: 5! = 5* 4* 3* 2* 1 Un pequeo anlisis de este ejemplo bastara para entender la recursividad: 5! Es lo mismo que 5* 4! 4! Es lo mismo que 4* 3! y asi sucesivamente. En general N! = N*(N-1)!. Utilizando esta expresin se puede obtener directamente un algoritmo recursivo para definirlo en trminos de factorial. # include "conio.h" # include "stdio.h" int fun(int x); int X,Z; main() { clrscr(); gotoxy(10,6); printf("Digite un valor X "); scanf("%d",&X); Z=fun(X); gotoxy(10,8); printf("el factorial es %d",Z); getch(); } int fun(int N) { if (N==1) return 1; else { N=N* fun(N-1); return N; } ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 180 de 188 } ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 181 de 188 - Definicin - Arreglos unidimensionales - Forma de acceso a un elemento especfico del arreglo - - Paso de arreglos a funciones - - Utilizacin de arrays unidimensionales como cadenas - - Arreglos bidimensionales - - Arreglos multidimensionales - - lnicializacin de arreglos con tamao - - lnicializacin de arreglos sin tamao Un arreglo es un conjunto de elementos del mismo tipo agrupados en una sola variable. Tambin se les conoce con el nombre de arreglos. Cada posicin de almacenamiento en un arreglo es llamada un elemento del arreglo. Para ingresar a un elemento en particular, utilizamos un ndice. Existen arreglos unidimensionales, bidimensionales y tridimensionales. Su uso ms comn es en la implementacin de cadenas de caracteres. Recuerda que en C no existen variables de tipo cadena por lo cual se utiliza un arreglo de caracteres. Fsicamente, un arreglo es un conjunto de localidades de memoria contiguas donde la direccin ms baja corresponde al primer elemento y la direccin ms alta al ltimo. En un arreglo de n elementos, stos ocuparan desde la casilla 0 hasta la n-1. Por si mismo, el nombre del arreglo apunta a la direccin del primer elemento del arreglo. un arreglo de una sola dimensin es un arreglo que tiene solamente un subndice. Un subndice es un nmero encerrado en corchetes a continuacin del nombre del arreglo. Este nmero puede identificar el nmero de elementos individuales en el arreglo. La forma general para definir un arreglo de slo una dimensin es la siguiente: ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 182 de 188 Tipo_de_dato nombre_variable [tamao] ej: float x [ 10] ; int y [ 10] ; tipo_de_dato se refiere al tipo de dato de cada elemento del arreglo y tamao es la cantidad de elementos agrupados en la misma variable. Forma de acceso a un elemento especfico del arreglo Para accesar a uno de los elementos del arreglo en particular, basta con invocar el nombre del arreglo y especificar entre corchetes el nmero de casilla que ocupa el elemento en el arreglo. Por ejemplo, si queremos accesar al cuarto elemento de un arreglo de 10, se invocara de la siguiente manera: nombre_variable[ 10] se refiere al nombre con el cual se identificaran todos los datos que pertenezcan al arreglo y estn almacenados en memoria. Recuerde que el arreglo almacena desde la casilla 0. Por tanto, en un arreglo de 10 casillas, stas estn numeradas del 0 al 9. Paso de arreglos a funciones La forma de pasar un arreglo a una funcin consiste en llamar a la funcin y en el argumento, especificar el nombre del arreglo sin ninguna indexacin. Esto hace que se pase a la funcin la direccin del primer elemento del arreglo ya que en C no es posible pasar el arreglo completo como argumento. Por ejemplo: main() int conjunto[ 20] ; clrscr(); . . funcion(conj unto); . . } Aqu, al pasar el arreglo conjunto a funcin, estamos pasando la direccin en memoria del primer elemento de conjunto. En caso de que dentro de la funcin ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 183 de 188 tuvisemos que accesar a algn elemento del arreglo, se pasa de la misma manera slo que dentro de la funcin utilizaremos los corchetes para accesar al elemento deseado. Hay tres formas de declarar un arreglo como parmetro formal: como un arreglo delimitado, como un arreglo no delimitado y como un puntero. Por ejemplo: #include<stdio.h> funcion1(int conjunto[ 20] ) / * Delimitando el array* / { . } o como funcion1(int conjunto[ ] ) / * arreglo no delimitado* / { . } o se puede declarar como funcion1(int * conjunto) / * como un puntero * / { . } El resultado de los tres mtodos de declaracin es idntico. Utilizacin de arreglos unidimensionales como cadenas El uso ms comn de los arreglos unidimensionales es la implementacin de una cadena (conj unto) de caracteres porque recuerde que en C no existe este tipo de datos. Por tanto, definimos una cadena en C como un arreglo de caracteres que al final tiene un caracter nulo ('\0'). Por esta razn es necesario que al declarar los arreglos estos sean de un caracter ms que la cadena ms larga que pueda contener. Por ejemplo si deseamos crear un cadena que contenga 5 caracteres la declaracin debe hacerse como sigue: char cadena[ 6] ; ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 184 de 188 Esto es con el fin de dejar el lti mo espacio para el caracter nulo. No es necesario aadir explcitamente el caracter nulo de las constantes de cadena porque el compilador de C lo hace automticamente. Algunas de las principales funciones que soporta C para el manejo de cadenas de caracteres son las siguientes: Nombre Definicin strcpy(s1,s2) Copia s2 en s1 strcat(s1,s2) Concatena s2 al final de s1 strlen(s1) Devuelve la longitud de s1 strcmp(s1,s2) Compara la cantidad de elementos de s1 y s2 Si son iguales, devuelve 0; menor que cero si s1 es Menor que s2 y mayor que 0 si s1>s2. Para una referencia ms amplia sobre estas y otras rdenes, busca estas funciones en el apndice B. Un arreglo bidimensional es un arreglo de arreglos unidimensionales. Constituyen la forma ms simple de los arreglos multidimensionales. Un arreglo bidimensional tiene dos subndices. Su forma general de declaracin es tipo_dato variable[primer ndice][segundo ndice]; El primer ndice corresponde a la filas y el segundo a las columnas. Cuando se utiliza un arreglo bidimensional como argumento de una funcin, realmente se pasa slo la direccin del primer elemento (el[0][0]). Sin embargo, la funcin que recibe un arreglo bidimensional como parmetro ti ene que definir al menos la longitud de la segunda dimensin. Esto es necesario debido a que el compilador de C necesita "conocer" la longitud de cada fila para ordenar el arreglo correctamente. Por ejemplo, una funcin que recibe un arreglo bidimensional de 5,9 se declara as: ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 185 de 188 funcion(int matriz[ ] [ 9] ) { . . } No es necesario especificar la primera dimensin pero la segunda s ya que el compilador de C la necesita para saber donde empieza la segunda fila. Tambin podemos utilizar arreglos bi dimensionales para crear arreglos de cadenas. El primer ndice indicara el nmero de cadenas y el segundo la longitud mxima de las cadenas. char mensajes[ 5] [ 20] ; En la declaracin anterior se especifica que tenemos un arreglo llamado mensajes el cual contiene 5 cadenas de 20 caracteres cada una. Para acceder a una cadena en especial, s lo especificamos el nmero de cadena (de 0 al nmero de cadenas menos 1). Ejemplo: printf("%s",mensajes[ 3] ); Aqu mandamos imprimir la cadena nmero 3 de la variable mensajes. Esto sera equivalente a printf("%s",mensajes[ 3] [ 0] ); aunque es ms comn utilizar la primera forma. En C, podemos crear arreglos de dos o ms dimensiones el lmite de dimensiones, viene dado por el compilador. Su forma general de declaracin es tipo_dato variable [ long ind 1] [ longindice 2] ...[ long indice N] donde tipo_dato es el tipo de dato de los elementos del arreglo y long ind 1, long ind 2...long ind N es la longitud de cada dimensin del arreglo. Este tipo de arreglos no se utiliza muy frecuentemente debido a el gran espacio en memoria que ocupan. Otra desventaja es que el acceso a un arreglo multidimensional dura ms tiempo que el requerido por uno del tipo unidimensional. Cuando se pasan arreglos multidimensionales a funciones, se tiene que declarar todo excepto la primera dimensin. Por ejemplo: ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 186 de 188 #include<stdio.h> funcion1(int multiarreglo[ ] [ 3] [ [ 4] [ 5] ) { . } main() { int m[ 2] [ 3] [ 4] [ 5] ; funcion(m[ ] [ 3] [ 4] [ 5] ); { . . } Claro que si se desea, se puede especificar tambin la longitud de la primera dimensin. En C, podemos inicializar (dar un valor determinado a la variable antes de usarla) arreglos globales y arreglos estticos locales en el momento de declararlos. No es posible inicializar arreglos globales no estticos. Su forma general de inicializacin es tipo_dato variable [tamao 1][tamao2]...[tamao] = {lista de valores}; Lista de valores es un conj unto de constantes, separadas comas, cuyo tipo es compatible con tipo_dato. La primera constante se coloca en la primera posicin del arreglo, la segunda constante en la segunda posicin, y as sucesivamente. Fjese que un punto y coma sigue a }. A continuacin tenemos la inicializacin de un arreglo unidimensional: int dgitos[5]={'0','1','2','3','4','5','6','7','8','9'}; En el caso de los arreglos unidimensionales de caracteres podemos inicializarlos abreviadamente con la forma: char variable [tamao]="cadena"; ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 187 de 188 Por ejemplo: char nombre[ 6] ="clase"; Lo anterior es lo mismo que si se inicializara nombre caracter a caracter como en el ejemplo de dgitos. char nombre[6]={'c','l','a','s','e'.'\0'}; I mportante: Se debe estar seguro de que el arreglo que se declara es suficientemente largo para incluirlo. Esto es por lo que nombre tiene16 caracteres de longitud en vez de 15 que es la cantidad de letras ya que cuando se utiliza una cadena constante, el compilador proporciona la terminacin nula automticamente. En los arreglos con tamao, tenemos que calcular que la longitud del arreglo fuera lo suficientemente grande para que fueran almacenados todos los elementos que desebamos. Si tuviramos que iniciali zar varios arreglos de cadena seria fastidioso contar cuantos caracteres ocupa cada arreglo. Es posible que C calcule automticamente la longitud del arreglo utilizando la inicializacin de arreglos indeterminados la cual permite que el compilador de C cree automticamente un arreglo suficientemente grande para mantener todos los inicializadores presentes si el tamao del arreglo no est especificado. El uso de la inicializacin de los arregl os indeterminados permite al programador cambiar el contenido de cualquiera de las cadenas sin tener que reconsiderar el tamao del arreglo. Tambin puede utilizarse tambin en arreglos multidimensionales (2 o ms). En este caso, se debe especificar todo, sin considerar la dimensin que se encuentra ms a la izquierda para permitir al compilador de C indexar el arreglo adecuadamente. El mtodo es similar a la especificacin de parmetros de un arregl o. De este modo se pueden construir tablas de longitudes variables, y el compilador asignar automticamente el espacio suficiente para ellas. La ventaja de este tipo de declaracin sobre la versin del tamao determinado es que la tabla puede alargarse o acortarse sin cambiar las dimensiones del arreglo. ALGORcTMlCA PARA PROGRAMAClcN lng. Yamil Armando Cerquera Rojas Emai l yacer [email protected] UNI VERSI DAD SURCOLOMBI ANA 188 de 188 Bibliografa American National Standard for I nformation Systems -- Programming Language C. American National Standards I nstitute. 1430 Broadway New York, NY 10018. C. A software engineering approach. Peter A Darnell, Philip E. Margolis. Springer-Verlag, 1991. I SBN 3-540-97389-3 Ceballos, F.J., Programacin Orientada a Objetos con C++, 2 edicin, RAMA, 1997. El lenguaje de programacin C, segunda edicin. Brian W. Kernighan, Dennis M. Ritchie. Prentice-Hall Hispanoamericana, 1991. I SBN 968-880- 205-0 El lenguaje de programacin C. Brian W. Kernighan, Dennis M. Ritchie. Prentice-Hall Hispanoamericana, 1985. I SBN 968-880-024-4 Ellis, M.A. y Stroustrup, B., Manual de Referencia C++ con Anotaciones, Addison-Wesley/Daz deSantos, Madrid, 1994. Garca de Jaln, J. y otros autores, Aprenda ANSI C como si estuviera en Primero, ESI I SS, 1995. Graham, N., LEARNI NG C++, McGraw Hill, 1992. Marshall P.C. and Lomow C., C++ FAQS, Addison-Wesley Publishing Company, 1994. Schildt, H., C++: Gua de Autoenseanza, McGraw-Hill, 2 edicin, 1995. Stroustrup, B., The C++ Programming Language, Addison-Wesley, 3 edicin, 1997.