ApuntesClases Version Noviembre08

125
PROGRAMACIÓN DIGITAL 10 Noviembre 2008 MATERIAL DE APOYO Escuela Básica Facultad de Ingeniería Universidad de Los Andes Prof. Armando Borrero Molina

Transcript of ApuntesClases Version Noviembre08

Page 1: ApuntesClases Version Noviembre08

PROGRAMACIÓN DIGITAL 10

Noviembre 2008

MATERIAL DE APOYO

Escuela Básica

Facultad de Ingeniería

Universidad de Los Andes

Prof. Armando Borrero Molina

Page 2: ApuntesClases Version Noviembre08

CONCEPTOS BÁSICOS

Informática: ciencia que estudia el tratamiento automático y racional de la información.

Funciones: + Desarrollo de nuevas máquinas + Desarrollo de nuevos métodos de trabajo + Construcción de aplicaciones informáticas + Mejora de los nuevos métodos y aplicaciones existentes.

Datos : representaciones abstractas de hechos u objetos. Un dato es una representación simbólica (numérica, alfabética, etc.) de un atributo o característica de una entidad. El dato no tiene valor semántico (sentido) en sí mismo, pero convenientemente tratado (procesado) se puede utilizar en la realización de cálculos o toma de decisiones.

Computador(a): Concepto : + Dispositivo electrónico que recibe un conjunto de datos de entrada, los procesa y genera resultados, o produce información de salida. + Máquina compuesta de elementos físicos de tipo electrónico, capaz de realizar una gran variedad de trabajos a gran velocidad y con gran precisión, siempre que se le den las instrucciones adecuadas.

Datos Procesamiento Información

Entradas Procesos Salidas

Recopilación, depuración y almacenamiento de los datos.

Recopilación y distribución de los resultados.

Aritméticos Lógicos

Infor mación Automática .

Page 3: ApuntesClases Version Noviembre08

Esquema Básico del Hardware

1) CPU: Unidad Central de Procesamiento UCP . Es el elemento principal de la computadora y su misión consiste en coordinar, controlar o realizar todas las operaciones del sistema. Consta de:

i) Unidad de Control (UC) . Es la parte del CPU encargada de gobernar el resto de unidades. Interpreta las instrucciones, controla su ejecución y la secuencia en que éstas deben ejecutarse.

ii) Unidad Aritmético–Lógica (UAL) . Es la parte del CPU encargada de realizar las operaciones elementales de tipo aritmético y lógico.

2) Memoria Principal . También denominada Memoria Central, es el elemento

encargado de almacenar los programas y los datos necesarios para que el sistema realice un determinado trabajo. Las siglas en inglés son RAM, de Random Access Memory. Se dice que esta es una memoria volátil, pues todo lo que almacena se pierde cuando se apaga el computador. …Faltan otras cosas.

3) Memoria Auxiliar o Secundaria . Son dispositivos de almacenamiento masivo

de información y su característica principal es la de retener esta información durante el tiempo que se desee, recuperándola cuando sea requerida. Son los denominados Discos Duros, CDs entre otros.

4) Dispositivos de Entrada . También llamados Periféricos o Unidades de

entrada, son los elementos encargados de facilitar la introducción de los datos y los programas desde el exterior a la memoria principal. Estos dispositivos, además de recibir la información del exterior, la adaptan para que ésta sea inteligible por la máquina.

Unidad de Control +

Unidad Aritmético - Lógica

Memoria Principal

Dispositivos de Entrada

Dispositivos de Salida

Memoria Auxiliar

Procesador

CPU

Page 4: ApuntesClases Version Noviembre08

5) Dispositivos de Salida. Son los elementos que tienen la misión de recoger y proporcionar al exterior los resultados, (o la información obtenida como resultado de la manipulación de los datos), de cada uno de los trabajos que se realicen en el sistema. De igual forma que los mencionados anteriormente, se les conoce como periféricos o unidades de salida.

Software – Programas - Software del Sistema y Software de Aplicación Lenguajes de Programación. Sirven para escribir programas que permitan la comunicación usuario/máquina. Unos programas especiales llamados traductores (compiladores e intérpretes) convierten las instrucciones escritas en lenguaje de programación, en instrucciones escritas en lenguaje de máquina (0 1, bits) que ésta pueda entender. - Lenguaje Máquina: son aquellos cuyas instrucciones son directamente

entendibles por la computadora y no necesitan traducción posterior para que el CPU pueda comprender y ejecutar el programa. Una serie de instrucciones en lenguaje máquina podrían ser: 0010 0000 1010 1001

- Lenguajes de Bajo Nivel: las instrucciones en estos lenguajes se escriben en códigos alfabéticos “mnemotécnicos”, tales como ADD MPY, etc. Estos lenguajes permiten simplificar el proceso de escritura de un programa. Son generalmente dependientes de la máquina, es decir, dependen de un conjunto de instrucciones específicas de la computadora. Un lenguaje típico de bajo nivel es el ensamblador.

- Lenguajes de Alto Nivel: son aquellos en los que las instrucciones o sentencias dadas a la computadora son escritas con palabras similares al lenguaje natural (inglés).

Page 5: ApuntesClases Version Noviembre08

COMPILADORES

Un compilador acepta programas escritos en un lenguaje de alto nivel y los traduce a otro lenguaje, generando un programa equivalente independiente, que puede ejecutarse tantas veces como se quiera. Este proceso de traducción se conoce como compilación.

• el de los programas de partida (LA)

• el de los programas equivalentes traducidos (LB), normalmente el lenguaje de máquina

• el lenguaje en que está escrito el propio compilador (LC), que puede ser igual o diferente a LA. Aumenta la portabilidad del compilador si está escrito en el mismo lenguaje, es decir, se puede compilar a sí mismo.

Los programas interpretados suelen ser más lentos que los compilados, pero los intérpretes son más flexibles como entornos de programación y depuración.

Comparando su actuación con la de un ser humano, un compilador equivale a un traductor profesional que, a partir de un texto, prepara otro independiente traducido a otra lengua, mientras que un intérprete informático corresponde al intérprete humano, que traduce de viva voz las palabras que oye, sin dejar

Partes de un compilador

Normalmente los compiladores están divididos en dos partes:

• Front End: es la parte que analiza el código fuente, comprueba su validez, genera el árbol de derivación y rellena los valores de la tabla de símbolos. Esta parte suele ser independiente de la plataforma o sistema para el cual se vaya a compilar.

• Back End: es la parte que genera el código máquina, específico de una plataforma, a partir de los resultados de la fase de análisis, realizada por el Front End.

Esta división permite que el mismo Back End se utilice para generar el código máquina de varios lenguajes de programación distintos y que el mismo Front End que sirve para analizar el código fuente de un lenguaje de programación concreto sirva para la generación de código máquina en varias plataformas distintas.

El código que genera el Back End normalmente no se puede ejecutar directamente, sino que necesita ser enlazado por un programa enlazador (linker).

Tipos de compiladores

Page 6: ApuntesClases Version Noviembre08

Esta taxonomía de los tipos de compiladores no es excluyente, por lo que puede haber compiladores que se adscriban a varias categorías:

• Compiladores cruzados: generan código para un sistema distinto del que están funcionando.

• Compiladores optimizadores: realizan cambios en el código para mejorar su eficiencia, pero manteniendo la funcionalidad del programa original.

• Compiladores de una sola pasada: generan el código máquina a partir de una única lectura del código fuente.

• Compiladores de varias pasadas: necesitan leer el código fuente varias veces antes de poder producir el código máquina.

• Compiladores JIT (Just In Time): forman parte de un intérprete y compilan partes del código según se necesitan.

Pauta de creación de un compilador: En las primeras épocas de la informática, el software de los compiladores era considerado como uno de los más complejos existentes.

Los primeros compiladores se realizaron programándolos directamente en lenguaje máquina o en ensamblador. Una vez que se dispone de un compilador, se pueden escribir nuevas versiones del compilador (u otros compiladores distintos) en el lenguaje que compila ese compilador.

Actualmente existen herramientas que facilitan la tarea de escribir compiladores ó intérpretes informáticos. Estas herramientas permiten generar el esqueleto del analizador sintáctico a partir de una definición formal del lenguaje de partida, especificada normalmente mediante una gramática formal y barata, dejando únicamente al programador del compilador la tarea de programar las acciones semánticas asociadas.

Lenguajes Intérpretes

Un intérprete es un traductor que toma un programa fuente, lo traduce y a continuación lo ejecuta. BASIC es un lenguaje interpretado.

Se trata de traductores-ejecutores ya que con cada instrucción realizan un proceso triple de lectura-traducción-ejecución. Son relativamente lentos, pero muy buenos para la depuración de programas.

Se puede también utilizar una alternativa diferente de los compiladores para traducir lenguajes de alto nivel. En vez de traducir el programa fuente y grabar en forma permanente el código objeto que se produce durante la corrida de

Page 7: ApuntesClases Version Noviembre08

compilación para utilizarlo en una corrida de producción futura, el programador sólo carga el programa fuente en la computadora junto con los datos que se van a procesar. A continuación, un programa intérprete, almacenado en el sistema operativo del disco, o incluido de manera permanente dentro de la máquina, convierte cada proposición del programa fuente en lenguaje de máquina conforme vaya siendo necesario durante el proceso de los datos. No se graba el código objeto para utilizarlo posteriormente.

La siguiente vez que se utilice una instrucción, se le debe interpretar otra vez y traducir a lenguaje máquina. Por ejemplo, durante el procesamiento repetitivo de los pasos de un ciclo, cada instrucción del ciclo tendrá que volver a ser interpretado cada vez que se ejecute el ciclo, lo cual hace que el programa sea más lento en tiempo de ejecución (porque se va revisando el código en tiempo de ejecución) pero más rápido en tiempo de diseño (porque no se tiene que estar compilando a cada momento el código completo). El intérprete elimina la necesidad de realizar una corrida de compilación después de cada modificación del programa cuando se quiere agregar funciones o corregir errores; pero es obvio que un programa objeto compilado con antelación deberá ejecutarse con mucha mayor rapidez que uno que se debe interpretar a cada paso durante una corrida de producción.

Page 8: ApuntesClases Version Noviembre08

Datos, Variables y Expresiones.

Datos

Los datos son representaciones abstractas de hechos u objetos.

Un dato es una representación simbólica (numérica, alfabética, etc.) de un atributo o característica de una entidad. El dato no tiene valor semántico (sentido) en sí mismo, pero convenientemente tratado (procesado) se puede utilizar en la realización de cálculos o toma de decisiones.

Es la información con la que se alimenta un proceso para producir resultados. Es un caracter o conjunto de caracteres que representa el valor que toma una variable con la que opera la computadora. Se tienen tres tipos de datos simples:

Numéricos: están compuestos sólo de caracteres numéricos, el punto decimal y el signo. Agrupa a los números enteros y reales (positivos, negativos y cero) con valores de -1,79769313486232E308 a -4,94065645841247E-324 para valores negativos y de 4,94065645841247E-324 a 1,79769313486232E308 para valores positivos.

Cadena: están compuestos por una mezcla de los caracteres alfabéticos y numéricos, es el tipo predefinido en Algoritmia. Así, por ejemplo, si se quiere almacenar la dirección de una persona se necesitará combinar datos numéricos y alfabéticos. Ejemplo: 'Urbanización Campo Azul. Edificio F. Apto 1-4'

Entonces, una cadena es cualquier expresión que consiste en una secuencia de caracteres contiguos encerrados entre comillas simples como por ejemplo: 'Algoritmo', '0416-6752325', 'LAB 65E’.

Lógicos: es tipo de dato llamado lógico tiene como característica principal que únicamente puede tomar dos valores: Verdadero (.V.) o Falso (.F.). Ejemplo: HorasExtra = .V.

Variables

La variable es un dato cuyo valor puede ser modificado durante la ejecución del programa. Una variable es una dirección de memoria y puede verse como una pequeña caja donde se pueden guardar valores. Estos pueden ser de cualquiera de los tipos vistos anteriormente (numéricos, alfabéticos, alfanuméricos, etc.). Cuando se hace mención a una variable, se está refiriendo a una pequeña zona de la memoria principal (conjunto de posiciones contiguas) donde se va a alojar un valor. Si este valor se modifica en algún momento del programa, el nuevo valor sustituirá al que existía anteriormente. Al conjunto de posiciones contiguas de

Datos Procesamiento Información

Page 9: ApuntesClases Version Noviembre08

memoria se le da un nombre para poder identificarlo (nombre de la variable) y se define su tipo (clase de caracteres que puede contener).

Expresiones Aritméticas

De la evaluación de una expresión aritmética siempre se obtiene un valor de tipo entero o real. En las expresiones aritméticas se pueden utilizar los siguientes operadores aritméticos :

Las expresiones aritméticas son expresiones simples construidas con operadores aritméticos y constantes o referencias a las celdas. Los operandos son los valores sobre los que actúa el operador. Existen dos tipos de operadores aritméticos:

• Unarios: operadores que actúan sólo sobre un elemento y utilizan un solo operando ubicado a la derecha del operador. Por ejemplo: = -A6

• Binarios: operadores que actúan sobre dos elementos y utilizan dos operadores, uno ubicado a cualquiera de los dos lados del operador. Por ejemplo: = B4 + A6

Operadores aritméticos Los operadores aritméticos son de la siguiente manera: Operador Nombre Tipo Descripción + Operador de adición (o suma) Binario Suma dos valores

- Operador de substracción (o resta) Binario Resta dos valores

- Operador de inversión Unario Proporciona el valor opuesto de un valor

* Operador de multiplicación Binario Multiplica dos valores

/ Operador de división Binario Divide dos valores

Div Operador de división entera Binario Proporciona el resultado entero de la división del operando de la izquierda entre el operando de la derecha

Mod Operador de módulo Binario Da el historial completo de una división de dos números

Page 10: ApuntesClases Version Noviembre08

Uso de los paréntesis Los operadores aritméticos se usan en un orden predefinido o de prioridad. Para modificar la prioridad predefinida se deben usar paréntesis. Esta tabla muestra la prioridad de los operadores:

Prioridad del operador ++++++ ()

+++++ Mod Div * /

+++ + -

Cuando dos operadores tienen la misma prioridad, los cálculos se realizan de izquierda a derecha. Programas

Page 11: ApuntesClases Version Noviembre08

METODOLOGÍA PARA LA CONSTRUCCIÓN DE PROGRAMAS. La Ingeniería de Software es una disciplina que comprende al conjunto de técnicas destinadas a la producción de un programa de computadora, más allá de la sola actividad de diseño. El proceso de creación de programas es un proceso netamente creativo. Durante varias décadas se ha tratado de encontrar procesos o metodologías predecibles y repetibles que mejoren la productividad de los programadores y la calidad de los programas. Se han establecido varios modelos o paradigmas de desarrollo en los cuales apoyarse para la creación de software. Uno de ellos es el “Modelo en Cascada”, en el cual, se ordenan las fases o pasos que se deben seguir para obtener la solución a los problemas, de forma tal que el inicio de cada etapa debe esperar a la finalización de la inmediatamente anterior. Una versión simplificada del modelo en cascada comprende las etapas siguientes: 1) Formulación y Análisis del Problema 2) Diseño del programa 3) Codificación y Ejecución 4) Pruebas y Depuración.

Seguidamente se especifican las acciones a realizar en cada una de las fases de la metodología, especificadas anteriormente. 1) Formulación y Análisis del Problema: En esta fase se estudia el problema planteado para comprenderlo y reducirlo a términos claros y precisos; para establecer sus límites y características, así como también para sugerir posibles soluciones. En el estudio se determinan tres aspectos:

+ ¿Qué datos se necesitan para resolver el problema, cuáles son? + ¿Cómo manipular esos datos para obtener el resultado deseado? + ¿Cuál es la presentación más conveniente o adecuada de los resultados?

A continuación se presentan estos aspectos, expresados respectivamente en términos de Entradas – Procesos – Salidas y representados en forma de diagrama de bloques.

Entradas Procesos Salidas

¿Datos? ¿Tipo? ¿Variables? ¿Restricción?

¿Cálculos o Transformaciones? ¿Variables? ¿Tipo? ¿Restricción?

¿Resultados? ¿Comentarios? ¿Condición?

Page 12: ApuntesClases Version Noviembre08

En cada uno de los bloques se identifican las acciones que constituyen las especificaciones de las funciones a realizar. Entradas : En esta sección se indican los requerimientos del problema, es decir, ¿qué se necesita para resolver el problema planteado? ¿Cuáles son los datos que se van a utilizar?, ¿Cuales son las variables que los van a contener o a almacenar?, ¿De qué tipo son?, ¿Existe alguna restricción para ellas? Procesos : Se refiere a las operaciones o cálculos que deben realizarse con los datos, para obtener la solución del problema planteado. También deben especificarse las variables que van a contener los resultados de las operaciones realizadas y cuales son sus tipos respectivos; así como también las restricciones a tomar en cuenta, (si existe alguna). Salidas : Se debe indicar en esta sección la manera como se desea presentar los resultados obtenidos con las transformaciones indicadas en los Procesos. ¿Qué comentarios se van a incluir? ¿De qué manera se van a presentar? Recomendaciones: - A las variables a utilizar se les deben asignar, preferiblemente, identificadores mnemónicos, es decir, nombres que las describan y permitan asociarlas fácilmente con su contenido. - En las salidas, se deben colocar preferiblemente, los textos tal como se desea que aparezcan posteriormente en pantalla, o mejor dicho, de la manera más parecida a como se escribirán en el programa codificado. Esto es, los comentarios encerrados entre comillas, con las variables intercaladas, separados por comas.

Ejemplo : Calcular el promedio de notas de un estudiante que presentó tres exámenes parciales con igual porcentaje cada uno.

Otra manera de expresar las variables a utilizar en el programa, se hace con la utilización de una tabla, en la que se especifica el nombre de cada una de las variables, su tipo, descripción, restricciones, etc., como se muestra a continuación:

Nombre_Alum Alfanumérica Nota1, Nota2, Nota3 Numéricas Enteras. 0 - 20

‘La nota obtenida por el estudiante ‘, Nombre_Alum, ‘es’, Promedio

Promedio = Nota1+ Nota2+ Nota3 3 Promedio Variable Numérica – Real 0 < Promedio > 20

Entradas Procesos Salidas

Page 13: ApuntesClases Version Noviembre08

2) Diseño del Programa En esta sección se utilizan las especificaciones realizadas en la fase anterior para establecer e identificar la secuencia de pasos o instrucciones que van a conformar el programa. Existen muchas herramientas que permiten llevar a cabo esta etapa de la metodología pero en este texto se utilizarán sólo los algoritmos estructurados y los diagramas de flujo. Antes de adentrarse en el diseño del programa, es conveniente conocer los conceptos de Programación Modular y Estructurada. Programación Modular y Estructurada Se entiende por Programación Modular… Estructuras de Control Señalan o indican el flujo de control a seguir por las instrucciones que conforman el programa. Son estructuras que utilizamos normalmente en nuestra vida diaria, para resolver cualquier problema o ante cualquier situación. Por ejemplo, para vestirnos seguimos una secuencia, para comer, para cambiar un caucho, etc. Vamos a formalizar aquí las estructuras para utilizarlas en la construcción de programas, para que nos sirvan en la resolución de problemas susceptibles de ser resueltos con una computadora. - Secuenciales: se denominan así porque siguen un orden, una secuencia. Se

ejecuta una después de la otra, por orden de aparición. No hay alteración en la secuencia al llegar a ellas. Son instrucciones simples, conformadas por una sola tarea o acción a ejecutar cada vez, una sola línea de programa.

- De Decisión: tienen una entrada y dos posibles salidas, de acuerdo a la

evaluación de una condición dada. Existe una bifurcación en el control del programa. Son instrucciones compuestas, conformadas por más de una tarea o acción a ejecutar cada vez, integradas por varias líneas de programa. También pueden ser encontradas en la literatura, como Estructuras Selectivas o Estructuras de Selección.

Nombre Variable Tipo Descripción Restricción Nota1 Numérica - Entera Nota Primer Parcial Valor entre 0 y 20 Nota2 Numérica - Entera Nota Segundo Parcial Valor entre 0 y 20 Nota3 Numérica - Entera Nota Tercer Parcial Valor entre 0 y 20 Nombre_Alum Alfanumérica Nombre del Alumno Cadena 30caracteres Promedio Numérica – Real Promedio de notas Valor entre 0 y 20

Page 14: ApuntesClases Version Noviembre08

- De Repetición: en ellas se realiza una acción hasta que se cumpla una condición o mientras se cumpla una condición. De igual manera que las anteriores, son instrucciones compuestas. También se les denomina Estructuras Repetitivas.

ALGORITMOS Introducción Los matemáticos hindúes, árabes y europeos fueron los primeros que desarrollaron técnicas de cálculo escrito. El matemático árabe Al'Khwarizmi, alrededor del año 830 DC, escribe un libro de Aritmética, traducido al latín como “Algoritmi de numero Indorum”, donde introduce el sistema numérico indio (sólo conocido por los árabes unos 50 años antes) y los métodos para calcular con él. De esta versión latina proviene la palabra Algoritmo. Por algoritmo se entiende "una lista de instrucciones donde se especifica una sucesión de operaciones necesarias para resolver cualquier problema de un tipo dado". Los algoritmos son modos de resolución de problemas, cabe aclarar que no sólo son aplicables a la actividad intelectual, sino también a todo tipo de problemas relacionados con actividades cotidianas. El algoritmo es de carácter general y puede aplicarse a cualquier operación matemática o a cualquier problema. La formulación de algoritmos fue uno de los más grandes adelantos dentro de la ciencia matemática ya que a partir de ello se pudieron resolver infinidad de problemas. Landa, matemático ruso, quien ha investigado mucho al respecto nos dice que "la ciencia matemática, en el proceso de su desarrollo, ha tratado de encontrar los algoritmos óptimos más generales para resolver los problemas que permitan la solución uniforme de clases más amplias de problemas de una manera, es decir, empleando siempre el mismo sistema de operación. Los algoritmos, para llegar a ser tales deben reunir ciertas características. Una de ellas es que los pasos que deben seguirse deben estar estrictamente descritos, cada acción debe ser precisa, y debe ser general, es decir, que pueda ser aplicable a todos los elementos de una misma clase. Por ejemplo en el caso del algoritmo de una multiplicación, no sólo se realizará el procedimiento de resolución parte para la multiplicación de 4 x 4, sino que el mismo algoritmo podrá aplicarse a cualquier multiplicación. La última de estas características será la resolución, en otras palabras, esto quiere decir que el algoritmo deberá llegar a un resultado específico. Es de gran importancia aclarar que los algoritmos en si mismos no resuelven problemas, se resuelven gracias al producto de ejercer las operaciones dictadas por el algoritmo, se puede decir que es por el planteamiento mismo. La realización de algoritmos es natural e innata en el hombre y en la mayoría de los casos es de

Page 15: ApuntesClases Version Noviembre08

tipo inconsciente, en otras palabras, las personas suelen resolver problemas sin tener que recurrir a la aplicación de cierto algoritmo. No obstante al encontrarse con problemas de un grado de dificultad mayor es necesario detenerse a analizar y pensar en la solución de éste. 2. Algoritmo: Un Algoritmo es un método para resolver un problema, mediante una serie de pasos precisos, definidos y finitos. Algunos autores lo definen como una serie de operaciones detalladas, un conjunto de reglas para resolver una cierta clase de problemas y se puede formular de muchas formas con el cuidado de que no exista ambigüedad. Está escrito en lenguaje natural. Algoritmos Cotidianos: una receta de cocina, el conjunto de pasos que se siguen para realizar una llamada telefónica desde un teléfono público, el conjunto de pasos para cambiar el caucho de un carro. Definición :

“Es un conjunto finito de pasos en secuencia, que indican cómo se resuelve un determinado problema”.

Sus propiedades son:

- Es finito (tiene principio y un fin; un número determinado de pasos) - Es definido. (Siguiendo la secuencia de pasos establecida se obtiene

siempre el resultado al problema planteado. - Es eficiente (trata de resolver el problema en el menor número de pasos

posible y además, de manera clara y precisa. Es efectivo). Las características principales de los algoritmos son las siguientes:

- Es preciso. Cada paso está numerado en orden de secuencia. Se indica el orden de realización de cada paso y no puede tener ambigüedades.

- Cada paso se inicia con un verbo, que indica sin lugar a dudas la acción a realizar en dicho paso.

- Se utilizan las estructuras de control establecidas (Secuenciales, de Decisión y de Repetición).

- Un Algoritmo puede tener cero ó más entradas y debe tener al menos una salida y ésta debe ser tangible.

- Debe ser Sencillo, Legible. - Modular - Correcto.

Page 16: ApuntesClases Version Noviembre08
Page 17: ApuntesClases Version Noviembre08

DIAGRAMAS DE FLUJO El diagrama de flujo es una representación gráfica del algoritmo. Muestran de manera clara y sencilla el comportamiento de un algoritmo. A los diagramas de flujo también se les conoce como “ Flujogramas” . Esta técnica constituye una herramienta muy útil para la realización de un buen programa, pues permite que el programador organice sus ideas y conozca a fondo el problema a solucionar, con todas las posibles variantes o alternativas. Existen convenciones internacionales acerca de la figura a utilizar para cada función ejecutada por el algoritmo. En la tabla siguiente se muestran las figuras utilizadas en la construcción de diagramas de flujo y su respectiva función.

Todas las figuras están unidas por flechas, que indican el flujo de control del programa.

Función Figura

Señalar el Inicio y Fin de un programa

Operaciones de Entrada, Lectura o Introducción de datos

Operaciones de Salida, Escritura, Impresiones

Operaciones de Cálculo, Asignaciones

Comparaciones, Estructuras de Desición

Conectores

Estructuras de Repetición Indexada

Llamadas a subprogramas

Page 18: ApuntesClases Version Noviembre08
Page 19: ApuntesClases Version Noviembre08

Estructuras Secuenciales

PROBLEMAS PROPUESTOS

1.- Calcular el Área de un triángulo de base B y altura H. 2.- Dados dos números cualesquiera, A y B, determinar cuál es el mayor. 3.- Calcular el volumen de un cilindro de radio (r) y altura (h) sabiendo que V = r2h 4.- Calcular el volumen y el área de superficie de un paralelepípedo de

dimensiones l, a y h. 5.- Calcular el sueldo neto mensual (SNM) de un empleado, conociendo su pago

por hora trabajada (PH), el número de horas trabajadas al mes (NTHM), el porcentaje de descuento por Impuesto sobre la renta (ISLR), el porcentaje de descuento por Seguro Social, (SS), el nombre del empleado (NOM) y su Cédula de Identidad (CI).

Respuesta.- SB = PH * NTHM SNM = SB – SB*ISLR – SB*SS 6.- Dados tres valores A, B y C, intercambiar ente sí los valores de esas variables,

de tal manera que ninguna de ellas conserve su valor inicial. 7.- La tarifa que cobra una compañía telefónica por las llamadas locales que duran

hasta 3 minutos es de 250 Bs. El valor del minuto adicional es 90 Bs. Realizar un programa que calcule el monto a pagar por llamada, si se conoce el tiempo total por llamada.

8.- En un espectáculo público, el costo de las entradas es Bs. 15.000 niños y Bs.

30.000 los adultos. Elaborar un programa para calcular: - Número total de asistentes. - Monto recaudado por la asistencia de niños. - Monto recaudado por la asistencia de adultos. - Monto total recaudado. 9.- Calcular el Área de un cuadrado. 10.- Calcular el Área de un círculo. Área = π * r2 11.- En una empresa de cambio de monedas se necesita transformar Bolívares

(Bs.) en Dólares ($). 12.- Calcular el promedio aritmético de tres números.

a l

h V = l * a * h A = 2 * (l * a + l * h + a * h)

Page 20: ApuntesClases Version Noviembre08

13.- Calcular el promedio de notas de un alumnos que presentó cinco (5)

exámenes parciales. 14.- Calcular la siguiente expresión algebraica: 15.- Cálculo del bono que recibirá un vendedor, sabiendo que se le paga el 13%

de las ventas realizadas. 16.- El porcentaje (%) de un número cualquiera. 17.- Cálculo de la nota definitiva, a partir de las notas obtenidas en 4 exámenes

parciales, cuya ponderación es en el siguiente orden: 25%, 15%, 20% y 40%. 18.- En una tienda de electrodomésticos, un cliente compra tres artículos. Se

desea saber cuál es el monto a pagar, sabiendo que a la suma de los tres montos se le agrega el 16.5% de impuesto.

19.- Una academia de computación desea determinar cuál es el sueldo a pagar

a un profesor que gana su sueldo por horas de clase dictadas. 20.- Lea dos puntos (x, y) y calcule la distancia entre ellos. 21.- Una empresa quiere calcular el sueldo de un empleado, sabiendo que el

sueldo neto es igual a al sueldo base más la s asignaciones menos las deducciones, tomando como datos de entrada los siguientes:

+ Sueldo Base (SB). + Asignaciones: - Prima por hijos (1% SB por cada hijo), - Prima por hogar (0.75% SB), - Bono asistencial (1.25% SB), - Prima profesional (3% SB); + Descuentos: - Aporte a la Caja de Ahorros (10% SB), - Aporte al Seguro Social (2% SB). 22.- Calcular el precio de un paquete turístico, sabiendo que se pagan 500 Bs.

por cada kilómetro recorrido y 30.000 Bs. por cada noche de estadía. 23.- Se sabe que una empresa realizó ventas netas de 235.000 Bs. durante una

semana, en las cuales participaron tres vendedores. Se desea calcular el sueldo de cada vendedor, sabiendo que los vendedores realizaron las siguientes ventas: el primero vendió un tercio de las ventas netas el segundo la tercera parte y el tercero el resto. Además a cada vendedor se le paga el 15% del total de las ventas netas realizadas.

y1 – y2

z = ------------

x1 – x2

Page 21: ApuntesClases Version Noviembre08

Sentencias

Condición V F

ESTRUCTURAS DE DECISIÓN

Como su nombre lo indica, son estructuras en las cuales se toma una decisión, de acuerdo a la evaluación de una determinada condición construida en base a una expresión lógica. Tienen una entrada y dos posibles salidas, de acuerdo al valor que toma la condición establecida. En ellas se bifurca el flujo de control del programa. También se les conoce como Estructuras Selectivas , pues se selecciona un camino a seguir, de acuerdo al resultado de la evaluación de una condición o expresión lógica. De acuerdo a la forma de las estructuras de decisión, éstas se pueden ser de los siguientes tipos: - Simples - Dobles - Anidadas Estructuras de Decisión Simple : Son aquellas estructuras selectivas en las cuales se evalúa una condición, y si ésta es verdadera, se ejecuta una acción o un grupo de acciones. Si la condición no se cumple, el flujo de control pasa a la instrucción inmediata siguiente después de la estructura de decisión, sin realizar ninguna acción. En nuestra vida cotidiana se utilizan estructuras de este tipo en muchas situaciones. Por ejemplo, cuando le decimos a alguien: “Si ves a tal persona, por favor entrégale esto”. Cuando vamos conduciendo un automóvil por una carretera y vemos una estación de combustible. Si necesitamos, nos detenemos; en caso contrario, continuamos. Cuando verificamos el estado del tiempo antes de salir de casa. Si está lloviendo, llevamos el paraguas, si no, no lo llevamos. Si esta última situación la estableciésemos formalmente usando una estructura de decisión, sería como sigue: Si la condición “está lloviendo” se cumple, entonces ejecutamos la acción “llevar el paraguas”. El caso contrario no se considera, pues se continúa con la realización de las acciones que se tenían previstas.

En una estructura de decisión simple, puede necesitarse ejecutar una sola acción en caso que la condición se cumpla o puede necesitarse la

ejecución de varias acciones. En el recuadro de la izquierda se muestra el caso de la ejecución de una única acción cuando se cumple la condición. En el de la derecha se plantea la ejecución de un grupo de acciones.

Si Condición Entonces Sentencia 1 {Fin Si }

Si Condición Entonces Sentencia 1 Sentencia 2 : Sentencia n {Fin Si }

Page 22: ApuntesClases Version Noviembre08

V

Inicio

Fin

A > B

‘Los valores son’, A,’ y ‘,B

A, B

Aux A A B B Aux

‘Introduzca dos Valores’

F

Ejemplo 1: Programa que intercambia los valores de dos números A y B si no están en orden creciente y no hace nada si están ordenados. Diagrama de Flujo Algoritmo

Nota: En este programa se utiliza el concepto de variable auxiliar, (la variable denominada Aux), para intercambiar los valores de las variables A y B, de tal manera que se evite la pérdida de uno de los valores contenidos en las variables A o B. Pues como es bien sabido, la operación de asignación es destructiva, y al asignar un valor a una variable, se pierde el valor anteriormente contenido en la misma.

Uso de una variable auxiliar:

1.- Inicio 2.- Escribir (‘Introduzca dos valores’) 3.- Leer (A,B) 4.- Comparar Si (A > B) Entonces

4.1.- Asignar Aux = A 4.2.- Asignar A = B 4.3.- Asignar B = Aux

5.- Escribir (‘Los valores introducidos son’,A,‘ y ‘,B) 6.- Fin

A B Aux

Page 23: ApuntesClases Version Noviembre08

Ejemplo 1: Codificación en Turbo Pascal Program Intercambio; {Programa que intercambia los valores de dos números A y B si no están en orden creciente y no hace nada si están ordenados} Uses Crt, DOS; Var A, B, Aux : Integer; Begin Writeln ('Introduzca los dos valores'); Readln (A,B); If (A>B) then Begin Aux := A; A := B; B := Aux End; Writeln ('Los valores introducidos son ', A, ' y ', B); Readln End.

Page 24: ApuntesClases Version Noviembre08

Sentencias

Condición V F

Sentencias

Estructuras de Decisión Doble : Son aquellas estructuras selectivas en las cuales se evalúa una condición, y si ésta es verdadera, se ejecuta una acción o un grupo de acciones. En caso contrario, es decir, en caso que la condición no se cumpla, se realiza otra acción u otro grupo de acciones. Esta estructura, escrita en lenguaje natural, se expresa como sigue:

Si Condición Entonces Sentencia 1 De lo contrario Sentencia 2 {Fin Si}

Page 25: ApuntesClases Version Noviembre08

Ejemplo 1: Programa para determinar si un número dado, introducido por teclado, es par o impar. Ejemplo 1: Codificación en Turbo Pascal Program Par; {Programa para determinar si un numero n dado, es par o impar} Uses Crt; Var N : Integer; Begin Clrscr; Writeln ('Introduzca un numero "n" diferente de cero'); Readln (N); If (N mod 2 = 0)

Then Writeln ('El numero ', n, ' es par ') Else Writeln ('El numero ', n, ' es impar '); Readln End.

Page 26: ApuntesClases Version Noviembre08

F V

Condición

Sentencias

V F Condición

Estructuras de Decisión Anidadas : Cuando se insertan unas estructuras de decisión dentro de otras, se dice que las mismas están anidadas. En ese caso, se van realizando comparaciones sucesivas, es decir, se pueden evaluar sucesivamente varias condiciones a diferentes niveles. Puede anidarse cualquier tipo de estructura de decisión, esto es, Simples con Simples, Simples con Dobles, o Dobles con Dobles, etc., a varios niveles, según convenga. La figura a la derecha, muestra el anidamiento de dos estructuras de decisión simples.

Anidamiento Permitido Anidamiento No Permitido

Si 1

Fin Si 1

Si 2

Fin Si 2

Si 3

Fin Si 3 Si 4

Fin Si 4

Fin Si 1

Si 1

Si 2

Fin Si 2

Si 3

Fin Si 3

Si 4

Fin Si 4

Si 1

Fin Si 1

Si 2

Fin Si 2

Si 3

Fin Si 3 Si 4

Fin Si 4

Fin Si 1

Si 1

Si 2

Fin Si 2

Si 3

Fin Si 3

Si 4

Fin Si 4

Page 27: ApuntesClases Version Noviembre08

Ejemplo 1: Programa para determinar el mayor de tres números cualesquiera introducidos por teclado

Ejemplo 1: Codificación en Turbo Pascal Program Mayor; {Programa que encuentra el mayor de tres enteros introducidos por teclado} Uses Crt; Var A, B, C : Integer; Elmayor : Integer; Begin Clrscr; Writeln ('Introduzca los tres números enteros'); Readln (A,B,C); {Determinar el mayor} If (A > B) Then If (A > C)

Then Elmayor := A Else Elmayor := C Else If (B > C)

Then Elmayor := B Else

Elmayor := C; Writeln ('El numero mayor es ', Elmayor); Readln End.

Page 28: ApuntesClases Version Noviembre08

También se pueden diferenciar las estructuras de decisión de acuerdo al tipo de condición, en Simples y Compuestas. Estructuras de Decisión Compuestas : También existen en la literatura, las llamadas Estructuras de Decisión Compuestas. Son estructuras selectivas que utilizan Condiciones Compuestas. Una Condición Compuesta está conformada por varias Condiciones Simples, separadas por operadores lógicos. Es decir, es una expresión lógica compuesta por constantes y/o variables, separadas por operadores aritméticos y operadores lógicos o relacionales. Estos últimos son los operadores “Y”, “O” y “No”, que codificados a un lenguaje de programación, son respectivamente “And ”, “Or” y

“Not ”. Por ejemplo la expresión (A > 3) Y (B < 2 * C), constituye una Condición Compuesta. Tablas de Verdad para los operadores lógicos:

Condición 1 Operador Condición 2 Resultado V Y (And) V V V Y (And) F F F Y (And) V F F Y (And) F F

Condición 1 Operador Condición 2 Resultado V O (Or) V V V O (Or) F V F O (Or) V V F O (Or) F F

Condición 1 Operador Expresión Resultado V No (Not) Not(Condición 1) F F No (Not) Not(Condición 1) V

Page 29: ApuntesClases Version Noviembre08

Ejemplo 1: Si dos números A y B son mayores que un tercero C, entonces asígnele a la variable A el producto del mayor de los tres por el menor de ellos.

Page 30: ApuntesClases Version Noviembre08

PROBLEMAS PROPUESTOS

1.- Encontrar las raíces reales de una ecuación cuadrática: aX2 + bX + c = 0 . Sabemos que b y c pueden ser cualquier número, incluyendo el 0. Sin embargo, a no puede ser 0 porque la ecuación se volvería lineal. Si a y b = 0, la ecuación no tendría solución. Si b ≠ 0 pero a = 0, se tiene una solución única de x = -c/b. Si b2 - 4ac < 0, no existen raíces reales. Si b2 – 4ac = 0, las raíces serán repetidas x1 = x2 = -b/2. Las raíces reales de una ecuación cuadrática se pueden calcular por la siguiente

fórmula: (-b ± √(b2 - 4ac))/2a Nota: el programa debe indicar mediante un mensaje cada uno de los casos. 2.- Basándose en el año de fabricación y el peso del automóvil en una fábrica se

determina la tarifa de registro según la siguiente tabla: El programa debe aceptar el año y el peso del auto e imprimir la categoría y la

tarifa. 3.- El cuadrante en el cual se ubica una línea dibujada desde el origen está

determinado por el ángulo que la línea forma con el eje positivo de x en la siguiente forma:

Ángulo del eje positivo de x Cuadrante Entre 0 y 90 grados I Entre 90 y 180 grados II Entre 180 y 270 grados II Entre 270 y 360 grados IV

El programa debe aceptar el ángulo de la línea como dato de entrada y desplegar

el cuadrante apropiado, según la tabla dada. Si el ángulo es exactamente 0, 90, 180 o 270 grados, la línea resultante no se ubica en ningún cuadrante sino en cada uno de los ejes respectivos.

4.- Dados tres números A, B y C, enteros y diferentes, el programa debe

imprimirlos en forma descendente.

Año (modelo) Peso (lb.) Categoría de Peso Tarifa de Registro 1970 o anterior Menos de 2.700 1 Bs. 11.600 2.700 a 3.800 2 Bs. 23.200 Más de 3.800 3 Bs. 34.800 1971 a 1979 Menos de 2. 700 4 Bs. 13.000 2.700 a 3.800 5 Bs. 26.000 Más de 3.800 6 Bs. 39.000 1980 o posterior Menos de 3.500 7 Bs. 12.000 3.500 o más 8 Bs. 46.000

Page 31: ApuntesClases Version Noviembre08

5.- Dado tres números determinar si la suma de cualquier pareja de ellos es igual al tercer número. Si se cumple esta condición el programa debe imprimir “IGUALES”, de no ser así debe escribir “DISTINTAS”.

6.- Se desea saber si un año leído del teclado es bisiesto. (Cada año divisible por 4 es bisiesto, con excepción de los años que finalizan en 00 - esto es, divisible por 100 y no divisible por 400).

7.- Escribir un programa para determinar si un atleta se selecciona para correr

el maratón de Nueva York. Para seleccionar a un corredor, éste debe haber terminado un maratón anterior en un determinado tiempo. Los tiempos de calificación son 150 minutos para hombres menores de 40 años de edad; 175 minutos para hombres mayores de 40 años y 180 minutos para mujeres.

Los datos a introducir al programa son: sexo, edad y tiempo efectuado en su anterior maratón.

8.- Los empleados de una fábrica trabajan en dos turnos: diurno y nocturno. Se desea calcular el sueldo diario de acuerdo a los siguientes puntos:

a) La tarifa de las horas diurnas es de Bs. 500. b) La tarifa de las horas nocturnas es de Bs. 800. c) En caso de ser domingo, la tarifa se incrementará en 200 Bs. el turno

diurno y 300 Bs. el turno nocturno. Se ingresa por teclado el número de horas trabajadas por turno y el día. 9.- Averiguar si, dados dos números leídos del teclado, uno es divisor del otro. 10.- Se introduce por teclado la hora del día en horas, minutos y segundos. Se desea escribir la hora correspondiente al segundo siguiente (ejemplo, 3h 45m 24s, un segundo después 3h 45m 25s). 11.- Deducir si un número leído del teclado es negativo, positivo o cero. 12.- Escribir un programa que acepte dos números del teclado, calcule su

suma e imprima mensajes de acuerdo al resultado obtenido: Suma <= 50 Suma > 50 y <= 100 Suma > 100 y <= 200 Suma > 200 13.- Escribir un programa que lea el precio de un artículo desde el teclado y

calcule su precio neto teniendo en cuenta las siguientes hipótesis + Precio menor o igual a 10.000 Bs.: sin descuento + Precio mayor que 10.000 Bs. y menor que 25.000: descuento del 10% + Precio mayor o igual a 25.000 Bs.: descuento del 20%.

Page 32: ApuntesClases Version Noviembre08

14.- Calcular el sueldo neto mensual de un empleado conociendo su pago por hora trabajada y el número de horas trabajadas al mes. Se sabe que si el Salario Bruto es mayor de Bs. 1.000.000, el % de descuento por Impuesto sobre la renta es 5% y el descuento por Seguro Social es 3%. Si el sueldo es menor que 1.000.000 no se le deduce Impuesto sobre la renta.

15.- Dados tres valores A, B y C que representan los lados de un triángulo, se desea determinar si esas tres longitudes:

a) Forman un triángulo Equilátero. b) Forman un triángulo Isósceles. c) Forman un triángulo Escaleno.

16.- Un cierto acero se gradúa de acuerdo a los resultados de tres pruebas, que se efectúan para determinar si satisface las especificaciones siguientes:

- Si el contenido de Carbono está bajo 0.7. - La dureza Rockwell es mayor que 50. - La fatiga de tensión es superior a los 80.000 psi (libras por pulgada

cuadrada).

El acero es de grado 10 si supera las tres pruebas; de grado 9 si supera las pruebas 1 y 2; de grado 8 si sólo pasa la prueba 1 y falla la prueba 2; y de grado 7 si falla la prueba 1.

Page 33: ApuntesClases Version Noviembre08

ESTRUCTURAS DE REPETICIÓN Las estructuras de Control repetitivas son aquellas en las que una sentencia o grupo de sentencias se repite muchas veces. Este conjunto de sentencias se denomina bucle . Concepto de Bucle: Una estructura de control que permite la repetición de una serie determinada de sentencias, se denomina bucle, lazo o ciclo (en inglés loop). A la acción o conjunto de acciones que se repiten en un bucle se les denomina el cuerpo del bucle y cada repetición del cuerpo del bucle se denomina iteración. En otras palabras, el cuerpo del bucle contiene la sentencia, o el grupo de sentencias, que se van a repetir. Toda estructura de repetición consta de dos tipos de sentencias: la(s) sentencia(s) usadas para control de las repeticiones y el cuerpo del bucle. Las estructuras de repetición se dividen en: Estructuras Condicionales y Estructuras Indizadas, (o Indexadas). DISEÑO DE BUCLES Para diseñar bucles es necesario tener en cuenta una serie de reglas, para tratar de evitar al máximo los errores. 1.- Inicialización de Variables: Significa dar valores iniciales a las variables antes de que sean utilizadas en la ejecución del programa. Turbo Pascal inicializa las variables por defecto cuando no se les han asignado valores mediante sentencias de lectura o sentencias de asignación. Las variables numéricas se inicializan a cero, las variables lógicas se inicializan a falso y las variables tipo cadena de caracteres (string) a cadena vacía. Pero es mejor asegurarse; por tanto se recomienda asignar valores a las variables mediante sentencias de lectura o de asignación antes de ser utilizadas (inicialización). ¿A qué valores se debe inicializar? Dependerá de cada situación, pero normalmente se suele inicializar las variables con valores de cero ó uno (0 ó 1). 2.- Bucles Infinitos: Un bucle que se repite continuamente y que no se termina nunca, se llama bucle infinito. Se debe tener especial cuidado en tratar de modificar la condición en el interior del bucle, para cambiar su valor y así detener el bucle. Como regla general, es más seguro, para terminar un bucle, utilizar comparaciones mayor o menor que, en lugar de probar igualdades o desigualdades. Puesto que los números reales se almacenan como cantidades aproximadas, las comparaciones de igualdad entre números reales no tienen sentido. Siempre que se comparen valores reales, deben utilizarse los operadores: mayor, mayor o igual, menor, menor o igual.

Page 34: ApuntesClases Version Noviembre08

Cuerpo del bucle

Condición

ESTRUCTURAS DE REPETICIÓN CONDICIONALES Se denominan estructuras de repetición condicionales, a las estructuras de control repetitivas en las que se utiliza una condición (expresión lógica) para controlar las iteraciones. Las estructuras de Repetición Condicionales son: Repita Mientras y Repita Hasta, que codificadas en Pascal son: While-Do y Repeat-Until. Codificadas en Lenguaje C son respectivamente: While y Do-While, en tanto que en Turbo Basic son: I.- LA ESTRUCTURA REPITA MIENTRAS La estructura de repetición Repita Mientras (While - Do) es aquella en la que el número de iteraciones no se conoce por anticipado y el cuerpo del bucle se repite mientras se cumple una determinada condición. Cuando se ejecuta la sentencia Repita Mientras, (While - Do), lo primero que ocurre es la evaluación de la condición (expresión lógica). Si ésta se cumple, es decir, si la expresión lógica se evalúa a verdadero, entonces se ejecuta el cuerpo del bucle y se evalúa nuevamente la condición. Si la condición no se cumple (si la expresión lógica se evalúa a falso), no se ejecuta ninguna acción y el programa prosigue en la sentencia inmediata siguiente después del bucle. Este proceso se repite mientras la expresión lógica (condición) permanezca verdadera. Después de cada iteración, la condición se evalúa y se verifica de nuevo, y si es verdadera, el bucle se repite nuevamente; si cambia de verdadera a falsa, la estructura de repetición finaliza y el control del programa se transfiere a la sentencia siguiente, inmediatamente después del lazo. Reglas de Funcionamiento 1.- La condición se evalúa antes y después de cada ejecución del bucle. Si la

condición es verdadera, se ejecuta el bucle, y si es falsa, el control pasa a la instrucción siguiente después del bucle.

2.- Si la condición no se cumple cuando se ejecuta el bucle por primera vez, el

cuerpo del bucle no se ejecutará nunca. En este caso se dice que el bucle se ha ejecutado cero veces.

F

V

Page 35: ApuntesClases Version Noviembre08

3.- Mientras la condición sea verdadera, el bucle permanecerá ejecutándose. Esto significa que el bucle se ejecutará indefinidamente, a menos que se cambie el valor de la condición en el interior del bucle, haciendo que su valor pase a falso. Si la expresión nunca cambia de valor, entonces el bucle no termina nunca y se denomina bucle infinito.

PSEUDOCÓDIGO A aquellas estructuras cuyo cuerpo del bucle está conformado por una sola sentencia, se les identifica como Sentencias Simples. A las sentencias cuyo cuerpo del bucle contiene más de una sentencia, se les denomina Sentencias Compuestas. CODIFICACIÓN (en Turbo Pascal)

Sentencia Simple:

Mientras Expresión lógica Repita Sentencia {Fin Repita Mientras }

Aclaratoria: en lenguaje natural se usa Mientras - Repita , por su semejanza con el inglés (While - Do), en lugar de Repita - Mientras , usado para unificar las estructuras de repetición. En español, todas comienzan con la misma palabra.

Sentencia Simple: While Expresión lógica Do Sentencia;

La sentencia Repita Mientras se ejecuta mientras la condición sea verdadera. No olvidar

Sentencia Compuesta:

Mientras Expresión lógica Repita Sentencia 1 Sentencia n {Fin Repita Mientras}

Cuerpo del Bucle

No olvidar: En una Sentencia Simple el cuerpo del bucle consta de una sola instrucción, en tanto que en una compuesta consta de dos o más.

Nota: Las frases encerradas entre llaves, “{...}” deben ser interpretadas como comentarios. Usados para aclarar. No representan instrucciones o sentencias ejecutables, no realizan ninguna acción.

Sentencia Compuesta: While Expresión lógica Do Begin Sentencia 1; : : Sentencia n End;

Cuerpo del Bucle

Page 36: ApuntesClases Version Noviembre08

CONTROL DE LOS BUCLES Para construir la expresión lógica que conforme la condición a utilizar para controlar las repeticiones en este tipo de estructuras, nos podemos servir de: 1.- Una Variable Contador 2.- Una Pregunta 3.- Una Variable Centinela 4.- Una Condición Inherente 5.- Una Variable Interruptor o Bandera I.1.- Controlado por Variable Contador En este contexto, un Contador es una variable que se utiliza para contar el número de veces que ha de repetirse el bucle. Las iteraciones se controlan por una variable cuyo valor representa a un contador. Básicamente, este mecanismo se sirve de una variable que actúa como contador de las repeticiones del bucle Un bucle controlado por contador consta de tres partes: a.- Inicialización de la variable de control del bucle: Antes del comienzo del bucle,

se debe dar un valor inicial a la variable Contador, que es la variable que controla el número de repeticiones. Si en el cuerpo del bucle se utiliza una variable acumulador, ésta también deberá ser inicializada con anterioridad. Como su nombre lo indica, una variable acumulador permite acumular valores.

b.- Condición o expresión lógica: En la expresión lógica que conforma la condición

se comprueba el valor de la variable de control al compararlo con el valor de la variable contador.

c.- Incremento del valor de la variable de control del bucle: Cada vez que el cuerpo

de un bucle se ejecuta, el valor del contador se incrementa (normalmente en uno (1)).

En general se utiliza un bucle controlado por un contador, cuando se puede conocer con anticipación cuantas iteraciones se deben ejecutar exactamente.

Formato: 1.- Conocer Valor final 2.- Asignar a Contador un valor inicial 3.- Mientras Contador < Valor final Repita Sentencias : :

Incrementar Contador {Fin de Repita Mientras}

La diferencia principal entre una variable contador y una variable acumulador es que en el contador, el incremento es constante (normalmente uno (1)), mientras que en el acumulador, el incremento es variable.

Page 37: ApuntesClases Version Noviembre08

Con la finalidad de ilustrar mejor su funcionamiento, se presentan a continuación algunos lazos con diversos valores iniciales para el contador y diferentes operadores relacionales:

J = 0 Mientras J < 5 Repita Sentencias : J = J + 1 Fin Mientras

J = 0 Mientras J <= 5 Repita Sentencias : J = J + 1 Fin Mientras

(a) Se ejecuta 5 veces

(b) Se ejecuta 6 veces

J = 1 Mientras J < 5 Repita Sentencias : J = J + 1 Fin Mientras

J = 1 Mientras J <= 5 Repita Sentencias : J = J + 1 Fin Mientras

(c) Se ejecuta 4 veces

(d) Se ejecuta 5 veces

Normalmente los contadores se inicializan a 0 ó a 1, dependiendo del diseño del programa. En el uso de contadores se deben tener en cuenta al menos tres factores: 1) el valor inicial, 2) el valor final, 3) el operador relacional utilizado para comprobar la terminación del bucle.

Page 38: ApuntesClases Version Noviembre08

A continuación se muestran algunos ejemplos resueltos utilizando la estructura de control Repita Mientras , controlada por una variable contador. Ejemplo I.1.1: Programa para contar 50 números leídos del teclado Diagrama de Flujo Algoritmo (Sección del programa)

: Final = 50 : Cuenta = 1 Mientras Cuenta <= Final Repita Sentencias : : Cuenta = Cuenta + 1 Fin del Mientras :

V

Sentencias : Cuenta = Cuenta + 1

Cuenta <= Final

Final = 50 Cuenta = 1

F

Inicialización

Condición

Incremento

Page 39: ApuntesClases Version Noviembre08

Ejemplo I.1.2: Calcular la suma de N números enteros leídos del teclado. Diagrama de Flujo Algoritmo

V

F

Suma = Suma + Num Contador = Contador + 1

Contador < N

Contador = 0 Suma = 0

Inicio

¿Cuántos números?

N

Introduzca Sumando

Num

‘El resultado es‘, Suma

Inicio

1- Inicio 2- Escribir (‘¿Cuantos números desea sumar?’) 3- Leer (N) 4- Asignar Contador = 0 {Inicialización de Variables} 5- Asignar Suma = 0 6- Mientras Contador < N Repita 6.1- Escribir (‘Introduzca Sumando’) 6.2- Leer (Num) 6.3- Hacer Suma = Suma + Num {Incrementar Acumulador} 6.4- Asignar Contador = Contador + 1 {Incrementar Contador} {Fin Repita Mientras} 7- Escribir (‘La suma de los,’N,’números es:‘, Suma) 8- Fin

Page 40: ApuntesClases Version Noviembre08

I.2.- Controlado por Pregunta Este método consiste simplemente en preguntar al usuario si existen más entradas. Es decir, se solicita al usuario la continuación del bucle. Debe ponerse especial cuidado en indicar al usuario los tipos de respuestas posibles, que le permitirán salir del lazo. Por ejemplo: S/N, Si/No, etc. En general, este tipo de control se utiliza cuando no se sabe, a priori, el número exacto de iteraciones a realizar. Ejemplo I.2.1: Realizar un programa para calcular el producto de N números introducidos por teclado. Diagrama de Flujo Algoritmo

Inicio

Prod = 1 Resp = ‘s’

Resp = ‘s’

ó Resp =’S’

Sumando?

Num

Prod = Prod * Num

Continuar

S/N?

Resp

Suma

Fin

Si

¿Número?

1.- Inicio 2.- Escribir ‘Cuantos factores tiene el producto?’ 3.- Leer (N) 4.- Asignar Prod = 1 {Inicialización} 5.- Asignar Resp = ‘s’ {de variables} 6.- Mientras (Resp = ‘s’) ó (Resp = ‘S’) Repita 6.1.- Escribir ‘Introduzca número’ 6.2.- Leer (Num) 6.3.- Asignar Prod = Prod + Num 6.4.- Escribir ‘Desea continuar? (S/N)’ 6.5.- Leer (Resp) {Fin Repita Mientras} 7.- Escribir ‘El producto de los’,N,’ números es ’,Prod 8.- Fin

No

Recomendaciones : - Deben colocarse todas las posibles respuestas

en mayúsculas y minúsculas o en combinaciones.

- Deben solicitarse respuestas cortas para disminuir el número de combinaciones posibles.

- No es absolutamente necesario inicializar la variable que contendrá la respuesta, sin embargo es recomendable asignarle un valor inicial, (Resp en este caso) para asegurar el ingreso al bucle.

Page 41: ApuntesClases Version Noviembre08

Inicio

Suma = 0

Sumando?

Num

Num >= 0

Suma = Suma + Num

Sumando?

Negativo Detener

Num

Suma

Fin

I.3.- Controlado por Valor Centinela Un centinela es un valor especial utilizado para señalar el final de una lista de datos. El valor elegido debe ser totalmente distinto a todos los posibles valores de la lista, para que se pueda utilizar para señalar el final de la lista. De igual manera que en la técnica anterior, debe ponerse especial cuidado en indicar al usuario el tipo de respuesta que le permitirá salir del lazo. Ejemplo I.3.1: Calcular la suma de N números introducidos por teclado. Diagrama de Flujo Algoritmo

F

V

1.- Inicio 2.- Inicializar Suma = 0 {Inicialización} 3.- Escribir ‘Introduzca sumando’ 4.- Leer (Num) 5.- Mientras Num >= 0 Repita 5.1.- Asignar Suma = Suma + Num 5.2.- Escribir ‘Introduzca sumando’ 5.3.- Escribir ‘Valor Negativo para detener’ 5.3.- Leer (Num) {Fin Repita Mientras} 6.- Escribir ‘El resultado de la suma es’, Suma 7.- Fin

Page 42: ApuntesClases Version Noviembre08

I.4.- Controlado por Condición Inherente En este caso, para controlar el lazo se construye y se evalúa una condición apropiada al problema particular que se está tratando, que se ha planteado de acuerdo a las características del problema que se desea resolver. Por esa razón se le denomina inherente. La estructura se repetirá mientras la condición sea verdadera. Ejemplo I.4.1: Para continuar con un ejemplo similar a los mostrados en los controles anteriores, se propone realizar un programa para calcular la suma de N números introducidos por teclado, pero en este caso, se debe detener las iteraciones cuando el valor de la suma sea superior un número cualquiera dado, (10 en este caso). Diagrama de Flujo Algoritmo

1.- Inicio 2.- Asignar Suma = 0 {Inicialización} 3.- Mientras Suma < 10 Repita 3.1.- Escribir ‘Introduzca Sumando’ 3.2.- Leer Num 3.3.- Calcular Suma = Suma + Num {Fin Repita Mientras} 4.- Escribir ‘La suma es ‘, Suma 5.- Fin

Inicio

Fin

Suma = 0

Suma < 10

¿Sumando?

Num

Suma = Suma + Num

Suma

V

F

Page 43: ApuntesClases Version Noviembre08

Ejercicio I.4.2: Hacer un programa que lea un capital C y que calcule en cuántos meses se duplica, si lo colocamos a un interés compuesto del X % mensual. Diagrama de Flujo Algoritmo

1.- Inicio 2.- Inicializar Meses = 0 3.- Escribir ('Cual es el Capital a invertir?') 4.- Leer (Capital_Ini) 5.- Escribir ('A que interés lo desea colocar?') 6.- Leer (Interes) 7.- Calcular Capital_Fin = 2 * Capital_Ini 8.- Mientras (Capital_Ini < Capital_Fin) Repita

8.1.- Calcular Capital_Ini = Capital_Ini*(1+Interes/100) 8.2.- Incrementar Meses = Meses + 1

{Fin Repita Mientras} 9.- Escribir ('El capital se duplica a los ', Meses, ' meses'); 10.- Fin

Inicio

Meses = 0

Capital a invertir?

Capital_Ini

¿Interés?

Interes

Capital_Fin = Capital_Ini * 2

Capital_Ini < Capital_Fin

Capital_Ini = Capital_Ini * (1 + Interes/100)

Meses = Meses + 1

‘Capital se duplica en ‘,

Meses

Fin

Si

No

Page 44: ApuntesClases Version Noviembre08

I.5.- Controlado por Interruptor o Bandera Una bandera o interruptor es una variable que se utiliza para conservar el estado (verdadero o falso) de una condición. Se denomina bandera o interruptor por asociarse a un interruptor (encendido o apagado) o a una bandera (arriba o abajo). El valor de interruptor debe inicializarse antes de comenzar el bucle y debe cambiar su estado (valor) dentro del cuerpo del bucle para preparar la siguiente iteración. Las banderas o interruptores se representan con variables lógicas. Estas variables se inicializan con uno de los dos posibles valores (Verdadero/Falso) y toman el otro valor cuando sucede el evento que se está verificando. Ejemplo I.5.1: Programa que verifica si un número introducido por teclado es primo

1.- Inicio 2.- Asignar a Primo = Verdadero 3.- Asignar a Divisor = 2 4.- Escribir ‘Introduzca un número entero > 0’ 5.- Leer (Numero) 6.- Mientras ((Divisor < Numero) y Primo) Repita 6.1.- Si Numero Mod Divisor = 0 Entonces 6.1.1.- Asignar a Primo = Falso {Fin del Si} 6.2.- Asignar a Divisor = Divisor + 1 {Fin del Repita Mientras} 7.- Si Primo = Verdadero Entonces 7.1.- Escribir (Numero,’ es Primo’) De lo Contrario 7.2.- Escribir (Numero,’ No es Primo’) {Fin del Si} 8.- Fin

Page 45: ApuntesClases Version Noviembre08

Ejercicios Resueltos Ejercicio I.1: Calcular cuántos de los N números enteros leídos del teclado, son negativos, positivos o ceros. Diagrama de Flujo Algoritmo

1.- Inicio 2.- Escribir (‘¿Cuantos números desea introducir?’) 3.- Leer (N) 4.- Inicializar Contador = 0 5.- Inicializar ContN = 0 {Contador de negativos} 6.- Inicializar ContC = 0 {Contador de ceros} 7.- Inicializar ContP = 0 {Contador de positivos} 8.- Mientras Contador < N Repita 6.1.- Escribir (‘Introduzca número’) 6.2.- Leer (Num) 6.3.- Comparar Si Num < 0 Entonces 6.3.1.- Incrementar ContN = ContN + 1 De lo contrario 6.3.2.- Comparar Si Num = 0 Entonces 6.3.2.1.- Incrementar ContC = ContC + 1 De lo contrario 6.3.2.2.- Incrementar ContP = ContP + 1 6.4.- Incrementar Contador = Contador + 1 {Fin Repita Mientras} 7.- Escribir (‘Negativos:’,ContN,’Ceros:’,ContC,’Positivos:‘, ContP) 8.- Fin

Inicio

¿Cuántos?

N

Contador = 0 ContN = 0 ContC = 0 ContP = 0

Contador < N

¿Número?

Num

Num < 0

Num = 0

ContP = ContP + 1

ContN

ContC ContP

Fin

ContN = ContN + 1

ContC = ContC + 1

Contador = Contador + 1

Si

Si

No

No

No

Si

Page 46: ApuntesClases Version Noviembre08

Ejercicio I.2: Hacer un programa que lea N notas del teclado y determine cuál es la mayor. Diagrama de Flujo Algoritmo

1.- Inicio 2.- Escribir (‘Cuántas notas desea introducir?’) 3.- Leer (N) 4.- Asignar a Cont = 0 5.- Asignar a Mayor = 0 6.- Mientras (Cont < N) Repita Entonces 6.1.- Escribir (‘Introduzca nota’) 6.2.- Leer (Nota) 6.3.- Comparar Si (Nota > Mayor) Entonces 6.3.1.- Asignar a Mayor = Nota {Fin del Si} 6.4.- Incrementar Cont = Cont + 1 {Fin del Repita Mientras} 7.- Escribir (‘La mayor nota es ‘, Mayor) 8.- Fin

Nota : Se le asigna el menor valor posible a la variable Mayor (cero en este caso), para asegurarse de que cualquier nota que se introduzca por teclado sea mayor que ésta nota inicial. En caso de involucrarse en el problema a valores negativos u otros, se le asignará al valor inicial, el valor más negativo posible; siempre opuesto al común de los valores a ser introducidos por teclado.

V

¿Cuántas Notas?

Nota

Nota > Mayor

Mayor = Nota

Inicio

¿Nota?

N

Cont = 0 Mayor = 0

Cont < N

Cont = Cont + 1

Fin

‘La mayor nota es’, Mayor

V

F

F

Page 47: ApuntesClases Version Noviembre08

Ejercicio I.3: En un año X, (introducido por teclado), la ciudad A tiene 3.5 millones de habitantes y una tasa de crecimiento del 7% anual y la ciudad B tiene 5 millones y una tasa de crecimiento del 5% anual. Si el crecimiento poblacional se mantiene constante en las dos ciudades, hacer un programa que calcule en qué año (o cuántos años después), la población de la ciudad A es mayor que la de la ciudad B. Diagrama de Flujo Algoritmo

Inicio

A = 3.5 B = 5.0

¿Año de Inicio?

Año

Cont = Año

A <= B

A = A * 1.07 B = B * 1.05

Cont = Cont + 1

‘Ciudad A > Ciudad B en el

Año ‘, Cont

Fin

1.- Inicio 2.- Asignar a A= 3.5 3.- Asignar a B = 5.0 4.- Escribir ('¿Año de inicio? ') 5.- Leer (Año) 6.- Asignar a Cont = Año 7.- Mientras (A <= B) Repita 7.1.- Calcular A = A * 1.07 7.2.- Calcular B = B * 1.05 7.3.- Incrementar Cont = Cont + 1 {Fin Repita Mientras} 8.- Escribir ('Población ciudad A > ciudad B en el año ', Cont) 9.- Fin

Si

No

Page 48: ApuntesClases Version Noviembre08

Ejercicio I.4: Hacer un programa que lea un número N, entero y positivo, de cualquier número de dígitos, que calcule la suma de sus dígitos y que la imprima en pantalla, junto con el número leído. Ej.: n = 53471, entonces la suma de sus dígitos es suma = 5 + 3 + 4 + 7 + 1 =20. Diagrama de Flujo Algoritmo

1.- Inicio 2.- Escribir ('Introduzca el numero') 3.- Leer (N) 4.- Inicializar Suma = 0 5.- Asignar a M = N 6.- Mientras N <> 0 Repita 6.1.- Calcular D = N Div 10 6.2.- Calcular R = N - D * 10 6.3.- Acumular Suma = Suma + R 6.4.- Asignar a N = D {Fin Repita Mientras} 7.- Escribir ('El numero es ', M,' y la suma de sus dígitos es ', Suma) 8.- Fin

‘Introduzca Número’

D = N Div 10 R = N - D * 10 Suma = Suma + R N = D

Inicio

N

Suma = 0 M = N

N < > 0

Fin

‘El número es’, N, ‘y la suma es’, Suma

V

F

Page 49: ApuntesClases Version Noviembre08

I.a.- Codificación en Turbo Pascal Ejemplo I.1.2: Calcular la suma de N números enteros leídos del teclado. Program Sumar_Naturales; {Programa que calcula la suma de N enteros leídos del teclado} Uses Crt; Var N, Contador, Num, Suma : Integer; Begin Clrscr ; Writeln (‘Cuantos números desea sumar?’); Readln (N); Contador := 0; Suma:= 0; While Contador < N Do Begin Writeln (‘Introduzca Sumando’); Readln (Num); Suma := Suma + Num; Contador := Contador + 1 End ; Writeln (‘La suma de los,’N,’números es : ‘, Suma); Readln End .

Page 50: ApuntesClases Version Noviembre08

Ejemplo I.1.3: Calcular cuántos de los N números enteros leídos del teclado, son negativos, positivos o ceros. Program Cuenta_Numeros; (* Programa que cuenta cuantos números positivos, ceros y negativos *) (* se introducen por teclado *) Uses Crt; Var ContN, ContC, ContP, N, Cont, X : Integer; Begin Clrscr; ContN := 0; {Contador de negativos} ContC := 0; {Contador de ceros} ContP := 0; {Contador de positivos} Cont := 0; Writeln ('Cuantos números va a introducir?'); Readln (N); While Cont < N Do Begin Writeln ('Introduzca número'); Readln (X); If X < 0 Then ContN := ContN + 1 Else If X = 0 Then ContC := ContC + 1 Else ContP := ContP + 1; Cont := Cont + 1 End ; Writeln ('Números introducidos ', N,' Negativos ', CN,' Cero ', CC, ' Positivos', CP); Readln End .

Page 51: ApuntesClases Version Noviembre08

Ejemplo I.1.4: Hacer un programa que lea N notas del teclado y determine cuál es la mayor. Program Nota_Alta; {Programa que determina cual es la mayor de un grupo de notas introducidas por teclado} Uses Crt; Var X, CN, Mayor, Cont : Integer; Begin Clrscr ; Cont := 0; Mayor := 0; Writeln ('¿Cuantas notas desea introducir?'); Readln (N); While Cont < N Do Begin Writeln ('Introduzca nota'); Readln (Nota); If Nota > Mayor Then Mayor := Nota; Cont := Cont + 1; End ; Writeln ('La mayor de las ', CN, ' notas es ', Mayor); Readln End.

Page 52: ApuntesClases Version Noviembre08

Ejemplo I.2.1: Realizar un programa para calcular el producto de N números introducidos por teclado. Program Producto; {Programa para calcular el producto de N números introducidos por teclado} Uses Crt; Var Prod, Num : Integer; Resp : Char; Begin Clrscr ; Writeln (‘Cuantos factores tiene el producto?’); Readln (Num); Prod := 1; Resp := ´s’; While (Resp = ‘s’) or (Resp = ‘S’) Do Begin Writeln (‘Introduzca número’); Readln (Num); Prod := Prod * Num; Writeln (‘¿Desea continuar?’); Readln (Resp) End ; Writeln (‘El producto de los ‘, N,’ números es ‘, Prod); Readln End.

Page 53: ApuntesClases Version Noviembre08

Ejemplo I.3.1: Calcular la suma de N números introducidos por teclado. Program Suma_Centinela; {Programa para Calcular la suma de N números introducidos por teclado.} Uses Crt; Var Suma, Num : Integer; Begin Clrscr ; Suma := 0; Writeln (‘Introduzca Sumando’); Readln (Num); While Num >= 0 Do Begin Suma := Suma + Num; Writeln (‘Introduzca Sumando’); Writeln (‘Valor Negativo para detener’); Readln (Num); End ; Writeln (‘El resultado de la suma es’, Suma); Readln End,

Page 54: ApuntesClases Version Noviembre08

Ejemplo I.4.1: Realizar un programa para calcular la suma de N números introducidos por teclado, pero en este caso, se debe detener las iteraciones cuando el valor de la suma sea superior un número cualquiera dado, (10 en este caso). Program Suma_Inherente; { …} Uses Crt; Var Suma, Num : Integer; Begin Clrscr ; Suma := o; While Suma < 10 Do Begin Writeln (‘Introduzca Sumando’); Readln (Num); Suma := Suma + Num; End ; Writeln (‘La suma es ‘, Suma); Readln End.

Page 55: ApuntesClases Version Noviembre08

Ejercicio I.4.2: Hacer un programa que lea un capital C y que calcule en cuántos meses se duplica, si lo colocamos a un interés compuesto del X % mensual. Program Capital; {Programa que calcula en cuantos meses se duplica un capital si se coloca a un interés compuesto de X % mensual} Uses Crt, Dos ; Var Meses : Integer; Capital_Ini, Capital_Fin, Interes : Real; Begin Meses := 0; Writeln ('Cuál es el capital a invertir?'); Readln (Capital_Ini); Writeln ('A que interés desea colocarlo?'); Readln (Interes); Capital_Fin := 2 * Capital_Ini; While (Capital_Ini < Capital_Fin) Do Begin Capital_Ini := Capital_Ini * (1 + Interesl/100); Meses := Meses + 1 End ; Writeln ('El capital se duplica a los ', Meses, ' meses'); Readln End.

Page 56: ApuntesClases Version Noviembre08

Ejemplo I.4.3: En un año X, (introducido por teclado), la ciudad A tiene 3.5 millones de habitantes y una tasa de crecimiento del 7% anual y la ciudad B tiene 5 millones y una tasa de crecimiento del 5% anual. Si el crecimiento poblacional se mantiene constante en las dos ciudades, hacer un programa que calcule en qué año (o cuántos años después), la población de la ciudad A es mayor que la de la ciudad B. Program Ciudades; {....} Uses Crt; Var A, B : Real; Anio, Cont : Integer; Begin A:= 3.5; B := 5.0; Writeln ('Año de inicio? '); Readln (Anio); Cont := 1; While (A <= B) Do Begin A := A * 1.07; B := B * 1.05; Cont := Cont + 1 End ; Writeln ('La población de A será > B ', Cont,' años después, en el año ', Anio + Cont); Readln End.

Page 57: ApuntesClases Version Noviembre08

Ejercicio I.4.4: Hacer un programa que lea un número N, entero y positivo, de cualquier número de dígitos, que calcule la suma de sus dígitos y que la imprima en pantalla, junto con el número leído. Ej.: n = 53471, entonces la suma de sus dígitos es suma = 5 + 3 + 4 + 7 + 1 =20. Program Sumadigitos; {Programa que calcula la suma de los dígitos de un número leído del teclado} Uses Crt; Var Suma, N, M, D, R : Integer; Begin Clrscr; Suma := 0; Writeln ('Introduzca el numero'); Readln (N); M := N; While N <> 0 Do Begin D := N Div 10; R := N - D * 10; Suma := Suma + R; N := D; End ; Writeln ('El numero es ', M,' y la suma de sus dígitos es ', Suma); Readln End.

Page 58: ApuntesClases Version Noviembre08

Ejemplo I.5.1: Programa que verifica si un número introducido por teclado es primo Program Num_Primos; {Programa que verifica si un número introducido por teclado es primo} Uses Crt; Var Primo : Bolean; Numero, Divisor : Integer; Begin Primo := True; Divisor := 2; Writeln (‘Introduzca un número entero > 0’); Readln (Numero); While (Divisor < Numero) and Primo Do Begin If Numero Mod Divisor = 0 Then Primo := False; Divisor := Divisor + ! End ; If Primo = True Then Writeln (Numero,’ es Primo’) Else Writeln (Numero.’ No es Primo’); Readln End.

Page 59: ApuntesClases Version Noviembre08

II.- La Estructura Repita Hasta La sentencia Repita Hasta es una estructura de repetición condicional que se ejecuta hasta que la condición se hace verdadera. En cierto sentido, es opuesta a la sentencia Repita Mientras, que se repite mientras la condición es verdadera, en tanto que la sentencia Repita Hasta, se repite “mientras la condición es falsa”, o como se ha dicho, hasta que sea verdadera. El diagrama de flujo de esta sentencia se muestra en la figura a la derecha. Después de cada iteración, se evalúa la condición. Si es verdadera, el bucle se termina y se ejecuta la sentencia inmediata siguiente después del bucle. Si la condición es falsa, el cuerpo del bucle se repite y continúa repitiéndose hasta que la condición se haga verdadera. La ejecución de esta estructura es como sigue: 1. Se ejecuta(n) la(s) sentencia(s) del cuerpo

del bucle. 2. Se evalúa la condición lógica. Si no se cumple, se repite(n) la(s) sentencia(s)

del cuerpo del bucle. 3. Se evalúa nuevamente la condición lógica, y si no se cumple, se repite la

ejecución. 4. Así, hasta que la condición se cumpla, en ese momento se interrumpe el ciclo y

el flujo de control pasa a la instrucción inmediata siguiente después del lazo.

La diferencia más obvia con la estructura anterior, es en cuanto al orden de los elementos que las conforman. En esta se ejecuta primero el cuerpo del ciclo y por último se evalúa la condición, mientras que en aquella se evalúa primero la condición lógica y luego se ejecuta el cuerpo del bucle.

PSEUDOCÓDIGO CODIFICACIÓN EN TURBO PASCAL

Cuerpo del Bucle

( Sentencias )

Condición Verdadera Falsa

Sintaxis: Repeat Sentencia 1 : Sentencia n Until Condición

Nota: en esta estructura no difiere la sintaxis de las sentencias simples y compuestas. Todas las sentencias ubicadas entre las palabras Repita y Hasta , (Repeat - Until), conforman el cuerpo del lazo y se van a repetir.

Formato: Repita Sentencia 1 : Sentencia n Hasta Condición

Cuerpo del Bucle

Cuerpo del Bucle

Page 60: ApuntesClases Version Noviembre08

REGLAS DE FUNCIONAMIENTO

1. La condición (expresión lógica) se evalúa al final del bucle, después de haberse ejecutado todas las sentencias.

2. Si la expresión lógica es falsa, se vuelve a repetir el bucle y se ejecutan nuevamente todas las sentencias.

3. Si la expresión lógica es verdadera, se sale del bucle y se ejecuta la sentencia inmediatamente siguiente al lazo (después del Hasta / Until ).

4. La sintaxis, en Turbo Pascal, no requiere Begin y End . Estas estructuras son ideales para realizar la validación de los datos al momento de ingresarlos. Se pueden utilizar los mismos controles para detener las iteraciones, usados en la estructura expuesta anteriormente, pero adaptados al mecanismo de esta estructura. Estos controles son: II.1.- Controlado por Variable Contador Se controlan las iteraciones haciendo uso de una variable que sirve como Contador de las repeticiones del lazo. El mecanismo es muy parecido al utilizado en la estructura Repita Mientras. Consta igualmente de tres partes, pero la disposición en el programa cambia ligeramente. En este caso, la ubicación de las componentes es la siguiente: a.- Inicialización de la variable de control del bucle: De igual manera, se debe dar

un valor inicial a la variable Contador , (que es la variable que controla el número de repeticiones), antes del comienzo del bucle . Si en el cuerpo del bucle se utiliza una variable acumulador, ésta también deberá ser inicializada con anterioridad. Como se ha dicho anteriormente, una variable acumulador se utiliza para acumular una serie de valores.

b.- Incremento del valor de la variable de control del bucle: El valor del contador

debe incrementarse cada vez que el cuerpo de un bucle se ejecuta. Este incremento se realiza antes de evaluar la condición. Es la instrucción que permitirá cambiar el estado de la condición y evitará que el bucle se repita indefinidamente.

c.- Condición o expresión lógica: Por último, se evalúa la condición. Como se ha

expresado en la estructura de repetición anterior, es en la expresión lógica que conforma la condición, donde se controlan realmente las iteraciones, al comparar el valor de la variable de control con el valor de la variable contador.

Nota: en la estructura “Repita Hasta”, el cuerpo del bucle se ejecuta al menos una vez, en cambio en la estructura “Repita Mientras”, el cuerpo del bucle puede no ejecutarse nunca.

Page 61: ApuntesClases Version Noviembre08

En general se utiliza un bucle controlado por un contador, cuando se puede conocer con anticipación cuantas iteraciones se deben ejecutar exactamente. Con la finalidad de establecer comparaciones fácilmente, con la estructura de repetición anterior, se presentará el mismo ejemplo en los diversos tipos de control para esta estructura. Ejemplo II.1.1: Hacer un programa para calcular la suma de N números introducidos por teclado. Diagrama de Flujo Algoritmo

1.- Inicio 2.- Escribir (‘¿Cuántos números desea sumar?’) 3.- Leer (N) 4.- Asignar Contador = 0 {Inicialización} 5.- Asignar Suma = 0 {de variables} 6.- Repita 6.1.- Escribir (‘Introduzca sumando’) 6.2.- Leer (Num) 6.3.- Calcular Suma = Suma + Num 6.4.- Hacer Contador = Contador + 1 {Incremento} Hasta que Contador >= N 7.- Escribir (‘El resultado es ‘, Suma) 8.- Fin

V

F

Suma = Suma + Num Contador = Contador + 1

Contador ≥ N

Contador = 0 Suma = 0

Inicio

¿Cuántos números?

N

Introduzca Sumando

Num

‘El resultado es‘, Suma

Inicio

Page 62: ApuntesClases Version Noviembre08

II.2.- Controlado por Pregunta . En este método de control de las iteraciones, simplemente se debe preguntar al usuario si desea continuar ejecutando la estructura. Para su implementación deben tomarse en cuenta las mismas consideraciones expuestas en la estructura Repita Mientras. En general, se usa un control por pregunta cuando no se conoce por anticipado cuántas iteraciones se van a realizar. Ejemplo II.2.1: Calcular la suma de N números introducidos por teclado.

V

F

Suma = Suma + Num

Resp = ‘N’

Suma = 0

Inicio

Introduzca Sumando

Num

‘El resultado es‘, Suma

Inicio

‘¿Desea Continuar? (S/N)’

Resp

1.- Inicio 2.- Asignar Suma = 0 {Inicialización} 3.- Repita 3.1.- Escribir (‘Introduzca Sumando’) 3.2.- Leer (Num) 3.3.- Calcular Suma = Suma + Num 3.4.- Escribir (‘Desea Continuar? (S/N)’) 3.5.- Leer (Resp) Hasta (Resp = ‘N’) ó (Resp = ‘n’) 4.- Escribir (‘El resultado de la suma es ‘, Suma) 5.- Fin

Page 63: ApuntesClases Version Noviembre08

II.3.- Controlado por Valor Centinela Como se ha explicado anteriormente, un centinela es un valor especial que se utiliza para señalar el final de una lista de datos. En este sentido, el carácter de especial, se lo confiere a ese valor, el hecho de ser completamente distinto a los valores contenidos en la lista de datos. Por ejemplo, si se está trabajando con un grupo de datos positivos, el centinela adoptado podría ser el cero ó un valor negativo, o viceversa. De igual manera que el método de control anterior, en general, se usa el control por centinela cuando no se conoce por anticipado cuántas iteraciones se van a realizar. Ejercicio II.3.1: Calcular la suma de N números introducidos por teclado. Diagrama de Flujo Algoritmo

1.- Inicio 2.- Asignar Suma = 0 {Inicialización} 3.- Escribir ‘Introduzca Sumando’ 4.- Leer (Num) 5.- Repita 5.1.- Calcular Suma = Suma + Num 5.2.- Escribir ‘Introduzca Sumando’ 5.3.- Escribir ‘Valor negativo para detener’ 5.3.- Leer (Num) Hasta Num <= 0 6.- Escribir ‘El resultado de la suma es ’, Suma 7.- Fin

F

V

Suma = Suma + Num

Num <= 0

Suma = 0

Inicio

‘Introduzca Sumando’

Num

‘El resultado es‘, Suma

Inicio

Num

‘Introduzca Sumando Valor Negativo para Detener ‘

Page 64: ApuntesClases Version Noviembre08

II.4.- Controlado por Condición Inherente En este caso, para controlar el lazo se construye y se evalúa una condición propia al problema particular que se está tratando. La denominaremos condición inherente, pues está unida al problema, concebida para resolverlo. La estructura se repetirá hasta que la condición sea verdadera. Ejemplo II.4.1: De igual manera que en la estructura expuesta anteriormente, con la finalidad de continuar con un ejemplo similar a los mostrados en los controles anteriores, se propone el siguiente ejercicio: Realizar un programa para calcular la suma de N números introducidos por teclado, pero en este caso, se debe detener las iteraciones cuando el valor de la suma sea superior un número cualquiera dado, (10 en este caso). Diagrama de Flujo Algoritmo

Fin

Suma

Suma >= 10

Suma = Suma + Num

Num

¿Sumando?

Suma = 0

Inicio

F

V

1.- Inicio 2.- Asignar Suma = 0 {Inicialización} 3.- Repita 3.1.- Escribir ‘Introduzca Sumando’ 3.2.- Leer Num 3.3.- Calcular Suma = Suma + Num Hasta (Suma >= 10) 4.- Escribir ‘La suma es ‘, Suma 5.- Fin

Page 65: ApuntesClases Version Noviembre08

Ejemplo II.4.2: Se deja caer una pelota desde una altura X. Se sabe que cada rebote es 10% menor que el anterior. Hacer un programa que lea la altura X, y que calcule en cuál rebote, la pelota no alcanza la quinta parte de la altura inicial. Diagrama de Flujo Algoritmo

V

Fin

Inicio

‘Introduzca Altura inicial’

X

‘En ‘,Cont, ‘ rebotes’

QP = X / 5 Cont = 0 Altura = X

Altura = Altura * 0.9 Cont = Cont + 1

F Altura < QP

1.- Inicio 2.- Escribir ‘Introduzca Altura Inicial’ 3.- Leer (X) 4.- Calcular QP = X / 5 5.- Asignar Cont = 0 {Inicialización} 6.- Asignar Altura = X 7.- Repita 7.1.- Calcular Altura = Altura * 0.9 7.2.- Incrementar Cont = Cont + 1 Hasta (Altura < QP) 8.- Imprimir (‘En ‘,Cont,’ rebotes alcanza 5ta parte de ‘,X) 9.- Fin

Page 66: ApuntesClases Version Noviembre08

II.5.- Controlado por Interruptor o Bandera Una bandera o interruptor es una variable que se utiliza para conservar el estado (verdadero o falso) de una condición. Se denomina bandera o interruptor por asociarse a un interruptor (encendido o apagado) o a una bandera (arriba o abajo). El valor de interruptor debe inicializarse antes de comenzar el bucle y debe cambiar su estado (valor) dentro del cuerpo del bucle para preparar la siguiente iteración. Las banderas o interruptores se representan con variables lógicas. Estas variables se inicializan con uno de los dos posibles valores (Verdadero/Falso) y toman el otro valor cuando sucede el evento que se está verificando. Ejemplo II.5.1: Programa que verifica si un número introducido por teclado es primo

1.- Inicio 2.- Asignar a Primo = Verdadero 3.- Asignar a Divisor = 2 4.- Escribir ‘Introduzca un número entero > 0’ 5.- Leer (Numero) 6.- Repita 6.1.- Si Numero Mod Divisor = 0 Entonces 6.1.1.- Asignar a Primo = Falso {Fin del Si} 6.2.- Asignar a Divisor = Divisor + 1 Hasta ((Divisor >= Numero) y Primo) 7.- Si Primo = Verdadero Entonces 7.1.- Escribir (Numero,’ es Primo’) De lo Contrario 7.2.- Escribir (Numero,’ No es Primo’) {Fin del Si} 8.- Fin

Page 67: ApuntesClases Version Noviembre08

Ejercicios Resueltos Ejercicio II.1: Manuel tiene un capital de M bolívares y Andrés un capital de A bolívares. Uniendo ambos capitales no les alcanza para hacer un negocio que requiere una inversión de X bolívares. Cada uno decide colocar su capital a ganar intereses. Hacer un programa que calcule en cuántos meses, uniendo los dos capitales, pueden hacer el negocio que desean. Suponiendo que el monto, X, de la inversión necesaria para el negocio no ha sufrido variaciones por inflación. Program ManuelyAndres; { ... } Uses Crt; Var M, A, X :Real; Interes1, Interes2: Real; Cont1, Cont2 : Integer; Begin Cont1:=0; Cont2:=0; Repeat Writeln('Introduzca capital de Manuel'); Readln(M); Writeln('A que interés coloca Manuel su Capital?'); Readln(Interes1); Writeln('Introduzca capital de Andrés'); Readln(A); Writeln('A que interés coloca Andrés su Capital?'); Readln(Interes2); Writeln('Introduzca monto de la inversión'); Readln(X); Until (X > M) and (X > A); If (M + A) < X Then Begin Repeat M:= M*(1 + Interes1/100); A:= A*(1 + Interes2/100); Cont1:= Cont1 + 1; Until ((M + A) >= X); End ; If (Cont1 = 0) Then Writeln('Pueden realizar el negocio inmediatamente') Else Writeln('Deben esperar ',Cont1,' meses para hacer el negocio'); Readln End.

Page 68: ApuntesClases Version Noviembre08

Ejercicio II.2: Hacer un programa que lea un número entero, N, positivo, de cuatro dígitos, que calcule su número inverso, y que lo imprima junto con el número leído. Ej.: N = 1234, entonces su número inverso es Ni = 4321. El programa debe permitir varias iteraciones, es decir, la introducción de números de cuatro cifras en repetidas oportunidades. Diagrama de Flujo Algoritmo

1.- Inicio 2.- Repita 2.1. Escribir ('Introduzca un número de 4 cifras') 2.2. Leer (N) 2.3. Calcular A = N Div 1000 2.4. Calcular R = N - A * 1000 2.5. Calcular B = R Div 100 2.6. Calcular O = R - B * 100 2.7. Calcular C = O Div 10 2.8. Calcular D = O - C * 10 2.9. Calcular NI = A + B*10 + C*100 + D*1000 2.10. Escribir ('Número introducido: ',N,' y su inverso: ',NI) 2.11. Escribir ('Desea introducir otro número? (S/N)') 2.12. Leer (Resp) Hasta (Resp = 'N') ó (Resp = 'n') 3.- Fin

F

V Fin

Inicio

¿Número de 4 cifras?

N

¿Otro número? (S/N)

Resp

A = N DIV 1000 R = N - A * 1000 B = R DIV 100 O = R - B * 100 C = O DIV 10 D = O - C * 10

‘Número inicial’, N, ‘su inverso es ’, NI

NI = A + B*10 + C*100 + D*1000

Resp = ‘N’

Page 69: ApuntesClases Version Noviembre08

II.a.- Codificación en Turbo Pascal ¡OJO! Faltan las codificaciones correspondientes a todos los ejemplos…!!!!. Ejemplo II.4.1: Calcular la suma de N números introducidos por teclado. Program Sumar; { } Uses Crt; Var N, Num, Sum, Contador : Integer; Resp : Char; Begin Suma := 0; Contador := 0; Repeat Writeln(‘Introduzca Sumando’); Readln(Num); Suma := Suma + Num; Writeln(‘Desea Continuar?’); Readln(Resp); Until (Resp = ‘N’) or (Resp = ‘n’); Writeln(‘La suma de los ‘, Contador, ‘números es ‘, Suma); Readln End.

Page 70: ApuntesClases Version Noviembre08

Ejercicio II.4.2: Hallar el resultado de la siguiente sucesión: S = 1 + 1 + 1 + 1 + ………… + 1 2 3 4 N Hasta que 1/N converja hacia e/100 o sea igual o mayor que un número “e” cualquiera dividido entre 100. Program Serie; {Programa que ….} Uses Crt; Var Suma, X, N, e : Integer; Begin Clrscr; Suma := 0; X := 1; N := 1; Writeln(‘Introduzca número e”); Readln(e); Repeat Suma := Suma + X; N := N + 1; X := 1/N; Until (X <= e/100); Writeln(‘El resultado de la sumatoria es ‘, Suma); Readln End.

Page 71: ApuntesClases Version Noviembre08

ESTRUCTURAS DE REPETICIÓN INDIZADAS Ó INDEXADAS Son estructuras de control repetitivas controladas por un índice, (de allí su nombre). Esto es, controladas por una variable que indica el número de iteraciones que se deben realizar. Este tipo de estructuras se utilizan cuando se conoce por anticipado el número de iteraciones que se van a realizar. Es decir, se conoce con anticipación el número de veces que se debe repetir el cuerpo del bucle. Estas estructuras no se controlan con una condición. El control se ejerce con una variable que funge como índice. Del cual debe conocerse: el valor inicial, el valor final y el valor del incremento (o decremento). Así, se repite el cuerpo del bucle desde que la variable de control, o índice, toma el valor inicial, hasta que llega a su valor final. Esta estructura se identifica como Repita Para . Se realiza la primera iteración cuando el índice toma el valor inicial, y se realizan tantas otras repeticiones, como incrementos (o decrementos) con el valor indicado, puedan realizarse a la variable en el intervalo establecido [valor inicial, valor final]. Una diferencia básica con las estructuras condicionales es que aquellas constan de varias partes, (Inicialización, Condición, Incremento), que cambian de posición de acuerdo al tipo de estructura y que son necesarias para ejercer el control de la estructura. En tanto que en las estructuras indizadas, sólo se necesita la instrucción de cabecera para controlar el lazo. En las estructuras condicionales debe incluirse siempre en el cuerpo del bucle una instrucción o sentencia, que permita cambiar el estado de la condición, para evitar caer en un lazo infinito. En tanto que las estructuras indizadas todo lo necesario para el control del ciclo, está incluido en la primera sentencia, denominada cabecera.

El mecanismo de ejecución de esta estructura es el siguiente: 1. Se asigna el valor inicial a la variable índice. 2. Se ejecuta el cuerpo del bucle. 3. Se realiza automáticamente el incremento (o decremento). 4. Así, hasta llegar al valor final. Se realiza la última iteración y se interrumpe el

ciclo. El flujo de control pasa a la instrucción inmediata siguiente después del lazo.

PSEUDOCÓDIGO

Formato: Para Índice = Valor_Inicial hasta Valor_Final, con Incrementos de N, Repita

Sentencia 1 (o Decrementos)

: Sentencia n {Fin Repita Para}

Cuerpo del Bucle

Page 72: ApuntesClases Version Noviembre08

I = Vi hasta Vf, n

Sentencias Cuerpo del Bucle

La estructura Repita Para es una estructura potente y versátil que existe en casi todos los lenguajes de programación. En el recuadro anterior se ha escrito en cursiva la frase “con Incrementos (o Decrementos) de N”, para expresar que es de carácter opcional, pues en algunos lenguajes, esa especificación no se utiliza. En caso de no indicarse el valor de dicho incremento, se asume por defecto que es uno (1). A continuación se presenta el formato de las sentencias simples y compuestas, expresadas en lenguaje natural. El Índice es representado por la variable I, el valor inicial por las siglas Vi, el valor final por Vf. En la figura se presenta el diagrama de flujo de esta estructura. La letra “n” representa el incremento. No debe olvidarse que en algunos lenguajes de programación no es necesario especificar el incremento. REGLAS DE FUNCIONAMIENTO 1. La variable de control, el valor inicial y el valor final

deben ser del mismo tipo. En caso de utilizarse la especificación de complemento, debe acordarse el tipo de la variable de control con el tipo del incremento.

2. Al iniciar las iteraciones, se le asigna el valor inicial a la variable de control. 3. La última repetición se realiza cuando la variable de control es igual al valor

final. 4. No se puede modificar el valor de la variable de control, ni los valores inicial o

final dentro del cuerpo del bucle. CODIFICACIÓN (en Turbo Pascal) En Turbo Pascal, se codifican de manera diferente los lazos Repita Para ascendentes (o con incremento) y descendentes (o con decremento), así como también las sentencias simples y compuestas. Turbo Pascal no acepta índices de tipo real. Las variables de control, así como los valores inicial y final deben ser de tipo entero.

Sentencia Simple:

Para I = Vi hasta Vf Repita Sentencia {Fin Repita Para}

Aclaratoria: en lenguaje natural se usa Para - Repita , por su semejanza con el inglés (For - Do), en lugar de Repita - Para , usado para unificar las estructuras de repetición. En español, todas comienzan con la misma palabra, Repita.

Sentencia Compuesta:

Para I = Vi hasta Vf Repita Sentencia 1 Sentencia n {Fin Repita Para}

Cuerpo del Bucle

Page 73: ApuntesClases Version Noviembre08

Seguidamente se muestran las respectivas codificaciones para cada uno de los casos antes mencionados. Ascendentes: Descendentes: Con el fin de realizar comparaciones con el funcionamiento de las otras estructuras, presentamos el mismo ejemplo desarrollado en esas estructuras. Ejemplo 1: Calcular la suma de N números introducidos por teclado. Diagrama de Flujo Algoritmo

Sentencia Compuesta: {Ascendente} Vi < Vf For I := Vi to Vf Do Begin Sentencia 1; : : Sentencia n End;

Cuerpo del Bucle

Sentencia Compuesta: {Descendente} Vi > Vf For I := Vi Downto Vf Do Begin Sentencia 1; : : Sentencia n End;

Cuerpo del Bucle

Sentencia Simple: {Ascendente} Vi < Vf For I := Vi to Vf Do Sentencia;

Sentencia Simple: {Descendente} Vi > Vf For I := Vi Downto Vf Do Sentencia;

1.- Inicio 2.- Escribir ‘¿Cuántos números desea sumar?’ 3.- Leer (N) 4.- Asignar Suma = 0 {Inicialización} 5.- Para I = 1 hasta N Repita 5.1.- Escribir ‘Introduzca sumando’ 5.2.- Leer (Num) 5.3.- Calcular Suma = Suma + Num {Fin Repita Para} 6.- Escribir ‘El resultado de la suma es ‘, Suma 7.- Fin

Fin

Suma

Suma = Suma + Num

Num

Suma = 0

¿Sumando?

Inicio

¿Cuántos números?

N

I = 1,1,N

Page 74: ApuntesClases Version Noviembre08

Ejemplo 2: Calcular la suma 1 + 1/2 + 1/3 +... + 1/n (Serie Armónica). Diagrama de Flujo Algoritmo

1.- Inicio 2.- Escribir (‘Leer n’) 3.- Leer (N) 4.- Asignar Suma = 0 {Inicialización} 5.- Para I = 1 hasta N Repita 5.1.- Calcular Suma = Suma + 1/I {Fin Repita Para} 6.- Imprimir (‘El resultado es ’, Suma) 7.- Fin

N

Fin

Inicio

‘Leer ‘, N

Suma = Suma + 1/I

I = 1 hasta N

Suma = 0

Suma

Page 75: ApuntesClases Version Noviembre08

Ejemplo 3: Calcular las Combinaciones y las Permutaciones de m elementos, tomados en grupos de n, usando respectivamente las fórmulas siguientes: Diagrama de Flujo Algoritmo

m! Cm,n = ------------------- n! * (m – n)!

m! Pm,n = -------------- (m – n)!

1.- Inicio 2.- Repita {Validaciones} 2.1.- Escribir (‘Introduzca valor de m’) 2.2.- Leer (m) 2.3.- Escribir (‘Introduzca valor de n’) 2.4.- Leer (n) Hasta (m > n) 3.- Asignar Factm = 1 {Inicializaciones} 4.- Asignar Factn= 1 5.- Hacer Factmn = 1 6.- Para I = 1 hasta m Repita 6.1.- Factm = Factm * I 7.- Para J = 1 hasta n Repita 7.1.- Factm = Factm * J 8.- Para K = 1 hasta (m – n) Repita 8.1.- Factm = Factm * K 9. - Calcular C = Factm / (Factn * Factmn) 10.- Calcular P = Factm / Factmn 11.- Imprimir ‘Cm,n = ‘, C 12.- Imprimir ‘Pm,n = ‘, P 13.- Fin

C, P

Factm = 1 Factn = 1 Factmn = 1

V

F

Inicio

m > n

¿Valor m?

m

¿Valor n?

n

Factm = Factm * I

I = 1 hasta m

Factn = Factn * J

J = 1 hasta n

Factmn = Factmn * J

K = 1 hasta (m-n)

C = Factm / (Factn * Factmn

Fin

P = Factm / Factmn

Page 76: ApuntesClases Version Noviembre08

Ejercicios Resueltos

Ejercicio III.1: Leer dos números enteros y positivos, A y B, donde B > A. Calcular el factorial de los números comprendidos entre ellos, incluyéndolos, e imprimirlo junto con el número correspondiente. Diagrama de Flujo Algoritmo

1.- Inicio 2.- Repita {Validación} 2.1.- Escribir ('Introduzca el primer número (A)') 2.2.- Leer (A) Hasta (A > =0) {Fin Repita Hasta} 3.- Repita {Validación} 3.1.- Escribir ('Atención B > A') 3.2.- Escribir ('Introduzca el segundo número (B)') 3.3.- Leer (B); Hasta (B > A) {Fin Repita Hasta} 4.- Asignar Fact = 1 {Inicialización} 5.- Para M = 2 hasta A Repita 5.1.- Calcular Fact = Fact * M {Fin Repita Para} 5.2.- Escribir ('El factorial de ', A, ' es ', Fact) 6.- Para J = (A + 1) hasta B Repita 6.1.- Calcular Fact = Fact * J 6.2.- Escribir ('El factorial de ', J, ' es ', Fact) {Fin Repita Para} 7.- Fin

Fact = 1

Fact = Fact * M

Fact = Fact * J

J = (A + 1) hasta B

Fin

‘Factorial de ‘, A, ‘ es ‘, Fact

‘Factorial de ‘, B, ‘ es ‘, Fact

Inicio

¿Valor A?

A

A > 0

V

F

F

V

¿Valor B?

B

B > A

M = 2 hasta A

Page 77: ApuntesClases Version Noviembre08

ESTRUCTURAS DE REPETICIÓN ANIDADAS El anidamiento se refiere, a colocar una estructura de repetición dentro de otra. Por tanto, anidar estructuras de repetición, significa construir un lazo externo, con uno o más lazos internos. En ese caso, debe terminar primero el (o los) más interno(s), porque de lo contrario se produce un error. El mecanismo de ejecución de las estructuras de repetición anidadas es el siguiente: 1.- Por cada repetición del lazo externo, se ejecutan todas las iteraciones de los lazos internos. 2.- Al terminar de repetirse el último lazo interno, se vuelven a evaluar las variables de control del lazo externo y si debe realizarse otra iteración de este lazo, comienzan nuevamente las repeticiones de los lazos internos, hasta completar las todas. 3.- Así, se realizan todas las iteraciones requeridas por todos los lazos. Si se tiene, por ejemplo, un lazo externo con tres (3) iteraciones y un lazo interno con cuatro (4), se realizarán en total doce (12) iteraciones. Por cada una de las tres (3) iteraciones del lazo externo se realizarán las cuatro del lazo interno. En el anidamiento se pueden mezclar estructuras de todos los tipos, pero siempre teniendo en cuenta lo expresado anteriormente. Debe(n) terminar primero la(s) estructura(s) más interna(s) .

Anidamiento Válido Anidamiento Inválido

Lazo 1

Fin Lazo 1

Lazo 2

Fin Lazo 2

Lazo 3

Fin Lazo 3 Lazo 4

Fin Lazo 4 Fin Lazo 1

Lazo 1

Lazo 2

Fin Lazo 2

Lazo 3

Fin Lazo 3

Lazo 4

Fin Lazo 4

Page 78: ApuntesClases Version Noviembre08

Ejemplo IV.1: Programa para hallar los números de hasta tres cifras, que sean iguales a la suma de los cubos de los dígitos que forman los números. Por ejemplo: 153 = 13 + 53 + 33. Diagrama de Flujo Algoritmo

1.- Inicio 2.- Para I = 0 hasta 9 Repita 2.1.- Para J = 0 hasta 9 Repita 2.1.1.- Para K = 0 hasta 9 Repita 2.1.1.1.- Calcular M = 100*I + 10*J + K 2.1.1.2.- Calcular L = I*I*I + J*J*J + K*K*K 2.1.1.3.- Comparar Si M = L Entonces 2.1.1.3.1.- Escribir ('Se cumple para el Numero ', M) {Fin Repita Para K} {Fin Repita Para J} {Fin Repita Para I} 3.- Fin

V

Fin

Inicio

‘Se cumple para ‘,M

I = 0 hasta 9

J = 0 hasta 9

M = 100 * I + 10 * J + K

K = 0 hasta 9

L = I*I*I + J*J*J + K*K*K

M = L F 1.

Page 79: ApuntesClases Version Noviembre08

Ejemplo IV.2: Hacer un programa que calcule el promedio de notas de cada alumno de una sección de PD10, que presentaron tres (3) exámenes parciales con el mismo peso c/u y el promedio de la sección.

Page 80: ApuntesClases Version Noviembre08

Codificación en Turbo Pascal

Program factoriales; {Programa que lee dos números enteros y positivos, A y B, donde B > A. Que calcula el factorial de los números comprendidos entre ambos, incluyéndolos, y lo imprime junto con el número correspondiente.} Uses Crt, Dos; Var A, B, M, J, Fact: Integer; Begin Writeln ('Introduzca el primer número (A)'); Readln (A); Repeat Writeln ('Atención B > A'); Writeln ('Introduzca el segundo número (B)'); Readln (B); Until (B > A); Fact:= 1; For M:= 2 to A Do Fact := Fact * M; Writeln ('El factorial de ', A, ' es ', Fact); For J := (A + 1) to B Do Begin Fact := Fact * J; Writeln ('El factorial de ',J, ' es ', Fact); End; Readln End.

Page 81: ApuntesClases Version Noviembre08

Ejercicios Propuestos Analice, diseñe y codifique en Turbo Pascal, los siguientes problemas: 1.- Hacer un programa que lea un capital C y que calcule en cuántos meses se

duplica, si lo colocamos a un interés compuesto del 5% mensual. 2.- Hacer un programa que calcule el promedio de notas de una sección que tiene

n estudiantes y el promedio de cada estudiante, si cada uno tiene 3 notas parciales. Calcular además cuántos alumnos fueron aprobados y cuántos reprobados.

3.- Hacer un programa que lea dos números enteros y positivos, N1 y N2, donde

N2 > N1. Que calcule el factorial de los números comprendidos entre ellos, incluyéndolos, y lo imprima junto con el número correspondiente.

4.- Calcular la suma: 1 + 2 + 3 + ... n

2 22 23 2n

5.- Una pelota se deja caer desde una altura H, y en cada rebote sube 10% menos

que el anterior. Hacer un programa que lea H y calcule en cuál rebote la pelota no alcanza a subir la quinta parte de la altura inicial.

6.- En 1980 la ciudad A tenía 3.5 millones de habitantes y una tasa de crecimiento

del 7% anual y la ciudad B tenía 5 millones y una tasa de crecimiento del 5% anual. Si el crecimiento poblacional se mantiene constante en las dos ciudades, hacer un programa que calcule en qué año la población de la ciudad A es mayor que la de la ciudad B.

7.- Realizar un programa que lea n números y calcule cuantos son pares y cuantos

son impares. 8.- Realizar un programa que lea del teclado, n números enteros y positivos e

indique cuantos son primos. Recordemos que un número primo es una cantidad entera positiva únicamente divisible por uno y por sí mismo.

9.- Hacer un programa que lea un número entero, n, positivo, de cuatro dígitos,

que calcule su número inverso, y que lo imprima junto con el número leído. Ej.: n = 1234, entonces su número inverso es ni = 4321.

10.- Hacer un programa que lea un número entero y positivo, de cualquier

número de dígitos, que le calcule su inverso y que lo imprima junto con el número leído.

11.- Hacer un programa que lea un número N, entero y positivo, de cualquier

número de dígitos, que calcule la suma de sus dígitos y que la imprima en

Page 82: ApuntesClases Version Noviembre08

pantalla, unto con el número leído. Ej.: n = 53471, entonces la suma de sus dígitos es Suma = 20.

12.- La serie de Fibonacci es una secuencia numérica, en la cual, cada elemento

es igual a la suma de los dos anteriores, así: 0, 1, 1, 2, 3, 5, 8, 13, 21, ..., etc. Tomando como variables iniciales los dos primeros elementos, a = 0, y b = 1, hacer un programa que calcule e imprima, a partir del tercero, todos los elementos de la serie de Fibonacci que sean menores que mil.

13.- El cajero de un banco solo dispone de billetes de 10.000 Bs., 20.000 Bs. y

100 Bs. Su función es cambiar los cheques, dándoles el menor número posible de billetes. Asumiendo que todos los cheques son múltiplos de 100 Bs., hacer un programa que lea del teclado el valor del cheque a cambiar y que le informe al cajero cuantos billetes de cada denominación debe entregar. Como no sabe cuántos clientes vienen en un día, el programa debe terminar cuando reciba ceros como valor del cheque, y al final del día debe informar cuántos billetes de cada denominación se gastaron.

14.- Hacer un programa que lea números enteros positivos y que calcule: - Los números cuya suma de dígitos sea impar, y decir cuántos son. - Los números que terminan en siete (7), y cuántos son. - Todos los números que tengan más de cuatro dígitos. Puesto que no sabemos cuántos números se van a procesar, el programa debe tener en cuenta que el último número leído debe ser cero. 15.- Pedro tiene un capital de C1 bolívares y Juan, un capital de C2 bolívares.

Uniendo los dos no les alcanza para hacer un negocio que requiere una inversión de C3 bolívares. Decide colocar cada uno su capital a ganar intereses. Pedro lo colocó a un interés compuesto del 3% mensual, y Juan, al 4% mensual. Hacer un programa que calcule en cuántos meses, uniendo los dos capitales, pueden hacer el negocio que desean. Suponiendo que el monto, C3, de la inversión necesaria para el negocio no ha sufrido variaciones por inflación.

16.- En una urbanización se desea realizar un censo, de todas las personas

mayores de edad. El computador debe leer por teclado la edad, sexo y grado de instrucción de cada una de ellas. Hacer un programa que calcule:

- Cuántos hombres y cuántas mujeres hay en la urbanización, discriminados por rango de edades, de acuerdo a lo siguiente:

a. Entre 18 y 35 b. Entre 36 y 50 c. Entre 51 y 65 d. Mayores de 65

- Cuántos hombres y mujeres hay por cada grado de instrucción. Establezca 4 grados de instrucción (analfabeta, primaria, secundaria y profesional).

Page 83: ApuntesClases Version Noviembre08

17.- Hacer un programa que calcule e imprima en pantalla, cuántos múltiplos de siete y cuantos múltiplos de nueve hay en los números comprendidos entre el 1000 y el 5000.

18.- Hacer un programa que calcule e imprima en pantalla la sumatoria de los

primeros veinte términos de la siguiente serie: 1/3 , 2/5 , 9/7 , 64/9 , 625/11 , ........., etc.

19.- El número de Combinaciones y Permutaciones de m elementos tomados en

grupos de n están dados respectivamente por las fórmulas C = m!/(n!*(m+n)!) P = m!/(m+n)! Hacer un programa que lea m y n, que calcule C y P e imprima los resultados. 20.- Realizar un programa que promedie una lista indeterminada de números

reales, hasta que se introduzca un número negativo. Escriba el programa de dos formas: usando el REPITA MIENTRAS y el REPITA HASTA.

21.- Suponga que se piden X bolívares prestados a un banco, con el acuerdo de

devolver Y bolívares cada mes hasta devolver el préstamo completo. Parte del pago mensual serán intereses, calculados como el i por ciento del capital por devolver en ese momento. El resto del pago mensual se aplica a reducir el capital a devolver. El programa debe determinar: a.- La cantidad de intereses pagada cada mes. b.- La cantidad de dinero aplicada cada mes al capital por devolver c.- La cantidad acumulada de intereses pagados al final de cada mes. d.- La cantidad del préstamo aún pendiente al final de cada mes. e.- El número necesario de pagos mensuales para devolver el préstamo completo. f.- La cantidad del último pago (probablemente menor que Y) Compruebe el programa usando los siguientes datos: X = 7.200.000, Y = 360.000, i= 1%

22.- Calcular la suma de 1+ 1/(2!) + 1/(3!) + 1/(4!) + .... + 1/(n!) para un n dado.

Escriba el programa de tres formas diferentes: usando Repita mientras, Repita hasta y Repita para.

23.- Imprimir la tabla de multiplicar del número N. 24.- Los surtidores de una gasolinera registran las ventas por galones, pero el

precio de la gasolina está fijada en litros. El programa debe calcular lo que los clientes deben pagar y el total recaudado por la gasolinera, tomando en cuenta lo siguiente: - Cada galón tiene 3,785 litros. - El precio del litro es Bs. 50 para el Tipo A, Bs. 55 para el Tipo B y para el Tipo C, Bs. 60. - El programa finaliza cuando se introduce una D como tipo de gasolina.

Page 84: ApuntesClases Version Noviembre08
Page 85: ApuntesClases Version Noviembre08

Notas Notas[1] 17 Notas[2] 14 Notas[3] 12

... ... ... ...

... ... Notas[50] 18 Nombre del vector: Notas Subíndices: [1],[2],[3], ..., [50] Contenido: Notas[1] = 17 Notas[2] = 14 Notas[3] = 12 ... ... ... Notas[50] = 18

ARREGLOS

Hasta ahora hemos creado programas que utilizan solo datos simples o básicos, como son: enteros, reales, caracter, etc. Sin embargo, es conveniente resaltar que existen problemas de programación en los cuales se necesita procesar una colección de valores que están relacionados entre sí. Es decir, se necesita crear programas que utilizan datos que requieren una cierta organización, programas que requieren usar datos que están relacionados entre sí. A esta conformación de los datos, se le denomina estructura de datos. Una estructura de datos es "una colección de datos organizados de un modo particular” [1]. El procesamiento de estos conjuntos de datos se realiza basándose en los conceptos matemáticos de vectores y matrices, utilizando la estructura de datos básica array. En general, las estructuras de datos pueden ser de dos tipos: estáticas y dinámicas. Las estáticas son aquellas a las que se les asigna una cantidad fija de memoria cuando se declara la variable, o desde el principio del programa. La misma no varará durante la ejecución del programa, se reserva esa cantidad fija de memoria para contener la estructura. Las estructuras de datos dinámicas son aquellas en las cuales, la cantidad de ocupación de memoria puede variar, (aumentar o disminuir), durante el tiempo de ejecución. Entre las estructuras de datos dinámicas se tienen los punteros, y entre las estáticas se pueden encontrar los arreglos. Concepto Un arreglo (en inglés array), es una estructura de datos en la que se almacena una colección de datos del mismo tipo, como: los nombres de los estudiantes de una sección, las notas parciales de esos estudiantes o los salarios de los empleados de una empresa. Un arreglo es una lista formada por una cantidad determinada de elementos del mismo tipo, agrupados bajo el mismo identificador o nombre de variable. Se caracteriza por: - Almacenar los elementos del arreglo en

posiciones de memoria contigua. - Tener un único nombre de variable (por ejemplo

Notas) que representa a todos los elementos que lo componen. Éstos a su vez se diferencian por un índice o subíndice.

- Se puede acceder de manera directa (o aleatoria) a los elementos del arreglo.

1 Joyanes A., Luis. Programación en Turbo Pascal. Mc Graw Hill. 1993.

Page 86: ApuntesClases Version Noviembre08

I = 1 Mientras I <= 100 Repita Leer (Notas [I]) I = I +1 {Fin Repita Mientras}

Un arreglo de una dimensión es un vector y de dos dimensiones, una matriz. Arreglos Unidimensionales: Los Vectores Un arreglo de una dimensión (unidimensional), también llamado vector o fila, es un tipo de datos estructurado, compuesto de un número determinado de elementos, de tamaño fijo y elementos homogéneos (del mismo tipo). La característica de tamaño fijo se refiere a que el tamaño del arreglo debe ser conocido en tiempo de compilación, (antes de la ejecución del programa). Por ejemplo, si deseamos conservar las calificaciones de 50 estudiantes de un examen de programación, se necesita reservar cincuenta posiciones de memoria, dar un nombre al arreglo y a cada uno de los 50 estudiantes asignarles una posición o índice del arreglo. Operaciones con Vectores: Lectura, Escritura y Copia Lectura Para leer un vector se debe hacer elemento a elemento y se requiere de alguna estructura repetitiva, ya sea Repita Mientras , Repita Hasta o Repita Para (en Pascal, While, Repeat o For, respectivamente). Ejemplos:

Escritura Para visualizar un vector, igualmente, es necesario situarlo dentro de una estructura repetitiva. Para I = 1 hasta Numero Repita Escribir (Notas [I]) Nota: A menos que sea necesario, se debe evitar que todas las salidas del vector aparezcan en la misma línea. Para eso, es recomendable hacer que se salte una línea al imprimir, usando un comando de impresión en blanco. Copia

I = 1 Repita Leer (Notas[I]) I = I + 1 Hasta I > 100

N = 100 Para I = 1 hasta N Repita Leer(Notas[I]) {Fin Repita Para}

Page 87: ApuntesClases Version Noviembre08

Como se ha visto, para manipular un vector siempre se necesita situarlo dentro de una estructura de repetición. Además, en caso de una copia de un vector a otro, debe tenerse en cuenta que ambos vectores sean del mismo tipo y preferiblemente, del mismo tamaño. Utilizando lo que se denominan, Vectores paralelos, (vectores del mismo tipo y del mismo tamaño). Arreglos bidimensionales: Matrices o Tablas Un arreglo bidimensional (también llamado tabla o matriz) es un arreglo con dos índices. Al igual que los vectores, estos índices deben ser ordinales. Se declaran de igual manera que los arreglos de una dimensión. Lectura y Escritura de una Matriz Para escribir una matriz, se debe hacer referencia tanto a la fila como a la columna. Se puede leer horizontalmente, (por filas), o verticalmente, (por columnas). Así, en la lectura horizontal, se controlan las filas con el lazo externo y las columnas con el lazo interno, como se muestra en el siguiente ejemplo. Se utiliza una estructura Repita Para, para leer horizontalmente una matriz de tres (3) filas y cuatro (4) columnas: Para Fila = 1 hasta 3 Repita Para Columna = 1 hasta 4 Repita Leer (A[Fila, Columna]) Si se desea recorrer la matriz verticalmente, o por columnas, se debe entonces, controlar las columnas con el lazo externo y las filas con el lazo interno. En el siguiente ejemplo se muestra la lectura vertical de una matriz, utilizando una estructura repetitiva Repita Mientras controlada por Contador. Columnas = 1 Mientras Columnas <= 4 Repita Filas = 1 Mientras Filas <= 3 Repita Leer (A[Columnas,Filas]) Filas = Filas + 1 {Fin Repita Mientras Filas} Columnas = Columnas + 1 {Fin Repita Mientras Columnas} Declaración en Turbo Pascal de un arreglo Siempre se deben declarar luego de las constantes (si existen). Un arreglo se declara por medio del tipo array. La sintaxis para un arreglo unidimensional es la siguiente: Type

Page 88: ApuntesClases Version Noviembre08

Nombre_tipo_arreglo = array [rango del subíndice] of Tipo; + Nombre_tipo_arreglo: Se refiere al tipo de dato arreglo a crear y debe ser un

nombre de identificador válido. + Rango del subíndice: Puede ser boolean, char o un rango de tipo enumerado. + Tipo: Se refiere al tipo de los elementos del vector. Todos los elementos deben

ser del mismo tipo. Var Nombre_arreglo : Nombre_tipo_arreglo; Ejemplos: Type X = array [1..8] of real; Type Luces = (Rojo, Verde, Ámbar); Type DiasDeSemana=(Lunes, Martes, Miércoles, Jueves, Viernes, Sábado, Domingo); ConjuntoDias = array Type Salarios = array [A..Z] of real; (En este caso es de tipo real porque el salario es de ese tipo. El subíndice indica que los salarios van de los empleados cuya inicial es A hasta la Z). Las declaraciones de tipo arreglo no crea ninguna variable específica de tipo arreglo, sino que proporciona información del arreglo como un todo. Para declarar una variable tipo arreglo, se utiliza la siguiente sintaxis: Type Valores = array [1..10] of real; Var Precios : Valores; En primer lugar se crea el tipo del arreglo y luego se declara la o las variables referenciadas al arreglo. Otro ejemplo de aplicación puede ser el siguiente: Const Max = 500; Type Texto = array [1..Max] of char; Var Palabras, Letras: Texto; En este ejemplo se crean dos variables arreglo: Palabras y Letras. Las posiciones del arreglo van de 1 a 500 y contendrán un valor tipo caracter.

Page 89: ApuntesClases Version Noviembre08

Declaración en turbo Pascal de un arreglo bidimensional o Matriz Al igual que en los arreglos unidimensionales o vectores, se crean con declaraciones Type y Var y deben ser de tipo ordinales o subrango. Se debe indicar: - El nombre del arreglo - Tipo del arreglo y - Rango permitido Ejemplo: Type Tabla = array [1..25,1..4] of real; Var Grados : Tabla; Para localizar o almacenar un valor en el arreglo se deben especificar dos posiciones o subíndices, uno para la fila y otro para la columna. Ejercicio: Calcular el promedio de cada estudiante de una lista de veinticinco alumnos de una clase de Programación con notas en cuatro parciales. Program Promedio; Uses Crt; Var Notas : Array [1..25,1..4] of Real; I,J : Integer; Suma, Prom : Real; Begin For I := 1 to 25 Do Begin Write (`Notas del estudiante: ´, I); Writeln (`En una misma línea escriba todas las notas ´); Suma := 0; For J := 1 to 4 Do Begin Read (Notas[I,J]); Suma := Suma + Notas[I,J] End; Readln ; Prom := Suma/4; Writeln (`La nota promedio del estudiante `,I:1,´ es `,Prom:1:1) End End.

Page 90: ApuntesClases Version Noviembre08

Ejercicios Resueltos

1.- Hacer un programa que lea N datos, guardando los positivos en un vector y los negativos en otro. Que calcule la suma de los positivos y negativos separadamente. Program sumaposynegativos; {… } Uses Crt, Dos; Var Pos, Neg : array[1..50] of integer; N, x, contp, contn, sumap,suman, i, may, men: integer; Begin contp:= 0; contn:= 0; sumap:= 0; suman:= 0; may := 0; men := 9999; Writeln ('Cuantos números desea introducir?'); Readln(n); For i:= 1 to N do begin Writeln ('Introduzca número'); Readln(x); If x >= 0 then begin contp := contp + 1; pos[contp] := x; end else begin contn := contn + 1; neg[contn] := x; end; If x > may then may := x else If x < men then men := x; end; For i := 1 to contp do

Page 91: ApuntesClases Version Noviembre08

sumap := sumap + pos[i]; Writeln('La suma de los positivos es ', sumap); For i := 1 to contn do suman := suman + neg[i]; Writeln('La suma de los negativos es ', suman); Writeln('El mayor es ', may, ' y el menor es ', men); Readln

End.

Page 92: ApuntesClases Version Noviembre08

2.- Realizar un programa que lea N datos, con los cuales forme 2 vectores, c/u de 100 datos máximo. El primer vector con los datos pares, el segundo con los datos impares. Si los N datos no alcanzan para llenar los vectores de 100 datos, complete el vector de pares con el número 2 y el de impares con el número 1. Imprímalos. Program completarvectores; Uses Crt; Var par, impar : Array[1..50] of Integer; n, contp, conti, i : Integer; Begin Clrscr; Writeln('Cuantos números desea introducir?'); Readln(n); contp := 1; conti := 1; For i := 1 to 10 do Begin Par[i]:=2; Impar[i]:=1 End; For i := 1 to n do Begin Writeln ('Introduzca número'); Readln(n); If n mod 2 = 0 Then Begin par[contp] := n; contp := contp + 1; End Else Begin impar[conti] := n; conti := conti + 1; End; End; Writeln('Vector Par'); For I := 1 to 10 do Write(par[i],' '); Writeln; Writeln('Vector Impar'); For i := 1 to 10 do Write(impar[i],' '); Writeln; Readln; End.

Page 93: ApuntesClases Version Noviembre08

3.- Hacer un programa que lea un vector A de N elementos, calcule e imprima cuál es el mayor y en qué posición se encuentra y cuál es el menor y en qué posición se encuentra. Program vector; {… } Uses Crt, Dos; Var VectorA : array[1..10] of Integer; I, numero, may, men, posmay, posmen : Integer; Begin Writeln ('Cuantos números desea introducir?'); Readln (numero); For I := 1 to numero do Begin Writeln ('Introduzca elemento ’, I,’ del vector'); Readln (vectorA[i]); End; may := VectorA[1]; men := VectorA[1]; posmay := 1; posmen := 1; For I := 2 to numero do Begin If VectorA[i] > may then Begin may:= VectorA[i]; posmay:=i; End else If VectorA[i] < men then Begin men := vectorA[i]; posmen:= i; End End; Writeln ('El mayor es ', may,' y está en la posición ', posmay,' del vector'); Writeln ('El menor es ', men,' y está en la posición ', posmen,' del vector'); Readln End.

Page 94: ApuntesClases Version Noviembre08

Program PromediosSec; {Programa para calcular el promedio de n estudiantes y el promedio por materia} Uses Crt; Type Matriz = Array[1..50,1..50] of Integer; Vector_caracteres = Array[1..50] of String[30]; Vector_Promedios = Array[1..50] of Real; Var N, Estudiantes, Materias, ContMaterias, i, j, k, l, sumaest, SumaMat : Integer; promest, proMat : Real; Notas : Matriz; Nombre,Nombre_Materias : Vector_caracteres; Promedios : Vector_Promedios; Begin Clrscr; Estudiantes := 1; Repeat Writeln('Cuantos estudiantes tiene la sección?'); Readln(N); Until n > 0; Repeat Writeln(' Cuantas materias tienen los estudiantes? '); Readln(Materias) Until Materias > 0; ContMaterias:= 1; Repeat Writeln(' Nombre de la materia? ', ContMaterias); Readln(Nombre_Materias[ContMaterias]); ContMaterias := ContMaterias + 1 Until ContMaterias > Materias; While (Estudiantes <= N) do Begin Writeln(' Nombre del estudiante?'); Readln(Nombre[Estudiantes]); ContMaterias := 1; Sumaest := 0; While ContMaterias <= Materias Do Begin Repeat Writeln('Nota estudiante ', Nombre[Estudiantes],' en la Materia ', Nombre_Materias[ContMaterias]); Readln(Notas[Estudiantes,ContMaterias]);

Page 95: ApuntesClases Version Noviembre08

Until (( 0 <= Notas[Estudiantes,ContMaterias]) and (Notas[Estudiantes,ContMaterias] <= 20)); Sumaest := (sumaest + Notas[Estudiantes,ContMaterias]); ContMaterias := ContMaterias + 1 End; Promedios[Estudiantes] := Sumaest/Materias; Estudiantes := Estudiantes + 1 End; Clrscr; For I := 1 to n Do Begin Writeln('El promedio del estudiante ', Nombre[I], ' es ', Promedios[I]:5:2,' pts'); Writeln; Write ('Sus notas son '); For J:= 1 to Materias Do Write (' ', Notas[i,j]); Writeln End; Writeln; Writeln('Promedios por Materias'); For K := 1 to Materias Do Begin SumaMat:= 0; For L:= 1 to N do SumaMat:= SumaMat + Notas[L,K]; Promat:= SumaMat/N; Writeln('El promedio de la materia ', Nombre_Materias[K],' es ',Promat:5:2); Writeln; End; Readln End.

Page 96: ApuntesClases Version Noviembre08

Ejercicio: Hacer un programa que lea una matriz cuadrada A de m filas y n columnas. Calcular e imprimir la suma de: Diagonal Principal, Triangular Inferior, Triangular Superior y Diagonal Secundaria. Program Diagonal_Principal; {... } Uses Crt; Type Matriz = Array[0..100,0..100] of Integer ; Var N, I, J, DP, TS, TI, DS: Integer ; A : Matriz; Begin Clrscr; Repeat WriteLn('Introduzca el Orden de la Matriz'); ReadLn(N) Until N>0; For I := 1 To N do For J := 1 To N do Begin WriteLn('Introduzca el elemento A(',I,J,') de la matriz'); ReadLn(A[I,J]) End; DP := 0; TS := 0; TI := 0; DS := 0; For I := 1 To N do For J := 1 To N do Begin If I = J Then DP := DP + A[I,J] Else If I < J Then TS := TS + A[I,J] Else TI := TI + A[I,J]; If (I + J) = (N + 1) Then DS := DS + A[I,J] End; WriteLn('Los elementos de la matriz son: '); For I := 1 To N do Begin For J := 1 To N do Write(A[I,J],' ');

Page 97: ApuntesClases Version Noviembre08

WriteLn End; WriteLn('La suma de los elementos de: '); WriteLn('La Diagonal Principal es ',DP,' , de la Triangular Superior es ',TS); WriteLn('De la Triangular Inferior es ',TI,' y de la Diagonal Secundaria es ',DS); ReadLn End.

Page 98: ApuntesClases Version Noviembre08

Problemas Propuestos Codifique en Turbo Pascal los siguientes problemas: 1.- Hacer un programa que lea una lista de calificaciones, calcule la media e

imprima una lista de calificaciones mayores que la media. 2.- Hacer un programa que lea un vector A de N elementos, calcule e imprima cuál

es el mayor y en qué posición se encuentra y cuál es el menor y en qué posición se encuentra.

3.- Realizar un programa que lea N datos, con los cuales forme 2 vectores, cada

uno de 100 datos máximo. El primer vector con los datos pares, el segundo con los datos impares. Si los N datos no alcanzan para llenar los vectores de 100 datos, complete el vector de pares con el número 2 y el de impares con el número 1. Imprímalos.

4.- Hacer un programa que lea un vector de N elementos y que calcule e imprima

el valor de la siguiente sumatoria: S = A(1) + A(2) + A(4) + A(7) + A(11) + A(16) + A(22) + A(29) + …

5.- Realizar un programa que lea N datos, guardando los positivos en un vector,

los negativos en otro vector halle las sumas de los negativos y los positivos separadamente, y busque además el mayor y el menor de todos los números.

6.- Un instituto desea controlar los resultados de los alumnos en las diferentes

asignaturas de un semestre de la carrera de informática. Hacer un programa que lea el nombre del estudiante y las calificaciones obtenidas en las distintas asignaturas, luego mostrar en pantalla el nombre de cada estudiante, la media obtenida y la lista de calificaciones de ese estudiante. El programa deberá también calcular el promedio de todos los estudiantes en cada asignatura, es decir la media por asignatura.

7.- Realizar un programa que obtenga a partir de una serie de 100 datos

estadísticos (Xi), las medidas más generalizadas de centralización y dispersión. Medidas básicas de centralización y dispersión: Valor mínimo: Xmin Valor máximo: Xmax Rango: R= Xmax - Xmin Media aritmética: = 1/n∑ Xi Varianza: S2 =1/n∑(Xi - X)2 = 1/n∑Xi

2- X2 Desviación típica: S = √(1/n∑Xi

2- ¯ X2 ) Coeficiente de variación: r = s/X¯

8.- Para una muestra de N personas se recogen los siguientes datos: cédula,

sexo, valor del cociente intelectual dependiendo de las siguientes edades 15, 20, 30 45 años. Se desea saber:

- Cociente intelectual promedio de las personas entrevistadas. - Cociente intelectual promedio de los hombres y de las mujeres.

Page 99: ApuntesClases Version Noviembre08

- Quiénes tienen mayor cociente intelectual los hombres o las mujeres. - A la edad de 15 años cuantos tienen un cociente intelectual mayor que 120. - Diferencia entre los cocientes intelectuales de los que poseen 15 años y los de

45 años. - Indicar los datos de la persona que tiene mayor cociente intelectual, en caso de

coincidir varias con el mismo cociente indicar el listado con los datos de las mismas.

9.- El dueño de una papelería lleva el control de sus artículos mediante la

siguiente información: Descripción del artículo, código, costo, precio de venta, origen (nacional o importado), existencia. Se desea calcular:

- El precio definitivo de los artículos sabiendo que al precio de venta debe incrementársele el 4% del precio del costo por concepto de impuesto si el artículo es importado, si es nacional sólo el 2%.

- La ganancia producida por cada artículo. - Total de la ganancia producida por cada artículo. - Cuantos artículos son nacionales. - Producir un listado que muestre solamente el código y la existencia de aquellos

artículos importados cuyo precio de costo sea mayor de 200. 10.- Realizar un programa que calcule la suma y la multiplicación de dos

matrices. 11.- Determinar el número de términos del vector B[J], J = 1..M, repetidos en el

vector A[I], I = 1..N. 12.- Dados dos vectores, A[I], I = 1..N y B[J], J = 1..M; que no tienen números

repetidos, elaborar un programa que cree un vector C con los términos comunes a ambos vectores. Por ejemplo: A[I] = 5,8,3,7,2 B[J] = 1,9,5,3,6,2 C[K] = 5,3,2

13.- Hacer un programa que construya una matriz identidad I, de orden N.

Ejemplo. N = 4. N = Orden de la matriz.

14.- Hacer un programa para hallar la transpuesta de una matriz. Por ejemplo

para una matriz de 3 * 3

1 0 0 0 0 1 0 0

I = 0 0 1 0 0 0 0 1

1 2 3 A = 4 5 6 7 8 9

1 4 7 B = 2 5 8 3 6 9

A = Matriz Original B = Matriz Transpuesta de A

Page 100: ApuntesClases Version Noviembre08

15.- Hacer un programa que lea una matriz A de filas y 20 columnas. Los elementos son números enteros y positivos. Crear e imprimir dos vectores así: El vector B que contenga todos los números pares de la matriz y el vector C que contenga todos los números impares.

16.- Hacer un programa que lea una matriz A de m filas y n columnas. Calcular e

imprimir la suma de cada una de sus filas y de cada una de sus columnas. 17.- Hacer un programa que lea una matriz cuadrada A de m filas y n columnas.

Calcular e imprimir la suma de: Diagonal Principal, Triangular Inferior, Triangular Superior y Diagonal Secundaria.

18.- Hacer un programa que lea una matriz de m filas y n columnas. Calcular e

imprimir la suma de todos los elementos periféricos: A(1,1) + A(1,2) + A(1,3) + ... + A(1,n) + A(2,1) + A(2,n) + A(3,1) + A(3,n) + A(4,1) + A(4,n) + ... + A(m,1) + A(m,2) + A(m,3) + ... + A(m,n). 19.- Hacer un programa que construya la siguiente matriz: 20.- Hacer un programa que construya la siguiente matriz: 21.- Hacer un programa que busque un dato cualquiera X, dentro de un vector

de 100 elementos, e indique la posición donde lo encontró.

1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 4 4 4 5 5 5 5 5 5 5 5 5 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9

1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 1 1 2 3 3 3 3 3 2 1 1 2 3 4 4 4 3 2 1 1 2 3 4 5 4 3 2 1 1 2 3 4 4 4 3 2 1 1 2 3 3 3 3 3 2 1 1 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1

Page 101: ApuntesClases Version Noviembre08

22.- Hacer un programa que coloque el último elemento de un vector de 25 enteros, en le primer lugar, el penúltimo en el segundo y así sucesivamente. Debe imprimir el resultado al final.

23.- Dados N números de hasta 2 dígitos, hacer un programa que determine, de

esos números, cuántas veces está el número 1, el 2, el 3, ...., el 98, y el 99. Además determine cuál número está más veces.

24.- Una empresa tiene 250 empleados, por cada uno de ellos se tiene un

registro que tiene dos datos, el nombre del empleado y su correspondiente salario mensual. Hacer un programa que determine cuántos empleados ganan más del promedio salarial de la empresa.

25.- Escriba un programa que almacene en un vector los días de la semana. 26.- Escriba un programa que almacene su nombre en un vector. 27.- Escriba un programa que almacene en un vector los números pares del 1

al 10. 28.- Escriba un programa que lea diez números enteros y los invierta. 29.- Escriba un programa que lea las dimensiones de una matriz, las lea,

visualice la matriz y que encuentre el menor y mayor elemento de esa matriz y sus posiciones.

30.- Escriba un programa que encripte un password de siete letras debe

contener consonantes y vocales. El algoritmo de encriptación será sustituir cada vocal por el número que le corresponde. (A=1, E=2,O=3,I=4,U=5).

31.- Escribir un programa que en una matriz almacene los números primos del 1

al 100. 32.- Escriba un programa que capture e imprima la siguiente tabla:

Distrito Candidato A Candidato B Candidato C 1 194 48 206 2 180 20 320 3 221 90 821 4 432 50 946

33.- Escriba un programa que almacene en una matriz los números pares del 1

al 40 y los imprima.

Page 102: ApuntesClases Version Noviembre08

ORDENAMIENTO

Directos ���� Burbuja, Selección, Inserción Indirectos � Shell, Ordenamiento rápido, Ordenamiento por mezcla Ordenamiento por Burbuja Es un método clásico, sencillo y poco eficiente. Se basa en la comparación de elementos adyacentes de la lista (vector) e intercambiar sus valores si están desordenados. De este modo se dice que los valores mas pequeños burbujean hacia arriba, hacia los primeros elementos del vector, mientras que los mayores se hunden hacia el fondo, hacia los últimos elementos del vector. Método Para I = 1 hasta (N -1) Repita Para J = 1 hasta (N - i) Repita Si A [J] > A [J + 1] Entonces Aux = A[J] A[J] = A[J + 1] A[J + 1] = Aux {Fin Repita Para J} {Fin Repita Para I} Codificación en Turbo Pascal For I = 1 to (N – 1) Do For J = 1 to (N – I) Do If A [J] > A [J + 1] Then Begin Aux = A[J] A[J] = A[J + 1] A[J + 1] = Aux End ;

Page 103: ApuntesClases Version Noviembre08

Programación Modular y Programación Estructurada Uno de los métodos más conocidos para resolver un problema es dividirlo en problemas mas pequeños, llamados subproblemas. De esta manera, en lugar de resolver una tarea compleja y tediosa, resolvemos otras más sencillas y a partir de ellas llegamos a la solución. Esta técnica se usa mucho en programación ya que programar no es mas que resolver problemas, y se le suele llamar diseño descendente , metodología del divide y vencerás o programación de arriba abajo (top -down ). La programación modular es uno de los métodos de diseño más flexibles y potentes para mejorar la productividad de un programa. Es evidente que…

Page 104: ApuntesClases Version Noviembre08

Programación Modular y Programación Estructurada Uno de los métodos más conocidos para resolver un problema es dividirlo en problemas mas pequeños, llamados subproblemas. De esta manera, en lugar de resolver una tarea compleja y tediosa, se resuelven otras más sencillas, y a partir de ellas se llega a la solución. Esta es una técnica muy usada en programación, puesto que programar no es más que elaborar programas para resolver problemas usando el computador. A dicha técnica se le conoce como Diseño Descendente , Metodología de Divide y Vencerás o Programación de Arriba a Abajo (Top-Down ). La programación modular es uno de los métodos de diseño más flexibles y potentes para mejorar la productividad de un programa. Puesto que esta metodología nos lleva a tratar con sub-problemas, entonces para resolverlos, evidentemente hay que trabajar con subprogramas. A estos últimos también se les conoce como módulos, de ahí el nombre de Programación Modular . En el esquema a continuación se muestra un ejemplo del empleo del diseño descendente. Por ejemplo, si se desea crear un programa para gestionar las notas de los alumnos de una sección de una materia cualquiera, y dicho programa debe realizar las tareas de lectura de notas, cálculo de promedios y otras estadísticas, cambiar nota, eliminar nota, producir listados de alumnos con todos sus datos, etc. Se pueden crear diversos subprogramas que se ocupen de cada una de las tareas en particular, de la siguiente manera: En Turbo Pascal se dispone de dos tipos de subprogramas: los Procedimientos y las Funciones.

Notas Alumnos

Listar Modificar EstadísticaLeer

Promedio Por apellido Por Notas Otras

Page 105: ApuntesClases Version Noviembre08

FUNCIONES Una función es un subprograma que recibe como argumentos o parámetros, datos de tipo numérico o no numérico (caracteres, cadenas u otros) y devuelve un resultado. Esta característica la diferencia esencialmente de un procedimiento. Formato: Nombre_de_función (argumento1, argumento2,…) El argumento se conoce en términos de lenguajes de programación con el nombre de parámetro. Para poder calcular el valor o resultado de la función, todo lo que se necesita conocer es el valor o valores de los parámetros respectivos. Como el concepto más difundido de función entra dentro del campo de las matemáticas, recordaremos con un ejemplo la noción de función, asociada a variables (argumentos o parámetros en programación). Algunos ejemplos de funciones son: f(x) = x h(x) = 4/x Cada una de estas funciones devuelve un resultado para cada valor particular de x. Así, para x = 1, las funciones se representan por f(1), h(1) y sus valores son: f(x) = 1 h(x) = 4/1 = 4 Las funciones son un medio muy adecuado de resolver operaciones complejas matemáticas o de otras disciplinas afines, así como tratar diferentes tipos de datos definidos en Turbo Pascal y realizar con ellos procesos complejos. Tipos de Funciones En Turbo Pascal existen dos grandes grupos de funciones: • Funciones predefinidas, internas o estándar y • Funciones definidas por el usuario Funciones predefinidas, Internas o Estándar Son las funciones que vienen incluidas, o que son aceptadas por el lenguaje.... Entre las funciones predefinidas, se tienen las matemáticas, las ....

Page 106: ApuntesClases Version Noviembre08

Funciones aritméticas ó matemáticas

Funciones Matemáticas

Nombre Argumento Descripción

Abs(x) Real o Integer Devuelve el valor absoluto del argumento

ArcTan (x)* Real o Integer Devuelve el arco tangente del argumento

Cos(x)* Real o Integer Devuelve el coseno del argumento

Exp(x) Real o Integer Devuelve el exponencial del argumento

Frac(x) Real Devuelve la parte decimal del argumento

Int (x) Real Devuelve la parte entera del argumento

Ln (x) Real o Integer Devuelve el logaritmo natural del argumento

Pi Real Devuelve el valor de Pi (3.1415926535897932385)

Odd(x) Integer Devuelve un resultado lógico si el argumento es impar

Round(x) Real o Integer Devuelve el entero mas próximo del argumento

Sin(x)* Real o Integer Devuelve el Seno del argumento

Sqr(x) Real o Integer Devuelve el cuadrado del argumento

Sqrt(x) Real o Integer Devuelve la raiz cuadrada del argumento

Trunc (x) Real Devuelve la parte entera de su argumento

* El argumento de estas funciones es siempre en radianes

Funciones Ordinales

Función Definición

ord(x) Devuelve el numero ordinal correspondiente al argumento x.

chr(x) Devuelve el caracter en el código ASCII correspondiente al argumento x.

succ(x) Devuelve el sucesor del argumento; produce un error si no tiene sucesor.

pred(x) Devuelve el predecesor del argumento

Page 107: ApuntesClases Version Noviembre08

Funciones Exponenciales o Logarítmicas XY = Exp(Y * Ln(X)) Deducción: XY = t

Ln(XY) = Ln t Y * Ln(X) = Ln t Exp(Y * Ln(X)) = t = XY

Funciones Definidas por el Usuario Además de las funciones predefinidas citadas anteriormente, es posible que el usuario pueda declarar sus propias funciones. Como hemos dicho anteriormente, una función es un subprograma que devuelve un único resultado al programa o subprograma que le llamó (o lo invocó). Formato:

Function nombre_de_la_funcion (parámetros): tipo (declaración de variables locales) Begin

<cuerpo de la función> Nombre_de_la_función := valor de la función

End ;

Estas son, como su nombre lo indica, las que el propio usuario declara, define o establece para realizar una tarea específica. Las funciones nacen con el propósito de ser subprogramas que siempre tienen que devolver algún valor. Las dos principales características de las funciones son:

• Las funciones siempre devuelven un valor al programa que las invocó. • Para invocar una función es necesario hacerlo en una expresión. Se escribe

su nombre en el cuerpo del programa, y si los necesita, se incluyen los parámetros entre paréntesis.

Veamos el esqueleto básico que comparten las funciones:

function nombre [(p1,p2,...)] : tipo; const lista_constantes; type lista_tipos; var lista_variables; (*declaracion de subprogramas*) begin (* cuerpo de la función *) nombre := valor_devuelto end;

Page 108: ApuntesClases Version Noviembre08

Comentemos la sintaxis de una función que aparece en el cuadro anterior: • La lista de parámetros (p1,p2,...) está encerrada entre corchetes porque es

opcional como en los procedimientos. • tipo es el tipo del dato que devolverá la función. Así podemos dividir las

funciones en lógicas (boolean), enteras (integer), reales (real) y de carácter (char)

• Y al final del cuerpo de la función es obligatorio asignarle un valor del tipo devuelto al nombre de la función, porque como ya hemos dicho una función siempre devuelve un valor.

Ejemplos Program Cubo_de_numero; Uses Crt; Var Num, valor: Integer; Function Cubo(Numero: Integer):Integer; Begin Cubo:= Num*Num*Num; End; Begin Clrscr; Writeln('Introduzca un numero entero'); Readln(Num); Valor:= Cubo(Num); Writeln('El cubo de ',Num,' es ', valor); Readln End. Program Cubo_de_numero; {Programa que calcula el cubo de un número, utilizando una función} Uses Crt; Var Num, Valor : Integer; Function Cubo(Numero: Integer):Integer; Begin Cubo:= Numero*Numero*Numero;

Page 109: ApuntesClases Version Noviembre08

End; Begin Clrscr; Writeln('Introduzca un numero entero'); Readln(Num); Valor:= Cubo(Num); Writeln('El cubo de ',Num,' es ', Valor); Readln End.

Page 110: ApuntesClases Version Noviembre08

Program Principal; { <-- Programa Principal --> } {Programa para explicar el uso de funciones} Uses Crt; Var a, b, s, m, listo: Integer ; Function suma(Var a : Integer ; Var b : Integer ): Integer ; { <-- Subprograma 1 --> } Begin suma := a+b; End; Function multiplica(Var a : Integer ; Var b : Integer ): Integer ; { <-- Subprograma 2 --> } Begin multiplica := a*b; End; Function Imprimir(Var sum : Integer ; Var prod : Integer ): Integer ; { <-- Subprograma 3 --> } Var listo : Integer ; Begin WriteLn('La suma es: ' , sum); WriteLn('La multiplicación es: ' , prod); listo := 1; {Utilicé este subterfugio para convertir un procedimiento en función} End; Begin {Principal} Clrscr; WriteLn('Introduzca dos valores:'); ReadLn(a); ReadLn(b); s := suma(a,b); m := multiplica(a,b); listo := Imprimir(s,m); {Utilicé este subterfugio para convertir un procedimiento en función} Readln End.

Page 111: ApuntesClases Version Noviembre08

Program Sumatoria; {Programa que calcula la suma 1 + 2 +... + n usando una función donde n es una variable que pasa a la función como parámetro formal} Uses Crt; Var Resultado, Num : Integer; Function Suma(N:Integer):Integer; {Esta es la funcion que calcula la sumatoria} Var Total, J :Integer; Begin Total := 0; For J:= 1 to N Do Total := Total + J; Suma:= Total End; {Fin de la funcion} {Programa Principal} Begin Clrscr; Writeln('Introduzca el numero de términos de la sumatoria'); Readln(Num); Resultado:=Suma(Num); Writeln('El valor de la suma es de los primeros ',Num, ' naturales es ', Resultado); Readln End.

Page 112: ApuntesClases Version Noviembre08

Program Mayor_funcion; {Programa que calcula el mayor de tres números, usando una función} Uses Crt; Var Mayor,A,B,C : Integer; Function Max3(N1,N2,N3:Integer):Integer; {Funcion que calcula el mayor} Var Maximo: Integer; Begin {Encontrar el mayor de a y b} If A > B Then Maximo := A Else Maximo := B; {Ahora compara el mayor de a y b con c} If Maximo > C Then Max3 := Maximo Else Max3 := C End; {Programa Principal} Begin Clrscr; Writeln('Introduzca los tres valores '); Readln(A,B,C); Mayor:= Max3(A,B,C); Writeln('El mayor de los tres números es ', Mayor); Readln End.

Page 113: ApuntesClases Version Noviembre08

Program Anio_Bisiesto; {Programa que determina si un año es bisiesto. Un año es bisiesto si es múltiplo de 4;(por ejemplo 1984). Los años múltiplos de 100 no son bisiestos, salvo si ellos son también múltiplos de 400 (2000 es bisiesto pero 1800 no lo es} Uses Crt; Var Anio : Integer; Resultado : Integer; Function Bisiesto(Anno:Integer):Integer; Begin bisiesto:= 0; If Anno mod 4 = 0 Then bisiesto := 1 Else bisiesto := 0; If (Anno mod 100 = 0) and (Anno mod 400 <> 0) Then bisiesto := 0; End; Begin {Programa Principal} Clrscr; Writeln('Cual es el a¤o?'); Readln(Anio); Resultado := Bisiesto(Anio); If Resultado = 1 Then Writeln('El año ', Anio, ' es Bisiesto') Else Writeln('El añ¤o ', Anio, ' no es Bisiesto'); Readln End. Program Anio_Bisiesto; {Programa que determina si un año es bisiesto. Un año es bisiesto si es múltiplo de 4;(por ejemplo 1984). Los años múltiplos de 100 no son bisiestos, salvo si ellos son también múltiplos de 400 (2000 es bisiesto pero 1800 no lo es} {En este programa la función produce un resultado que es una cadena de caracteres } Uses Crt;

Page 114: ApuntesClases Version Noviembre08

Var Anio : Integer; Resultado : String[15]; Function Bisiesto(Anno:Integer):String; Var Esbisiesto : Integer; Begin Esbisiesto:= 0; If Anno mod 4 = 0 Then Esbisiesto := 1 Else Esbisiesto := 0; If (Anno mod 100 = 0) and (Anno mod 400 <> 0) Then Esbisiesto := 0; If Esbisiesto <> 0 Then Bisiesto := 'Es Bisiesto' Else Bisiesto := 'No es Bisiesto'; End; {Programa Principal} Begin Clrscr; Writeln('Cual es el año?'); Readln(Anio); Resultado := Bisiesto(Anio); Writeln('El año ', Anio,' ', Resultado); Readln End.

Page 115: ApuntesClases Version Noviembre08

Comparación entre Funciones y Procedimientos En vez de la palabra procedure se debe utilizar la palabra function Al igual que en los procedimientos, el nombre de una función es un identificador. Sin embargo, el nombre de la función se refiere a la posición de memoria que contiene el valor devuelto por la función. La lista de los parámetros formales son los identificadores utilizados para recibir valores del programa. El tipo de datos del resultado coincide con el tipo expresado en la cabecera de la función. En el cuerpo de la función tiene que existir una sentencia de asignación como la siguiente: Nombre_función := valor_función La función sólo devuelve un valor, el procedimiento puede devolver cero, uno o varios valores. El tipo de dato del resultado de la función debe estar indicado en la cabecera y puede ser tipo char, integer, real o boolean. Ejemplo: Program Cubo_Numero; {Programa que calcula el cubo de un número, usando una función} Uses Crt; Var Numero, Valor: Integer; Function Cubo (Num: Integer):Integer; {Función que calcula el cubo del número} Begin Cubo := Num*Num*Num; End; {Programa Principal} Begin Write ('Introduzca un número entero: '); Readln (Numero); Valor := Cubo(Numero); Write ('El cubo de ',Numero,' es ',Valor); End.

Page 116: ApuntesClases Version Noviembre08

Llamadas a una Función Una función definida por el usuario, se invoca de igual modo que una función Pascal estándar, (predefinida); haciendo referencia a ella en una extensión. La llamada se realiza con el identificador de la función (designador) o nombre de la función, acompañado por la lista de parámetros, en una sentencia de asignación o en una sentencia de salida (escritura) Formato: Nombre_de_Función(lista de parámetros actuales) Reglas: - Los parámetros actuales deben estar separados por comas

- El número de parámetros actuales y formales debe ser el mismo, y además los parámetros correspondientes, deben ser de igual tipo.

Parámetros Actuales y Formales Las sentencias de llamadas a subprogramas constan de dos partes: un nombre de subprograma y una lista de parámetros , llamados actuales : Nombre_subprograma (pa1, pa2, pa3, …) Los parámetros actuales pa1, pa2, pa3, … contienen los valores que se pasan al subprograma identificado como Nombre_subprograma. En el momento que se hace la declaración de un subprograma, se incluye una serie de parámetros, (pf1, pf2, pf3, …), que son denominados parámetros formales o ficticios. Sirven para contener los valores de los parámetros actuales cuando de realiza la llamada al subprograma. Por ejemplo: Function Nombre_Subprograma(pf1, pf2, pf3, …:tipo):tipo El valor de los parámetros actuales no se conoce en el momento de realizar la declaración del subprograma, sin embargo, cuando se ejecuta la sentencia de llamada al subprograma, es preciso que tengan valores asignados, ya que en caso contrario se producirá error.

Page 117: ApuntesClases Version Noviembre08

15. Subprogramas: Funciones y Procedimientos 4.1 Procedimientos 4.1.1 Concepto Un procedimiento es un programa que realiza una tarea específica. Puede recibir cero o más valores del programa que llama y devolver cero o más valores al programa que realizó la llamada. Un procedimiento está compuesto de un grupo de sentencias a las que se asigna un nombre (identificador) y constituye una unidad de programa. La tarea asignada al procedimiento se ejecuta siempre que Pascal encuentra el nombre del procedimiento. Los procedimientos es obligatorio declararlos y deben ser declarados antes de que puedan ser referenciados en el cuerpo del programa. En Pascal reciben el nombre de PROCEDURE. 4.1.2 Declaración de un procedimiento Al igual que los identificadores, los procedimientos deben declararse dentro del cuerpo del programa. La declaración de un procedimiento NO indica a la computadora que ejecute las instrucciones dadas, sino que indica a la computadora cuáles son estas instrucciones y dónde están localizadas cuando sea necesario. El formato del procedimiento es el siguiente: Procedure nombreproc; Declaraciones locales Begin Cuerpo del procedimiento End; A las variables que se encuentran dentro de un procedimiento se les llaman Variables Locales y a las que se ubican en el cuerpo principal, fuera de los procedimientos, se les llama Variables Globales. En resumen, un procedimiento, al igual que un programa, consta de tres partes:

• Una cabecera del procedimiento que proporciona el nombre del mismo y, en caso de existir, una lista de parámetros formales.

• Una sección de declaración que puede contener constantes, variables e incluso otros procedimientos.

• Una sección ejecutable: el cuerpo del procedimiento. Ejemplo: Program Recuadro; Var I : Integer; Procedure Estrellas;

Page 118: ApuntesClases Version Noviembre08

(* Este procedimiento visualiza 15 asteriscos *) Begin For I := 1 to 15 do Write (`*´) End; Begin Estrellas; (* Llamado del procedure *); Write (`Mensajes´); Estrellas; (* Nuevo llamado del procedure *); End. Ventajas de utilizar procedimientos La organización de un programa en procedimientos lo hace más fácil de escribir y depurar. Los procedimientos no deben exceder de 25 líneas. Las ventajas de utilizar procedimientos son:

• Facilita el diseño descendente. • Los procedimientos se pueden ejecutar más de una vez en un programa y/o

en diferentes programas, ahorrando tiempo de programación. • El uso de procedimientos facilita la división de las tareas entre un equipo de

programadores y se pueden comprobar individualmente. 16. Parámetros Concepto Un parámetro es un método para pasar información (valores a variables) del programa principal a un procedimiento y viceversa. Un parámetro es, prácticamente, una variable cuyo valor debe ser ya sea proporcionado por el programa principal al procedimiento o ser devuelto desde el procedimiento hasta el programa principal. Por consiguiente, existen dos tipos de parámetros:

• Parámetros de entrada: Sus valores deben ser proporcionados por el programa principal.

• Parámetros de salida: Son parámetros cuyos valores se calcularán en el procedimiento y se deben devolver al programa principal para su proceso posterior.

Transferencia de información desde y/o hasta los procedimientos Existen dos tipos de procedimientos:

• Procedimientos sin parámetros: No existe comunicación entre el programa principal y los procedimientos ni viceversa.

• Procedimientos con parámetros: Existe comunicación entre el programa principal y los procedimientos o entre dos procedimientos.

Page 119: ApuntesClases Version Noviembre08

Ejemplo 1: (Parámetros de entrada) Procedure RecuadroDos (N : Integer); Var J : Integer; Begin For J := 1 to N do Write(`*´) End; Ejemplo 2: (Parámetros de entrada/salida) El procedimiento Geometria recibe la longitud y anchura de un rectángulo, calcula el área y perímetro del rectángulo y devuelve los valores obtenidos al programa principal. Procedure Geometria (Longitud, Anchura : Real; Var Area, Perímetro : Real); Begin Area := Longitud * Anchura; Perimetro := 2 * (Longitud + Anchura) End; Parámetros actuales y formales Las sentencias llamadas a procedimientos constan de dos partes: un nombre de procedimiento y una lista de parámetros llamados actuales: Nombreproc (pa1,pa2, pa3,...); Los parámetros actuales pa1, pa2, pa3, ... deben tener unos valores que se pasan al procedimiento nombreproc. En la declaración de un procedimiento cuando se incluyen parámetros, éstos se denominan parámetros formales o ficticios (pf1, pf2, pf3, ...). Ellos sirven para contener los valores de los parámetros actuales cuando se invoca el procedimiento. Procedure nombreproc (pf1, pf2, pf3, ...) El valor de los parámetros actuales no se conoce cuando se declara el procedimiento, sin embargo, cuando se ejecuta la sentencia de llamada al procedimiento es preciso que tengan valores asignados, ya que en caso contrario se producirá un error. Program Correspondencia; Uses Wincrt; Var X,Y,A,P : real; Procedure Geometria (Longitud, Anchura : Real; Var Area, Perimetro : Real); Begin (* Geometría *)

Page 120: ApuntesClases Version Noviembre08

Area := Longitud * Anchura; Perimetro := 2 * (Longitud + Anchura) End; Begin WriteLn ('Introducir longitud: '); Readln (X); WriteLn ('Introducir anchura: '); Readln (Y); Geometria (X,Y,A,P); (* Llamada al procedimiento *) WriteLn ('El área es: ', A:6:2); WriteLn ('El perímetro es: ', P:6:2) End. 17. Parámetros valor y parámetros variable Parámetros valor Son parámetros unidireccionales que se utilizan para proporcionar información a un procedimiento, pero no pueden devolver valores. Si la palabra var no aparece delante del parámetro formal en un procedimiento, la computadora supone que el parámetro formal es un parámetro valor. En la llamada al procedimiento el valor del parámetro actual se pasa a la variable que represente el parámetro actual. Este valor puede ser modificado dentro del programa, pero su valor no se puede devolver al programa o procedimiento llamante. Parámetros variable En la declaración de un procedimiento, los nombres de los parámetros variables están precedidos con la palabra var . Los parámetros variable se utilizan tanto para recibir como para transmitir valores entre el subprograma y el programa llamante. Estos parámetros pueden actuar como parámetros de salida o de entrada/salida. El siguiente ejemplo ilustra la diferencia entre parámetros valor y variable en Pascal y la correspondencia entre ellos. Program EjemploParametros; Uses Wincrt; Var A,B,C : Integer; Procedure Imprimir (D, E, F : Integer); Begin WriteLn ('A = ', D:1, ' ':5,'B = ', E:1,' ':5,'C = ', F:1) End; Procedure Pasar (D,E : Integer; Var F : Integer);

Page 121: ApuntesClases Version Noviembre08

Begin Writeln ('Entrada al procedimiento Pasar'); Imprimir (D, E, F); F := D * E; WriteLn ('Salida del procedimiento Pasar'); Imprimir (D, E, F) End; Begin A := 2; B := 3; C := 4; WriteLn ('Antes de llamar al procedimiento Pasar'); Imprimir (A, B, C); Pasar(A, B, C); WriteLn ('Después de llamar al procedimiento Pasar'); Imprimir (A, B, C); End. La salida de este programa es: Antes de llamar al procedimiento Pasar a = 2 b = 3 c = 4 Entrada al procedimiento Pasar a = 2 b = 3 c = 4 Salida del procedimiento Pasar a = 2 b = 3 c = 6 Después del retorno del procedimiento Pasar a = 2 b = 3 c = 6 18. Subprogramas: Funciones y Procedimientos 4.2 Paso de parámetros (repaso...) 4.2.1 Ejemplo En este ejemplo los parámetros formales a y b recibe, cuando son llamados, los valores contenidos en los parámetros actuales de x e y. Program Calculo; Uses wincrt; Var x,y : real; Procedure mayor (a,b : real); Var max : real; Begin if a > b then max := a

Page 122: ApuntesClases Version Noviembre08

else max := b; writeln ('El mayor de los dos números es ',max:4:2); End; Begin repeat write ('Introduzca dos números '); readln (x,y); mayor (x,y) until x = 0 End. 4.2.2 Ejemplo El siguiente ejemplo muestra un intercambio de valores de dos variables con un procedimiento. Program Intercambio; Uses wincrt; Var x,y : real; resp : char; Procedure cambio (var a,b : real); Var aux : real; Begin aux := a; a := b; b := aux; writeln ('Ahora el valor de a es ',a:5:2,' y el valor de b es ',b:5:2); End; Begin repeat clrscr; write ('Introduzca el valor para x '); readln (x); write ('Introduzca el valor para y '); readln (y); cambio(x,y); writeln; write ('Desea continuar (S/N)?'); readln (resp); until (resp = 'N') or (resp = 'n') End.

Page 123: ApuntesClases Version Noviembre08

Práctica general 1. Hacer un programa que calcule lea la Cédula de Identidad del empleado, el nombre del empleado y el salario bruto. Debe utilizar un procedimiento de cálculo tomando como parámetro el salario bruto (utilice una variable diferente al del programa principal). Finalmente, debe calcular la deducción de la Caja y del Banco Popular y el salario neto. La salida del programa debe ser la siguiente: El empleado (nombre), cédula No. (ci_empleado), obt uvo un salario neto de... Sus deducciones suman .... 2. Hacer un programa de funciones aritméticas que lea un número real y mediante un menú y utilizando procedimientos para cada función calcule: - El seno de ese número - El cuadrado de ese número - La raíz cuadrada de ese número - La parte decimal del número - La parte entera del número 3. Diseñe un programa que mediante una función calcule la suma de los números que están en un rango establecido. (Por ejemplo de 1 a 100). Pruebe con varios rangos. 4. Escribir un programa que, mediante una función devuelva el valor del día de la semana en respuesta a la entrada de la letra inicial de dicho día. 5. Mediante una función, determinar el número de días de un mes dado. 6. Escriba un programa que mediante una función determine si un número es primo. Respuesta No 1. Program Salario; Uses crt; Var id_empleado,i,n : integer; nom_empleado : string [40]; sal_bruto,salario_neto,tod_ded: real; resp : char; Procedure calcula (var sal_brut : real); Var cc_ss,b_p : real; Begin cc_ss := sal_brut * 0.08; b_p := sal_brut * 0.01; tod_ded := cc_ss + b_p;

Page 124: ApuntesClases Version Noviembre08

salario_neto := sal_brut - tod_ded End; Begin i:=1; Write ('Digite el número de empleados a procesar: '); readln (n); While i <= n do begin clrscr; write ('Id. del empleado ',i,' de ',n,' : '); readln (id_empleado); write ('Nombre: '); readln (nom_empleado); write ('Salario bruto: '); readln (sal_bruto); writeln; calcula(sal_bruto); writeln; writeln ('El salario neto de ',nom_empleado,' es ',salario_neto:10:2); writeln ('Sus deducciones fueron ',tod_ded:10:2); writeln; writeln ('Presione enter para continuar...'); readln; i := i+1; end; End. Respuesta No. 3. Program sumas; Uses wincrt; Var i,n:integer; Function Sumar (N : integer) : integer; Var suma : integer; Begin Suma := 0; For i:= 1 to N do suma := suma + i; Sumar := Suma; Write ('La suma de los números del 1',' al ',n, ' es: ',suma); Readln; End; Begin Write ('Digite el número máximo: '); Readln (N); Sumar (N); End.

Page 125: ApuntesClases Version Noviembre08

Respuesta No. 6. Program TestPrimos; Uses Wincrt; Var N : integer; Function Primo (Q : integer) : boolean; Var D : integer; P : boolean; Begin If Q < 4 then Primo := True Else Begin P:= True; D := 2; While P and (D<=Q div 2) do Begin P := Q mod D <> 0; D := D + 1 End; Primo := P End End; Begin Writeln ('Introduzca un entero positivo o cero para terminar: '); Readln (N); While N > 0 do Begin If Primo (N) then Writeln (N,' es primo') Else Writeln (N,' no es primo'); Writeln ('Introduzca otro entero'); Readln (N); End; Writeln End.