Sie sind auf Seite 1von 308

Manual de Algoritmia

CAPITULO I METODOLOGIA DE LA PROGRAMACION

1.1.

INTRODUCCIN Y MOTIVACIN Este capitulo le introduce al estudiante a seguir una metodologa para la resolucin de problemas con computadoras y el uso del lenguaje de programacin Java. La resolucin de un problema con una computadora se hace escribiendo un programa, que exige al menos los siguientes pasos: Definicin o anlisis del problema, diseo del algoritmo, transformacin del algoritmo en un programa y ejecucin y validacin del programa. Uno de los objetivos fundamentales de este manual es el aprendizaje y diseo de los algoritmos. Este capitulo introduce al lector en el concepto de algoritmo y de programa, as como las herramientas que permiten dialogar al usuario con la maquina: los lenguajes de programacin.

1.2.

FASES EN LA RESOLUCIN DE PROBLEMAS El proceso de resolucin de un problema con una computadora conduce a la escritura de un programa y a su ejecucin en la misma. Aunque el proceso de disear programa es esencialmente un proceso creativo, se

______________________________________________________

Manual de Algoritmia
puede considerar una serie de fases o pasos comunes, que generalmente deben seguir todos los programadores. Las fases de resolucin de un problema con computadora son: Anlisis del problema Diseo del algoritmo Codificacin Compilacin y ejecucin Verificacin Depuracin Mantenimiento Documentacin Constituye el ciclo de vida del software y sus caractersticas ms sobresalientes son: Anlisis. El problema se analiza teniendo presente la especificacin de los requisitos dados por el cliente de la empresa o por la persona que encarga el programa. Diseo. Una vez analizado el problema, se disea una solucin que conducir a un algoritmo que resuelva el problema. Codificacin (implementacin). La solucin se escribe en la sintaxis del lenguaje de alto nivel y se obtiene un programa fuente que se compila a continuacin. Ejecucin, verificacin y depuracin. El programa se ejecuta, se comprueba rigurosamente y se eliminan todos los errores (denominados Bugs, en ingls) que puedan aparecer. Mantenimiento. El programa se actualiza y modifica, cada vez que sea necesario, de modo que se cumplan todas las necesidades de cambio de sus usuarios. Documentacin. Escritura de las diferentes fases del ciclo de vida del software, esencialmente el anlisis, diseo y codificacin, unidos a manuales de usuario y de referencia, as como normas para el mantenimiento. Las dos primeras fases conducen a un diseo detallado escrito en forma de algoritmo. Durante la tercera etapa ( codificacin) se implementa el algoritmo en un cdigo escrito en un lenguaje de programacin, reflejando las ideas desarrolladas en las fases de anlisis y diseo. ______________________________________________________ 6

Manual de Algoritmia
Las fases de compilacin y ejecucin traducen y ejecutan el programa. En las fases de verificacin y depuracin el programador busca errores de las etapas anteriores y los elimina. Comprobara que mientras ms tiempo se gaste en la fase de anlisis y diseo, menos se gastar en la depuracin del programa. Por ltimo, se debe realizar la documentacin del programa. Antes de conocer las tareas a realizar en cada fase, vamos a considerar el concepto y significado de la palabra algoritmo. La palabra algoritmo se deriva de la traduccin al latn de la palabra Alkho-warizmi, nombre de un matemtico y astrnomo rabe que escribi un tratado sobre la manipulacin de nmeros y ecuaciones en el siglo IX. Un algoritmo es un mtodo para resolver un problema mediante una serie de pasos precisos, definidos y finitos. Caractersticas de un algoritmo Preciso (indica el orden de realizacin en cada paso), Definido (si se sigue dos veces, obtiene el mismo resultado cada vez), Finito (tiene fin; un nmero determinado de pasos). Un algoritmo debe producir un resultado en un tiempo finito. Los mtodos que utilizan algoritmos se denominan mtodos algortmicos, en oposicin a los mtodos que implican algn juicio o interpretacin que se denominan mtodos heursticos. Los mtodos algortmicos se pueden implementar en computadoras; sin embargo, los procesos heursticos no han sido convertidos fcilmente en las computadoras. En los ltimos aos las tcnicas de inteligencia artificial han hecho posible la implementacin del proceso heurstico en computadoras. Ejemplos de algoritmos son: instrucciones para obtener el mximo comn divisor de dos nmeros, calculo del factorial de un numero, calculo de la tabal de multiplicar del 1 al 12, etc. Los algoritmos se pueden expresar por frmulas, diagramas de flujo o N-S y pseudocdigos.

______________________________________________________

Manual de Algoritmia
1.2.1. Anlisis del Problema La primera fase de la resolucin de un problema con computadora es el anlisis del problema. Esta fase requiere una clara definicin, donde se contemple exactamente lo que debe hacer el programa y el resultado o solucin deseada. Dado que se busca una solucin por computadora, se precisan especificaciones detalladas de entrada y salida. La Figura 1 muestra los requisitos que se deben definir en el anlisis.

Resolucin de un problema

Anlisis del problema

Diseo del algoritmo

Resolucin del problema con computadora

Figura 1. Anlisis del problema

Para poder identificar y definir bien un problema es conveniente responder a las siguientes preguntas: Qu entradas se requieren? (tipo de datos con los cuales se trabaja y cantidad). Cul es la salida deseada? (tipo de datos de los resultados y cantidad). Qu mtodo produce la salida deseada? Requisitos o requerimientos adicionales y restricciones a la solucin. Ejemplo: Se desea obtener una tabla con las depreciaciones acumuladas y los valores reales de cada ao, de un automovil comprado en 1,800.00 soles en el ao 1985, durante los seis aos siguientes suponiendo un valor de recuperacin o rescate de 120.00. Realizar ______________________________________________________ 8

Manual de Algoritmia
el anlisis del problema, conociendo la frmula de la depreciacin anula constante D para cada ao de vida til. D= Costo valor de recuperacin Vida til = 1,680.00 6 = 280.00

D = 1.800.00 120.00 6

Entrada

Costo original Vida til Valor de recuperacin Depreciacin acumulada clculo de la depreciacin acumulada cada ao Clculo del valor del automovil en cada ao

Proceso

Depreciacin anual Salida Depreciacin acumulada en cada ao Valor del automovil en cada ao

1.2.2.

Diseo del Algoritmo

En la etapa de anlisis del proceso de programacin se determina qu hace el programa. En la etapa de diseo se determina cmo hace el programa la tarea solicitada. Los mtodos ms eficaces para el proceso de diseo se basan en el conocido divide y vencers. Es decir, la resolucin de un problema complejo se realiza dividiendo el problema en subproblemas y a continuacin dividiendo estos subproblemas en otros de nivel ms bajo, hasta que pueda ser implementada una solucin en la computadora. Este mtodo se conoce tcnicamente como diseo descendente ( topdown) o modular. El proceso de romper el problema en cada etapa y expresar cada paso en forma ms detallada se denomina refinamiento sucesivo. Cada subprograma es resuelto mediante un mdulo (subprograma) que tiene un slo punto de entrada y un slo punto de salida. ______________________________________________________ 9

Manual de Algoritmia
Cualquier programa bien diseado consta de un programa principal (el mdulo de nivel ms alto) que llama a subprogramas (mdulos de nivel ms bajo) que a su vez pueden llamar a otros subprogramas. Los programas estructurados de esta forma se dice que tienen un diseo modular y el mtodo de romper el programa en mdulos mas pequeos se llama programacin modular. Los mdulos pueden ser planeados, codificados, comprobados y depurados independientemente (incluso por diferentes programadores) y a continuacin combinarlos entre s. El proceso implica la ejecucin de los siguientes pasos hasta que el programa se termina: 1. 2. 3. 4. 1.2.3. Programar un mdulo. Comprobar el mdulo. Si es necesario, depurar el modulo. Combinar el mdulo con los mdulos anteriores. Herramientas de Programacin Las dos herramientas ms utilizadas comnmente para disear algoritmos son: diagramas de flujo y pseudocdigos. Un diagrama de flujo (flowchart) es una representacin grfica de un algoritmo. Los smbolos utilizados han sido normalizados por el Instituto Norteamericano de Normalizacin (ANSI), y los ms frecuentemente empleados se muestran en la Figura 2.

______________________________________________________

10

Manual de Algoritmia

Terminal

Subprograma

Entrada/ Salida

Si Decisin

Proceso No Conectores

Si Figura 2. Smbolos ms utilizados en los diagramas de flujo

El pseudocdigo es una herramienta de programacin en la que las instrucciones se escriben en palabras similares al ingls o espaol, que facilitan tanto la escritura como la lectura de programas. En esencia, el pseudocdigo se puede definir como un lenguaje de especificaciones de algoritmos. Aunque no existen reglas para escritura del pseudocdigo en espaol, se ha recogido una notacin estndar que se utilizara en el presente manual y que ya es muy empleada en los libros de programacin en espaol. Las palabras reservadas bsicas se representan en letras negritas minsculas. Estas palabras son traduccin libre de palabras reservadas de lenguajes como C, pascal, etc. Ejemplo: Algoritmo que permite calcular el mayor valor de dos nmeros ingresados por teclado, en el caso de ser iguales mostrara un mensaje que no existe numero mayor, los nmeros son iguales.

______________________________________________________

11

Manual de Algoritmia

Inicio: Leer n1, n2 Si n1 = n2 entonces Imprimir No existe nmero mayor, los nmeros son iguales Caso contario: Si n1>n2 entonces Imprimir El nmero mayor es n1 Caso contrario: Imprimir El nmero mayor es n2 Fin de si Fin de si Fin

1.2.4.

Herramientas de Programacin Codificacin es la escritura en un lenguaje de programacin de la representacin del algoritmo. Dado que el diseo de un algoritmo es independiente del lenguaje de programacin utilizado para su implementacin, el cdigo puede ser escrito con igual facilidad en un lenguaje o en otro. Para realizar la conversin del algoritmo en programa se deben de sustituir las palabras reservadas en espaol por sus homnimos en ingls, y las operaciones/ instrucciones indicadas en lenguaje natural expresarlas en el lenguaje de programacin correspondiente.

1.2.5.

Compilacin y Ejecucin de un Programa Una vez que el algoritmo se ha convertido en un programa fuente, es preciso introducirlo en memoria mediante el teclado y almacenarlo posteriormente en un disco. Esta operacin se realiza con un programa editor. Posteriormente el programa fuente se convierte en un archivo de programa que se guarda en disco. El programa fuente debe ser traducido a lenguaje de maquina, este proceso se realiza con el compilador y el sistema operativo que se encarga prcticamente de la compilacin.

______________________________________________________

12

Manual de Algoritmia
S tras la compilacin se presentan errores en el programa fuente, es preciso volver a editar el programa, corregir los errores y compilar de nuevo. Este proceso se repite hasta que no se producen errores, obtenindose el programa objeto que todava no es ejecutable directamente. Suponiendo que no existen errores en el programa fuente, se debe instruir al sistema operativo para que realice la fase de montaje o enlace (link), carga, del programa objeto con las bibliotecas del programa del compilador. El proceso de montaje produce un programa ejecutable. La Figura 3 describe el proceso completo de compilacin/ejecucin de un programa.

______________________________________________________

13

Manual de Algoritmia

Figura 3. Fases de la compilacin/ejecucin de un programa: a) edicin; b) compilacin; c) montaje o enlace

1.2.6.

Verificacin y Depuracin de un Programa

La verificacin o compilacin de un programa es el proceso de ejecucin del programa con una amplia variedad de datos de entrada, llamados datos de test o prueba, que determinarn si el programa tiene errores. Para realizar la verificacin se debe desarrollar una amplia gama de datos de test: valores normales de entrada, valores extremos de entrada que comprueben los limites del programa y valores de entrada que comprueben aspectos especiales del programa. La depuracin es el proceso de encontrar los errores del programa y corregir o eliminar dichos errores. Cuando se ejecuta un programa, se pueden producir tres tipos de errores: 1. Errores de Compilacin. Se producen normalmente por un uso incorrecto de las reglas del lenguaje de programacin y suelen ser errores de sintaxis. Si existe un error de sintaxis, la computadora no puede comprender la instruccin, no se obtendr el programa objeto y el compilador imprimir una lista de todos los errores encontrados durante la compilacin. 2. Errores de Ejecucin. Estos errores se producen por instrucciones que la computadora puede comprender pero no ejecutar. Ejemplos tpicos son: divisin por ______________________________________________________ 14

Manual de Algoritmia
cero y races cuadradas de nmeros negativos. En estos casos se detiene la ejecucin del programa y se imprime un mensaje de error. Errores Lgicos. Se producen en la lgica del programa y la fuente de error suele ser el diseo del algoritmo. Estos errores son los ms difciles de detectar, ya que el programa puede funcionar y no producir errores de compilacin ni de ejecucin, y slo puede advertirse el error por la obtencin de resultados incorrectos. En este caso se debe volver a la fase de diseo del algoritmo, modificar el algoritmo, cambiar el programa fuente y compilar y ejecutar una vez ms.

3.

1.2.7.

Documentacin y Mantenimiento La documentacin de un problema consta de las descripciones de los pasos a dar en el proceso de resolucin de dicho problema. La importancia de la documentacin debe ser destacada por su decisiva influencia en el producto final. Programas pobremente documentados son difciles de leer, ms difciles de depurar y casi imposible de mantener y modificar. La documentacin de un programa puede ser interna y externa. La documentacin interna es la contenida en lneas de comentarios. La documentacin externa incluye anlisis, diagramas de flujo y/o pseudocdigos, manuales de usuario con instrucciones para ejecutar el programa y para interpretar los resultados. La documentacin es vital cuando se desea corregir posibles errores futuros o bien cambiar el programa. Tales cambios se denominan mantenimiento del programa. Despus de cada cambio la documentacin debe ser actualizada para facilitar cambios posteriores.

1.3.

PROGRAMACION MODULAR La programacin modular es uno de los mtodos de diseo ms flexible y potente para mejorar la productividad de un programa. En programacin modular el programa se divide en mdulos (partes

______________________________________________________

15

Manual de Algoritmia
independientes), cada uno de las cuales ejecuta una nica actividad o tarea y se codifican independientemente de otros mdulos. Cada uno de estos mdulos se analiza, codifica y pone a punto por separado. Cada programa contiene un mdulo denominado programa principal que controla todo lo que sucede; se transfiere el control a submdulos (subprogramas), de modo que ellos puedan ejecutar sus funciones; sin embargo, cada submdulo devuelve el control al mdulo principal cuando se haya completado su tarea. Si la tarea asignada a cada submdulo es demasiado compleja, ste deber romperse en otros mdulos ms pequeos. El proceso sucesivo de subdivisin de mdulos contina hasta que cada mdulo tenga solamente una tarea especifica que ejecutar. Esta tarea puede ser entrada, salida, manipulacin de datos, control de otros mdulos o alguna combinacin de stos. Un mdulo puede transferir temporalmente el control a otro mdulo; sin embargo, cada mdulo debe eventualmente devolver el control al mdulo del cual se recibe originalmente el control. Los mdulos son independientes en el sentido en que ningn mdulo puede tener acceso directo a cualquier otro mdulo excepto el mdulo al que llama y sus propios submdulos. Sin embargo, los resultados producidos por un mdulo pueden ser utilizados por cualquier otro mdulo cuando se transfiera a ellos el control.

Raz

Modulo 1

Modulo 2

Modulo 11

Modulo 12

Modulo 21

Modulo 22

Figura 4. Programacin Modular Dado que los mdulos son independientes, diferentes programadores pueden trabajar simultneamente en diferentes partes del mismo programa. Esto reducir el tiempo del diseo del algoritmo y posterior ______________________________________________________ 16

Manual de Algoritmia
codificacin del programa. Adems, un mdulo se puede modificar radicalmente sin afectar a otros mdulos, incluso sin alterar su funcin principal. La descomposicin de un programa en mdulos independientes ms simples se conoce tambin como el mtodo de divide y vencers. Se disea cada mdulo con independencia de los dems, y siguiendo un mtodo ascendente o descendente se llegar hasta la descomposicin final del problema en mdulos en forma jerrquica. 1.4. PROGRAMACION ESTRUCTURADA Los trminos programacin modular, programacin descendente y programacin estructurada se introdujeron en la mitad de la dcada de los sesenta y a menudo se utilizan como sinnimos aunque no significa lo mismo. La programacin estructurada significa escribir un programa de acuerdo a las siguientes reglas: El programa tiene un diseo modular Los mdulos son diseados de modo descendente Cada mdulo se codifica utilizando las tres estructuras de control bsicas: secuencia, seleccin y repeticin. El trmino programacin estructurada se refiere a un conjunto de tcnicas que han ido evolucionando desde los primeros trabajos de Edgar Dijkstra. Estas tcnicas aumentan considerablemente la productividad del programa reduciendo en elevado grado el tiempo requerido para escribir, verificar, depurar y mantener los programas. La programacin estructurada utiliza un nmero limitado de estructuras de control que minimizan la complejidad de los programas y, por consiguiente, reducen los errores; hace los programas ms fciles de escribir, verificar, leer y mantener. Los programas deben estar dotados de una estructura. La programacin estructurada es el conjunto es el conjunto de tcnicas que incorporan: Recursos abstractos, Diseo descendente (top-down), Estructuras bsicas. 1.4.1. Recursos Abstractos

La programacin estructurada se auxilia de los recursos abstractos en lugar de los recursos concretos de que dispone un determinado lenguaje de programacin. ______________________________________________________ 17

Manual de Algoritmia
Descomponer un programa en trminos de recursos abstractos segn Dijkstra, consiste en descomponer una determinada accin compleja en trminos de un nmero de acciones ms simples capaces de ejecutarlas o que constituyan instrucciones de computadoras disponibles. 1.4.2. Diseo Descendente (top-down) El diseo descendente (top-down) es el proceso mediante el cual un problema se descompone en una serie de niveles o pasos sucesivos de refinamiento. La metodologa descendente consiste en efectuar una relacin entre las sucesivas etapas de estructuracin de modo que se relacionasen unas con otras mediante entradas y salidas de informacin. Es decir, se descompone el problema en etapas o estructuras jerrquicas, de forma que se puede considerar cada estructura desde dos puntos de vista: qu hace? Y cmo lo hace? Si se considera un nivel n de refinamiento, las estructuras se consideran de la siguiente manera:

Nivel n: desde el exterior qu hace?

Nivel n+1: Vista desde el interior cmo lo hace?

______________________________________________________

18

Manual de Algoritmia

Figura 5. Diseo Descendente

1.4.3.

Estructuras de Control Las estructuras de control de un lenguaje de programacin son mtodos de especificar el orden en que las instrucciones de un algoritmo se ejecutarn. El orden de ejecucin de las sentencias o instrucciones determina el flujo de control. Estas estructuras de control son, por consiguiente, fundamentales en los lenguajes de programacin y en los diseos de algoritmos, especialmente los pseudocdigos. Las tres estructuras de control bsicos son: Secuencia, Seleccin, Repeticin. La programacin estructurada hace los programas ms fciles de escribir, verificar, leer y mantener; utiliza un nmero limitado de estructuras de control que minimizan la complejidad de los problemas.

1.4.4.

Teorema de la Programacin Estructurada: Estructuras Bsicas En mayo de 1996, Bohm y Jacopini demostraron que un programa propio puede ser escrito utilizando solamente tres tipos e estructuras de control.

______________________________________________________

19

Manual de Algoritmia
Secuenciales, Selectivas, Repetitivas. Un programa se define como propio si cumple las siguientes caractersticas: Posee un solo punto de entrada y uno de salida o fin para control del programa. Existen caminos desde la entrada hasta la salida que se pueden seguir y que pasan por todas las partes del programa. Todas las instrucciones son ejecutables y no existen lazos o bucles infinitos (sin fin). La programacin estructurada significa que: El programa completo tiene un diseo modular. Los mdulos se disean con metodologa descendente (puede hacerse tambin ascendente). Cada mdulo se codifica utilizando las tres estructuras de control bsicas: secuenciales, selectivas y repetitivas Estructuracin y modularidad son conceptos complementarios

1.5.

CONCEPTO Y CARACTERISTICAS DE ALGORITMOS El objetivo fundamental de este manual es ensear a resolver problemas mediante una computadora. El programador de computadora es antes que nada una persona que resuelve problemas, por lo que para llegar a ser un programador eficaz se necesita aprender a resolver problemas de un modo riguroso y sistemtico. Problema Diseo del Algoritmo Programa de Computadora

Figura 6. Resolucin de un Programa ______________________________________________________ 20

Manual de Algoritmia
Los pasos para la resolucin de un problema son: 1. Diseo del algoritmo, que describe la secuencia ordenada de pasos sin ambigedades que conducen a la solucin de un problema dado(anlisis del problema y desarrollo del algoritmo) 2. Expresar el algoritmo como un programa en un lenguaje de programacin adecuado(Fase de codificacin) 3. Ejecucin y validacin del programa por la computadora. Para llegar a la realizacin de un programa es necesario el diseo previo de un algoritmo, de modo que sin algoritmo no puede existir un programa. Los algoritmos son independientes tanto del lenguaje de programacin en que se expresan como de la computadora que los ejecuta. En cada problema el algoritmo se puede expresar en un lenguaje diferente de programacin y ejecutarse en una computadora distinta; sin embargo, el algoritmo ser siempre el mismo. En la ciencia de la computacin y en la programacin, los algoritmos son ms importantes que los lenguajes de programacin o las computadoras. Un lenguaje de programacin es tan slo un medio para expresar un algoritmo y una computadora es slo un procesador para ejecutarlo. Por tanto el lenguaje de programacin como la computadora son los medios para obtener un fin: conseguir que el algoritmo se ejecute y se efecte el proceso correspondiente. El diseo de la mayora de los algoritmos requiere creatividad y conocimientos profundos de la tcnica de la programacin. En esencia, la solucin de un problema se puede expresar mediante un algoritmo.

1.5.1.

Caractersticas de los Algoritmos Las caractersticas fundamentales que debe cumplir todo algoritmo son: Un algoritmo debe ser preciso e indicar el orden de realizacin de cada paso. Un algoritmo debe estar definido. Si se sigue un algoritmo dos veces, se debe obtener el mismo resultado cada vez.

______________________________________________________

21

Manual de Algoritmia
Un algoritmo debe ser finito. Si se sigue un algoritmo, se debe terminar en algn momento; o sea, debe tener un nmero finito de pasos. Precisin Definitud o determinismo Finitud Dada una cantidad de datos de entrada de un algoritmo, se dice que la cantidad de un recurso usada por dicho algoritmo para su ejecucin determina la complejidad del algoritmo respecto a tal recurso. Cuando se implementa un algoritmo en un computador digital, los recursos con los que se cuenta son tiempo de proceso y memoria. Por lo tanto, a un algoritmo implementado en un computador digital se le pueden calcular sus complejidades temporal y espacial La definicin de un algoritmo debe describir tres partes: Entrada, proceso, y Salida. 1.5.2. Diseo del Algoritmo Una computadora no tiene capacidad para solucionar problemas ms que cuando se le proporciona los sucesivos pasos a realizar. Estos pasos sucesivos que indican las instrucciones a ejecutar por la mquina constituyen, como ya conocemos, el algoritmo. La informacin que se proporciona al algoritmo constituye la entrada y la informacin producida por el algoritmo constituye su salida. Los problemas complejos se pueden resolver ms eficazmente con la computadora cuando se rompen en subproblemas que sean ms fciles de solucionar que el original. As el problema de encontrar la superficie y la longitud de un crculo se puede dividir en tres problemas ms simples o subproblemas (Figura 7)

______________________________________________________

22

Manual de Algoritmia

Superficie y longitud de circunferencia

Entrada de datos

Clculo de superficie (S) S = PI * R2

Clculo de longitud (L)

Salida de Resultados

Entrada Radio (R)

L = 2 * PI *R Salida (R) Salida (S) Salida (L)

Figura 7. Refinamiento de un Algoritmo Tras los pasos anteriores (diseo descendente y refinamiento por pasos) es preciso representar el algoritmo mediante una determinada herramienta de programacin: diagrama de flujo, pseudocdigo o diagrama N S. As pues, el diseo del algoritmo se descompone en las fases recogidas en la Figura 8:

______________________________________________________

23

Manual de Algoritmia
Diseo de un algoritmo

Diseo descendente (1)

Refinamiento Por casos (2)

Herramientas de programacin (3) -diagrama de flujo -pseudocdigo -diagrama N-S

Figura 8. Fases del Diseo de un Algoritmo 1.6. REPRESENTACIN GRFICA DE LOS ALGORITMOS Para representar un algoritmo se debe utilizar algn mtodo que permita independizar dicho algoritmo del lenguaje de programacin elegido. Ello permitir que un algoritmo pueda ser codificado indistintamente en cualquier lenguaje. Para conseguir este objetivo se precisa que el algoritmo sea representado grfica o numricamente, de modo que las sucesivas acciones no dependan de la sintaxis de ningn lenguaje de programacin, sino que la descripcin pueda servir fcilmente para su transformacin en un programa, es decir, su codificacin. Los mtodos usuales para representar un algoritmo son: 1. Lenguaje de especificacin de algoritmos: pseudocdigo 2. Diagrama de flujo Diagrama N-S (Nassi Schneiderman) Cuando se plantean problemas basados en algoritmos, se debe tener encuenta que: Los problemas se clasifican por la existencia de una solucin en solubles, no solubles e indecidible. Un problema se dice SOLUBLE si se sabe de antemano que existe una solucin para l. Un problema se dice INSOLUBLE si se sabe que no existe una solucin para l. ______________________________________________________ 24

Manual de Algoritmia
Un problema se dice INDECIDIBLE si no se sabe si existe o no existe solucin para l. A su vez, los problemas solubles se dividen en dos clases: los algortmicos y los no algortmicos. Un problema se dice ALGORTMICO si existe un algoritmo que permita darle solucin. Un problema se dice NO ALGORTMICO si no existe un algoritmo que permita encontrar su solucin. 1.6.1. Pseudocdigo El pseudocdigo es un lenguaje de especificacin de algoritmos. El uso de tal lenguaje hace el paso de codificacin final relativamente fcil. El pseudocdigo naci como un lenguaje similar al ingls y era un medio de representar bsicamente las estructuras de control de programacin estructurada. Se considera un primer borrador, dado que el pseudocdigo tiene que traducirse posteriormente a un lenguaje de programacin. El pseudocdigo no puede ser ejecutado por una computadora. La ventaja del pseudocdigo es que en su uso, en la planificacin de un programa, el programador se puede concentrar en la lgica y en las estructuras de control y no preocuparse de las reglas de un lenguaje especfico. Es tambin fcil modificar el pseudocdigo si se descubren errores o anomalas en la lgica del programa, mientras que en muchas ocasiones suele ser difcil el cambio en la lgica, una vez que est codificado en un lenguaje de programacin. Otra ventaja del pseudocdigo es que puede ser traducido fcilmente a lenguajes estructurados como C, C++, Java, C#, etc. El algoritmo comienza con la palabra start y finaliza con la palabra end, en ingls (en espaol, inicio, fin). Entre estas palabras, slo escribe una instruccin o accin por lnea. La lnea precedida por // se denomina comentario. Es una informacin al lector del programa y no realiza ninguna instruccin ejecutable, slo tiene efecto de documentacin interna del programa. Por fortuna, aunque el pseudocdigo naci como un sustituto del lenguaje de programacin y, por consiguiente, sus ______________________________________________________ 25

Manual de Algoritmia
palabras reservadas se conservaron o fueron muy similares a las del idioma ingls, el uso del pseudocdigo se ha extendido en la comunidad hispana con trminos en espaol como inicio, fin, parada, leer, escribir, si entonces, si no, mientras, fin _ mientras, repetir, hasta _ qu, etc.

Secuencial Inicio accin1 accin2 . . . accin n Fin Decisin Simple si condicin entonces accin1 accin2 . . . accin n ______________________________________________________ 26

Manual de Algoritmia

Decisin Doble si condicin entonces accin1 accin2 . . . en caso contrario accin1 accin2

Iteracin Fija para var. Entera inicial hasta final hacer accin1 accin2 . . . accin n

______________________________________________________

27

Manual de Algoritmia

Condicional al Inicio mientras condicin hacer accin1 accin2 . . . accin n

Condicional al Final repita accin1 accin2 . . . accin n Hasta que condicin

______________________________________________________

28

Manual de Algoritmia
Seleccin casos selector de valor 1 : accin1 accin2

valor 2 : accin1 accin2 ... valor n : accin1 accin2

______________________________________________________

29

Manual de Algoritmia
Ejemplos de Algoritmos: 1. Un estudiante se encuentra en su casa (durmiendo) y debe ir a la universidad (a tomar la clase de algoritmia!), qu debe hacer el estudiante? ALGORITMO:

Inicio Dormir haga 1 hasta que suene el despertador (o lo llame la mam). Mirar la hora. Hay tiempo suficiente? Si hay, entonces Baarse. Vestirse. Desayunar. Sino, Vestirse. Cepillarse los dientes. Despedirse de la mam y el pap. Hay tiempo suficiente? Si, Caminar al paradero. Sino, Correr al paradero. Hasta que pase un bus para la universidad haga: Esperar el bus Ver a las dems personas que esperan un bus. Tomar el bus. Mientras no llegue a la universidad haga: Seguir en el bus. Pelear mentalmente con el conductor. Timbrar. Bajarse. Entrar a la universidad. Fin

______________________________________________________

30

Manual de Algoritmia
2. Cambiar la rueda pinchada de un automvil teniendo un gato mecnico en buen estado, una rueda de reemplazo y una llave inglesa. ALGORITMO: Inicio PASO 1. Aflojar los tornillos de la rueda pinchada con la llave inglesa. PASO 2. Ubicar el gato mecnico en su sitio. PASO 3. Levantar el gato hasta que la rueda pinchada pueda girar libremente. PASO 4. Quitar los tornillos y la rueda pinchada. PASO 5. Poner rueda de repuesto y los tornillos. PASO 6. Bajar el gato hasta que se pueda liberar. PASO 7. Sacar el gato de su sitio. PASO 8. Apretar los tornillos con la llave inglesa. Fin

3. Realizar la suma de los nmeros 2448 y 5746. ALGORITMO: Inicio PASO 1. Colocar los nmeros el primero encima del segundo, de tal manera que las unidades, decenas, centenas, etc., de los nmeros que den alineadas. Trazar una lnea debajo del segundo nmero. PASO 2. Empezar por la columna ms a la derecha. PASO 3. Sumar los dgitos de dicha columna. PASO 4. Si la suma es mayor a 9 anotar un 1 encima de la siguiente columna a la izquierda y anotar debajo de la lnea las unidades de la suma. Si no es mayor anotar la suma debajo de la lnea. PASO 5. Si hay ms columnas a la izquierda, pasar a la siguiente columna a la izquierda y volver a 3. PASO 6. El nmero debajo de la lnea es la solucin. Fin

______________________________________________________

31

Manual de Algoritmia
4. Sean los puntos P=(a,b) y Q=(c,d) que definen una recta, encontrar un segmento de recta perpendicular a la anterior que pasa por el punto medio de los puntos dados. ALGORITMO:

Inicio

PASO 1. Trazar un crculo con centro en el punto P que pase por el punto Q.

PASO 2. Trazar un crculo con centro en el punto Q que pase por el punto P.

______________________________________________________

32

Manual de Algoritmia

PASO 3. Trazar un segmento de recta entre los puntos de interseccin de las circunferencias trazadas.

Fin. El segmento de recta trazada es el buscado.

______________________________________________________

33

Manual de Algoritmia
5. Escribir un algoritmo que lea las cuatro notas de un estudiante e imprima la nota definitiva. ALGORITMO: 1. Inicio 2. leer n1, n2, n3, n4 3. suma = n1 + n2 + n3 + n4 4. parcial = suma*4/100 5. notadef = parcial + 1 6. Imprimir notadef 7. fin

6. Escribir un algoritmo que calcule e imprima el area de un triangulo: ALGORITMO: Inicio leer datos: base, altura Calcular area: area = (base*altura)/2 Imprimir base, altura, area fin

7. Un vendedor recibe una comisin del 10% del total de ventas del mes. El quiere saber cuanto ganar en un mes que tuvo tres ventas: ALGORITMO: Inicio leer sueldobase, venta1, venta2, venta3 subtotal = venta1 + venta2 + venta3 comision = subtotal *0,10 total = sueldobase + comision imprimir total fin

______________________________________________________

34

Manual de Algoritmia
8. Una tienda ofrece un 15% de descuento por cada compra. Un cliente desea saber cuanto deber pagar por su compra: ALGORITMO:

Inicio leer monto descuento = monto * 0,15 total = monto - descuento imprimir total Fin

9. Hacer un algoritmo que lea los nombres y edades de dos personas e imprima cual de ellas tiene ms edad. ALGORITMO: 1. Inicio 2. leer nombre1 y edad1 3. leer nombre2 y edad2 4. comparar edad1 con edad2: 5. Si edad1 > edad2 imprimir nombre1, es mayor 6. si edad2 > edad1 imprimir nombre2, es mayor 7. Si edad1 = edad2 imprimir 8. Fin

10. En una Granja existen N conejos, N1 blancos y N2 negros. Se venden X negros y Y blancos. Hacer un algoritmo que: a) Imprima la cantidad de conejos vendida b) Si P1 es el precio de venta de los conejos blancos y P2 es el precio de venta de los conejos negros, imprima el monto total de la venta. c) Imprima el color de los conejos que se vendieron ms.

______________________________________________________

35

Manual de Algoritmia
ALGORITMO:

1. Inicio 2. Leer datos: N, N1,N2,X,Y,P1,P2 3. Calcular la cantidad de conejos vendida: CNV = X + Y 4. Imprimir la cantidad de conejos vendida: Imprimir CNV 5. Calcular el monto de la venta: MV = X * P2 + Y * P1 6. Imprimir monto de la venta: Imprimir MV 7. Si X > Y entonces Imprimir Se vendieron mas conejos negros en otro caso Imprimir Se vendieron mas conejos blancos 8. Fin

11. Elaborar un algoritmo que lea el importe bruto de una factura y determine el importe neto segn los siguientes criterios: Importe bruto menor de 20.000 -> sin descuento Importe bruto mayor de 20.000 -> 15% de descuento ALGORITMO: 1. Inicio 2. Leer importeb 3. Calcular descuento: Si importeb >= 20000 entonces descuento =importeb * 0.15; en otro caso descuento = 0 finsi 4. fin

______________________________________________________

36

Manual de Algoritmia
Ejercicios Propuestos: Para los siguientes problemas dar un algoritmo y si es posible una ejecucin del mismo. 1. Buscar en el directorio telefnico, el nmero de: a. Jos Gonzlez Prez b. Pedro Gmez Bernal. c. Escribir un algoritmo que sirva para buscar a cualquier persona. 2. Solicitar en prstamo algn libro de una biblioteca. 3. haga una caja de cartn con tapa de: a. 20 cm de largo, por 10 cm de ancho y 5 cm de alto. b. 10 cm de largo, por 30 cm de ancho y 15 cm de alto. c. Escribir un algoritmo que sirva para construir una caja de cartn con tapa de cualquier tamao. 4. Construir un avin de papel. 5. Calcular manualmente la divisin de cualquier par de nmeros naturales. El resultado tambin debe ser un nmero natural. Escribir un algoritmo para calcular el residuo de la divisin. 6. Un juego muy famoso entre dos nios es el de adivina mi nmero,el cual consiste en que cada nio trata de adivinar el nmero pensado por el otro nio. Dicho nmero generalmente est entre 1 y 100. Las reglas del juego son las siguientes: a. Cada nio posee un turno en el que trata de averiguar el nmero del otro. b. En su turno el primer nio pregunta si un nmero que dice es el pensado por el segundo. c. Si el nmero que ha dicho el primer nio es el que pens el segundo, este ltimo debe informarle al primero que gan. d. Si el nmero no es el segundo nio debe decir si su nmero pensado es menor o mayor al que el primer nio dijo. e. Luego el segundo nio tiene su turno y de esta manera se van ______________________________________________________ 37

Manual de Algoritmia
intercalando hasta que alguno de los dos gane.Desarrollar un algoritmo para jugar adivina mi nmero. 7. Una balanza se encuentra en equilibrio cuando el producto de la carga aplicada sobre el brazo derecho por la longitud de este brazo, es igual al producto de la carga aplicada sobre el brazo izquierdo por la longitud de este otro brazo. Determinar si la balanza se encuentra en equilibrio si: a. La longitud del brazo izquierdo es 3 m, la del derecho es 2 m, la carga aplicada al brazo izquierdo es 5 Kg y la carga aplicada al derecho es 7 Kg. b. La longitud del brazo izquierdo es 4 m, la del derecho es 2 m, la carga aplicada al brazo izquierdo es 4 Kg y la carga aplicada al derecho es 4 Kg. c. Desarrollar un algoritmo que sirva para cualquier conjunto de valores para las longitudes de los brazos y las cargas aplicadas. 8. Si Juan tiene el doble de la edad de Pedro y la suma de las edades de los dos es 33 aos, Cuntos aos tiene Juan y cuntos tiene Pedro?. 9. Se tienen dos jarras (A y B) de capacidades 3 y 7 litros respectivamente, sobre las cuales se pueden efectuar las siguientes acciones: Llenar totalmente cualquiera de las dos jarras, vaciar una de las dos jarras en la otra hasta que la jarra origen este vaca o hasta que la jarra destino este llena y vaciar el contenido de una jarra (este llena o no) en un sifn. Cmo se puede dejar en la jarra A un solo litro utilizando solamente las anteriores acciones?. 10. Tres personas deciden invertir su dinero para formar una empresa. Cada una de ellas invierte una cantidad distinta. Hacer un algoritmo que imprima el porcentaje que cada quien invierte con respecto al total de la inversin

______________________________________________________

38

Manual de Algoritmia

1.6.2.

Diagrama de Flujo Los diagramas de flujo son representaciones grficas de algoritmos. Un diagrama de flujo consta de smbolos, que representan los pasos o etapas del algoritmo. Cada smbolo representa un tipo de actividad.

Smbolos: Los diferentes smbolos usados en un diagrama de flujo son:

______________________________________________________

39

Manual de Algoritmia
Smbolo Paso Actividad Entrada/Salida Este smbolo representa una entrada salida.

Proceso Este smbolo representa un proceso de una entrada, tal como la suma de dos nmeros.

Decisin Este smbolo representa una condicin con la cual se debe tomar una decisin.

Procedimiento/Subrutina Este smbolo representa la llamada a un procedimiento o subrutina predefinido compuesto de pasos que no son parte de este diagrama. Un programa grande puede ser divido en subprogramas pequeos llamados procedimientos o subrutinas. Este smbolo representa la llamada a un procedimiento o subrutina desde el ______________________________________________________

40

Manual de Algoritmia
programa principal. El procedimiento o subrutina es completamente descrito en un diagrama de flujo diferente Lnea de flujo Este smbolo representa los enlaces de un smbolo con otro y ayuda a entender la secuencia de los pasos a seguir para completar una tarea. Este smbolo indica el flujo del diagrama de flujo desde arriba hacia abajo o de la izquierda a la derecha. Inicio y Fin Este smbolo representa el inicio y fin del diagrama de flujo.

Conectoren Pgina Un diagrama de flujo se puede dividir en partes cuando muchas lneas del flujo lo hacen ilegible. Este smbolo representa la conexin entre estas partes del un diagrama de flujo en una misma pgina. Este smbolo es etiquetado con letras en maysculas, por ejemplo A.

______________________________________________________

41

Manual de Algoritmia
ConectorFuera de Pgina Este smbolo representa la conexin entre las partes de un diagrama de flujo en pginas separadas. Esto ayuda a prevenir confusin respecto a la secuencia de un diagrama de flujo cuando este abarca mltiples pginas. Este smbolo es etiquetado con nmeros, por ejemplo 1. Visualizacin Este smbolo representa la salida usando la instruccin mostrar.

______________________________________________________

42

Manual de Algoritmia
Ejemplos El siguiente diagrama de flujo acepta dos nmeros, calcula el producto y muestra el resultado.

______________________________________________________

43

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


El siguiente diagrama de flujo acepta dos nmeros, y muestra el mayor de ellos despus de compararlos.

______________________________________________________

44

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


El siguiente es el diagrama de flujo dado en el manual de una televisin proporciona las recomendaciones para resolver el problema de mal funcionamiento del control remoto.

Reglas de un Diagrama de Flujo ______________________________________________________ 45

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


El American National Standards Institute (ANSI) recomienda un nmero de reglas a cumplir en el dibujo de diagramas de flujo. Algunas de estas reglas y pautas se muestran a continuacin: La lgica completa de un diagrama de flujo debera representarse usando los smbolos estndares. El diagrama de flujo debera ser claro, preciso y de fcil interpretacin. Los diagramas de flujo solo puede tener un punto de inicio y un punto de trmino. Los pasos en un diagrama de flujo deberan seguir el enfoque de arriba a abajo o de izquierda a derecha. Todas las entradas de datos necesarias deberan exponerse en un orden lgico. Los smbolos de inicio y fin deberan tener una sola lnea de flujo. Los smbolos de entrada, procesamiento, salida y visualizacin de datos deberan tener dos lneas de flujo conectadas, una previa al smbolo y otra posterior al smbolo. El smbolo de decisin debera tener una lnea de flujo conectada previo al smbolo y dos lneas de flujo conectadas posterior al smbolo para cada posible solucin. Ventajas de los Diagramas de Flujo Las ventajas de los diagramas de flujo son: Los diagramas de flujo es el mejor mtodo de comunicar lgica. Los diagramas de flujo ayudan a analizar los problemas eficazmente. Los diagramas de flujo actan como gua durante la fase de diseo del programa. Es ms fcil depurar errores de lgica usando un diagrama de flujo. Los diagramas de flujo ayudan a mantener los programas.

______________________________________________________

46

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________

Desventajas de los Diagramas de Flujo Las desventajas de los Diagramas de flujo son: Un diagrama de flujo largo puede extenderse sobre mltiples pginas, lo cual reduce su legibilidad. Como los smbolos de los diagramas de flujo no pueden escribirse, el dibujo de un diagrama de flujo usando cualquier herramienta grfica lleva mucho tiempo. Los cambios hechos en un solo paso pueden ocasionar tener que volver a dibujar el diagrama de flujo completo. Un diagrama de flujo representando un algoritmo complejo puede tener demasiadas lneas de flujo. Esto reduce su legibilidad y llevar mucho tiempo dibujarlo y entender su lgica.

______________________________________________________

47

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________

CAPITULO II VARIABLES, CONSTANTES, CONTADORES, ACUMULADORES Y OPERADORES

2.1.

INTRODUCCIN Y MOTIVACIN Este capitulo le introduce al estudiante a conocer el uso de las variable, constantes, contadores, acumuladores y expresiones utilizados constantemente en la formulacin de los diferentes algoritmos propuestos. El estudiante entendera su uso de determinados problemas planteados en clase y por si mismo, facilitando una mejor forma de dar asolucin a los algoritmos atravez de diagramas de flujo y codificacin en java.

2.2.

INTRODUCCIN A LAS VARIABLES La memoria interna del computador se utiliza para almacenar los datos de entrada proporcionados por el usuario, las instrucciones para tratar estos datos y el resultado del proceso o datos de salida. La memoria consta de diversas localizaciones en las cuales se almacenan los datos. Las variables pueden clasificarse en dos categoras:

______________________________________________________

48

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Valores numricos, como 25, 78 y 90.45. Esto quiere decir que los valores numericos pueden clasificarse en enteros y reales Valores de carcter como "Hola", "X", "E001" y "1988". Los literales carcter siempre van entre comillas (" ") Para entender como un computador procesa los datos, considere el siguiente problema donde dos nmeros son ingresados y el resultado se muestra sobre la pantalla. El diagrama de flujo usado para representar la lgica de la solucin del problema es el siguiente:

______________________________________________________

49

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Cuando las instrucciones son ejecutadas, el valor del primer nmero es aceptado y almacenado en la memoria. De manera similar, el valor del segundo nmero es tambin aceptado y almacenado en la memoria. El computador hace referencia a los nmeros almacenado en memoria, calcula la suma, y almacena el resultado obtenido en una localizacin diferente de la memoria. El computador hace referencia al resultado almacenado en memoria, para mostrarlo en la pantalla. Por lo tanto, el computador necesita identificar las localizaciones de memoria para almacenar los valores o recuperar los valores almacenados. Las localizaciones cuando el primer nmero, el segundo nmero, y el resultado son almacenados pueden ser referenciadas como nNumero1, nNumero2 y nSuma respectivamente. Cada vez que el conjunto de instrucciones son ejecutadas; los valores de nNumero1, nNumero2, y nSuma variar, dependiendo de los valor ingresados por el usuario. Por consiguiente, nNumero1, nNumero2, y nSuma son conocidos como variables.

Tipos de Datos El nmero de bytes que debe reservarse para las diferentes variables depende del tipo de valor que stas almacenan. Por lo tanto, hay una necesidad de clasificar los tipos de datos que puedan ser almacn en la ______________________________________________________ 50

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


memoria. Este tipo de valor es denominado tipo de dato. Los tipos de datos estn clasificados en: Numricos: Las variables de tipo de dato numrico solo pueden contener nmeros. Por ejemplo; la edad de una persona, el precio de un producto. Estas variables pueden almacenar nmeros de coma flotante y pueden ser usadas dentro de clculos. Carcter: Las variables de tipo de dato carcter pueden contener una combinacin de letras, nmeros, y caracteres especiales. Por ejemplo; el nombre de una persona la direccin postal. Estas variables no pueden ser usadas dentro de clculos. Declaracin de Variables Es necesario declarar una variable antes de ser usada dentro de un programa. Cuando se declara una variable, una posicin de memoria defina se esta asignado a la variable. La declaracin de una variable asigna un nombre a la variable y especifica el tipo de dato que la variable puede almacenar. Por ejemplo, se necesita desarrollar un pseudocdigo para aceptar el nombre, edad, y telfono de un cliente. Para aceptar el nombre, se necesita declarar la variable de tipo carcter. De manera similar, es necesario declarar dos variables numricas con los nombres: edad y telefono para aceptar la edad y telfono del cliente. La declaracin de estas variables es como sigue:

char nombre int edad, telefono

Aunque no hay convenciones para dar nombre a las variables, las siguientes pautas pueden resultar tiles: La primera letra del nombre de la variable podra indicar el tipo de dato de la variable. Por ejemplo, puede ser c o n para indicar una variable carcter o numrica, respectivamente. Algunos ejemplos son cNombre y nEdad. ______________________________________________________ 51

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


El nombre de la variable debera describir con claridad el propsito de la variable. Por ejemplo, nNota es una variable numrica para guardar la nota del alumno. El nombre de la variable no debera contener espacios o smbolos tales como: ! @ # $ % ^ & * ( ) { } [ ] . , : ; / y \. Se puede utilizar el carcter de subrayado cuando sea necesario insertar un espacio en el nombre de una variable, como por ejemplo, nSalario_Bsico. Si el nombre de la variable est compuesto por varias palabras sin espacios entre ellas, la primera letra de cada palabra debera ir en mayscula para facilitar la lectura.

2.3.

CONSTANTES As como las variables la s contantes tambien se almacenan en la memoria del computador al momento de ejecutarlas, con la diferencia que las constantes son valores predefinidos en un programa que nuncan cambian su valor y tambien pueden clasificarse en valores numericos (enteros y reales) y valores de carcter. Por ejemplo: Valores numricos, como 34, 22 y 33.22. Esto quiere decir que los valores numericos pueden clasificarse en enteros y reales Valores de carcter como "Hola", "Jose", "E001" y "2009". Los datos tipos carcter, siempre van entre comillas (" ")

2.4.

CONTADORES Los contadores son otro tipo de variables muy utilizados dentro de estructuras repetitivas. Su funcin principal es contar una serie de valores numericos ya sea de uno en uno, dos en dos, etc. Por ejemplo: Sintaxis: c= c+1; c=c+2; c=c-3..etc. Los contadores pueden expresarse enforma de suma o resta. Las dos primeras variables deben ser iguales. El valor constante indica el numero de conteo que ba ha realizar, si es uno indicara que el conteo ser de uno en uno y asi sucesivamente.

______________________________________________________

52

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


2.5. ACUMULADORES Los acumuladores son otro tipo de variables muy utilizados dentro de estructuras repetitivas. Su funcin principal es acumular valores numericos que se an ingresado o procesado en alguna variable, etc. Por ejemplo: Sintaxis: ac= ac + N ; t= t + M Las dos primeras variables deben ser iguales siempre en un acumulador; N y M son variables que contienen valores ya sea que se hayan ingresado o calculado internamente dentro de una estructura repetitiva. 2.6. OPERADORES Los operadores determinan el tipo de operacin que se quiere realizar con los elementos de una expresin. En una expresin, el elemento sobre el cual acta un operador se llama operando. Por ejemplo, en la expresin, a + b, a y b son conocidos como operandos. Los operadores pueden ser clasificados en las siguientes categoras: Operadores aritmticos Operadores Relacionales Operadores lgicos Operadores Aritmticos Los operadores aritmticos, como su nombre lo indica, son utilizados para realizar clculos aritmticos. Algunos de los operadores aritmticos ms comunes son los siguientes:

Operador Suma (+)

Descripcin Suma los operandos

Ejemplo c=a+b

______________________________________________________

53

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Resta (-) Resta el operando derecho del operando izquierdo c=a-b c=a*b c= a/b c= a%b

Multiplicacin (*) Multiplica los operandos Divisin (/) Modulo (%) Divide el operando izquierdo por del operando derecho Calcula el residuo de una divisin entera

El siguiente pseudocdigo representa una operacin usando el operador modulo:

Inicio Int nNum1, nNum2, nNum3 nNum1 = 15 nNum2 = 2 nNum3 = nNum1 % nNum2 Mostrar nNum3 Fin

En este pseudocdigo, a las variable nNum1 y nNum2 se le asigna 15 y 2 respectivamente. La salida del pseudocdigo ser 1, el cual es el residuo de la divisin entera entre nNum1 y nNum2. Operadores Relacionales Se puede comparar dos operandos con el operadores relacional. Cuando dos operandos son comparados usando estos operadores, el resultado es un valor lgico, TRUE o FALSE. Son seis operadores relacionales. La siguiente tabla muestra los operadores relacionales:

______________________________________________________

54

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________

Operador =

Descripcin Evala si los operandos son iguales

Ejemplo a=b

!=

Evala si los operandos son diferentes

a != b

>

<

>=

<=

Evala si el operando de la izquierda es mayor que el operando de la derecha Evala si el operando de la izquierda es menor que el operando de la derecha Evala si el operando de la izquierda es mayor o igual que el operando de la derecha. Evala si el operando de la izquierda es menor o igual que el operando de la derecha Operadores Lgicos

a>b

Explicacin Retorna TRUE si los valores son iguales y FALSE en caso contrario. Retorna TRUE si los valores son diferentes y FALSE en caso contrario. Retorna TRUE si a es mayor que b y FALSE en caso contrario Retorna TRUE si a es menor que b y FALSE en caso contrario Retorna TRUE si a es mayor o igual que b y FALSE en caso contrario Retorna TRUE si a es menor o igual que b y FALSE en caso contrario

a<b

a >= b

a <= b

Los operadores lgicos son usados para combinar los resultados de expresiones que contienen operadores relacionales. A continuacin tenemos una tabla que describe los operadores lgicos: Operador Descripcin AND Lgica AND OR Lgica OR NOT Lgica NOT Ejemplo a < 5 AND b > 10 a < 5 OR b > 10 NOT a = 5 55

______________________________________________________

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


En la siguiente tabla se describe como trabaja el operador AND y el operador OR:

Valor de la Expresin Combinada Expresin 1 Expresin 2 AND TRUE TRUE FALSE FALSE TRUE FALSE TRUE FALSE TRUE FALSE FALSE FALSE OR TRUE TRUE TRUE FALSE

Precedencia de Operadores Cada operador tiene una precedencia asociada. Se utiliza esta caracterstica para determinar la manera en que es evaluada una expresin que implica ms de un operador. Por ejemplo, consideremos la siguiente expresin:

nResultado = nNum1 + nNum2 * nNum3 / 45

Para obtener el resultado correcto de tal expresin, es necesario saber la prioridad o precedencia de cada operador. La precedencia tiene diferentes niveles desde 1 hasta 8. Estos niveles determinan el orden de evaluacin de la expresin. Cada operador pertenece a uno a un solo nivel y ms de un operador pueden pertenecer al mismo nivel. Los operadores de ms alta precedencia se evalan primero. Los operadores del mismo nivel de precedencia se evalan de izquierda a derecha en una expresin. Esto se conoce como asociatividad. La tabla siguiente lista los operadores en orden decreciente de precedencia. ______________________________________________________ 56

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Nivel de Precedencia 1 2

Operador () ! * / % + < <= > >= = ! AND OR

Descripcin Parntesis Lgica NOT Multiplicacin Divisin Mdulo Suma Resta Menor que Menor o Igual que Mayor que Mayor o Igual que Igual que Diferente que Lgica Y Lgica O

Asociatividad

De Izquierda a Derecha

De Izquierda a Derecha

De Izquierda a Derecha

De Izquierda a Derecha De Izquierda a Derecha De Izquierda a Derecha

7 8

Esta tabla muestra la precedencia y la asociatividad de los operadores. El orden de precedencia y la asociatividad de los operadores tienen que ser ______________________________________________________ 57

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


evaluados mientras construimos la expresin para obtener la salida deseada. Por ejemplo, consideremos la siguiente expresin: nResultado = nNum1 + nNum2 * nNum3 / 45

De acuerdo a las reglas de precedencia, el operador de multiplicacin, "*", tiene la precedencia mas alta que al operador suma "+" y el operador de divisin "/". Por lo tanto la multiplicacin de nNum1 y nNum2 se ejecuta primero. Asumiendo que los valores de nNum1 es 8, nNum2 es 9 y nNum3 es 10, el resultado de la expresin ser: nResultado = 8 + 90 / 45

El operador "/" tiene precedencia alta que "+". Por lo tanto, 90/45 es evaluado primero. El resultado de la expresin es:

nResultado = 8 + 2

El resultado final es:

nResultado = 10

En la expresin anterior, supongamos que el propsito era primero sumar los nmeros nNum1 y nNum2, y despus multiplicar su resultado con nNum3. Finalmente, dividir el resultado por 45. Para resolver este propsito, se puede cambiar la orden de precedencia usando el operador parntesis "( )", tal como sigue:

nResultado = ( nNum1 + nNum2 ) * nNum3 / 45

______________________________________________________

58

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________

CAPITULO III APLICACIONES DE DIAGRAMAS DE FLUJO

3.1.

INTRODUCCIN Y MOTIVACIN Este capitulo le introduce al estudiante a conocer las diferentes aplicaciones de los diagramas de flujo, planteando algoritmos, su resolucin y ejercicios propuestos para cada caso.

3.2.

ESTRUCTURA SECUENCIAL La estructura secuencial se caracteriza por mostrar problemas con caracteristicas secuenciales donde por ningn caso se hara uso de alguna otra estructura. Los problemas plantados mayormente tienen ambito matematico aritmetico cumpliendo los tre requisitos basicos de un diagarama: Entrada, Proceso y Salida. Ejemplos:

______________________________________________________

59

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.2.1: Muestre un algoritmo lea dos valores a, b, y los intercambie. Por ejemplo si a = 2 y b= 5, el algoritmo debe hacer que a = 5 y b= 2. Solucin: Definicin de variables: a,b : variables cuyos valores se desean intercambiar. t: variable de trabajo, sirve como almacenamiento temporal para evitar que se pierda un valor mientras se realiza la asignacin. El algoritmo es sencillo, el nico cuidado que hay que tener es primero guardar el valor de una de las variables en una variable temporal tal y como se muestra en el diagrama N/S. Si hubiramos hecho a = b y luego b =a, se perdera el valor inicial de a, en la primera asignacin. Este tipo de intercambio se denomina en los crculos informticos swap y se utiliza con frecuencia en ptros algoritmos ms complejos tales como los de ordenamiento.

Diagrama N/S Leer a, b t=a a=b b=t Imprimir a, b

______________________________________________________

60

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.2.2: A una reunin asistieron n personas Cuntos apretones de manos hubieron? Solucin: Definicin de variables: n : nmero de personas a : nmero de apretones de mano Se sabe que cada persona debe saludar a las (n - 1) restantes, por lo que habr n*(n-l) saludos como en cada saludo intervienen 2 personas la cantidad de apretones de mano ser: a= n*(n-l)/2 Diagrama N/S

Leer n a=n*(n- l)/2 Imprimir a

______________________________________________________

61

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.2.3: Hallar la suma de los n primeros nmeros naurales Solucin: Definicin de variables: n : cantidad de nmeros naturales s : suma de los primeros n nmeros naturales Se pide lo siguiente: s = 1 + 2 + 3 + 4 + 5 + 6 + ...+ (n-4)+ (n-3)+ (n-2) +(n-l) + n Escribamos esta expresin descendentemente: 2 veces una ascendentemente y la otra

s = l + 2 + 3 + 4 + 5 + . . . + (n-4)+(n-3)+(n-2)+(n-l)+ n s = n + (n-1) + (n-2) + (n-3) + (n-4) + . . . + 5 + 4 + 3 + 2 + 1 sumando miembro a miembro tenemos

2s

n l

n l

n l

n 1 ...

n l n l
n trminos

... n l n l n l n l

De donde: s

n n

1 / 2
Diagrama N/S Leer n s = n*(n+l)/2 Imprimir s

______________________________________________________

62

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.2.4: Calcule la suma de los cuadrados de los primeros nmeros naturales. Solucin: Definicin de variables: n : cantidad de nmeros naturales s : suma de los cuadrados de los primeros n nmeros naturales Se pide lo siguiente: s = l2 + 22 + 32 + 42+ 52 + 62 + . . . + (n - 4)2 + (n - 3)2 + (n - 2)2 + (n - l)2 + n2 Por binomio de Newton: (2)3 = (l+l)3 = (1) 3 + 3(1)2(1) + 3(1)(1)2 + (l)3 (3)3 = (2+1)3 = (2)3 + 3(2) 2(1) + 3(2)(1)2 + (l)3 (4)3 = (3+1)3 = (3)3 + 3(3)2(1) + 3(3)(1)2 + (l)3 ... = ... = .... + ... + ... + ... ... = ... = .... + ... + ... + ... ... = ... = .... + ... + ... + ... (n-1)3 = (n-2+1)3 = (n-2)3 + 3(n-2)2(l) + 3(n-2)(l)2 + (l)3 (n)3 = (n-l+l)3 = (n-l)3 + 3(n-l)2(l) + 3(n-l)(l)2 + (l)3 (n+l)3 = (n-0+1)3 = (n)3 + 3(n ) 2 (1) + 3 ( n ) ( l ) 2 + (l)3 Sumando miembro a miembro y agrupando los trminos que pertenecen a una misma columna:

23

33

43

...

(n 1)3

( n)3 13 3 12

(n 1)3 23 33 ... (n 2)3 (n 1)3 ( n 1) 2 ( n)3

22 32 ... ( n 2) 2

( n) 2 n(1)3

3 1 2 3 ... ( n 2) ( n 1) ( n)
Simplificando y remplazando por sus equivalentes: (n+1)3 = l3 + 3s + 3[ n(n+l)/2 ] + n Reduciendo trminos y factorizando nos queda: ______________________________________________________

63

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


s n(n 1)(2n 1) 6

Diagrama N/S Leer n s = n(n+l)(2n+l)/6 Imprimir s

______________________________________________________

64

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.2.5: Calcular la suma de los cubos de los n primeros nmeros naturales. Solucin: Definicin de variables: n : cantidad de nmeros naturales s : suma de los cubos de los primeros n nmeros naturales Se pide lo siguiente: s = l3 + 23+ 33 + 43 + 53 + 63 + . .. + (n - 4)3 + (n - 3)3 + (n - 2)3 + (n - l)3 + n3 Por binomio de Newton: (2)4 = (1+1)4 = (1)4 + 4(1)3(1) + 6(1)2(1)2 + 4(1)(1)3 + (1)4 (3)4 = (2+1)4 = (2)4 + 4(2)3(1) + 6(2)2(1)2 + 4(2)(1)3 + (1)4 (4)4 = (3+1)4 = (3)4 + 4(3)3(1) + 6(3) 2 (1)2 + 4(3)(1)3 + (1)4 ... = ... = ... = ... ... ... = = = .... + .... + .... + ... ... ... + + + ... ... ... + ... + ... + ...

(n-1)4 = (n-2+1)4 = (n-2)4 + 4(n-2)3(l) + 6(n-2)2(l)2 + 4( n-2)(l)3 + (1)4 (n)4 = (n-l+l)4 = (n-l)4 + 4(n-l)3(l) + 6(n-l)2(l)2 + 4( n-l)(l)3 + (1) 4 (n+1)4 = (n-0+1)4 = (n)4 + 4( n )3(1) + 6( n )2 (1)2 + 4 ( n) (l)3 + (l)4 Sumando miembro a miembro y agrupando los trminos que pertenecen a una misma columna:

24

34

44

...

(n 1) 4

( n) 4 14 + 4 13 6 12

(n 1) 4 24 34 ... (n 2) 4 (n 1) 4 ( n) 4

23 33 ... (n 2)3 (n 1)3 (n)3 22 32 ... (n 2) 2 (n 1) 2 ( n) 2 n(1)3

4 1 2 3 ... (n 2) ( n 1) ( n) + n(1)4

______________________________________________________

65

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Simplificando y remplazando por sus equivalentes: (n+1)4 = l4 + 4s + 6[ n(n+l)(2n+l)/6 ] + 4 [n(n+l)/2] + n Reduciendo trminos y factorizando nos queda:

n n l 2

Diagrama N/S Leer n s = {n(n+l)/2}2 Imprimir s

______________________________________________________

66

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.2.6: En un cuadrado cuyo lado es a, se unen los puntos medios de sus 4 lados, formndose otro cuadrado cuyos puntos medios se unen tambin formando otro cuadrado, y as sucesivamente. Calcule la suma de las reas de todos los cuadrados as formados. Solucin: Definicin de variables: a: lado del primer cuadrado s: suma de las reas formadas

Cuad. N 1 2 3 4

Lado a

Area a
2

a/2

a/2
2

a/ 2
2

a2/2 a2/4 a2/8

De la tabla adjunta se observa que la suma pedida es: s = a2 + a2/2 + a2/4 + a2/8 + ... que viene a ser una progresin geomtrica de infinitos trminos, cuyo primer trmino e donde: es a2, y cuya razn es 1/2.

a/2 2
a/4
2

a/2 2
a/4
2

a/2
a/2 2

Factorizando 1/2 tenemos s = 1/2 ( 2a2 + a2 + a2 /2 + a2/4 + a2/8 +...) observemos que a partir del segundo trmino la suma es igual a s, entonces tenemos: s = 1 /2 ( 2a2 + s) de donde s
2a 2 .

Diagrama N/S Leer a s=2a2 Imprimir s

______________________________________________________

67

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.2.7: Calcule el rea de un rombo de diagonales conocidas Solucin: Definicin de variables: AreaRombo: rea del rombo d1: diagonal mayor d2: diagonal menor El rea pedida viene dada por: AreaRombo = rea del ABC + rea del ABCD

Conociendo que las diagonales de un rombo se bisecan mutuamente y que son perpendiculares, y que el rea de un tringulo cualquiera es: rea del = base . altura / 2 Tendremos: AreaRombo = d2 x (dl/2)/2 + d2x(dl/2)/2 De donde:
AreaRombo dl d2 / 2

Diagrama N/S Leer dl,d2 Calcular AreaRombo=dl*d2/2 Imprimir AreaRombo

______________________________________________________

68

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.2.8: Calcule el volumen de un cilindro recto conociendo su radio y su altura. Solucin: Definicin de variables: VolCilindro: volumen del cilindro r: radio de la base h: altura El volumen pedido est dado por: VolCilindro = Area de la base x Altura Esto es:
VolCilindro r 2h

Diagrama N/S Leer r, h Calcular VolCilindro= 3.14159*r*r*h Imprimir VolCilindro

______________________________________________________

69

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.2.9: Calcule el rea total de un cilindro recto de radio y altura conocidos. Solucin: Definicin de variables: AreaTota1Ci1: rea total del cilindro r: radio de la base h: altura El Area pedida est dada por: AreaTota1Cil = Area de la base + Area del techo + Area lateral El rea de la base y el rea del techo, son iguales y vienen a ser el rea de un crculo: Area de la base = Area del techo = r2 El rea lateral tiene la forma de un rectngulo cuyo largo es igual a la longitud de la circunferencia o sea 2r y, cuyo ancho es la altura del cilindro, esto es: Area lateral = 2rh Remplazando tenemos: AreaTotalCil = r2+ r2+ 2rh donde:

AreaTotalCil

2 r r

h
Diagrania N/S Leer r, h AreaTotalCil= 6.28*r*(r+h) Imprimir AreaTotalCil

______________________________________________________

70

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.2.10 Se tiene una circunferencia de radio r, inscrita en un tringulo de lados a ,b, c. Encuentre el rea de este tringulo en funcin de a, b, c y r. Solucin; Definicin de variables: a, b, c: lados del tringulo r: radio de circunferencia inscrita Sabiendo que el rea de un tringulo cualquiera es: rea del = base . altura / 2 Tenemos: rea del ABC = rea del BOA + rea del BOC + rea del AOC
rea del ABC c r 2 a r 2 b r 2

de donde:
Area del ABC a b c 2 r

Diagrama N/S Leer a, b, c, r Calcular area = (a + b + c). r/2 Imprimir area

______________________________________________________

71

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.2.11: El rea del triangulo en funcin del semiperimetro, dada por Hern es: area p( p a)( p b)( p c) , donde a, b y c son los lados del tringulo y

p (a b c) / 2 el semiperimetro. Calcular el rea del tringulo aplicando esta frmula.


Solucin: Definicin de variables: AreaTriang: rea del tringulo a, b, c: longitudes de los lados p: semipermetro

Diagrama N/S Leer a, b, c p = (a+b+c)/2 AreaTriang p( p a)( p b)( p c) Imprimir AreaTriang

______________________________________________________

72

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.2.12: En un tringulo rectngulo, calcule la longitud de la hipotenusa conociendo las longitudes de sus catetos. Solucin: Definicin de variables: a, b: catetos del tringulo rectngulo c: hipotenusa Por teorema de Pitgoras:
c a2 b2

Diagrama N/S

Leer a, b Calcular c= a a b b Imprimir c

______________________________________________________

73

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.2.13: El teorema del coseno es muy utilizado en geometra para calcular la longitud del te rcer lado de un tringulo, cuando se conocen los otros 2 lados y el ngulo que forman. Siendo a el lado desconocido, b y c los lados conocidos, el ngulo formado por b y c; el teorema del coseno se enuncia como:
a b 2 c 2 2 b c cos Calcule el tercer lado de un tringulo aplicando esteteorema.

Solucin: Definicin de variables: a: lado desconocido b, c: lados conocidos alfa: ngulo formado por b y c

Diagrama N/S Leer b, c, alfa


a b
2

c2

2 b c cos (alfa ) Imprimir a

______________________________________________________

74

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.2.14: Calcule la distancia entre 2 puntos de coordenadas conocidas Solucin: Definicin de variables: xl: abscisa del primer punto yl: ordenada del primer punto x2: abscisa del segundo punto y2: ordenada del segundo punto

Sabemos que la distancia entre 2 puntos de coordenadas (xl, yl) y (x2, y2) est dada por:

x2 xl

y2 yl

Diagrama N/S Leer xl, x2, yl, y2

x2 xl

y2 yl

Imprimir d

______________________________________________________

75

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.2.15: Convierta el complejo c =a + bi, a sus coordenadas polares.

Solucin: Definicin de variables: : ngulo formado por recta que une (a, b) con el origen (0,0). a : parte real del complejo b : parte imaginaria del complejo : distancia del punto al origen Un nmero complejo puede ser presentado en el plano cartesiano onsiderando que su Parte Real se ubica en el Eje X, mientras que su Parte Imaginaria n el Eje Y. Teniendo en cuenta esto, una forma alternativa de escribir el complejo c =a + b i, es ponerlo en funcin del ngulo ue forma el punto (a, b) con el eje real y de la distancia del mismo punto al origen. Diagrama N/S Del grfico tenemos: Leer a, b

cos sen

a/ b/

a b

cos sen

y ,

a2

b2

=arctg(b/a)

Imprimir ,

Reemplazando en la ecuacin original c = a + bi, nos queda

cos

i sen

En donde :
arctg (b / a ) y a2 b2

( y son conocidas como coordenadas polares, teniendo en cuenta que para representar un punto solo se necesita un ngulo y la distancia del punto de origen) ______________________________________________________ 76

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.2.16: Cul es el monto a devolver si nos prentan un capital c, a una taza de interes t%, durante n periodos? Solucin: Definicin de variables: c : capital tomado en prstamo t : tasa de inters en decimales n : nmero de periodos m: monto a devolver Sabemos que: m = c(l+t)n Diagrama N/S Leer c, n t m =c (l +t)n Imprimir m

______________________________________________________

77

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.2.17: En todo tringulo se cumple que cada lado es proporcional al seno del ngulo opuesto. Esta ley se llama ley de los senos", matemticamente:

a sen

b sen

c sen

Si se conocen los ngulos , , y el lado c, cunto valen los otros dos lados? Solucin: Definicin de variables: a, b, c : lados del tringulo , y : ngulos opuestos a a, b y c respectivamente Despejando de la frmula: a = c(sen / sen )

b = c(sen / sen )
Diagrama N/S Leer c, alfa, beta, gamma a = c*sen (alfa) / sen (gamma) b = c*sen (beta) / sen(gamma) Imprimir a, b

______________________________________________________

78

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.2.18 Existen muchas maneras de medir ngulos. El Sistema Sexagesimal divide circunferencia en 360 partes llamndola a cada una "grado sexagesimal cada grado sexagesimal est dividido en 60 minutos y cada minuto en 60 segundos, (por ejemplo 201521"). El Sistema Centesimal considera como unidad de medida "el grado centesimal" y equivale a la 400 ava. parte de la circunferencia, cada grupo centesimal est dividido en 100 minutos centesimales y cada minuto en 100 segundos centesimales, (por ejemplo 20g15m21s). El Sistema Radial utiliza como unidad de medida un arco cuya longitud es igual a su radio, como la longitud de la circunferencia es l = 2r; en trigonometra se considera un crculo base con radio r = 1, entonces toda la circunferencia tendr 2 radianes. Deduzca la relacin entre los diferentes sistemas de medidasde ngulos, use la proporcin entre la cantidad de grados requeridos y el total degrados de toda la circunferencia. Teniendo en cuenta esta relacin, escriba un programa que lea ngulo en grados sexagecimalesy diga cul es su medidas en los sistemas centesimal y radial. Solucin: Definicin de variables S : ngulo en grados sexagesimales C : ngulo en grados centesimales R : ngulo en radianes S, C y R representa al mismo ngulo pero en diferentes sistemas. Es obvio que la cantidad de grados en cada sistema es proporcional al total de grados de la circunferencia en dicho sistema ("El arco chico es al arco grande en un sistema, como el arco chico es al arco grande en otro sistema").

______________________________________________________

79

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________

Por lo que:
S 360 C 400 R 2

Diagrama N/S Leer S C = (10/9)*S R = (/180)*S Imprimir C, R

______________________________________________________

80

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.2.19: Convierta el ngulo sexagesimal UVW a grados, minutos y segundos. Solucin: Definicin de variables: U: grados sexagesimales del ngulo V: minutos sexagesimales del ngulo W: segundos sexagesimales del ngulo S: valor en grados sexagesimales C: valor en grados centesimales gra : grados centesimales del ngulo min: minutos centesimales del ngulo seg : segundos centesimales del ngulo Convirtiendo a grados sexagesimales: S = U + V/60 + W/3600 Leer U,V,W S = U +V/60 + W/3600 C = 10*S/9 gra = entero (C) min = entero((C-gra)*100) seg = ((C-gra)*l00)-min)*100 Imprimir gra, min, seg Diagrama N/S

Convirtiendo S grados sexagesimales, a C grados centesimales: C = 10*S/9 Convirtiendo C grados centesimales a grados, minutos y segundos centesimales gra = entero(C) min =entero((C-gra)* 100) seg =( (C-gra)*100-min)*100

______________________________________________________

81

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.2.20: Para medir la temperatura existen 4 escalas, las cuales guardan la siguiente proporcin:

Si C, F, K y R, son los valores de una misma temperatura en grados Celsius (Centgrados), Farenheit, Kelvin y Rankine respectivamente, deduzca las frmulas para convertir una temperatura de una escala a otra. Luego lea una temperatura en grrados Celsius y diga a cuntos grados equivale en Farenheit, Kelvin y Rankine. Solucin: Definicin de variables: a, b: longitudes cualesquiera de la escala C : valor de la temperatura en grados Celsius F : valor de la temperatura en grados Farenheit K : valor de la temperatura en grados Kelvin R : valor de la temperatura en grados Rankine Del grfico y utilizando segmentos proporcionales:

a b

C 0 100 0

F 32 212 32

K 273 373 273

R 492 672 492


82

______________________________________________________

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


De donde:
C 5 F 32 9 K 273 5 R 492 9

Finalmente: F = (9/5) C + 32 K = C +273 R = (9/5) C + 492

Diagrama N/S Leer C F = (9/5)*C + 32 K = C + 273 R = (9/5)*C + 492 Imprimir F, K, R

______________________________________________________

83

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.2.21; Haga un diagrama N/S que permita leer 3 temperaturas una en F, otra en K y la otra en R y las convierta a sus equivalentes en grados Celsius. Solucin: Definicin de variables: F : temperatura ingresada en grados Farenheit K : temperatura ingresada en grados Kelvin R : temperatura ingresada en grados Rankine CF : temperatura F en grados Celsius CK: temperatura K en grados Celsius CR : temperatura R en grados Celsius De la relacin encontrada en el problema interior, tenemos: CF= (5/9)(F-32) CK = K 273 CR= (5/9)(R-492) Diagrama N/S

Leer F, K, R CF = (5/9)*(F-32) CK = K - 273 CR = (5/9)*(R-492) Imprimir CF, CK, CR

______________________________________________________

84

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejercicios Propuestos: Lea atentamente cada enunciado y plantee su solucin. Luego construya un diagrama N/S. 1) Calcule la longitud de una circunferencia de radio conocido. 2) Calcule el rea de un trapecio cuyas base menor, base mayor y altura son conocidas. 3) Sabiendo que una milla equivale a 1609 Kilmetros, lea una cantidad en millas y convirtala a kilmetros. 4) Calcule el permetro de un rectngulo. 5) Calcule el permetro de un tringulo rectngulo si se conocen sus catetos. 6) Cul es el volumen de un paraleleppedo de largo, ancho y altura conocidos? 7) Cul es el rea total de un palaleleppedo? 8) Calcule el rea de un tringulo cuando se conocen 2 lados y el ngulo que forman. 9) En todo tringulo se cumple que cada lado es proporcional al seno de ngulo opuesto. Esta ley se llama "ley de los senos", matemticamente:

a sen

b sen

c sen

Si se conocen los lados a, b, c, y cunto valen los otros dos ngulos? 10) En un campeonato de ftbol participan n equipos. Cuntos partidos habrn en la primera rueda del campeonato?. 11) Calcule la suma de los n primeros nmeros pares. 12) Calcule la siguiente suma: s = 1*2 + 2*3 + 3*4 +... + n*(n+l). 13) Calcule la siguiente suma: s = 1+3 +5 + 7 + ... + (2n -1). 14) Lea una temperatura en grados Kelvin y convirtela a grados Celsius, Farenheit y Rankine. 15) Lea 3 temperaturas una en grados Celsius, otra en Kelvin y otra Rankine y convirtalas a Farenheit. 16) Lea una hora y diga a cuntas horas, minutos y segundos equivale. 17) Lea el ngulo en radianes y convirtalo a grados, minutos y segundos sexagesimales. 18) Convierta el ngulo centesimal XgYmZs a grados sexagesimales. No ______________________________________________________ 85

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


considere minutos, ni segundos sexagesimales. 19) Lea dos nmeros. El primero representar el da y mes de su nacimiento (por ejemplo 1 de julio ser 107), el segundo nmero vendr dado por su edad, luego realice los siguientes clculos: Multiplique el primer nmero por 2, Adicinele 5, multiplqueo por 50, smele el segundo nmero, smele 365 y rstele 615. El resultado vendr a ser la unin del primer nmero con el segundo. Este juego es conocido en los crculos matemticos como "juego de sociedad". 20) En un cuadrado cuyo lado es a, se unen los puntos medios de sus 4 lados, formndose otro cuadrado cuyos puntos medios se unen tambin formando otro cuadrado, y as sucesivamente. Calcule la suma de los permetros de todos los cuadrados as formados. 21) Un inversionista est pensando invertir C dlares a una tasa de inters T. Cuntos periodos (N) necesita para tener al final M dlares. 22) A cunto dinero de hoy (C) equivalen M dlares del futuro, sabiendo que la tasa de inters es T y el nmero de periodos N. 23) Cuntas billetes de 5, 10, 20, 50 y 100 soles y monedas de 0.01, 0.05, 0.1, 0.5 y 1 sol recibir un empleado como pago por su trabajo?. Suponga que se le debe entregar la mxima cantidad posible de billetes y monedas de cada denominacin. 24) Calcule la media aritmtica de los n primeros nmeros enteros positivos.

______________________________________________________

86

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


3.3. ESTRUCTURA CONDICIONAL SIMPLE La estructura condicional simple se caracteriza por mostrar problemas en base a preguntas, con respuestas para un caso verdadero y falso y en algunas veces solo para casos verdaderos, dependera mucho del algoritmo que se propone. Ejemplos: Ejemplo 3.3.1: Elabore un algoritmo que resuelva una ecuacin de primer grado. Solucin: Definicin de variables: a: coeficiente de x. Debe ser diferente de 0. b: trmino independiente

La solucin es bastante simple, una ecuacin de primer grado es de la forma: ax + b = 0, de donde despejando x tendremos: x = -b/a, debiendo considerar que para que exista solucin a 0. Diagrama N/S

Leer a, b a==0 V Imprimir "No F es de primer grado"

x = -b/a Imprimir X

______________________________________________________

87

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.3.2: Una llamada telefnica en cualquier telfono pblico cuesta S/. 0.50 por los primeros 3 minutos o menos. Cada minuto adicional es un paso de contador y cuesta S/.0.l.Calcule el monto de una llamada cualquiera. Solucin: Definicin de variables: duracin: duracin de la llamada costo: costo total de la llamada Si la duracin de la llamada es menor a 3 minutos entonces la llamada cuesta 0.5, mientras que si excede los 3 minutos costar 0,5 por los primeros 3 minutos y 0.1 por los (duracion-3) minutos adicionales.

Diagrama N/S

Leer duracin duracin <= 3 V costo = 0.5 F costo = 0.5 + 0.1 (duracion-3) Imprimir costo

______________________________________________________

88

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.3.3: Una llamada de un telfono fijo a otro, tambin fijo, en HORARIO NORMAL (todos los das de 7:00 a 22:59 horas), cuesta sin IGV S/. 0.078, mientras que en el HORARIO REDUCIDO (todos los das de 23:00 a 6:59hrs), cuesta sin IGV S/. 0.039 hrs. Calcule el costo total de una llamada telfonica si considera 1 minuto adicional al cargo por establecimiento de llamara y solo se considera la hora de inicio para determinar a que tarifa se sujeta. Solucin: Definicin de variables: hora: hora de inicio de la llamada min: minuto de inicio de la llamada inicio: minuto de inicio en el da dura: duracin de la llamada El horario normal comienza en el minuto 7x60 = 420 del da y termina en el minuto 22x60+59 = 1379 del da. Toda hora de inicio vlida que no este en este rango se realiza en horario reducido. Por lo tanto, basta con preguntar si la hora de inicio en minutos esta dentro de ese rango y calcular el costo total de la llamada. Adems hay que tener en cuenta que el impuesto general a las ventas es de 18%. Diagrama N/S Leer hora, min, dura inicio = hora*60 + min inicio>419 AND inicio <1380 V F Costo=(dura + 1)*0.078 Costo=(dura + 1)*0.039 Imprimir 1.18*costo

______________________________________________________

89

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.3.4: Un nmero puede ser menor, igual o mayor que otro. Describa describa un algoritmo que lea 2 nmeros y determine cmo es uno respecto a otro. Solucin: Definicin de variables: a, b: nmeros ingresados Podemos hacer las comparaciones tal como se muestra en el diagrama N/S. Diagrama N/S Leer a, b a==b V Imprimir a, "es igual a", b a>b V F Imprimir a, "es mayor que", b Imprimir b, "es mayor que", a F

______________________________________________________

90

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.3.5: Ordene de mayor a menor, 3 nmeros ingresados por teclado. Solucin: Definicin de variables: a, b, c : nmeros que deseamos ordenar. Como se trata de 3 nmeros, sabemos que existen 3! = 3x2x1 = 6 posibilidades de ordenarlos. Teniendo en cuenta esto las posibles ocurrencias sern:
a a b b c b c a c b c b c a a

Diagrama N/S Leer a, b, c a b AND b c V Imprimir a, b, c V a c AND c b F b a AND a c V Imprimir a, c, b Imprimir b, a, c V bc AND ca F F F

c a AND b V F Imprimir b, c, a Imprimi r Imprimir c, b, a c, a, b

______________________________________________________

91

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.3.6: Encuentre el mayor valorde 3 nmeros dados Solucin: Definicin de variables: a, b, c: nmeros que deseamos evaluar Podemos ir comparndolos de 2 en 2 tal como se observa en el diagrama N/S. Diagrama N/S Leer a, b, c ab V ac V m=a bc F m=a F V m=a m=a Imprimir m F

______________________________________________________

92

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.3.7 Elabore un algoritmo que obtenga las raices reales de una ecuacin de segundo grado. Solucin: Definicin de variables: Diagrama N/S a: coeficiente de x2. Deber ser diferente de 0. b: coeficiente de x. c: trmino independiente. d: discriminante b2 - 4ac. Debe ser diferente de 0 xl: primera raz real. x2: segunda raz real. La forma general de una ecuacin de segundo grado es: ax2+bx+c=0 Leer a, b, c a0 V d = b2 - 4ac d >=0 F F Imprimir "Coefic. de x2 debe ser diferente de cero"

V xl=(-b + x2= (-b -

d )/(2a) d )/(2a)
Imprimir "races imaginarias

Imprimir xl,x2

Completando cuadrados: ax2 + bx =-c multiplicando por 4a 4a2x2 + 4abx = - 4ac sumando b2 a ambos lados 4a2x2+ 4abx+b2=-4ac + b2 factorizando: (2ax + b)2 = b2 - 4ac 2ax + b = de donde:
x b b 2 4ac 2a

b2

4ac

Para que exista solucin, a obtener la raz cuadrada).

b (para poder dividir) y b2 - 4ac 0, (para

______________________________________________________

93

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.3.8: Un ao bisiesto es aquel que tiene 366 das. Mediante un decreto del Papa Gregorio XIII, dado en 1582, se reforma el Calendario Juliano que nos rega, para que pasen a considerarse bisiestos aquellos aos mltiplos de 4, pero no los mltiplos de 100, excepto los mltiplos de 400. Escriba un algoritmo que diga si un ao es o no bisiesto. Solucin: Definicin de variables: annio: Ao del que deseamos determinar si es bisiesto. Debemos saber que el operador MOD obtiene el resto de la divisin entera. Si dicho resto es igual a cero entonces el primer operando es divisible por el segundo. Segn el enunciado annio, ser bisiesto si: Es mltiplo de 4, lo que se escribe (annio MOD 4 = =0), pero no mltiplo de 100, excepto los mltiplos de 400 que si son bisiestos (annio MOD 100 0) OR (annio MOD 400 == 0) Combinando ambas condiciones, tendremos la condicin de bisiesto: (annio MOD 4 == 0) AND ((annio MOD 100 0) OR (annio MOD 400== 0))

Diagrama N/S Leer annio (annio MOD 4 == 0) AND ((annio MOD 100 0) OR (annio MOD 400 == 0) V F

Imprimir "Ao no bisiesto"

Imprimir "Ao Bisiesto"

______________________________________________________

94

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.3.9: Los 3 nmeros q, r y s, y determine si q es el multiplo de r y s. Solucin: Definicin de variables: q: nmero cualquiera r, s: posibles divisores q ser mltiplo de r y de s cuando r y s dividan exactamente a q, esto es cuando el resto de la divisin entera sea cero para ambos casos. Diagrama N/S Leer q, r, s (q MOD r==0)AND (q MOD s == 0) V Imprimir q, " es mltiplo de ", r, " y de ", s F Imprimir q, " no es mltiplo de ", r, " y de ", s

______________________________________________________

95

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.3.10: Conociendo x, encuentre el valor numrico de la siguiente expresin: y ( x 3)( x2 25) Solucin: Definicin de variables: x: variable independiente y: variable dependiente

Diagrama N/S Leer x x == 5 OR x = -5 V y = (x-3)/(x2-25) Imprimir y F

Imprimir "lo siento, la funcin es discontinua en ese punto"

La funcin no puede calcularse para x = 5 x = -5, pues el divisor (x2 -25), se hace igual a cero, por lo tanto si x es igual a 5 -5 deber mostrarse el mensaje adecuado.

______________________________________________________

96

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.3.11 Muestre un algoritmo que nos permita evaluar la funcin.

log( x 8), si g ( x) 2 x ln x, si 0 x sin x, si


Solucin: Definicin de variables: x: variable independiente y: variable dependiente

x x x

El diagrama N/S muestra la implementacin del algoritmo. Diagrama N/S Leer x x <= 0 V x <= 8 y = x + sen x V y = 2x - ln x Imprimir y y = log(x-8) F F

______________________________________________________

97

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.3.12: Dados 3 longitudes, diga si pueden formar un tringulo. Solucin: Definicin de variables: a, b, c: lados del tringulo. Debemos tener en cuenta el siguiente teorema: "En todo tringulo, cada lado es menor que la suma de los otros dos, pero mayor que su diferencia". Suponga que desea atravesar un cerro. Si pasa por el tnel que tiene una longitud a, recorrer menor distancia que si sube la pendiente b y baja por la c. Matemticamente: a< b + c. Esto debe cumplirse tanto cuando a sea la longitud del tnel, como cuando b c lo sean. De donde deducimos que para que exista el cerro (tringulo) debe cumplirse que: a< b + c b< a + c c< a + b

Observe adems como de estas expresiones podemos obtener: c >a-b, a>b-c, b>c-a; como han sido deducidas de las primeras, basta verificar el primer grupo de expresiones para considerar que las tres longitudes forman un tringulo. Diagrama N/S Leer a, b, c (a < b + c) AND (b < a + c) AND (c < a+ b) V Imprimir Forman tringulo Imprimir No forman tringulo F

______________________________________________________

98

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.3.13: Dados 3 longitudes, compruebe si pueden formara un tringulo y luego clasifiqueel tringulo segn sus lados. Solucin: Definicin de variables: a b, c: lados del tringulo. La primera parte del problema se resolvi en el ejercicio anterior. En cuanto a la clasificacin de tringulos segn lados lo siguiente: recordemos

Tringulo Equiltero: Es aquel tringulo cuyos tres lados son iguales. Tringulo Issceles : Es aquel tringulo que tiene dos lados iguales. Tringulo Escaleno : Es aquel tringulo que tiene sus tres lados diferentes.

Diagrama N/S Leer a, b, c (a < b + c) AND (b < a + c) AND (c < a+ b) V (a == b) AND (b == c) V Imprimir Tringulo equiltero (a == b) AND (b == c) OR (a == c) V Imprimir Tringulo issceles Imprimir Tringulo escaleno F F Imprimir No forman tringulo F

______________________________________________________

99

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.3.14: El rendimiento de un alumno se califica segn lo siguiente: Bueno si su promedio esta entre 16 y 20 Regular si su promedio est entre 11 y 15 Deficiente si su promedio est entre 6 y 10 Psimo si su promedio est entre O y 5 Escriba un algoritmo que lea el promedio de un alumno y diga cul es su rendimiento. Solucin: Definicin de variables: Prom: Es la nota Promedio del alumno. Diagrama N/S Leer prom (prom <0) OR (prom >20 V prom <=5 F Imprimir prom <=10 F Imprimir "redimiento V psimo" prom <=15 "datos F errneos" Imprimir V "rendimiento Imprimir Imprimir deficiente" "rendimiento "rendimiento regular" bueno' V F

______________________________________________________

100

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.3.15: Lea un nmero y obtenga el signo, su parte entera y su parte fraccionaria. Solucin: Definicin de variables: x: Es el nmero a evaluar Para obtener el signo, basta con preguntar si es mayor que cero, en cuyo caso ser positivo, encaso contrario ser negativo. Todos los lenguajes de programacin incluyen funciones que obtienen la parte entera de un nmero. En C++, esta funcin es floor().

Diagrama N/S Leer x x >= 0 V F Imprimir Imprimir signo positivo" "signo negativo Imprimir "Parte entera", entero (x) "Parte fraccionaria", x - entero(x)

______________________________________________________

101

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.3.16: Si compramos por mayor100 o ms articulos nos descuentan el 40%, si compramos entre 25 y 100 nos descuentan un 20%, y si compramos entre10 y 25 un 10%. No hay descuento si adquirimos menos de 10 artculos. Diga cuanto debemos pagar por nuestra compra. Solucin: Definicin de variables: x: cantidad de artculos. p: precio unitario del artculo. d: descuento obtenido. y: monto a pagar. Las condiciones estn descritas en la siguiente funcin de descuento: 0.40 si x >= 100 d(x) 0.20 si 25 <= x < 100 0.10 si 10<=x<25 0.00 si x<10 El monto a pagar ser y = p*x*(l-d) Diagrama N/S

Leer x, p x >= 100 V d = 0.40 V x >= 10 V d = 0.20 d = 0.10 y = p * x * (1 - d) Imprimir y x >= 0 V d = 0.0 F Imprimir cantidad erronea F F x >= 25 F

______________________________________________________

102

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.3.17: Si el sueldo de un empleado es de 1000 o menos se le descuenta el 10%. Si esta entre 1000 y 2000 el 5% sobre el adicional, y si est arriba de 2000, el 3% sobre el adicional. Ecriba un algoritmo que lea el sueldo y muestre el salario neto y el impuesto. Solucin: Definicin de variables: sb: sueldo bruto del trabajador. d: descuento al sueldo. sn: sueldo neto del trabajador. En este caso si el trabajador gana ms de 1000 y hasta 2000, el descuento por los primeros 1000 se mantendr en 10% lo que equivale a 0.1*1000=100, mientras que el descuento por lo que gana arriba de 1000 ser 0.05(sb-1000). Lo mismo ocurre cuando el trabajador gana ms de 2000, puesto que se le descuento 0.1*1000 = 100 por los primeros 1000, y 0.05*(2000-1000)=50, por los siguientes 1000, el descuento ser 100+50 +0.03(sb-2000). Estos casos de descuentos adicionales por lo general se aplican en el caso de pago de impuestos, con la intensin de que el pago sea ms equitativo. Entonces tenemos: Si sb<=1000, d = 0.1sb Si 1000<sb<=2000, d=l 00+0.05(sb-1000) Si sb> 2000, d=150+0.03(sb-2000) El salario neto ser sn = sb -d Diagrama N/S Leer sb sb<0 V sb<=1000 Imprimir "sueldo bruto incorrecto V d=0.1*sb sb<=2000 V F d=l00+0.05(sb-1000) d=150+0.03(sb-2000) sn = sb -d Imprimir sb, sn, d 103 F F

______________________________________________________

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.3.18: Dada la hora y el da en horas, minutos y segundos encuentre la hora del siguiente segundo. Solucin: Definicin de variables: h: horas m: minutos s: segundos Si h, m y s, representan una hora vlida, entonces el siguiente segundo ser s+1, el cual si llega a ser 60 har que m aumente en 1, si m llega a ser 60 har que h aumente en 1, si h llega a ser 24, entonces debemos hacer h = 0 pues habr terminado el da. Esto se muestra en el diagrama N/S. Diagrama N/S

Leer h, m, s s = s +1 s==60 V s =0 m=m+1 m==60 V m=0 h = h+l h==24 V h=0 Imprimir h, m, s F F F

______________________________________________________

104

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejercicos Propuestos: Lea atentamente cada enunciado y plantee su solucin. Luego construya un diagrama N/S. 1) Diga si un nmero es par o impar. 2) Obtenga el valor absoluto de un nmero. 3) Si dos nmeros son positivos calcule su producto, en caso contrario calcule su suma. 4) Sin usar estructuras repetitivas, lea 5 nmeros y determine el menor. 5) Lea 5 nmeros y diga si estn ordenados ascendentemente. 6) Ordene 3 nmeros a, b y c, de tal manera que al final a, sea siempre el mayor, b, sea el intermedio y c el menor. 7) Elabore un algoritmo que obtenga las races de una ecuacin de segundo grado, contemplando el caso de races imaginarias. 8) Dados 3 longitudes, compruebe si pueden formar un tringulo y luego clasifique el tringulo segn sus ngulos. 9) Muestre un algoritmo que lea 3 nmeros a, b y c, y determine si pueden formar un tringulo comprobando que p>a, p>b y p>c, donde p es el semipermetro y equivale a p= (a+b+c)/2. Luego calcule el rea del tringulo usando la frmula de Hern

p p a p b p c .

10) Muestre un algoritmo que nos permita evaluar la funcin

x2 f(x) x x
2

, si x

3x 2 , si 0 x 3 1 , si x 3

11) Lea 2 enteros a, b, y obtenga el valor numrico de la funcin:

2a f x a a
2

b 2b b

, si a 2 b 2 , si a , si a
2

0 0 0

b b

______________________________________________________

105

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


12) Diga si un nmero n es mltiplo de m. 13) Lea 3 nmeros e indique cual es el valor intermedio. 14) Dada la hora en horas, minutos y segundos encuentre la hora del segundo anterior. 15) En una Universidad tienen como poltica considerar 3 notas en cada curso la nota de trabajos T, la nota de medio ciclo M y la de fin de ciclo F, cada una tiene un peso de 50%, 20% y 30% respectivamente. Un alumno es calificado segn lo siguiente: Bueno si su promedio esta entre 16 y 20 Regular si su promedio est entre 11 y 15 Malo si su promedio est entre 6 y 10 Psimo si su promedio est entre O y 5 Escriba un algoritmo que lea las 3 notas de un alumno y en un curso y diga cmo ha sido catalogado el alumno. 16) Los trabajadores de una fbrica tienen 3 turnos: maana, tarde y noche. La tarifa de los turnos de maana y tarde son iguales, mientras que de noche son 30% mayores. Construya un diagrama que lea el nmero de horas laboradas por un trabajador y la tarifa calcule el salario semana Considere que durante la semana el trabajador se encuentra siempre en el mismo turno. 17) Un trabajador es contratado bajo las siguientes condiciones. Por las horas normales se le paga una tarifa fija. Se consideran horas normales a todas las horas trabajadas hasta un total de 140 al mes. Las horas adicionales a 140 se consideran como extras y una hora extra se paga el equivalente 1.5 horas normales. Los impuestos estn en funcin del monto obtendo por el trabajador. Si el sueldo es menor o igual a S/. 20,000 no paga impuestos, por los siguientes S/. 20,000 paga el 10%, mientras que para montos mayores a S/. 40,000 paga el 15% sobre el adicional. Cul es el sueldo neto del trabajador y cul es el monto en impuestos que debe pagar? 18) Una llamada de un telfono fijo a otro, tambin fijo, en HORARIO NORMAL (todos los das de 7:00 a 22.59 hrs), cuesta sin IGV S/. 0.078 mientras que en HORARIO REDUCIDO (todos los das de 23:00 a 6:59 hrs), cuesta S/. 0.039. Calcule el costo total de una llamada telefnica,si considera 1 minuto adicional de cargo por establecimiento de llamada. Si la llamada se realiza justo en la transicin de un horario a otro, ______________________________________________________ 106

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


calcule el monto segn cuantos minutos se realizaron en cada horario. 19) Dado un nmero de da de un determinado ao, encuentre el da, mes y ao al que corresponde. Por ejemplo el da nmero 300 del ao 2000 es el 26/10/2000.

______________________________________________________

107

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


3.4. ESTRUCTURA DE SELECCIN MULTIPLE La estructura de seleccin multiple se caracteriza por agrupar varios problemas en casos diferentes. Una estructura de seleccin tambien es utilizada para problemas con respuestas multiples. Ejemplos:

Ejemplo 3.4.1: Construya una calculadora que lea 2 nmeros y un operador, y efectue la operacin indicada. La calculadora ser capaz de realizar las siguientes operaciones: + (surna), - (resta), * (multiplicacin), / (divisin) y # (potencia) Solucin: Definicin de variables: n1: primer operando n2: segundo operando op: operador r: resultado Diagrama N/S Leer n1, op, n2 op

'+'

`-`

* r=nl*n2 Imprimir r

/ r= nl/n2

'#' r=(nl)n2

otro caso "Operador no definido"

r=nl+n2 r= nl-n2

______________________________________________________

108

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.4.2: Los signos del zodiaco son 12: aries (marzo 21 - abril 20), tauro (abril 21 mayo 20 ), gminis (mayo 21 -junio 21), cncer (junio 22 -julio 22), leo (julio 23 - agosto 22), virgo (agosto 23 - setiembre 22), libra (setiembre 23), escorpio (octubre 23 - noviembre 21), sagitario (noviembre 22 diciembre 21), capricornio (diciembre 22 - enero 20), acuario (ener 21 febrero 19) y piscis (febrero 20 - marzo 20). Escriba un programa que lea el da y mes de su nacimiento y determine a que signo pertenece. Solucin: Definicin de variables: da: da de nacimiento mes: mes de nacimiento

Diagrama N/S Leer da, mes mes 8 5 6 7


otro

___ 10 11
dia<22 V F

caso

12
dia<22 V F
E r r o r

da<21 da 20 dia<21 dia<21 dia<21 dia<22 dia<23 V F V F V F V F V F V F V F

dia<23 dia<23 dia<21 V F V F V F

______________________________________________________

109

"Capricornio"

"Escoprpio"

"Sagitario"

"Gminis"

"Escopio"

"Gemins"

"acuario"

"Cncer" "Cncer"

"Virgo"

"Virgo"

"piscis"

"Libra"

"Libra"

"tauro"

"aries"

"aries"

"Leo"

"Leo"

"Sagitario"

capricornio

"acuario"

"piscis"

"tauro"

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3. 4.3 Lea un da y un mes cualquiera y determine a que estacin pertenece. Considere que primavera inicia el 23 de setiembre, verano inicia el 21 de diciembre, otoo empieza el 21 de marzo e invieno el 22 de junio. Solucin: Definicin de variables: da: da; mes: mes Diagrama N/S
Leer da, mes mes 1 2 3 4 5 6 7 8 9 10 11 da<21 da<22 da<23 VF V F V F Verano" Otoo Invierno Primavera 12 da<21 V F Verano Otro caso mes incorrecto

______________________________________________________

110

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.4.4: Lea un mes y un ao y determine cuntos das tiene ese mes. Solucion: Definicin de variables: m: mes a: ao das: nmero de das que tiene el mes. Podemos construir nuestro diagrama N/S sabiendo que enero, marzo, mayo, julio, agosto, octubre y diciembre tienen 31 das, y que abril, junio, setiembre y noviembre 30 das, adems febrero tendr 28 29 das, segn sea un ao normal o un ao bisiesto respectivamente. La expresin que evala si un ao es bisiesto es: (a%4 = = 0)&&((a%100!=0) (a%400= =0)) La cual puede ser escrita de manera ms como: ! (a%4)&& (a%100)|| !(a%400)
Diagrama N/S

Leer m, a m 1 3 5 7 8 10 12 4 6 9 11 2 (a MOD 4 = = 0) AND ((a MOD 100 0= OR (a MOD 400 = = 0)) V das = 29 Imprimir das das = 28 F

das = 31

das = 30

______________________________________________________

111

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3. 4.5: Lea tres nmeros que representen el da, el mes y el ao, y diga si forman una fecha correcta. Considere aos bisiestos

Solucin: Definicin de variables: da: da de la fecha a verificar. mes: mes de la fecha a verificar. a: ao de la fecha a verificar, maxda: mximo da permitido para ese mes

Diagrama N/S
Leer da, mes, a mes 1 3 5 7 8 10 12 4 6 9 11 2 (a MOD 4 = = 0) AND ((a MOD 100 0= OR (a MOD 400 = = 0)) V maxda = 29 maxda = 28 (da>0) AND (da<=maxda) AND (mes>0) AND (mes<13) AND (a>0)) V F F

maxda = 31

maxda = 30

Imprimir "la fecha es correcta"

Imprimir "la fecha es incorrecta"

______________________________________________________

112

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.4.6: Dada una fecha vlida determine la fecha del da siguiente. Solucin: Definicin de variables: dia: da de la fecha ingresada. mes: mes de la fecha ingresada. a: ao de la fecha ingresada. maxdia: mximo da permitido para ese mes Diagrama N/S
Leer da, mes, a mes 1 3 5 7 8 10 12 4 6 9 11 2 (a MOD 4 = = 0) AND ((a MOD 100 0= OR (a MOD 400 = = 0)) maxda = 31 maxda = 30 V maxda = 29 da = da + 1 dia > maxdia V da = 1 mes = mes + 1 mes = = 13 V F mes = 1 a=a+1 Imprimir "Fecha da siguiente:", da, mes, a maxda = 28 F

______________________________________________________

113

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.4.7: Lea un nmero menor a 4000 y convirtalo a nmeros romanos. Solucin: Definicin de variables: n: nmero arbigo que deseamos mostrar en romanos. El diagrama N/S muestra el algoritmo pedido. Debe tener en cuenta que el operador MOD devuelve el resto de la divisin entera, mientras que el operador DIV devuelve el cociente entero de la divisin entera. Diagrama N/S
Leer n unidades = n MOD 10 decenas = n MOD 10 centenas = n MOD 10 millares = n MOD 10 1 mi11ares 2 Imprimir "M" Imprimir "MM" Centenas 2 3 4 6 7 8 9 1 5 Imprimir Imprimir Imprimir Imprimir Imprimir Imprimir Imprimir Imprimir Imprimir "C" "CC" "CCC" "CD" "D" "DC" "DCC" "DCCC" "CM" Decenas 3 Imprimir "MMM" n = n DIV 10 n = n DIV 10 n = n DIV 10

1 5 2 3 4 6 7 8 9 Imprimir Imprimir Imprimir Imprimir Imprimir Imprimir Imprimi Imprimi Imprimir r "X" "XX" "XXX" "XL" "L" "LX" r "LXX" "XC "LXXX" Unidades

1 5 2 3 4 6 7 8 9 Imprimir Imprimir Imprimir Imprimir Imprimir Imprimir Imprimir Imprimir Imprimir "I" "II" "III" "IV" "V" "VI" "VII" "VIII" "IX

______________________________________________________

114

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.4.8: Una Universidad Privada tiene una poltica de descuento en porcentajes sobre el pago de pensiones de enseanza, que se basa en la profesin del tutor (polica, profesor de colegio, docente universitario, trabajador no docente y otros) y, el rendimiento del alumno (bueno, regular, deficiente), tal como se muestra en el cuadro siguiente: Tabla de descuento (en.%) Ocupacion \ Rendimiento P: polica C: profesor de colegio D: docente universitario N; no docente 0: otros A: bueno B: regular C: deficiente 60 30 10 50 20 10 40 20 0 40: 10 0 30 0 0

Lea la ocupacin de un tutor y el rendimiento del alumno e indique cual es su Solucin: Definicin de variables: ocup: ocupacin del tutor rend: clasificacin segn rendimiento Diagrama N/S
Leer, ocup, rend ocup P rend A
d=0.6

C rend C
d=0.l

D rend C
d=0.l

N rend C
d=0.0

O rend C
d=0.0

B
d=0.3

A
d=0.5

B
d=0.2

A
d=0.4

B
d=0.2

A
d=0.4

B
d=0.1

A
d=0.3

B
d=0.0

C
d=0.0

Imprimir d

______________________________________________________

115

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejercicios Propuestos Lea atentamente cada enunciadoy plantee una solucin. Luego construya un diagrama N/S y codifiquelo en Java. 1) Si las vocales se representan con nmeros del 1 al 5, lea un nmero y diga que vocal es. 2) Lea un nmero que represente el da de la semana y diga que da es, teniendo en cuenta que la semana comienza en domingo. 3) Un alumno es calificado con a, b, c d. Ser bueno si obtuvo un a, regular si obtuvo un b, malo si obtuvo un c, y psimo si obtuvo un d. Lea un calificativo y escriba que tipo de alumno es. 4) Lea un nmero que represente el mes y diga que mes es. 5) Dada una fecha diga la fecha del da de ayer. 6) Escriba un programa que lea un nmero de canal de televisin y diga cual es el nombre del canal. 7) Muestre las opciones de un men, seleccione una opcin e imprima elmensaje apropiado indicando la opcin seleccionada. 8) En una empresa comercial, existen 3 categoras de artculos (A, B y C) y 4 categoras de clientes (excelentes, buenos, regulares y malos) y tienen implementada la siguiente poltica de descuentos (en %): Tipo cliente\(ipo artculo E: Excelente B: Bueno R: Regular M: Malo A 40 30 20 0 B 30 20 10 0 C 20 10 0 0

9) 10) 11) 12)

Adems se sabe que los clientes de tipo E y B pueden pagar en efectivo con cheque o al crdito, los de tipo R solo pueden hacerlo en efectivo o con cheque, mientras que los de tipo M slo pueden hacer compras en efectivo. Lea el tipo de cliente, el tipo de artculo que desea adquirr e indique el descuento y las alternativas de pago que le son permitidas. Dada una fecha cuntos das faltan para que termine el ao? Obtenga el nmero de das transcurridos entre dos fechas. Todo el mundo sabe cuntos aos tiene, pero podra contestar a la pregunta cuntos das tiene? Dada una fecha diga que da de la semana fue, sabiendo que el primero de enero de 1900 fue lunes. 116

______________________________________________________

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


13) Dada una fecha obtenga el nmero de da dentro de ese ao. Por ejemploel 26/10/2000 es el da 300 del ao 2000.

______________________________________________________

117

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


3.5. ESTRUCTURA REPETITIVA MIENTRAS La estructura repetitiva mientras se caracteriza por realizar n iteraciones mientras la pregunta condicional inicial se cumpla, en el caso que no se cumple la condicion esta no realizra ninguna iteracin. Ejemplos: Ejemplo 3.5.1: Obtenga el cociente y el residuo de una divisin calculando la cantidad de veces que un nmero est contenido en otro, mediante restas sucesiva: Por ejemplo, si el dividendo es a = 5236 y el divisor b =1247, entonces tendremos: 5236 - 1247 = 3989 3989 - 1247 = 2742 2742 - 1247 = 1495 1495 - 1247 = 248 Ya no seguimos restando pues 248 es menor que 1247. El cociente estar dado por el nmero de restas (4) y el residuo por el ltimo nmero obtenido (248). Solucin: Definicin de variables: a: dividendo b: divisor Diagrama N/S

Leer a, b

El algoritmo hace la comparacin "en coc = 0 lo alto", esto es antes de realizar cualquier operacin ya que si a es mientras ( a > b ) menor que b, entonces b no est contenida ni una vez en a. a = a-b En caso de que a sea mayor que b, entonces se proceder a la resta. Cada coc = coc + 1 vez que esto ocurra el cociente coc aumenta en una unidad. Imprimir coc, a Finalmente el bucle termina cuando a ya no sea mayor que b, debiendo imprimir el cociente coc y el residuo a.

______________________________________________________

118

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.5.2: La secuencia de Fibonacci es muy conocida en los circulos matemticos y tiene la particularidad que cada nmero es igual a la suma de 2 anteriores trminos. La serie de Fibonacci comienza con los nmeros 0 y 1, produciendo la siguiente secuencia: 0, 1, 1, 2, 3,5, 8, 13,.,., etc. Muestre todo. Muestre todos los nmeros de Fibonacci que un nmero dado. Solucin: Definicin de variables: m: mximo nmero Fibonacci a mostrar a : ensimo nmero Fibonacci b : ensimo +1 nmero Fibonacci Diagrama N/S

Leer m a=0 b= 1 Imprimir a mientras ( b < m) Imprimir b c=a+b a=b b=c

El algoritmo va calculando cada trmino de la secuencia como la suma del trmino ensimo y el trmino ensimo + 1. Observe la necesidad de una tercera variable a la que llamamos c, y sirve para no perder el valor de la suma cuando cambiamos a y b.

______________________________________________________

119

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.5.3: Calcule los divisores comunes de dos nmeros.Por ejemplo los divisores comunes de 6 y 18 1,2,3 y 6. Solucin: Definicin de variables: a: primer nmero b: segundo nmero i: posibles divisores El algoritmo va generando los posibles divisores (i), desde la unidad y mientras este sea menor que ambos nmeros. Observe el uso del operador de relacin AND (en C++ es &&), pues es necesario considerar el caso de que uno sea mltiplo del otro (por ejemplo 4 y 8). El operador MOD obtiene el resto de la divisin entera entre sus argumentos y por lo tanto si estas divisiones tienen como resto cero, i divide a los nmeros. En C++ el operador MOD se implementa haciendo que ambos argumentos sean de alguno de los tipos enteros (int, long int, unsigned int, etc.) y operndolos con %.

Diagrama N/S Leer a, b i= 1 mientras ( i<= a AND i<=b ) a MOD i == 0 AND b MOD i==0 V Imprimir i i=i+1 F

______________________________________________________

120

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.5.4: Factorizar un nmero ingresado por teclado. Por ejemplo 8 = 2 x 2 x2. Solucin: Definicin de variables: n: nmero cuyos factores se desean obtener i: posibles factores No debemos confundir el trmino factorizar que significa encontrar todos los factores primos de un nmero y el trmino factorial que significa el producto de todos los nmeros consecutivos desde la unidad hasta el mismo nmero. Para encontrar todos los factores de un nmero necesitamos generar los posibles valores que puedan dividir a dicho nmero. Esto se logra con la variable i que inicializamos en 2, no se considera el 1 porque es un factor de todos los nmeros. El bucle se ejecuta mientras estos posibles factores i sean menores que el nmero n. Si i divide exactamente a n entonces le sacamos el factor i mediante la divisin entera n = n / i, y lo imprimimos. En este caso i no aumenta en una unidad, pues deber volver a probar si i es nuevamente un factor de n. El incremento de i ocurre solamente cuando i no dividi a n ejecutndose la parte correspondiente al else. Diagrama N/S Leer n i=2 mientras (i< =n ) n MOD i == 0 V n = n/ i Imprimir i F i = i+ l

______________________________________________________

121

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.5.5: Escriba un algoritmo que diga si un nmeroes primo. Solucin: Definicin de variables: n: nmero a evaluar i: posible divisor band: 0 indica que no es primo Un nmero es primo, cuando solamente es divisible por la unidad y por s mismo. Entonces, necesitamos encontrar un nmero i mayor que 1 pero menor a n, que divida exactamente a n, para afirmar que n no es primo. Si esta bsqueda no es satisfactoria el nmero ser primo. Suponemos pues, que todo nmero es primo, hasta que se demuestre lo contrario; as que usaremos un indicador bandera (flag) representado por la variable band. Si band = 1 el nmero es primo y no lo es cuando band = 0. Comenzamos inicializando los posibles divisores i, igual a n/2, pues no existen divisores que sean mayores que la mitad del nmero, para ir preguntando si i divide a n, en este caso debemos cambiar band a cero, indicando que el nmero n ha sido dividido por otro nmero i diferente de 1 y de e1 mismo, y por lo tanto n ya no ser primo. Al terminar el bucle, Preguntamos por band si fuera igual a 1, el n ser primo y no primo en caso contrario. Diagrama N/S Leer n i=n/2 band =1 mientras (i >1 ) n MOD i == 0 V band = 0 i=i-l band = =1 V Imprimir "Es primo Imprimir "No es primo" 122 F F

______________________________________________________

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.5.6: Escriba un programa que permita reducir una fraccin a su mnima expresin. Por ejemplo: 28/64 = 7/16. Solucin: Definicin de variables: a : numerador b: denominador i: posible divisor de a y b Basta con probar si i divide al numerador y al denominador al mismo tiempo, para cada i desde 2 y mientras sea menor a ambos nmeros. Si es un divisor de a y b, entonces simplificar la fraccin en caso contrario probar con el siguiente i. Diagrama N/S Leer a, b i=2 mientras ( i< =a AND i<=b) a MOD i == 0 AND b MOD i= = 0 V a=a/i b=b/i Imprimir a, , b i = i+ l F

______________________________________________________

123

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.5.7: Lea un nmero y forme otro nmero con las cifras en orden inverso. As si el nmero es 12345 el nuevo nmero ser 54321. Solucin: Definicin de variables: n: numero cuyos dgitos se invertirn inv: nmero invertido Para obtener un nuevo nmero inv, formado por los dgitos de n, pero en orden invertido, debemos obtener cada uno de los dgitos de n, e ir desplazndolos un valor posicional (unidad, decena, centena, etc.). Cada uno de los dgitos, pueden ser obtenidos al buscar el resto de la divisin entera entre 10 (n MOD 10) y se debe ir incrementando el valor posicional mediante la multiplicacin del resto por 10, y su acumulacin en la variable inv. Se puede usar la divisin entera (que de manera estndar se representa mediante el operador DIV, y que en C++, se implementa con el operador /) siempre y cuando sus argumentos sean de tipo entero. El ciclo se ejecuta mientras el nmero an tenga dgitos que obtener (mientras n sea mayor que cero), luego del cual imprimimos inv. Diagrama N/S Leer n inv = 0 mientras ( n >0 ) inv = 10*inv + n MOD 10 n = n DIV 10 Imprimir inv

______________________________________________________

124

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.5.8: Un nmero se considera perfecto cuando la suma de sus divisores es igual al nmero. Por ejemplo 6 tiene como divisores a 1, 2 y 3 y como 1+2+3= 6, el nmero 6 ser perfecto; 28 tiene como divisores a 1,2, 4, 7, 14, luego 28 es perfecto pues 1+2+ 4+7+14=28, lo mismo ocurre con 496 y 8128. Escriba un programa que lea un nmero y diga si es perfecto Solucin; Definicin de variables: n: numero a evaluar s: suma de los divisores i: posibles divisores Basta con obtener sus divisores y sumarlos. Utilizaremos la siguiente estrategia, comenzando desde la mitad del nmero n iremos probando los posibles divisores i, disminuyendo i de uno en uno, mientras i sea mayor que cero. En caso de que n sea dividido exactamente por i acumular i en s, y probar siguiente i. Al final del bucle preguntamos si la suma s, result ser igual al nmero digitado n, en cuyo caso imprimiremos que n es perfecto. Diagrama N/S Leer n s=0 i=n/2 mientras (i >0 ) n MOD i == 0 V s=s+1 i=i-l s = =1 V Imprimir "Es perfecto" F Imprimir "No es perfecto" 125 F

______________________________________________________

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.5.9: Los nmeros Amstrong o cubos perfectos, son aquellos que sumados a los cubos de sus dgitos nos dan el mismo nmero. Por ejemplo 153 es un cubo perfecto pues 13 + 53 + 33 = 153. Lea un nmero y diga si es o no, un cubo perfecto. Solucin: Definicin de variables: n: nmero a evaluar se: suma de los cubos de sus cifras temp: se iguala inicialmente a n, y sirve para trabajar en el algoritmo sin perder n De manera similar al ejercicio anterior pero esta vez obtenemos cada dgito para elevarlo al cubo y acumularlo en sc. Si se resulta ser igual a n, entonces el nmero es un cubo perfecto. Pruebe el algoritmo con los siguientes cubos perfectos: 1, 153, 370, 371 y 407. Diagrama N/S

Leer n sc = 0 temp = n mientras (temp >0 ) sc = sc + (temp MOD 10)3 temp = temp DIV 10 n = = sc V F Imprimir Imprimir "Cubo perfecto" "No es cubo perfecto

______________________________________________________

126

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.5.10: Lea un nmero y una base de un sistema de nuemeracin, y diga si el nmero pertenece a ese sistema de numeracin, teniendo en cuenta que para que un nmero pertenesca a un sistema de numeracin todos su digitos deben ser menores que la base. Solucin: El sistema de numeracin que normalmente utilizamos, debido a su sencillez, es el sistema decimal cuya base es 10. Sin embargo, cualquier nmero mayor de 1, puede ser la base de un sistema de numeracin. De hecho son importantes en computacin los sistemas de numeracin en base 2, 8 y 16. Para decir que un nmero puede pertenecer a un sistema de numeracin, se tendr que verificar que cada uno de sus dgitos sea menor que la base. Por ejemplo en base 2 slo son vlidos los dgitos 0 y 1, en base 3 los dgitos 0, 1 y 2, ... , en base 10 los dgitos 0, 1, 2, 3, 4, 5, 6, 7, 8 y 9; mientras que en sistemas de numeracin con bases mayores a 10 se utilizan las letras del alfabeto, por ejemplo en base 16 son vlidos los dgitos 0, 1,2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D y F. Esto restringir nuestro algoritmo, hasta comprender como usar los caracteres y es por ello que nuestro programa solamente funcionar cuando la base sea menor a 10. Definicin de variables: base: base del sistema numrico num: nmero ingresado en base base band: bandera. 1 indica que nmero no es correcto en esa base Entonces, dado el nmero num y la base base, debemos encontrar cada dgito de num. Si alguno de estos dgitos es mayor que base, entonces debemos indicar que dicho nmero no es correcto activando la bandera haciendo band =1 y, cuando terminemos de evaluar todos sus dgitos, preguntar si esa bandera fue puesta a 1, en cuyo caso no ser un nmero vlido en dicho sistema de numeracin.

______________________________________________________

127

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Diagrama N/S

Leer base, num band = 0 mientras ( num > 0 ) num MOD 10 >=base V band = 1 num = num DIV 10 band == 1 V Imprimir "No es de esa base" F Imprimir "Es de esa base" F

______________________________________________________

128

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.5.11: Lea un nmero entero en la base 10, yconviertalo a otra base menor que 10. Solucin: Se sabe que para convertir un nmero en base 10 (Sistema Decimal) a otra base, debemos dividir sucesivamente el nmero entre la base, hasta encontrar un cociente menor que dicha base (en algoritmos por computadora nos conviene seguir la divisin hasta que el cociente sea cero). El nmero en la nueva base estar formado por todos los residuos pero en orden inverso a como se fueron obteniendo. Por ejemplo sea el nmero 194 en base 10, al que deseamos convertir a base 5, entonces:

194 (4)

5 38 (3)

5 7 (2)

5 1 (1)

5 0

194(10) = 1234 (5) Los residuos escritos en el orden en que fueron obtenidos son: 4, 3, 2 y 1. Pero, el nmero equivalente a 194 en base 5 es 1234. Ntese la necesidad de formar el nmero desde el ltimo residuo hasta el primero. La restriccin que la base sea menor que 10, no afecta a este algoritmo en su desarrollo manual. Sin embargo, en su implementacin mediante computadoras debemos manejar adecuadamente los caracteres para bases mayores que 10, lo cual no es considerado en esta parte, por tratarse de un libro introductorio al mundo de la programacin y an no trataremos sobre manipulacin de caracteres.

______________________________________________________

129

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Definicin de variables: n: nmero en base 10, adems es utilizado como el nmero en la nueva base base: base a la cual se quiere convertir n inv: variable de trabajo que almacena los sucesivos residuos obtenidos al realizar la conversin. Nuestro algoritmo se basa en realizar divisiones sucesivas obteniendo el residuo mediante n MOD base, y el cociente entero mediante n DIV base, e ir formando el nmero a partir de los residuos. Sin embargo, el nmero encontrado en realidad es el nmero pedido pero en orden inverso, por lo tanto, se hace necesario escribir una pequea rutina que invierta dicho nmero para tener el nmero deseado (ver ejemplo 4.7). Diagrama N/S Leer n, base inv = 0 mientras ( n > 0 ) inv = 10*inv + n MOD base n = n DIV base mientras (inv > 0 ) n= 10*n+ inv MOD 10 inv = inv Dv 10 Imprimir n

______________________________________________________

130

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.5.12: Lea un nmero entero en una base menor que 10, y conviertalo a base 10. Solucin: Para convertir un nmero escrito en una base distinta a 10, debemos obtener sus dgitos y multiplicarlos por la base de numeracin en que se encuentran pero elevada a la potencia segn su valor posicional disminuido en una unidad. Por ejemplo, para convertir el nmero 1234(5) a su equivalente en base 10, haremos lo siguiente: 4(5) + 3(5)1 + 2(5)2 + 1(5)3 = 194(10) Definicin de variables: n: nmero en base base base: base del nmero ingresado nuevo: nmero en base 10 i: indica el exponente al que elevaremos base Diagrama N/S Leer n, base i=0 nuevo = 0 mientras ( n > 0) nuevo= nuevo + (n MOD 10) (base1) n = n DIV 10 i = i+1 Imprimir nuevo

Nuestro algoritmo leer el nmero n y la base base en la que est escrita, obteniendo sucesivamente cada uno de sus dgitos, multiplicndolos por la potencia de la base adecuada, mientras que el nmero tenga dgitos (sea mayor a cero).

______________________________________________________

131

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.5.13: El mximo comn divisor (mcd) de un conjunto de nmeros es el mximo nmero que divide exactamente a todos ellos. Encuentre el mcd de dos nmerospor el mtodo de Euclides. Solucin: Euclides ide un algoritmo para encontrar el mcd, de dos nmeros y consiste en dividir sucesivamente ambos nmeros hasta que el divisor sea cero. Suponga que se desea obtener el mcd de los nmeros 2363 y 2057, procederemos tal como se muestra: 1 6 1 2 1 1 2

2363 2057 306 221 85 51 34 17 306 221 85 51 34 17 0

Observe que en la parte superior aparecen los cocientes de las divisiones y en la parte inferior los restos, los cuales pasan a formar el nuevo divisor mientras el resto sea mayor que cero. El mcd, ser el ltimo divisor, esto es 17. Definicin de variables: a : primer nmero (dividendo) b: segundo nmero (divisor) r: resto de la divisin entera Diagrama N/S Leer a, b mientras (b>0) r = a MOD b a=b b=r Imprimir a ______________________________________________________ 132

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.5.14: Encuentre el mcd de dos numeros por restas sucesivas Solucin: Definicin de variables: a: primer nmero b: segundo nmero Una forma alternativa de realizar una divisin es mediante restas tal como se vio en el Problema 3.5.1. As, el Algoritmo de Euclides, pero aplicando restas sucesivas en vez de la divisin, puede implementarse tal como se observa en el diagrama N/S.

Diagrama N/S Leer a, b mientras ( ab) a>b V a=a-b Imprimir a b=b-a F

______________________________________________________

133

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.5.15 Obtenga el mximo comn divisor mcd de dos nmeros por descomposicin de factores. Tomemos los nmeros 360 y 200 y procedemos a probar sucesivamente si los nmeros i = 2, 3, dividen a ambos.Cuando la divisin de 360 y 200 entre i sea exacta, realizamos las divisiones y volvemos a probar con el mismo i.

360 180 90 45 0

200 100 50 25 5

2 2 2 5

En caso deque i no divida a ambos nmeros probamos con el siguiente i, y asi sucesivamente, mientras i sea menor que ambos nmeros. Finalmente el mcd, estar formado por el producto de todos los divisores encontrados en este caso mcd = 2x2x2x5 = 40. Escriba un algoritmo que encuentre el mcd de 2 nmeros mediante este mtodo. Solucin: Definicin de variables: a: primer nmero b: segundo nmero mcd: mximo comn divisor i: posibles divisores Diagrama N/S Leer a, b mcd = 1 i =2 mientras ( i<= a AND i<=b ) a MOD i == 0 AND b MOD i==0 V F a =a/ i i = i+ 1 b =b/i mcd = mcd * i Imprimir mcd ______________________________________________________ 134

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.5.16; E1 mnimo comn mltiplo (mcm) de 2 o ms nmeros, es el menor nmero contiene a todos ellos una cantidad exacta de veces. Construya un algoritmo para calcular el mcm de 2 nmeros ledos por teclado. Solucin: Definicin de variables: a: primer nmero b: segundo nmero mcm: mnimo comn mltiplo i: posibles divisores band: 0 indica si i aumentar en 1 Diagrama N/S Leer a, b mcm =1 i=2 band = 0 mientras ( i<= a OR i<=b ) a MOD i = = 0 OR b MOD i = = 0 V F mcm = mcm*i a MOD i = = 0 V F a = a/ i i=i+1 b MOD i = = 0 V F b =b/ Imprimir mcd

Ilustremos el algoritmo mediante un ejemplo. Tomemos los nmeros 360 y 200, e intentemos encontrar su mcm, por descomposicin de sus factores primos, tal como se muestra.

______________________________________________________

135

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


360 180 90 45 15 5 1 1 De donde el mcm ser: 2x2x2x3x3x5x5 = 1800 A diferencia del mcd, basta que uno de los nmeros sea dividido por i, para entrar en el clculo del mcm. De aqu el uso de OR en vez del AND. 200 100 50 25 25 25 5 1 2 2 2 3 3 5 5

______________________________________________________

136

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejercicios Propuestos: Lea atentamente cada enunciado y plantee su solucin. Luego construya su diagrama N-S coreespondiente. 1) El factorial de un nmero se define como el producto de todos los nmeros consecutivos desde la unidad hasta el nmero y se denota por el smbolo !. Por ejemplo 4! - 4x3x2x1, teniendo en cuenta esto, lea un nmero y encuentre su factorial. 2) Encuentre el mcm de dos nmeros ayb sabiendo que (a)(b) = (mcm)(mcd). 3) Para simplificar una fraccin, basta con dividir su numerador y denominador entre el mcd de ambos. Implemente un algoritmo que simplifique una fraccin haciendo uso de esta idea. 4) Determine cuntos dgitos tiene un nmero entero ingresado por teclado. 5) Cuntos dgitos impares tiene un entero ingresado por teclado? 6) Lea un entero y diga cul es su dgito mayor. 7) Dos nmeros se consideran amigos si la suma de los divisores de uno es igual al otro nmero. Por ejemplo 220 y 284 son amigos. Lea dos nmeros y diga si son amigos entre s. 8) Se sabe que n2 = 1 +3 +5 +7 + 2n-l. Se pide leer un nmero y calcular su cuadrado haciendo uso de esta relacin. 9) Un nmero es capica o palndromo, si el nmero es tal que invirtiendo sus cifras da el mismo nmero. As 12321 es capica porque invirtiendo sus cifras nos da 12321. Escriba un algoritmo que diga si un nmero ingresado es capica. 10) Calcule la ensima potencia entera de un nmero teniendo en cuenta que el exponente puede ser negativo. Considere el caso que cualquier nmero elevado a la potencia cero da la unidad. 11) El mnimo comn mltiplo (mcm) de 2 o ms cantidades es el menor nmero que los contiene una cantidad exacta de veces. Construya un algoritmo para calcular el mcm de 3 nmeros. 12) El mximo comn divisor (mcd) de un conjunto de nmeros es el mximo nmero que divide exactamente a todos ellos. Construya un algoritmo para calcular el mcd de 3 nmeros. 13) Construya un algoritmo que adivine el nmero entero pensado por usted en la menor cantidad de intentos posibles.

______________________________________________________

137

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


3.6. ESTRUCTURA REPETITIVA HACER MIENTRAS La estructura secuencial se caracteriza por mostrar problemas con caracteristicas secuenciales donde por ningn caso se hara uso de alguna otra estructura. Los problemas plantados mayormente tienen ambito matematico aritmetico cumpliendo los tre requisitos basicos de un diagarama: Entrada, Proceso y Salida. Ejemplos: Ejemplo 3.6.1: Encuentre el valor de sabiendo que la suma de la serie: 1 - 1/3 + 1/5 1/7+1/9 + .es igual a /4. Sugerencia: considere los trminos cuyo valor absoluto sea mayor a 0.000001. Solucin: Diagrama N/S Definicin de variables: i: denominador varia de 2 en 2 pi4: cuarta parte de pi signo: variable contiene el signo del trmino i =1 pi4 = 0 signo = -1 hacer signo = -signo pi4 = pi4 + signo*(l/i) i=i+2 mientras ( 1/i > 0.000001) Imprimir "Pi vale:", 4*pi4

En la serie mostrada el denominador aumenta en 2 para cada trmino, y los signos se alternan entre positivo y negativo.

Para este clculo bastar con un bucle dentro del cual se haga el cambio de signo, acumule el trmino y aumente en 2 el denominador (i), mientras el valor absoluto del trmino actual (1/i) sea mayor a 0.000001. Como la suma de todos los trminos es /4, debemos con multiplicar a pi4 por 4, para obtener .

______________________________________________________

138

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.6.2: Hallar la raz cuadrada de un nmero por el mtodo de Newton. Solucin: Definicin de variables: rea: rea del cuadrado ladoO: lado inicial supuesto ladol: lado calculado Diagrama N/S Leer rea, lado0 hacer lado 1 = area/lado0 lado0 = (lado0+ladol)/2 mientras fabs(ladol-lado0)>0.00001 Imprimir "lado:", lado0

Usaremos la siguiente analoga. Considere un cuadrado de lados lado0 y lado1 y de rea rea. Si se conoce el valor de rea (el nmero cuya raz se desea) y se tiene un valor inicial estimado del lado (lado0) y como lado0.1adol=area, entonces. ladol=area/lado0, dado que lado0 y ladol deben ser iguales (por tratarse de un cuadrado), debemos ir aproximndolos a un nico valor. Una buena aproximacin del lado0 es tomar la media aritmtica entre los dos valores obtenidos (lado0 y ladol) y asignarlo al nuevo lado0, tal expresin sera: lado0 = (lado0 + ladol ) / 2, luego hay que volver a calcular el nuevo ladol como ladol = rea / lado0, y as sucesivamente hasta que la diferencia entre lado0 y ladol sea despreciable.

______________________________________________________

139

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.6.3: Lea una serie de numeros hasta engresar el valor de cero.Luego indique cuantos nmeros positivos, negativos, pares e impares fueron ingresados. Solucin: Definicin de variables: Diagrama N/S imp: cantidad de nmeros impares neg: cantidad de nmeros negativos i: cantidad nmeros ingresados n: nmero i ingresado Usaremos los contadores i, imp y neg los cuales debern ser inicializados a cero. Dentro del bucle leemos el nmero (n) a evaluar y aumentamos la cuenta del total de nmeros ledos (i). Si n no es dividido entre 2, aumentaremos la cuenta de los impares i = imp = neg = 0 Hacer Leer n i = i+l n MOD 2 = = 1 V F imp = imp + 1 n<0 V F neg = neg + 1 mientras ( n 0 ) i=i-l Imprimir "Total de nmeros:", i "Pares : ", i - impar "Impares : " , impar "Positivos : " , i - neg "Negativos: " , neg

(imp=imp+l). Si n es menor que cero aumentaremos la cuenta de los negativos (neg=neg+l). En caso de haber ingresado un valor diferente de cero la condicin (n # 0) es verdadera y por lo tanto el bucle hacer...mientras, seguir ejecutndose. En caso de que n sea igual a cero, imprimiremos la cantidad de pares, impares, positivos y negativos.

______________________________________________________

140

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.6.4: Se tiene una lmina rectangular de largo y ancho conocidos a la que se recorta un cuadrado de lado x en cada esquina con el objeto de formar una caja. Cules son las dimensiones de esta caja, si se desea que el volumen sea el mximo posible? Solucin: Definicin de variables: largo: largo de la lmina ancho: ancho de la lmina x: longitud del lado del cuadrado recortado xmax: longitud del lado que hace mximo el volumen vol: volumen de la caja volmax: volumen mximo de la caja

Se trata de un problema de optimizacin (ms concretamente de maximizacin), que puede resolverse mediante el clculo diferencial o tambin, mediante el clculo de diversos valores para el volumen para tomar el mayor.

______________________________________________________

141

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


En muchos casos el aplicar clculo diferencial, es muy difcil o sumamente laborioso. Se puede demostrar que el mximo volumen de la caja se obtiene cuando: x= ((ancho + largo) sqrt( ancho2 ancho.largo + largo2) 6 Sin embargo, aqu postraremos otro mtodo. Segn el enunciado del problema debe omplirse que 0 < x ancho/2, por lo |Hbastar calcular los volmenes dentro de este rango y guardar el nayor de ellos. As, leemos el largo y ancho la lmina, inicializamos la longitud lado recortado (x) y el volumen mximo (volmax), a cero (cuando tratamos de obtener un mximo, el valor inicial de comparacin debe ser el mnimo posible). Diagrama N/S Dentro del bucle vamos Leer largo, ancho aculando los volmenes de todas x = volmax = 0 las x, con diferencias de 0.0001 entre Hacer cada x y realizando la comparacin x = x + 0.000l para que voturnen es mayor y el valor vol = (largo - 2x) (ancho - 2x) x de x para el cual dicho volumen es vol > volmax Mximo (xmax). V F volmax = vol xmax = x mientras (x< ancho/2 - 0.0001) Imprimir "Volumen mximo:", volmax "Largo : " , largo - 2xmax "Ancho : " , ancho-2xmax "Altura : " , xmax

______________________________________________________

142

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.6.5: Cual es la mxima rea de terreno que se pueda obtener si las longitudes de un terreno son x y (20-x)? Solucin: Definicin de variables: Diagrama N/S inc = 0.0001 x=0 areamax = 0 Hacer x = x + inc area = x (20 - x) area > areamax V areamax = area xmax = x mientras (x <= 20 - inc) Imprimir "rea mxima:", areamax "Dimensiones:", xmax, 20 - xmax F

inc: incremento x: una de las dimensiones del terreno xmax: valor que hace mxima el rea rea: rea del terreno areamax: el rea mxima del terreno

Como el rea tiene que ser positiva, entonces debe cumplirse que 0 < x 20, por lo que calculamos las reas para todos los x desde 0 hasta 20 con incrementos pequeos (0.0001) y obteniendo la mayor rea, y el valor de x que hace mxima el rea (xmax).

______________________________________________________

143

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejercicios Propuestos: Lee atentamente cada enunciado y plantee su solucin. Luego construya un diagrama N-S. 1) En una universidad se pueden llevar hasta 22 crditos en un ciclo. Escriba un algoritmo que permita a un alumno matricularse, sin pasarse del lmite de crditos permitido. 2) Una vendedora de pan tiene n unidades de pan al comenzar el da. Si cada cliente le pide m panes, Cuntos clientes son atendidos completamente? Cuntos panes quedan para el ltimo cliente? 3) Un cliente de un banco realiza sucesivos retiros desde un cajero, si posee 1000 al inicio de las operaciones, escriba un programa que le permita retirar dinero mientras tenga fondos. 4) En un cajero se muestra un men de opciones retiro, saldo, depsito y salir. Escriba un algoritmo que efecte dichas operaciones. 5) A una fiesta ingresan personas de diferentes edades, no se permite elingreso de menores de edad. Se pide la edad menor, la mayor, y el promedio de edades. El ingreso debe terminar cuando la edad ingresada sea cero 6) Calcule la suma de 1/x, si x vara desde 1 hasta 2 con incrementos muy pequeos, por ejemplo 0.0001, luego multiplique la suma por el mncremento y demuestre que el resultado se aproxima a ln 2 = 0.6931... 7) Lea un nmero positivo y prtalo en 2 sumandos de forma que su producto tenga un valor mximo. 8) Qu rectngulo con permetro igual a 50 tiene rea mxima? 9) Una ventana tiene forma de rectngulo culminado por un semicrculo. El permetro de la ventana es 6m. Cules son sus dimensiones si debe dejar pasar el mximo de luz? 10) La funcin seno(x) va en aumento a partir del punto x=0.. Encuentre el valor positivo de x para el cual la funcin comienza a disminuir. Respuesta: /2. 11) Unaa ecuacin de la parbola es y = ax*x + bx +c. Si a>0 la parbola est dirigida hacia arriba y tiene un mximo, si a< O la parbola est dirigida hacia abajo y tiene un mnimo. Lea a, b y c y determine el mximo o el mnimo segn corresponda. Considere x0. ______________________________________________________ 144

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


3.7. ESTRUCTURA REPETITIVA PARA La estructura repetitiva para se caracteriza por realizar multiples iteraciones consecutivas, basandose en un valor inicial, condicion final e incremento decremento segn sea el problema planteado.

Ejemplos: Ejemplo 3.7.1: Calcule la suma de la siguiente serie. 1 x x 2 x3 S 0! 1! 2! 3! Solucin: Definicin de variables: t: trmino cualquiera s: acumulador indica la suma de trminos n: nmero de trminos i:indica el trmino actual Diagrama N/S t=l s=l Leer n, x i<=n; i = 1 +l t= t * x / i s=s+t Imprimir s

x4 4!

xn n!

i = l;

Se observa que la razn entre un trmino y el anterior es x/i, luego si tenemos el primer trmino los otros trminos se obtendrn multiplicando el trmino anterior por la razn x/i, e ir acumulndose en s, hasta el ensimo trmino. Puede demostrarse que si x =1, y n es lo suficientemente grande, la suma se aproxima a la base de los logaritmos neperianos e (e =2.718281...)

______________________________________________________

145

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.7.2: Un vehculo recorre n distancias en n tiempos diferentes cual ser la velocidad promedio para toda la trayectoria? Solucin: Definicin de variables: n: cantidad de trayectos i: indica el trayecto i d: distancia recorrida en trayecto i t: tiempo utilizado en trayecto i dt: distancia total recorrida tt: tiempo total utilizado Diagrama N/S Leer n dt = tt = 0 i = 1; i<= n; i = i + 1 Leer d, t dt = dt + d tt = tt + t Imprimir dt/tt La velocidad de un mvil se obtiene dividiendo la distancia recorrida entre el tiempo utilizado. En este caso se pide la velocidad promedio para todo el trayecto, dicha velocidad estar dada por la distancia total recorrida entre el tiempo total utilizado. Entonces bastar con acumular las distancias que se van recorriendo (d) y los tiempos (t), que se utilizaron, para al final obtener la relacin dt/tt.

______________________________________________________

146

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.7.3: Encuentre el valor numrico de un polinomio de grado n. Solucin: Definicin de variables: i: indica el exponente de x n: grado del polinomio coef: coeficiente de xi valor: valor numrico del polinomio Diagrama N/S valor = 0 Leer n, x i = n; i >= 0; i = i - 1 leer coef valor = valor * x + coef Imprimir valor Sea el polinomio f(x) = anxn + an-1xn-1+ an-2xn-2 + ... + a2x2 + a1x1 + a0x0 El coeficiente an ser multiplicado por x, n veces; an-1 ser multiplicado por x, n-l veces; an-2 ser multiplicado por x, n-2 veces; y as sucesivamente hasta a0, que no ser multiplicada por x. Esto es aprovechado por nuestro algoritmo para leer cada coeficiente y multiplicarlo por x, leer el otro coeficiente y multiplicar el acumulado (valor) por x, de esta manera el primer coeficiente resulta multiplicado por xn, el segundo por xn-1 el tercero por xn'2, y as sucesivamente hasta que el trmino independiente no es multiplicado por ningn x.

______________________________________________________

147

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.7.4: Encuentre el promedio de n nmeros. Solucin: Definicin de variables: s: acumulador indica la suma de los n nmeros i: contador, indica el nmero actual a ser ledo n: nmero de datos a leer nro: actual nmero ledo Diagrama N/S s =0 Leer n i =1; i<=n; i = i + 1 Leer nro s = s + nro Imprimir s/n Debemos ingresar la cantidad de nmeros que vamos a leer, e ir acumulndolos en la variable s (previamente inicial izada en 0), conforme se vayan leyendo. Al trmino de la lectura de los n nmeros debemos obtener el promedio dividiendo la suma (s) entre el total de nmeros ledos (n).

______________________________________________________

148

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.7.5: Encuentre el promedio ponderado de n nmeros. Solucin: Definicin de variables: sn: acumulador, indica la suma de los nmeros ledos sp: acumulador, indica la suma de los pesos o ponderaciones ledos i: contador, indica el nmero actual ledo n: nmero de datos a leer nro: actual nmero ledo p: peso o ponderacin de nro El promedio ponderado se utiliza para calcular el promedio de un conjunto de datos, cuando dichos datos tienen ponderaciones o pesos diferentes.

Matemticamente: Pp

nro p p

Diagrama N/S sn = 0 sp = 0 Leer n i =1; i<=n; i = i + 1 Leer nro, p sn = sn + nro*p sp = sp + p Imprimir sn/sp AS pues, necesitamos leer cada uno de los n nmeros con sus respectivos pesos y calcular la sumatoria de todo los nro*p. Asimismo, debemos calcular la sumatoria de todos los p. Finalmente solo nos queda dividir las sumas encontradas. ______________________________________________________ 149

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.7.6: Muestre las tablas de multiplicar del 1 al 15. Solucin: Definicin de variables: i: indica Ja tabla de multiplicar j: indica cada nmero de la tabla del i Este algoritmo muestra como podemos anidar los bucles. Para ello se requiere de un bucle externo (i), que indique la tabla de multiplicar que estamos obteniendo; y de un bucle interno (j) que indique cada lnea de la tabla de multiplicar i, tal como se muestra. Diagrama N/S i =1; i<=15; i = i+l

Imprimir "Tabla de multiplicar", i j =1; j<=15; j=j + l Imprimir i, "x", j, " - ", i*j

______________________________________________________

150

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.7.7: Simule un "reloj rpidoque muestre en pantalla, las horas minutos y segundos. Solucin: Definicin de variables: hor: horas min: minutos seg: segundos Diagrama N/S hor = 0; hor <24; hor = hor + 1 min =0; min<60; min = min + 1 seg = 0; seg < 60; seg=seg + l Imprimir hor, min, seg

Este es otro ejemplo de como podemos anidar el bucle for. Las horas solamente pueden tomar valores desde 0 hasta 23. Los minutos desde 0 hasta 59, los segundos desde 0 hasta 59. De estos 3 bucles, quien debe cambiar ms rpido es el bucle de los segundos, por lo tanto ser el bucle ms interno, luego vendran los minutos y finalmente las horas. Recuerde que quien cambia ms despacio es el bucle ms externo. Por lo dems el algoritmo no requiere mayor explicacin.

______________________________________________________

151

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.7.8: Cuntos nmeros de 4 cifras existen, tales que sean mltiplos de 3 y 7? Solucin: Definicin de variables: i: nmeros a evaluar m : Cantidad de nmeros de 4 cifras mltiplos de 3 y 7. Debemos evaluar todos los nmeros de 4 cifras (entre 1000 y 9999), preguntando si son divididos por 3 y por 7 al mismo tiempo. Para esto hacemos uso de un bucle en el cual se ir generando sucesivamente los nmeros a evaluar, dentro del cuerpo del bucle se procede a la evaluacin y si la condicin es cierta aumentaremos el contador m en una unidad. Finalmente imprimiremos m. Diagrama N/S m=0 i = 1000; i<=9999; i =i+l i MOD 3== 0 AND i MOD 7== 0 V m = m +1 Imprimir m

______________________________________________________

152

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.7.9: Los nmeros enteros que satisfacen la ecuacin a2 + b2 = c2, se les conoce como ternas pitagricas. Encuentre todas las ternas pitagricas menores que n. Solucin: Definicin de variables: a: posible nmero pitagrico b: posible nmero pitagrico c: posible nmero pitagrico Diagrama N/S

Leer n a=l; a<=n; a = a+ 1 b=l; b<=n; b = b+l c= 1; c<=n; c = c + 1 a2 + b2 = =c2 V F Imprimir a, b, c

Este ejemplo es muy ilustrativo de cmo podemos anidar la cantidad de bucles deseados. Debemos leer n, luego mediante 3 bucles generar los posibles valores de a, b y c que sean menores o iguales que n y que cumplan la condicin a2 + b2 = c2, en cuyo caso tendremos una terna pitagrica y debemos imprimirla.

______________________________________________________

153

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.7.10: Cuatro artculos cuestan 3, 7, 19 y23 soles respectivamente Cules son las posibles cantidades que podemos adquirir de cada artculo, si disponemos de 113 soles y deseamos gastarlo todo? Solucin: Definicin de variables: a: posible cantidad de artculos comprados de 3 soles b: posible cantidad de artculos comprados de 7 soles c: posible cantidad de artculos comprados de 19 soles d: posible cantidad de artculos comprados de 23 soles Diagrama N/S a=0; a<=(113 DIV 3); a = a+l b=0; b<=(113DIV7); b = b+l c=0; C<=(113 DIV 19); c=c+1 d=0; d<=(113 DIV 23); d=d+l
3a + 7b + 19c +23d = = 113

V Imprimir a, b, c, d

Debemos generar a, b, c y d con valores desde 0 artculos comprados, hasta la mxima posible cantidad de artculos para cada uno (113 DIV 3, 113 DIV 7 113 DIV 19 y 113 DIV 23 respectivamente). Para esto hacemos uso de 4 bucles, uno para cada tipo de artculo. En el bucle ms interno preguntamos si la cantidad gastada es igual a 113 soles, en cuyo caso imprimimos a, b, c y d.

______________________________________________________

154

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.7.11: Lea n nmeros e indique cual es el mayor. Definicin de variables: n: cantidad de nmeros i: sirve para llevar la cuenta de nmeros may: nmero mayor nro: nmero ledo Para encontrar el mayor de un conjunto de nmeros debemos compararlos de dos en dos para obtener el mayor de ambos y luego tomar otro nmero y seguir comparando hasta que no tengamos ms nmeros que comparar. Sin embargo, tenemos una dificultad, el primer nmero tomado no tiene con quien compararse, por lo tanto necesitamos asumir un valor para realizar la primera comparacin. Podemos inicializar may a un valor tan pequeo, para que la primera vez que se compare siempre deba asignarse a may el primer nmero ledo, este es el procedimiento aplicado. En compiladores de 16 Bits de C++ -32767 es el mnimo valor de tipo entero que podemos tener, y esta es la razn que Inicializamos may a este valor. Otra forma es asumir que el primer nmero ledo es mayor y luego proceder a comparar los nmeros restantes. Diagrama N/S may = -32767 Leer n i = 1; i<= n; i = i +1 Leer nro nro > may V may = nro Imprimir may ______________________________________________________ 155 F

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.7.12 Muestre todos los nmeros de 3 digitos tales que si invertimos sus cifras el nmero original aumente en 297. Solucin: Definicin de variables: i: es el nmero a evaluar nro: es el nmero a invertir inv: es el nmero invertido Diagrama N/S i =100; i<1000; i = i+l nro = i inv = 0 mientras ( nro > 0 ) inv = 10*inv + nro MOD 10 nro = nro DIV 10 i + 297 = = inv V F Imprimir i Debemos generar todos los nmeros i, de 4 cifras e ir probando uno a uno. Para esta prueba se debe invertir el nmero tal como se hizo en el ejemplo 4.7, y luego preguntar si el nmero original i aumentado en 297 es igual al nmero invertido inv.

______________________________________________________

156

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.7.13: Obtenga el producto de n fracciones. De el resultado como una fraccin simplificada. Solucin: Definicin de variables: i: contador indica la fraccin i. Utilizado tambin como generador de posibles divisores durante la simplificacin de la fraccin n: numerador de la fraccin i d: denominador de la fraccin i pn: producto de numeradores pd: producto de denominadores nro: cantidad de fracciones Diagrama N/S Leer nro El algoritmo va obteniendo el producto de las fracciones conforme se las va ingresando. Una vez ingresados y multiplicados todos los numeradores y denominadores, se procede a la simplificacin de la fraccin, tal como se hizo en el Problema 4.6. pn = pd = 1 i = 1; i<= nro; i=i+l Leer n, d pn = pn * n pd = pd * d i=2 mientras (i<=pn AND i<=pd ) pn MOD 1 ==0 AND pd MOD i ==0 V pn = pn /i i = I +1 pd = pd /i Imprimir pn,"/", pd ______________________________________________________ 157 F

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.7.14: Suma n fracciones. De el resultado com una fraccin simplificada. Definicin de variables: i: contador indica la fraccin i. Utilizado tambin como generador de posibles divisores durante la simplificacin de la fraccin n: numerador de la fraccin i d: denominador de la fraccin i nr: numerador resultante dr: denominador resultante nro: cantidad de fracciones Diagrama N/S Leer nro i = 1; i<= nro; i=i+l Leer n, d i ==1 V F nr = n nr = d*nr + n*dr dr =d dr = d*dr i=2 mientras (i<=nr AND i<=dr) nr MOD i == 0 AND dt MOD i ==0 V F nr = nr / i i = i +1 dr = dr / i Imprimir nr, "/", dr El algoritmo implementado consiste en ir sumando las fracciones conforme se vayan leyendo, de tal manera que siempre tendremos 2 fracciones que sumar: la resultante y la que acabamos de ingresar. La suma de dos fracciones tales como nr/dr y n/d de manera general es: (d*nr+ n*dr)/(d*dr) expresin que es utilizada por nuestro algoritmo, dentro del bucle for. Finalmente, simplificamos la fraccin nr/dr. ______________________________________________________ 158

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.7.15: De cuntas maneras se pueden ordenar n objetos? Solucin: Definicin de variables: i: indica el i-simo objeto n: nmero de objetos fact: cantidad posible de ordenamientos Diagrama N/S fact = l Leer n i = 1; i<=n; i = i +1 fact = fact * i Imprimir fact El primer objeto puede ubicarse en cualquiera de las n posiciones, el segundo objeto en cualquiera de las n-1 restantes, el tercero en cualquiera de las n-2 restantes,..., el ensimo-1 objeto se podr ubicar en cualquiera de las 2 ubicaciones restantes, y finalmente el ensimo objeto se ubicar en ltima posicin. Luego, el valor pedido ser: n ( n - l ) ( n - 2 ) . . . ( 2 ) ( l ) . A la cantidad posible de formas de ubicar n objetos se le conoce como permutaciones y como las permutaciones de n objetos equivalen al producto de los nmeros consecutivos desde la unidad hasta el nmero, intonces las permutaciones pueden obtenerse calculando el factorial de n. Matemticamente: Pn = n! Luego basta leer n y calcular su Factorial.

______________________________________________________

159

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.7.16: De cuantas maneras podemos colocar n objetos en r lugares diferentes? (nr) Solucin: Definicin de variables: i: indica el i-simo objeto n: nmero de objetos v: cantidad posible de ordenamientos Diagrama N/S v=l Leer n, r i = 1; i<=r; i = i +1 v = v * ( n - i + 1) Imprimir v El problema no es otro que el clculo de variaciones de n objetos tomados de r en r. Las variaciones se definen como la cantidad posible de formas que podemos tomar r objetos de un total de n objetos en donde la posicin es importante. Decir ab es diferente que decir ba, a pesar de que ambos tengan los mismos objetos (a y b), son diferentes por el orden que ocupan. Razonando: el primer lugar puede ocuparse de n maneras, el segundo lugar de n-1 maneras, el tercer lugar de n-2 maneras, ..., el r-simo lugar puede ocuparse de (n-r+1) maneras. Como solamente disponemos de r lugares, tendremos el producto de r trminos consecutivos.
V nr n! n r !

Matemticamente podemos escribir: Vnr = n (n -1) (n - 2) (n - 3) ... (n - r+1) o tambin: Esta ltima frmula es usada en clculos manuales, sin embargo en computadoras, usaremos la primera forma, por ser ms eficiente. El algoritmo es sencillo basta leer n y obtener el producto de r trminos cada uno disminuido en una unidad (una estrategia alternativa es hacer disminuir n multiplicando los trminos mientras que i sea igual a n-r+1). ______________________________________________________ 160

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.7.17: De cuantas maneras podemos tomar r elementos de un total de n elementos? (nr) Solucin: Definicin de variables: i: indica el i-simo objeto n: nmero de objetos r: nmero de objetos por grupo c: nmero de combinacionesDiagrama N/S c=l Leer n, r i=l; i<=r; i = i+l c = c * ( n - i + l)/i Imprimir c El enunciado del problema no es otro que el clculo de combinaciones de n objetos tomados en grupos de r elementos. Las combinaciones se definen como la cantidad de formas que podemos tomar r objetos de un total de n objetos en donde la posicin no es importante, aqu, decir ab es igual a decir ba, pues son los mismos objetos. Sea Cnr el nmero de combinaciones requerido, cada una He estas combinaciones consta de r objetos deferentes los cuales pueden ordenarse entre si de r! maneras, por lo tanto Cnr .r! es igual a Vnr n! De donde: C n r r! n r ! Puede demostrarse que la relacin que existe entre Cnr y Cnr-i, viene dada por:
n

C
r

n! r! n r !

n r 1

n r 1 r

Relacin que utilizaremos para lacer ms fcil la inplementacin del algoritmo; y adems porque el factorial de un nmero crece rpidamente que si calculamos cada uno de los 3 factoriales, fcilmente rebasamos el rango permitido. ______________________________________________________ 161

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.7.18: Los coeficientes que se obtienen al desarrollar el Binomio de Newton para exponentes enteros pueden calcularse en base al coeficiente anterior mediante relacin coef = coef*(i-j+l)/j, donde coef, es el coeficiente del trmino actal; i es el exponente del binomio y, j indica que trmino se est calculando. Escribe un programa para mostrar los coeficientes en forma de tringulo. A este tringulo se le conoce como Tringulo de Pascal o Tartaglia. 1 1 1 1 1 1 1 1 1 1 1 1 1 2 3 4 5 6 7 8 9 10 11 12 13 1 3 6 10 15 21 28 36 45 55 66 78

1 4 10 20 35 56 84 120 165 220 286

1 5 1 15 6 35 21 70 56 126 126 210 252 330 462 495 792 715 1287

1 7 28 84 210 462 924 1716

1 8 1 36 9 1 120 45 10 1 330 165 55 11 1 792 495 220 66 12 1 1716 1287 715 286 78 13 1

Solucin: Definicin de variables: n: cantidad de filas del tringulo o exponente del binomio + 1 i: fila actual j: columna actual coef: coeficiente binomial El Binomio de Newton (a+b)n tiene una forma conocida de desarrollo que nos evita tener que multiplicar n veces (a+b). Dicho desarrollo esta dado por:

a b

an 0!

na n b l!

n(n l)a n-2 b 2 2!

n n

l n 2 a n-3 b3 3!

...

______________________________________________________

162

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


De donde se puede observar que los coeficientes de cada uno de los trminos, son jrecisamente las combinaciones de n elementos tomados de r en r, esto es: Cnr = n! / [r!. (n- r)! ], y por lo tanto la relacin siguiente tambin se cumple.
n

C
r

n! r! n r !

n r 1

n r 1 r

Esta expresin ha sido indicada en el enunciado del problema, mediante la expresin coef =coef*(-j+l)/j. La similitud que existe entre el calcular simplemente el nmero combinatorio y los coeficientes del desarrollo del binomio (a+b)n es que cada uno de los coeficientes es el nmero combinatorio. Por lo tanto es un algoritmo similar al ejercicio anterior pero esta vez se incluir un bucle (el bucle i) que indica cuntos nmeros combinatorios (nmero de trminos del desarrollo del binomio) deseamos encontrar. Diagrama N/S nro = 1 Leer n Imprimir nro i = 1; i<=n; i = i +1

Imprimir nro j = l; j<=i; j=j+l nro = nro* (i-j + l)/j Imprimir nro

______________________________________________________

163

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejercicios propuestos Lea atentamente cada enunciado y plantee su solucin. Luego construya un diagrama N/S. 1. 2. Muestre todos los pares entre a y b , y diga cuntos son. Un nmero se considera perfecto si es igual a la suma de sus divisores menores que el. Escriba un programa para encontrar todos los nmeros perfectos dentro de un rango dado. Encuentre todos los nmeros primos de 3 dgitos. Un cubo perfecto o nmero Amstrong es aquel que sumados los cubos de sus dgitos nos dan el mismo nmero. Encuentre los 5 nicos cubos perfectos. Dos nmeros son amigos cuando la suma de los divisores de uno de ellos es igual al otro y viceversa. Muestre, si existen, los nmeros amigos donde ambos nmeros sean menores que n. Muestre todos los nmeros capicas o palndromos dentro de un rango determinado Un nmero es capica cuando al invertir sus cifras nos da el mismo nmero. Leern nmeros e indique el mayor, menor y el promedio. Lea n notas con sus respectivos pesos y obtenga el promedio ponderado. Construya la tabla de sumar del 1 al 20. Imprima el nmero 1, una vez; el 2, dos veces; el 3, tres veces; y as sucesivamente hasta llegar a un nmero n ingresado por teclado Si tenemos n dgitos y deseamos formar nmeros de r cifras (n r), Cuntos nmeros diferentes podemos obtener? Escriba un programa que muestre los n primeros nmeros de la secuencia de Fibonacci. Demuestre que la razn entre dos trminos consecutivos se aproxima a (1 + 5 )/2, este nmero es conocido como "el justo medio". Un vendedor hace n ventas. Por cada venta de hasta S/. 1000, recibe el 10% de comisin, por ventas de hasta S/. 3000 recibe 8% sobre el monto adicional a 1000, mientras que si llega a S/. 5000 recibir el 6% sobre el adicional a 3000, por ventas de hasta S/. 9000 recibir el 4% sobre el adicional a 5000, finalmente recibir el 2% por toda venta superior a S/. 9000. Cul es el total de sus ventas y cunto recibe de comisin por ellas? Dada una fecha dd/mm/aaaa, imprima el calendario correspondiente a ese mes. 164

3. 4.

5.

6.

7. 8. 9. 10. 11. 12.

13.

14.

______________________________________________________

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


15. Escriba un programa que genere todos los nmeros de 4 dgitos en base 6 y sus equivalentes en base 10. 16. Determinar la suma de los n primeros trminos de la serie: X/1 - X2/22 + X3/32 - X4I42 +X5/22 ...

______________________________________________________

165

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


3.8. ARREGLOS UNIDIMENCIONALES Los arreglos unidimensionales se caracterizan por permitir trabajar con memoria, es decir se podra ingresar tantos valores y estos no se perderan mientras el programa se este ejecutando.

Ejemplos: Ejemplo 3.8.1: Lea n nmeros almacnelos en un array e imprmalos. Solucin: Diagrama N/S Definicin de variables: n: nmero de elementos del array i: subndice del trmino actual x[ ]: array unidimensional Leer n i = 0; i<n; i = i+l

Leer x[ i ] Un array es un conjunto de i = 0; i<n; i = i+l datos referenciados con el mismo nombre, pero distinguidos mediante Imprimir x[i] un subndice, y en donde cada elemento es del mismo tipo. Cada uno de los elementos del array se referencia con el nombre del array (x) seguido y de un subndice ( i ). En JAVA, los subndices van desde 0, hasta [el lmite declarado para el array menos uno. En nuestra particular implementacin definimos un array de 50 elementos cada uno de tipo flotante con subndices vlidos desde 0 hasta 49, en este caso n puede asumir como mximo el valor de 50. Para poder leer cada uno de los elementos del array (x[i]), necesitamos conocer cuntos datos vamos a leer (n) y luego hacer un bucle para leer cada l uno de ellos haciendo variar el subndice (i) desde cero hasta n-1. Una vez ingresados los elementos solo debemos imprimirlos mediante otro bucle. ______________________________________________________ 166

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.8.2: Calcule la media aritmtica de un cojunto de datos. Solucin: Definicin de variables: n: nmero de elementos del array i: subndice del trmino actual s: suma de los elementos x[ ]: array unidimensional Diagrama N/S Leer n i = 0; i<n; i = i +1 Leer x[i ] s=0 i = 0; i<n; i = i+l s = s + x[i] Imprimir s/n

Primero leemos cuntos elementos vamos a ingresar (n) y mediante un bucle los leemos haciendo variar el subndice (i). La media aritmtica de un conjunto de datos se obtiene mediante la frmula:
x i n

media aritmtica

El numerador de esta expresin se calcula en el ltimo bucle utilizando el acumulador (s) previamente inicializado en cero. El denominador es un dato ingresado (n). Como ambos valores numerador (s) y denominador (n) son conocidos solo nos resta calcular s/n e imprimir el resultado.

______________________________________________________

167

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.8.3: Calcule la media armnica de un conjunto de datos. Solucin: Definicin de variables: n: nmero de elementos del array i: subndice del trmino actual s: suma de los elementos x[ ]: array unidimensional

Diagrama N/S Leer n i = 0; i<n; i = i+l Leer x[ i] s=0 i = 0; i<n; i =i+l s = s+ l/x[i] Imprimir n/s La media armnica se efine como "El inverso del promedio de los inversos". Matemticamente:

media armonica =

1 1/ x i n

Entonces, bastar con calcular la sumatoria de los inversos de los elementos ( B/x[i]), pues n es conocido. Este clculo lo hacemos en el ultimo bucle, por lo que al trmino de este solo nos resta calcular l/s/n o lo que es lo mismo n/s e imprimirlo.

______________________________________________________

168

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.8.4: Calcule la media geomtrica de un conjunto de datos. Solucin: Definicin de variables: n: nmero de elementos del array i: subndice del dato actual p: producto de los datos x[ ]: array unidimensional Diagrama N/S Leer n i = 0; i<n; i = i+l Leer x[i ] p=1 i = 0; i<n; i = i+1 p = p *x [ i ] Imprimir p1/n La media geomtrica se define como la raz ensima del producto de todos los datos. Matemticamente:

media geomtrica

[i])

Luego solo debemos calcular el producto de todos los elementos y obtener su raz ensima, tal como se muestra.

______________________________________________________

169

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.8.5: Calcule el promedio ponderado de un conjunto de datos Solucin:

Definicin de variables: n: nmero de elementos del array i: subndice del trmino actual valores[ ]: conjunto de elementos pesos[ ]: ponderaciones de los valores[i] sv: suma de los valores[i] sp: suma de los pesos[i] Diagrama N/S Leer n i = 0; i<n; i = i+l Leer valores [i], pesosfi] sv = 0 sp = 0 i = 0; i<n; i = i+l sv = sv +valores[i] * pesos[i] sp = sp + pesos [i] Imprimir sv/sp El promedio ponderado se usa cuando tenemos datos que tiene diferentes ponderaciones o pesos. Matemticamente:

P. ponderado

valores i *pesos i pesos i

Luego necesitamos calcular la sumatoria de los productos de valores[i] por pesos[i], y la sumatoria de pesos[i]. Esto se efecta en el ltimo bucle.

______________________________________________________

170

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Finalmente, nos queda dividir lichas sumatorias e imprimir el Resultado.

______________________________________________________

171

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.8.6: Diga si un elemento sse encuentra en un array, utilice la busqueda secuencial. Diagrama N/S Leer n i = 0; i<n; i = i+l Leer x[ i ] Leer elem band = 0 i = 0; i<n; i = i+l x[i] = elem V Imprimir i band = 1 band==0 V Imprimir "No lo encontr" Solucin; Definicin de variables: n: nmero de elementos del array i: subndice del trmino actual x[ ]: array unidimensional elem: elemento a buscar Una vez ingresados los n elementos en el array, leemos el valor que deseamos buscar (elem) y recorremos secuencialmente todos los elementos (uno despus del otro) comparando elem con cada elemento (x[i] == elem), en caso de ser iguales se mostrar el mensaje adecuado y se colocar la bandera band a 1, (la cual fue puesta inicialmente a 0) indicando que el elemento ha sido encontrado. Al terminar el bucle, preguntamos por la bandera band. Si sta an contina en 0, significar que el elemento no ha sido encontrado. F F

______________________________________________________

172

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.8.7: Elimine los elementos repetidos de un array. Bolucin: Definicin de variables: n: nmero de elementos del array i: subndice del trmino actual j: subndice del resto de trminos desde i hasta n k: subndice de los trminos desplazados lista[ ]: array unidimensional Debemos leer el nmero de elementos (n) e ingresarlos en el array. Luego necesitamos tomar cada elemento y compararlo con los restantes en caso pe ser uno igual al otro hay que eliminar el elemento repetido, copiando todos los elementos siguientes a una ubicacin anterior a su posicin actual y, pisminuyendo el nmero de elementos en uno (n= n-1). El primer bucle se mcarga de la lectura de los n elementos array. En los bucles [anidados (bucles i y j), el bucle ms externo bucle i), se encargar de tomar cada elemento lista[i], para comparado con el resto. Los elementos con los que lista[i] va a comparado, sern todos los elementos desde una posicin siguiente: Diagrama N/S Leer n i<n; i = i+l Leer lista[ i ] i = 0; i < n; i=i+1 j = i + l; j<n; j=j+l lista[i] = lista[j] i = 0; V k=j;k<n-l;k=k+l lista[k]=lista[k+l] n = n- 1 j =i Imprimir n i = 0; i<n; i = i+1 Imprimir lista[ i ] ______________________________________________________ 173 F del (el ser ser

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


(lista[i+l]) hasta el final de la lista. Esto se consigue en el bucle ms interno (el bucle j), donde j va desde i+1 hasta n-1. En este ltimo bucle se realizan las comparaciones entre lista[i] y Iista[j], si son iguales hay que copiar todos los elementos siguientes a una posicin anterior. De esto se encarga el bucle k, que va ha empezar a desplazar la lista desde j hasta el elemento final. Al salir del bucle es necesario disminuir n en 1 y hacer j = i, para volver a probar si el trmino que buscamos se encuentra nuevamente repetido, al hacer j = i y volverse a ejecutar el bucle j, ste automticamente sumar 1 a j, ocasionando que se vuelva a ejecutar el bucle j como si fuera la primera vez. Finalmente, imprimimos el nmero actual de elementos (n) y cada uno de ellos (Iista[i]).

______________________________________________________

174

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.8.8: Calcule la varianza y desviacin estndar de un conjunto de datos almacenados en un array. Solucin; La varianza y la desviacin estndar son medidas de la dispersin de los datos con respecto a la media. Si los datos son muy cercanos a la media, el valor de la varianza y la desviacin estndar es pequeo; sin embargo, si los datos estn muy dispersos ambas medidas sern grandes. Matemticamente:

x i varianza =
Donde:

x i desviacin estndar = n

x: es la media aritmtica de los elementos. x[i]: es el elemento i-simo. n: es la cantidad de elementos.

De las frmulas anteriores se observa que la desviacin estndar es la raz cuadrada de la varianza. Diagrama N/S Leer n i = 0; i<n; i = i +1 Leer x[ i ] s=0 i = 0; i<n; i = i+l s = s + x[i] media = s/n i = 0; i<n; i = i+l suma = suma + (x[i] - media)2 Imprimir suma/n, (suma/n)1/2

______________________________________________________

175

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Definicin de variables: n: nmero de elementos del array i: subndice del trmino actual x[ ]: array unidimensional s: suma de los n elementos media: media aritmtica del array suma: suma de los cuadrados de las diferencias de cada elemento respecto a la media Luego de leer n y los elementos del array, calculamos la media aritmtica, para lo cual inicializamos s en 0, y acumulamos todos los elementos del array para obtener la media mediante la operacin media=s/n. Seguidamente, calculamos la sumatoria de los cuadrados de las desviaciones de cada elemento respecto a la media ( (x[i] - media )2 ) y calculamos la varianza dividiendo esta sumatoria entre n. El clculo de la desviacin estndar es simple, pues basta con saber que es la raz cuadrada de la varianza.

______________________________________________________

176

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.8.9: Ajuste los pares de puntos (x,y) almacenados arrays x[ ], y [ ] a la recta y = ax + b, por el mtodo de regresin lineal.

Solucin: Este mtodo consiste en tomar pares de puntos (x, y) que guardan Ilguna relacin, y encontrar la ecuacin de la recta que ms se ajuste a nuestros atos, con el objeto de realizar un pronstico del tipo "si tenemos un x cunto aldry, teniendo en cuenta la serie de valores histricos". Se puede demostrar que dado los arrays x[] y y[ ] podemos ajustados a a recta y = ax + b, donde:
n n xi , yi x
2 i

xi xi
2

yi

yi n

x 2i x
2 i

xi xi
2

xi , yi

Definicin de variables: n: nmero de elementos i: subndice del trmino actual x[ ]: valores independientes y[ ]: valores dependientes sx: sumatoria de los x[i] sy: sumatoria de los y[i] sxx: sumatoria de los x[i]*x[i] sxy: sumatoria de los x[i]*y[i] a: coeficiente de x b: trmino independiente de x Comenzamos leyendo la fantidad de elementos (n), e igresamos los datos en los arrays ______________________________________________________

177

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Diagrama N/S Leer n i = 0;

i<n; i = i+l Leer x [i] i] i = 0; i<n; i = i+l Leer y [i] sx = 0 sy = 0 sxx = 0 sxy = 0 i = 0; i<n; i = i+l sx = sx + x[i] sy = sy + y[i] sxx = sxx + x[i]*x[i] sxy = sxy + *[i]*y[i] a = ( n*sxy - sx*sy ) / ( n*sxx - sx* sx ) b = (sy*sxx - sx*sxy)/ ( n*sxx - sx* sx ) Imprimir a, b

Si x[ ] y y[ ] en sus respectivos bucles. Posteriormente, en el ltimo bucle calculamos las sumatorias requeridas. Para esto hacemos uso de Jos acumuladores sx, sy, sxx y sxy que previamente han sido inicializados a 0. Finalmente, imprimimos la recta de regresin.

______________________________________________________

178

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.8.10: Ordene un conjunto de datos de menor a mayor por el mtodo de la burbuja array. n: nmero de elementos del array i: inicialmente indica los elementos del array que no estn ordenados j: indica los elementos que se van a comparar e intercambiar x[ ]: array unidimensional temporal: utilizada para el intercambio El mtodo de ordenamiento conocido como "mtodo de la burbuja", consiste en tomar el ltimo elemento y compararlo con el anterior y de ser necesario realizar el intercambio para que el elemento menor siempre que de delante; luego, se toma el penltimo elemento y se compara con el anterior y de ser necesario se realiza el intercambio; y as sucesivamente, hasta que el menor elemento de todo el array se encuentre en la primera posicin. Como el elemento menor ya esta en su sitio, ste debe obviarse en los siguientes pasos, y por lo tanto se repite todo el proceso pero sin considerar los elementos que van fcuedando en su sitio. Esto es implementado en nuestro Diagrama N/S. En primer lugar debemos leer los n elementos en el array x [i]. Diagrama N/S Leer n i<n; i = i+l Leer x[ i ] i = 1; i < n; i=i+1 j = n - 1; j >=i; j = j -1 x[j-l] > x[j] i = 0; V temporal = x[j-l] x[i-l] = x[j] x[j] = temporal Imprimir n i = 0; i<n; i = i+1 Imprimir x[i] F

______________________________________________________

179

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


En los bucles anidados, el bucle ms interno (el bucle j) recorre todos los elementos del array desde la ltima posicin (n-1) hasta la ltima ubicacin prdenada (i). En la primera iteracin ir comparando cada elemento con el anterior desde n-1 hasta i=l. Al llegar al elemento con subndice j=l (j>=i) se hace la comparacin x[0]>x[l], con lo cual aseguramos que fueron comparados todos los elementos, y que el elemento menor de todos ellos se encuentra en x[0]. Luego i se incrementa en 1, para que en el bucle j, el elemento x[0] al estar ordenado ya no sea tomado en cuenta. Posteriormente, se recorren los elementos sin ordenar desde la ltima posicin (n-1) hasta la ltima posicin no ordenada i, comparndolos e intercambindolos hasta finalizar el bucle i, esto es hasta que todos los elementos estn ordenados (hasta que la ltima posicin no ordenada sea la n-1). Finalmente, imprimimos el array correctamente ordenado.

______________________________________________________

180

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.8.11: Ordene un conjunto de datos de menor a mayor por el mtodo de de seleccin. Solucin: Definicin de variables: n: nmero de elementos del array i: subndice del trmino actual j: subndice para comparar los elementos sin ordenar k: subndice del elemento menor x[ ]: array unidimensional temporal: valor del elemento menor y es utilizada para el intercambio El "mtodo de seleccin", consiste en seleccionar el menor elemento del array y colocarlo en la primera ubicacin mediante el intercambio de valores. Entre los elementos restantes nuevamente buscamos el menor y lo colocamos en la segunda ubicacin, mediante el intercambio de valores; y as sucesivamente, hasta tener todos los elementos ordenados. Diagrama N/S Leer n i<n; i = i+l Leer x[ i ] i = 0; i<n-1: i = i+l k=i temporal = x[i] j=i+l; j<n; j=j + l x[j] < temporal V k=j temporal = x[j] x[k] = x[i] x[i] = temporal i = 0; i<n; i = i + 1 Imprimir x[i] i = 0;

______________________________________________________

181

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Una vez ledos los elementos y entrando al algoritmo de ordenamiento en s, la primera vez que se ejecuta el bucle i se hace la asignacin k=0 y temporal=x[0], aqu se est suponiendo que el menor elemento es el primero y corresponde al subndice 0 (esto es parte del algoritmo de buscar el menor elemento de un array). Luego se inicia el bucle j, y sirve para encontrar el menor elemento de todos, tomando como valor inicial de comparacin al primer elemento. Al trmino del bucle j, k contiene el subndice del menor elemento y temporal contiene el valor del menor elemento, los cuales sern intercambiados a la primera ubicacin no ordenada mediante la secuencia x[k] = x[i] seguida por x[i]=temporal. Estos pasos se repiten hasta tener todos los elementos ordenados, que corresponde a las comparaciones para el elemento n-2, pues solo podr compararse con el elemento n-1. (i<n-l). Finalmente solo nos resta imprimir el array ordenado.

______________________________________________________

182

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.8.12: Ordene un conjunto de datos de mayor a menorpor el mtodo de la insercin. Solucin: Definicin de variables: n: nmero de elementos del array i: indica cuantos elementos faltan ordenar j: sirve para comparar y desplazar los elementos x[ ]: array unidimensional temporal: valor del elemento que ser insertado. El "mtodo de insercin" consiste en tomar el segundo elemento e insertarlo junto al primero en la posicin que corresponda, luego tomar el tercer elemento e insertarlo entre los dos elementos en la posicin adecuada, continuamos con el cuarto elemento y lo insertamos entre los tres en la posicin adecuada; y as sucesivamente, hasta tomar el ltimo elemento. Tomemos el primer elemento x[0], luego los elementos restantes que queramos insertar sern desde i=l hasta i=n-l, que corresponden al bucle ms externo (bucle i) de los bucles anidados. Posteriormente, asignamos el elemento que deseamos insertar a la variable temporal y buscamos la posicin correcta donde se insertar. Esto ltimo se hace en el bucle j. As, se recorre todos los elementos ya ordenados desde la posicin ms alta y mientras el subndice sea vlido (j>=0) y el valor que deseamos insertar (temporal), sea menor que el elemento x[j]. Esto hace que realmente se ubique en la posicin correcta. DiagramaN/S Leer n i = 0; i<n; i = i+l Leer x[ i ] i = l; i<n; i = i +1 temporal = x[i] j=i-l; j>=0 AND temporal <x[ j]; j=j-l x[j+l]=x[j] x[j+1] = temporal i = 0; i<n; i = i + 1 Imprimir x[i] ______________________________________________________ 183

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


En cada iteracin del bucle j, se desplaza el elemento comparado x[j] hacia la posicin x[j+l] para hacerle sitio al elemento a insertar (temporal). Al trmino del bucle j, se habr encontrado la posicin adecuada para insertar temporal y por lo tanto se realiza la asignacin x[j+l] = temporal. Esta secuencia se vuelve a repetir hasta que se hallan insertado los n-1 elementos restantes (recuerde que se tomo el primero), en la posicin correcta de ordenamiento.

______________________________________________________

184

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


Ejemplo 3.8.13: Dado un nmero del da de un determinado ao, encuentre el da, mes y ao al que corresponde, sabiendo que: enero, marzo,mayo, julio, octubre y diciembre tienen 31 das; abril, junio, setiembre y noviembre tienen 30 das, y que febrero tiene 28 y 29 das segn sea un ao normal o un ao bisiesto. Por ejemplo, el da nmero 300 del ao 2000 es el 26/10/2000. Solucin: Definicin de variables: i: indica el mes (0... 11) annio: guarda el ao nrodia: nmero de da ledo dias[ ]: array. Almacena nmero de das de los meses suma: acumulador. Indica nmero de das hasta esa fecha Comenzamos inicializando los das que tiene cada mes en el array dias[ ]. Aqu hacemos la suposicin que se trata de un ao normal (dias[l]= 28) y en caso no ser cierto se proceder a su cambio (dias[l]= 29). Para esto mecesitamos recordar la condicin de bisiesto (ver Problema 2.8): (annio MOD 4 == 0) AND (annio MOD 100 != 0) OR (annio MOD 400 = 0) Diagrama N/S dias[ ] = { 31,28,31,3031,3031,31,3031,30,31} Leer nrodia, annio ( annio MOD 4==0)AND( (annio MOD 100*0) OR (annio MOD 400==0)) V das[l]=29 suma = 0 i=0 Mientras ( nrodia > suma ) suma = suma + dias[i] i = i+l suma = suma - dias[i-l] Imprimir (nrodia - suma), " /" , i, " /", annio ______________________________________________________ 185 F

Manual de Algoritmia www.cesarinweb.es.tl ___________________________________________________


En caso de que la anterior expresin sea cierta febrero tendr 29 das debiendo realizarse la asignacin dias[l] = 29. Debemos averiguar primero hasta que mes transcurri (i) para el nmero de das ingresados (nrodia). Esto se consigue acumulando todos los das de cada mes (suma), mientras el nmero de das (nrodia) sea mayor que los das acumulados (nrodia>suma). Como al trmino del bucle mientras, se acumul los das de un mes de ms, es necesario restar esos das de suma, esto se consigue mediante suma = suma -das[-l], el subndice resulta ser i-1, puesto que al trmino del bucle mientras se incremento i en 1. Luego, la fecha est compuesta por los das transcurridos del mes actual que son nrodia-suma, el mes es i (puesto que se le aumento 1 antes de salir del bucle), y el ao es annio.

______________________________________________________

186

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejercicios propuestos: Lea atentamente cada enunciado y plantee su solucin. Luego construya un diagrama N/S. 1) Encuentre el mayor y el menor elemento de un array. 2) Lea dos arrays A y B y diga que elementos de A no estn en B. 3) Lea un array e invierta las posiciones de sus datos. Por ejemplo, si el array es a[ ] = {1, 2, 3} al trmino del algoritmo debe ser a[ ] = {3, 2, 1}. 4) Se tienen dos arrays ordenados y se desea unirlos en un tercero pero manteniendo los datos ordenados. 5) Suponga que tiene n elementos en un array ordenado ascendentemente. Inserte un elemento en la posicin que corresponda para mantener el array ordenado. 6) Determine la cantidad de veces que aparece cada elemento de un array. 7) La moda de un conjunto de datos es el elemento que ms se repite. Encuentre la moda de elementos almacenados en un array. 8) Si tenemos un array ordenado. Encuentre un determinado elemento utilizando la bsqueda binaria. 9) Calcule la mediana de un conjunto de datos. La mediana en un array ordenado es el elemento central. Si el nmero de elementos del array es impar existe un nico elemento ubicado en el centro del array (el elemento con subndice n DIV 2 + 1). Si el nmero de elementos del array es par, existen dos elementos centrales (elementos con subndices n DIV 2 y n DIV 2 +1), la mediana estar dada por el promedio de ambos. 10) Lea dos arrays x[ ] y y ( ] calcule su recta de regresin y determine cul ser el valor de y conociendo el valor de x. 11) Se tiene un vector de n dimensiones. Si dicho vector se representa mediante un array la longitud del vector estar dada por longitud

x i

. Lea un vector y calcule su longitud.

12) Sean dos vectores x e y el producto escalar se define como x y x y cos es la magnitud del vector y es el ngulo que forman. Sin embargo, si se conocen sus coordenadas rectangulares en el espacio Rn el producto escalar se reduce a la siguiente ai bi . Lea las coordenadas de los vectores en el expresin: a b espacio Rn, almacnelos en un array y calcule su producto escalar. 187

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________

CAPITULO IV INTRODUCCIN A JAVA

4.1.

INTRODUCCIN Y MOTIVACIN Este capitulo le introduce al estudiante a conocer el fundamento y estructura del lenguaje de programacin Java para la resolucin de algoritmos.

4.2.

QUE ES JAVA? Hacia 1990, James Gosling, quien trabaja para Sun Microsystems, fue el encargado de crear programas para controlar aparatos electrnicos domsticos. Originalmente Gosling y su equipo empezaron el diseo de su software usando C++, debido a su orientacin a objetos. Sin embargo, se dieron cuenta que C++ no satisfaca los proyectos que se tenan en mente; encontraron dificultades con aspectos complicados de C++ como la herencia mltiple de clases, errores de programacin (bugs) relacionados con huecos de memoria. De esta manera Gosling decidi que tena que empezar por escribir un lenguaje simplificado que le evitara todos los problemas que se encontr con C++. 188

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Aunque a Gosling no le import la complejidad de lenguajes como C++, tomo la sintaxis bsica y la orientacin a objetos del lenguaje. Cuando termin el nuevo lenguaje lo llam Oak (se cuenta que el nombre le vino a Gosling mientras vea un roble por la ventana de su oficina.) Oak se uso por primera vez en un proyecto llamado Proyecto Green, donde el equipo de desarrollo intent disear un sistema de control para usar dentro del hogar. Este sistema de control permitira al usuario manipular distintos dispositivos, como televisiones, video caseteras, luces caseras y telfonos, todo desde una computadora de mano llamada *7 (Star Seven). El sistema *7 inclua una pantalla sensible para que el dueo seleccionara y controlara estos dispositivos. La pantalla del *7 tena diversas figuras, entre las que se encontraba Duke (la actual mascota de Java). Duke ha sido incluido en muchos ejemplos de applets en la pgina de Sun Microsystems. El siguiente paso para Oak fue el proyecto Video En Demanda (VOD), en el que el lenguaje era usado como la base para el software que controlara un sistema de televisin interactivo. Aunque ni *7 ni el proyecto VOD concluyeron en productos actuales, le dieron a Oak una oportunidad de crecer y madurar. Con el tiempo Sun Microsystems descubri que el nombre Oak ya haba sido usado y le cambi el nombre por Java, y vio nacer un lenguaje poderoso y sencillo. Java es un lenguaje independiente de la plataforma, lo que significa que los programas desarrollados en Java corrern en cualquier sistema sin cambios. Esta independencia de plataforma se logr usando un formato especial para los programas compilados en Java. Este formato de archivo, llamado "byte-code" puede ser ledo y ejecutado por cualquier computadora que tenga un intrprete de Java. Este intrprete de Java, por supuesto, debe ser escrito especialmente para el sistema en el que correr. En 1993, despus de que Internet se transform de un ambiente basado en texto a un ambiente grfico, el equipo de Java se dio cuenta de que el lenguaje sera perfecto para la programacin en el Web. As naci la idea de los applets, que son pequeos programas que pueden ser incluidos en pginas de Web, y tambin surgi la idea de escribir 189

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
un navegador de Web que demostrara el poder del lenguaje, este navegador es el HotJava. Finalmente, hacia mayo de 1995, Sun Microsystems anunci oficialmente a Java. El nuevo lenguaje fue aceptado como una poderosa herramienta para el desarrollo de aplicaciones para Internet. Netscape Communications, e l creador del navegador Netscape Navigator, dio soporte a Java desde su versin 2.0. Otros desarrolladores de software tambin incluyeron soporte para Java, incluyendo al Internet Explorer 3 de Microsoft. Actualmente, Java puede correr en mquinas con procesadores SPARC, Intel, Digital. De acuerdo con Sun Microsystems, Java es "simple, orientado a objetos, tipificado e s t t i c a m e n t e , compilado, independiente de arquitectura, multi-procesos, con recolector de basura, robusto, seguro y ampliable." Es simple porque los desarrolladores en Java deliberadamente dejan muchas de las caractersticas innecesarias de otros lenguajes de programacin de alto nivel. Por ejemplo, Java no soporta aritmtica de apuntadores, cast de tipos implcito, estructuras o uniones, sobrecarga de operadores, plantillas, archivos de cabecera o mltiple herencia. Es orientado a objetos, porque como C++, Java usa clases para organizar el cdigo en mdulos. En tiempo de ejecucin, un programa crea objetos a partir de las clases. Las clases en Java pueden heredar de otras clases, pero la mltiple herencia, donde una clase hereda mtodos y datos de varias clases, no est permitida. Es tipificado estticamente porque todos los objetos usados en un programa deben ser declarados antes de que puedan ser usados. Esto permite al compilador de Java localizar y reportar conflictos con los tipos de datos. Es compilado porque antes de que se pueda correr un programa, primero tiene que ser compilado por el compilador de Java. El resultado de la compilacin es el archivo "byte-code", que, similar a un archivo con cdigo mquina, puede ser ejecutado bajo cualquier sistema operativo que tenga un intrprete de Java. Este intrprete lee el

190

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
archivo byte-code y traduce los comandos en comandos de lenguaje mquina que pueden ser ejecutados directamente por la computadora. Es multiprocesos porque los programas de Java pueden contener mltiples procesos en ejecucin, lo que permite a los programas manejar varias tareas simultneamente. Por ejemplo, un programa multiprocesos puede definir una imagen (render) en un proceso mientras continua aceptando entrada del teclado en el proceso principal. Todas las aplicaciones tienen al menos un proceso (llamado thread) que representa la ejecucin del programa. Tiene recolector de basura, ya que los programas de Java no se encargan de liberar de memoria los objetos, esto es una tarea del administrador de memoria y el recolector de basura. Es robusto porque el intrprete de Java revisa todos los accesos al sistema dentro de un programa, por esto, los programas desarrollados en Java no pueden tirar el sistema. Esto es, cuando un error serio es encontrado, los programas en Java crean una excepcin. Esta excepcin puede ser capturada y manejada por el programa sin el riesgo de bloquear el sistema. Es seguro porque el compilador no slo verifica todos los accesos a memoria, sino que tambin se asegura que no entren virus en un applet en ejecucin. Ya que los apuntadores no son soportados por el lenguaje, los programas no pueden acceder a reas del sistema a las que no tienen autorizacin. Es ampliable porque los programas en Java soportan mtodos nativos, que son funciones escr itas en o tr o s leng uaj es, general mente C++. Este so p or te a mtodos nativos permite a los programadores escribir funciones que pueden ser ejecutadas ms rpido que las funciones equivalentes escritas en Java. Los mtodos nativos son ligados a los programas en forma dinmica, es decir, son asociados con los programas en tiempo de ejecucin. Ventajas de Java. Es seguro. Se aprende con facilidad. Es orientado a objetos. No bloquea el sistema. 191

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Aplicaciones para comunicacin en red. No tiene aritmtica de apuntadores. Es independiente de la plataforma. Soportado por Microsoft.

Caracteristicas de Java Java tiene las siguientes caractersticas: La Mquina Virtual de Java (JVM) Recoleccin de basura Seguridad en el cdigo La especificacin de la Mquina Virtual de Java define a sta como: "Una mquina imaginaria que es implantada por la emulacin de software en una mquina real. El cdigo para la JVM es almacenado en archivos .class, cada uno contiene cdigo para al menos una clase pblica". Esta especificacin permite a los programas Java ser independientes de la plataforma porque la compilacin es hecha por una mquina genrica. Al intrprete de Java de cada plataforma de hardware le corresponde asegurar la ejecucin del cdigo compilado para la JVM. Muchos lenguajes de programacin permiten el alojamiento dinmico de memoria en tiempo de ejecucin. Este proceso vara en la sintaxis de los lenguajes, pero siempre hay un valor de retorno de un apuntador a la direccin de inicio d e l bloque de memoria. Una vez que la memoria ocupada ya no se necesita, el programa o el ambiente de ejecucin debera liberar la memoria para prevenir que el programa corra sin memoria disponible. En C y C++ (y otros lenguajes), el programador es responsable de liberar la memoria. Esto puede ser tedioso, porque no se sabe con anticipacin cuando se va a l i b e r a r memoria. Los programas que no liberan memoria pueden bloquear el sistema cuando no queda memoria disponible. Java quita esa responsabilidad de liberar memoria explcitamente integrando un proceso a nivel de sistema que sigue cada alojamiento de memoria y mantiene una cuenta del nmero de referencias a cada apuntador a memoria. Durante los intervalos de tiempo de ocio en la JVM, el proceso de recoleccin de basura revisa si 192

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
hay apuntadores a memoria donde el nmero de referencias es igual a cero. Si hay algunos, el bloque de memoria marcado por el recolector es liberado. Una vez compilados los programas en Java, en el momento de ejecucin se lleva a cabo una tarea de carga, revisin y ejecucin. La carga consta de cargar en memoria el archivo byte-code, puede cargarse desde la mquina local o remotamente a travs de la red. La revisin consta de verificar que no haya: violaciones de acceso, operaciones que conduzcan a "overflow" o "underflow", tipos de parmetros incorrectos, conversiones de datos incorrectas, acceso a objetos sin inicializar, entre otras funciones. En el proceso de ejecucin ya se corren las instrucciones del programa. Comentarios Los comentarios en Java se pueden escribir en tres formas: // comentario de una lnea /* comentario de una o ms lneas */ /** comentario para documentacin */ Los comentarios de documentacin se colocan justo antes de la variable o funcin. Estos sirven para el programa javadoc, el cual genera archivos html, y sirven como una descripcin del tpico declarado. Identificadores En Java, un identificador empieza con una letra, el carcter de subraya o el signo $. Los dems caracteres pueden contener dgitos. Todos los identificadores son sensibles a maysculas / minsculas. Ejemplos de identificadores validos: variable nombre Usuario Nombre_Usuario _numero $cadena

193

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Los ltimos tres ejemplos son muy poco usados en la generalidad de los programas. Los identificadores pueden contener palabras reservadas, pero no pueden ser palabras reservadas; por ejemplo, es valido integer, pero no int. Palabras reservadas abstract boolean break byte case catch char class continu e default do double else extends false final finally float for if implement s import instanceof int interface long native new null package private protected public return short static super switch synchronize d this throw throws transie nt true try void volatile while

Nota.- En Java, true, false y null se escriben en minsculas, al contrario que en C++. No existe un operador sizeof; el tamao y representacin de todos los tipos es fija y no es dependiente de la implantacin. Las palabras goto y const no se usan en Java. Tipos de Datos y Operadores Tipode Datos Logico El tipo de datos boolean (8 bits) puede tomar dos valores posibles: true y false El tipo boolean no toma valores numricos En Java no se considera cero como falso y distinto de cero como verdadero (como sucede en C/C++) No existe conversio n entre tipos enteros y tipos logicos 194

Manual de Algoritmia int i = 10 if ( i ) { ... } Error de compilacin Tipo de datos de Texto

www.cesarinweb.es.tl ; int i = 10 ; if ( i != 0 ) { ... } Correcto

___________________________________________________

El tipo char (16 bits) representa solo un caracter Unicode El codigo universal Unicode incluye el codigo ASCII y comprende los caracteres graficos de practicamente todos los idiomas (japons, chino, braille...) El literal de texto debe ir entre comillas simples Utiliza la siguiente notacion: caracteres simples: a caracteres especiales: \t, \n caracteres Unicode (con 4 digitos en hexadecimal): \u00BF Tipo de datos Real Existen dos tipos de datos reales: float(32 bits) y double(64 bits) Un literal es de punto flotante si lleva: un punto decimal: 3.14159, 2.0 una E o e (valor exponencial): 105e25, 1.05E27 una F o f (float): 279F, 2.79f una D o d (double): 279D, 2.79d Un literal real por defecto siempre se considera de tipo double, si no se indica explicitamente que es un float

195

Manual de Algoritmia Tipo de datos Entero

www.cesarinweb.es.tl

___________________________________________________
Existen cuatro tipos de datos enteros: byte (8 bits), short (16 bits), int (32 bits) y long(64 bits) Todos los tipos tienen signo. El cero se considera positivo Los literales enteros se pueden representar con notacion: decimal: 2, 156, 56453645 octal: 077, 07700 (empezando con un cero) hexadecimal: 0xABFF, 0xCC00 (empezando con 0x) Por defecto siempre se consideran de tipo int Seguido de L se considera long: 156L, 077L, 0xABFFL

Tipo de datos Referencia Un tipo referencia guarda un puntero a la direccion donde se ubica el objeto (32 bits) Solo puede almacenar direcciones de objetos de su propio Tipo Ejemplo: Ordenador pc , sun ; Usuario user ; pc = new Ordenador ( ) ; user = pc ; sun = pc ;

Error de compilacion Correcto

Todas las clases son de tipo referencia El valor que toma por defecto una variable de tipo referencia es null

Cadenas de Caracteres La clase String permite manejar cadenas de caracteres 196

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
El literal String debe ir entre comillas dobles Se puede crear una cadena de caracteres de dos formas: String nombre = new String(Pepe); String nombre = Pepe; a a Para concatenar dos cadenas se utiliza el operador + Pepe + Prez No se guarda el caracter de fin de cadena PepePrez

Memoria Asignada a una Variable Tipo primitivo : se asigna la cantidad de memoria que requiere el tipo de la variable Ejemplo: long x ; 64 bits X ????

Tipo referencia: se asigna el espacio correspondiente a una direccion de memoria (32 bits) Ejemplo: Computer pc ; String cadena ; Fecha reunion ; 32 bits pc ????

32 bits cadena 32 bits reunion ???? 197 ????

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Conversin de Tipos La conversion de tipos (casting) se debe realizar entre tipos de la misma naturaleza: numricos o referencia Al convertir un tipo a un tamao mas peque o se puede perder la informacion de los bits de mayor peso La sintaxis es: Ejemplo: (<tipo>) <expresin>

byte num8bits = (byte) 27 ; int num32bits = 27 ; num8bits = (byte) num32bits ; short a , b , c ; c=a+b; c = (short)(b + c) ;

Ejemplo:

Error, + devuelve int Correcto

Operadores Java(I) Operadores unarios: +, Operadores aritmticos: +, -, *, /, % (resto de la division) Operadores de asignacin: =, +=, -=, *=, /=, %= <var> += <expr> <var> = <var> + <expr> Operadores incrementales: ++, -precediendo a la variable: ++<var>, --<var> siguiendo a la variable: <var>++, <var>-Operadores Java(II) Operadores relacionales: == (igual), != (distinto), >, <, >=, <= Operadores lgicos: && (AND), II (OR), ! (NOT), & (AND), I (OR) && y II realizan evaluacion perezosa: opi && op2 si opi es false, no se evala op2 198

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
opi || op2 si opi es true, no se evala op2

& y I siempre evalan los dos operadores Operador instanceof: <objeto> instanceof <clase> determina si un objeto pertenece a una clase

Operadores Java(III) Operador condicional: ? : <exprBooleana> ? <valori> : <valor2> Permite bifurcaciones condicionales sencillas Operadores a nivel de bits: >>, <<, >>>, &, I, ^, ~ opi >> ndesplaza los bits de opi (con signo) a la derecha n posiciones opi << ndesplaza los bits de opi (con signo) a la izquierda n posiciones opi >>> n desplaza los bits de opi (sin signo) a la derecha n posiciones opi & op2 Operador AND a nivel de bits opi | op2 Operador OR a nivel de bits opi ^ op2 Operador XOR a nivel de bits ~opiOperador complemento (NOT a nivel de bits)

Procedencia de Operadores Todos los operadores binarios se evalan de izquiorda a derocha, excepto los operadores de asignacion

199

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Tipo Operadores sufijos Operadores unarios Creacion y casting Multiplicativos Aditivos Desplazamiento Relacional Igualdad AND (bits) OR exclusivo (bits) OR inclusivo (bits) AND lo gic o OR lo gico Condicio na l ?: Asignacio n O pera do r [] . (argumentos) expr++ expr-++ expr expr - expr expr ~ ! new (tipo) expr * / % + << >> >>> < > <= >= instanceof == != & ^ I && II = += -= *= /= %= &= ^= |= <<= >>= >>>=

'a' Letra a '\t' Un tabulador '\u????' Un carcter especifico, ???? es reemplazado con cuatro dgitos hexadecimales.

Modificadores Dentro de las palabras reservadas, Java utiliza las siguientes para modificar el acceso a una variable, clase o funcin y se colocan al inicio de la declaracin: public, protected, default, private. El modificador public da acceso a cualquier objeto externo. public int numero; // cualquier objeto puede accesar a esta variable El modificador protected da acceso a objetos que son parte del mismo paquete, y las subclases. (Ms adelante se explica el concepto de paquete) 200

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
El modificador default da acceso a objetos que son parte del mismo paquete. Sin embargo, en los programas no se especifica el modificador porque no hay una palabra para ello. int numero; // acceso default El modificador private da acceso nicamente a la clase que lo contiene. private int numero; // nicamente lo puede accesar la clase

Convenciones en la programacin Clases.- Los nombres de las clases deberan ser sustantivos, utilizando maysculas para la primera letra y minsculas para las restantes, y se pueden mezclar varios sustantivos. class CuentaBancaria Interfaces.- Los nombres de las interfaces deberan tener la primera letra mayscula, como en los nombres de clase. interface Cuenta Mtodos.- Los nombres de los mtodos deberan ser verbos, todo el verbo en minscula. Se pueden agregar sustantivos con la primera letra en mayscula. Evitar el uso de subrayas. void revisarCuenta() Constantes.- Las constantes de tipos de datos primitivos deberan escribirse completamente en maysculas y separadas las palabras por subrayas. Las constantes de objeto pueden combinar maysculas y minsculas final int MAX_CREDITO Variables.- Todas las variables deberan ser en minsculas, y si se agregan palabras se separarn con una letra mayscula. Evitar el uso del signo $.

201

Manual de Algoritmia primerUsuario

www.cesarinweb.es.tl

___________________________________________________
Las variables deben tener significado e indicar su uso. Las variables de una letra deberan evitarse, excepto las que suelen usarse en ciclos (x, y, i, j) para controlarlo. Otras convenciones de la programacin incluyen el uso de llaves ({}) alrededor de un bloque de instrucciones, incluso cuando se trate de una sola instruccin, ya que esto ayuda en el mantenimiento del programa. if(condicin) { bloque } El espaciado ayuda en la comprensin del programa. Se sugiere escribir una instruccin por lnea y usar indentacin de uno o dos espacios. Los comentarios tambin ayudan en la comprensin y mantenimiento del programa al dar una descripcin clara de lo que hace cada funcin y el uso de las variables. Ejemplo: // primer programa en Java public class HelloWorld { public static void main(String argv[]) { System.out.println("Hello world!"); } } En detalle: // primer programa en Java La primera lnea es un comentario.

202

Manual de Algoritmia public class HelloWorld {

www.cesarinweb.es.tl

___________________________________________________

Las siguientes dos lneas son la declaracin de la clase, que al momento de ser compilado el programa, generar un archivo .class. Es importante que el nombre de la clase sea el mismo que el nombre del archivo: si la clase se va a llamar HelloWorld, el archivo se debe llamar HelloWorld.java. public static void main(String argv[]) { En las siguientes dos lneas se declara el inicio del programa. Para que el intrprete de Java pueda ejecutar el programa debe tener la misma sintaxis (excepto para el nombre del parmetro de main). Se declara public para que lo pueda accesar el intrprete de Java. Se declara static porque no se ha creado algn objeto y no se crea una instancia. Se declara void porque no se regresa valor alguno. En este ejemplo no se va a esperar parmetros de la lnea de comandos. En argv[] se guardan los parmetros y la primera posicin contiene el primer parmetro, no el nombre del programa: argv[0] parametro1 argv[1] parametro2 System.out.println("Hello world!"); Referencia: En java cuando comenzamos a realizar cualquier tipo de programa, se debe tener encuenta que el nombre de la clase debe ser igual al nombre del archivo que almacena el programa

203

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________

CAPITULO V EL LENGUAJE

5.1.

INTRODUCCIN Y MOTIVACIN Este capitulo le introduce al estudiante a conocer la estructura bsica del lenguaje Java, sintaxis y aplicaciones de estructuras de control en la resolucin de problemas basados en algoritmos.

5.2.

INICIALIZACIN DE VARIABLES EN JAVA Java no permite que una variable tenga un valor indefinido. Cuando un objeto es creado, sus variables son inicializadas con los siguientes valores: byte 0 short 0 int 0 long 0L float 0.0F double 0.0D char '\u0000' (NULO) boolean false todas las referencias null

204

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Si algn objeto hace referencia a algo con valor de null, crear una excepcin (un error que es manejable). Para evitar que las variables tengan valores indeseables, se debe asignrseles algn valor til. El compilador estudia el cdigo para determinar que cada variable ha sido inicializada antes de su primer uso. Si el compilador no puede determinar esto, entonces ocurre un error en tiempo de compilacin. public void calcula() { int x = (int)(Math.random() * 100); int y; int z; if(x > 50) { y = 9; } z = y + x; // el posible uso antes de la inicializacin de y creara un error de compilacin }

Expresiones lgicas Los operadores relacionales y lgicos regresan un valor boolean. En Java no existe conversin automtica de int a boolean, como en C++. int i = 1; if(i) // error en tiempo de compilacin if(i != 0) // correcto Operadores y su Precedencia Los operadores en Java son muy similares en estilo y funcin a aquellos en C y C++. La siguiente tabla enlista los operadores por orden de precedencia:

205

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Separador DaI IaD IaD IaD IaD IaD IaD DaI DaI . [] () ; , ++ -- + - ~ ! I a D * / % + << >> < > <= >= instanceof == != I a D & ^IaD | && I a D || ?: = *= /= %= += -= <<= >>= &= ^= |=

El operador + se puede utilizar para concatenar cadenas de caracteres, produciendo una nueva: String saludo = "Sr. "; String nombre = "Luis " + "Torres"; String persona = saludo + nombre; Los operadores && (and) y || (or) realizan una evaluacin corta en expresiones lgicas. Por ejemplo: String unset = null; if((unset != null) && (unset.length() > 5)) { // hacer algo con unset } La expresin que forma a if() es legal y completamente segura. Esto es porque la primera subexpresin es falsa, y es suficiente para probar que toda la expresin es falsa. El operador && omite la evaluacin de la segunda subexpresin y una excepcin de null pointer es evitada. De forma similar, si se usa el operador || y la primera subexpresin es verdadera, la segunda subexpresin no es evaluada porque toda la expresin es verdadera. Cast Cuando la asignacin de valores no es compatible por los tipos de datos, se usa un cast para persuadir al compilador de reconocer tal asignacin. Esto se puede hacer para asignar un long a un int, por ejemplo. 206

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
long bigValue = 99L; int smallValue = (int)(bigValue); No es necesario el segundo grupo de parntesis, los que encierran a bigValue, pero es muy recomendable dejarlos. Aunque short y char ocupan 16 bits, se debe hacer un cast explcito, debido al rango que tienen asignado.

Flujo de programa Sentencia if/else. Permite elegir una de dos opciones. La sintaxis bsica de la sentencia if/else es: if ( <exprBooleana> ) <sentencia> ; if ( <exprBooleana> ) { <grupoSentencias 1> ; } else { <grupoSentencias 2> ; } if ( <exprBooleana> ) { <grupoSentencias > ; }

if ( <exprBooleana> ) { <grupoSentencias > ; } 207

Manual de Algoritmia else { if ( <exprBooleana> ) { <grupoSentencias > ; } } Ejemplo:

www.cesarinweb.es.tl

___________________________________________________

int aleatorio = (int)(Math.random() * 100); if(aleatorio < 50) { System.out.println("menor a 50"); } else { System.out.println("mayor o igual a 50"); }

Sentencia Switch. Permite seleccionar una de varias opciones. La sintaxis para switch es la siguiente: switch(expresin_a_evaluar) { case valor1: instrucciones; break; case valor2: instrucciones; break; case valor3: instrucciones; break; default: instrucciones; break; }

208

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
El valor de expresion_a_evaluar debe ser compatible con el tipo int, como short, byte y char. No se permite evaluar long o valores de punto flotante. Ejemplo: switch(colorNum) { case 0: setBackground(Color.red); break; case 1: setBackground(Color.green); break; case 2: setBackground(Color.blue); break; default: setBackground(Color.black); break; } La sentencia For. Permite realizar una serie de instrucciones mientras se cumple una condicin. La sintaxis bsica para for es: for(inicializacin;condicin;alteracin) { instrucciones; } Ejemplo: int x; for(x = 0;x < 10;x++) { System.out.println("dentro de for"); } System.out.println("fin de for"); El tercer parmetro puede ser tanto de incremento como de decremento, y no nicamente de uno en uno. Java permite el uso de comas dentro de la declaracin de for, como en C, por lo que lo siguiente es legal:

for(i = 0, j = 0;j < 10;i++,j++) 209

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
En el ejemplo anterior, la variable x es "visible" en el mtodo en el que es declarada. Se puede usar una variable que sea visible nicamente para el ciclo for: for(int x=0;x<10;x++) { ... } // una vez terminado el ciclo, x ya no puede ser accesada

La sentencia While. Permite realizar una serie de instrucciones mientras se cumple una condicin. La sintaxis bsica de while es: while(condicin) { instrucciones; } Ejemplo: int i = 0; while(i<15) { System.out.println("dentro de while"); i+=2; } La sentencia do/while. Permite realizar una serie de instrucciones hasta que deje de cumplirse una condicin. La sintaxis bsica de la sentencia es: do { instrucciones; } while(condicin); 210

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo: int i = 0; do { System.out.println("dentro de while"); i++; } while(i<10);

Paquetes Java provee el mecanismo de paquetes (package) como una forma de organizar las clases. Se puede indicar que las clases en el cdigo fuente van a pertenecer a un paquete empleando la palabra package. package empresa.sistemas; public class Empleado { ... } $ javac -d <ruta> Archivo.java La declaracin de paquete, si la hay, debe estar al inicio del cdigo fuente, puede estar precedida nicamente de comentarios. Solo se permite una declaracin package por archivo fuente. Los nombres de los paquetes son jerrquicos, separados por puntos. Por lo general, los elementos de los paquetes son escritos enteramente en minsculas. Una vez compilado el archivo, puede ser usado por otro mediante la sentencia import, que indica donde se encuentran los paquetes. Import debe preceder a todas las declaraciones de clases. import empresa.sistemas.*; public class JefeArea extends Empleado { String departamento; 211

Manual de Algoritmia Empleado subordinados[]; ... } ARRAYS

www.cesarinweb.es.tl

___________________________________________________

Los arrays son estructuras de memoria que almacenan en una variable multiples valores del mismo tipo Los arrays son objetos se crean con new Se utilizan los corchetes, [ ], para declarar el array y para acceder a sus elementos Pueden ser de cualquier tipo (primitivo o referencia) Declaracion de arrays: <tipo> <variable>[]; o int a[]; equivale a <tipo>[] <variable>; int[] a;

int a[], b, c; (a es un array; b y c son enteros) int[] a, b, c; (a, b y c son arrays) RECOMENDADO

Instanciacin de Arrays Creacion de objetos array: <variable> = new <tipo> [<tamao>]; Al crear el objeto, el numero de elementos (<tamao>) se guarda en un atributo llamado length El primer elemento del array esta en la posicion 0 y el ultimo, en la posicion length-& int[] a = new int[20]; a[0] = &5; int i = a[0]; System.out.println(a.length); System.out.println(i); I5

20 212

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
a length: 20 0 I I8 I9
0 0

...

0 0

Inicializacin de Arrays Cuando se instancia un objeto array, sus elementos se inicializan al valor por defecto del tipo orrespondiente Si se conocen los valores iniciales de cada elemento, se pueden inicializar con los valores entre llaves y separados por comas (a la vez que se declara) int[] cuadrados = {0, &, 4, 9}; equivale a int[] cuadrados = new int[4]; cuadrados[0] = 0; cuadrados[&] = &; cuadrados[2] = 4; cuadrados[3] = 9; Arrays Multidimensionales En Java los arrays son todos de una dimension. Un array bidimensional es un array de arrays Se necesita un conjunto de corchetes por cada dimension int[] unAnno = new int[&2]; int[][] tresAnnos = new int[3][&2];

Ejemplos de Arrays int[] digitos = {0, &, 2, 3, 4, 5, 6, 7, 8, 9}; 213

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
String[] dias = {lunes,martes,mircoles,jueves, viernes,sbado,domingo}; Fecha[] festivos = { new Fecha ( &, &, 2000), new Fecha ( &5, 5, 2000), new Fecha ( &2, &0, 2000), new Fecha ( 6, &2, 2000), } Recorrido de una lista: int[] lista = new lista[&0]; for (int i = 0; i < lista.length; i++) { System.out.println(lista[i]); }

Ejemplo de Arrays Multidimensionales

Arrays Bidimensionales No Rectangulares Un array de 2 dimensiones se puede crear sin especificar el tamao de su segunda dimension int[][] tresAnnos = new int[3][]; tresAnnos[0] = new int[&2]; tresAnnos[&] = new int[&2]; tresAnnos[2] = new int[&2];

214

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Si se indica solo una dimension, sta debe ser la primera int[][] tresAnnos = new int[][3]; ERROR

Esta separacion permite crear arrays no rectangulares tresAnnos[0] = new int[&2]; tresAnnos[&] = new int[5]; tresAnnos[2] = new int[9];

Inicializacin de Arrays Multidimensionales Se necesita un conjunto de datos entre llaves para cada dimension int[][] matriz = { {&, 2, 3}, {4, 5, 6} }; equivale a int[][] matriz = new int[2][3]; matriz[0][0] = &; matriz[0][&] = 2; matriz[0][2] = 3; matriz[&][0] = 4; matriz[&][&] = 5; matriz[&][2] = 6;

215

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________

CAPITULO VI PROGRAMACIN ORIENTADO A OBJETOS (POO)

6.1.

INTRODUCCIN Y MOTIVACIN Este capitulo le introduce al estudiante a conocer los fundamentos bsicos de la programacin orientado a objetos y sus beneficios en el proceso de codificar un programa.

6.2.

CLASE Una clase es una plantilla o prototipo que define las variables y los mtodos comunes a todos los objetos de cierto tipo. Las clases definen estado (variables) y comportamiento (mtodos) de todos los objetos. Las clases son el mecanismo por el que se pueden crear nuevos Tipos en Java. Las clases son el punto central sobre el que giran la mayora de los conceptos de la Orientacin a Objetos. Una clase es una agrupacin de datos y de cdigo (mtodos) que acta sobre esos datos, a la que se le da un nombre.

216

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Una clase contiene: Datos (se denominan Datos Miembro). Estos pueden ser de tipos primitivos o referencias. Mtodos (se denominan Mtodos Miembro). La sintaxis general para la declaracin de una clase es: modificadores class nombre_clase { declaraciones_de_miembros; } Los modificadores son palabras clave que afectan al comportamiento de la clase. Por ejemplo crearemos la clase Rectangulo cuyos atributos son base y altura, ademas queremos calcular el area, permetro y diagonal del Rectangulo import java.io.*; class Rectangulo{ private double base; private double altura; public Rectangulo(double b, double h) // Constructor { base = b; altura=h; } public void setBase(double b) { base=b; } public void setAltura(double h) { altura=h; } public double getBase() { return base; } public double getAltura() { return altura; } 217

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
public double area() { return base*altura; } public double perimetro() { return 2*base+2*altura; } public double diagonal() { return Math.sqrt(Math.pow(base,2)+Math.pow(altura,2)); } public String toString() { return "base = "+base+" "+altura; } } La clase Rectngulo tiene 2 atributos base y altura los cuales son privados esto quiere decir que estas 2 variables son visibles en la clase Rectngulo. El primer mtodo que se ha implementado es el constructor , este mtodo se llama igual que la clase y no devuelve ningn valor y permite inicializar los atributos de la clase. Este mtodo se llama en el momento de crear un objeto. Como los atributos base y altura son privados, para que los usuarios que usan los objetos puedan modificar los atributos se crean los mtodos setBase(double b) y setAltura(double h). Y si deseamos obtener los valores de los atributos creamos los mtodos getBase() y getAltura(). Adems se han creado los mtodos area(), permetro() y diagonal() que permiten calcular el area, permetro y diagonal del rectangulo. En el mtodo toString() (a cadena) se crea una cadena con la informacin de los atributos de la clase. En realidad podemos colocar cualquier informacin.

218

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
public class pruebaRectangulo{ public static void main(String args[]) throws IOException { BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); double b, h; Rectangulo R; System.out.print("Ingrese base : "); b=Double.parseDouble(br.readLine()); System.out.print("Ingrese altura : "); h=Double.parseDouble(br.readLine()); R = new Rectangulo(b,h); System.out.println("Rectangulo : "+R); System.out.println("Area : "+R.area()); System.out.println(Perimetro : +R.perimetro()); System.out.println("Diagonal : "+R.diagonal()); } } Dentro del metodo main de la clase PruebaRectangulo se ha declarado dos variables de tipo primitivo b,h y una variable R que es de tipo Rectangulo. Al colocar : Rectangulo R; Se esta declarando a R como un Objeto de la Clase Rectangulo. La declaracin no crea nuevos objetos. En la declaracin (Rectangulo R) se declara una variable llamada R la cual ser usada para referirnos a un Objeto Rectangulo. La referencia esta vaca. Una referencia vaca es conocida como referencia nula. Al colocar : R = new Rectangulo(3,4); Con el operador new creamos un objeto de la clase Rectangulo.El operador new instancia una clase asignando memoria para el nuevo Objeto. El operador new requiere una llamada a un constructor de la clase a instanciar. El constructor inicializa el nuevo objeto.El operador new retorna una referencia al objeto creado. 219

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Una vez creado el objeto para poder llamar a sus metodos usamos lo siguiente objeto.nombredeMtodo. Por ejemplo para calcular el area usamos R.area(), para calcular el permetro R.perimetro() y para calcular la diagonal R.diagonal(). Al escribir System.out.println(Rectangulo : +R); en realidad se esta llamando tcitamente al mtodo toString de la clase R. Si se deseara modificar el atributo base del Objeto se debe usar el mtodo setBase por ejemplo si despus de crear el objeto queremos que base tenga el valor 10, se colocaria la siguiente instruccin: R.setBase(10); lo mismo se hace si se quiere modificar la altura. Si se desea saber el valor de algn atributo del objeto se usa los mtodos get, por ejemplo si quisiera imprimir el valor de la base del objeto R se tendria que escribir lo siguiente : System.out.println(La base es : +R.getBase());

Ejercicios:

1. Crear la clase Cilindro con atributos radio y altura y que se pueda calcular el area y el volumen del cilindro. 2. Crear la clase numeros que tenga como atributos dos numeros y se calcule su suma, resta, multiplicacin, divisin. 3. Crear la clase Alumno que tenga como atributos nombre, nota1 y nota2 y permita calcular el promedio y su condicion (aprobado o desaprobado) 4. Crear la clase Trabajador que tenga como atributos nombre, preciHora y horasTrabajadas y se calcule salario Bruto, impuestos( 10% del Salario Bruto) y salario Neto (Salario Bruto Impuestos) 5. Crear la clase Movil con atributos velocidad Inicial, aceleracin y tiempo y se pueda calcular el espacio recorrido por el mvil 6. Crear la clase Cilindro con atributos radio y altura y que se pueda calcular el area y el volumen del cilindro.

220

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
import java.io.*; class Cilindro{ private double radio; private double altura; public Cilindro(double r, double a) { radio=r; altura=a; } public void setRadio(double r) { radio=r; } public void setAltura(double a) { altura=a; } public double getRadio() { return radio; } public double getAltura() { return altura; } public double area() { return 2*Math.PI*Math.pow(radio,2)+2*Math.PI*radio*altura; }

221

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
public double volumen() { return Math.PI*Math.pow(radio,2)*altura; } public String toString() { return "Radio = "+radio+" Altura = "+altura; } }

public class PruebaCilindro { public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); double r, h; Cilindro C; System.out.print("Ingrese radio: "); r=Double.parseDouble(br.readLine()); System.out.print("Ingrese altura : "); h=Double.parseDouble(br.readLine()); C = new Cilindro(r,h); System.out.println("Cilindro : "+C); System.out.println("Area : "+C.area()); System.out.println("Volumen : "+C.volumen()); } } 2) Crear la clase numeros que tenga como atributos dos numeros y se calcule su suma, resta, multiplicacin, divisin. import java.io.*; class Numeros{ private double numero1; private double numero2; public Numeros(double n1,double n2) { 222

Manual de Algoritmia numero1=n1; numero2=n2; }

www.cesarinweb.es.tl

___________________________________________________

public void setNumero1(double n1) { numero1=n1; } public void setNumero2(double n2) { numero2=n2; } public double getNumero1() { return numero1; } public double getNumero2() { return numero2; } public double suma() { return numero1+numero2; } public double resta() { return numero1-numero2; } public double multiplicacion() { return numero1*numero2; }

223

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
public double division() { return numero1/numero2; } public String toString() { return "numero1 = "+numero1+" numero2 = "+numero2; } }

public class PruebaNumeros { public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); double n1,n2; Numeros A; System.out.print("Ingrese primero Numero : "); n1=Double.parseDouble(br.readLine()); System.out.print("Ingrese segundo Numero: "); n2=Double.parseDouble(br.readLine()); A = new Numeros(n1,n2); System.out.println("Numeros : "+A); System.out.println("suma : "+A.suma()); System.out.println("resta : "+A.resta()); System.out.println("Multiplicacion : "+A.multiplicacion()); System.out.println("Division : "+A.division()); } }

3) Crear la clase Alumno que tenga como atributos nombre, nota1 y nota2 y permita calcular el promedio y su condicion (aprobado o desaprobado) 224

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
import java.io.*; class Alumno{ private String nombre; private double nota1; private double nota2; public Alumno(String nom, double n1, double n2) { nombre=nom; nota1=n1; nota2=n2; } public void setNombre(String nom) { nombre=nom; } public void setNota1(double n1) { nota1=n1; } public void setNota2(double n2) { nota2=n2; } public String getNombre() { return nombre; } public double getNota1() { return nota1; } public double getNota2() 225

Manual de Algoritmia { return nota2; }

www.cesarinweb.es.tl

___________________________________________________

public double promedio() { return (nota1+nota2)/2; } public String condicion() { if(promedio()>=10.5) return "aprobado"; else return "desaprobado"; } public String toString() { return "nombre : "+nombre +"nota1 = "+nota1+" nota2 = "+nota2; } } public class PruebaAlumno{ public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String nom; double n1,n2; Alumno A; System.out.print("Ingrese nombre : "); nom= br.readLine(); System.out.print("Ingrese nota1 : "); n1=Double.parseDouble(br.readLine()); System.out.print("Ingrese nota2 : "); n2=Double.parseDouble(br.readLine()); A = new Alumno(nom,n1,n2); System.out.println("Alumno : "+A); System.out.println("Promedio : "+A.promedio()); 226

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
System.out.println("Condicion : "+A.condicion()); } } 4) Crear la clase Trabajador que tenga como atributos nombre, preciHora y horasTrabajadas y se calcule salario Bruto, impuestos( 10% del Salario Bruto) y salario Neto (Salario Bruto Impuestos) import java.io.*; class Trabajador{ private String nombre; private double horasTrabajadas; private double precioHora; public Trabajador(String nom, double ht, double ph) { nombre=nom; horasTrabajadas=ht; precioHora=ph; } public void setNombre(String nom) { nombre=nom; } public void setHorasTrabajadas(double ht) { horasTrabajadas=ht; } public void setPrecioHora(double ph) { precioHora=ph; } public String getNombre() { return nombre; } 227

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
public double getHorasTrabajadas() { return horasTrabajadas; } public double getPrecioHora() { return precioHora; } public double salarioBruto() { return precioHora*horasTrabajadas; } public double impuestos() { return 0.10*salarioBruto(); } public double salarioNeto() { return salarioBruto()-impuestos(); } public String toString() { return "nombre : "+nombre+ " Horas Trabajadas : "+horasTrabajadas+" Precio Hora : "+precioHora; } }

public class PruebaTrabajador { public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String nom; 228

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
double ph,ht; Trabajador T; System.out.print("Ingrese nombre : "); nom= br.readLine(); System.out.print("Ingrese numero de horas Trabajadas : "); ht=Double.parseDouble(br.readLine()); System.out.print("Ingrese precio de la Hora : "); ph=Double.parseDouble(br.readLine()); T = new Trabajador(nom,ht,ph); System.out.println("Trabajador : "+T); System.out.println("Salario Bruto : "+T.salarioBruto()); System.out.println("Impuestos : "+T.impuestos()); System.out.println("Salario Neto : "+T.salarioNeto()); } } 5) Crear la clase Mvil con atributos velocidad Inicial, aceleracin y tiempo y se pueda calcular el espacio recorrido por el mvil import java.io.*; class Movil{ private double velocidadInicial; private double aceleracion; private double tiempo; public Movil(double vi, double a, double t) { velocidadInicial=vi; aceleracion=a; tiempo=t; } public void setVelocidadInicial(double vi) { velocidadInicial=vi; } public void setAceleracion(double a) { aceleracion=a; 229

Manual de Algoritmia }

www.cesarinweb.es.tl

___________________________________________________
public void setTiempo(double t) { tiempo=t; } public double getVelocidadInicial() { return velocidadInicial; } public double getAceleracion() { return aceleracion; } public double getTiempo() { return tiempo; } public String toString() { return "Velocidad Inicial = "+velocidadInicial+" Aceleracion = "+aceleracion+"Tiempo = "+tiempo; }

public double espacioRecorrido() { return velocidadInicial*tiempo+(1.0/2.0)*aceleracion*Math.pow(tiempo,2); } } public class PruebaMovil { 230

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
public static void main(String args[]) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); double vi,a,t; Movil M; System.out.print("Ingrese velocidad Inicial : "); vi=Double.parseDouble(br.readLine()); System.out.print("Ingrese aceleracion : "); a=Double.parseDouble(br.readLine()); System.out.print("Ingrese tiempo : "); t=Double.parseDouble(br.readLine()); M = new Movil(vi,a,t); System.out.println("Movil : "+M); System.out.println("Espacio Recorrido "+M.espacioRecorrido()); } } 6.3. CONTROLANDO EL ACCESO A LOS MIEMBROS DE UNA CLASE Private: El nivel de acceso ms restrictivo es private. Un miembro private es accesible solo en la clase en la cual es definida. Se debe usar este acceso para declarar miembros que solamente deben ser usados en la clase. Para declarar un miembro privado, se usa la palabra private en su declaracin. La siguiente clase contiene una variable miembro privada y un mtodo privado. class Alpha { private int x; private void privateMethod() { System.out.println("privateMethod"); } } Protected Permite que las clases, subclases y todas las clases del mismo paquete puedan acceder a sus miembros. 231

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Public Cualquier clase en cualquier paquete tienen acceso a miembros publicos de las clases. Ejm: package Greek; public class Alpha { public int iampublic; public void publicMethod() { System.out.println("publicMethod"); } } import Greek.*; class Beta { void accessMethod() { Alpha a = new Alpha(); a.iampublic = 10; // legal a.publicMethod(); // legal } } Package El nivel de acceso package es el que se obtiene si no se coloca explcitamente otros niveles de acceso. Este nivel de acceso permite a las clases en el mismo paquete como su clases acceder a los miembros. Este nivel de acceso asume que clases en el mismo paquete son amigas de confianza. Ejemplo: package Greek; class Alpha { int iampackage; void packageMethod() { System.out.println("packageMethod"); } 232

Manual de Algoritmia }

www.cesarinweb.es.tl

___________________________________________________
En la clase Alpha iampackage y packageMethodo tienen acceso nivel de acceso package. Todas las clases declaradas dentro del mismo paquete como Alpha tambin tienen acceso a iampackage y packageMethod. Supongan que Alpha y Beta fueron declaradas como parte del paquete Greek Package package Greek; class Beta { void accessMethod() { Alpha a = new Alpha(); a.iampackage = 10; // legal a.packageMethod(); // legal } } Beta puede legalmente acceder a iampackage y packageMethod como se muestra. La referencia this Cada objeto tiene acceso a una referencia a si mismo, llamada referencia this. La referencia this se usa explcitamente para referirse tanto a los atributos como a los metodos de un objeto. Ejemplo: class Numero{ private int x; public Numero(int x) { this.x = x; } public void setX(int x) { this.x = x; } public String toString() { 233

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Return x = +this.x; } } Por ejemplo en el constructor el nombre del Parametro es x y el nombre del atributo de la clase es x. Para que Java no se confunda se utiliza this.x para referirse al atributo de la clase. Miembros de clase Estaticos Cada objeto de una clase tiene su propia copia de todas las variables de ejemplar de clase. En ciertos casos, una sola copia de la variable en particular debe ser compartida por todos los objetos de la clase. Por esta y otras razones utilizamos las variables de clase static (estticas). Una variable de clase static representa informacin que abarca toda la clase. La declaracin de un mtodo esttico comienza con la palabra clave static. Ejemplo:

import java.io.*; class Empleado{ private String nombres; private String apellidos; private static int contador;

public Empleado(String nom, String ape) { nombres=nom; apellidos=ape; contador++; } public void finalize() { --contador; } 234

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
public void setNombres(String nom) { nombres=nom; } public void setApellidos(String ape) { apellidos=ape; } public static void setContador(int cont) { contador=cont; } public String getNombres() { return nombres; } public String getApellidos() { return apellidos; } public static int getContador() { return contador; } public String toString() { return apellidos+" "+nombres; } } public class pruebaEmpleadoVariableEstatica{ public static void main(String args[] ) throws IOException { System.out.println(Numero de objetos creados : +Empleado.getContador()); 235

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Empleado e1= new Empleado("Torres","Fidel"); System.out.println(e1); System.out.println("Nmero de objetos creados : "+e1.getContador()); Empleado e2= new Empleado("Villanueva","Nelsa"); System.out.println(e2); System.out.println("Nmero de objetos creados : "+Empleado.getContador()); } } En el programa anterior usamos un atributo private static y un mtodo public static. El atributo contador se inicializa en cero por omisin. Esta variable va contando el numero de Objetos de la Clase Empleado que se van creando, esta variable se va incrementando en el constructor cada vez que se crea un objeto. Para saber cuantos objetos hemos creados llamamos al mtodo estatico getContador() que devuelve el valor de la variable contador. Un mtodo declarado static no puede acceder a miembros de clase no estticos. Un mtodo static no tiene referencia this porque las variables de clase static y los mtodos static existen independientemente de que existan o no objetos de clase. En la primera linea del Programa colocamos llamamos Empleado.getContador() pues como es un mtodo exttico no es necesario usar un objeto de la clase par llamar al mtodo, solo se usa el nombre de la Clase y luego el mtodo getContador(). 6.4. HERENCIA A travs de la herencia, una clase nueva hereda los atributos y mtodos de una superclase previamente definida. En este caso decimos que la nueva clase es una subclase. En la herencia simple, una clase se hereda de una superclase. Java no reconoce la herencia mltiple, pero si maneja el concepto de interfaces. Las interfaces ayudan a java a lograr muchas de las ventajas de la herencia mltiple. Una subclase normalmente agrega sus propios atributos y mtodos. De modo que una subclase generalmente es mayor que su superclase. Una subclase es ms especfica que su superclase y representa un grupo ms pequeo de objetos. El verdadero valor de la herencia radica en la 236

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
capacidad de definir en la subclase adiciones a las caractersticas heredadas de la superclase o sustituciones de estas. Todo objeto de una subclase es tambin un objeto de la superclase de esa subclase. Sin embargo no se cumple lo opuesto: los objetos de una superclase no son objetos de las subclases de esa superclase. Las relaciones de herencia forman estructuras jerrquicas similares a un rbol. Una superclase existe en una relacin Jerrquica con sus subclases. Sin duda, una clase puede existir sola, pero es cuando una clase se emplea con el mecanismo de herencia que se convierte ya sea en una superclase que proporciona atributos y comportamientos a otras clases, o en una subclase que hereda dichos atributos y comportamientos. Ejemplos: Persona

Empleado Profesor Contador

Estudiante Universitario

Religiosos Instituto Colegio

Por ejemplo en una ciudad existen Personas las cuales pueden ser Empleados, Estudiantes, Religiosos. Los Empleados pueden ser Profesor, Contador. Los estudiantes pueden ser Universitarios, de Institutos y Colegios.

Miembros Protected Los miembros protected de una superclase slo estn accesibles para los mtodos de la superclase, los mtodos de las subclases y los mtodos de otras clases del mismo paquete. Relacion entre Objetos de superclase y objetos de subclase Un objeto de una subclase se puede tratar como objeto de su superclase correspondiente. Esto hace posible ciertas manipulaciones interesantes. Por ejemplo, a pesar del hecho de que los objetos de diversas clases derivadas de una superclase en particular pueden ser muy diferentes entre s, podemos crear un arreglo de ellos, en tanto los tratemos como objetos de la superclase. Lo contrario no se cumple un objeto de una superclase no es automticamente tambin un objeto de la subclase. 237

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
import java.io.*; class Punto{ protected double x; protected double y; public Punto() { x=0; y=0; } public Punto(double a, double b) { x=a; y=b; } public void setX(double a) { x=a; } public void setY(double b) { y=b; } public double getX() { return x; } public double getY() { return y; } public String toString() { 238

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
return "("+x+","+y+")"; } } class Circulo extends Punto{ protected double radio; public Circulo() { super(); radio=0; } public Circulo(double a, double b, double r) { super(a,b); radio=r; } public void setRadio(double a) { radio=a; } public double getRadio() { return radio; } public double area() { return Math.PI*Math.pow(radio,2); } public String toString() { return "Centro = "+super.toString()+" Radio = "+radio; } } 239

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
public class HerenciaPuntoCirculo{ public static void main(String args[]) throws IOException { Punto P= new Punto(3,4); Circulo C=new Circulo(6,9,12); System.out.println(P); System.out.println(C); // Como circulo hereda de Punto se puede hacer // la asignacion P=C pero no a la inversa. P=C; System.out.println("Circulo via Punto"+P); // Si se trabaja con P para calcular el area primero debemos // Convertir P a tipo Circulo. System.out.println("Area del Circulo : "+((Circulo)P).area()); } } La clase Circulo hereda de la clase Punto esto se especifica en: class Circulo extends Punto{ La palabra clave extends (extiende) de la definicin de clase indica herencia. Todos los miembros (no private) de la clase Punto se heredan en la clase Circulo. Los constructores de Circulo deben invocar al constructor de Punto para inicializar la porcin de superclase de un objeto de la clase Circulo. La primer lnea del cuerpo de cada constructor invoca al constructor de Punto mediante la referencia a super. Una subclase pude redefinir un mtodo de superclase empleando el mismo nombre, esto se denomina supeditar un mtodo de superclase. Se puede usar la referencia super seguida por el operador punto para acceder a la versin de superclase de ese mtodo desde la subclase. En el ejemplo anterior la clase Circulo supedita el mtodo toString() de la clase Punto. Conversin implicita de objeto de SubClase a objeto de SuperClase 240

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Una referencia a un objeto de subclase puede convertirse implcitamente en una referencia a un objeto de superclase porque un objeto de subclase es un objeto de superclase gracias a la herencia Composicin frente a herencia La relacin es un se implementa mediante la herencia. La relacin tiene un en la que una clase puede tener objetos de otras clases como miembros; tales relaciones crean clases nuevas mediante la composicin de clases ya existentes 6.5. CLASES ABSTRACTAS Java proporciona un tipo especial de clase, llamada clase abstracta, que pueden ayudar a la organizacin de clases basadas en mtodos comunes. Una clase abstracta permite colocar los nombres de los mtodos comunes en una sola clase (sin tener que escribir el cdigo que los implemente). Despus, al crear nuevas clases, stas pueden derivar de una clase abstracta que contiene una serie de mtodos requeridos. Los mtodos abstractos contienen slo el nombre del mtodo seguido de una lista de parmetros. No contiene el cdigo que implementa el mtodo (esto se deja para las clases derivadas. Las clases que contienen mtodos abstractos se conocen como clases abstractas Un programa no puede crear instancias de una clase abstracta de forma directa, es necesario crear instancias de sus subclases. Las clases abstractas pueden contener una mezcla de mtodos abstractos y no abstractos (concretos). Los mtodos concretos contienen la instrumentacin del mtodo Cualquier subclase que extienda a la clase abstracta debe proporcionar la instrumentacin de todos los mtodos abstractos. En caso contrario, la subclase misma se convierte en clase abstracta. Por ejemplo, las siguientes instrucciones definen una clase abstracta llamada InsectosVoladores: public abstract class InsectosVoladores{ public abstract int volar(float velocidad); // Aqu pueden ir otros mtodos } public class Abeja extends InsectosVoladores{ 241

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
private String nombreEspecie; public int volar(float velocidad) { // Aqu se especifica como hacer volar una abeja } } La clase abstracta tiene un mtodo sin implementacin. Al crear la clase Abeja , se debe implementar el mtodo. Como se ve, las clases abstractas en cierta forma obligan a crear y utilizar los mtodos que definen.

6.6.

POLIMORFISMO Mediante el polimorfismo, se pueden escribir programas que procesen genricamente como objetos de superclase- objetos de todas las clases existentes en una jerarqua. Las clases que no existen durante el desarrollo de los programas se pueden agregar con poca o ninguna modificacin de la parte genrica del programa, en tanto esas clases formen parte de la jerarqua que se esta procesando genricamente. Ejemplos:

import java.io.*; abstract class Empleado{ protected String apellidos; protected String nombres; public Empleado(String ape, String nom) { apellidos=ape; nombres=nom; } public void setApellidos(String ape) { apellidos=ape; 242

Manual de Algoritmia }

www.cesarinweb.es.tl

___________________________________________________
public void setNombres(String nom) { nombres = nom; } public String getApellidos() { return apellidos; } public String getNombres() { return nombres; } abstract double ganancias(); }

final class Jefe extends Empleado{ public double salario; public Jefe(String ape, String nom,double s) { super(ape,nom); salario=s; } public void setSalario(double s) { salario=s; } public double getSalario() { return salario; }

243

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
public double ganancias() { return salario; } public String toString() { return "Jefe : "+apellidos+" "+nombres; } } final class EmpleadoPorComision extends Empleado { private double salarioBase; // salario Base private double comisionPorArticulo; // comision por articulo vendido private int cantidadDeArticulos; // cantidad de articulos vendidos public EmpleadoPorComision(String ape, String nom,double sb, double com, int cant) { super(ape,nom); salarioBase=sb; comisionPorArticulo=com; cantidadDeArticulos=cant; } public void setSalarioBase(double sb) { salarioBase=sb; } public void setComisionPorArticulo(double com) { comisionPorArticulo=com; } public void setCantidadDeArticulos(int cant) { cantidadDeArticulos=cant; } 244

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
public double getSalarioBase() { return salarioBase; } public double getComisionPorArticulo() { return comisionPorArticulo; } public int getCantidad() { return cantidadDeArticulos; } public String toString() { return "Empleado "+nombres; }

por

Comision

"+apellidos+"

public double ganancias() { return salarioBase+comisionPorArticulo*cantidadDeArticulos; } } final class EmpleadoADestajo extends Empleado{ private double salarioPorPieza; private int cantidad; public EmpleadoADestajo(String ape, String nom,double sp, int cant) { super(ape,nom); salarioPorPieza=sp; cantidad=cant; } 245

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
public void setSalarioPorPieza(double sp) { salarioPorPieza = sp; } public void setCantidad(int cant) { cantidad=cant; } public double getSalarioPorPieza() { return salarioPorPieza; } public double getCantidad() { return cantidad; } public double ganancias() { return salarioPorPieza*cantidad; } public String toString() { return "Empleado a Destajo : "+apellidos+" "+nombres; } } final class EmpleadoPorHora extends Empleado { protected double salarioPorHora; protected double horasTrabajadas; public EmpleadoPorHora(String ape, String nom, double sh, double ht) { super(ape,nom); salarioPorHora= sh; 246

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
horasTrabajadas=ht; } public void setSalarioPorHora(double sh) { salarioPorHora=sh; } public void setHorasTrabajadas(double ht) { horasTrabajadas=ht; } public double getSalarioPorHora() { return salarioPorHora; } public double getHorasTrabajadas() { return horasTrabajadas; } public String toString() { return "Empleado por Hora : "+apellidos+" "+nombres; } public double ganancias() { return salarioPorHora*horasTrabajadas; } } public class PruebaEmpleado{ public static void main(String args[]) { Empleado E; Jefe J=new Jefe("Torres","Marcelino",2500); EmpleadoPorComision C=new 247

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
EmpleadoPorComision("Zavaleta","Juan",300,4,200); EmpleadoPorHora H = new EmpleadoPorHora("Narvaez","Robinson",10,40); EmpleadoADestajo D = new EmpleadoADestajo("Marin","Alejandro",20,5); E = J; System.out.println(E.toString()+" gano "+E.ganancias()); E = C; System.out.println(E.toString()+" gano "+E.ganancias()); E = H; System.out.println(E.toString()+" gano "+E.ganancias()); E = D; System.out.println(E.toString()+" gano "+E.ganancias()); } } La Linea E = J; Coloca en la referencia de la Superclase E una referencia al objeto J de la subclase Jefe. Esto es precisamente lo que debemos hacer para lograr un comportamienteo Polimorfico. La expresion : E.toString() Innvoca al metodo toString() del objeto al que E hace referencia. El sistema invoca al mtodo toString() del objeto de la subclase, precisamente lo que se llama comportamiento polimorfico. Esta llamada de metodo es un ejemplo de ligado dinamico de mtodos; la decision respecto a cual mtodo invocar se aplaza hasta el momento de ejecucion. 248

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
La llamada al Metodo E.ganancias() invoca al metodo ganancias del objeto al que E hace referencia. El sistema invoca el metodo ganancias del objeto de la subclase en lugar del metodo ganancias de la superclase. Esto es otro ejemplo de ligado dinamico de metodos.

import java.io.*; abstract class Figura{ public double area() { return 0; } public double volumen() { return 0; } public abstract String getNombre(); } class Punto extends Figura{ protected double x; protected double y; public Punto(double a, double b) { x=a; y=b; } public void setX(double x) { this.x=x; } public void setY(double y) 249

Manual de Algoritmia { this.y=y; } public double getX() { return x; } public double getY() { return y; }

www.cesarinweb.es.tl

___________________________________________________

public String toString() { return "("+x+","+y+")"; } public String getNombre() { return "Punto"; } } class Circulo extends Punto{ protected double radio; public Circulo(double a, double b, double r) { super(a,b); radio=r; } public void setRadio(double r) { radio=r; } 250

Manual de Algoritmia public double getRadio() { return radio; }

www.cesarinweb.es.tl

___________________________________________________

public double area() { return Math.PI*Math.pow(radio,2); } public String toString() { return "Centro "+ super.toString()+", Radio = "+radio; } public String getNombre() { return "Circulo"; } } class Cilindro extends Circulo{ protected double altura; public Cilindro(double a,double b, double r, double h) { super(a,b,r); altura=h; } public void setAltura(double h) { altura=h; } public double getAltura() { return altura; }

251

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
public double area() { return 2*super.area()+2*Math.PI*radio*altura; }

public double volumen() { return super.area()*altura; } public String toString() { return super.toString()+ "; Altura = "+altura; } public String getNombre() { return "Cilindro"; } } public class PruebaFigura{ public static void main(String args[]) throws IOException { Punto p = new Punto(3,4); Circulo c = new Circulo(12,20,10); Cilindro k = new Cilindro (100,100,50,25); Figura F[] = new Figura[3]; F[0]=p; F[1]=c; F[2]=k; System.out.println(p.getNombre()+" : "+p); System.out.println(c.getNombre()+" : "+c); System.out.println(k.getNombre()+" : "+k);

252

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
// Procesamos ahora el arreglo de Figuras e imprimimos el nombre, area y volumen // de cada objeto for(int i=0;i<3;i++) { System.out.println(); System.out.println(F[i].getNombre()+" : "+F[i]); System.out.println("Area ="+F[i].area()); System.out.println("Volumen"+F[i].volumen()); System.out.println("============="); }

} } 6.7. INTERFACES El concepto de interface lleva un paso ms adelante la idea de las clases abstractas. En Java una interface es una clase abstracta pura, es decir una clase donde todos los mtodos son abstractos (no se implementa ninguno). Permite al diseador de clases establecer la forma de una clase (nombres de mtodos, listas de argumentos y tipos de retorno, pero no bloques de cdigo). Una interface puede tambin contener datos miembro, pero estos son siempre static y final. Una interface sirve para establecer un 'protocolo' entre clases. Para crear una interface, se utiliza la palabra clave interface en lugar de class. La interface puede definirse public o sin modificador de acceso, y tiene el mismo significado que para las clases. Todos los mtodos que declara una interface son siempre public. Para indicar que una clase implementa los mtodos de una interface se utiliza la palabra clave implements. El compilador se encargar de verificar que la clase efectivamente declare e implemente todos los mtodos de la interface. Una clase puede implementar ms de una interface. Una interface se declara: 253

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
interface nombre_interface { tipo_retorno nombre_metodo ( lista_argumentos ) ; ... } Por ejemplo: interface InstrumentoMusical { void tocar(); void afinar(); String tipoInstrumento(); } Y una clase que implementa la interface: class InstrumentoViento InstrumentoMusical { void tocar() { . . . }; void afinar() { . . .}; String tipoInstrumento() {} } extends Object implements

class Guitarra extends InstrumentoViento { String tipoInstrumento() { return "Guitarra"; } } La clase InstrumentoViento implementa la interface, declarando los mtodos y escribiendo el cdigo correspondiente. Una clase derivada puede tambin redefinir si es necesario alguno de los mtodos de la interface. Referencias a Interfaces Es posible crear referencias a interfaces, pero las interfaces no pueden ser instanciadas. Una referencia a una interface puede ser asignada a cualquier objeto que implemente la interface. Por ejemplo: InstrumentoMusical instrumento = new Guitarra(); instrumento.play(); 254

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
System.out.prinln(instrumento.tipoInstrumento()); InstrumentoMusical i2 = new InstrumentoMusical(); //error.No se puede instanciar Extensin de interfaces Las interfaces pueden extender otras interfaces y, a diferencia de las clases, una interface puede extender ms de una interface. La sintaxis es: interface nombre_interface extends nombre_interface , . . . { tipo_retorno nombre_metodo ( lista_argumentos ) ; ... } Agrupaciones de constantes Dado que, por definicin, todos los datos miembros que se definen en una interface son static y final, y dado que las interfaces no pueden instanciarse resultan una buena herramienta para implantar grupos de constantes. Por ejemplo: public interface Meses { int ENERO = 1 , FEBRERO = 2 . . . ; String [] NOMBRES_MESES = { " " , "Enero" , "Febrero" , . . . }; } Esto puede usarse simplemente: System.out.println(Meses.NOMBRES_MESES[ENERO]); Un ejemplo casi real El ejemplo mostrado a continuacin es una simplificacin de como funciona realmente la gestin de eventos en el sistema grfico de usuario soportado por el API de Java (AWT o swing). Se han cambiado los nombres y se ha simplificado para mostrar un caso real en que el uso de interfaces resuelve un problema concreto. Supongamos que tenemos una clase que representa un botn de accin en un entorno grfico de usuario (el tpico botn de confirmacin de una accin o de cancelacin). Esta clase pertenecer a una amplia jerarqua de clases y tendr mecanismos complejos de definicin y uso que no 255

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
son objeto del ejemplo. Sin embargo podramos pensar que la clase Boton tiene miembros como los siguientes. class Boton extends . . . { protected int x , y, ancho, alto; // posicion del boton protected String texto; // texto del boton Boton(. . .) { ... } void dibujar() { . . .} public void asignarTexto(String t) { . . .} public String obtenerTexto() { . . .) ... } Lo que aqu nos interesa es ver lo que sucede cuando el usuario, utilizando el ratn pulsa sobre el botn. Supongamos que la clase Boton tiene un mtodo, de nombre por ejemplo click(), que es invocado por el gestor de ventanas cuando ha detectado que el usuario ha pulsado el botn del ratn sobre l. El botn deber realizar alguna accin como dibujarse en posicin 'pulsado' (si tiene efectos de tres dimensiones) y adems, probablemente, querr informar a alguien de que se ha producido la accin del usuario. Es en este mecanismo de 'notificacin' donde entra el concepto de interface. Para ello definimos una interface Oyente de la siguiente forma: interface Oyente { void botonPulsado(Boton b); } La interface define un nico mtodo botonPulsado. La idea es que este mtodo sea invocado por la clase Boton cuando el usuario pulse el botn. Para que esto sea posible en algn momento hay que notificar al Boton quien es el Oyente que debe ser notificado. La clase Boton quedara: class Boton extends . . . { ... private Oyente oyente; void registrarOyente(Oyente o) { oyente = o; } 256

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
void click() { ... oyente.botonPulsado(this); } } El mtodo registrarOyente sirve para que alguien pueda 'apuntarse' como receptor de las acciones del usuario. Obsrvese que existe una referencia de tipo Oyente. A Boton no le importa que clase va a recibir su notificacin. Simplemente le importa que implante la interface Oyente para poder invocar el mtodo botonPulsado. En el mtodo click se invoca este mtodo. En el ejemplo se le pasa como parmetro una referencia al propio objeto Boton. En la realidad lo que se pasa es un objeto 'Evento' con informacin detallada de lo que ha ocurrido. Con todo esto la clase que utiliza este mecanismo podra tener el siguiente aspecto: class miAplicacion extends . . . implements Oyente { public static main(String [] args) { new miAplicacion(. . .); ... } ... miAplicacion(. . .) { ... Boton b = new Boton(. . .); b.registrarOyente(this); } ... void botonPulsado(Boton x) { // procesar click ... } } Obsrvese en el mtodo registrarOyente que se pasa la referencia thisque en el lado de la clase Boton es recogido como una referencia a la interface Oyente. Esto es posible porque la clase miAplicacion 257

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
implementa la interface Oyente . En trminos clsicos de herencia miAplicacion ES un Oyente .

6.8.

PAQUETES Clasula Packaged: Un package es una agrupacin de clases afines. Equivale al concepto de librera existente en otros lenguajes o sistemas. Una clase puede definirse como perteneciente a un package y puede usar otras clases definidas en ese o en otros packages. Los packages delimitan el espacio de nombres (space name). El nombre de una clase debe ser nico dentro del package donde se define. Dos clases con el mismo nombre en dos packages distintos pueden coexistir e incluso pueden ser usadas en el mismo programa. Una clase se declara perteneciente a un package con la clausula package, cuya sintaxis es: package nombre_package; La clausula package debe ser la primera sentencia del archivo fuente. Cualquier clase declarada en ese archivo pertenece al package indicado. Por ejemplo, un archivo que contenga las sentencias: package miPackage; ... class miClase { ... declara que la clase miClase pertenece al package miPackage. La clasula package es opcional. Si no se utiliza, las clases declaradas en el archivo fuente no pertenecen a ningn package concreto, sino que pertenecen a un package por defecto sin nombre. La agrupacin de clases en packages es conveniente desde el punto de vista organizativo, para mantener bajo una ubicacin comn clases relacionadas que cooperan desde algn punto de vista. Tambin resulta importante por la implicacin que los packages tienen en los modificadores de acceso, que se explican en un captulo posterior. 258

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Clasula import Cuando se referencia cualquier clase dentro de otra se asume, si no se indica otra cosa, que sta otra est declarada en el mismo package. Por ejemplo: package Geometria; ... class Circulo { Punto centro; ... } En esta declaracin definimos la clase Circulo perteneciente al package Geometria. Esta clase usa la clase Punto. El compilador y la JVM asumen que Punto pertenece tambin al package Geometria, y tal como est hecha la definicin, para que la clase Punto sea accesible (conocida) por el compilador, es necesario que est definida en el mismo package. Si esto no es as, es necesario hacer accesible el espacio de nombres donde est definida la clase Punto a nuestra nueva clase. Esto se hace con la clausula import. Supongamos que la clase Punto estuviera definida de esta forma: package GeometriaBase; class Punto { int x , y; } Entonces, para usar la clase Punto en nuestra clase Circulo deberiamos poner: package GeometriaAmpliada; import GeometriaBase.*; class Circulo { Punto centro; ... } 259

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Con la clasula import GeometriaBase.*; se hacen accesibles todos los nombres (todas las clases) declaradas en el package GeometriaBase. Si slo se quisiera tener accesible la clase Punto se podra declarar: import GeometriaBase.Punto; Tambin es posible hacer accesibles los nombres de un package sin usar la clausula import calificando completamente los nombres de aquellas clases pertenecientes a otros packages. Por ejemplo: package GeometriaAmpliada; class Circulo { GeometriaBase.Punto centro; ... } Sin embargo si no se usa import es necesario especificar el nombre del package cada vez que se usa el nombre Punto. La clasula import simplemente indica al compilador donde debe buscar clases adicionales, cuando no pueda encontrarlas en el package actual y delimita los espacios de nombres y modificadores de acceso. Sin embargo, no tiene la implicacin de 'importar' o copiar cdigo fuente u objeto alguno. En una clase puede haber tantas sentencias import como sean necesarias. Las clusulas import se colocan despus de la clusula package (si es que existe) y antes de las definiciones de las clases. Nombres de los packages Los packages se pueden nombrar usando nombres compuestos separados por puntos, de forma similar a como se componen las direcciones URL de Internet. Por ejemplo se puede tener un package de nombre misPackages.Geometria.Base. Cuando se utiliza esta estructura se habla de packages y subpackages. En el ejemplo misPackages es el Package base, Geometria es un subpackage de misPackages y Base es un subpackage de Geometria. De esta forma se pueden tener los packages ordenados segn una jerarqua equivalente a un sistema de archivos jerrquico. El API de java est estructurado de esta forma, con un primer calificador (java o javax) que indica la base, un segundo calificador 260

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
(awt, util, swing, etc.) que indica el grupo funcional de clases y opcionalmente subpackages en un tercer nivel, dependiendo de la amplitud del grupo. Cuando se crean packages de usuario no es recomendable usar nombres de packages que empiecen por java o javax. Ubicacin de packages en el sistema de archivos Adems del significado lgico descrito hasta ahora, los packages tambin tienen un significado fsico que sirve para almacenar los mdulos ejecutables (ficheros con extensin .class) en el sistema de archivos del ordenador. Supongamos que definimos una clase de nombre miClase que pertenece a un package de nombre misPackages.Geometria.Base. Cuando la JVM vaya a cargar en memoria miClase buscar el mdulo ejecutable (de nombre miClase.class) en un directorio en la ruta de acceso misPackages/Geometria/Base. Est ruta deber existir y estar accesible a la JVM para que encuentre las clases. En el captulo siguiente se dan detalles sobre compilacin y ejecucin de programas usando el compilador y la mquina virtural distribuida por SUN Microsystems (JDK). Si una clase no pertenece a ningn package (no existe clausula package ) se asume que pertenece a un package por defecto sin nombre, y la JVM buscar el archivo .class en el directorio actual. Para que una clase pueda ser usada fuera del package donde se defini debe ser declarada con el modificador de acceso public, de la siguiente forma: package GeometriaBase; public class Punto { int x , y; } Si una clase no se declara public slo puede ser usada por clases que pertenezcan al mismo package

261

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________

CAPITULO VII PROBLEMAS RESUELTOS EN JAVA

262

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
7.1. PROBLEMAS RESUELTOS:

ESTRUCTURA SECUENCIAL Ejemplo 1: Programa que permite mostrar los datos de una persona y su pago. import java.io.*; public class ejercicio32 { public static void main(String[] args) throws IOException { String nom,ap; double pm,pmt,pt; BufferedReader leer = new BufferedReader(new InputStreamReader(System.in)); System.out.println("ingrese su nombre"); nom=(leer.readLine()); System.out.println("ingrese sus apellidos"); ap=(leer.readLine()); System.out.println("ingrese el pago mensual"); pm=Double.parseDouble(leer.readLine()); System.out.println("ingrese el pago de la matricula"); pmt=Double.parseDouble(leer.readLine()); pt=pm+pmt; System.out.println("su nombre es:"+nom); System.out.println("sus apellidos son:"+ap); System.out.println("el pago total es:"+pt); } }

263

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 2: Programa que permite calcular el producto de un numero ingresado por teclado. import java.io.*; public class Ejercicio02 { public static void main(String Args[])throws IOException {double num,res=0; BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ingrese un numero:"); num=Double.parseDouble(in.readLine()); res=num*2*25; System.out.print("El el resultado de multiplicar por 25 y duplicar es:" + res); } } Ejemplo 3: Programa que permite calcular el perimetro y area de un rectangulo. import java.io.*; public class Ejercicio03 { public static void main(String Args[])throws IOException { double la,lb,p=0,area=0; BufferedReader leer= new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ingrese un lado:"); la=Double.parseDouble(leer.readLine()); System.out.println("Ingrese el otro lado:"); lb=Double.parseDouble(leer.readLine()); p = la*2 + lb*2; area=la*lb; System.out.println("El perimetro del rectangulo es:" + p); System.out.println("El area del rectangulo es:" + area); } }

264

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 3: Programa que permite convertir metros en pies y pulgadas. import java.io.*; public class Ejercicio09 { public static void main(String Args[])throws IOException {double me,pies=0,pul=0; BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ingrese la cantidad en metros:"); me= Double.parseDouble(in.readLine()); pul=me*39.37; pies=pul*12; System.out.println("su convercion en pies es:"+pies+"pies"); System.out.println("su convercion en pulgadas es:"+pul+"pulgadas"); } } Ejemplo 4: Programa que permite calcular la hipotenusa de un triangulo. import java.io.*; public class Ejercicio07 { public static void main(String Args[])throws IOException {int Co,Ca; double h,parcial; BufferedReader leer= new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ingrese la longitud del primer cateto:"); Co=Integer.parseInt(leer.readLine()); System.out.println("Ingrese la longitud del segundo cateto:"); Ca=Integer.parseInt(leer.readLine()); parcial= Co*Co+Ca*Ca; h= Math.pow(parcial, 0.5); System.out.print("LA hipotenusa es:"+h); } }

265

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 5: Programa que permite calcular el tiempo de demora de 3 tipos de examenes. import java.io.*; public class Ejercicio05 {public static void main(String Args[])throws IOException {int EA,EB,EC; int TM=0,h=0,min=0; BufferedReader leer= new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ingrese la cantidad de Examenes del tipo A:"); EA=Integer.parseInt(leer.readLine()); System.out.println("Ingrese la cantidad de Examenes del tipo B:"); EB=Integer.parseInt(leer.readLine()); System.out.println("Ingrese la cantidad de Examenes del tipo C:"); EC=Integer.parseInt(leer.readLine()); TM=EA*5+EB*8+EC*6; h= TM/60; min= TM/60; System.out.print("Se va a demorar: "+h+" horas y "+min+" minutos."); } } Ejemplo 6: Programa que permite calcular el promedio de varones y mujeres. import java.io.*; public class Ejercicio04 {public static void main(String Args[])throws IOException {double total=0,PV=0,PM=0,V,M; BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ingrese la cantidad de varones:"); V=Double.parseDouble(in.readLine()); System.out.println("Ingrese la cantidad de mujeres:"); M=Double.parseDouble(in.readLine()); total = V +M; PV=(V*total)/100; PM=(M*total)/100; 266

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
System.out.println("El porcentaje de varones es:" +PV+"%"); System.out.println("El porcentaje de mujeres es:" +PM+"%"); } } Ejemplo 7: Programa que permite calcular el tiempo que tarda en dar dos vueltas un automovil. import java.io.*; public class Ejercicio11 {public static void main(String Args[])throws IOException {double v,r,l=0,t=0; BufferedReader leer= new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ingrese la velocidad en m/s:"); v= Double.parseDouble(leer.readLine()); System.out.println("Ingrese el radio de la pista: "); r= Double.parseDouble(leer.readLine()); l=2*3.1416*r; t=l/v; System.out.println("el tiempo que tarda de dar 2 vueltas es de:"+t+"segundos."); } }

267

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 8: Programa que permite convertir una temperatura en grados celcius a Fahrenheit. import java.io.*; public class Ejercicio12 { public static void main(String Args[])throws IOException {double C,F; BufferedReader leer=new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ingrese la temperatura en Celcius"); C= Double.parseDouble(leer.readLine()); F=(9*C)/5 + 32; System.out.println("La temperatura en Fahrenheit es: " + F); } } Ejemplo 9: Programa que permite calcular la suma de dos numeros definidos como constante. import java.io.*; public class ejemplo1 { public static void main(String[] args)throws IOException { double num1=20; double num2=30; System.out.print("La suma es :"+(num1+num2)); } }

268

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 10: Programa que permite calcular la suma de dos numeros ingresados por teclado. import java.io.*; public class ejemplo2 { public static void main(String[] args) throws IOException { double num1, num2, suma=0; BufferedReader leer = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Ingrese los valores"); System.out.print("Ingrese el primer valor :"); num1=Double.parseDouble(leer.readLine()); System.out.print("Ingrese el segundo valor :"); num2=Double.parseDouble(leer.readLine()); suma=num1+num2; System.out.print("La suma es:"+suma); } }

269

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
ESTRUCTURA CONDICIONAL SIMPLE (IF) Ejemplo 11: Programa que permite calcular si un numero es positivo, negativo o cero. import java.io.*; public class ejercicio13 { public static void main(String[] args) throws IOException { int num1; BufferedReader leer = new BufferedReader(new InputStreamReader(System.in)); num1 =Integer.parseInt(leer.readLine()); if (num1>0) { System.out.println(num1 + " es positivo"); } else if (num1<0) { System.out.println(num1+ " es negativo"); } else if (num1==0) { System.out.println(num1 + " es cero"); } } }

270

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 12: Programa que permite calcular las operaciones basicas de resta, suma, multiplicacin y division de dos numeros ingresados por teclado. import java.io.*; public class ejercicio15 { public static void main (String[] args) throws IOException { int x,y; int res=0,sum=0,mult=0,div=0; BufferedReader leer=new BufferedReader(new InputStreamReader(System.in)); System.out.println("ingrese el primer valor"); x=Integer.parseInt(leer.readLine()); System.out.println("ingrese el segundo valor"); y=Integer.parseInt(leer.readLine()); res=x-y; sum=x+y; mult=x*y; if(y!=0) { div=x/y; } else { System.out.println("no existe divicion entre cero"); } System.out.println("la resta es:"+ res); System.out.println("la suma es :"+ sum); System.out.println("la multiplicacion es :"+mult); System.out.println("la divicion es:"+div); } }

271

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 13: Programa que permite calcular el costo de una llamada telefonica. import java.io.*; public class ejercicio17 { public static void main(String[] args) throws IOException { double min; double cll=0; int c1=5; int c2=3; BufferedReader leer = new BufferedReader(new InputStreamReader(System.in)); System.out.println("ingresar los minutos consumidos"); min =Double.parseDouble(leer.readLine()); if (min>0 && min<=3) { cll=min*c1; } else { cll=(3*c1)+((min-3)*c2); } System.out.println("elcosto de la llamada es : " + cll); } }

272

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 14: Programa que permite calcular la condicion de estudiante de acuerdo a sus tres examenes ingresados.. import java.io.*; public class ejercicio25 { public static void main(String[] args) throws IOException { double EX1,EX2,EX3,PF=0; BufferedReader leer = new BufferedReader(new InputStreamReader(System.in)); System.out.println("ingrese la nota del primer examen:"); EX1=Double.parseDouble(leer.readLine()); System.out.println("ingrese la nota del segundo examen:"); EX2=Double.parseDouble(leer.readLine()); System.out.println("ingrese la nota del tercer examen:"); EX3=Double.parseDouble(leer.readLine()); PF=(EX1+EX2+EX3)/3; if (PF>=0 && PF<=69) { System.out.println(PF+":reprobado."); } if (PF>=70 && PF<=79) { System.out.println(PF+":hay que mejorar."); } if (PF>=80 && PF<=89) { System.out.println(PF+":bien."); } if (PF>=90 && PF<=99) { System.out.println(PF+":muy bien."); } if (PF==100) { System.out.println(PF+":excelente."); } } }

273

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 15: Programa que permite mostrar el tipo de triangulo que se forma segn valores ingresados de sus tres lados. import java.io.*; public class ejercicio26 { public static void main(String[] args) throws IOException { int A,B,C; BufferedReader leer = new BufferedReader(new InputStreamReader(System.in)); System.out.println("ingrese el lado mayor"); A=Integer.parseInt(leer.readLine()); System.out.println("ingrese primer lado"); B=Integer.parseInt(leer.readLine()); System.out.println("ingrese segundo lado"); C=Integer.parseInt(leer.readLine()); if (A>=(B+C)) { System.out.println("no se forma un triangulo"); } if ((A^2)==((B^2)+(C^2))) { System.out.println("se forma un triangulo rectangulo"); } if ((A^2)>((B^2)+(C^2))) { System.out.println("se forma un triangulo obtusangulo"); } if ((A^2)<((B^2)+(C^2))) { System.out.println("se forma un triangulo acutangulo"); } } }

274

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 16: Programa que permite mostrar la condicion que cumple una persona segn su edad ingresada. import java.io.*; public class ejercicio28 { public static void main(String[] args) throws IOException { int edad; BufferedReader leer = new BufferedReader(new InputStreamReader(System.in)); System.out.println("ingrese su edad"); edad=Integer.parseInt(leer.readLine()); if (edad>18) { System.out.println("usted es todo un joven , y su edad es:"+edad); } else { System.out.println("usted es aun un adolescente y su edad es:"+edad); } } } Ejemplo 17: Programa que permite ingresar n numeros y muestra como resultado la cantidad de numeros pares y cantidad de numeros impares. import java.io.*; public class caso3 { public static void main(String[] args)throws IOException {double c,i,num,par=0,impar=0; //Creando el metodo para el ingreso de datos BufferedReader l = new BufferedReader(new InputStreamReader(System.in)); System.out.println("uso de la sentencia if y for"); System.out.println("calculando numeros pares e impares"); System.out.println("ingrese cantidad de valores ha procesar :"); 275

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
c=Double.parseDouble(l.readLine()); for(i=1;i<=c;i++) {System.out.print("ingrese valor:"+i); num=Double.parseDouble(l.readLine()); if(num%2==0) par++; else impar++; } System.out.println("la cantidad de numeros pares="+par); System.out.println("la cantidad de numeros impares="+impar); } } Ejemplo 18: Programa que permite calcular si un numero ingresado es par, utilizando metodos. import java.io.*; public class ejercicio6 {public static void par(int num) { if((num%2)==0) {System.out.println("El numero es par"); } else {System.out.println("El numero es impar"); } } public static void main(String[] args) throws IOException { int numero; BufferedReader leer=new BufferedReader (new InputStreamReader(System.in)); System.out.println("Ingrese un numero :"); numero =Integer.parseInt(leer.readLine()); par(numero); } } 276

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 19: Programa que permite calcular el mayor de dos numeros si existe, caso contrario mostrara un mensaje que los numeros son iguales. import java.io.*; public class Ejercicio10 { public static void main(String[] args) throws IOException { int a,b; BufferedReader leer = new BufferedReader(new InputStreamReader(System.in)); System.out.println("ingrese 2 numeros"); a =Integer.parseInt(leer.readLine()); b =Integer.parseInt(leer.readLine()); if (a>b) { System.out.println(a+"es mayor"); } else if (b>a) { System.out.println(b+"es mayor"); } else if (a==b) { System.out.println(a+"y"+b+"son iguales"); } } }

277

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 20: Programa que permite calcular si un numero ingresado es par, n cantidad de veces y utilizando metodos. import java.io.*; public class ejercicio8 { public static void par(int num) { if((num%2)==0) {System.out.println("El numero es par"); } else {System.out.println("El numero es impar"); } } public static void main(String[] args) throws IOException { int numero, num; BufferedReader leer=new BufferedReader (new InputStreamReader(System.in)); System.out.print("Ingrese la cantidad de numeros a leer:"); num=Integer.parseInt(leer.readLine()); for(int x=1;x<=num;x++) {System.out.print("Ingrese un numero :"); numero =Integer.parseInt(leer.readLine()); par(numero); } } }

278

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 21: Programa que permite calcular si un numero ingresado es par, n cantidad de veces y utilizando metodos. import java.io.*; public class Ejercicio11 { public static void main(String Args[])throws IOException {double v,r,l=0,t=0; BufferedReader leer= new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ingrese la velocidad en m/s:"); v= Double.parseDouble(leer.readLine()); System.out.println("Ingrese el radio de la pista: "); r= Double.parseDouble(leer.readLine()); l=2*3.1416*r; t=l/v; System.out.println("el tiempo que tarda de dar 2 vueltas es de:"+t+"segundos."); } } Ejemplo 22: Programa que permite ingresar 5 numeros y muestra como resultado el numero mayor y numero menor import javax.swing.JOptionPane; public class caso4 { public static void main (String[] args) { String b; double n1,num,i, may = 0, men= 0; for ( i=1; i<=5; i++) { b=JOptionPane.showInputDialog("Ingresa Valores:"+ i); num = Double.parseDouble(b); if (i == 1) { may = num; men= num; } else if (num > may) 279

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
{may = num; } else if (num<men) {men = num; } } JOptionPane.showMessageDialog(null,"EL numero mayor es "+ may); JOptionPane.showMessageDialog(null,"EL numero menor es"+ men); } } Ejemplo 23: Programa que permite sumar dos numeros import javax.swing.JOptionPane; public class SumarNumeros { public static void main( String args[] ) { String strNumero1; String strNumero2; int intNumero1; int intNumero2; int suma; strNumero1=JOptionPane.showInputDialog("Ingrese el entero 1" ); strNumero2= JOptionPane.showInputDialog("Ingrese el entero2" ); intNumero1 = Integer.parseInt( strNumero1 ); intNumero2 = Integer.parseInt( strNumero2 ); suma = intNumero1 + intNumero2; JOptionPane.showMessageDialog( null, "La suma es " + suma, "Resultado", JOptionPane.PLAIN_MESSAGE ); System.exit( 0 ); } }

280

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 24: Programa que permite ingresar tu edad y calcula el ao de su nacimiento import java.io.*; public class p { public static void main(String[] args) throws IOException { InputStreamReader reader = new InputStreamReader(System.in); BufferedReader input = new BufferedReader(reader); System.out.print("Escribe tu edad: "); String text = input.readLine(); int edad = new Integer(text).intValue(); System.out.println("Tu tienes " + edad + " aos, hoy,"); int ao = 2008 - edad; System.out.println("por tanto posiblemente naciste en " + ao); } }

281

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
ESTRUCTURA SELECTIVA MULTIPLE (CASE) Ejemplo 25: Programa que nos permite mostrar una pregunta con 3 alternativas, al elegir uno de ellos nos muestra si la respuesta es correcta o no, si no acertamos nos pide que sigamos intentando hasta elgir el correcto import java.io.*; import java.util.*; public class gg { static BufferedReader entrada = new BufferedReader(new InputStreamReader(System.in)); static String respuesta; static char opc; static void pregunta1() throws IOException { opc=0; System.out.println("1ra Pregunta:"); System.out.println("Cual es el planeta mas cercano a la tierra?"); System.out.println("A)Mercurio"); System.out.println("B)Tierra"); System.out.println("C)Pluton"); respuesta=entrada.readLine(); respuesta=respuesta.toUpperCase(); opc=respuesta.charAt(0); if(opc=='A') System.out.println("Respuesta Correcta :D"); else System.out.println("Respuesta incorrecta, intenta de nuevo"); } public static void main(String args[]) throws IOException { Random rnd=new Random(); int i; i=rnd.nextInt(5); System.out.println(i); switch(i) { 282

Manual de Algoritmia case 0:

www.cesarinweb.es.tl

___________________________________________________
while(opc!='A') pregunta1(); break; case 1: System.out.println("Numero 1"); break; case 2: System.out.println("Numero 2"); break; case 3: System.out.println("Numero 3"); break; case 4: System.out.println("Numero 4"); break; case 5: System.out.println("Numero 5"); break; } } } Ejemplo 26: Programa que nos permite visualizar un da de la semana en funcin al numero que se consigna (0 a 7); si se escribe otro numero nos indicar que ingresemos un numero correcto import java.io.*; public class case3 { public static void main(String[] args) throws IOException { int num1; String dia=""; BufferedReader leer=new BufferedReader (new InputStreamReader(System.in)); System.out.println("Ingrese un numero "); num1=Integer.parseInt(leer.readLine()); switch(num1) { 283

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
case 1: dia="Lunes"; break; case 2: dia="Martes"; break; case 3: dia="Miercoles"; break; case 4: dia="Jueves"; break; case 5: dia="Viernes"; break; case 6: dia="Sabado"; break; case 7: dia="Domingo"; break; default: dia="Ingrese un numero correcto"; break; } System.out.println("El dia es >"+dia); } }

284

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
ESTRUCTURA REPETITIVA FOR Ejemplo 27: Programa que nos permite calcular el factorial de un numero. import java.io.*; public class ejercicio9 { // Creates a new instance of ejercicio9 public static void fac(int num) { int a=1; for(int y=1;y<=num;y++) {a*=y;} System.out.print("El factorial de "+num+" es "+a); } public static void main(String[] args) throws IOException {int numero, num; BufferedReader leer=new BufferedReader (new InputStreamReader(System.in)); System.out.print("Ingrese el valor:"); num=Integer.parseInt(leer.readLine()); fac(num); } } Ejemplo 28: Programa que nos permite realizar el factorial de un numero utilizando try. import java.io.*; class case5 { public static void main(String[] args) { try{ BufferedReader object = new BufferedReader(new InputStreamReader(System.in)); System.out.println("enter the number"); int a= Integer.parseInt(object.readLine()); int fact= 1; 285

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
System.out.println("Factorial of " +a+ ":"); for (int i= 1; i<=a; i++){ fact=fact*i; } System.out.println(fact); } catch (Exception e){} } }

286

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
ESTRUCTURA REPETITIVA WHILE Ejemplo 29: Programa que calcula la media, a medida que se van incorporando datos. import java.io.*; class media { public static void main(String Arg[ ]) throws IOException { double media = 0.0; int n = 0; int elementos; double num; BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Ingrese numero de elementos a ingresar : "); elementos = Integer.parseInt(in.readLine( )); while (n < elementos) { System.out.print("\nIngrese numero : "); num = Double.parseDouble(in.readLine( )); media = (media * n + num) / (double) (n + 1); /* Redondea a dos decimales */ media = Math.round(media * 100.0) / 100.0; System.out.println("media actual : " + media); n++; } System.out.println("\nMedia final : " + media ); } } 287

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 30: Programa que permite mostrar en pantalla todos los #s mayores e iguales de 20 hasta el 100 de 2 en 2, utilizando clases. class pares { public static void main(String arg[ ]) { int num = 20; while (num < 101) {if (num % 2 == 0) { System.out.println(num); } num = num + 1; } } }

Ejemplo 31: Programa que permite escribir en pantalla, la secuencia de nmeros del 50 al 100 public class SecNum { public static void main(String arg[ ]) { int num = 50; while(num < 101) { System.out.println(num); num = num + 1; } } } Ejemplo 32: Programa que permite convertir un numero constante en binario import java.io.*; public class binario{ public static void main(String args[]){ 288

Manual de Algoritmia int decimal = 25222;

www.cesarinweb.es.tl

___________________________________________________
String binario = ""; while ( decimal > 0 ) { binario = decimal % 2 + binario; decimal /= 2; } System.out.println(binario); } } Ejemplo 33: Programa que nos permite sumar los numeros divisibles por dos, del numero ingresado import java.io.*; class while1 { public static void main(String Arg[ ]) throws IOException { int i = 1; int sum = 0; int num; BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); System.out.print("Ingrese numero : "); num = Integer.parseInt(in.readLine( )); while (i <= num) { if (i % 2 == 0) {sum += i; } i++; } System.out.println("sumatoria : " + sum ); } } 289

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 34: Programa que nos permite sumar los n primeros n enteros, donde n es un numero ingresado por el usuario import java.io.*; public class while3 { public static void main(String [] args) { int number; int sum; int num; System.out.print("Por favor ingrese un numero: "); number=keyboard.readInt(); //inicializar en 0 sum = 0; num = number; //calcular la suma while(num > 0) sum += num--; //Mostrar la respuesta System.out.println("La suma de suma de los primeros " + number +" enteros es " + sum + "."); } } Ejemplo 35: Programa que nos permite calcular la suma de los 10 primero numeros enteros public class while4 { public static void main(String args[]) { int sum = 0; int i = 1; // Calculando la suma de los numeros enteros entre 1 y 10 while ( i <= 10 ) { sum = sum + i; i++; } System.out.println("The sum is: " + sum); } } 290

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
ARREGLOS UNIDIMENCIONALES: Ejemplo 36: Programa que nos permite calcular la suma e dos arreglos import java.io.*; public class P2 { public static void main(String Nubito[])throws IOException{ double a[]=new double [5]; double b[]=new double [5]; double c[]=new double [5]; BufferedReader dat=new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ingrese los 5 elementos del vector A "); for(int i=0;i<5;i++) { System.out.print("Numero "+(i+1)+": "); a[i]=Double.parseDouble(dat.readLine()); } System.out.println("Ingrese los 45 elementos del vector B "); for(int i=0;i<5;i++) { System.out.print("Numero"+(i+1)+": "); b[i]=Double.parseDouble(dat.readLine()); } for(int i=0;i<5;i++) { c[i]=a[i]+b[i]; } for(int i=0;i<5;i++) { System.out.println("la suma es :"+c[i]); } } }

291

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 37: Programa que nos permite calcular la suma de datos en un arreglo, utilizando metodos. import java.io.*; public class metodoMatriz { public static void opera(int m[]) { int sum=0; for(int x=0;x<m.length;x++) {sum=sum+m[x]; } System.out.println("La suma de los valores es "+sum); } public static void main(String xp[])throws IOException { int mat[]=new int [5]; BufferedReader leer = new BufferedReader (new InputStreamReader(System.in)); for(int y=0;y<mat.length;y++) {System.out.print("Ingrese un numero : "); mat[y]=Integer.parseInt(leer.readLine()); } opera(mat); } }

292

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 38: Programa que nos permite calcular el numero mayor y su posicin. import java.io.*; public class P3 { public static void main(String Nubito[])throws IOException { double may=0; double pos=0; double m[]=new double [5]; BufferedReader dat=new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ingrese los 5 elementos del vector "); for(int i=0;i<5;i++) { System.out.print("Elemento "+(i+1)+": "); m[i]=Double.parseDouble(dat.readLine()); if(m[i]>may) { may=m[i]; pos=i; } } System.out.println("El numero mayor es "+may); System.out.println("En la posicion:" +pos); } }

293

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 39: Programa que nos permite calcular el cuadrado de los valores ingresados en un arreglo. import java.io.*; public class P4 { public static void main(String Nubito[])throws IOException { double m[]=new double [5]; double n[]=new double [5]; BufferedReader dat=new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ingrese los 500 numeros del vector "); for(int i=0;i<5;i++) { System.out.print("Numero "+(i+1)+": "); m[i]=Double.parseDouble(dat.readLine()); n[i]=m[i]*m[i]; } System.out.println("Los valores originales son : "); for(int i=0;i<5;i++) { System.out.println(+m[i]); } System.out.println("Los valores al cuadrado son : "); for(int i=0;i<5;i++) { System.out.println(+n[i]); } } }

294

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 40: Programa que nos permite calcular la suma de numeros iguales a cero, la cantidad de numeros positivos, la cantidad de numeros negativos, la suma de los numeros positivos y la suma de numeros negativos. import java.io.*; public class P5 { public static void main(String Nubito[])throws IOException { int pos=0,neg=0,c=0; double sump=0,sumn=0; double n[]=new double [3]; BufferedReader dat=new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ingrese los 300 numeros del vector "); for(int i=0;i<3;i++) { System.out.print("Numero "+(i+1)+": "); n[i]=Double.parseDouble(dat.readLine()); if(n[i]==0) { c=c+1; } if(n[i]>0) { pos=pos+1; sump=sump+n[i]; } if(n[i]<0) { neg=neg+1; sumn=sumn+n[i]; } } System.out.println("Los numeros iguales a cero son : "+c); System.out.println("Los numeros positivos son : "+pos); System.out.println("Los numeros negativos son : "+neg); System.out.println("La suma de los positivos es : "+sump); System.out.println("La suma de los negativos es : "+sumn); } 295

Manual de Algoritmia }

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 41: Programa que nos permite mostrar los datos ingresados en forma invertida. import java.io.*; public class P6 { public static void main(String Nubito[])throws IOException { double m[]=new double [5]; double inv[]=new double [5]; int x=0; BufferedReader dat=new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ingrese los 5 numeros del vector "); for(int i=0;i<5;i++) { System.out.print("Numero "+(i+1)+": "); m[i]=Double.parseDouble(dat.readLine()); x=5-(i+1); inv[x]=m[i]; } System.out.println("El vector resultantes es "); for(int i=0;i<5;i++) { System.out.println(+inv[i]); } } }

296

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 42: Programa que nos permite calcular la suma de dos arreglos de igual cantidad de datos. import java.io.*; public class ejemplo4 { public static void main(String[] args) throws IOException { double a[]=new double [10]; double b[]=new double [10]; double c[]=new double [10]; double dato; BufferedReader leer=new BufferedReader InputStreamReader(System.in)); System.out.println("Ingresa los datos a los arreglo"); for(int i=0;i<a.length;i++) {System.out.println("Ingrese A["+(i+1)+"] :"); dato=Double.parseDouble(leer.readLine()); a[i]=dato; } for(int i=0;i<a.length;i++) {System.out.println("Ingrese B["+(i+1)+"] :"); dato=Double.parseDouble(leer.readLine()); b[i]=dato; } for(int i=0;i<a.length;i++) {c[i]=a[i]+b[i]; } for(int i=0;i<a.length;i++) {System.out.println("la suma del arreglo A["+(i+1)+"]+B["+(i+1)+"] es "+c[i]); } } }

(new

297

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 43: Programa que nos permite mostrar, si los datos de dos vectores(arreglos), son iguales. import java.io.*; public class P7 { public static void main(String Nubito[])throws IOException { double m[]=new double [5]; double n[]=new double [5]; int x=0; BufferedReader dat=new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ingrese los 5 elementos del vector M "); for(int i=0;i<5;i++) { System.out.print("Elemento "+(i+1)+": "); m[i]=Double.parseDouble(dat.readLine()); } System.out.println("Ingrese los 5 elementos del vector N "); for(int i=0;i<5;i++) { System.out.print("Elemento "+(i+1)+": "); n[i]=Double.parseDouble(dat.readLine()); } for(int i=0;i<5;i++) { if(m[i]==n[i]) {x=x+1;} } if(x==5) {System.out.println("Los vectores son Iguales"); } else { System.out.println("Los vectores son Desiguales"); } } }

298

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 44: Programa que nos permite buscar un numero en el arreglo import java.io.*; public class P9 { public static void main(String Nubito[])throws IOException { double n[]=new double [8]; double x=0; int p=0; BufferedReader dat=new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ingrese los 80 elementos del vector "); for(int i=0;i<8;i++) { System.out.print("Elemento "+(i+1)+": "); n[i]=Double.parseDouble(dat.readLine()); } System.out.println("Ingrese el numero a buscar : "); x=Double.parseDouble(dat.readLine()); for(int i=0;i<8;i++) {if(n[i]==x) { p=i+1; } } if(p>0) {System.out.println("El numero se encuentra en la posicion:" +p); } else { System.out.println("No se encontro el numero"); } } }

299

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 45: Programa que nos permite cacular el factorial de n numeros ingresados en un arreglo. import java.io.*; public class ejemplo5 { public static void main(String[] args) throws IOException {double a[]=new double [3]; double b[]=new double [3]; double dato; double facnum; int num=1,fac, x=0; BufferedReader leer=new BufferedReader (new InputStreamReader(System.in)); System.out.println("Ingresa los datos a los arreglo"); for(int i=0;i<a.length;i++) {System.out.print("Ingrese A["+(i+1)+"] :"); dato=Double.parseDouble(leer.readLine()); a[i]=dato; } for(int i=0;i<a.length;i++) {facnum=a[i]; fac=1; for(int j=1;j<=facnum;j++) {fac=fac*j; } System.out.print(fac); b[i]=fac; fac=0; } for(int i=0;i<a.length;i++) {System.out.println("Ingrese B["+(i)+"] :"+b[i]); } } }

300

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 46: Programa que nos permite calcular el producto de dos arreglos con cantidad de datos iguales. import java.io.*; public class P10 { public static void main(String nubito[])throws IOException { double a[]=new double [20]; double b[]=new double [20]; double c[]=new double [20]; int x=0; BufferedReader dat=new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ingrese los 20 numeros del vector A"); for(int i=0;i<20;i++) { System.out.print("Numero "+(i+1)+": "); a[i]=Double.parseDouble(dat.readLine()); } System.out.println("Ingrese los 20 numeros del vector B"); for(int i=0;i<20;i++) {System.out.print("Numero "+(i+1)+": "); b[i]=Double.parseDouble(dat.readLine()); } for(int i=0;i<20;i++) {x=20-(i+1); c[i]=a[i]*b[x]; } for(int i=0;i<20;i++) {System.out.println("La multiplicacion es: "+c[i]); } } }

301

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________

ARREGLOS BIDIMENCIONALES: Ejemplo 47: Programa que nos permite calcular la suma de un arreglo bidimensional. import java.io.*; public class P12 { public static void main(String Nubito[])throws IOException { double m[][]=new double [5][6]; double suma=0; BufferedReader dat=new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ingrese los valores de la matriz"); for(int i=0;i<5;i++) { for(int j=0;j<6;j++) {System.out.print("Ingrese el un numero : "); m[i][j]=Double.parseDouble(dat.readLine()); suma=suma+m[i][j]; } } System.out.println("la suma es :"+suma); } } Ejemplo 48: Programa que nos permite calcular el numero mayor y su posicin en un arreglo bidimensional. import java.io.*; public class P13 { public static void main(String Nubito[])throws IOException { double m[][]=new double [3][3]; double may=0; int posi=0,posj=0; BufferedReader dat=new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ingrese los valores de la matriz"); for(int i=0;i<3;i++) { for(int j=0;j<3;j++) 302

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
{System.out.print("Ingrese un numero: "); m[i][j]=Double.parseDouble(dat.readLine()); if(m[i][j]>may) {may=m[i][j]; posi=i+1; posj=j+1; } } } System.out.println("El numero mayor es "+may); System.out.println("En la posicion ("+posi+","+posj+")"); } } Ejemplo 49: Programa que nos permite calcular columna y fila en un arreglo bidimensional. la suma de una

import java.io.*; public class P14 { public static void main(String args[])throws IOException {BufferedReader VTL=new BufferedReader(new InputStreamReader(System.in)); double m[][]=new double [5][5]; double d[]=new double [5]; double sc[]=new double[5]; double sf[]=new double[5]; System.out.println("Ingrese los valores de la matriz"); for(int f=0;f<5;f++) { for(int c=0;c<5;c++) {System.out.print("Ingrese el valor de la posicion ("+(f+1)+","+(c+1)+" : "); m[f][c]=Double.parseDouble(VTL.readLine()); } } for(int c=0;c<5;c++) { for(int f=0;f<5;f++) {sc[c]=sc[c]+m[f][c]; } } 303

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
for(int c=0;c<5;c++) { for(int f=0;f<5;f++) {sf[f]=sf[f]+m[f][c]; } } for(int f=0;f<5;f++) {System.out.println("La suma de la fila "+f+" es "+sf[f]); } for(int c=0;c<5;c++) {System.out.println("La suma de la columna "+c+" es "+sc[c]); } } } Ejemplo 50: Programa que nos permite calcular la columna que tiene mayor suma. import java.io.*; public class P15 { public static void main(String Nubito[])throws IOException { double m[][]=new double [5][5]; double sc[]=new double [5]; double may=0; int c=0; BufferedReader dat=new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ingrese los valores de la matriz"); for(int i=0;i<5;i++) {for(int j=0;j<5;j++) { System.out.print("Ingrese un numero : "); m[i][j]=Double.parseDouble(dat.readLine()); } } for(int j=0;j<5;j++) { for(int i=0;i<5;i++) { sc[j]=sc[j]+m[i][j]; } if(sc[j]>may) {may=sc[j]; 304

Manual de Algoritmia c=j; }

www.cesarinweb.es.tl

___________________________________________________
} System.out.println("La columna que tiene la mayor suma es "+c); System.out.println("La suma es "+may); } } Ejemplo 51: Programa que nos permite mostrar la diagonal de una matriz. import java.io.*; public class P16 {public static void main(String Nubito[])throws IOException { double m[][]=new double [5][5]; double d[]=new double [5]; BufferedReader dat=new BufferedReader(new InputStreamReader(System.in)); System.out.println("Ingrese los valores de la matriz"); for(int i=0;i<5;i++) { for(int j=0;j<5;j++) {System.out.print("Ingrese el valor de la posicion ("+(i+1)+","+(j+1)+" : "); m[i][j]=Double.parseDouble(dat.readLine()); if(i==j) {d[i]=m[i][j];} } } System.out.println("La diagonal principal es "); for(int i=0;i<5;i++) {System.out.println(""+d[i]); } } }

305

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 52: Programa que nos permite calcular la suma en una serie fibonacci import java.io.*; public class pre_11 { public static void main (String args []) { int x, y; String leer; System.out.println("SERIE FIBONACCI"); long Fib[]=new long[50]; Fib[0]=0; Fib[1]=1; Fib[2]=Fib[0]+Fib[1]; y=3; while (y < 50) { Fib[y]= Fib[y-1] + Fib[y-2]; y++; } for(x=0;x<50;x++) { System.out.println(Fib[x]); } } }

306

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 53: Programa que nos permite calcular la suma de una fila y columna import java.io.*; public class preg_19 { public static void main(String args[])throws IOException { BufferedReader VTL=new BufferedReader(new InputStreamReader(System.in)); double m[][]=new double [5][5]; double d[]=new double [5]; double suma[]=new double[5]; double sf[]=new double[10]; System.out.println("Ingrese los valores de la matriz"); for(int f=0;f<5;f++) { for(int c=0;c<5;c++) {System.out.print("Ingrese el valor de la posicion ("+(f+1)+","+(c+1)+" : "); m[f][c]=Double.parseDouble(VTL.readLine()); } } for(int c=0;c<5;c++) { for(int f=0;f<5;f++) {suma[f]=suma[f]+m[f][c]; } } for(int c=0;c<5;c++) { for(int f=0;f<5;f++) { suma[c]=suma[c]+m[f][c]; } } for(int f=0;f<5;f++) { System.out.println("La suma de la fila "+f+" es "+suma[f]); } for(int c=0;c<5;c++) {System.out.println("La suma de la columna "+c+" es "+suma[c]); } } } 307

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 54: Programa que nos permite calcular la suma transversal en una matriz bidimensional. import java.io.*; public class ejercicio10 { public static void main(String[] args) throws IOException { double mat[][] = new double [2][2]; double suma=0; BufferedReader leer=new BufferedReader (new InputStreamReader(System.in)); System.out.println("Ingrese los valores a la matriz"); for(int f=0;f<2;f++) {for(int c=0;c<2;c++) {System.out.print("Ingrese ["+f+"] - ["+c+"] :"); mat[f][c]=Double.parseDouble(leer.readLine()); } } for(int f=0;f<2;f++) {System.out.println("\n"); for(int c=0;c<2;c++) { if(f==c) { suma=suma+mat[f][c]; } } } for(int f=0;f<2;f++) {System.out.println("\n"); for(int c=0;c<2;c++) {System.out.print("\t\t"+Math.round(mat[f][c])); } } System.out.println("\n"); System.out.print("La suma de su transversal es:"+suma); } }

308

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 55: Programa que nos permite calcular la suma una matriz bidimensional. import java.io.*; public class metodoMatriz_2 { public static void opera(int m1[],int m2[]) {int mul=0; for(int x=0;x<m1.length;x++) {mul=m1[x]+m2[x]; System.out.println("La suma de los valores es "+mul); } } public static void main(String xp[])throws IOException { int tam; int a[]; int b[]; BufferedReader leer = new BufferedReader (new InputStreamReader(System.in)); System.out.println("Ingrese el tamao del arreglo :"); tam=Integer.parseInt(leer.readLine()); a=new int [tam]; b=new int [tam]; for(int y=0;y<a.length;y++) {System.out.print("Ingrese un numero arreglo A : "); a[y]=Integer.parseInt(leer.readLine()); } for(int y=0;y<b.length;y++) {System.out.print("Ingrese un numero arreglo B : "); b[y]=Integer.parseInt(leer.readLine()); } opera(a,b); } }

309

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
Ejemplo 56: Programa que nos permite calcular las posibles posiciones de un alfil en un juego de ajedrez. import java.io.*; import java.lang.Math; public class Ajedrezbidimensional { public static void main(String args[]) { int fila, columna; int fila1,columna1; int fila2,columna2; int fila3,columna3; int fila4,columna4;

try{ System.out.println("INGRESE LA POSICION INICIAL DEL ALFIL(FILA Y COLUMNA)"); BufferedReader entrada=new BufferedReader(new InputStreamReader(System.in)); System.out.println("INGRESE LA FILA"); fila=Integer.parseInt(entrada.readLine()); System.out.println("INGRESE LA COLUMNA"); columna=Integer.parseInt(entrada.readLine());

System.out.println("LISTA DE POSICIONES POSIBLES DEL ALFIL "); System.out.println(""); fila1=fila; columna1=columna; while ((fila1<8) && (columna1<8)) { fila1=fila1+1; columna1=columna1+1; 310

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
System.out.println(" FILA "+fila1+" COLUMNA "+columna1);} System.out.println(""); fila2=fila; columna2=columna; while ((fila2>1) && (columna2>1)) { fila2=fila2-1; columna2=columna2-1; System.out.println(" FILA "+fila2+" COLUMNA "+columna2);} System.out.println(""); fila3=fila; columna3=columna; while ((fila3<8) && (columna3>1)) { fila3=fila3+1; columna3=columna3-1; System.out.println(" FILA "+fila3+" COLUMNA "+columna3);} System.out.println(""); fila4=fila; columna4=columna; while ((fila4>1) && (columna4<8)) { fila4=fila4-1; columna4=columna4+1; System.out.println(" FILA "+fila4+" COLUMNA "+columna4);}

}catch(IOException e){} } } 311

Manual de Algoritmia

www.cesarinweb.es.tl

___________________________________________________
BIBLIOGRAFIA BROOKSHEAR GLENN J.: Introduccin a las Ciencias de la Computacin - Ed. Asdison Wesley Americana. 1995 BRAUNSTEIN - GIOIA: " Introduccin a la Programacin y a las Estructuras de Datos. Ed. Eudeba. Bs. As. 2003. AHO - HOPCROFT y ULLMAN: " Estructuras de datos y algoritmos. Ed. Adisson Wesley Iberoamericana. Mxico. 2003. BRAUNSTEIN-GIOIA: "Introduccin a la programacin y a las estructuras de datos". Ed. Eudeba. SCHILDT, HERBERT & HOLMES, JAMES: El arte de programar en Java. Ed. Prentice Hall, Mxico 2004 ADAM DROZDEK: Estructura de datos y algoritmos en Java. Ed. Prentice Hall, Mxico 2007. SCHILDT, HERBERT: Fndamentos de Java . Ed. Prentice Hall, Mxico 2006. Direcciones Electrnicas http://todojava.awardspace.com/manuales-java.html http://www.webtaller.com/manual-java/indice_manual_java.php http://www.manual-java.com/

312

Das könnte Ihnen auch gefallen