Algoritmo010

Page 1

AUTORES:

Manuel Antonio Montero Gaona Licenciado Matemáticas Universidad Pedagógica Nacional Especialista Computación para la Docencia Universidad Antonio Nariño Magíster en Evaluación de la Educación Universidad Santo Tomás de Aquino

Julio Roberto Duque Muñoz Licenciado Matemáticas Universidad Pedagógica Nacional Especialista Computación para la Docencia Universidad Antonio Nariño

“Reservado todos los derechos. Prohibida su reproducción parcial o total por cualquier medio mecánico o electrónico, de fotocopiado, y otros, sin permiso expreso de los autores.”

PROGRAMACION I – Algoritmos

1


TABLA DE CONTENIDO

GUIA 1 - Conceptos generales.

3

GUIA 2 - Trabajando algoritmos.

12

GUIA 3 - Programación estructurada. Estructura Secuencial.

25

GUIA 4 - Estructuras de decisión simple, doble y anidadas.

31

GUIA 5 - Estructura de decisión múltiple.

39

GUIA 6 - Estructuras cíclicas.

45

GUIA 7 - Procedimientos.

55

GUIA 8 - Funciones.

63

GUIA 9 - Arreglos.

70

GUIA 10 - Estructuras.

88

GUIA 11 - Archivos.

96

GUIA 12 - Estructura de datos.

105

BIBLIOGRAFIA

133

CODIGO ASCII

134

PROGRAMACION I – Algoritmos

2


GUIA 1 - CONCEPTOS GENERALES

LOGROS: Al finalizar el estudio y práctica de esta guía estaremos en capacidad de: •

Distinguir los diferentes tipos de datos

Definir constantes, tipos y variables

Utilizar adecuadamente la sentencia de asignación

Usar en forma conveniente las expresiones aritméticas y lógicas.

1.1 TIPOS DE DATOS Se consideran datos a toda entrada de información a una computadora. Estos datos pueden ser administrativos, científicos, comerciales, etc. son elementos primitivos, de los cuales a través del procesamiento se obtiene la información. Todos los datos tienen un tipo asociado con ellos. Un dato puede ser un simple carácter, tal como ‘b’, un valor entero tal como 35. El tipo de dato determina la naturaleza del conjunto de valores que puede tomar una variable.

Numéricos Simples

Lógicos Alfanuméricos (string) Arreglos (Vectores, Matrices)

Tipos de datos Estructurados

Registros

(Def. por el usuario)

Archivos Apuntadores

Tipos de Datos Simples •

Datos Numéricos: Permiten representar valores escalares de forma numérica, esto incluye a los

números enteros y los reales. Este tipo de datos permiten realizar operaciones aritméticas comunes. Ejemplos: ENTEROS 5

32

-9

0

23

1894

REALES -12345

-0.25 0 1.32 0.0028 -1.2356 4567896.02

PROGRAMACION I – Algoritmos

3


Datos Lógicos (booleanos): Son aquellos que solo pueden tener dos valores (verdadero o

falso) ya que representan el resultado de una comparación entre otros datos (numéricos o alfanuméricos). •

Datos Alfanuméricos: Es una secuencia de caracteres alfanuméricos que permiten representar

valores identificables de forma descriptiva, esto incluye nombres de personas, direcciones, teléfonos etc. Es posible representar números como alfanuméricos, pero estos pierden su propiedad matemática, es decir no es posible hacer operaciones con ellos. Este tipo de datos se representan encerrados entre comillas. Pueden ser de tipo carácter (un dato que puede contener un solo carácter que debe encerrarse entre comillas simples) o de tipo cadena (un dato que es una secuencia de caracteres y debe encerrarse entre comillas dobles). Ejemplos: CARACTER ‘a’

‘A’

‘*’

‘9’

‘-‘ ‘&’

CADENA

‘m’ ‘#’

“Hoy” “ITC” “Luis Angarita” “2345678” “1+5-8”

1.2 IDENTIFICADORES Los identificadores representan los datos de un programa (constantes, variables, tipos de datos). Un identificador es una secuencia de caracteres que sirve para identificar una posición en la memoria de la computadora, que nos permite accesar a su contenido. Ejemplo:

Nombre Dirección Calif2

Las sentencias describen las acciones algorítmicas que pueden ser ejecutadas. Una sentencia de asignación se utiliza para almacenar (asignar) valores a un identificador. La operación de asignación se indica por el símbolo =.

Constantes y Variables •

Constante: Una constante es un dato numérico o alfanumérico que no cambia durante la ejecución del programa. Ejemplo: pi = 3.1416

PROGRAMACION I – Algoritmos

4


Variable: Es un espacio en la memoria de la computadora que permite almacenar temporalmente un dato durante la ejecución de un proceso, su contenido puede cambiar durante la ejecución del programa. Para poder reconocer una variable en la memoria de la computadora, es necesario darle un nombre con el cual podamos identificarla dentro de un algoritmo. Ejemplo: área = pi * radio ** 2

Las variables son : el radio, el área y la constate es pi

Nombre = “Jorge Giraldo”

La variable es Nombre

Clasificación de las Variables

Por su Contenido •

Variables Numéricas: Son aquellas en las cuales se almacenan valores numéricos, positivos o

negativos, es decir almacenan números del 0 al 9, signos (+ y -) y el punto decimal. Ejemplo: iva=0.15 •

altura= 54.23 costo=6800

Variables Lógicas: Son aquellas que solo pueden tener dos valores (cierto o falso) estos

representan el resultado de una comparación entre otros datos. Ejemplo: Condición = 5 < 6. •

Variables Alfanuméricas: Están formadas por caracteres alfanuméricos (letras, números y

caracteres especiales). Ejemplo: letra=’a’

apellido=”Castro”

dirección=”Calle 13 # 16 – 74”

Por su Uso •

Variables de Trabajo: Variables que reciben el resultado de una operación matemática completa

y que se usan normalmente dentro de un programa. Ejemplo: Area =base*altura/2 •

Contadores: Un contador es una variable que se incrementa en una cantidad constante. Ejemplo: Contador = 35 Contador = Contador + 1

El nuevo valor de Contador será 35+1=36

Acumuladores: Un acumulador es una variable que se incrementa en una cantidad variable. Ejemplo: Total = Total + Precio

Si Total vale 586 y Precio 12 el nuevo valor de Total será 598.

1.3 EXPRESIONES Las expresiones son combinaciones de constantes, variables, símbolos de operación, paréntesis y nombres de funciones especiales. Por ejemplo: a+(b + 3)/c

PROGRAMACION I – Algoritmos

5


Cada expresión toma un valor que se determina tomando los valores de las variables y constantes implicadas y la ejecución de las operaciones indicadas. Una expresión consta de operadores y operandos. Según sea el tipo de datos que manipulan, se clasifican las expresiones en: •

Aritméticas

Relaciónales

Lógicas

1.4 OPERADORES Y OPERANDOS •

Operadores: Son elementos que relacionan de forma diferente, los valores de una o mas

variables y/o constantes. Es decir, los operadores nos permiten manipular valores. Aritméticos Tipos de Operadores

Relaciónales Lógicos

Operadores Aritméticos: Los operadores aritméticos permiten la realización de operaciones

matemáticas con los valores (variables y constantes). Los operadores aritméticos pueden ser utilizados con tipos de datos enteros o reales. Si ambos son enteros, el resultado es entero; si alguno de ellos es real, el resultado es real. Tabla 1.1 Operadores aritméticos Operador

Significado

Expresión

Resultado

+

Suma

5+8

13

-

Resta

45-52

-7

*

Multiplicación

44*11

484

/

División real

38/7

5.6

% o mod

Residuo o módulo

7%4 o 7 mod 4

3

div

División entera

7 div 4

1

**

Potencia

5**3

125

PROGRAMACION I – Algoritmos

6


Reglas de jerarquía de los operadores aritméticos Cuando una expresión aritmética tiene más de un operador aritmético, el orden de aplicación de los operadores sigue un orden preciso determinado por las reglas de jerarquía de los operadores aritméticos, que se muestran en la siguiente tabla: Tabla 1.2 Reglas de jerarquía de los operadores aritméticos Operador

Orden de evaluación

()

Se evalúan en primer lugar

**

Se evalúan en segundo lugar

*, /, % o mod, div

Se evalúan en tercer lugar

+, -

Se evalúan en cuarto lugar

Si existen paréntesis anidados, se evalúa primero la expresión en el par más interno. Si varios operadores o paréntesis tienen la misma jerarquía, la evaluación será de izquierda a derecha. Ejemplos: 4 + 2 * 5 = 4+10=14 23 * 2 / 5 =46 / 5 = 9.2 3 + 5 * (10 - (2 + 4))= 3 + 5 * (10 - 6) = 3 + 5 * 4 = 3 + 20 = 23 3.5 + 5.09 - 14.0 / 4.0 =3.5 + 5.09 - 3.5 = 8.59 - 3.5 = 5.09 2.1 * (1.5 + 3.0 * 4.1) =2.1 * (1.5 + 12.3) = 2.1 * 13.8 = 28.98 7 * 5 ** ¾ div 3 = 7 * 125/4 div 3 = 875/4 div 3 = 218.75 div 3 = 72 Escritura de fórmulas matemáticas en forma algorítmica Fórmula matemática a= b+c a= s +

x=

b c

x+ y−a d −1

Expresión algorítmica a=b+c

a =s+b/c X=(x+y-a)/(d-1)

Fórmula matemática

5 y= 1+ x2 x + y3 z= +x w

y = x2 +1 +1

PROGRAMACION I – Algoritmos

Expresión algorítmica y=5/(1+x**2) z=(x+y**3)/w+x y=(x**2+1)**(1/2)+1

7


ACTIVIDAD 1.1 1.- Dados los datos siguientes identifique su tipo DATO 8

TIPO DE DATO

DATO

TIPO DE DATO

12345

‘q’

“2004” -4

-12.365 4/5

‘/’

“Germán Cubides”

“2 45 77 94”

2.- Si el valor de A es 15, el valor de B es 4 y el valor de C es 2, dar el valor de cada una de las siguientes expresiones: EXPRESION A mod B A div C A*B – A div B *C -C B*A – B**2/2*C (3*A-4*C+1)/(5*B-1)

VALOR

EXPRESION (A+B**3+1) / B + 8 (A*C+C**4 -19)**(1/3) A + B / C+1 (A+B+C) mod C+2 (A-2*B) div (5*C-6)

VALOR

3- Completar la siguiente tabla Fórmula matemática

Expresión algorítmica

Fórmula matemática

y=5*x-3

x + 2z y= +5 4 y=(a+b)/(c-d) - 8

y = 5x 2 − 2 x + 4

y= (5*x-3)/z+2

y=

y=

x2 + z2 x

x + z 4x − + 7x 5 3z

y=(5*x**2-8)**(1/4) y=(2*z-x**3)/(3*x-1/2)+2

y=

Expresión algorítmica

y=

− b + b 2 − 4ac 2a y=(x**3-z**2)**(1/5)

4 x − 2z −3 x−z x −1

PROGRAMACION I – Algoritmos

8


Operadores Relacionales •

Se utilizan para establecer una relación entre dos valores.

Compara estos valores entre si y esta comparación produce un resultado de certeza o falsedad (verdadero o falso).

Los operadores relacionales comparan valores del mismo tipo (numéricos o cadenas)

Tienen el mismo nivel de prioridad en su evaluación.

Los operadores relacionales tienen menor prioridad que los aritméticos. Tabla 1.3 Operadores relacionales Operador > >= < <= == !=

Significado mayor que mayor o igual que menor que menor o igual que igual a diferente de

Ejemplo 15 > 6 5 >= 65 8< 5 -5 <= -5 “Paco” == “Peca” 2 != 9

Resultado verdadero falso falso verdadero falso verdadero

Operadores Lógicos: •

Estos operadores se utilizan para establecer relaciones entre valores lógicos o booleanos.

Estos valores pueden ser resultado de una expresión relacional. Tabla 1.4 Operadores lógicos

Operador ~ y o

Significado no y ó

Ejemplo ~a ayb aob

Tabla 1.5 Tabla de verdad de los operadores lógicos P

Q

~P

~Q

PoQ

PyQ

V

V

F

F

V

V

V

F

F

V

V

F

F

V

V

F

V

F

F

F

V

V

F

F

PROGRAMACION I – Algoritmos

9


Ejemplos: (a < b) y (b < c) (10<20) y (20<30) V

y

V

V Prioridad de los Operadores LĂłgicos

Prioridad de los Operadores en General

1.-

~

1.- ( )

2.-

Y

2.- **

3.-

o

3.- *, /,div, mod, ~ 4.- +, -, y 5.- >, <, > =, < =, < >, =, o

Ejemplos: a = 10 b = 12 c = 13 d =10

1)

((a > b)o(a < c)) y ((a = c) o (a > = b)) F

V

F

V

F F

F 2)

((a > = b) o (a < d)) y (( a > = d) y (c > d)) F

F

V

F

V V

F 3)

~ (a = c) y (c > b) F

V

V V 4)

~ ( (c < d ) o ~(a == b)) F

F V V

F

PROGRAMACION I – Algoritmos

10


ACTIVIDAD 1.2 Dar el resultado de cada una de las siguientes expresiones lógicas ~(15 >= 7**2) o ((43 – 8*2 div 4) != 3*2/2)

(15 >= 7*3**2 y ( 8 >3 y 15 > 6)) o ~(7*3 < (5 +12*2 div 3**2))

~((7*3 div 2 *4 ) > (18/2*7 >= 19*27/(15 mod 4)))

(6 mod 4**2 < 8 div 4) y ~((16 – 23 div 9) > 48/(3+9 mod 6))

~((4*3 – 46 div 2**3) >= ( 64/2**3 )) o ( 65 div 7 < ( 8*3 – 72 mod 4))

PROGRAMACION I – Algoritmos

11


GUÍA 2 Trabajando Algoritmos “Cambiamos sólo cuando decidimos que ese cambio nos ayuda a ser lo que queremos ser” Margaret Wheatley

LOGROS El estudiante -

Desarrolla algoritmos que conlleven a la solución de los problemas planteados.

-

Diseña los diagramas de flujo de cada algoritmo desarrollado.

-

Conoce las diferentes estructuras algorítmicas como componentes básicos de los programas y

Aplica la combinación de ellas para el desarrollo de algoritmos más complejos.

Competencias a desarrollar: Comprender y analizar el enunciado de un problema dado, destacando las tres preguntas básicas: ¿Qué me dan?, ¿Qué me piden? Y ¿Qué tengo que realizar? o ¿Qué proceso tengo que realizar? Actividad A. Desplazamiento desde mi casa hasta el colegio. 1. Escriba las actividades que usted realizo desde levantarse hasta llegar al Colegio. 2. Lea cada Actividad, sepárela y colóquele un número cronológico. 3. ¿Estas actividades siguen un orden lógico? 4. Haga las correcciones necesarias. 5. Vuelva a leer cada una de las actividades y coloque las actividades que hacen falta.

ESTRUCTURAS BÁSICAS Ahora vamos a ver las estructuras básicas de la programación. Estas estructuras nos ayudarán en el momento en el que nos tengamos que enfrentar a la creación de un programa, ya que nos facilitarán la planificación y la programación del mismo. En el momento de programar debemos tener en cuenta: 1.- Estructurar el código para una fácil comprensión en el momento de modificaciones y ampliaciones.

PROGRAMACION I – Algoritmos

12


2.-

Poner

comentarios

en

lugares

clave

para

facilitar

el

entendimiento

del

código.

3.- Intentar ahorrar el número de líneas de código, cuantas más líneas inútiles, peor será el programa. 4.- Pensar que el código del programa, muchas veces, no es solo para nosotros, sino que hay mucha gente a la que le puede interesar nuestro trabajo y ellos deben ser capaces de entender el código Ejemplo (Subiendo escaleras). Imagina que estamos creando un pequeño programa para un robot que debe subir 10 escalones. El robot entiende las siguientes instrucciones LevantaPieIzquierdo (para levantar el pie izquierdo y subir un escalón) y LevantaPieDerecho (para levantar el pie derecho y subir otro escalón), con lo que podrá ir ascendiendo hasta llegar al final de la escalera. Si solo pudiésemos utilizar estas dos instrucciones deberíamos hacer un programa con las siguientes líneas de código: LevantaPieIzquierdo LevantaPieDerecho LevantaPieIzquierdo LevantaPieDerecho LevantaPieIzquierdo LevantaPieDerecho LevantaPieIzquierdo LevantaPieDerecho LevantaPieIzquierdo LevantaPieDerecho Observemos que en este caso hemos tenido que escribir las mismas instrucciones varias veces para que el robot fuera subiendo la escalera. ¿Que hubiese sucedido si el robot en lugar de subir 10 escalones hubiese tenido que subir la Torre Colpatria?.

El código hubiese sido interminable,

corriendo el peligro de equivocarnos al contar la cantidad de escalones, con lo que el robot no hubiese llegado a la cima de la escalera. O incluso nos podríamos haber equivocado poniendo dos veces la misma instrucción, con lo que el robot se hubiese pegado un golpe impresionante al levantar dos veces el mismo pie.

PROGRAMACION I – Algoritmos

13


Para solucionar estos problemas disponemos de diferentes instrucciones que nos permiten reducir el número de líneas de un programa facilitando así la compresión, la modificación del código y un posible error en la ejecución del programa. Observa una solución para nuestro problema. (Piensa que para un mismo problema no solo existe una solución, te ofrecemos una, pero eso no quiere decir que sea la mejor, ni la única). Las nuevas instrucción se explicará en guías posteriores. Repetir 10 veces comenzar LevantaPieIzquierdo LevantaPieDerecho Fin Lo que hemos creado es un código de repetición hasta que se cumple una determinada condición. Compara las dos posibles soluciones al mismo programa: LevantaPieIzquierdo LevantaPieDerecho LevantaPieIzquierdo LevantaPieDerecho LevantaPieIzquierdo LevantaPieDerecho LevantaPieIzquierdo LevantaPieDerecho

Repetir 10 veces comenzar LevantaPieIzquierdo LevantaPieDerecho Fin

LevantaPieIzquierdo LevantaPieDerecho

PROGRAMACION I – Algoritmos

14


Actividad B. La ruta de mi colegio. Suponga que usted es conductor de la ruta de su colegio. El siguiente mapa muestra el recorrido,

1.

En cada casa usted debe recoger un estudiante.

2.

únicamente puede avanzar hacia adelante y girar a la izquierda.

3.

únicamente puede ir por calles y carreras.

4.

realice el proceso para girar a la derecha y retroceder.

5.

realice el algoritmo para dejar los estudiantes en su casa al regreso de clases.

IR AL COLEGIO (ALGORITMO)

REGRESO DEL COLEGIO

PROGRAMACION I – Algoritmos

15


RETROCEDER

GIRAR A LA DERECHA

Lenguajes Algoritmicos Es una serie de símbolos y reglas que se utilizan para describir de manera explícita un proceso.

Tipos de Lenguajes Algoritmicos ¾ Gráficos: Es la representación gráfica de las operaciones que realiza un algoritmo (diagrama de flujo). ¾ No Gráficos: Representa en forma descriptiva las operaciones que debe realizar un algoritmo (pseudocodigo).

PROGRAMACION I – Algoritmos

16


Metodología para la solución de problemas por medio de computadora

Definición del Problema Esta fase está dada por el enunciado del problema, el cual requiere una definición clara y precisa. Es importante que se conozca lo que se desea que realice la computadora; mientras esto no se conozca del todo no tiene mucho caso continuar con la siguiente etapa.

Análisis del Problema Una vez que se ha comprendido lo que se desea de la computadora, es necesario definir: Los datos de entrada. Cual es la información que se desea producir (salida) Los métodos y fórmulas que se necesitan para procesar los datos. Una recomendación muy practica es el que nos pongamos en el lugar de la computadora y analicemos qué es lo que necesitamos qué nos ordenen y en qué secuencia para producir los resultados esperados. Diseño del Algoritmo

Las características de un buen algoritmo son:

Debe tener un punto particular de inicio.

Debe ser definido, no debe permitir dobles interpretaciones.

Debe ser general, es decir, soportar la mayoría de las variantes que se puedan presentar en la

definición del problema.

Debe ser finito en tamaño y tiempo de ejecución.

Codificación La codificación es la operación de escribir la solución del problema (de acuerdo a la lógica del diagrama de flujo o pseudocódigo), en una serie de instrucciones detalladas, en un código reconocible por la computadora, la serie de instrucciones detalladas se le conoce como código fuente, el cual se escribe en un lenguaje de programación o lenguaje de alto nivel.

PROGRAMACION I – Algoritmos

17


Prueba y Depuración Los errores humanos dentro de la programación de computadoras son muchos y aumentan considerablemente con la complejidad del problema. El proceso de identificar y eliminar errores, para dar paso a una solución sin errores se le llama depuración. La depuración o prueba resulta una tarea tan creativa como el mismo desarrollo de la solución, por ello se debe considerar con el mismo interés y entusiasmo.

Diagrama de Flujo Un diagrama de flujo es la representación gráfica de un algoritmo. También se puede decir que es la representación detallada en forma gráfica de como deben realizarse los pasos en la computadora para producir resultados. Esta representación gráfica se da cuando varios símbolos (que indican diferentes procesos en la computadora), se relacionan entre sí mediante líneas que indican el orden en que se deben ejecutar los procesos. Los símbolos utilizados han sido normalizados por el instituto norteamericano de normalización (ANSI).

SÍMBOLO

DESCRIPCIÓN Indica el inicio y el final de nuestro diagrama de flujo. Indica la entrada y salida de datos. Símbolo de proceso y nos indica la asignación de un valor en la memoria y/o la ejecución de una operación aritmética Símbolo de decisión indica la realización de una comparación de valores.

Se utiliza para representar los subprogramas.

PROGRAMACION I – Algoritmos

18


Conector dentro de página. Representa la continuidad del diagrama dentro de la misma página. Conector fuera de página. Representa la continuidad del diagrama en otra página. Indica la salida de información

Líneas de flujo o dirección. Indican la secuencia en que se realizan las operaciones. Indica los ciclos que realizamos

Recomendaciones para el diseño de Diagramas de Flujo •

Se deben usar solamente líneas de flujo horizontal y/o vertical.

Se debe evitar el cruce de líneas, utilizando los conectores.

Se deben usar conectores solo cuando sea necesario.

No deben quedar líneas de flujo son conectar.

Se deben trazar los símbolos de manera que se puedan leer de arriba hacia abajo y de izquierda a derecha.

Todo texto escrito dentro de un símbolo deberá ser escrito claramente, evitando el uso de muchas palabras.

Pseudocódigo Mezcla de lenguaje de programación y español (o ingles o cualquier otro idioma) que se emplea, dentro de la programación estructurada, para realizar el diseño de un programa. En esencia, el pseudocódigo se puede definir como un lenguaje de especificaciones de algoritmos. Es la representación narrativa de los pasos que debe seguir un algoritmo para dar solución a un problema determinado. El pseudocódigo utiliza palabras que indican el proceso a realizar.

PROGRAMACION I – Algoritmos

19


Ventajas de utilizar un Pseudocódigo a un Diagrama de Flujo •

Ocupa menos espacio en una hoja de papel

Permite representar en forma fácil operaciones repetitivas complejas

Es muy fácil pasar de pseudocódigo a un programa en algún lenguaje de programación.

Si se siguen las reglas se puede observar claramente los niveles que tiene cada operación.

EJEMPLOS 1) Suponga que un individuo desea invertir su capital en un banco y desea saber cuánto dinero ganará después de un mes si el banco paga a razón de 2% mensual. Inicio Leer cap_inv gan = cap_inv * 0.02 Imprimir gan Fin 2) Un vendedor recibe un sueldo base mas un 10% extra por comisión de sus ventas, el vendedor desea saber cuánto dinero obtendrá por concepto de comisiones por las tres ventas que realiza en el mes y el total que recibirá en el mes tomando en cuenta su sueldo base y comisiones. Inicio Leer sb, v1, v2, v3 tot_vta = v1 + v2 + v3 com = tot_vta * 0.10 tpag = sb + com Imprimir tpag, com Fin EJERCICIOS Escriba en cada uno de los cuadros el algoritmo de cada ejercicio. 1) Una tienda ofrece un descuento del 15% sobre el total de la compra y un cliente desea saber cuanto deberá pagar finalmente por su compra.

PROGRAMACION I – Algoritmos

20


2) Un alumno desea saber cual será su calificación final en la materia de Algoritmos. Dicha calificación se compone de los siguientes porcentajes: 55% del promedio de sus tres calificaciones parciales. 30% de la calificación del examen final. 15% de la calificación de un trabajo final.

3) Un maestro desea saber qué porcentaje de hombres y qué porcentaje de mujeres hay en un grupo de estudiantes.

PROGRAMACION I – Algoritmos

21


4) Realizar un algoritmo que calcule la edad de una persona.

5) Dada una cantidad en pesos, obtener la equivalencia en dólares, asumiendo que la unidad cambiaría es un dato desconocido.

PROGRAMACION I – Algoritmos

22


Recorta cada uno de los símbolos de los diagramas de flujo y realiza el diagrama de flujo del ejemplo, en el siguiente espacio. (Con ayuda de su profesor).

DIAGRAMA DE FLUJO

PROGRAMACION I – Algoritmos

23


TRABAJO 1.

El dueño de una tienda compra un artículo a un precio determinado. Obtener el precio en que

lo debe vender para obtener una ganancia del 30%. 2.

Todos los lunes, miércoles y viernes, una persona corre la misma ruta y cronometra los

tiempos obtenidos. Determinar el tiempo promedio que la persona tarda en recorrer la ruta en una semana cualquiera. 3.

Tres personas deciden invertir su dinero para fundar una empresa. Cada una de ellas invierte

una cantidad distinta. Obtener el porcentaje que cada quien invierte con respecto a la cantidad total invertida.

PROGRAMACION I – Algoritmos

24


GUIA 3 – PROGRAMACIÓN ESTRUCTURADA LOGROS: Al finalizar el estudio y práctica de esta guía estaremos en la capacidad de: •

Conocer las técnicas de programación modular y programación estructurada.

Resolver problemas empleando estructura secuencial.

3.1 INTRODUCCIÓN Para lograr que los programas sean más fáciles de escribir, verificar, leer y mantener, las teorías de programación se centran en las técnicas de programación modular y programación estructurada.

3.1.1 PROGRAMACIÓN MODULAR Consiste en construir un programa tratando en descomponerlo en módulos, cada uno encargado de realizar un trabajo específico. Cada programa contiene un módulo principal, que controla todo lo que sucede, luego se transfiere el control a submódulos de modo que ellos puedan ejecutar su tarea y devolver al final el control al módulo principal. Si la tarea asignada a cada submódulo es demasiado compleja, este se descompone en otros módulos más pequeños. Un módulo puede transferir temporalmente el control a otro módulo, sin embargo, cada módulo debe eventualmente devolver el control al módulo del cuál se recibe originalmente.

Nivel 0

MODULO PRINCIPAL

Módulo 1

Módulo 1.1

Módulo 2

Módulo 2.1

Módulo 3

Módulo 2.2

Módulo 2.2.1

Módulo 2.2.2

PROGRAMACION I – Algoritmos

Nivel 1

Nivel 2

Nivel 3

25


3.1.2 PROGRAMACIÓN ESTRUCTURADA Es una forma de programación con la cual se elaboran programas cuya estructura es la más clara posible, mediante el uso de tres estructuras básicas de control: •

Secuenciales

Selectivas

Repetitivas

La programación estructurada debe tener las siguientes características: 1. Poseer un solo punto de entrada. 2. Existir caminos desde la entrada hasta la salida que se puedan seguir y que pasen por todas las partes del programa, es decir, no tiene partes por las cuales nunca pasen. 3. Todas las instrucciones son ejecutables y no existen bucles o ciclos infinitos.

3.2 ESTRUCTURA SECUENCIAL 3.2.1 Concepto La estructura secuencial es aquella en la que una acción sigue a otra en secuencia. Las tareas se suceden de tal modo que la salida de una es la entrada de la siguiente y así sucesivamente hasta el fin del proceso.

ACCION 1

ACCION 2

3.2.2 Construcción del algoritmo Estudiaremos inicialmente algoritmos que se caracterizan por tener la siguiente pauta : •

Entrada de datos

Cálculos

Salida de resultados

PROGRAMACION I – Algoritmos

26


Diagrama de flujo

Seudocódigo

programa < Nombre> comienzo // Declaración de variables tipo_de_dato variable1, variable2, etc. tipo_de_dato variable3, variable4, etc. // Entrada Lea(lista de variables de entrada) //Cálculos Cálculos que se deben efectuar // Salida Escriba(lista de variables de salida fin

3.3 EJEMPLOS Ejemplo 1 Dados dos números reales, encontrar su suma y su producto. Definición de variables: num1, num2: los dos números de tipo real sum: de tipo real almacena el resultado de la suma de los dos números pro: de tipo real almacena el resultado de la multiplicación de los números

Diagrama de flujo

Seudocódigo programa Ejemplo 1 comienzo // Declaración de variables Real num1, num2, sum, pro; // Entrada Lea(num1, num2) //Cálculos sum = num1 + num2; pro = num1 * num2; // Salida Escriba(“Suma = “, sum); Escriba(“Producto =”, pro); fin PROGRAMACION I – Algoritmos

27


Número de corrida 1 2 3 4 5

PRUEBA DE ESCRITORIO Datos Resultados Num1 Num2 sum pro 7.25 18.30 25.55 132.675 50.60 3.98 54.58 201.388 43.20 12.60 55.80 544.320 9.85 1.90 11.75 18.715 100.70 87.60 188.30 8821.32

Ejemplo 2 De un estudiante conocemos: código, nombre, 1ª evaluación, 2ª evaluación, evaluación final y trabajos. Calcular la nota definitiva, sabiendo que los porcentajes para las notas son: 20%, 20%, 30% y 30% respectivamente. Definición de variables: co, nom: código y nombre del estudiante de tipo cadena. n1, n2 : 1ª evaluación y 2ª evaluación de tipo real. ef: evaluación final de tipo real. tr: trabajos de tipo real. def: nota definitiva de tipo real

Diagrama de flujo

Seudocódigo

programa Ejemplo 2 comienzo // Declaración de variables cadena co, nom; real n1, n2, ef, tr, def; // Entrada Lea(co, nom, n1, n2, ef, tr) //Cálculos def=n1*0.2+n2*0.2+ef*0.3+tr*0.3 ; // Salida Escriba(def); Fin

ACTIVIDAD: Realice la prueba de escritorio. Número de corrida

co

PRUEBA DE ESCRITORIO DATOS nom n1

n2

ef

tr

Resultados def

1 2

PROGRAMACION I – Algoritmos

28


3 4 5 3.4 EJERCICIOS Construya el diagrama de flujo, el seudocódigo y realice la prueba de escritorio de los siguientes problemas: 1. Dado el radio R de una esfera, calcular e imprimir su área y su volumen. 2. Leer la base y la altura de un rectángulo, calcular el perímetro y la área. 3. Dada una cantidad en pesos, obtener la equivalencia en dólares, asumiendo que la unidad cambiaría es un dato desconocido. 4. Leer un número y escribir el valor absoluto del mismo. 5. Calcular el número de pulsaciones que una persona debe tener por cada 10 segundos de ejercicio, si la formula es: num. pulsaciones = (220 - edad)/10 6. Calcular el nuevo salario de un obrero si obtuvo un incremento del 25% sobre su salario anterior. 7. En un hospital existen tres áreas: Ginecología, Pediatría, Traumatología. El presupuesto anual del hospital se reparte conforme a la sig. tabla: Área

Porcentaje del presupuesto

Ginecología

40%

Traumatología

30%

Pediatría

30%

Obtener la cantidad de dinero que recibirá cada área, para cualquier monto presupuestal. 8. El dueño de una tienda compra un artículo a un precio determinado. Obtener el precio en que lo debe vender para obtener una ganancia del 30%. 9. Todos los lunes, miércoles y viernes, una persona corre la misma ruta y cronometra los tiempos obtenidos. Determinar el tiempo promedio que la persona tarda en recorrer la ruta en una semana cualquiera. 10. Tres personas deciden invertir su dinero para fundar una empresa. Cada una de ellas invierte una cantidad distinta. Obtener el porcentaje que cada quien invierte con respecto a la cantidad total invertida.

PROGRAMACION I – Algoritmos

29


11. Un alumno desea saber cual será su promedio general en las tres materias mas difíciles que cursa y cual será el promedio que obtendrá en cada una de ellas. Estas materias se evalúan como se muestra a continuación:

La calificación de Matemáticas se obtiene de la sig. manera: Examen 90% Promedio de tareas 10% En esta materia se pidió un total de tres tareas. La calificación de Física se obtiene de la sig. manera: Examen 80% Promedio de tareas 20% En esta materia se pidió un total de dos tareas. La calificación de Química se obtiene de la sig. manera: Examen 85% Promedio de tareas 15% En esta materia se pidió un promedio de tres tareas

PROGRAMACION I – Algoritmos

30


GUIA 4 – ESTRUCTURAS DE DECISION LOGROS: Al finalizar el estudio y práctica de esta guía estaremos en la capacidad de: 1. Manejar correctamente estructuras de decisión simple. 2. Usar adecuadamente estructuras de decisión doble. 3. Utilizar la sentencia SI anidada para construir decisiones con diferentes alternativas. 4.1 INTRODUCCIÓN. Las estructuras de decisión se encuentran en la solución algorítmica de casi todo tipo de problemas. Las utilizamos cuando en el desarrollo de la solución de un problema, con base en los valores de ciertas variables, debemos tomar una decisión, para establecer un proceso a seguir. Tales decisiones requieren la evaluación de una o varias condiciones que están expresadas, en los términos de las variables, como una expresión lógica, esto es una expresión que puede tener el valor de verdadero o falso. Esta estructura recibe el nombre de estructura de decisión y puede ser: 1. Simple ( Si ... Entonces). 2. Doble (Si ... Entonces/Sino) 3. Múltiple (Según sea...). Estudiemos ahora cada una por separado. 4.2 ESTRUCTURA DE DECISIÓN SIMPLE. La estructura de decisión simple si... entonces ejecuta una determinada acción cuando se cumple una determinada condición. La podemos representar: Diagrama de flujo

Seudocódigo . . . si condición entonces Instrucción(es) fin si . .

PROGRAMACION I – Algoritmos

Si la condición es verdadera se ejecuta la instrucción o instrucciones. Si la condición es falsa se ejecuta la instrucción siguiente del código fin si para proseguir con nuevas instrucciones

31


Ejemplo 1 Un empresario ofrece, por Navidad, un bono del 15% del sueldo a los trabajadores que ganen menos de $1000000. Elabore el algoritmo para hallar el valor del bono. Definición de variables: nom: Nombre del trabajador de tipo cadena. sue: Sueldo de tipo real. bon: Bono de tipo real. Diagrama de flujo

Seudocódigo

algoritmo Ejemplo 1 Inicio cadena nom; real sue, bon; Lea(nom, sue); si sue < 1000000 entonces bon = sue*15/100; fin si Escriba(nom, bon); Final

PRUEBA DE ESCRITORIO DATOS nom

Número de corrida 1 2 3 4 5

German Cubides Luis Aguilar Jaime Arias Martha Duarte Lilia Jaramillo

PROGRAMACION I – Algoritmos

sue 456981 1234578 567890 432124 2564128

Resultados bon 68547.15 0 85183.50 64818.60 0

32


Ejemplo 2 Determinar cuál es el número menor y cuál es el número mayor de dos enteros diferentes. Definición de variables: a y b: los números de tipo entero t : Variable temporal de tipo entero Actividad: Realice el diagrama de flujo y la prueba de escritorio. Diagrama de flujo

Seudocódigo

algoritmo Ejemplo 2 Inicio Entero a, b, t; Lea(a, b); si a > b entonces t=a; a=b; b=t; fin si Escriba(“Número menor”, a); Escriba(“Número mayor”, b); Final

Número de corrida 1 2 3 4 5

DATOS a 25 6 12 56 132

PRUEBA DE ESCRITORIO Proceso b t a b 15 8 48 35 98

PROGRAMACION I – Algoritmos

Resultados Nro. menor, a Nro. mayor, b

33


4.3 ESTRUCTURA DE DECISIÓN DOBLE La estructura de decisión doble permite elegir entre dos opciones o alternativas posibles en función del cumplimiento o no de una determinada condición. La podemos representar: Diagrama de flujo

Seudocódigo . . . si condición entonces Instrucción(es) V Sino Instrucción(es) F fin si . .

Si la condición es verdadera se ejecuta el bloque de instrucción(es) V y no ejecuta instrucción(es) F. Si la condición es falsa se ejecuta el bloque de instrucción(es) F para proseguir con nuevas instrucciones. Se omite el bloque instrucción(es) V.

Ejemplo 3 Un empresario ofrece, por Navidad, un bono del 15% del sueldo a los trabajadores que ganen menos de $1000000 y 10% en caso contrario. Elabore el algoritmo para hallar el valor del bono. Definición de variables: nom: Nombre del trabajador de tipo cadena. sue: Sueldo de tipo real. bon: Bono de tipo real.

PROGRAMACION I – Algoritmos

34


Diagrama de flujo

Seudocódigo

algoritmo Ejemplo 3 inicio cadena nom; real sue, bon; Lea(nom, sue); si sue < 1000000 entonces bon = sue*15/100; sino bon = sue*10/100; fin si Escriba(nom, bon); final

Número de corrida 1 2 3 4 5

PRUEBA DE ESCRITORIO DATOS nom German Cubides Luis Aguilar Jaime Arias Martha Duarte Lilia Jaramillo

sue 456981 1234578 567890 432124 2564128

Resultados bon 68547.15 123457.80 85183.50 64818.60 256412.80

4.4 SI... ENTONCES ANIDADOS Las estructuras si... entonces o si entonces/sino interiores a otras estructuras si... entonces o si entonces/sino se denominan anidadas

Ejemplo 4 Un empresario ofrece, por Navidad, un bono del 15% del sueldo a los trabajadores que ganen menos de $1000000 , 10% si el sueldo es mayor o igual a 1000000 pero menos de 2500000 y 8% a los demás trabajadores. Elabore el algoritmo para hallar el valor del bono. Definición de variables: nom: Nombre del trabajador de tipo cadena. sue: Sueldo de tipo real. bon: Bono de tipo real

PROGRAMACION I – Algoritmos

35


Diagrama de flujo

Seudocódigo

algoritmo Ejemplo 4 Inicio cadena nom; real sue, bon; Lea(nom, sue); si sue < 1000000 entonces bon = sue*15/100; sino si sue < 2500000 entonces bon = sue*10/100; sino bon = sue*8/100; fin si fin si Escriba(nom, bon); Final

Realizar la prueba de escritorio PRUEBA DE ESCRITORIO DATOS nom

Número de corrida 1 2 3 4 5

Carlos Avellaneda Luisa Grisales Juan Pabón Jaime Arias Lilia Jaramillo

sue 1258634 768956 3561278 625124 2564128

Resultados bon

Actividad Construya el diagrama de flujo, el seudocódigo y realice la prueba de escritorio de los siguientes problemas

1) Dadas tres longitudes de segmentos, determinar si con ellos se puede construir un triángulo. (Cada longitud debe se menor que la suma de las otras dos). 2) Dadas las tres longitudes que representan los lados de un triángulo determinar si es isósceles, equilátero o escaleno.

PROGRAMACION I – Algoritmos

36


1)

2)

PROGRAMACION I – Algoritmos

37


4.5 EJERCICIOS Construya el diagrama de flujo, el seudocódigo y realice la prueba de escritorio de los siguientes problemas 1.

Dado un número real, hallar su valor absoluto.

2.

Determinar si un alumno aprueba a reprueba un curso, sabiendo que aprobará si su promedio de tres calificaciones es mayor o igual a 70; reprueba en caso contrario.

3.

Dar la solución de una ecuación de primer grado en la forma Ax + B = 9.

4.

Dar las soluciones reales de una ecuación de segundo grado.

5.

Dados tres números, escríbalos en forma: ascendente y descendente.

6.

Leer 2 números; si son iguales que los multiplique, si el primero es mayor que el segundo que los reste y si no que los sume.

7.

En una fábrica de computadoras se planea ofrecer a los clientes un descuento que dependerá del número de computadoras que compre. Si las computadoras son menos de cinco se les dará un 10% de descuento sobre el total de la compra; si el número de computadoras es mayor o igual a cinco pero menos de diez se le otorga un 20% de descuento; y si son 10 o mas se les da un 40% de descuento. El precio de cada computadora es de $1850000. Hallar el valor total de cada venta.

8.

En una llantera se ha establecido una promoción de las llantas marca “Ponchadas”, dicha promoción consiste en lo siguiente: Si se compran menos de cinco llantas el precio es de $300 cada una, de $250 si se compran de cinco a 10 y de $200 si se compran mas de 10. Obtener la cantidad de dinero que una persona tiene que pagar por cada una de las llantas que compra y la que tiene que pagar por el total de la compra.

9.

El ISS requiere clasificar a las personas que se jubilaran en el año de 2017. Existen tres tipos de jubilaciones: por edad, por antigüedad joven y por antigüedad adulta. Las personas adscritas a la jubilación por edad deben tener 60 años o mas y una antigüedad en su empleo de menos de 25 años. Las personas adscritas a la jubilación por antigüedad joven deben tener menos de 60 años y una antigüedad en su empleo de 25 años o más. Las personas adscritas a la jubilación por antigüedad adulta deben tener 60 años o mas y una antigüedad en su empleo de 25 años o mas. Determinar en que tipo de jubilación, quedara adscrita una persona

10.

Hallar el valor de y si:

3 x + 36 y=

si 0 < x ≤

11

x 2 − 10

si 11 < x ≤ 33

x3 + x2 −1

si 33<x ≤ 64

0

Para cualquier otro valor de x

PROGRAMACION I – Algoritmos

38


GUIA 5 – ESTRUCTURA DE DECISION MULTIPLE

LOGROS: Al finalizar el estudio y práctica de esta guía estaremos en la capacidad de: 1. Representar decisiones en algoritmo cuando existen acciones con un conjunto de alternativas.

5.1 ESTRUCTURA DE DECISIÓN MÚLTIPLE

Las estructuras de decisión múltiples, son tomas de decisión especializadas que permiten comparar una variable contra distintos posibles resultados, ejecutando para cada caso una serie de instrucciones específicas. La forma común es la siguiente: Diagrama de flujo

Seudocódigo

según_sea Expresión hacer caso valor1: acción s1; caso valor 2: acción s2: caso valor3: acción s3; caso valor 4: acción s4: . . caso valor n: acción sn: sino: acción_sino; fin según

Expresión: Es la expresión a evaluarse, según la cuál se tomará una de las múltiples decisiones o alternativas. caso valor1, caso valor 2, ...caso valor n cada uno de los valores predefinidos para la variable o expresión. (Se pueden tener varias expresiones caso en una alternativa dada. Se escribe uno a continuación del otro). acción s1, acción s2, ... acción sn cada uno de los pasos que se deben ejecutar para cada alternativa. sino (opcional) si no se cumple cualquiera de los casos y se ejecutan los pasos acción_sino.

PROGRAMACION I – Algoritmos

39


Ejemplo 1: Construya un algoritmo tal, que dados como datos el sueldo y la categoría de un trabajador, calcule el aumento correspondiente teniendo en cuenta la siguiente tabla. Imprima la categoría del trabajador y su nuevo sueldo. Categoría

1

2

3

4

Aumento

15%

10%

8%

6%

Definición de variables:

suel: Variable de tipo real que expresa el sueldo del trabajador. categ: Variable de tipo entero que expresa la categoría del trabajador. nsuel: Variable de tipo real . Almacena el sueldo con el aumento incorporado. Diagrama de flujo

PROGRAMACION I – Algoritmos

40


Seudocódigo algoritmo ejemplo 1 inicio real suel, nsuel; entero categ; Lea( suel, categ); según sea categ hacer caso 1: nsuel=suel*1.15; caso 2: nsuel=suel*1.10; caso 3: nsuel=suel*1.08; caso 4: nsuel=suel*1.06; fin según Escriba( categ, nsuel); final Número de corrida 1 2 3 4 5

Prueba de escritorio Datos categ 3 4 1 2 3

suel 1425100 2560123 345000 789200 1356800

Resultado nsuel 1539108.00 2713730.38 396750.00 868120.00 1465344.00

Actividad 1 Dado el siguiente diagrama de flujo, realice el seudocódigo y la prueba de escritorio. Diagrama de flujo

PROGRAMACION I – Algoritmos

41


Seudocódigo

Prueba de escritorio Número de

Dato

Cálculo auxiliar

Resultado

corrida

x

res

resu

1

38

2

29

3

53

4

120

5

19

Actividad Construya el diagrama de flujo, el seudocódigo y realice la prueba de escritorio del siguiente problema Escriba un algoritmo que permita calcular lo que hay que pagarle a un trabajador teniendo en cuenta su sueldo y la horas extras trabajadas. Para el pago de horas extras se tiene en cuenta además la categoría del trabajador. Categoría

Precio hora extra

1

$30

2

$35

3

$40

4

$50

PROGRAMACION I – Algoritmos

42


A los trabajadores con categoría mayor a 4 no debemos pagarles horas extras.

PROGRAMACION I – Algoritmos

43


5.2 EJERCICIOS Construya el diagrama de flujo, el seudocódigo y realice la prueba de escritorio de los siguientes problemas

1. Leer por teclado un número comprendido entre 1 y 10 inclusive y determinar si el número es par o impar. 2. Leer dos números y luego un signo (puede ser suma, resta, multiplicación o división), según el signo elegido realizar el cálculo. 3. De un usuario de energía se conoce: Código, dirección, estrato y consumo de energía en un determinado mes y valor por Kwh. Calcular el valor a pagar en el mes. 4. Teniendo en cuenta una figura geométrica, calcular su área. 5. Leer por teclado un número comprendido entre 1 y 10 inclusive y hallar su factorial. ( n! = 1*2*......n. Ejemplo: 5!= 1*2*3*4*5= 120). 6. Escribir un algoritmo que calcule el número de días de un mes, dados los valores numéricos del mes y del año.(Un año es bisiesto si es múltiplo de 4, los años múltiplos de 100 sólo son bisiestos cuando a la vez son múltiplos de 400). 7. Escriba un algoritmo que permita convertir de pulgadas a milímetros, de yardas a metros y de millas a kilómetros.

PROGRAMACION I – Algoritmos

44


GUIA 6 – ESTRUCTURAS CICLICAS

LOGROS: Al finalizar el estudio y práctica de esta guía estaremos en la capacidad de: •

Interpretar el concepto de ciclo.

Elaborar algoritmos cuya ejecución se realice aplicando estructuras de control repetitivas.

Analizar los algoritmos mediante pruebas de escritorio.

6.1 INTRODUCCIÓN. Un bucle (loop, en inglés) es un trozo de algoritmo cuyas instrucciones son repetidas un cierto número de veces, mientras se cumple una cierta condición que ha de ser claramente especificada. La condición podrá ser verdadera o falsa, y se comprobará en cada paso o iteración del bucle. Básicamente, existen tres tipos de estructuras repetitivas:

Los bucles "mientras...haga" (o "while").

Los bucles "repita... mientras que" (o "do... while").

Los bucles "desde" (o "bucles for").

No es programable un ciclo que repita indefinidamente. En la mayoría de los problemas sus instrucciones se ejecutan solo la cantidad de veces necesarias en dependencia de los requisitos del problema y su solución. En la confección de un ciclo es necesario introducir una condición que termine su ejecución una vez realizadas todas las tareas pedidas, quedando libre la computadora para otras acciones.

6.2 ESTRUCTURA MIENTRAS...HAGA La estructura mientras...haga es aquella en que el cuerpo del bucle se repite mientras se cumple una determinada condición. Cuando se ejecuta la instrucción mientras, la primera cosa que sucede es que se evalúa la condición, una expresión booleana, si se evalúa falsa, ninguna acción se toma y el programa prosigue en la siguiente instrucción del bucle. Si la expresión booleana es verdadera, entonces se ejecuta el cuerpo del bucle, después de lo cuál se evalúa de nuevo la expresión booleana. Este proceso se repite una y otra vez mientras la expresión booleana o condición sea verdadera.

PROGRAMACION I – Algoritmos

45


La podemos representar:

Diagrama de flujo

Seudocódigo PI: La proposición inicial o condición, debe tener un valor verdadero inicialmente. Si el valor de PI es falso, entonces el mientras PI haga ... Instrucción(es) ... (Modificación de PI) fin mientras

ciclo no se ejecuta. Si la condición es verdadera se ejecuta

el

bloque

de

instrucciones, hasta llegar al código fin mientras para que sea evaluada nuevamente la condición. Si la condición es falsa, se termina el ciclo, transfiriendo el control a la instrucción que se encuentre

codificada

continuación

del

código

a fin

mientras Debe existir un enunciado dentro del ciclo que afecte la condición, para evitar que el ciclo se ejecute indefinidamente. Ejemplo 1. Dado un ángulo de más de una vuelta (en grados y minutos), reducir dicho ángulo a uno que sea menor de una vuelta. Definición de variables: gr: grados de tipo entero. mi: minutos de tipo entero . an: ángulo en solo grados de tipo real. re: ángulo de menos de una vuelta de tipo real.

PROGRAMACION I – Algoritmos

46


Diagrama de flujo

Seudocódigo

algoritmo ejemplo 1 inicio entero gr, mi; real an, re; Lea(gr, mi); an = gr + mi/60; re = an; mientras re >= 360 haga re = re – 360; fin mientras Escriba(re+360); final

Número de corrida 1 2 3 4 5

gr 847 1234 524 2364 5469

PRUEBA DE ESCRITORIO DATOS Proceso ciclo min an re re 35 847,58 847,58 487,58 127,58 -232,41 47 1234,78 874,78 514,78 154,78 -205,21 25 524,41 164,41 -195,58 17 2

Ejemplo 2 Dados dos números enteros positivos que corresponden a los extremos de un intervalo cerrado [A,B], hallar la suma de los números enteros comprendidos en dicho intervalo.

PROGRAMACION I – Algoritmos

47


Definición de variables: s : de tipo entero, que representa la suma de los enteros. a: entero, representa el extremo izquierdo del intervalo. b: entero, representa el extremo derecho del intervalo. Diagrama de flujo

Seudocódigo algoritmo ejemplo 2 inicio entero a,b,s; Lea(a,b); s=0; mientras a <=b haga s= s+a;

// Acumulador

a = a+1;

// Contador

fin mientras Escriba(s); Final Prueba de Escritorio a

b

s

5

11

0 5

6

11

7

18

8

26

9

35

10

45

11

56

12

PROGRAMACION I – Algoritmos

48


6.3 ESTRUCTURA REPITA...MIENTRAS QUE La estructura repita...mientras que es aquella en que el cuerpo del bucle se repite mientras se cumple una determinada condición que se comprueba al final del bucle. La podemos representar:

Diagrama de flujo

Seudocódigo El código repita indica el inicio del ciclo, luego se ejecutan las instrucciones hasta el código repita ... Instrucción(es) ... mientras (Condición);

mientras,

se

evalúa

la

condición pudiendo suceder: Si la condición es verdadera se regresa

automáticamente

código repita

al

para ejejcutar

nuevamente las instrucciones. Si la condición es falsa, se termina el ciclo, transfiriendo el control a la instrucción que se encuentre

codificada

continuación

del

a

código

mientras. Debe

existir

un

enunciado

dentro del ciclo que afecte la condición, para evitar que el ciclo

se

ejecute

indefinidamente.

Ejemplo 3 Hacer un algoritmo que muestre las potencias de 3 entre 1 y 1000 Definición de variables: poten : entero que representa la potencia.

PROGRAMACION I – Algoritmos

49


Diagrama de flujo

Seudocódigo algoritmo ejemplo 3 inicio entero poten; poten = 1; repita Escriba( poten); poten = poten * 3; mientras ( poten <= 1000); final Prueba de escritorio poten 1 3 9 27 81 243 729

Actividad: Realizar el diagrama de flujo y la prueba de escritorio para el siguiente seudocódigo que valida la entrada de los números correspondientes a los meses del año. Diagrama de flujo

Seudocódigo Algoritmo validar_entrada_meses iInicio entero mes; repita Lea(mes); si mes < 1 o mes > 12 entonces Escriba(“ Valor entre 1 y 12 “ ); fin si mientras (mes < 1 o mes > 12); final Prueba de escritorio

PROGRAMACION I – Algoritmos

50


6.4 ESTRUCTURA DESDE/PARA La estructura repetitiva desde/para es un método para ejecutar un bloque de sentencias un número fijo de veces. La operaciones de control del bucle se sitúan en un solo sitio: la cabecera de la sentencia. La podemos representar: Diagrama de flujo

Seudocódigo para(inicialización; condición; incremento) Instrucciones; fin para inicialización : Inicializa las variables de control del bucle. condición: que contiene una expresión lógica que hace que el bucle realice las iteraciones de las sentencias, mientras que la expresión sea verdadera. Incremento: que incrementa o decrementa la variable o variables de control del bucle.

Ejemplo 4 Hallar la suma de los primeros 10 números naturales. Definición de variables: n: entero que representa la variable del ciclo. sum: acumulador de suma de tipo entero. Diagrama de flujo

Seudocódigo Algoritmo ejemplo 4 inicio entero n, sum; para( n=1; n<=10; n=n+1) sum=sum+n; fin para Escriba(“La suma de los números 1 a 10 es:”,sum ); final n 1 2 3

Prueba de escritorio sum n sum n 0 4 10 8 1 5 15 9 3 6 21 10 6 7 28

PROGRAMACION I – Algoritmos

sum 36 45 55

51


Ejemplo 5 Las variables de control se pueden incrementar o decrementar en valores de tipo entero, pero también es posible en valores de tipo real y en consecuencia se incrementaría o decrementaría en una cantidad decimal. para(entero n=1; n<=10; n=n+2)

para(entero n=100; n>=1; n=n-2)

Escriba(“ n es ahora igual a “, n);

Escriba(“ n es ahora igual a “, n);

fin para

fin para

para( real n=1; n<=10; n=n+0.5)

para( n=2; n<=1000; n=n*2)

Escriba(“ n es ahora igual a “, n);

Escriba(“ n es ahora igual a “, n);

fin para

fin para

Actividad: En su cuaderno realice la prueba de escritorio para cada uno de los anteriores seudocódigos.

6.5 BUCLES ANIDADOS. Es posible anidar bucles. Los bucles anidados constan de un bucle externo con uno o más bucles internos. Cada vez que se repite el bucle externo, los bucles internos se repiten, se reevalúan los componentes de control y se ejecutan todas las iteraciones requeridas.

Ejemplo: El siguiente segmento de algoritmo, en seudocódigo entero x, y, producto; para ( x=1; x<=2; x=x+1) para( y=1; y<=5; y=y+1) producto = x * y; Escriba( x, “ * “, y, “ = “ , producto); fin para fin para

PROGRAMACION I – Algoritmos

Tiene de salida: 1*1=1 1*2=2 1*3=3 1*4=4 1*5=5 2*1=2 2*2=4 2*3=6 2*4=8 2 * 5 = 10

52


Actividad: Dar la salida al siguiente algoritmo en seudocódigo: Segmento de algoritmo

Tiene de salida

entero i, j, k; para ( i=1; i<=2; i=i+1) para ( j=1; j<= 3; j = j+1) para ( k=1; k<=2; k = k +1) Escriba( i, “ “, j, “ “, k); fin para fin para fin para

6.6 EJERCICIOS Construya el diagrama de flujo, el seudocódigo y realice la prueba de escritorio de los siguientes problemas 1. Calcular el promedio de un alumno que tiene 7 calificaciones en la materia de Diseño Estructurado de Algoritmos. 2. Leer 20 números e imprimir cuántos son positivos, cuántos negativos , cuántos neutros, el promedio de los positivos y el promedio de todos los números. 3. Suponga que se tiene un conjunto de calificaciones de un grupo de 40 alumnos. Realizar un algoritmo para calcular el promedio , la calificación más baja y la más alta de todo el grupo. 4. Calcular e imprimir la tabla de multiplicar de un número cualquiera. Imprimir el multiplicando, el multiplicador y el producto. 5. Hallar los números primos entre 2 y 1000.

PROGRAMACION I – Algoritmos

53


6. Hallar el factorial de n números. 7. Elaborar un algoritmo que escriba el número e: e= 1 +

1 1 1 1 + + + ... + 1! 2! 3! n!

8. Dado un entero positivo, encontrar los divisores propios de dicho número. 9. Hallar los primeros n términos de la serie de Fibonacci: 0 1 1 2 3 5 8 13 21….La serie se construye de la siguiente manera: los dos primeros números son 0 y 1; cada uno de los siguientes términos se obtiene sumando los dos números que le preceden inmediatamente. 10. Simular el comportamiento de un reloj digital, imprimiendo la hora, minutos y segundos de un día desde las 0:00:00 horas hasta las 23:59:59 horas. 11. Escribir un algoritmo que permita escribir

la frase “Desea continuar S/N “ hasta que la

respuesta sea ‘S’ o ‘N’. 12. Un entrenador le ha propuesto a un atleta recorrer una ruta de cinco kilómetros durante 10 días, para determinar si es apto para la prueba de 5 Kilómetros o debe buscar otra especialidad. Para considerarlo apto debe cumplir por lo menos una de las siguientes condiciones: - Que en ninguna de las pruebas haga un tiempo mayor a 16 minutos.

-

Que

al menos en una de las pruebas realice un tiempo menor a 13 minutos. - Que su promedio de tiempos sea menor o igual a 15 minutos 13. Un Zoólogo pretende determinar el porcentaje de animales que hay en las siguientes tres categorías de edades: de 0 a 1 año, de más de 1 año y menos de 3 y de 3 o más años. El zoológico todavía no está seguro del animal que va a estudiar. Si se decide por elefantes solo tomará una muestra de 20 de ellos; si se decide por las jirafas, tomará 15 muestras, y si son chimpancés tomará 40. 14. Un grupo de n estudiantes presentan un examen de Física. Diseñe un diagrama que lea por cada estudiante la calificación obtenida y calcule e imprima: A.- La cantidad de estudiantes que obtuvieron una calificación menor a 50. B.- La cantidad de estudiantes que obtuvieron una calificación de 50 o más pero menor que 70. C.- La cantidad de estudiantes que obtuvieron una calificación de 70 o más pero menor que 80. D. La cantidad de estudiantes que obtuvieron una calificación de 80 o más 15. En una tienda de descuento las personas que van a pagar el importe de su compra llegan a la caja y sacan una bolita de color, que les dirá el descuento que tendrán sobre el total de su compra. Determinar la cantidad que pagará cada cliente desde que la tienda abre hasta que cierra. Se sabe que si el color de la bolita es roja el cliente obtendrá un 40% de descuento; si es amarilla un 25% y si es blanca no obtendrá descuento

PROGRAMACION I – Algoritmos

54


GUIA 7 - PROCEDIMIENTOS LOGROS: Al finalizar el estudio y práctica de esta guía estaremos en la capacidad de: •

Emplear las técnicas de programación modular.

Usar adecuadamente variables locales y variables globales

Interpretar y verificar algoritmos que invoquen o llamen sub-algoritmos.

7.1 INTRODUCCIÓN Teniendo en cuenta que nuestros algoritmos se pueden volver muy complejos o demasiado extensos; podemos aplicar adecuadamente las técnicas de programación modular, vistas en la guía 3, es decir, podemos particionar dichos algoritmos en otros algoritmos más pequeños de tal manera que sea más fácil su interpretación y su verificación. A los nuevos algoritmos se le dará el nombre de subalgoritmos. Los sub-algoritmos se clasifican en procedimientos y funciones. En esta guía la dedicaremos a los procedimientos y la siguiente a las funciones.

7.2 PROCEDIMIENTOS Un procedimiento es un sub-algoritmo formado por un conjunto de instrucciones que realizan una tarea específica. La tarea asignada al procedimiento se ejecuta siempre que se encuentre el nombre del procedimiento. La forma común es la siguiente: Diagrama de flujo

Seudocódigo algoritmo ejemplo-1 //Declaración de variables globales y constantes procedimiento Nombre-1 //Declaración de variables locales Pasos -1; fin proc procedimiento Nombre-2 //Declaración de variables locales Pasos -2; fin proc procedimiento Nombre-3 //Declaración de variables locales Pasos -3; fin proc inicio //Declaración de variables locales Nombre-1; Nombre-2; Nombre-3; final

PROGRAMACION I – Algoritmos

55


Características: o

Un procedimiento puede llamar a otro procedimiento que ya esté codificado.

o

Un procedimiento puede llamarse desde el algoritmo principal o desde otro procedimiento las veces que sea necesario.

o

El orden de codificación de los procedimientos no es tan importante. La lógica de los procedimientos la suministra el algoritmo principal.

o

Después de llamado un procedimiento, el control de la lógica continúa en la instrucción que se encuentre a continuación de donde se efectuó dicho llamado.

Ejemplo 1 Dada una ecuación de segundo grado, encontrar sus soluciones reales. ( ax 2 + bx + c = 0 ) Diagrama de flujo

Seudocódigo Algoritmo Ejemplo 1 real a,b,c,de,x1,x2; //var. globales procedimiento Entrada Lea( a,b,c); fin proc procedimiento fórmulas x1 = (-b+(de)**(1/2))/(2*a); x2 = (-b-(de)**(1/2))/(2*a); Escriba(“Soluciones reales:”, x1,x2); fin proc procedimiento Cálculo si a=0 entonces Escriba(“No es ecuación de segundo grado”); sino de = b**2 – 4*a*c; si de >= 0 entonces fórmulas; sino Escriba(“Solución imaginaria”); fin si fin si fin proc inicio Entrada Cálculo; final

PROGRAMACION I – Algoritmos

56


Número de corrida 1 2 3 4 5

a 1 2 1 3 0

b 5 4 8 -15 6

PRUEBA DE ESCRITORIO DATOS c de x1 6 1 -2 3 -8 -20 144 2 18 9 3 7 36

x2 -3 -10 2

Salida Soluciones reales: -2 -3 Solución imaginaria Soluciones reales: 2 -10 Soluciones reales: 3 2 No es ecuación de segundo grado

Ambito: Variables locales y globales. Una variable local es aquella que está declarada y definida dentro de un sub-algoritmo. El significado de una variable se confina al procedimiento en el que está declarada. Cuando otro sub-algoritmo utiliza el mismo nombre se refiere a una posición diferente en memoria. Una variable global es aquella que está declarada para el programa o algoritmo completo. La parte del algoritmo en que una variable se define se conoce como ámbito. 7.3 PROCEDIMIENTOS CON PARÁMETROS. Son procedimientos en los cuales existe comunicación entre el programa principal y los procedimientos o entre dos procedimientos. Los parámetros son la información proporcionada al procedimiento para que ejecute su tarea. La declaración del procedimiento se hace con: procedimiento nombre(tipo1 F1, tipo2 F2,…..,tipon Fn) .sentencias; . fin proc y la llamada al procedimiento: nombre(A1, A2,…An) Donde F1, F2,…Fn son los parámetros formales y A1, A2,…An son los parámetros actuales o reales Paso de parámetros: Existen dos métodos para la el paso de los parámetros a un procedimiento: Por valor y por referencia. Paso por valor: Los parámetros se tratan como variables locales y los valores iniciales se proporcionan copiando los valores de los correspondientes argumentos. Son parámetros unidireccionales y se envían en la lista de parámetros por sus identificadores. Paso por referencia: En numerosas ocasiones se requiere que ciertos parámetros sirvan como parámetros de salida, es decir, se devuelvan los resultados a la unidad o programa que llama. La unidad que llama pasa a la unidad llamada la dirección del parámetro actual. Una referencia al

PROGRAMACION I – Algoritmos

57


correspondiente parámetro formal se trata como una referencia a la posición de memoria, cuya dirección se ha pasado. Entonces una variable pasada como parámetro real es compartida, es decir, se puede modificar directamente por el procedimiento. Los parámetros que pasan como referencia se listan precedidos por el signo &. procedimiento ejemplo(entero a, real b, entero &c, real &d) // a y b por valor, c y d por referencia. Ejemplo: Diferencia entre los parámetros por valor y referencia Algoritmo valor_referencia procedimiento intercam_valor(entero a, entero b)

Los parámetros valor reciben copias de los valores de los argumentos que se les pasan.

entero aux; // Variable local

La asignación a parámetros valor nunca

aux = a;

cambian el valor del argumento original pasado

a = b;

a los parámetros.

b = aux; fin proc procedimiento intercam_refer(entero &a, entero &b) entero aux; Variable local

Los parámetros referencia (declarados con &) reciben

la

dirección

de

los

argumentos

pasados.

aux = a; a = b;

Las asignaciones a parámetros referencia

b = aux;

cambian

fin proc

los

valores

de

los

argumentos

originales. inicio entero x, y; x= 15; y= 34; intercam_valor( x. y); Escriba(x, “ “,y); intercam_refer( x. y); Escriba(x, “ “,y); Final La salida del programa producirá: 15

34

34 15

PROGRAMACION I – Algoritmos

58


Actividad 1: ¿Qué salida producen los siguientes algoritmos? Algoritmo primero

Algoritmo segundo

Algoritmo primero

Algoritmo segundo

entero a, b; // Variables globales

entero a, b;

procedimiento uno

procedimiento uno(entero x, entero &y)

entero a; // Variable local

y = 3*x;

a = 6;

x = 15;

b = a*3;

Escriba( x, “ “, y);

Escriba(a, “ “, b);

fin proc

fin proc

inicio

inicio

a = 8;

a = 8;

b = 12;

b = 12;

uno(a, b);

uno;

Escriba(a.” “, b);

Escriba(a.” “, b);

final

final

La salida del programa producirá:

La salida del programa producirá: __

__

__

__

__

__

__

__

Algoritmo tercero

Algoritmo cuarto

Algoritmo tercero

Algoritmo cuarto

entero a, b;

entero a, b;

procedimiento uno(entero x, entero y)

procedimiento uno(entero &x, entero &y)

entero a;

y = 3*x;

a = x*y;

x = 15;

b = x-y;

Escriba( x, “ “, y);

Escriba(a, “ “, b); fin proc inicio

fin proc inicio a = 8;

a = 8;

b = 12;

b = 12;

uno(a, b);

uno(a,b);

Escriba(a.” “, b);

Escriba(a.” “, b);

final

final

PROGRAMACION I – Algoritmos

59


La salida del programa producirá:

La salida del programa producirá:

__

__

__

__

__

__

__

__

Algoritmo quinto

Algoritmo sexto

Algoritmo quinto

Algoritmo sexto

constante d=3;

constante d=3;

entero a, b, c;

entero a, b, c;

procedimiento uno(entero &x,entero &y,entero z)

procedimiento uno(entero x,entero &y,entero &z)

entero a;

entero a;

a = 6;

a = 6;

b = a*d;

b = a*d;

x=x+1;

x=x+1;

y=y+2;

y=y+2;

z=z+3;

z=z+3;

Escriba(a, “ “, b, ” “, x, ” “, y, ” “, z);

Escriba(a, “ “, b, ” “, x, ” “, y, ” “, z);

fin proc

fin proc

inicio

inicio

a = 8;

a = 8;

b = 12;

b = 12;

c = 3;

c = 3;

uno(a, b, c);

uno(a, b, c);

Escriba(a.” “, b, “ “, c);

Escriba(a.” “, b, “ “, c);

uno(c, a, c);

uno(c, a, c);

Escriba(a.” “, b, “ “, c);

Escriba(a.” “, b, “ “, c);

final

final

La salida del programa producirá:

La salida del programa producirá:

__

__

__ __ __

__

__

__ __

__ __

__ __

__

__ __

__

__

__ __ __

__

__

__ __

__ __

PROGRAMACION I – Algoritmos

__ __

__

__ __

60


Actividad 2: Escriba un procedimiento CambiarBase con dos parámetros enteros positivos n y b para calcular y visualizar la representación del número n en la base b. Diagrama de flujo

Seudocódigo

7.4 EJERCICIOS Construya el diagrama de flujo, el seudocódigo y realice la prueba de escritorio de los siguientes problemas utilizando procedimientos: 1.) Dados los puntos en el plano cartesiano P(x1, y1) y Q(x2, y2) calcular: a) Distancia entre P y Q ( d = b) Pendiente de P a Q ( m =

( x 2 − x1) 2 + ( y 2 − y1) 2 ) y 2 − y1 , x 2 ≠ x1 ) x 2 − x1

c) Coordenadas del punto medio (

x 2 − x1 y 2 − y1 , ) 2 2

2.) Para cada trabajador, de un grupo de n trabajadores, se conoce: cédula, nombre, horas semanales trabajadas, valor de la hora. Las horas que superen las 40 horas se pagarán como extras con un salario hora 1.5 veces el salario ordinario. Encontrar el pago semanal.

PROGRAMACION I – Algoritmos

61


3.) Escribir un algoritmo que permita al usuario elegir el cálculo del área de cualquiera de las figuras geométricas: círculo, cuadrado, rectángulo, trapecio, paralelogramo, y triángulo. 4.) Dados tres números reales positivos que representan las longitudes de los lados de un triángulo, elaborar un algoritmo que utilice un procedimiento para validar la entrada de los tres valores, otro para determinar la naturaleza del triángulo (equilátero, isósceles o escaleno) y por último un procedimiento para calcular el área del triángulo ( area =

s ( s − a )( s − b)( s − c)

en donde s es el semiperímetro). 5.) Dado que

x 2 x3 xn + + ... + e =1+ x + 2! 3! n! x

Elabore un algoritmo que pida un número entero x y calcule el valor de ex 6.) Realizar un algoritmo que permita ordenar tres números enteros mediante un procedimiento de intercambio de dos variables. 7.) Escribir un programa que lea un entero positivo y a continuación llame a un procedimiento que visualice sus factores primos.

PROGRAMACION I – Algoritmos

62


GUIA 8 - FUNCIONES

LOGROS: Al finalizar el estudio y práctica de esta guía estaremos en la capacidad de: o

Diferenciar un procedimiento de una función.

o

Crear funciones de utilidad o funciones externas.

o Usar adecuadamente las funciones internas o estándar.

8.1 DEFINICIÓN Una función es lo mismo que un procedimiento con la salvedad que este devuelve un valor a la unidad del programa que la ha llamado o invocado. La declaración de una función requiere una serie de pasos que la definen. Una función como tal subalgoritmo tiene una constitución similar a los algoritmos; por consiguiente, constará de una cabecera con la definición de la función y seguido del cuerpo de la función, que serán una serie de acciones o instrucciones, cuya ejecución hará que se asigne un valor a la función que retornará este valor con la instrucción Retorna. La declaración de la función será: Tipo_de_dato_de_retorno Función Nombre _ función (tipo1 F1, tipo2 F2,…..,tipon Fn) //Declaración de variables locales y constantes Pasos; Retorna expresión fin func En donde: Tipo_de_dato_de retorno

tipo de valor devuelto por la función.

Nombre _ función

identificador o nombre de la función

tipo1 F1, tipo2 F2,….., tipon Fn

lista de declaraciones de los parámetros separados por comas.

expresión

valor que devuelve la función.

Las funciones para poder ser ejecutadas, han de ser llamadas o invocadas: Nombre _ función (A1, A2,…An) // A1, A2,…An son los parámetros actuales o reales.

PROGRAMACION I – Algoritmos

63


Cualquier expresión puede contener una llamada a una función que redirigirá el control del programa a la función nombrada. La función llamada se ejecuta desde el principio y termina cuando se alcanza la sentencia Retorna . El control del programa vuelve a la unidad del programa que la ha llamado o invocado. Ejemplo 1: Hallar el número menor de dos enteros. Diagrama de flujo

Seudocódigo Algoritmo Ejemplo 1 entero Función min(entero x, entero y) si x < y entonces Retorna x; sino Retorna y; fin func inicio entero m, n, menor; Lea(m, n); menor = min(m, n); Escriba( “Número menor: “, menor); final

PRUEBA DE ESCRITORIO Número de

DATOS

min Salida

corrida

m

n

menor

x

y

retorna

1

7

5

5

7

5

5

Número menor 5

2

2

4

2

2

4

2

Número menor 2

8.2 ACTIVIDADES 1.) Escribir un programa que permita deducir si un número n es primo, apoyándose en una función Primo. Realice el diagrama de flujo y la prueba de escritorio.

PROGRAMACION I – Algoritmos

64


Diagrama de flujo

Seudocódigo Algoritmo NúmPrimos entero n; boolean Función Primo(entero q) entero d; boolean p; si q < 4 y q>1 entonces Retorna V; sino p=V; d=2; mientras p y (d<= q div 2) haga p= q mod d != 0; d=d-1; fin mientras Retorna p; fin si fin func inicio Escriba(“Introduzca un entero positivo”) Escriba(“ y cero para terminar”); Lea(n); mientras n>0 haga si Primo(n) entonces Escriba( n, “ es primo”); sino Escriba(n, “ no es primo”); fin si Escriba(“Introduzca otro entero”); Lea(n); fin mientras final

Prueba de escritorio

PROGRAMACION I – Algoritmos

65


2.) Diseñar una función que calcule potencias de la forma x n y un programa que haga uso de la misma, para distintos valores de x y n. Construya el diagrama de flujo, el seudocódigo y realice la prueba de escritorio. Diagrama de flujo

Seudocódigo

Prueba de escritorio

PROGRAMACION I – Algoritmos

66


8.3 FUNCIONES INTERNAS O ESTÁNDAR 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 y realizar con ellos procesos complejos. Los diferentes lenguajes de programación tienen incorporadas numerosas funciones que se denominan funciones internas o estándar. En esta sección, por medio de tablas, vamos a recoger las funciones internas más usuales. Funciones Matemáticas Función

Descripción

abs(x)

Valor absoluto de x

arctan(x) cos(x) exp(x) ln(x) redondeo(x) seno(x) cuadrado(x) raizcua(x)

arco tangente de x coseno de x exponencial de x logaritmo natural de x redondeo de x seno de x cuadrado de x raíz cuadrada de x

Función longitud(cadena) compara(cadena1,cadena2)

concatena(cad1,cad2) subcadena(cad,inicio,long) insertar(cad1,p,cad2) borrar(cad1,p,l) buscar(cad1,cad2) valor(cadena) cadena(valor)

Tipo de argume nto entero o real real real real real real real real real

Tipo de Resultado entero o real real real real real real real real real

Ejemplo

Resultado

abs(-15)

15

arctan(0.123) cos(0.45) exp(4.5) ln(5.6) redondeo(5.34) seno(1.2) cuadrado(5) raizcua(36)

7,0121601028 0,900447102 e4.5 1,72276659 5 0,93203908 25 6

Funciones para cadenas Descripción Ejemplo Halla el número de logitud(“hoy es lunes”) caracteres de la cadena Compara la cadena1 con la compara(“hoy”,”no”) cadena2 y devuelve: 0 si cadena1=cadena2 <0 si cadena1<cadena2 >0 si cadena1>cadena2 Añade la cad2 al final de cad1 Extrae long caracteres de la cadena cad desde la posición inicio. Inserta la cad2 en la cad1 en la posición p. Elimina la subcadena que comienza en la posición p y tiene una longitud l. Busca la cad2 en la cad1 y devuelve la posición en que aparece. Convierte la cadena en un número. Convierte un valor numérico en una cadena.

Resultado 12 -1

concatena(“hoy es “ ,”Lunes”) subcadena(“Instituto Técnico Central”,10,7)

“hoy es Lunes”

insertar(“María Mora”, 6, “de “) borrar(“María Mora”,6,5)

“María de Mora”

buscar(“La capital es Bogotá”, “cap”)

4

“Técnico”

“María”

valor(“23456”)

23456

cadena(23456)

“23456”

PROGRAMACION I – Algoritmos

67


La comparación de datos de tipo carácter se realiza mediante los códigos numéricos ASCII, de modo que una letra estará situada antes o después de ésta si su código ASCII es menor o mayor.

8.4 EJERCICIOS Construya el diagrama de flujo, el seudocódigo y realice la prueba de escritorio de los siguientes problemas: 1.)

Escribir una función que tenga un argumento de tipo entero y que devuelva 1 si el número es positivo, 0 si es 0 o negativo y un programa que haga uso de la misma.

2.)

Escribir una función de dos argumentos enteros, que devuelva 1 si uno divide al otro y 0 en caso contrario y un programa que haga uso de la misma.

3.)

Escribir una función que convierta una temperatura dada en grados Celsius a grados Fahrenheit. La fórmula de conversión es: F =

4.)

9 C + 32 5

Escribir un programa que permita al usuario elegir el cálculo del área de las siguientes figuras geométricas: triángulo, cuadrado, rectángulo, trapecio o círculo, mediante funciones.

5.)

Escribir un programa que lea dos números x y n y calcule la suma de la progresión geométrica: 1 + x + x 2 + x 3 + ... + x n apoyándose en una función Potencia.

6.)

Escribir una función que tome como parámetros las longitudes de los lados de un triángulo (a, b, c) y devuelva el área del triángulo.

p= 7.)

Area =

p ( p − a )( p − b)( p − c) donde

a+b+c . 2

El número combinatorio N sobre R se representa y se define de la siguiente forma:

( ) = N * ( N − 1)( N − 2R)!* ... * ( N − R + 1) . Construir un programa que calcule el valor del N R

número combinatorio utilizando funciones. 8.)

Escribir un algoritmo para determinar si una cadena especificada ocurre en una cadena dada.

9.)

Escribir un algoritmo que permita la entrada de un nombre consistente en un nombre, un primer apellido y un segundo apellido, en ese orden y que imprima a continuación el último apellido, seguido del primer apellido y el nombre.

10.)

Escribir un algoritmo que convierta los números arábigos en romanos y viceversa.

11.)

Escribir un algoritmo que calcule la frecuencia de aparición de las vocales de un texto proporcionado por el usuario.

PROGRAMACION I – Algoritmos

68


12.)

Escribir un algoritmo que permita deducir las funciones trigonométricas tangente, cotangente, secante y cosecante de un ángulo en radianes.

13.)

Elabore un algoritmo que dé como salida la tabla de valores de las funciones trigonométricas, trabajando en grados sexagesimales en [0, 180] a intervalos de 10 grados.

14.)

Elaborar un programa que utilice una función para convertir coordenadas polares a rectangulares. ( x= r*coseno θ, y=r*seno θ.

PROGRAMACION I – Algoritmos

69


GUIA 9 - ARREGLOS LOGROS: Al finalizar el estudio y práctica de esta guía estaremos en la capacidad de: o

Utilizar arreglos para almacenar datos relacionados entre sí.

o

Diferenciar arreglos unidimensionales y bidimensionales.

o

Usar adecuadamente arreglos como parámetros.

9.1 INTRODUCCIÓN Las guías anteriores se han encargado de las estructuras para el manejo de los pasos que le dan solución a un problema. En esta guía analizaremos una de las estructuras encargadas del manejo de los datos. Con respecto a los datos se han usado variables sencillas o escalares para representar cantidades numéricas o alfanuméricas, las cuales en un instante de tiempo solamente almacenan un dato. A menudo tenemos que tratar con listas o conjuntos de valores y deseamos tener un solo nombre para dicho conjunto de datos. Introduciremos en esta guía el concepto de variable suscrita o variable con índice/s la cual puede almacenar todos los datos que le suministremos en forma simultánea y los podamos llamar o pedir cuantas veces sea necesario.

9.2 CONCEPTO DE ARREGLO O ARRAY Un arreglo o array es una lista de un número finito de elementos del mismo tipo que se caracteriza por:

Almacenar los elementos del arreglo en posiciones de memoria continua.

Tener un único nombre de variable que representa a todos los elementos, y éstos a su vez se diferencian por un índice o subíndice.

Acceso directo o aleatorio a los elementos individuales del arreglo.

Los arreglos se clasifican en:

Unidimensionales (vectores o listas).

Bidimensionales (tablas o matrices).

Multidimensionales.

9.3 ARREGLOS UNIDIMENSIONALES O VECTORES Un arreglo unidimensional o vector es un tipo de datos estructurado compuesto de un número de elementos finitos, tamaño fijo y elementos homogéneos. Finitos indica que hay un último elemento,

PROGRAMACION I – Algoritmos

70


tamaño fijo significa que el tamaño del arreglo debe ser conocido y homogéneo significa que todos los elementos son del mismo tipo. Lo podemos visualizar así: Nombre_arreglo 0

1

2

3

4

5 ……………………………………………………… n

Para referirnos a un elemento del arreglo utilizamos un índice o subíndice: Nombre_arreglo[2]. Ejemplo: 7 0

6 1

2 2

9 3

Números 5 4 4 5

1 6

6 7

8 8

13 9

En el elemento número 0 existe el número 7 y lo referenciamos Números[0]. En Números[0] está almacenado el número 7. Es un vector entero de 10 elementos. En Números[6] está almacenado el número 1. No se debe confundir la posición del elemento dentro del arreglo con el contenido del mismo. Al igual que con cualquier tipo de variable, se debe declarar un arreglo antes de utilizarlo. Un arreglo se declara de un modo similar a otros tipos de datos, excepto que se debe indicar el tamaño o longitud del vector. Podemos declarar un arreglo así: tipo_de_dato nombre_arreglo[NúmeroDeElementos] Ejemplos entero Números[10] ; // Arreglo Números contiene 10 elementos, primero Números[0] y el último // Números[9]. entero pesos[8], áreas[6]; // Declara 2 arreglos de enteros. real base[9], altura[9]; // Declara 2 arreglos de reales. real temperatura[18]; // Declara 1 arreglo real de 18 elementos. cadena nombre[35]; // Declara un arreglo de cadenas de 35 elementos. En los programas se pueden referenciar elementos utilizando fórmulas para los subíndices. Mientras que el subíndice puede evaluar un entero, se puede utilizar una constante, una variable o una expresión para el subíndice: ventas[total + 4], salario[i], nombre[total-1].

PROGRAMACION I – Algoritmos

71


Las operaciones que se pueden realizar con vectores durante el proceso de resolución de un problema son:

Asignación.

Lectura o escritura.

Recorrido.

Actualizar (Añadir, borrar, insertar).

Ordenación.

Búsqueda.

9.3.1 ASIGNACIÓN La asignación de valores a un elemento se realiza con la instrucción de asignación =. A[4]= -5; // Asigna el valor -5 al elemento 4 del vector A. entero A[5] = {3,8,4,9,2}; // Declara un vector de 5 elementos y asigna 3 al elemento A[0], // 8 al elemento A[1], 4 al elemento A[2], 9 al elemento A[3], 2 al elemento A[4]. 9.3.2 LECTURA O ESCRITURA La lectura de un elemento de un vector se representa así: Lea( A[4] ); // El valor leído queda asignado al elemento 4 del vector A. La escritura de un elemento de un vector se representa así: Escriba( A[4] ); // Escritura del elemento A[4]. 9.3.3 RECORRIDO A la operación de efectuar una acción sobre todos los elementos de un vector se le denomina recorrido del vector. Estas operaciones se realizan utilizando estructuras repetitivas, cuyas variables del ciclo se utilizan como subíndices del vector. El incremento del contador del bucle producirá el tratamiento sucesivo de los elementos del vector o arreglo unidimensional.

Ejemplos:

Lectura de 35 valores reales de un arreglo unidimensional llamado notas: para( i = 0; i < 35; i = i+1) Lea( notas[ i ] ); fin para

Escritura de 20 elementos de un vector llamado base:

PROGRAMACION I – Algoritmos

72


j = 0; mientras j < 20 haga Escriba( base[ j ] ); j = j + 1; fin mientras

9.3.4 ACTUALIZAR La operación de actualizar un vector puede constar de tres operaciones: añadir, insertar y borrar. Se denomina añadir datos la operación de agregar un nuevo elemento al final del vector. La condición necesaria para esta operación consistirá en la comprobación de espacio suficiente para el nuevo elemento del vector, es decir, que el vector no contenga todos los elementos con que fue definido. Ejemplo: Un vector se ha dimensionado con 7 elementos, pero sólo se le han asignado 5. Se podrán añadir 2 elementos más con una simple acción de asignación: A[ 5 ] = 9; A[ 6 ] = 3; La operación de insertar un elemento consiste en introducir dicho elemento en el interior del vector. En este caso se necesita un desplazamiento previo hacia abajo para colocar el elemento nuevo en su posición relativa. Lógicamente el vector no puede estar lleno. Ejemplo: Insertar un número p en un vector ordenado A que contiene n elementos. // Calcular la posición ocupada por el elemento a insertar para(i=0; i < n; n= n+1) si p < a[ i ] entonces m = i; fin si fin para i = n-2; mientras i > = m haga // Transferir el elemento actual i-ésimo, a la posición i + 1 A[ i +1 ] = A[ i ]; i = i – 1; fin mientras // Insertamos el elemento en la posición m A[ m ] = p;

PROGRAMACION I – Algoritmos

73


La operación de borrar un elemento del interior del vector provoca un movimiento hacia arriba de los elementos inferiores a él para reorganizar el vector. Ejemplo: Borrar el elemento A[ m ] de un vector A de n elementos. para( i = m; i < n -1 ; i = i +1) A[ i ] = A[ i+1 ]; fin para

9.3.4 ORDENACIÓN La ordenación es el proceso de organizar datos en alguna secuencia específica. Ordinariamente creciente o decreciente para datos numéricos y alfabéticamente para cadenas de caracteres. Existen diferentes métodos de ordenación. Uno de ellos, ordenación por inserción, lo estudiamos en el numeral anterior, inserción de un elemento en un vector, basta completar el algoritmo. Otro método es ordenación por burbuja, que lo revisaremos ahora. Ordenación por burbuja: El algoritmo consiste en componer los elementos adyacentes de una lista o vector. Si el valor del primero de estos elementos es mayor que el segundo, se intercambian estos valores y se compara el siguiente par de elementos adyacentes. Este proceso comienza con el par de elementos con sub-índices 0 y 1 y continúa hasta el par de elementos n-2 y n-1 en un arreglo que contiene n datos. Después se repite esta misma secuencia de comparaciones, denominada paso, comenzando de nuevo con el primer par de elementos. En total se hacen n – 1 pasos Veamos un ejemplo: Ordenar un vector A entero con 5 elementos Diagrama de flujo

Seudocódigo Algoritmo OrdenaciónBurbuja entero A[5] = {14,11,38,27,4} ; entero i, j, aux, n=5; inicio para(i=0; i < n -2 ; i = i+1) para(j=0; j < n-2; j = j+1) si A[ j ] > A[ j+1 ] entonces aux = A[ j ]; A[ j ] = A[ j + 1 ]; A[ j + 1 ] = A[ j ]; fin si fin para fin para final

PROGRAMACION I – Algoritmos

74


Pasos

i

j

1

0

0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3

2

1

3

2

4

3

Prueba de escritorio A[0] A[1] A[2] 14 11 38 11 14 38 11 14 38 11 14 27 11 14 27 11 14 27 11 14 27 11 14 4 11 14 4 11 14 4 11 4 14 11 4 14 11 4 14 4 11 14 4 11 14 4 11 14 4 11 14

A[3] 27 27 27 38 4 4 4 27 27 27 27 27 27 27 27 27 27

A[4] 4 4 4 4 38 38 38 38 38 38 38 38 38 38 38 38 38

aux 14 38 38 27 14 11

Actividad 1: Si en el algoritmo se define entero A[4] = {34,17,19,5} realice la prueba de escritorio.

Pasos

i

Prueba de escritorio A[0] A[1] 34 17

j

A[2] 19

A[3] 5

aux

9.3.5 BUSQUEDA La búsqueda se refiere a la operación de encontrar la posición de un elemento entre un conjunto de elementos dados, una lista o vector. Los métodos más usados de búsqueda en vectores son:

Búsqueda lineal o secuencial.

Búsqueda binaria.

PROGRAMACION I – Algoritmos

75


9.3.5.1 BÚSQUEDA LINEAL O SECUENCIAL. Consiste en comparar cada elemento del vector con el valor deseado, hasta que se encuentre o se termine de leer el vector completo. En la búsqueda lineal el vector no necesita estar ordenado. El recorrido del vector se realiza con estructuras repetitivas. Ejemplo: Diseñar un algoritmo que lea un vector de 8 elementos, y que cuente el número de ocurrencias de un número o clave en el arreglo. A[8] arreglo entero de 8 elementos n entero número de elementos clave entero número a buscar contador entero número de ocurrencias del número. cuenta entero número de ocurrencias del número. Diagrama de flujo

Seudocódigo Algoritmo BúsquedaLineal entero Función Búsqueda( entero Vector[ ], entero n, entero clave) entero i, contador = 0; para(i=0; i < n; i = i+1) si Vector[ i ] == clave entonces contador = contador +1; fin si fin para Retorna contador; fin func inicio entero A[ 8 ]; entero clave, cuenta; Escriba(“Introduzca 8 números enteros”) para(i=0; i < 8; i = i+1) Lea(A[ i ]); fin para Escriba(“Introduzca el número a buscar”); Lea(clave); cuenta = Búsqueda(A, 8, clave); Escriba(clave,“ se repite “,cuenta,“ veces”); final /* Nota: todos los arreglos se pasan por referencia a una función o procedimiento, se dejan los corchetes en blanco y se añade un parámetro que indique el tamaño del arreglo.*/

Actividad 2: Realice el diagrama de flujo.

PROGRAMACION I – Algoritmos

76


9.3.5.2 BÚSQUEDA BINARIA Si el vector está ordenado la búsqueda binaria proporciona una técnica de búsqueda mejorada. La técnica se basa en la división sucesiva del espacio ocupado por el vector en mitades hasta encontrar el elemento buscado. Se examina primero el elemento central de la lista; si este es el elemento buscado, entonces la búsqueda ha terminado. En caso contrario se determina si el elemento buscado es mayor o menor para saber si está en la primera mitad o en la segunda mitad de la lista y a continuación se repite este proceso, utilizando el elemento central de esta sub-lista. Supongamos que los índices del vector son bajo = 0 y alto = n-1, donde n es el número de elementos de vector.

Calcular el índice del punto central del arreglo central = ( bajo + alto) div 2; // div división entera

Comparar el valor de este elemento con la clave

Si A[ central ] < clave, la nueva sub-lista tiene por valores extremos de su rango bajo = central + 1 .. alto

Si clave < A[ central ], la nueva sub-lista tiene por valores extremos de su rango bajo .. alto = central – 1

El algoritmo se termina, bien porque se ha encontrado la clave o porque el valor de bajo excede a alto y el algoritmo devuelve el indicador de fallo -1 ( búsqueda no encontrada).

Ejemplo: Sea el vector entero A[ 9 ] = {− 12,−4,5,17,32,43,52,60,75} buscar el número 60 clave = 60. A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] -12 -4 5 17 32 43 52 60 75 bajo = 0 alto = 8 central = (bajo + alto) div 2 = (0+8) div 2 = 4 clave > A[ 4 ] 60 > 32

PROGRAMACION I – Algoritmos

77


Buscar en la sub-lista derecha A[5] A[6] A[7] A[8] 43 52 60 75 bajo = 5 alto = 8 central = (bajo + alto) div 2 = (5+8) div 2 = 6 clave > A[ 6 ] 60 > 52

Buscar en la sub-lista derecha A[7] A[8] 60 75 bajo = 7 alto = 8 central = (bajo + alto) div 2 = (7+8) div 2 = 7 clave = A[ 7 ] 60 = 60 búsqueda con éxito

Escribimos ahora el algoritmo de la función de búsqueda binaria. entero Función BúsquedaBinaria( tipodato vector[ ], entero bajo, entero alto, tipodato clave) entero central; tipodato valorcentral; mientras bajo <= alto haga central = ( bajo + alto ) div 2 ; valorcentral = vector[ central ]; si clave == valorcentral entonces Retorna central; // Encontrado valor; devuelve posición sino si clave < valorcentral entonces alto = central – 1; // Ir a sub-lista inferior sino bajo = central + 1; // Ir a sub-lista superior fin si fin si fin mientras Retorna -1; fin func

PROGRAMACION I – Algoritmos

78


Actividad 3: Diseñe el diagrama de flujo y el seudocódigo para un programa de búsqueda binaria para un vector ordenado de números enteros. Diagrama de flujo

Seudocódigo

Actividad 4: Damos un algoritmo en seudocódigo. Efectuar el diagrama de flujo y la prueba de escritorio correspondiente y luego describir lo que realiza. Diagrama de flujo

Seudocódigo Algoritmo Incógnita procedimiento enigma( entero a[ ], entero m, entero B[ ], entero n, entero C[ ], entero p ) entero r, i, j, k; i=0; j=0; k=0; mientras (i<m) y (j<n) haga si A[i] <= B[j] entonces C[k] = A[i]; i=i+1; sino C[k] = B[j]; j=j+1; fin si k=k+1; fin para si i<m entonces para(r=i; r<m; r=r+1) C[k] = A[r]; k=k+1;

PROGRAMACION I – Algoritmos

79


fin para sino para(r=j; r<n; r=r+1) C[k] = B[r]; k=k+1; fin para fin proc inicio entero A[4]= {3,5,8,12} ;

entero B[3]= {4,7,14} ; entero C[7]; entero i; enigma(A,4,B,3,C,7); para(i=0; i<7; i=i+1) Escrba(C[i], “ “); fin para final /* Nota: todos los arreglos se pasan por referencia a una función o procedimiento.*/

9.3.6 EJERCICIOS Construya el diagrama de flujo, el seudocódigo y realice la prueba de escritorio de los siguientes problemas: 1. Elaborar un algoritmo que lea un vector de 10 elementos reales y luego halle la suma de sus elementos, el elemento menor, el elemento mayor y el promedio. 2. Elaborar un algoritmo que lea una lista de n nombres de alumnos y que luego solicite el nombre de un alumno, busque en la lista y diga si el nombre está en la lista. 3. Escribir una función que invierta el contenido de n números enteros. El primero se vuelve último, el segundo penúltimo, etc. Aplíquela en un programa. 4. Escribir una función que acepte como parámetro un vector que puede contener elementos duplicados. La función debe sustituir cada valor repetido por -1 y devolver al punto donde fue llamado el vector modificado y el número de entradas modificadas. 5. Escribir un programa que rellene un vector con los 12 primeros números primos.

PROGRAMACION I – Algoritmos

80


6. Escribir un programa que lea una serie de números enteros, los ordene en forma creciente por los métodos de burbuja e inserción. El dato sobre el número de elementos se da desde el teclado. 7. Del curso 8 A quedan 25 alumnos, del 8 B quedan 18 alumnos al finalizar el año escolar. Estos dos cursos se unen para formar el curso 9 A del siguiente año escolar. Escribir un programa que permita visualizar la lista ordenada del curso 9 A. 8. Se dispone de un vector de números enteros ordenados en forma creciente. Se desea conocer si un número introducido desde el teclado se encuentra en el vector. En caso afirmativo averiguar su posición y en caso negativo insertarlo en el vector. 9. Dadas las notas de los alumnos de un curso en las diferentes asignaturas ( 5, por comodidad), se trata de calcular el promedio de cada alumno, el promedio de cada asignatura, el promedio total del curso y ordenar los alumnos por orden decreciente de notas promedio individuales. 10. Diseñe un algoritmo que almacene en un vector llamado FIB[100] los 100 primeros números de la serie Fibonacci. ( 0 1 1 2 3 5 8 13 21 34 … ) Cada término, excepto los dos primeros, se genera de la suma de los dos términos anteriores.

9.4 ARREGLOS BIDIMENSIONALES O MATRICES Antes de estudiar los arreglos bidimensionales o matrices vamos a dar algunos conceptos y definir las operaciones más importantes de Matrices en términos matemáticos. Una matriz real es un conjunto ordenado de números reales arreglados en filas y columnas en forma de rectángulo. Se acostumbra presentar una matriz entre corchetes [ ]. Ejemplos: Columnas

Filas

⎡3 5 ⎤ ⎥ ⎣7 − 8⎦

A= ⎢

,B=

2 1.5 ⎤ ⎡−2 ⎢ 3 / 4 1 / 2 7.5⎥ ⎢ ⎥ ⎢0.23 7.6 π ⎥ ⎢ ⎥ 0 − 5⎥ ⎢ 1 ⎢⎣ 2 0.02 7 ⎥⎦

,C=

⎡2⎤ ⎢7⎥ ⎢ ⎥ ⎢9⎥ ⎢ ⎥ ⎣13⎦

Una matriz se puede clasificar de acuerdo con sus dimensiones, es decir, cuántas filas y cuántas columnas tiene. Por ejemplo

⎡4 5⎤ ⎢1 7 ⎥ ⎢ ⎥ ⎢⎣3 9 ⎥⎦ tiene tres filas y dos columnas, por lo que se llama matriz 3 x 2.

PROGRAMACION I – Algoritmos

81


Se acostumbra emplear letras mayúsculas para representar las matrices y letras minúsculas para sus elementos. Los elementos se referencian con el formato M[3][4], elemento de la fila 3 y columna 4. Nota: En el lenguaje C las filas se etiquetan de 0 a m y las columnas de 0 a n, por lo tanto, la dimensión de la matriz será (m+1)x(n+1).

⎡ M [0][0] M [0][1] M [0][2] M [0][3] ⎢ M [1][0] M [1][1] M [1][2] M [1][3] ⎢ ⎢ . . . . ⎢ . . . . ⎢ ⎢⎣ M [m][0] M [m][1] M [m][2] M [m][3]

. . . . .

. M [0][n] ⎤ . M [1][n] ⎥⎥ ⎥ . . ⎥ . . ⎥ . M [m][n]⎥⎦

(m+1)x(n+1) Una matriz es cuadrada si el número de filas es igual al número de columnas. La matriz A es cuadrada de orden 2. Una matriz es rectangular si el número de filas es diferente al número de columnas. La matriz B es rectangular de 5x3. Matriz columna si consta de una sola columna, matriz fila si consta de una fila y es nula si todos los elementos son 0. Operaciones:

Igualdad: Dos matrices A y B son iguales si son del mismo orden y todo elemento de A es el mismo número real que el correspondiente elemento de B en la misma fila y la misma columna.

Suma: Si A y B son dos matrices que tienen las mismas dimensiones, entonces A+B es una matriz en la que cada elemento es la suma de los elementos de la misma fila y columna de A y B.

9 ⎤ ⎡2 3 4 ⎤ ⎡− 3 4 5⎤ ⎡− 1 7 ⎢7 8 − 9⎥ + ⎢ − 1 6 7⎥ = ⎢ 6 14 − 2⎥ ⎦ ⎣ ⎦ ⎣ ⎦ ⎣

Resta: Si A y B son matrices del mismo orden entonces A - B = A + (-B)

⎡2 3 4 ⎤ ⎡− 3 4 5⎤ ⎡5 − 1 − 1 ⎤ ⎢7 8 − 9⎥ - ⎢ − 1 6 7⎥ = ⎢8 2 − 16⎥ ⎦ ⎣ ⎦ ⎣ ⎦ ⎣

Multiplicación escalar: Para la multiplicación de un número real por una matriz se multiplica cada elemento de la matriz por el número real o escalar

⎡2 3 4 ⎤ ⎡0.2 x 2 0.2 x3 0.2 x 4 ⎤ ⎡0.4 0.6 0.8 ⎤ ⎥ = ⎢ ⎥ = ⎢ ⎥ ⎣7 8 − 9⎦ ⎣0.2 x7 0.2 x8 0.2 x(−9)⎦ ⎣1.4 1.6 − 1.8⎦

0.2x ⎢

Multiplicación de matrices: Si A es una matriz m x n y B es una matriz n x p, entonces el producto AB es la matriz m x p cuyos elementos se obtienen en la forma siguiente: para

PROGRAMACION I – Algoritmos

82


evaluar el elemento de la fila i columna j se multiplican los elementos de la fila i de A por los respectivos elementos de la columna j de B y se suman los productos.

c ⎤ ⎡2a + 3d = f ⎥⎦ ⎢⎣4a + 5d

⎡2 3⎤ ⎡ a b ⎢4 5⎥ ⎢d e ⎦⎣ ⎣ ⎡ 2 3 5 2⎤ ⎢0 1 6 8 ⎥ ⎦ ⎣

⎡4 ⎢1 ⎢ ⎢8 ⎢ ⎣2

2b + 3e 2c + 3 f ⎤ 4b + 5e 4c + 5 f ⎥⎦

7⎤ 0⎥⎥ ⎡2 x 4 + 3x1 + 5 x8 + 2 x 2 2 x7 + 3x0 + 5 x1 + 2 x3⎤ ⎡55 25⎤ = = 1⎥ ⎢⎣ 0 x 4 + 1x1 + 6 x8 + 8 x 2 0 x7 + 1x0 + 6 x1 + 8 x3 ⎥⎦ ⎢⎣65 30⎥⎦ ⎥ 3⎦

9.4.1 DEFINICIÓN En programación se puede definir una matriz como un arreglo que maneja dos sub-índices. El primero se refiere a la fila y el segundo a la columna. M[3][4], elemento de la fila 3 y columna 4. 9.4.2 DECLARACIÓN Podemos declarar una matriz con notación algorítmica así: TipoDeDato NombreMatriz[NúmeroDeFilas][NúmeroDeColumnas]; Ejemplos: entero A[5][3]; // Declara una matriz entera de orden 5x3. real B[2][2], C[2][2]; // Declara dos matrices reales cuadradas de orden 2. carácter D[3][4]; // Declara una matriz de tipo carácter de 3x4. cadena E[30][1]; // Declara una matriz columna tipo cadena de 30x1. 9.4.3 INICIALIZACIÓN Las matrices se pueden inicializar, al igual que los vectores, cuando se declaran. La inicialización consta de una lista de datos separados por comas y encerrados entre corchetes, así: entero A[3][2] = {23,45,12,25,36,89} ; o bien entero A[3][2] = {(23,45), (12,25), (36,89)} ; 0

0 Filas

1 2

1

Columnas

⎡23 45⎤ ⎢12 25⎥ ⎢ ⎥ ⎢⎣36 89 ⎥⎦

entero B[2][4] = {(12,5,34,6), (7,67,43,37)} ; 0 Filas

0 1

1

2

3

Columnas

⎡12 5 34 6 ⎤ ⎢ 7 67 43 37 ⎥ ⎦ ⎣

PROGRAMACION I – Algoritmos

83


9.4.4 LECTURA O ESCRITURA La lectura de un elemento de una matriz se representa así: Lea( A[4][2] ); // El valor leído queda asignado al elemento de la fila 4 y columna 2 de la // matriz A. La escritura de un elemento de un vector se representa así: Escriba( A[4][2] ); // Escritura del elemento A[4][2]. 9.4.5 ASIGNACIÓN La asignación de valores a un elemento se realiza con la instrucción de asignación =. A[4][2] = -5; // Asigna el valor -5 al elemento de la fila 4 y columna 2 de la matriz A. 9.4.6 RECORRIDO Se puede acceder a los elementos de una matriz, ya sea para leer sus elementos, para visualizarlos, para realizar comparaciones, operaciones, etc. mediante ciclos anidados, generalmente con el ciclo para…fin para . Su sintaxis en seudocódigo es: para( entero IndiceFila=0; IndiceFila < NumFilas; IndiceFila = IndiceFila + 1) para( entero IndiceColum=0; IndiceColum < NumColum; IndiceColum = IndiceColum + 1) procesar elemento[IndiceFila][IndiceColum]; fin para fin para Ejemplo 1:

Lectura de una matriz real A[5][4]

// Lectura de datos real A[5][4]; entero fila, colum; para(fila = 0; fila < 5; fila = fila + 1) para(colum = 0; colum < 4; colum = colum + 1) Lea( A[fila][colum] ); fin para fin para

Escritura de una matriz real A[5][4]

// Escritura de datos real A[5][4]; entero fila, colum; para(fila = 0; fila < 5; fila = fila + 1)

PROGRAMACION I – Algoritmos

84


para(colum = 0; colum < 4; colum = colum + 1) Escriba( A[fila][colum] ); // Pasar a una nueva línea fin para fin para Ejemplo 2: Hallar la suma de los elementos de una matriz A[3][5]. Diagrama de flujo

Seudocódigo Algoritmo SumaMatriz Procedimiento Lectura(entero B[3][5]) entero i, j; para( i=0; i < 3; i=i+1) para(j=0; j < 5; j=j+1) Lea(B[ i ][ j ]); fin para fin para fin proc Procedimiento Suma(entero B[3][5]) entero i, j,sum=0; para( i=0; i < 3; i=i+1) para(j=0; j < 5; j=j+1) sum = sum + (B[ i ][ j ]); fin para fin para Escriba(“La suma es: “, sum) fin proc inicio entero A[3][5]; Lectura( A ); Suma( A ); final /* Nota: todos los arreglos se pasan por referencia a una función o procedimiento.*/

PROGRAMACION I – Algoritmos

85


Actividad 1: Construya el diagrama de flujo, el seudocódigo y realice la prueba de escritorio del siguiente problema: Hallar la suma de los elementos positivos y la suma de los elementos negativos de una matriz. Diagrama de flujo

Seudocódigo

Prueba de escritorio

PROGRAMACION I – Algoritmos

86


9.4.7 EJERCICIOS Construya el diagrama de flujo, el seudocódigo y realice la prueba de escritorio de los siguientes problemas: 1.) Hallar la suma y la resta de dos matrices A[m][n] y B[m][n]. 2.) Elaborar un programa que lea las Matrices A[m][n] y B[n][p] y luego halle su producto. 3.) Calcular la suma de los elementos de la diagonal principal de una matriz. 4.) Elaborar un programa que genere la matriz identidad. ( Matriz cuadrada de orden n cuya diagonal principal son 1 y los demás elementos 0). 5.) Leer una matriz de 5x5 y calcular la suma de cada una de sus filas y columnas, dejando dichos resultados en dos vectores, uno de las suma de las filas y otro de las columnas. 6.) Cada alumno de un curso tiene notas correspondientes a 5 materias. Escribir un programa que permita calcular el promedio de cada alumno, el promedio general del curso, y del curso en cada asignatura y ordenar los alumnos en forma decreciente de promedios individuales. 7.) Escribir un programa que lea una matriz, y a continuación encuentre el mayor y menor elemento y sus posiciones. 8.) Una matriz cuadrada es simétrica si A[ i ][ j ] = A[ j ][ i ] para todo i, j dentro de los límites de la matriz. Escribir un procedimiento que decida si una matriz dada es o no simétrica y un programa que lo aplique. 9.) Una agencia de venta de automóviles distribuye 10 modelos diferentes y tiene en su plantilla 8 vendedores. Se desea un programa que escriba un informe mensual de las ventas por vendedor y por modelo, así como el número de automóviles vendidos por cada vendedor y el número total de cada modelo vendido por todos los vendedores. Asimismo, para entregar el premio al mejor vendedor, necesita saber cuál es el vendedor que más automóviles ha vendido.

PROGRAMACION I – Algoritmos

87


GUIA 10 - ESTRUCTURAS

LOGROS: Al finalizar el estudio y práctica de esta guía estaremos en la capacidad de:

o Definir tipos de estructuras y declarar variables de estructuras. o Utilizar una estructura dentro de otra estructura. o

Definir y utilizar arreglos de estructuras.

10.1 INTRODUCCIÓN En la guía anterior estudiamos los arreglos que pueden almacenar información del mismo tipo en cada uno de sus elementos. En muchas situaciones es necesario procesar elementos que están relacionados entre sí pero que no son del mismo tipo. Por ello nos proponemos estudiar una estructura de datos donde en cada uno de sus elementos se puede guardar información de tipo diferente. Este nuevo tipo de datos recibe el nombre de Estructura o registro. Veamos el concepto de Estructura y el método para declararlos y procesarlos.

10.2 DEFINICIÓN Una estructura es un dato estructurado que consta de varios componentes denominados miembros o campos que pueden ser del mismo tipo o de tipos diferentes. Por ejemplo, se puede utilizar una estructura para almacenar diferentes tipos de información sobre una persona, tal como nombre, estado civil, edad y fecha de nacimiento. Cada uno de estos elementos se denomina nombre del miembro o nombre del campo. Cada estructura puede contener cualquier número de miembros, cada uno de los cuales tiene un nombre único.

10.3 DECLARACIÓN DE UNA ESTRUCTURA Una estructura es un tipo de dato definido por el usuario, que se debe declarar antes de que se pueda utilizar. El formato de la declaración es: Estructura NombreDeLaEstructura TipoDeDatoMiembro1 NombreMiembro1; TipoDeDatoMiembro2 NombreMiembro2; . . TipoDeDatoMiembron NombreMiembron; fin estructura

PROGRAMACION I – Algoritmos

88


Una estructura se suele representar gráficamente en función de sus miembros. Así, por ejemplo: Estructura tipo estudiante NOMBRE

CODIGO

tipo cadena

GRADO

tipo entero

tipo cadena

DIRECCION tipo cadena

NOTA tipo real

Estructura

Estudiante

Nombre

Código

Grado

Dirección

Nota

Declaración Estructura Estudiante cadena Nombre; entero Código; cadena Grado; cadena Dirección; real Nota; fin estructura

10.4 DEFINICIÓN DE VARIABLES DE ESTRUCTURAS Al igual que cualquier tipo de datos, a una estructura se accede utilizando una variable o variables que se deben definir después de la declaración de la estructura, ya sea como variable global o local. Una declaración de una estructura especifica simplemente el nombre y el formato de la estructura de datos, pero no reserva almacenamiento en memoria. Por consiguiente, cada definición de variable para una estructura dada crea un área en memoria en donde los datos se almacenan de acuerdo al formato estructurado declarado. Su formato es: NombreEstructura NombreVariable; NombreEstructura NombreVariable1, NombreVariable2,..,NombreVariablen; Ejemplo: Estudiante alumno; Estudiante alumno1, alumno2, alumno3;

PROGRAMACION I – Algoritmos

89


10.5 INICIALIZACIÓN DE UNA DECLARACIÓN DE ESTRUCTURAS Se puede inicializar una estructura como parte de la definición de las variables de la estructura, especificando entre corchetes los valores iniciales, así: Estudiante alumno = { Luis Armenta, 01, 8A, Calle 13 # 16-74, 8.5 }

10.6 ACCESO A LOS MIEMBROS DE UNA ESTRUCTURA Se accede a una estructura ya sea para almacenar la información o recuperarla, utilizando el operador punto ( . ) NombreVariableEstructura.NombreMiembro Ejemplo: Estructura libro cadena título; cadena autor; cadena editorial; entero año; fin estructura . . libro Programación; Programación.título = “Aprendamos a programar”; Programación.año = 2004; Lea(Programación.autor); Escriba(Programación.título);

10.7 ESTRUCTURAS ANIDADAS Es posible declarar un tipo de estructura con miembros que sean otras estructuras. Una estructura con uno o más miembros que sean tipo estructura se llama estructura anidada.

Ejemplo: Estructura fecha entero día; entero mes; entero año; fin estructura

PROGRAMACION I – Algoritmos

90


Estructura Alumno entero código; cadena nombre; fecha fec_ing; fin estructura Para tener acceso a una estructura anidada se debe indicar el camino a seguir en orden jerárquico desde el nombre de la estructura raíz hasta el miembro específico. Alumno Octavo; Lea( Octavo.fec_ing.día); Lea( Octavo.fec_ing.mes); Lea( Octavo.fec_ing.año); Ejemplo: Se desea registrar una estructura PersonaEmpleado que contenga como miembros los datos de una persona empleado que a su vez contenga los datos de la fecha de nacimiento. Algoritmo Personal Estructura fecha entero día; entero mes; entero año; fin estructura Estructura persona cadena nombre; entero edad; fecha fec; // Estructura anidada fin estructura Estructura PersonaEmpleado persona empleado; // Estructura anidada entero salario; entero horas_por_semana; fin estructura inicio PersonaEmpleado pe; Escriba(“Nombre “); Lea(pe.empleado.nombre); Escriba(“Edad”); Lea(pe.empleado.edad); Escriba(“Fecha de Nacimiento”); Lea(pe.empleado.fec.día); Lea(pe.empleado.fec.mes); Lea(pe.empleado.fec.año); Escriba(“Salario”); Lea(pe.salario); Escriba(Número de horas); Lea(pe.horas_por_semana); final

PROGRAMACION I – Algoritmos

91


10.8 ARREGLO DE ESTRUCTURAS Las estructuras simples son poco útiles por sí mismas. Son útiles cuando se agrupan en conjuntos que se conocen con el nombre arreglo de estructuras. Se puede crear un arreglo de estructuras tal como se crea un arreglo de otros tipos. PersonaEmpleado pe[50]; // Asigna un arreglo de 50 elementos tipo PersonaEmpleado Ejemplo: Algoritmo artículos Estructura elemento entero código; entero nombre; entero cantidad; fin estructura Procedimiento leer( elemento inventario[50]) // Una estructura como parámetro entero i; para(i=0; i < 50; i = i + 1) Escriba(“Código: “); Lea( inventario[ i ].código); Escriba(“Nombre: “); Lea(inventario[ i ].nombre); Escriba(“Cantidad: “); Lea(inventario[ i ].cantidad); fin para fin estructura inicio elemento inventario_artículos[50]; leer(inventario_artículos); final Aplicación 1: Una biblioteca tiene la siguiente información para cada uno de los libros: Código, título, autor, materia, editorial, año, ciudad. Elabore un programa con las siguientes opciones: •

Adición de nuevos libros.

Escribir en pantalla la ficha bibliográfica de un libro, dado su código.

Listado de obras por materia.

Borrar del arreglo todos los libros de más de 10 años de editados

PROGRAMACION I – Algoritmos

92


PROGRAMACION I – Algoritmos

93


Aplicación 2 Mostrar los resultados de ejecutar el siguiente segmento de un algoritmo: Estructura m entero d; entero e; fin estructura Estructura regA real b; m c; // Estructura anidada entero f[4]; fin estructura // Variables regA a; entero j; a.b = 3.4; a.c.d = 1; a.c.e = 2; a)

a.f[a.c.d] = a.c.e; a.f[a.c.e] = a.c.d + a.c.e; Escriba( a.b, “ “, a.f[1], “ “, a.f[2]) Salida: ____________________________________________________

b)

para( j=0; j < 4 ; j=j+1) a.f[ j ] = a.c.d + a.c.e + j; fin para Escriba( a.b, “ “, a.f[0], “ “, a.f[1], a.f[2], “ “, a.f[3] ); a.c.d = 3; a.c.d = 4; a.f[1] = a.c.d; a.f[3] = a.c.e; Escriba( a.b, “ “, a.f[0], “ “, a.f[1], a.f[2], “ “, a.f[3] ); Salida: ____________________________________________________ ____________________________________________________

PROGRAMACION I – Algoritmos

94


Aplicación 3 ¿ Qué se imprime al ejecutar el siguiente programa ? Algoritmo Aplicación 3 Estructura Estudio cadena nombre; real índice; cadena mayor; fin estructura estudio estudiante; Procedimiento sub1( estudio &s) cadena aux; Escriba( s.nombre, “ “, s.índice, “ “, s.mayor); s.índice = s.índice + 0.75; aux = “ Sr “; s.nombre = concatena(aux, s.nombre); fin procedimiento inicio estudiante.nombre = “ Luis García”; estudiante.índice = 3.25; estudiante.mayor = “ Tenis”; sub1(estudiante); Escriba( estudiante.nombre, “ “, estudiante.índice, “ “, estudiante.mayor); final Salida: ____________________________________________________ ____________________________________________________ 10.9 EJECICIOS 1. Un arreglo de estructuras contiene la descripción de personas a efectos estadísticos. Cada estructura tiene los miembros: nombre, edad, sexo, altura, color de ojos, nacionalidad y región. Escribir un programa que lea y almacene datos en este arreglo, ordene el arreglo por orden alfabético de nombres y visualice o imprima su contenido. 2. Un médico almacena la siguiente información de sus pacientes: nombre, dirección, teléfono, fecha última visita, si es o no privado, si tiene alergias y un campo de observaciones. Se desea un programa que: Lea y almacene datos, imprimir en pantalla toda la información del paciente, dado un nombre encontrar la fecha de la última visita, listar los pacientes con alergias, listar todos los pacientes privados y el listado completo de pacientes.

PROGRAMACION I – Algoritmos

95


GUIA 11 - ARCHIVOS

LOGROS: Al finalizar el estudio y práctica de esta guía estaremos en la capacidad de: o

Trabajar con las direcciones de memoria y las formas de accesarlas.

o

Explicar qué es un archivo.

o

Usar los diferentes tipos de archivos.

11.1 INTRODUCCIÓN Hasta ahora hemos trabajado con variables estáticas, donde es necesario reservar y utilizar memoria. Una de las ventajas de la programación moderna es utilizar únicamente la memoria necesaria y liberarla tan pronto prescindamos de ella. Los punteros son la base de estructuras dinámicas para el manejo de la memoria tanto en archivos, listas, pilas, colas, árboles binarios, etc. Además en muchas ocasiones es necesario conservar los datos de modo permanente en algún medio de almacenamiento, como discos flexibles, cd, dvd, discos duros, etc. mientras se crean o manipulan programas u otros tipos de datos. En esta guía hablaremos de apuntadores y de archivos.

11.2 APUNTADORES Cada vez que se define una variable, el compilador establece un área de memoria para almacenar el contenido de la variable. Cuando se declara una variable entera, por ejemplo el compilador asigna dos bytes de memoria. El espacio para esa variable se sitúa en una posición específica de memoria, conocida como dirección de memoria. Cuando se hace uso al valor de la variable el compilador accede automáticamente a la dirección de memoria donde se almacena el entero. Se puede ganar eficacia en el acceso a esta dirección de memoria utilizando un puntero. Un puntero es una dirección de memoria. Un puntero es una variable. Una variable puntero contiene una dirección que apunta a otra dirección en memoria. Un puntero apunta a una variable de memoria.

Declaramos un puntero de la siguiente forma: TipoDeDatoApuntado *NombrePuntero entero *A; // Puntero A a un tipo de dato entero real *Aptdr; // Puntero Aptdr a un tipo de dato real

PROGRAMACION I – Algoritmos

96


entero n; // Declara la variable entera n entero *p: // Declara el puntero p a entero p = &n; // Asigna la dirección de n al puntero p. real altura = 1.75; real *alt = &altura; // Inicializa el puntero real alt con la dirección de altura El uso de un puntero para obtener el valor el valor al que apunta, es decir su dato apuntado se denomina indireccionar el puntero para ello se utiliza el operador de indirección *. real altura = 1.75; real *alt = &altura; Escriba( *alt); // Escribe el valor de altura: 1.75 cadena letra = “ L “; cadena *p; p = &letra;

Cuando ya se ha definido un puntero, el asterisco delante de la variable puntero indica el contenido de de la memoria apuntada por el puntero y será del tipo dado. No olvidar que el operador & devuelve la dirección de la variable a la cual se aplica.

PROGRAMACION I – Algoritmos

97


11.3 ARCHIVOS Un Archivo o fichero es una estructura de datos que, normalmente se almacena en la memoria auxiliar (discos flexibles, cd, dvd, discos duros, etc.)

de una computadora. Los datos están

organizados de tal modo que puedan ser recuperados fácilmente, actualizados o borrados y almacenados de nuevo en el archivo con todos los cambios realizados. No tiene un tamaño fijo, necesariamente. Se referencia por un nombre o identificador. La información se trasvasa de la memoria principal hacia él o de él a la memoria principal a través de una memoria intermedia ( buffer) y por medio de procedimientos de Lectura/Escritura ( Entradas/Salidas). De otra forma: Un archivo es un conjunto de datos estructurados denominados registros, y que constan, a su vez, de diferentes entidades denominadas campos. Ejemplo: Registro: Empleado Campos Nombre

Dirección

Fecha de nacimiento

Estado civil

Salario

Archivo: Empresa

Tenemos dos tipos de acceso a un archivo: Secuencial y Directo. 11.3.1 ARCHIVOS DE ACCESO SECUENCIAL Son archivos que se deben procesar en orden ascendente desde el principio hasta el fin. Es una sucesión de registros almacenada consecutivamente, de tal modo que para acceder a un registro n dado es obligatorio pasar por todos los n -1 registros que le preceden. El orden físico en que fueron grabados los registros es el orden de lectura de los mismos. Y contienen un registro particular que marcan el fin de archivo (FDA). Cada lenguaje de programación tiene su forma propia de marcar el fin de archivo, como : EOF, FF, ‘ * ‘, etc. Los principales operaciones que se pueden realizar con un archivo de acceso secuencial son:

Creación o declaración de un archivo.

Apertura de un archivo. Lectura o escritura del archivo.

Cierre del archivo.

PROGRAMACION I – Algoritmos

98


Cada lenguaje de programación tiene su propia estructura de creación o declaración de archivos. Usaremos en esta guía la creación del archivo por medio de una estructura que llamaremos ARCHIVO para que trate a cada archivo por separado por medio de un apuntador a dicha estructura. ( La estructura ARCHIVO depende del sistema operativo, es decir, los miembros de la estructura varían de un sistema a otro, según la forma en que cada sistema maneja sus archivos). Ejemplo: ARCHIVO *aptdar; Cada archivo abierto debe tener un apuntador declarado por separado del tipo ARCHIVO, que es utilizado para referirse al archivo. Funciones de Archivos Secuenciales:

AbrirArchivo(nombre_archivo, modo_archivo): Esta función se utiliza para abrir un archivo y devuelve un apuntador a ARCHIVO. Si nombre _archivo no es accesible, entonces se devuelve el valor al apuntador NULO. Nombre_archivo, como modo_archivo son cadenas. Modo_archivo Acceso leer escribir añadir le la

Descripción abrir archivo para leer, si no existe error abrir fichero para escribir si no existe se crea abrir archivo para añadir al final de este. abrir archivo para leer y escribir el archivo debe existir abrir archivo para leer y añadir, el archivo debe existir.

Ejemplo: ARCHIVO *ma; ma=AbrirArchivo("datos.dat","escribir"); // abre un archivo para escritura.

CerrarArchivo (apuntador_archivo): esta función nos permite efectuar las labores necesarias para vaciar los buffers y terminar todas las conexiones con el archivo indicado.

si el

Apuntador_archivo no esta asociado con un archivo se devuelve FDA. Ejemplo: CerrarArchivo (ma);

CerrarTodos(): Esta función cierra todos los archivos que se encuentren abiertos.

EscribaArchivo(puntero_archivo,lista de variables): Esta función es lo mismo que la función Escriba, la diferencia radica en que su salida se realiza hacia un archivo . Ejemplo: EscribaArchivo(ma, nombre, fech_nac, est_cv, sueldo);

LeaArchivo(apuntador_archivo, lista de variables): corresponde a la función Lea, pero tiene como primer argumento un apuntador de archivo que indica el archivo que se leerá.

PROGRAMACION I – Algoritmos

99


Ejemplo: LeaArchivo(ma, nombre, fech_nac, est_cv, sueldo);

IFDA(aptdar): Indicador de fin de archivo. aptdar apuntador al archivo.

Le informa al

programa que ya no hay más datos a procesarse. Ordinariamente se hace con una combinación de teclas según sea el sistema operativo. La combinación más común es <ctrl>z. Ejemplo 1: Cómo crear, leer e imprimir un archivo secuencial. Algoritmo Secuencial inicio entero código; cadena nombre; real nota; // Crear ARCHIVO *OctavoA; si ((OctavoA = AbrirArchivo(“Notas.dat”, “escribir”)) == NULO) entonces Escriba(“ No se puede abrir el archivo”); sino Escriba(“ Entre Código, Nombre, Nota “); Escriba(“ Para terminar < ctrl>z “); Lea(código, nombre, nota); mientras ( ! IFDA(OctavoA)) haga EscribaArchivo(OctavoA, código, nombre, nota); Lea(código, nombe, nota); fin mientras fin si CerrarArchivo(OctavoA); // Leer y escribir si ((OctavoA = AbrirArchivo(“Notas.dat”, “leer”)) == NULO) entonces Escriba(“ No se puede abrir el archivo”); sino Escriba(“Código, Nombre, Nota “); LeaArchivo(OctavoA,código, nombre, nota);

PROGRAMACION I – Algoritmos

100


mientras ( ! IFDA(OctavoA)) haga Escriba( código, nombre, nota); LeaArchivo(OctavoA, código, nombre, nota); fin mientras fin si CerrarArchivo(OctavoA); final Actividad 1 Implemente el algoritmo anterior para realizar las siguientes consultas: Lista de alumnos con nota menor a 3

Lista de alumnos con nota 3 o mayor a 3

EJERCICIOS 1. Escribir un programa que busque el número mayor, el menor, la suma de los números y el promedio en un archivo de valores reales. 2. Escriba un procedimiento que permita dividir un archivo, en dos archivos del mismo tipo y un programa para aplicarlo. 3. Escriba un algoritmo, con procedimientos de leer, agregar, consultar registros.

PROGRAMACION I – Algoritmos

101


11.3.2 ARCHIVOS DE ACCESO DIRECTO Los registros en un archivo secuencial no son necesariamente de la misma longitud. Los registros individuales de un archivo directo son de longitud fija y se puede tener acceso a ello directamente sin tener que buscar a través de otros registros.

Los datos pueden ser insertos en el archivo sin destruir otros datos en el archivo. Los datos almacenados anteriormente también pueden ser actualizados o borrados, sin tener que reescribir todo el archivo. Los programas de procesamiento de archivos directos rara vez escriben un campo de un registro a un archivo. Normalmente se escriben datos de tipo estructura Funciones de Archivos Directos

ArEscribir(*buffer, número_bytes, cantidad, ARCHIVO): Se utiliza esta función para arreglos y estructuras y donde *buffer es un puntero a una región de memoria donde se leen los datos para ser escritos al archivo, número_bytes es el número de bytes a escribir, cantidad determina cuántos elementos del mismo número de bytes se van a escribir. ARCHIVO es un apuntador a un archivo abierto previamente

ArLeer(*buffer, número_bytes, cantidad, ARCHIVO): Se utiliza esta función para arreglos y estructuras y donde *buffer es un puntero a una región de memoria donde se escriben los datos leídos del archivo, número_bytes es el número de bytes a leer, cantidad determina cuántos elementos del mismo número de bytes se van a leer. ARCHIVO es un apuntador a un archivo abierto previamente

desplazar(apuntador_archivo, desplazamiento, lugar): Se establece la posición de la siguiente operación de entrada o salida, desplazamiento es una variable de tipo entero que determina el número de bytes de desplazamiento a partir de lugar. Lugar es una variable que puede tomar uno de los tres valores : 0

principio del archivo

1

posición actual del archivo

2

fin de archivo

PROGRAMACION I – Algoritmos

102


Ejemplo 2: Cómo crear, leer e imprimir un archivo directo. Algoritmo Directo Estructura Persona entero código; cadena nombre; real nota; fin estructura inicio Persona alumno; // Crear ARCHIVO *OctavoA; si ((OctavoA = AbrirArchivo(“Notas.dat”, “escribir”)) == NULO) entonces Escriba(“ No se puede abrir el archivo”); sino Escriba(“ Entre Código “); Escriba(“ Para terminar 0”); Lea(alumno.código); mientras (alumno.código !=0) haga Escriba(“ Entre Nombre, Nota “; Lea(alumno.nombre, alumno.nota); desplazar(OctavoA, (alumno.código – 1)*tamaño(estructura persona), 0); //desplaza el apuntador de posición de archivo referenciado por OctavoA, a la posición de bytes calculada por //(alumno.código – 1)*tamaño(estructura persona) desde el principio del archivo.

ArEscribir(OctavoA, tamaño(estructura persona ),1, &alumno); Lea(alumno.código); fin mientras fin si CerrarArchivo(OctavoA); // Leer y escribir si ((OctavoA = AbrirArchivo(“Notas.dat”, “leer”)) == NULO) entonces Escriba(“ No se puede abrir el archivo”); sino Escriba(“Código

nombre

nota“);

mientras (! IFDA(OctavoA)) haga ArLeer(OctavoA, tamaño(estructura persona ),1, &alumno); si alumno.código !=0 entonces

PROGRAMACION I – Algoritmos

103


Escriba(alumno.código, alumno.nombre, alumno.nota); fin si fin mientras fin si CerrarArchivo(OctavoA); final Actividad 2 Implemente el algoritmo anterior para realizar: Consultar el registro de un alumno dado el Borrar el registro de un alumno dado el código código

EJERCICIO Escriba un programa para trabajar con un archivo directo de clientes de un banco, donde cada registro tiene los siguientes campos: código, nombre, depósitos (en el mes), retiros (en el mes), saldo. El programa debe tener las opciones: Adicionar, Consignaciones, Retiros, Consulta de saldos, Borrar clientes, Reporte del mes, mediante los procedimientos correspondientes.

PROGRAMACION I – Algoritmos

104


GUIA 12 – ESTRUCTURAS DE DATOS LOGROS: Al finalizar el estudio y práctica de esta guía estaremos en la capacidad de: o

Crear una lista, adicionar, modificar y borrar un elemento de una lista.

o

Crear y utilizar pilas.

o

Crear y utilizar colas.

o

Crear y utilizar árboles binarios.

12.1 INTRODUCCIÓN En la guía anterior hablamos de la memoria dinámica. Una de las aplicaciones más interesantes y potentes de la memoria dinámica y los punteros son las estructuras dinámicas de datos. Las estructuras básicas disponibles, los arreglos, tienen una importante limitación: no pueden cambiar de tamaño durante la ejecución. Los arreglos están compuestos por un determinado número de elementos, número que se decide al inicio. Las estructuras dinámicas nos permiten crear estructuras de datos muy flexibles, ya sea en cuanto al orden, tamaño, la estructura interna o las relaciones entre los elementos que las componen. Las estructuras de datos están compuestas de otras estructuras a las que llamaremos nodos o elementos, que agrupan los datos con los que trabajará nuestro programa y además uno o más punteros autoreferenciales, es decir, punteros a objetos del mismo tipo nodo. Una estructura básica de un nodo para crear listas de datos seria: estructura nodo int dato; estructura nodo *siguiente; fin estructura El campo "siguiente" debe apuntar a un objeto del tipo nodo. De este modo, cada nodo puede usarse como un elemento para construir listas de datos, y cada uno mantendrá un enlace con otro nodo. Para acceder a un nodo de la estructura sólo necesitaremos un puntero a un nodo. Durante la presente guía usaremos gráficos para mostrar la estructura de las estructuras de datos dinámicas. El nodo anterior se representará asi:

Dependiendo del número de punteros y de las relaciones entre nodos, podemos distinguir varios tipos de estructuras dinámicas. Enumeraremos ahora sólo de los tipos básicos: Listas abiertas, Pilas, Colas, Listas circulares, Listas doblemente enlazadas, Arboles binarios, Grafos. 12.2 Listas La primera forma de estructura dinámica, que estudiaremos, es la lista. En esta forma los nodos se organizan de modo que cada uno apunta al siguiente, y el último no apunta a nada, es decir, el puntero del nodo siguiente vale NULO. En las listas existe un nodo especial: el primero. Diremos que nuestra lista es un puntero a ese primer nodo o llamaremos a ese nodo la cabeza de la lista. Eso es porque mediante este puntero podemos acceder a toda la lista.

PROGRAMACION I – Algoritmos

105


Cuando el puntero que usamos para acceder a la lista vale NULO, diremos que la lista está vacía. El nodo representativo para construir listas tiene esta forma:

estructura nodo int dato; estructura nodo *siguiente; fin estructura nodo *nuevo; nuevo= Crear_Espacio(tamaño nodo); La función Crear_Espacio( tamaño tipo) abre un espacio de memoria de longitud número de bytes de tipo y devuelve la dirección de memoria del espacio abierto. En el ejemplo, cada elemento de la lista sólo contiene un dato de tipo entero, pero en la práctica no hay límite en cuanto a la complejidad de los datos a almacenar. ( Si p es un puntero a una estructura y m es un miembro de la estructura entonces: p Æ m accede al miembro m de la estructura apuntado por p.) nuevo Æ dato = 5; Operaciones básicas con listas: Con las listas se pueden realizar las siguientes operaciones: • Añadir o insertar elementos. • Buscar o localizar elementos. • Borrar elementos. • Moverse a través de una lista. Cada una de estas operaciones tendrá varios casos especiales, por ejemplo, no será lo mismo insertar un nodo en una lista vacía, o al principio de una lista no vacía, o la final, o en una posición intermedia. Insertar un elemento en una lista vacía: Este es, evidentemente, el caso más sencillo. Partiremos de que ya tenemos el nodo a insertar y, por supuesto un puntero, nuevo, que apunte a él, además el puntero a la lista valdrá NULO:

nodo *lista= NULO;

El proceso es muy simple, bastará con que: 1. nuevoÆsiguiente apunte a NULO. 2. Lista apunte a nodo. Insertar un elemento a continuación de un nodo cualquiera de una lista: El nodo "anterior" será aquel a continuación del cual insertaremos el nuevo nodo:

PROGRAMACION I – Algoritmos

106


Suponemos que ya disponemos del nuevo nodo a insertar, apuntado por nuevo, y un puntero al nodo a continuación del que lo insertaremos. El proceso a seguir será: 1. Hacer que nuevoÆsiguiente señale a anteriorÆsiguiente. 2. Hacer que anteriorÆsiguiente señale a nuevo.

Ejemplo de procedimiento para insertar nodos en una lista ordenada: Construir un procedimiento para almacenar números enteros en una lista, pero de modo que siempre esté ordenada de menor a mayor. Insertaremos valores 32, 15, 54, 28. De este modo tendremos todos los casos posibles. Al comenzar, el primer elemento se introducirá en una lista vacía, el segundo se insertará en la primera posición, el tercero en la última, y el último en una posición intermedia. Procedimiento Insertar(nodo *lista, int v) nodo *nuevo, *anterior; /* Crear un nodo nuevo */ nuevo = Crear_Espacio(tamaño nodo); nuevoÆvalor = v; /* Si la lista está vacía */

El primer paso es crear un nodo para el dato que vamos a insertar. Si Lista es NULO, o el valor del primer elemento de la lista es mayor que el del nuevo, insertaremos el nuevo nodo en la primera posición de la lista.

si ((lista) == NULO o (lista)Ævalor > v) entonces /* Añadimos la lista a continuación del nuevo nodo */ nuevoÆsiguiente = lista; /* Ahora, el comienzo de nuestra lista es en nuevo nodo */ lista = nuevo; sino /* Buscar el nodo de valor menor a v */ anterior = lista; /* Avanzamos hasta el último elemento o hasta que el

En caso contrario, buscaremos el lugar adecuado para la inserción, tenemos un puntero "anterior". Lo inicializamos con el valor de Lista, y avanzaremos mientras anteriorÆsiguiente no sea NULO y el dato que contiene anteriorÆsiguiente sea menor o igual que el dato que queremos insertar.

siguiente tenga un valor mayor que v */

PROGRAMACION I – Algoritmos

107


mientras(anterior Æ siguiente != NULO y anterior Æsiguiente Æ valor <= v) anterior = anterior Æ siguiente; fin mientras

Ahora ya tenemos anterior señalando al nodo adecuado, así que insertamos el nuevo nodo a continuación de él.

/* Insertamos el nuevo nodo después del nodo anterior */ nuevoÆsiguiente = anteriorÆsiguiente; anteriorÆsiguiente = nuevo; fin si fin procedimiento

Recorrer una lista Muy a menudo necesitaremos recorrer una lista, ya sea buscando un valor particular o un nodo concreto o para escribirla. Las listas abiertas sólo pueden recorrerse en un sentido, ya que cada nodo apunta al siguiente, pero no se puede obtener, por ejemplo, un puntero al nodo anterior desde un nodo cualquiera si no se empieza desde el principio. Por ejemplo, para mostrar todos los valores de los nodos de una lista, podemos usar el siguente bucle:

PROGRAMACION I – Algoritmos

108


estructura nodo

Para recorrer una lista procederemos siempre del mismo modo, usaremos un puntero auxiliar como índice:

entero dato; estructura nodo *siguiente;

Asignamos al puntero índice el valor de Lista.

fin estructura ...

Abriremos un bucle que al menos debe tener una condición, que el índice no sea NULO.

nodo *indice; ...

Dentro del bucle asignaremos al índice el valor del nodo siguiente al índice actual.

indice = lista; mientras (indice != NULO) haga Escriba(indiceÆdato); indice = indiceÆsiguiente; fin mientras

Supongamos que sólo queremos mostrar los valores hasta que encontremos uno que sea mayor que 80, podemos sustituir el bucle por: ... indice = Lista; mientras(indice != NULO y indice->dato <= 80) haga Escriba(indice->dato); indice = indice->siguiente; fin mientras ... Borrar elementos en una lista De nuevo podemos encontrarnos con varios casos, según la posición del nodo a eliminar. Borrar el primer nodo de una lista Partiremos de una lista con uno o más nodos, y usaremos un puntero auxiliar, nodo: 1. Hacemos que nodo apunte al primer elemento de la lista, es decir a Lista. 2. Asignamos a Lista la dirección del segundo nodo de la lista: ListaÆsiguiente. 3. Liberamos la memoria asignada al primer nodo, el que queremos eliminar.

PROGRAMACION I – Algoritmos

109


Eliminar un nodo cualquiera de una lista abierta: En todos los demás casos, eliminar un nodo se puede hacer siempre del mismo modo. Supongamos que tenemos una lista con al menos dos elementos, y un puntero al nodo anterior al que queremos eliminar. Y un puntero auxiliar nodo. El proceso es parecido al del caso anterior: 1. Hacemos que nodo apunte al nodo que queremos borrar. 2. Ahora, asignamos como nodo siguiente del nodo anterior, el siguiente al que queremos eliminar: anteriorÆsiguiente = nodoÆsiguiente. 3. Eliminamos la memoria asociada al nodo que queremos eliminar. Si el nodo a eliminar es el último, el procedimiento es igualmente válido, ya que anterior pasará a ser el último, y anteriorÆsiguiente valdrá NULO.

Algoritmo para borrar un elemento: Procedimiento Borrar(Lista *lista, int v) nodo *anterior, *nodo; nodo = lista; anterior = NULO; mientras(nodo !=NULO y nodoÆvalor < v) haga anterior = nodo; nodo = nodoÆsiguiente; fin mientras

Recordemos que para eliminar un nodo necesitamos disponer de un puntero al nodo anterior Lo primero será localizar el nodo a eliminar, si es que existe. Pero sin perder el puntero al nodo anterior. Partiremos del nodo primero, y del valor NULO para anterior. Y avanzaremos mientras nodo no sea NULO o mientras que el valor almacenado en nodo sea menor que el que buscamos. Ahora pueden darse tres casos:

si (nodo == NULO o nodoÆvalor != v) entonces retorna;

Que el nodo sea NULO, esto indica que todos los valores almacenados en la lista son menores que el que buscamos y el nodo que buscamos no existe. Retornaremos sin borrar nada. Que el valor almacenado en nodo sea mayor que el que buscamos, en ese caso también retornaremos sin borrar nada, ya que esto indica que el nodo que buscamos no existe. Que el valor almacenado en el nodo sea igual al que buscamos. De nuevo existen dos casos: Que anterior sea NULO. Esto indicaría

PROGRAMACION I – Algoritmos

110


que el nodo que queremos borrar es el primero, así que modificamos el valor de Lista para que apunte al nodo siguiente al que queremos borrar. Que anterior no sea NULO, el nodo no es el primero, así que asignamos a anteriorÆsiguiente la dirección de nodoÆsiguiente. sino /* Borrar el nodo */

Después, liberamos la memoria de nodo

si(anterior == NULO) entonces /* Primer elemento */ *lista = nodo->siguiente; sino /* un elemento cualquiera */ anteriorÆsiguiente=nodoÆsiguiente; fin si fin si

liberar_memoria(nodo); fin proc

Actividad 1. Elabore un algoritmo completo, con los procedimientos: Insertar, Borrar, MostrarLista, modificar un elemento; con la estructura estructura nodo entero dato; estructura nodo *siguiente; fin estructura Insertar los números 20, 40, 35, 62, 89 , cambiar el número 62 por 76, luego borrar 35, 20, después de cada acción se debe mostrar la lista.

PROGRAMACION I – Algoritmos

111


PROGRAMACION I – Algoritmos

112


Actividad 2 Escriba un algoritmo para crear 2 listas ordenadas descendentemente y luego crear una tercera lista que concatene las dos listas anteriores.

PROGRAMACION I – Algoritmos

113


Actividad 3

Escriba un algoritmo que lea una lista, la recorra y devuelva el dato del nodo con el valor menor, el valor mayor y su promedio.

PROGRAMACION I – Algoritmos

114


12.3 LISTAS CIRCULARES Una lista circular, es una lista que se caracteriza porque el último elemento apunta al primero, de la siguiente forma.

Damos ahora el seudocódigo de un algoritmo completo para manejar las listas circulares. Como actividad analice línea por línea el ejemplo. Algoritmo ListaCircular estructura nodo int valor; estructura nodo *siguiente; fin estructura nodo *lista; Procedimiento Insertar( int v) nodo *nuevo; // Creamos un nodo para el nuevo valor a insertar nuevo = Crear_Espacio(tamaño nodo); nuevoÆvalor = v; // Si la lista está vacía, la lista será el nuevo nodo // Si no lo está, insertamos el nuevo nodo a continuación del apuntado // por lista si(lista == NULO) entonces lista = nuevo; sino nuevoÆsiguiente = (lista)Æsiguiente; fin si // En cualquier caso, cerramos la lista circular (*lista)Æsiguiente = nodo; fin proc Procedimiento Borrar( int v) nodo *bnodo; bnodo = lista; // Hacer que lista apunte al nodo anterior al de valor v haga

PROGRAMACION I – Algoritmos

115


si((lista)ÆsiguienteÆvalor != v) entonces lista = (lista)Æsiguiente; fin si mientras((lista)ÆsiguienteÆvalor != v y lista !=bnodo); // Si existe un nodo con el valor v: si((lista)ÆsiguienteÆvalor == v) entonces // Y si la lista sólo tiene un nodo si(lista == (lista)Æsiguiente) entonces // Borrar toda la lista Liberar(lista); fin si lista = NULL; si no // Si la lista tiene más de un nodo, borrar el nodo de valor v bnodo = (lista)Æsiguiente; (lista)Æsiguiente = bnodoÆsiguiente; Liberar(bnodo); fin si fin proc Procedimiento BorrarLista() nodo *bnodo; // Mientras la lista tenga más de un nodo mientras((lista)Æsiguiente != lista) // Borrar el nodo siguiente al apuntado por lista bnodo = (lista)Æsiguiente; (lista)Æsiguiente = bnodoÆsiguiente; Liberar(bnodo); fin mientras // Y borrar el último nodo Liberar(lista); lista = NULO; fin proc Procedimiento MostrarLista() nodo *bnodo =lista; hacer Escriba( bnodoÆvalor);

PROGRAMACION I – Algoritmos

116


bnodo = bnodoÆsiguiente; mientras(bnodo != lista); fin proc inicio lista = NULO; Insertar( 10); Insertar( 40); Insertar( 30); Insertar( 20); Insertar( 50); MostrarLista(lista); Borrar( 30); Borrar( 50); MostrarLista(); BorrarLista(); final Actividad 4 Escriba un algoritmo para crear 2 listas circulares y luego crear una tercera lista circular que concatene las dos listas anteriores.

PROGRAMACION I – Algoritmos

117


Actividad 5. Una lista doblemente encadenada, se caracteriza porque cada uno de sus elementos está formado por tres partes, así:

Un apuntador al nodo anterior.

Un espacio para guardar información.

Un apuntador al siguiente nodo.

PROGRAMACION I – Algoritmos

118


La estructura de un elemento debe ser declarada de la siguiente forma: estructura nodo int valor; estructura nodo *anterior; estructura nodo *siguiente; fin estructura Diseñe un algoritmo para trabajar con listas doblemente encadenadas, con los procedimientos necesarios para:

Adicionar un elemento al principio de la lista.

Adicionar un elemento al final de lista.

Adicionar un elemento entre dos elementos.

Localizar un elemento en la lista.

Eliminar un elemento de la lista.

Escribir la lista.

PROGRAMACION I – Algoritmos

119


12.4 PILAS Una pila es una estructura de información donde el último elemento en entrar es el primero en salir. Una pila es un tipo especial de lista en la que sólo se pueden insertar y eliminar nodos en uno de los extremos de la lista. Es un tipo de lista LIFO (Last In First Out), el último en entrar es el primero en salir. El nodo para construir pilas es el mismo que para construir listas: estructura nodo int valor; estructura nodo *siguiente; fin estructura Las operaciones básicas con las pilas son:

Añadir un elemento al final de la pila.

Leer y eliminar un elemento al final de la pila.

Estas operaciones las podemos visualizar así: Para insertar o añadir un elemento en una pila vacía y en una pila no vacía

Para leer y eliminar un elemento al final de la pila

PROGRAMACION I – Algoritmos

120


Podríamos realizar otras operaciones con las pilas, como recorrerlas, imprimirlas, modificar un elemento, etc. que se hacen con los mismos procedimientos de las listas, ya que las pilas son un caso especial de listas Damos ahora el seudocódigo de un algoritmo completo para manejar las pilas. Como actividad analice línea por línea el ejemplo. Algoritmo Pila estructura nodo int valor; estructura nodo *siguiente; fin estructura nodo *pila; procedimiento insertar(int v) nodo *nuevo; /* Crear un nodo nuevo */ nuevo = Crear_Espacio(tamaño nodo); nuevoÆvalor = v; /* Añadimos la pila a continuación del nuevo nodo */ nuevoÆsiguiente = pila; /* Ahora, el comienzo de nuestra pila es en nuevo nodo */ pila = nuevo; fin proc entero Función LeerBorrar() nodo *nodob; /* variable auxiliar para manipular nodo */ entero v; /* variable auxiliar para retorno */ /* Nodo apunta al primer elemento de la pila */ nodob = pila; si (nodob == NULO) retorna 0; /* Si no hay nodos en la pila retornamos 0 */ /* Asignamos a pila toda la pila menos el primer elemento */ pila = nodobÆsiguiente; /* Guardamos el valor de retorno */ v = nodobÆvalor; /* Borrar el nodo */ Liberar(nodob); retorna v; fin Función

PROGRAMACION I – Algoritmos

121


inicio pila = NULO; insertar( 29); insertar( 12); Escriba(LeerBorrar()); insertar( 48); insertar( 55); Escriba(LeerBorrar()); Escriba(LeerBorrar()); insertar( 87); Escriba(LeerBorrar()); Escriba(LeerBorrar()); final 12.5 COLAS Una cola es una estructura de información donde el primer elemento en entrar es el primero en salir, (First In First Out o sea una estructura FIFO). Cuando vamos a adicionar un nuevo elemento a la cola, debemos hacerlo después de su último elemento y si queremos borrar, debemos hacerlo con el primer elemento. El nodo para construir colas es el mismo que para construir listas y pilas: estructura nodo int valor; estructura nodo *siguiente; fin estructura Las operaciones básicas con las pilas son:

Añadir un elemento al final de la cola.

Leer y eliminar un elemento al principio de la cola.

Estas operaciones las podemos visualizar así: Para insertar o añadir un elemento en una cola vacía .

PROGRAMACION I – Algoritmos

122


Para insertar o añadir un elemento en una cola no vacía.

Para eliminar un elemento de la cola, se elimina el elemento al cuál está apuntando el apuntador primero, lo podemos visualizar así:

1. Hacemos que nodo apunte al primer elemento de la cola, es decir a primero. 2. Asignamos a primero la dirección del segundo nodo de la pila: primeroÆsiguiente.

PROGRAMACION I – Algoritmos

123


3. Guardamos el contenido del nodo para devolverlo como retorno, recuerda que la operación de lectura en colas implican también borrar. 4. Liberamos la memoria asignada al primer nodo, el que queremos eliminar. Damos ahora el seudocódigo de un algoritmo completo para manejar las colas. Como actividad analice línea por línea el ejemplo. Algoritmo Cola estructura nodo int valor; estructura nodo *siguiente; fin estructura nodo *primero, *último; procedimiento Anadir(int v) nodo *nuevo; /* Crear un nodo nuevo */ nuevo = Crear_Espacio(tamaño nodo); nuevoÆvalor = v; /* Este será el último nodo, no debe tener siguiente */ nuevoÆsiguiente = NULO; /* Si la cola no estaba vacía, añadimos el nuevo a continuación de ultimo */ si (ultimo != NULO) entonces ultimoÆsiguiente = nuevo; fin si /* Ahora, el último elemento de la cola es el nuevo nodo */ último = nuevo; /* Si primero es NULL, la cola estaba vacía, ahora primero apuntará también al nuevo nodo */ si (primero == NULO) entonces primero = nuevo; fin si fin proc entero Función Leer() nodo *bnodo; /* variable auxiliar para manipular nodo */ int v; /* variable auxiliar para retorno */ /* bnodo apunta al primer elemento de la pila */ bnodo = primero; si (bnodo == NULO) entonces retorna 0; /* Si no hay nodos en la pila retornamos 0 */ fin si /* Asignamos a primero la dirección del segundo nodo */ primero = bnodoÆsiguiente;

PROGRAMACION I – Algoritmos

124


/* Guardamos el valor de retorno */ v = bnodo->valor; /* Borrar el nodo */ liberar(bnodo); /* Si la cola quedó vacía, ultimo debe ser NULL también*/ si (primero == NULO) entonces ultimo = NULO; fin si retorna v; fin función inicio primero = NULO; último = NULO; Anadir( 20); Escriba("Añadir(20)"); Anadir(10); Esciba("Añadir(10)); Escriba("Leer: ", Leer()); Anadir(40); Escriba("Añadir(40)”); Anadir(30); Escriba("Añadir(30)"); Escriba("Leer: ", Leer()); Escriba("Leer: ", Leer()); Anadir( 90); Escriba("Añadir(90)"); Escriba("Leer: ", Leer(); Escriba("Leer: ", Leer()); final 12.6 EJERCICIOS 1.) Escribir un programa que permita determinar si una palabra o frase es un palíndromo. ( La lectura en ambos sentidos produce el mismo resultado. 2.) Escribir un programa que invierta el contenido de una pila. 3.) Escribir un programa que invierta el contenido de una cola. 4.) Escribir un programa que verifique si los contenidos de dos pilas son idénticos. 5.) Escribir un programa que cree una pila a partir de una cola.

PROGRAMACION I – Algoritmos

125


12.7 ARBOLES Un árbol es una estructura no lineal de datos que se organizan de modo que los elementos están relacionados entre sí. Un árbol consta de un conjunto finito de elementos, denominados nodos, y un conjunto finito de líneas dirigidas o enlaces, denominadas ramas, que conectan los nodos. La representación y terminología de los árboles se realiza con las típicas notaciones de las relaciones familiares en los árboles genealógicos: Padre, hijo, hermano, ascendente, descendiente, etc. Debemos tener en cuenta:

Raíz: Todos los árboles que no están vacíos tienen en único nodo raíz. Todos los demás elementos o nodos descienden de él. El nodo raíz no tiene padre.

Nodo: Son los elementos del árbol.

Nodo hijo: cualquiera de los nodos apuntados por uno de los nodos del árbol.

Hoja: Es aquel nodo que no contiene ningún subárbol.

A cada nodo que no es hoja se le asocia uno o varios subárboles llamados descendientes.

Los nodos de un mismo padre se llaman hermanos.

Todos los nodos tienen un solo padre, excepto el raíz que no tiene padre.

Se denomina camino el enlace entre dos nodos consecutivos, y rama es un camino que termina en una hoja.

Cada nodo tiene asociado un número de nivel que se determina por la longitud del camino desde la raíz al nodo específico.

La altura de un árbol es el número máximo de nodos de una rama.

En esta guía analizaremos los árboles binarios, Definición: Es un conjunto finito de cero o más nodos tales que: Existe un nodo denominado raíz del árbol, cada nodo puede tener 0, 1, 2 subárboles conocidos como subárbol izquierdo, y subárbol derecho. Ejemplo:

PROGRAMACION I – Algoritmos

126


Vamos a crear, como ejemplo, un árbol binario especial llamado: árbol de búsqueda binario, que tiene las siguientes características: No tiene valores duplicados de nodos, los valores de cualquier subárbol izquierdo son menores que el valor en sus nodos padre, y los valores en cualquier subárbol derecho son mayores que el valor en sus nodos padre. Veamos la siguiente ilustración:

( Para este ejemplo vamos a utilizar la palabra reservada DefinirTipo que proporciona un mecanismo para la creación de sinónimos para tipos de datos anteriormente definidos. Se utiliza para hacer un programa más portátil, y crear nombres de tipo más breves. Ejemplo: estructura nodo int dato; estructura nodo *siguiente; fin estruc DefinirTipo estructura nodo tipoNodo; DefinirTipo tipoNodo *pNodo; tipoNodo es el tipo para declarar nodos, evidentemente. pNodo es el tipo para declarar punteros a un nodo. ) El programa tiene 4 procedimientos: insertarNodo, enorden, preorden y postorden y lo hacen en forma recursiva. El procedimiento InsertarNodo recibe como argumentos la dirección del árbol y un entero para almacenarse en el árbol. Un nodo puede ser inserto únicamente como nodo de hoja. Los pasos para inserta un nodo son como sigue: 1) Si *apunArbol es NULO, crea un nuevo nodo. Su dirección se la asigna a *apunArbol. Asigna a *apunArbolÆdato el entero a almacenarse. Asigna *apunArbolÆizquierdo y *apunArbolÆderecho el valor NULO y regresa el control al llamador. 2) Si el valor de *apunArbol no es NULO, y el valor a insertarse es menor que *apunArbolÆdato, se llama a la función insertarNodo con la dirección de *apunArbolÆizquierdo. De no ser así, se llama a la función insertarNodo con la dirección *apunArbolÆderecho. Se continúan los pasos recursivos hasta que se encuentre un apuntador NULO, entonces se ejecutará el paso 1) para insertar el nuevo nodo. Los procedimientos enorden, preorden y postorden cada una de ellas recibe un árbol y recorren el árbol.

PROGRAMACION I – Algoritmos

127


Los pasos para un recorrido enorden son: 1) Recorrer el subárbol izquierdo enorden. 2) Procesar el valor del nodo. 3) Recorrer el subárbol derecho enorden. El recorrido del árbol de la ilustración sería: 9 17 20 23 29

45

56 57 60 68 82 90

El recorrido enorden lo hace en forma ascendente. Los pasos para un recorrido preorden son: 1) Procesar el valor en el nodo. 2) Recorrer el subárbol izquierdo en preorden. 3) Recorrer el subárbol derecho en preorden. El valor en cada nodo es procesado conforme pasa por cada nodo. Después de que se procese el valor en un nodo dado, son procesados los valores del subárbol izquierdo, y a continuación los valores en el subárbol derecho. El recorrido del árbol de la ilustración sería: 56

23

17

9

20

29

45

68

60

57

82

90

Los pasos en recorrido postorden son: 1) Recorrer el subárbol izquierdo postorden. 2) Recorrer el subárbolderecho postorden. 3) Procesar el valor en el nodo. El valor en cada nodo no se imprime hasta que sean impresos los valores de sus hijos. El recorrido del árbol de la ilustración sería: 9

20

17

45

29

23

57 60

90

82

68

56

El árbol de búsqueda binario facilita la eliminación de duplicados. El algoritmo descarta ese valor. El algoritmo es : Algoritmo ArbolDeBúsquedaBinario Estructura Arbol estructura Arbol *izquierdo; entero dato; estructura Arbol *derecho; fin estructura

PROGRAMACION I – Algoritmos

128


DefinirTipo estructura Arbol NodoArbol; DefinirTipo NodoArbol *apunNodo; procedimiento InsertarNodo( apunNodo *apunArbol, entero valor) si *apunArbol == NULO entonces *apunArbol = Crear_Espacio(tamaño NodoArbol); si *apunArbol != NULO entonces *apunArbolÆdato = valor; *apunArbolÆizquierdo = NULO; *apunArbolÆderecho = NULO; sino Escriba(valor, “ no insertado”); fin si sino si valor < *apunArbolÆdato entonces InsertarNodo(&(*apunArbolÆizquierdo), valor); // Recursividad sino si valor > *apunArbolÆdato entonces InsertarNodo(&(*apunArbolÆderecho), valor); // Recursividad sino Escriba(“Duplicado”); fin si fin si fin si fin proc

procedimiento enorden(apunNodo apunArbol) si apunArbol != NULO entonces enorden(apunArbolÆizquierda); Escriba( apunArbolÆdato); enorden(apunArbolÆderecha); fin si fin proc procedimiento preorden(apunNodo apunArbol) si apunArbol != NULO entonces Escriba( apunArbolÆdato); enorden(apunArbolÆizquierda); enorden(apunArbolÆderecha);

PROGRAMACION I – Algoritmos

129


fin si fin proc procedimiento postorden(apunNodo apunArbol) si apunArbol != NULO entonces enorden(apunArbolÆizquierda); enorden(apunArbolÆderecha); Escriba( apunArbolÆdato); fin si fin proc Actividad 7: Elabore una función para hallar un elemento del árbol.

PROGRAMACION I – Algoritmos

130


Actividad 8: Elabore una función para borrar un elemento del árbol.

PROGRAMACION I – Algoritmos

131


Actividad 9: Proporcione los recorridos enorden, preorden y postorden del árbol de la ilustración:

El recorrido en enorden es: El recorrido en preorden es: El recorrido en postorden es:

PROGRAMACION I – Algoritmos

132


BIBLIOGRAFIA Braunstein, Silvia L; Rioja, Alicia B.: Introducción a la programación y a las estructuras de datos. Eudeba, Buenos Aires. Cairó Osvaldo.:Metodología de la Programación. Alfaomega Deitel H. M./Deitel P. J.: Cómo programar en C/C++. Prentice-Hall Dijkstra, E. W.:Notes on Structured Programming. Academia Press, New Cork. Duque J:R:, Sepúlveda W.O y Sepúlveda F.J.:Turbo Pascal al alcance de todos. editorial Gazeta Ltda.. Hekmatpour S.: Guía para programadores en C. Prentice-Hall Jamsa Kris: Aprenda C++ paso a paso. 2ª edición.Computec Joyanes Aguilar, Luis : Fundamentos de Programación. McGraw. Hill Joyanes Aguilar, Luis : Programación en C/C++. McGraw. Hill Kernighan, B. W. y Ritchie, D. M.:El lenguaje de programación C. Prentice-Hall Hispanoamericana, México Kruse, Robert L.: Data Structures and Program Design. 2ª edición. PHI,1987 Lozano R. L.: Diagramación y programación estructurada y libre. Universidad Central. Lipschutz, Seymour: Estructura de datos. McGraw. Hill. Mascarell, Jodi B.: Programación en C. Alfaomega. Maldonado F., Montero M.: Aprendamos con Turbo C. Microsoft Corporation: Microsoft Visual C++. Funciones y aplicaciones. McGraw. Hill Tennent, R. D.:Principles of Programing Languages. Prentice-Hall.

PROGRAMACION I – Algoritmos

133


CODIGO ASCII 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43

☺ ☻ ♥ ♦ ♣ ♠ • ◘ ○ ◙ ♂ ♀ ♪ ♫ ☼ ► ◄ ↕ ‼ ¶ § ▬ ↨ ↑ ↓ → ← ∟ ↔ ▲ ▼ ! " # $ % & ' ( ) * +

44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86

, . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V

87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129

W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ ⌂ Ç ü

130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172

é â ä à å ç ê ë è ï î ì Ä Å É æ Æ ô ö ò û ù ÿ Ö Ü ø £ Ø × ƒ á í ó ú ñ Ñ ª º ¿ ® ¬ ½ ¼

PROGRAMACION I – Algoritmos

173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215

¡ « » ░ ▒ ▓ │ ┤ Á Â À © ╣ ║ ╗ ╝ ¢ ¥ ┐ └ ┴ ┬ ├ ─ ┼ ã Ã ╚ ╔ ╩ ╦ ╠ ═ ╬ ¤ ð Ð Ê Ë È ı Í Î

216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255

Ï ┘ ┌ █ ▄ ¦ Ì ▀ Ó ß Ô Ò õ Õ µ þ Þ Ú Û Ù ý Ý ¯ ´ ± ‗ ¾ ¶ § ÷ ¸ ° ¨ · ¹ ³ ² ■

134


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.