Técnicas de Programación

Friday, July 21, 2006

EJERCICIOS DE RECUPERACION

1) REALIZAR UN PROGRAMA EN WINPASCAL QUE DETERMINE DE 10 NÚMEROS INTRODUCIDOS POR TECLADO ¿CUÁNTOS DE ELLOS SON POSITIVOS Y CUÁNTOS NEGATIVOS?, ADEMÁS EL PROGRAMA DEBE DAR LA SUMA DE LOS 10 NÚMEROS INTRODUCIDOS.

2) TOMANDO EN CUENTA EL SIGUIENTE ALGORITMO, REALIZAR UN PROGRAMA EN PASCAL QUE PERMITA AL SER INTRODUCIDA UNA CANTIDAD POR EL TECLADO, INVERTIR LA MISMA(ES DECIR SI SE INTRODUCE 123 DEBE CAMBIARLO A 321).

Algoritmo invertir
var
entero: n, resto
inicio
escribir( ' Introduzca el número ')
leer(n)
mientras n > 0 hacer
resto <--- n mod 10
escribir(resto)
n <--- n div 10
fin_mientras
fin.

3) Realizar un programa en Winpascal que determine el valor de la siguiente función:

f(x) =log(x) -1/x

Monday, July 10, 2006

ASIGNACION 4TO CORTE

1) Realizar un programa en winpascal que determine el volumen y el área de un cilindro cuyas dimensiones radio y altura, se introducen por el teclado.
Nota: En un texto de matemática, deben buscar la fórmula para calcular el area y el volumen de un cilindro.

2) Realizar un programa en winpascal que realice la siguiente conversión: una temperatura dada en Grados Celsius a Grados Fahrenheit.
Nota: La fórmula de conversión es: F = (9/5)*C + 32, donde, C es la cantidad en grados Celsius que se introduce por el teclado.

3) Realizar un programa en winpascal que determine la suma de los cuadrados de los primeros 50 número pares

4) Tomando en cuenta el siguiente algoritmo, realizarlo en winpascal

Algoritmo Elevado_a_X
Var
Entero: X, I
Real: E, NUM, DEN
Inicio
Escribir(‘ Introduzca el valor ’)
Leer(X)
E <--1

NUM <-- 1

DEN <-- 1

I <-- 1

Repetir

NUM<-- X*NUM

DEN <-- DEN*I

I <-- I + 1

E <-- E + NUM / DEN

Hasta que (NUM / DEN ) <> 0.01

fin

Estos programas deben enviarlos a mas tardar el día domingo 16/7 en un archivo comprimido en Zip o Rar, ademas de ello deben enviarlo con la extensión .pas en forma individual. Para el día Jueves tendran la evaluación escrita, la cual será el complento de esta asignación.

Friday, June 30, 2006

NOTAS 3er CORTE

Nombre y Apellido
Carlos E. Camate 14.989.879 13
Edinson Agro
14558761
Nota:10
Jimmer Carvajal
18578765
Nota:10
Diana C. Araujo M.
17401007
Nota:13
Mayvette Vicent
6215190
Nota:13
Ada Loiret Muñoz
13409993
Nota:13
Julio Herrera
14300819
Nota:13
Marisol Pastrano
10793197
Nota:11
Rafael Rodriguez
14200952
Nota:11
William Movilla
18002645
Nota:11
Geraldine Barrios
17557385
Nota:NP
Geraldine Martínez
16972822
Nota:NP
Jorge Toussaint
15203308
Nota:NP

Friday, June 23, 2006

ASIGNACIÓN EN WINPASCAL

1) Realizar un programa en winpascal que calcule la suma de los números pares e impares comprendidos entre 1 y 100.
2) Realizar un programa en winpascal que determine el producto de los números múltiplos de 3, comprendidos entre 50 y 150.
3) Tomando en cuenta el siguiente algoritmo, realizar el programa en winpascal.
Algoritmo para descomponer un número entero, introducido por teclado, en sus factores primos.
Algoritmo descomponer
Var
entero: n,divisor
Inicio
escribir
( 'Introduzca un número')
Leer(n)
escribir( ' su descomposición en factores primos es: 1 ')
divisor<--- 2 mientras n > 1 hacer
Si n mod divisor = 0 entonces
escribir( divisor)
n<--- n div divisor
si_no
divisor<--- divisor + 1 fin_si
fin_mientras
escribir( )
fin_programa


4) Realizar un programa en winpascal, utilizando módulo(función) que determine el factorial de un número introducido por teclado. La asignación deben enviarla en una carpeta comprimida en winzip a la siguiente direccion de correo: migueltaipe65@yahoo.es a más tardar el día martes 27/67, en caso contrario, deben copiarla en un diskette y entregarla en el aula 121 ese mismo día.

Valor de la tarea 20 ptos(25 %).

Friday, May 12, 2006

Programación Estructurada

INTRODUCCION

La computadora automática debe su derecho a existir, su utilidad, precisamente a su capacidad de efectuar vastos cálculos que no pueden realizar los seres humanos. Deseamos que la computadora efectúe lo que nunca podríamos hacer nosotros, y la potencia de las maquinas actuales es tal, que inclusive los cálculos pequeños, por su tamaño, escapan al poder de nuestra imaginación limitada.
Sin embargo debemos organizar el calculo de manera tal que nuestros limitados poderes sean suficientes para asegurar que se establecerá el efecto deseado. Esta organización incluye la composición de los programas.
Los avances en la tecnología siempre van parejos con progresos en los lenguajes de programación y con nuevas ayudas para simplificar el uso del computador, con lo cual un numero mayor de usuarios se beneficia del. Pero la necesidad de hacer programas para resolver problemas específicos quizás nunca desaparecerá.


CONCEPTO DE PROGRAMACION ESTRUCTURADA

EL creciente empleo de los computadores ha conducido a buscar un abaratamiento del desarrollo des software, paralelo a la reducción del costo del hardware obtenido gracias a los avances tecnológicos. Los altos costos del mantenimiento de las aplicaciones en producción normal también han urgido la necesidad de mejorar la productividad del personal de programación.
En la década del sesenta salieron a la luz publica los principios de lo que más tarde se llamo Programación Estructurada, posteriormente se libero el conjunto de las llamadas "Técnicas para mejoramiento de la productividad en programación" (en ingles Improved Programming Technologies, abreviado IPTs), siendo la Programación Estructurada una de ellas.
Los programas computarizados pueden ser escritos con un alto grado de estructuración, lo cual les permite ser mas fácilmente comprensibles en actividades tales como pruebas, mantenimiento y modificación de los mismos. Mediante la programación Estructurada todas las bifurcaciones de control de un programa se encuentran estandarizadas, de forma tal que es posible leer la codificación del mismo desde su inicio hasta su terminación en forma continua, sin tener que saltar de un lugar a otro del programa siguiendo el rastro de la lógica establecida por el programador, como es la situación habitual con codificaciones desarrolladas bajo otras técnicas.
EN programación Estructurada los programadores deben profundizar mas que lo usual al procederá realizar el diseño original del programa, pero el resultado final es más fácil de leer y comprender, el objetivo de u programador profesional al escribir programas de una manera estructurada, es realizarlos utilizando solamente un numero de bifurcaciones de control estandarizados.
EL resultado de aplicar la sistemática y disciplinada manera de elaboración de programas establecida por la Programación Estructurada es una programación de alta precisión como nunca antes había sido lograda. Las pruebas de los programas, desarrollados utilizando este método, se acoplan mas rápidamente y el resultado final con programas que pueden ser leídos, mantenidos y modificados por otros programadores con mucho mayor facilidad.

DEFINICIONES

Programación Estructurada es una técnica en la cual la estructura de un programa, esto es, la interpelación de sus partes realiza tan claramente como es posible mediante el uso de tres estructuras lógicas de control:
Secuencia: Sucesión simple de dos o mas operaciones.
Selección: bifurcación condicional de una o mas operaciones.
Interacción: Repetición de una operación mientras se cumple una condición.
Estos tres tipos de estructuras lógicas de control pueden ser combinados para producir programas que manejen cualquier tarea de procesamiento de información.
Un programa estructurado esta compuesto de segmentos, los cuales puedan estar constituidos por unas pocas instrucciones o por una pagina o más de codificación. Cada segmento tiene solamente una entrada y una salida, estos segmentos, asumiendo que no poseen lazos infinitos y no tienen instrucciones que jamas se ejecuten, se denominan programas propios. Cuando varios programas propios se combinan utilizando las tres estructuras básicas de control mencionadas anteriormente, el resultado es también un programa propio.
La programación Estructurada esta basada en el Teorema de la Estructura, el cual establece que cualquier programa propio (un programa con una entrada y una salida exclusivamente) es equivalente a un programa que contiene solamente las estructuras lógicas mencionadas anteriormente.
Una característica importante en un programa estructurado es que puede ser leído en secuencia, desde el comienzo hasta el final sin perder la continuidad de la tarea que cumple el programa, lo contrario de lo que ocurre con otros estilos de programación. Esto es importante debido a que, es mucho más fácil comprender completamente el trabajo que realiza una función determinada, si todas las instrucciones que influyen en su acción están físicamente contiguas y encerradas por un bloque. La facilidad de lectura, de comienzo a fin, es una consecuencia de utilizar solamente tres estructuras de control y de eliminar la instrucción de desvío de flujo de control, excepto en circunstancias muy especiales tales como la simulación de una estructura lógica de control en un lenguaje de programación que no la posea.

VENTAJAS POTENCIALES
Un programa escrito de acuerdo a estos principios no solamente tendrá una estructura, sino también una excelente presentación.
Un programa escrito de esta forma tiende a ser mucho más fácil de comprender que programas escritos en otros estilos.
La facilidad de comprensión del contenido de un programa puede facilitar el chequeo de la codificación y reducir el tiempo de prueba y depuración de programas. Esto ultimo es cierto parcialmente, debido a que la programación estructurada concentra los errores en uno de los factores más generador de fallas en programación: la lógica.
Un programa que es fácil para leer y el cual esta compuesto de segmentos bien definidos tiende a ser simple, rápido y menos expuesto a mantenimiento. Estos beneficios derivan en parte del hecho que, aunque el programa tenga una extensión significativa, en documentación tiende siempre a estar al día, esto no suele suceder con los métodos convencionales de programación.
La programación estructurada ofrece estos beneficios, pero no se la debe considerar como una panacea ya que el desarrollo de programas es, principalmente, una tarea de dedicación, esfuerzo y creatividad.


TEOREMA DE LA ESTRUCTURA
El teorema de la estructura establece que un programa propio puede ser escrito utilizando solamente las siguientes estructuras lógicas de control: secuencia, selección e iteración.
Un programa de define como propio si cumple con los dos requerimientos siguientes:
Tiene exactamente una entrada y una salida para control del programa.
Existen caminos seguibles desde la entrada hasta la salida que conducen por cada parte del programa, es decir, no existen lazos infinitos ni instrucciones que no se ejecutan.
Las tres estructuras lógicas de control básicas, se definen de la siguiente forma:
Secuencia: es simplemente la formalización de la idea de que las instrucciones de un programa son ejecutadas en el mismo orden en que ellas aparecen en el programa. En términos de diagrama de flujo la secuencia es representada por una función después de la otra, como se muestra a continuación.

A y B pueden ser instrucciones sencillas hasta módulos completos, lo importante es que sean programas propios, independientemente de su tamaño o complejidad interna. Ay B deben ser programas propios en el sentido en que estos fueron definidos, es decir, que posean solamente una entrada y una salida; la combinación de A seguida por B es también un programa propio, ya que esta unión tiene una entrada y una salida exclusivamente, esto se muestra gráficamente en la figura siguiente:
Donde la caja externa sugiere que la combinación de A seguida de puede ser tratada como una unidad para propósitos de control.
Selección: Es la escogencia entre dos acciones tomando la decisión en base al resultado de evaluar un predicado. Esta estructura de control es denominada usualmente IFTHENELSE. La representación en forma de diagrama de flujo de esta estructura lógica de control se muestra a continuación:

Donde P es predicado y A y B son las dos funciones.
Iteración: Esta estructura lógica es utilizada para que se repita la ejecución de un conjunto de instrucciones mientras se cumpla una condición o predicado. Generalmente a esta estructura se le conoce como DOWHILE (hacer mientras) y su representación se muestra a continuación:

donde P es predicado y A es el modulo controlado.
Se debe comprender claramente que un rectángulo, que representa un modulo en un diagrama, siempre puede ser sustituido por cualquiera de las tres estructuras de control descritas anteriormente; por ejemplo, veamos el diagrama siguiente:
En él, la línea punteada limita un rectángulo que contiene una estructura, que a su vez controla dos módulos X y Y. La estructura limitada por la línea punteada es sustituida por una función quedando de la siguiente forma:
V
F

es decir, una función sustituye a una estructura lógica de control o viceversa.

OTRAS ESTRUCTURAS LOGICAS DE CONTROL

Aunque todos los programas pueden ser escritos utilizando solamente las tres estructuras de control descritas anteriormente, es algunas veces, conveniente utilizar algunas estructuras adicionales; a continuación se hará una descripción de esas formas lógicas de control diferentes a las ya definidas:
El Dountil: La estructuras de iteración básica es el DOWHILE, pero existe una estructura que es muy parecida a ella y que aveces es usada, dependiendo del proceso que se este tratando de representar y de las características apropiadas en el lenguaje con el cual se esta trabajando, esta forma de control es la que se llama DOUNTIL, cuya representación gráfica en forma de diagrama de flujo se muestra a continuación:




Donde A es el modulo controlado y P el predicado.
La diferencia entre el DOWHILE y el DOUNTIL es que en el primero el predicado es probado antes de ejecutar la función, si el predicado es falso la función no es ejecutada; mientras que en el segundo, el predicado es probado después de ejecutar la función, o sea, que la función siempre será ejecutada al menos una vez, independientemente si el predicado es cierto o falso.
La estructura CASE: Algunas veces resulta de gran ayuda, desde el punto de vista de eficiencias y facilidad de lectura de un programa, tener alguna forma de expresar una desviación del flujo de control hacia múltiples procesos en función del resultado de la evaluación de un predicado; usualmente, a la estructura de control que satisface el requerimiento anterior, se le denomina la estructura CASE. Por ejemplo, si es necesario ejecutar una de cien rutinas diferentes en función del valor de un código de 2 dígitos, podemos representar este proceso mediante 100 estructuras IF, sin embargo el sentido común nos induce a pensar que no hay razón para adherirnos rígidamente a las tres estructuras básicas de control y en lugar de 100 IF usaríamos la estructura CASE.
Esta estructura utiliza el valor de una variable para determinar cual, de varias rutinas, será ejecutada. La representación gráfica de esta estructura de control se muestra a continuación:

En cada lenguaje será necesario establecer cuales son las instrucciones que, en forma conveniente y eficiente, realizan funciones establecidas por las diferentes estructuras lógicas de control.

ETIQUETAS E INSTRUCCIÓN GOTO:
Ocasionalmente se habla de la programación estructurada como una técnica de programación que no utiliza GOTO(instrucción de desvío del flujo de control en forma incondicional); si bien es cierto que un programa bien estructurado tiene, o bien ninguna o muy pocas instrucciones GOTO, asumiendo que estamos empleando un lenguaje de programación adecuado, la ausencia de instrucciones GOTO puede ser mal interpretada. Es conveniente que aclaremos este aspecto en este momento.
Un programa bien estructurado gana una parte importante de su fácil comprensión del hecho que puede ser leído en forma secuencial sin desvíos en el flujo de control desde una parte del programa a otra. Esta característica es consecuencia de usar exclusivamente las estructuras lógicas de control estándar (el GOTO no es una de ellas), esta secuencialidad o lectura TOPDOWN es beneficiosa debido a que hay un limite definido para muchos detalles que la mente humana puede abarcar de una vez. Se hace relativamente fácil y rápida la comprensión de la tarea que realiza una instrucción si su función puede ser entendida en términos de unas pocas instrucciones mas, físicamente contiguas y delimitadas.
El problema con la instrucción GOTO es que generalmente aleja al programa realizado de los propósitos descritos y en casos extremos puede hacer que un programa sea esencialmente incomprensible.
No se requieren esfuerzos especiales para eliminar de un programa los GOTO, los cuales han sido, algunas veces, malentendidos como enemigos de la programación estructurada, existen buenas y fundadas razones para no querer usarlos pero no se necesita que se realice un trabajo arduo para eliminarlo; ellos no aparecerán, en general, cuando se utilicen las estructuras lógicas de control, descritas anteriormente. Naturalmente, si escogemos para programar un lenguaje de computación que no posea las estructuras lógicas de control fundamentales, entonces, tendremos que simularlas y seguramente ello implicara el uso de la instrucción GOTO; pero este uso puede hacerse en forma cuidadosamente controlada.
Existen situaciones poco comunes en las cuales el uso de GOTO puede tener ventajas comparado con otras maneras de expresar un proceso; estos casos son excepcionales y usualmente no ocurren en la programación realizada diariamente.
Se deben analizar cuidadosamente las consecuencias de emplear el GOTO, antes de su uso.

SEGMENTACION
Para la comprensión de un programa se haga en forma fácil y rápida es necesario que, al revisarlo, uno no tenga que hojear una gran cantidad de paginas para entender cuales el trabajo que realiza. Una regla practica para lograr estos fines es establecer que cada segmento del programa no exceda, en longitud, a una pagina de codificación, o sea, alrededor de 50 líneas (el significado que se asigna al termino segmento, en este trabajo, no tiene ninguna relación con su significado en relación a las funciones de sistemas operativos o sistemas maneadores de Bases de Datos).
La segmentación no es solamente particionar un programa en trozos cuya longitud sea de unas 50 líneas; esta técnica debe cumplir con ciertas características fundamentales:
La segmentación reflejara la división del programa en partes que se relacionen entre sí en forma jerárquica, formando una estructura de árbol. Esta organización puede ser representada gráficamente por un diagrama de procesos, lo que hace más sencillo comprender la relación existente entre un segmento y el resto del programa. Adicionalmente, podemos indicar que, el segmento en la cumbre de la estructura jerárquica contendrá las funciones de control de mas alto nivel, mientras que los segmentos inferiores en esta organización contendrán funciones detalladas.
Una segmentación bien diseñada deberá mostrar, claramente, las relaciones existentes entre las distintas funciones de manera que sea fácil comprender lo que debe hacer el programa y asegurar que efectivamente lo realice. Este hecho, garantizara que los cambios que se efectúen a una parte del programa, durante la programación original o su mantenimiento, no afecten al resto del programa que no ha sufrido cambios.
En una segmentación bien realizada la comunicación entre segmentos se lleva a cabo de una manera cuidadosamente controlada. Algunos autores recomiendan que los segmentos consistan en procedimientos y la única comunicación existente entre ellos sea a través de una lista de parámetros, esto reduce la oportunidad de que interactuen entre ellos de una manera indeseada e inentendible.

IDENTACION
El uso de la identacion es importante debido a que, cuando se es consistente en su utilización, facilita la lectura del programa al mostrar en una forma gráfica las relaciones existentes entre las distintas instrucciones.
La identacion puede ser de gran beneficio, tal como se muestra continuación, donde ambos programas realizan la misma función, pero el de la derecha es más fácil de comprender, verificar y corregir.

DIRECTRICES PAR IDENTAR
Debe comprenderse claramente que las líneas siguientes solo pretenden presentar unas directrices de identacion, sin pretender que estas sean las únicas reglas a seguir en este proceso, cada centro de procesamiento deberá establecer sus propias convenciones, sin que sea motivo de preocupación la diferencia respecto a las sugerencias dadas aquí, lo importante es que se establezcan unas normas y se cumplan de manera consistente.
Las siguientes son sugerencias para el desarrollo de una política de identacion en un centro de procesamiento, la idea fundamental es ayudar a que el lector de un programa le sea fácil comprender las relaciones y las funciones existentes en él:
En los lenguajes donde se permite el uso de etiquetas, estas deben colocarse lo más externas posibles, por ejemplo comenzando en la columna 2, y deben estar separadas por una línea (siempre que lo permita el lenguaje en uso).
Se obtiene consistencia si todas las instrucciones se comienzan en una misma columna, por ejemplo en la columna 4 o cualquier otra ubicada a su derecha.
En los lenguajes en que se hagan declaraciones sobre las variables a utilizar, la información quedara mas claramente representada si los atributos declarados se alinean en forma vertical.
El uso de lineas en blanco ayuda a mostrar con mas claridad las relaciones existentes entre distintos ítems agrupados en las declaraciones
Las instrucciones son mucho mas fáciles de localizar y de cambiar si no se escribe mas de una instrucción por línea.
La vision de control de las estructuras lógicas o de los bloques se clarifica si las instrucciones controladas son idénticas por alguna cantidad constante. Se sugiere una identacion de tres espacios.

VENTAJAS DE LA PROGRAMACION ESTRUCTURADA
Con la programación estructurada elaborar programas de computador sigue siendo un albor que demanda esfuerzo, creatividad, habilidad y cuidado. Sin embargo, con este nuevo estilo podemos obtener las siguientes ventajas:
- Los programas son más fáciles de entender. Un programa estructurado puede ser leído en secuencia, de arriba hacia abajo, sin necesidad de estar saltando de un sitio a otro en la lógica, lo cual es típico de otros estilos de programación. La estructura del programa es mas clara puesto que las instrucciones están mas ligadas o relacionadas entre sí, por lo que es más fácil comprender lo que hace cada función.
Reducción del esfuerzo en las pruebas. El programa se puede tener listo para producción normal en un tiempo menor del tradicional; por otro lado, el seguimiento de las fallas("debugging") se facilita debido a la lógica más visible, de tal forma que los errores se pueden detectar y corregir mas fácilmente.
Reducción de los costos de mantenimiento.
Programas más sencillos y más rápidos
Aumento de la productividad del programador
Se facilita la utilización de las otras técnicas para el mejoramiento de la productividad en programación
Los programas quedan mejor documentados internamente.

Thursday, May 04, 2006

TECNICAS DE PROGRAMACIÓN

1.1 Introducción
Los sistemas modernos de computación consisten en una gran conjunción de elementos de circuitos (hardware) y de programación (software) que han sido diseñados para proporcionar a la computación un ambiente productivo y hasta cierta medida agradable.
El término Sistema de Cómputo se utiliza para señalar lo que el usuario emplea, en lugar del término Computadora. En los primeros años de la computación, los usuarios del sistema debían interactuar más estrechamente con el hardware real que lo que es hoy necesario, muchas funciones que debían realizar los usuarios mismos se manejan ahora por software mediante Sistemas Operativos. El sistema operativo crea un ambiente en el cual los usuarios pueden preparar programas y ejecutarlos sin tener que entrar en los detalles del hardware del sistema.
Para satisfacer el crecimiento de la demanda de medios de computación, es que se ha desarrollado la multiprogramación, en la cual varios usuarios emplean el sistema de forma simultánea, como Windows por ejemplo.
Un término fundamental de esta materia es el Programa, el cual es simplemente una secuencia de instrucciones que orienta a la Unidad de Control de Procesamiento (CPU) en el desarrollo de los cálculos, el cual debe expresarse de forma que sea entendido por el CPU. Un CPU sólo puede entender instrucciones que estén expresadas en términos de su lenguaje máquina, pero esto se explicará más adelante.
1.2 Definición de Lenguaje de Programación
Un Lenguaje de Programación es aquél que es utilizado para escribir programas de computadoras que puedan ser entendidos por ellas. Estos lenguajes se clasifican en tres grandes categorías :
Lenguaje Máquina
Lenguaje de Bajo nivel (ensamblador)
Lenguaje de Alto nivel.

1.3 Definición de algoritmo
"Un algoritmo se define como un método que se realiza paso a paso para solucionar un problema que termina en un número finito de pasos".
Las características fundamentales que debe cumplir todo algoritmo son :
Debe ser preciso. e indicar el orden de realización de cada paso.

Debe ser definido. Si se sigue un algoritmo dos veces, se debe obtener el mismo resultado cada vez.

Debe ser finito. Si se sigue un algoritmo, se debe terminar en algún momento ; o sea debe tener un número finito de pasos.
La definición de un algoritmo debe describir tres partes : Entrada, Proceso y Salida.
1.4 Algoritmos Cotidianos
Se refiere a todos aquéllos algoritmos que nos ayudan a resolver problemas diarios, y que los hacemos casi sin darnos cuenta de que estamos siguiendo una metodología para resolverlos.


Algunos ejemplos son :
Diseñar un algoritmo para cambiar una llanta a un coche.
Inicio.
Traer gato.
Levantar el coche con el gato.
Aflojar tornillos de las llantas.
Sacar los tornillos de las llantas.
Quitar la llanta.
Poner la llanta de repuesto.
Poner los tornillos.
Apretar los tornillos.
Bajar el gato.
Fin
Un cliente ejecuta un pedido a una fábrica. La fábrica examina en su banco de datos la ficha del cliente, si el cliente es solvente entonces la empresa acepta el pedido, en caso contrario rechazar el pedido.
Pasos del algoritmo :
Inicio
Leer el pedido
Examinar ficha del cliente
Si el cliente es solvente aceptar pedido, en caso contrario rechazar pedido
Fin
Determinar el mayor de tres números enteros.
Pasos del algoritmo :
1.- Comparar el primero y el segundo entero, deduciendo cuál es el mayor.
2.- Comparar el mayor anterior con el tercero y deducir cuál es el mayor. Este será el resultado.
Los pasos anteriores se pueden descomponer en otros pasos más simples en los que se denomina refinamiento del algoritmo.

1.- Obtener el primer número (entrada), denominado NUM1
2.- Obtener el segundo número (entrada), denominado NUM2
3.- Compara NUM1 con NUM2 y seleccionar el mayor ; si los dos enteros son iguales, seleccionar NUM1. Llamar a este número MAYOR.
4.- Obtener el tercer número (entrada), y se denomina NUM3.
5.- Compara MAYOR con NUM3 y seleccionar el mayor ; si los dos enteros son iguales, seleccionar el MAYOR. Denominar a este número MAYOR.
6.- Presentar el valor MAYOR (salida).
7.- Fin
1.5 Definición de Lenguajes Algorítmicos
Los algoritmos pueden describirse utilizando diversos lenguajes. Cada uno de estos lenguajes permiten describir los pasos con mayor o menor detalle.
La clasificación de los lenguajes para algoritmos puede enunciarse de la siguiente manera :
Lenguaje Natural.
Lenguaje de Diagrama de Flujo.
Lenguaje Natural de Programación.
Lenguaje de Programación de Algoritmos.
Lenguaje Natural
Es aquél que describe en español, para nuestro caso, los pasos a seguir utilizando un vocabulario cotidiano. Se le conoce como lenguaje jerga cuando se utilizan términos especializados de una determinada ciencia, profesión o grupo.
Lenguaje de Diagrama de Flujo
Es aquél que se vale de diversos símbolos para representar las ideas o acciones a desarrollar. Es útil para organizar las acciones o pasos de un algoritmo pero requiere de etapas posteriores para implementarse en un sistema de cómputo.
Lenguaje Natural de Programación
Son aquéllos que están orientados a la solución de problemas que se definen de una manera precisa. Generalmente son aplicados para la elaboración de fórmulas o métodos científicos.
Tiene las siguientes características :
Evita la ambigüedad (algo confuso que se puede interpretar de varias maneras).
Son precisos y bien definidos.
Utilizan términos familiares al sentido común.
Elimina instrucciones innecesarias.
Lenguaje de Programación de Algoritmos
Es aquél que se utiliza para introducir en la computadora un algoritmo específico. Se les conoce también como Lenguaje de Programación.
Lenguaje de Programación :
Es un conjunto de palabras, símbolos y reglas sintácticas mediante los cuales puede indicarse a la computadora los pasos a seguir para resolver un problema.
Los lenguajes de programación pueden clasificarse por diversos criterios, siendo el más común su nivel de semejanza con el lenguaje natural, y su capacidad de manejo de niveles internos de la máquina.


Los principales tipos de lenguajes utilizados son tres :
Lenguaje Máquina.
Lenguaje de bajo Nivel (ensamblador).
Lenguajes de Alto Nivel.
Lenguaje Máquina
Son aquéllos que están escritos en lenguajes directamente inteligibles por la máquina (computadora), ya que sus instrucciones son cadenas binarias (cadenas o series de caracteres de dígitos 0 y 1) que especifican una operación y las posiciones (dirección) de memoria implicadas en la operación se denominan instrucciones de máquina o código máquina. El código máquina es el conocido código binario.
Las instrucciones en lenguaje máquina dependen del hardware de la computadora y, por tanto, diferirán de una computadora a otra.
Ventajas del Lenguaje Máquina
Posibilidad de cargar (transferir un programa a la memoria) sin necesidad de traducción posterior, lo que supone una velocidad de ejecución superior a cualquier otro lenguaje de programación.
Desventajas del Lenguaje Máquina
Dificultad y lentitud en la codificación.
Poca fiabilidad.
Gran dificultad para verificar y poner a punto los programas.
Los programas solo son ejecutables en el mismo procesador (CPU).
En la actualidad, las desventajas superan a las ventajas, lo que hace prácticamente no recomendables a los lenguajes máquinas.
Lenguajes de Bajo Nivel
Son más fáciles de utilizar que los lenguajes máquina, pero al igual que ellos, dependen de la máquina en particular. El lenguaje de bajo nivel por excelencia es el ensamblador. Las instrucciones en lenguaje ensamblador son instrucciones conocidas como nemotécnicos. Por ejemplo, nemotécnicos típicos de operaciones aritméticas son : en inglés : ADD, SUB, DIV, etc. ; en español : SUM, RES, DIV, etc.
Una instrucción típica de suma sería :
ADD M, N, P
Esta instrucción significa "sumar el contenido en la posición de memoria M al número almacenado en la posición de memoria N y situar el resultado en la posición de memoria P" . Evidentemente es más sencillo recordar la instrucción anterior con un nemotécnico que su equivalente en código máquina.
0110 1001 1010 1011
Un programa escrito en lenguaje ensamblador, requiere de una fase de traducción al lenguaje máquina para poder ser ejecutado directamente por la computadora.
El programa original escrito en lenguaje ensamblador se denomina programa fuente y el programa traducido en lenguaje máquina se conoce como programa objeto, el cual ya es directamente entendible por la computadora.
Ventajas del lenguaje ensamblador frente al lenguaje máquina
Mayor facilidad de codificación y, en general, su velocidad de cálculo.
Desventajas del lenguaje ensamblador
Dependencia total de la máquina lo que impide la transportabilidad de los programas (posibilidad de ejecutar un programa en diferentes máquinas. El lenguaje ensamblador del PC es distinto del lenguaje ensamblador del Apple Machintosh.
La formación de los programadores es más compleja que la correspondiente a los programadores de alto nivel, ya que exige no solo las técnicas de programación, sino también el conocimiento del interior de la máquina.
Los lenguajes ensamblador tienen sus aplicaciones muy reducidas, se centran básicamente en aplicaciones de tiempo real, control de procesos y de dispositivos electrónicos.
Lenguajes de Alto Nivel
Estos lenguajes son los más utilizados por los programadores. Están diseñados para que las personas escriban y entiendan los programas de un modo mucho más fácil que los lenguajes máquina y ensambladores. Un programa escrito en lenguaje de alto nivel es independiente de la máquina (las instrucciones no dependen del diseño del hardware o de una computadora en particular), por lo que estos programas son portables o transportables. Los programas escritos en lenguaje de alto nivel pueden ser ejecutados con poca o ninguna modificación en diferentes tipos de computadoras.
Ventajas de los lenguajes de alto nivel
El tiempo de formación de los programadores es relativamente corto comparado con otros lenguajes.
La escritura de programas se basa en reglas sintácticas similares a los lenguajes humanos. Nombres de las instrucciones tales como READ, WRITE, PRINT, OPEN, etc.
Las modificaciones y puestas a punto de los programas son más fáciles.
Reducción del coste de los programas.
Transportabilidad.
Desventajas de los lenguajes de alto nivel
Incremento del tiempo de puesta a punto al necesitarse diferentes traducciones del programa fuente para conseguir el programa definitivo.
No se aprovechan los recursos internos de la máquina que se explotan mucho mejor en lenguajes máquina y ensambladores.
Aumento de la ocupación de memoria.
El tiempo de ejecución de los programas es mucho mayor.
Para una mejor compresión de este tema se definirá el concepto de programa, por ser este un término muy utilizado en el diseño estructurado de algoritmos.
Programa : Es un conjunto de instrucciones escritas en un lenguaje de programación que indican a la computadora la secuencia de pasos para resolver un problema.
1.6 Historia y Aplicación de los Lenguajes Algorítmicos
Al igual que los idiomas sirven de vehículo de comunicación entre los seres humanos, existen lenguajes que realizan la comunicación entre los seres humanos y las computadoras. Estos lenguajes permiten expresar los programas o el conjunto de instrucciones que el operador humano desea que la computadora ejecute.

Los lenguajes de computadoras toman diferentes formas; los de las primeras computadoras, como la ENIAC y la EDSAC, se componían en el lenguaje real de las máquinas mismas. La dificultad de programar las máquinas de esta manera limitaba drásticamente su utilidad y proporcionaba un fuerte incentivo para que se desarrollaran lenguajes de programación más orientados hacia la expresión de soluciones con la notación de los problemas mismos.
Los primeros lenguajes de programación se conocieron como Lenguajes Ensambladores, un ejemplo es: TRANSCODE, desarrollado para la computadora FERUT. En los lenguajes ensambladores se define un código especial llamado mnemónico para cada una de las operaciones de la máquina y se introduce una notación especial para especificar el dato con el cual debe realizarse la operación.
A mediados de los años 60’s aparecieron los primeros lenguajes de propósito general como FORTRAN, FORTRAN IV, ALGOL, COBOL, BASIC, PL/I, ADA, C,C++, PASCAL, etc. pero el desarrollo de nuevas tecnologías, tanto en arquitectura de computadoras como en lenguajes de programación, continúa a paso acelerado, cada vez con mayor velocidad, el panorama está cambiando de una etapa de sistemas y lenguajes especialmente desarrollados para aplicaciones individuales. Los lenguajes de programación actuales son los conocidos como Lenguajes visuales, como por ejemplo Visual Fox, Visual Basic, Visual C .
" METODOLOGIA PARA LA SOLUCION DE PROBLEMAS POR MEDIO DE COMPUTADORAS "
A fin de resolver un problema utilizando sistemas de cómputo, debe seguirse una serie de pasos que permiten avanzar por etapas bien definidas hacia la solución.
Estas etapas son las siguientes :
Definición del problema.
Análisis de los datos.
Diseño de la solución.
Codificación.
Prueba y depuración.
Documentación.
Mantenimiento.
2.1 Definición del problema
Está dada en sí por el enunciado del problema, el cual debe ser claro y complejo. Es importante que conozcamos exactamente "que se desea obtener al final del proceso" ; mientras esto no se comprenda no puede pasarse a la siguiente etapa.
2.2 Análisis de los datos
Para poder definir con precisión el problema se requiere que las especificaciones de entrada y salida sean descritas con detalle ya que esto es un requisito para lograr una solución eficaz.
Una vez que el problema ha sido definido y comprendido, deben analizarse los siguientes aspectos :
Los resultados esperados.
Los datos de entrada disponibles.
Herramientas a nuestro alcance para manipular los datos y alcanzar un resultado (fórmulas, tablas, accesorios diversos).
Una medida aconsejable para facilitar esta etapa consiste en colocarnos en lugar de la computadora deduciendo los elementos que necesitaremos para alcanzar el resultado.

Ejemplo 2.1
Leer el radio de un círculo y calcular e imprimir su superficie y circunferencia.
Análisis
Las entradas de datos en este problema se concentran en el radio del círculo. Dado que el radio puede tomar cualquier valor dentro del rango de los números reales, el tipo de datos radio debe ser real.
Las salidas serán dos variables : superficie y circunferencia que también serán de tio real.
Entradas : Radio del círculo (variable RADIO).
Salidas : Superficie del círculo (variable AREA).
Circunferencia del círculo (variable CIRCUNFERENCIA).
Variables : RADIO, AREA, CIRCUNFERENCIA tipo real.
2.3 Diseño de la solución
Una computadora no tiene capacidad para solucionar problemas más que cuando se le proporcionan los sucesivos pasos a realizar, esto se refiere a la obtención de un algoritmo que resuelva adecuadamente el problema. En caso de obtenerse varios algoritmos, seleccionar uno de ellos utilizando criterios ya conocidos.
Esta etapa incluye la descripción del algoritmo resultante en un lenguaje natural, de diagrama de flujo o natural de programación.
Como puede verse, solo se establece la metodología para alcanzar la solución en forma conceptual, es decir ; sin alcanzar la implementación en el sistema de cómputo.
De acuerdo al ejemplo 2.1 tenemos que la información proporcionada constituye su entrada y la información producida por el algoritmo constituye su salida. Los problemas complejos se pueden resolver más eficazmente por la computadora cuando se dividen en subproblemas que sean más fácil de solucionar.
El problema de cálculo de la longitud y superficie de un círculo se puede descomponer en subproblemas más simples :
Leer datos de entrada.
Calcular superficie y longitud.
Escribir resultados (datos de salida).
2.4 Codificación
Se refiere a la obtención de un programa definitivo que pueda ser comprensible para la máquina. Incluye una etapa que se reconoce como compilación.
Si la codificación original se realizó en papel, previo a la compilación deberá existir un paso conocido como transcripción.


Programa Fuente
Esta escrito en un lenguaje de programación. (pascal, C++,Visual Fox, Visual Basic, etc).
Es entendible por el programador.
Programa Ejecutable
Está en lenguaje máquina.
Entendible por la máquina.
2.5 Prueba y depuración
Una vez que se ha obtenido el programa ejecutable, este es sometido a prueba a fin de determinar si resuelve o no el problema planteado en forma satisfactoria.
Las pruebas que se le aplican son de diversa índole y generalmente dependen del tipo de problema que se está resolviendo. Comúnmente se inicia la prueba de un programa introduciendo datos válidos, inválidos e incongruentes y observando como reacciona en cada ocasión.
El proceso de depuración consiste en localizar los errores y corregirlos en caso de que estos existan. Si no existen errores, puede entenderse la depuración como una etapa de refinamiento en la que se ajustan detalles para optimizar el desempeño del programa.
2.6 Documentación
Debido a que el programa resultante en esta etapa se encuentra totalmente depurado (sin errores), se procede a la utilización para resolver problemas del tipo que dió origen a su diseño.
En vista de que esta utilización no podrá ser supervizada en todas las ocasiones por el programador, debe crearse un manual o guía de operación que indique los pasos a seguir para utilizar el programa.
2.7 Mantenimiento
Se refiere a las actualizaciones que deban aplicarse al programa cuando las circunstancias así lo requieran. Este programa deberá ser susceptible de ser modificado para adecuarlo a nuevas condiciones de operación.
Cualquier actualización o cambio en el programa deberá reflejarse en su documentación.
3.1 Tipos de Datos
Un dato se define como la expresión general que describe los objetos con los cuales opera una computadora. Los datos de entrada se transforman por el programa, después de las etapas intermedias, en datos de salida.
Los datos se clasifican en diversas categorías, según el tipo de máquina o del lenguaje en uso. Generalmente podemos encontrar las siguientes categorías :
Numéricos
Lógicos
Cadenas
Datos Numéricos
Son aquéllos que representan una cantidad o valor determinado. Su representación se lleva a cabo en los formatos ya conocidos (enteros, punto y fracciones decimales si estas existen).
Estos pueden representarse en dos formas distintas :
Tipo Numérico Entero (integer).
Tipo Numérico Real (real).
Enteros
Es un conjunto finito de los números enteros. Los enteros son números completos, no tienen componentes fraccionarios o decimales y pueden ser negativos y positivos.
Algunos ejemplos son :
3 7
-10 9
15.25
50
Reales
Consiste en un subconjunto de los números reales. Estos números siempre tienen un punto decimal y pueden ser positivos o negativos. Un número real consiste de un número entero y una parte decimal. Algunos ejemplos son :
0.52 664.32
6.579 8.0
-9.3 -47.23
Cadenas
Son los datos que representan información textual (palabras, frases, símbolos, etc). No representan valor alguno para efectos numéricos. Pueden distinguirse porque son delimitados por apóstrofes o comillas.
Se clasifica en dos categorías :
Datos tipo carácter (char)
Datos tipo Cadena (string)
Datos Tipo Carácter
Es un conjunto finito y ordenado de caracteres que la computadora reconoce. Un dato de este tipo contiene solo un carácter.
Reconoce los siguientes caracteres :
Caracteres Alfabéticos (A,B,C,…Z,a,b,c…z)
Caracteres Numéricos (0,1,2,…9)
Caracteres Especiales (+, -, *, /, ^, . , ;, <, >, $, …….)
Datos Tipo Cadena (string)
Es un sucesión de caracteres que se encuentran delimitados por una comilla (apóstrofe) o dobles comillas, según el tipo de lenguaje de programación. La longitud de una cadena de caracteres es el número de ellos comprendidos entre los separadores o delimitadores.
Ejemplos :
‘Hola Mortimer’
’12 de octubre de 1496’
‘Enunciado cualquiera’
Nota: Los símbolos disponibles para la formulación de caracteres y de cadenas son aquéllos que se encuentran en el cóodigo ASCII.
ASCII (American Standard Code for Information Interchange).
Lógicos
También se le denomina Booleano, es aquél dato que solo puede tomar uno de dos valores : Falso y verdadero.
Se utiliza para representar las alternativas (si/no) a determinadas condiciones. Por ejemplo, cuando se pide si un valor entero sea primo, la respuesta será verdadera o falsa, según sea.
Las categorías y tipos que se mencionaron anteriormente se conocen como Tipos Simples, puesto que no poseen una estructura compleja.
En forma adicional, cada lenguaje puede proporcionar la utilización de Tipos Compuestos, siendo estos, datos que tienen una estructura predeterminada.
Tipos Compuestos
Entre los principales tipos compuestos se encuentran los siguientes:
a.- SUBRANGO : Son aquéllos en los que se especifíca con precisión el intervalo de valores válidos para un dato.
Ejemplos:
0..100 (son enumerativos de tipo entero)
'A'..'Z' (son enumerativos de tipo cadena)
Los Reales no son válidos para crear enumerativos, ya que su intervalo no está definido.

b.- ENUMERATIVOS : Son aquéllos en los que se definen individualmente los valores para un dato.
Ejemplos:
(0,25,40,52) Siempre deben ponerse netre paréntesis.
c.- DEFINIDOS POR EL USUARIO : Son aquéllos que el programador crea para satisfacer las necesidades del programa en diseño.
Constantes y variables
Una Constante es aquélla que no cambia de valor durante la ejecución de un programa (o comprobación de un algoritmo en este caso). Se representa en la forma descrita para cada categoría.
Las Variables son aquéllas que pueden modificar su valor durante la ejecución de un programa (idem).
Su representación se da a traves de letras y símbolos generalmente numéricos a los que se les asigna un valor.
Ejemplos:

Constantes
Variables
Numéricos
36
450.35
0.58
A
Nom
Edad
Ciudad
Estatura

Cadena
'A'
'Juan'
'La Paz'
Lógicos
Falso
Verdadero
3.2 Operadores y Operandos
Operadores
Un operador es el símbolo que determina el tipo de operación o relación que habrá de establecerse entre los operandos para alcanzar un resultado.



Los operadores se clasifican en tres grupos:
Aritméticos.
Relacionales.
Lógicos.
1.- Operadores Aritméticos
Son aquéllos que permiten la realización de cálculos aritméticos. Utilizan operandos numéricos y proporcionan resultados numéricos.
Operador
Operación
+
Suma
-
Resta
*
Multiplicación
/
División real
Div
División entera
Mod
Residuo
^
Exponenciación
Ejemplos:
7+3 = 10 10 Div 4 = 2
7-3 = 4 20 Mod 3 = 2
7*3 = 21 5 Mod 7 = 5
10/4= 2.5 4 ^ 2 = 16
En la expresión 7+3, los valores 7 y 3 se denominan operandos. El valor de la expresión 7+3 se conoce como resultado de la expresión.
Todos los operadores aritméticos no existen en todos los lenguajes de programación, por ejemplo, en Fortran no existen Div y mod.
Operadores Div y Mod
El símbolo / se utiliza para la división real, y el operador Div representa la división entera.
Expresión
Resultado
Expresión
Resultado
10.5/3.0
3.5
10 Div 3
3
1/4
0.25
18 Div 2
9
2.0/4.0
0.5
30 Div 30
1
30/30
1.0
10 Mod 3
1
6/8
0.75
10 Mod 2
0

Operadores Relacionales
Permiten realizar comparaciones de valores de tipo numérico o carácter. Estos operadores sirven para expresar las condiciones en los algoritmos. Proporcionan resultados lógicos.

Operador
Significado
<>
Mayor que
=
Igual que
<= Menor o igual que >=
Mayor o igual que
<>
Diferente de
El formato general para las comparaciones es:
expresión1 operador de relación expresión2
El resultado de la operación será Verdadero o Falso. Así por ejemplo, si A=4 y B=3, entonces:
A>B Es Verdadero
(A-2) < (B-4) Es Falso Los operadores de relación se pueden aplicar a cualquiera de los cuatro tipos de datos estándar: enteros, real, lógico y carácter. ‘A’ < ‘K’ = Verdadero ‘A’ > ‘a’ = Falso
‘MARIA’ < ‘JUAN’ = Falso (se considera la primera letra) ‘JAIME’ > ‘JORGE’ = Falso
Nota: La comparación de cadenas se rige por el código ASCII.





Prioridad De Operadores Aritméticos y Relacionales
Determina el orden en que habrán de realizarse las operaciones en una expresión determinada. Para obtener la prioridad se deben conocer las siguientes reglas:
Las operaciones que están encerradas entre paréntesis se evalúan primero. Si existen diferentes paréntesis anidados (interiores unos a otros), las expresiones más internas se evalúan primero.

Las operaciones aritméticas dentro de una expresión suelen seguir el siguiente orden de prioridad.

Operador
Prioridad
^
Alta
*, /, Div

+, -, Mod
Relacionales
Baja
En caso de coincidir varios operadores de igual prioridad en una expresión o subexpresión encerrada entre paréntesis, el orden de prioridad en este caso es de izquierda a derecha.
Cuando se desea realizar una operación con baja prioridad por adelantado, debe agruparse a los operandos involucrados.
4 + 12 /2 = 10 (sin agrupar)
(4 + 12) /2 = 8 (con agrupador)
Ejemplo:
Obtener los resultados de las expresiones:
-4 * 7 + 2 ^ 3 / 4 - 5
Solución:
-4 *7 + 2 ^ ¾
Resulta:
-4 * 7+ 8/4 -5
-28 + 8/4 -5
-28 + 2 - 5
-26 - 5
-31

Los paréntesis tienen prioridad sobre el resto de las operaciones.
A * (B+3) La constante 3 se suma primero al valor de B, después este resultado se multiplica por el valor de A.
(A*B) +3 A y B Se multiplican primero y a continuación se suma 3.
A + (B/C) + D Esta expresión equivale a A+ B/C + D
Operadores Lógicos
Son aquéllos que permiten la combinación de condiciones para formar una sola expresión lógica. Utilizan operandos lógicos y proporcionan resultados lógicos también.

Operador
Relación
not
Negación (No)
and
Conjunción (Y)
or
Disyunción (O)
xor
Disyunción Exclusiva (O/SOLO)

Se obtiene Verdadero si:

NOT
El operando es falso

AND
Ambos operandos son verdaderos

OR
Al menos un operando es verdadero

XOR
Solo uno de los operandos son verdadero

X
Y
NOT(X)
NOT(Y)
X AND Y
X OR Y
X XOR Y
F
F
V
V
F
F
F
V
F
F
V
F
V
V
F
V
V
F
F
V
V
V
V
F
F
V
V
F

Prioridad De Los Operadores Lógicos
Los operadores aritméticos seguían un orden específico o de prioridad cuando existían más de un operador en las expresiones. De modo similar los operadores lógicos y relacionales tienen un orden de prioridad.
Ejemplos:
Not 4 > 6 Produce un error, ya que el operador not se aplica a 4.
Not (4 > 14) Produce un valor verdadero.
(1.0 6
Tras ejecutar las operaciones anteriores, las variables M,N,P toman los valores, falso, verdadero, verdadero respectivamente.
Asignación de caracteres
La operaciómn que se evalúa es de tipo caracter.
x '3 de Mayo de 1999'
La acción de asignación anterior asigna la cadena de caracteres '3 de Mayo de 1999' a la variable de tipo carácter x.
Entrada y Salida de Información
Los cálculos que realizan las computadoras requieren para ser útiles la Entrada de los datos necesarios para ejecutar las operaciones que posteriormente se convertirán en resultados, es decir, Salida.
Las operaciones de entrada permiten leer determinados valores y asignarlos a determinadas variables. Esta entrada se conoce como operación de Lectura (read). Los datos de entrada se introducen al procesador mediante dispositivos de entrada (teclado, unidades de disco, etc). La salida puede aparecer en un dispositivo de salida (pantalla, impresora, etc). La operación de salida se denomina escritura (write).
En la escritura de algoritmos las acciones de lectura y escritura se representan por los formatos siguientes
leer ( Nom_variable )
escribir (lista de variables de salida)



Ejemplo: Obtener área de un triángulo.
Entrada
· Fórmula (A= B*h/2)
· Datos (Base, altura)
Proceso
· Multiplicar Base y altura.
· Dividir resultado de la multiplicación anterior entre dos.
· Mostrar resultado de división anterior.
Salida
· Area del triángulo.

Algoritmo
Inicio
leer(B)
leer(h)
x B*h
A x/2
escribir(A)
Fin
3.3 Expresiones
Las expresiones son combinaciones de constantes, variables, símbolos de operadores, paréntesis y nombres de funciones especiales. Las mismas ideas son utilizadas en notación matemática tradicional ; por ejemplo :
a + b ( b+2) Aquí los paréntesis indican el orden de cálculo.
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 objetos que manipulan, las expresiones se clasifican en :
Aritméticas
Relacionales
Lógicas
Carácter

El resultado de la expresión numérica es de tipo numérico ; el resultado de una expresión relacional y de una expresión lógica es de tipo lógico ; el resultado de una expresión carácter es de tipo carácter.
1.- Expresiones Aritméticas
Las expresiones aritméticas son análogas a las fórmulas matemáticas. Las variables y constantes son numéricas (real o entera) y las operaciones son las aritméticas.

+
suma
-
resta
*
multiplicación
/
división
**, ^
exponenciación
div
división entera
mod
módulo (resto)

Los cálculos que implican tipos de datos reales y enteros suelen dar normalmente resultados del mismo tipo si los operandos lo son también. Por ejemplo, el producto de operandos reales produce un real.
Ejemplo :
4 x 6 se representa por 4 * 6
39 se representa por 3 ^ 9
18 div 6 se representa por 18/6
2.- Expresiones Lógicas (booleanas)
Es una expresión que solo pueden tomar los valores de : verdadero y falso. Las expresiones lógicas se forman combinando constantes lógicas, variables lógicas y otras expresiones y otras expresiones lógicas utilizando los operadores lógicos not, and y or, y los operadores relacionales (de relación o comparación) =, >, <, <=, >=, <>.
"TECNICAS DE DISEÑO"
Con el objeto de facilitar el diseño de algoritmos y la organización de los diversos elementos de los que se componen se utilizan algunas técnicas que muestran una metodología a seguir para resolver los problemas. Estas técnicas hacen que los programas sean más fáciles de escribir, verificar, leer y mantener.
Algunas de las técnicas más conocidas son :
Top Down (diseño descendente)
Botton Up
Warnier Orr
4.1 Top Down
Es una técnica para diseñar que consiste en tomar el problema en forma inicial como una cuestión global y descomponerlo sucesivamente en problemas más pequeños y por lo tanto, de solución más sencilla.
La descomposición del problema original (y de las etapas subsecuentes), puede detenerse cuando los problemas resultantes alcanzan un nivel de detalle que el programador o analista pueden implementar fácilmente.
El problema se descompone en etapas o estructuras jerárquicas, de modo que se puede considerar cada estructura como dos puntos de vista : lo que hace?, y cómo lo hace ?. Si se considera un nivel n de refinamiento, las estructuras se consideran de la siguiente forma :
nivel n : Vista desde el exterior.
"lo que hace ?"
Nivel n+1 : Vista desde el interior.
"cómo lo hace ?"
Ejemplo de un diseño descendente (top-down ) de un control de almacén :

4.2 Botton Up
Esta técnica consiste en partir de los detalles más precisos del algoritmo completando suscesivamente módulos de mayor complejidad, se recomienda cuando ya se cuenta con experiencia y ya se sabe lo que se va a hacer.
Conforme se va alcanzando el desarrollo de módulos más grandes se plantea como objetivo final la resolución global del problema.
Este método es el inverso del anterior y es recomendable cuando se tiene un modelo a seguir o se cuenta con amplia experiencia en la resolución de problemas semejantes.
La técnica de Botton Up es frecuentemente utilizada para la realización de pruebas a sistemas ya concluidos.
4.3 Warnier Orr
Es una técnica que utiliza una representación semejante a la de cuadros sinópticos para mostrar el funcionamiento y organización de los elementos que conforman el algoritmo.
Básicamente, utiliza una notación de llaves para organizar los módulos y se auxilia en la siguiente simbología para indicar operaciones de control.
Símbolo
Significado
+
OR (uno, otro o varios)
XOR (uno u otro, solo uno)
(x,y)
puede hacerse tantas veces desde x hasta y
Nota : Los diagramas Warnier Orr se leen de izquierda a derecha y de arriba hacia abajo.








Ejemplo de un diagrama de Warnier Orr, de un control de almacén
(0,n) = De cero veces a n veces
(1,n) = De una vez a n veces

"TENICAS PARA LA FORMULACION DE ALGORITMOS"
Las técnicas analizadas en la unidad anterior permiten un diseño global del algoritmo, pero ocasionalmente pueden desatender detalles específicos de este.
Las tres técnicas de formulación de algoritmos más populares son :
Diagrama de flujo
Pseudocódigo
Diagramas estructurados
5.1 Diagramas de Flujo
Se basan en la utilización de diversos símbolos para representar operaciones específicas. Se les llama diagramas de flujo porque los símbolos utilizados se conectan por medio de flechas para indicar la secuencia de operación.
La simbología utilizada para la elaboración de diagramas de flujo es variable y debe ajustarse a un patrón definido previamente.
SIMBOLOGIA UTILIZADA EN LOS DIAGRAMAS DE FLUJO Símbolo Función

Ejemplo:
Calcular el salario neto de un trabajador en función del número de horas trabajadas, precio de la hora de trabajo y considerando unos descuentos fijos al salario bruto en concepto de impuestos (20 por 100).










Ejemplo:
Realizar un diagrama de flujo que permita mostrar en pantalla un mensaje de mayoría o minoría de edad según sea el caso para un nombre específico.

5.2 Pseudocódigo
Es un lenguaje de especificación de algoritmos. El uso de tal lenguaje hace el paso de codificación final (esto es, la traducción a un lenguaje de programación) relativamente fácil.
El pseudocódigo nació como un lenguaje similar al inglés y era un medio representar básicamente las estructuras de control de programación estructurada. Se considera un primer borrador, dado que el pseudocódigo tiene que traducirse posteriormente a un lenguaje de programación. Cabe señalar que el pseudocódigo no puede ser ejecutado por una computadora.
La ventaja del pseudocódigo es que en su uso en la planificación de un programa, el programador se puede concentrar en la lógica y en las estructuras de control y no preocuparse de las reglas de un lenguaje específico. Es también fácil modificar el pseudocódigo si se descubren errores o anomalías en la lógica del programa, además de todo esto es fácil su traducción a lenguajes como pascal, COBOL, C, FORTRAN o BASIC.
El pseudocódigo utiliza para representar las acciones sucesivas palabras reservadas en inglés (similares a sus homónimos en los lenguajes de programación), tales como star,begin, end, stop, if-then-else, while, repeat-until….etc
Secuencia
Inicio
acción1
acción2
:
acción n
Fin

Decisión
Simple
si condición entonces
acción1
acción2
:
acción n
Doble
si condición then
acción1
acción2
:
en caso contrario
acción1
acció2

Iteracción
Fija
para var. Entera inicial hasta final hacer
acción1
acción2
:
acción n

Condicional al inicio
mientras condición hacer
acción1
acción2
:
acción n

Condicional al final
Repetir
acción1
acción2
:
acción n
Hasta que condición
Selección
casos selector de
valor1 : acción1
acción2
valor2 : acción1
acción2
valor n : acción1
acción2
Ejercicio :
Se requiere preguntar dos valores, y a continuación ofrecer un menú con las operaciones básicas (+, -, *, /). Después de presentar el resultado se ofrecerá la posibilidad de una nueva operación.
Declaración de variables :
Real : X, Y, RESPUESTA
Entero : OPCION
Carácter : OP
Inicio
Repetir
escribir(‘Primer valor : ’ )
leer(X)
escribir(‘Segundo valor : ‘)
leer(Y)
escribir(‘1) Suma ‘)
escribir(‘2) Resta ‘)
escribir(‘3) Multiplicación ‘)
escribir(‘4) División ‘)
escribir(‘Qué operación deseas realizar ? : ‘)
leer(OPCION)
casos OPCION de
1 : RESULTADO X+Y
2 : RESULTADO X-Y
3 : RESULTADO X*Y
4 : si Y=0 entonces
escribir(‘ Error ‘)
RESULTADO 0
en caso contrario
RESULTADO X/Y
escribir (‘Resultado : ‘,RESULTADO)
escribir(‘Deseas otro cálculo : [S/N] ‘)
leer(OP)
Hasta que RES = ‘N’
Fin
Ejercicio :
Preguntar un nombre y repetirse en pantalla tantas veces como se desee. (preguntar cantidad de repeticiones), indicando el número de repetición.
Declaración de variables
Cadena : nom
entero : x, n
Inicio
escribir(‘Nombre : ‘)
leer(nom)
escribir(‘Cuántas veces quieres repetirlo ? : ‘)
leer(n)
para x 1 hasta n hacer
escribir(x’.- ‘, nom)
Fin
El diagrama N-S de Nassi-Schneiderman, también conocido como diagrama de Chapin, es como un diagrama de flujo en el que se omiten las flechas de unión y las cajas son contiguas. Las acciones sucesivas se escriben en cajas sucesivas, y, como en los diagramas de flujo, se pueden escribir diferentes acciones en una caja.
Los Diagramas Estructurados, son una técnica que permite formular algoritmos mediante una representación geométrica y de asignación de espacios de un bloque específico.

Un algoritmo se representa de la manera siguiente:

Una estructura condicional en N-S se representa de la siguiente manera :


Ejemplo: Se desea calcular el salario neto semanal de un trabajador en función del número de horas trabajadas y la tasa de impuestos.

6.1 Estructura Secuencial
Es aquélla en la que una acción (instrucció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í suscesivamente hasta el fin del proceso. La estructura secuencial tiene una entrada y una salida. Su representación gráfica es la siguiente:

ESTRUCTURA SECUENCIAL
....


DIAGRAMA N-S DE UNA ESTRUCTURA SECUENCIAL


PSEUDOCODIGO DE UNA ESTRUCTURA SECUENCIAL
Inicio
:
:
acciones
:
:
fin

Ejemplo:
Calcular el salario neto de un trabajador en función del número de horas trabajadas, precio de la hora de trabajo y considerando unos descuentos fijos al sueldo bruto en concepto de impuestos (20 por 100).

Pseudocódigo
Inicio
{cálculo salario neto}
leer nombre, horas, precio_hora
salario_bruto horas * precio
impuestos 0.20 * salario_bruto
salario_neto salario_bruto_impuestos
escribir nombre, salario_bruto, salario_neto_bruto, salario_neto
Fin

Diagrama de flujo

Diagrama N-S


6.2 Condicionales
La especificación formal de algoritmos tiene realmente utilidad cuando el algoritmo requiere una descripción más complicada que una lista sencilla de instrucciones. Este es el caso cuando existen un número de posibles alternativas resultantes de la evaluación de una determinada condición.
Las estructuras selectivas se utilizan para tomar decisiones lógicas; de ahí que se suelan denominar también estructuras de decisión o alternativas.
En las estructuras selectivas se evalúa una condición y en función del resultado la misma se realiza una opción u otra. Las condiciones se especifícan usando expresiones lógicas. La representación de una estructura selectiva se hace con palabras en pseudocódigo (if, then, else o bien en español si, entonces, sino), con una figura geométrica en forma de romba o bien con un triángulo en el interior de una caja rectangular.

Las estructuras selectivas o alternativas pueden ser:
Simples
Múltiples

Alternativa Simple (si-entonces/if-then)
La estructura alternativa simple si-entonces (en inglés if-then o bien IF-THEN ) ejecuta una determinada acción cuando se cumple una determinada condición. La selección si-entonces evalúa la condición y . . .
Si la condición es verdadera, entonces ejecuta la acción S1 (o acciones caso de ser S1 una acción compuesta y constar de varias acciones).

Si la condición es falsa, entonces no hacer nada.

A continuación se muestra la gráfica de la estructura condicional simple.



Pseudocódigo en español
Si Entonces

Fin_si

Pseudocódigo en inglés
If then

end_if

Diagrama N-S


Alternativas Múltiples (según_sea, caso de / case)
Cuando existen más de dos elecciones (alternativas) posibles, es cuando se presenta el caso de alternativas múltiples. Si el número de alternativas es grande puede plantear serios problemas de escritura del algoritmo y naturalmente de legibilidad.
La estrucura de decisión múltiple evaluará una expresión que podrá tomar n valores distintos 1,2,3,4,..n . Según que elija uno de estos valores en la condición, se realizará una de las n acciones, o lo que es igual, el flujo del algoritmo seguirá un determinado camino entre los n posibles.
La representación gráfica se muestra a continuación:
Diagrama de Flujo

Diagrama N-S

Modelo 1 Modelo 2


Pseudocódigo
En inglés la estructura de decisión múltiple se representa

Case expresión of
[e1]: acción S1
[e2]: acción S2
:
[en]: acción Sn

else
acción Sx

end_case


Ejemplo:
Se desea diseñar un algoritmo que escriba los nombres de los días de la semana en función del valor de una variable DIA introducida por teclado.
Los días de la semana son 7; por consiguiente, el rango de valores de DIA será 1..7, y caso de que DIA tome un valor fuera de este rango se deberá producir un mensaje de error advirtiendo la situación anómala.

Inicio
Leer DIA
Según_sea DIA hacer
1: escribir('Lunes')
2: escribir('Martes')
3: escribir('Miércoles')
4: escribir('Jueves')
5: escribir('Viernes')
6: escribir('Sabado')
7: escribir('Domingo')
else
escribir('Error')
fin_según
fin

Estructuras Repetitivas
Las estructuras que repiten una secuencia de instrucciones un número determinado de veces se denominan Bucles y se denomina Iteración al hecho de repetir la ejecución de una secuencia de acciones. Entre las estructuras repetitivas se encuentran:
Mientras (while)
Repetir (repeat)
Desde (for)
1.- Estructura Mientras (while)
La estructura repetitiva while, es aquélla en que el cuerpo del bucle se repite mientras se cumple una determinada condición, su representación gráfica es:



Pseudocódigo en español Pseudocódigo en inglés
Mientras condición hacer while condición do
Acción S1
Acción S2 :
: End_while
acción Sn
Fin_mientras


Diagrama N-S

Ejemplo:
Contar los números enteros positivos introducidos por teclado. Se consideran dos variables enteras NUMERO y CONTADOR (contará el número de enteros positivos). Se supone que se leen números positivos y se detiene el bucle cuando se lee un número negativo o cero.

Pseudocódigo
Inicio
contador 0
Leer (numero)
Mientras numero > 0 hacer
contador contador+1
Leer (numero)
Fin_Mientras
Escribir('El número de enteros positivos es : ', contador)
Fin

Diagrama de Flujo


Representación en N-S

Ver:
Repetir (repeat)
Desde (for)
"ARREGLOS"

Las variables que hemos utilizado hasta ahora nos permiten el almacenamiento de un solo valor a la vez.

Para resolver cierto tipo de problemas con datos múltiples en forma eficiente, se requiere almacenamiento en conjunto. A esta organización de elementos se le conoce con el nombre de arreglo.

Otra definición de arreglo más completa (Luis Joyanes A.), es un conjunto finito y ordenado de elementos homogéneos. La propiedad "ordenado" significa que el elemento primero, segundo, tercero…n-ésimo de un arreglo puede ser identificado. Los elementos de una arreglo deberán ser homogéneos, es decir, del mismo tipo de datos. Por ejemplo un arreglo puede estar compuesto de todos sus elementos de tipo cadena, otro puede tener sus elementos de tipo entero, etc.

Al tratar el tema de arreglos es necesario conocer el término de dimensión.
Dimensión
Descripción
0
Un solo punto.
1
(vector o lista) Una recta. Contiene largo.
2
(matriz o tabla) Contiene largo y ancho.
3
(cubo) Tiene largo, ancho y fondo.


Declaración de un Arreglo
Nom_variable : Arreglo [dimensión] de Nom_tipo

En donde dimensión especifica :

En el orden : Fila, Columna, Fondo.

Ejemplo de una declaración :
0 Dimensión :
x 20 donde x, es de tipo Entero.

1 Dimensión :

5


1 2 3 4
x[2] 5
x : arreglo [1..4] de Enteros.

2 Dimensiones :
1 2 3 4







8









x[2,4] 8
x : arreglo [1..3, 1..4] de Enteros.

3 Dimensiones :
x[1,4,2] 3
x : arreglo[1..3, 1..4, 1..2] de Enteros.


Las operaciones que se pueden realizar con arreglos durante el proceso de resolución de un problema son :
Asignación
Lectura/Escritura
Recorrido (acceso secuencial)
Actualizar (añadir, borrar, insertar)
Ordenación
Búsqueda


7.1 Vectores
Son aquéllos de una sola dimensión, por lo que también son llamados arreglos Unidimensionales.

Ejemplo :
Un vector de una dimensión llamado CALIF, que consta de n elementos.

calif(1)
calif(2)

calif(n-2)
calif(n-1)
calif(n)

El subíndice o índice de un elemento (1, 2 …n) designa su posición en la ordenación del vector. Otras posibles notaciones del vector son :
a1, a2,…,an En matemáticas y algunos lenguajes(BASIC)
A(1), A(2),…A(n)
A[1], A[2],…A[n] En programación (Pascal)

Los vectores se almacenan en memoria central de la computadora en un orden adyacente. Así, un vector de 50 elementos denominado NUMEROS se representa gráficamente por 50 posiciones de memoria sucesivas.

Memoria
NUMEROS(1) Dirección x
NUMEROS(2) Dirección x+1
NUMEROS(3) Dirección x+2
:
:
NUMEROS(50) Dirección x+49

Cada elemento de un vector se puede procesar como si fuese una variable simple al ocupar una posición de memoria. Así :
NUMEROS(25) 75 (almacena el valor 75 en la posición 25a del vector NUMEROS y la instrucción de salida : escribir NUMEROS(25).

Declaración
nom _arreglo = arreglo[liminf..limsup] de tipo

donde :
nom_arreglo : nombre válido del arreglo.
liminf..limsup : límites inferior y superior del rango del arreglo.
tipo : tipo de datos de los elementos del arreglo : entero, real, carácter.

NOMBRES= arreglo [1..10] de carácter
Significa que NOMBRES es un arreglo (array) unidimensional de 10 elementos (1 a 10) de tipo carácter.

Asignación
NOMBRES(8) ‘Ana’
Asigna el valor ‘Ana’ al elemento 8 del vector NOMBRES


Lectura/Escritura de Datos
La Lectura/Escritura de datos en un arreglo u operaciones de entrada/salida normalmente se realizan con estructuras repetitivas, aunque puede también hacerse con estructuras selectivas. Las instrucciones simples de lectura/escritura se representarán como :
leer A Lectura del vector A
escribir A Escritura del vector A
leer V(5) Leer el elemento V(5) del vector V

Acceso Secuencial al Vector (recorrido)
Se puede acceder a los elementos de un vector para introducir datos (escribir) en el o bien para visualizar su contenido (leer). Estas operaciones se realizan utilizando estructuras repetitivas, cuyas variables de control (por ejemplo I) se utilizan como subíndices del vector (por ejemplo, X(I). El incremento del contador del bucle producirá el tratamiento sucesivo de los elementos del vector.

Ejemplo :
Lectura de 15 valores enteros de un vector denominado TOTAL.

TOTAL= array [1..15] de entero
desde i1 hasta 15 hacer
leer TOTAL(i)
fin _desde

Si se cambian los limite inferior y superior, por ejemplo, 5 y 12, el bucle de lectura sería :
desde i 5 hasta 12 hacer
leer TOTAL(i)
fin_desde

La salida o escritura de vectores se representa de un modo similar.
desde i1 hasta 15 hacer
escribir TOTAL(i)
fin_desde
Visualiza todo el vector completo (un elemento en cada línea independiente).

Actualización de un Vector
Puede constar de tres operaciones más elementales :
a) Añadir elementos (añade un nuevo elemento al final del vector)
Un arreglo A se ha dimensionado a 6 elementos, pero solo se han asignado 4 valores a los elementos A(1), A(2), A(3), A(4), se podrán añadir dos elementos más con una simple acción de asignación.
A(5) 15
A(6) 9

b.- Insertar elementos (introduce un elemento en el interior de un vector)

Ejemplo : Se tiene un arreglo NOM de 6 elementos de nombres de personas, en orden alfabético y se desea insertar un nuevo nombre.

{Calcular la posición ocupada por el elemento a insertar} P
{Inicializar contador de inserciones} i n.
mientras i >= P hacer
{transferir el elemento actual hacia abajo, a la posición i+1}
NOM(i+1) NOM(i)
{decrementar contador}
i i-1
fin_mientras
{Insertar el elemento en la posición P}
NOM(P) ‘nuevo elemento’
{Actualizar el contador de elementos del vector}
n n+1
fin

c) Borrar elementos (Elimina elementos de un vector)

Algoritmo de Borrado
Inicio
{se utilizará una variable auxiliar AUX, que contendrá el valor del elemento que se desea borrar}
AUX NOM(i)
desde ij hasta N-1 hacer
{llevar elemento j+1 hacia arriba}
NOM(i) NOM(i+1)
fin_desde
{actualizar contador de elementos}
{ahora tendrá un elemento menos, N-1}
N N-1
Fin


Referencia a un elemento de Arreglo
variable de arreglo [subíndice]
Ejemplo :
x x[3]9
escribir (x[2])

?
9
1 2 3

Ejercicio :
Se desea la lectura y desplegado de 5 nombres. Resuelva el problema por cada uno de los siguientes criterios :
a) Lectura y desplegado alternados.
b) Todas las lecturas, todos los desplegados.
a) variables :
string : nom
entero : x

Inicio
Para x1 hasta 5 hacer
escribir(‘Nombre ? ‘)
leer(nom)
escribir( ‘La persona número’, x, ‘ se llama : ‘,nom)
Fin


Nota : No se utilizaron arreglos porque no se requería de almacenamiento múltiple.

b) variables :
nom : Arreglo[1..5] de string
x : Entero

Inicio
para x 1 hasta 5 hacer
escribir(‘Dame el nombre número’,x,’ ?’)
leer(nom[x])
para x 1 hasta 5 hacer
escribir(‘La persona número ‘, x,’ se llama : ‘,nom[x])
Fin

Ordenación de Arreglos
Existen diversos métodos para ordenar los elementos de un arreglo. El más conocido de ellos (no el mejor) es el Método de la Burbuja.

El método consiste en hacer un recorrido por el arreglo comparando parejas de elementos ; si estos no están en el orden deseado, se procede a intercambiarlos.

Al finalizar el recorrido se verifica la cantidad de intercambios, si esta es 0 se asume que el arreglo está ordenado ; en caso contrario se inicia nuevamente el recorrido.

Las parejas de elementos que se comparan deben ser contiguos (elemento1 y elemento2, elemento2 y elemento3, etc). El número total de comparaciones es n-1 (donde n es la cantidad de elementos).

Ejemplo :
Se requiere la ordenación de una lista con 5 valores enteros previamente introducidos.

Variables :
LISTA : arreglo[1..5] de entero
x, aux : entero
cambio : boleano

Inicio
Para x 1 hasta 5 hacer
escribir(‘Dame el valor’,x,’ :’)
leer( LISTA[x])
repetir
cambio falso
para x 1 hasta 4 hacer
si LISTA[x] > LISTA[x+1] entonces
aux LISTA[x]
LISTA[x] LISTA[x+1]
LISTA[x+1] aux
cambio verdadero
fin_si_entonces
hasta cambio = falso
escribir(‘Lista ordenada’)
para x 1 hasta 5 hacer
escribir(‘Elemento número’,x,’ es’,LISTA[x])
Fin
7.2 Matrices
Se puede considerar como un vector de vectores. Es, por consiguiente, un conjunto de elementos, todos del mismo tipo, en el cual el orden de los componentes es significativo y en el que se necesitan especificar dos subíndices para poder identificar a cada elemento del arreglo.
También se les llama arreglos Bidimensionales, ya que una tabla será utilizada cuando se requiere de establecer relaciones por renglones y columnas entre datos de un tipo común.

1 2 3 4 . . . J . . . N





























B(I,J)



















Se considera que este arreglo tiene dos dimensiones (una dimensión por cada subíndice) y necesita un valor para cada subíndice, y poder identificar un elemento individual. En notación estándar, normalmente el primer subíndice se refiere a la fila del arreglo, mientras que el segundo subíndice se refiere a la columna del arreglo. Es decir, B(I,J), es el elemento de -b que ocupa la Ia y la Ja columna como se muestra en la figura anterior.
Un ejemplo típico de un arreglo Bidimensional es un tablero de ajedrez. Se puede representar cada posición o casilla del tablero mediante un arreglo, en el que cada elemento es una casilla y en el que su valor será un código representativo de cada figura del juego.

Ejemplo:
Se desea registrar las edades de 4 grupos de personas, cada uno de ellos con 5 elementos. Los datos deberán ser mostrados en forma posterior.

variables:
edad: arreglo(1..4,1..5) de entero
g,p: enteros

Inicio
para g 1 hasta 4 hacer
escribir(‘Grupo : ‘,g)
para p 1 hasta 5 hacer
escribir(‘Edad de la persona ‘,p)
leer(edad[g,p])
para g1 hasta 4 hacer
escribir(‘Grupo ‘,g)
para p 1 hasta 5 hacer
escribir(´persona ‘,p,’ Tiene’,edad[g,p],´años´)
Fin

Ejemplo:
Se tienen 4 fábricas cada una de ellas con 6 empleados. Se desea registrar los salarios y mostrarlos posteriormente. En forma alternada deberá leerse también el nombre de cada empleado. Durante el desplegado de los gastos se indicará el nombre y salario del empleado mejor pagado de cada fábrica así como el total de nómina ( de cada fábrica).

variables:
Nom: arreglo[1..4,1..6] de string
salario: arreglo[1..4,1..6] de entero
fab, emp, total, cont, lug, zuc: entero


Inicio
para fab 1 hasta 4 hacer
para emp1 hasta 6 hacer
escribir(‘Empleado : ‘,emp)
escribir(´Nombre del empleado :’)
leer(nom[fab,emp])
escribir(‘Salarios del empleado : ‘)
leer(sal[fab,emp])
para fab 1 hasta 4 hacer
total 0
cont sal[fab,1]
escribir(‘Fábrica’, fab)
para emp 1 hasta 6 hacer
escribir(‘El empleado ‘,emp,’ se llama‘,nom[fab,emp],’ y gana ‘,salario[fab,emp])
totaltotal + salario[fab,emp]
si salario[fab,emp] >= cont entonces
cont salario[fab,emp]
lug fab
zuc emp
finEntonces
escribir(‘El mejor pagado es ‘,nom[lug,zuc],´y gana ‘,salario[lug,zuc])
escribir(‘El total es : ‘,total)

Fin

8.1 Definición
Una cadena (string) de caracteres es un conjunto de caracteres (incluido el blanco), que se almacenan en un área contigua de la memoria. Pueden ser entradas o salidas a/desde una computadora.

La longitud de una cadena es el número de caracteres que contiene. La cadena que no contiene ningún carácter se le denomina cadena vacía o nula. y su longitud es cero; no se debe confundir con una cadena compuesta de solo espacios en blanco.

La representación de las cadenas suele ser con comillas simples o dobles, las comillas actúan como separadores, algunos ejemplos:
’12 de Octubre de 1492’
‘Hola, como estás?’
‘ ’
‘MEXICO ES GRANDE’

La cadena puede contener entre sus separadores, cualquier carácter válido del código aceptado por el lenguaje y la computadora; el blanco es uno de los caracteres más utilizado.
Una Subcadena es una cadena de caracteres que ha sido extraída de otra de mayor longitud.

’12 de’ es una subcadena de ’12 de Octubre de 1492’
‘como estás’ es una subcadena de ‘Hola, como estás?’
‘XI´ es una subcadena de ‘MEXICO ES GRANDE’


Datos Tipo Carácter
Anteriormente se analizaron los diferentes tipos de datos y entre ellos existían el dato tipo carácter (char) que se incorpora en diferentes lenguajes de programación, bien con este nombre, o bien como datos tipo cadena.

Constantes
Una constante tipo carácter es un conjunto de caracteres válidos encerrados entre comillas, para evitar confundirlos con nombres de variables, operadores, enteros, etc

Variables
Una variable de cadena o tipo carácter es una variable cuyo valor es una cadena de caracteres. Las variables de tipo carácter se deben declarar en el algoritmo y según el lenguaje tendrán una notación u otra.
var NOMBRE, DIRECCION, PAIS: carácter

Cadenas de Longitud Fija
Se consideran vectores de la longitud declarada, con blancos a izquierda o derecha si la cadena no tiene la longitud declarada. Así el ejemplo siguiente:
E
S
T
A

C
A
S
A

E
S

U
N
A

R
U
I
N
A
///
///
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

Se declaró con una dimensión de 24 caracteres y los dos último se rellenan con blancos.

Cadenas de Longitud Variable con un Máximo
Se considera un puntero, con dos campos que contienen la longitud máxima y la longitud actual.


20
17

E
S
T
A

C
A
S
A

E
S

G
U
A
Y
///
///
///
Donde:
20 = Longitud máxima
17 = Longitud actual


Instrucciones Básicas con Cadenas
Las instrucciones básicas : asignar y entrada/salida (leer/escribir) se realizan de un modo similar al tratamiento de dichas instrucciones con datos numéricos.

Asignación
Si la variable NOMBRE ha sido declarada como carácter
var NOMBRE : carácter
La instrucción de asignación debe contener en el lado derecho de la asignación una constante tipo carácter (una cadena) o bien otra variable tipo carácter. Así:

NOMBRE  ‘Juan González’
Significa que la variable NOMBRE toma por valor la cadena ‘Juan González’


Entrada/Salida
La entrada/salida desde una computadora se puede realizar en modo carácter, para ello se asignará una cadena de caracteres a una variable tipo cadena.

var A,B,C,D: carácter
las instrucciones:
leer A,B
escribir C,D

Asignarán a A y B las cadenas introducidas por el teclado y visualizará o imprimirán en el dispositivo de salida las cadenas que representan las variables C y D.

8.2 Función de cadenas de caracteres
El tratamiento de cadenas es un tema importante, debido esencialmente a la gran cantidad de información que se almacena en ellas. Según el tipo de lenguaje de programación elegido se tendrá mayor o menor facilidad para la realización de operaciones.
Las operaciones con cadenas más usuales son:
Cálculo de la longitud
Comparación
Concatenación
Extracción de subcadenas
Búsqueda de información

1.- CALCULO DE LA LONGITUD DE UNA CADENA
La longitud de una cadena, como ya se ha comentado, es el número de caracteres de la cadena. Así:
'Hola' Tiene 4 caracteres
La operación de determinación de la longitud de una cadena se representará por la función Longitud, cuyo formato es:
Longitud (cadena)
La función longitud tiene como argumento una cadena, pero su resultado es un valor numérico entero.
Ejemplo:
longitud('Como estás?') Proporciona 11.
longitud(' ') Cadena de un blanco, proporciona 1.
longitud(' Hola') Cadena 'Hola' relleanda de un blanco a la izquierda para tener longitud de 5.

2.- COMPARACION
Es una operación muy importante sobre todo en la clasificación de datos tipo carácter, que se utiliza con mucha frecuencia en aplicaciones de proceso de datos (clasificaciones de listas, tratamiento de textos, etc).
Los criterios de comparación se basan en el orden numérico del código o juego de caracteres que admite la computadora o el propio lenguaje de programación. En nuestro lenguaje algorítmico utilizaremos el código ASCII como código numérico de referencia.
En la comparación de cadenas se pueden considerar dos operaciones más elementales: igualdad y desigualdad.
Ejemplos:
'LUIS' < 'LUISITO' verdadera 'ANA' < 'MARTA' verdadera 'BARTOLO' >= 'BARTOLOME' falsa

3.- CONCATENACION
La concatenación es la operación de reunir varias cadenas de caracteres en una sola, pero conservanso el orden de los caracteres en cada una de ellas. El símbolo que representa la concatenación varía de unos lenguajes a otros. Los más utilizados son:
+ // & o
Las cadenas para concatenarse pueden ser constantes o variables.
Ejemplos:
'Mayo ' + 'de 1999' = 'Mayo de 1999'
x'Lenguaje'
y'Ensamblador'
zx+' '+y z= 'Lenguaje Ensamblador'

4.- SUBCADENAS
Esta operación permite la extracción de una parte específica de una cadena: subcadena.
Subcadena (cadena, inicio, longitud)
Cadena: Es la cadena de la que debe extraerse una subcadena.
Inicio: Es un número o expresión numérica entera que corresponde a la posición inicial de la subcadena.
Longitud: Es la longitud de la subcadena.

Ejemplos:
subcadena ('abcdefgh',3,6) Equivale a 'cdef'
subcadena ('Tecnológico',1,3) Equivale a 'Tec'
subcadena ('México',5,2) Equivale a 'co'

5.- BUSQUEDA
Esta operación localiza si una determinada cadena forma parte de otra cadena más grande o buscar la posición en que aparece un determinado carácter o secuencia de caracteres en un texto.
El resultado de la función es un valor entero
Posición (cadena, subcadena)
subcadena: Es el texto que se trata de localizar.
Ejemplo:
nombre'Marielena'
Posición (nombre,'elena') Produce 5.
La función Posición, al tomar también un valor numérico entero se puede utilizar en expresiones aritméticas o en instrucciones de asignación a variables numéricas.


Otras funciones de cadenas
a) Insertar Cadenas
Si se desea insertar una cadena C dentro de un texto o cadena más grande, se debe indicar la posición. El formato es:
Insertar (t, p, s)
t Texto o cadena donde se va a insertar.
p Posición a partir de la cual se va a insertar.
s Subcadena que se va a insertar.

Ejemplo:
Insertar ('Tecnológico',4,'XXX') = 'TecXXXnológico'
Insertar ('Juan O',5,'de la')= 'Juan de la O'

b) Borrar
Elimina una subcadena que comienza en la posición p y tiene una longitud l.
Borrar (t, p ,l)
t Texto o cadena de donde se va a eliminar una subcadena.
p Posición a partir del cual se va a insertar.
l Longitud de la subcadena a eliminar.
Ejemplo:
Borrar ('Tecnológico',4,2) = 'Teclógico'

c) Conversión Cadenas/Números
Existen funciones o procedimientos en los lenguajes de programación (val y str) que permiten convertir un número en una cadena y viceversa. En nuestros algoritmos los denotaremos por valor y cadena.
Valor (cadena) = Convierte la cadena en un número; siempre que la cadena fuese de dígitos numéricos.
Cadena (valor) = Convierte un valor numérico en una cadena.
Ejemplos:
Valor ('12345') = 12345
Cadena(12345)= '12345'


Funciones internas
Las operaciones que se requieren en los programas exigen en numerosas ocasiones, además de las operaciones aritméticas básicas, ya tratadas, un número determinado de operaciones especiales que se denominan funciones internas, incorporadas o estándar. Por ejemplo la función ln se puede utilizar para determinar logaritmo de un n se puede utilizar para determinar logaritmo de un número y la función sqrt calcula la raíz cuadrada de un número positivo. Existen otras funciones que se utilizan para determinar las funciones trigonométricas.

La siguiente tabla muestra las funciones internas más usuales, siendo x el argumento de la función.

Función
Descripción
Tipo_Argumento
Resultado
abs(x)
Valor absoluto de x
Entero o real
igual que argumento
arctan(x)
Arcotangente de x
Entero o real
real
cos(x)
Coseno de x
Entero o real
real
exp(x)
Exponencial de x
Entero o real
real
ln(x)
Logaritmo de x
Entero o real
real
log10(x)
Logaritmo decimal de x
Entero o real
real
round(x)
Redondeo de x
Real
entero
sin(x)
Seno de x
Entero o real
real
sqr(x)
Cuadrado de x
Entero o real
igual que argumento
sqrt(x)
Raíz cuadrada de x
Entero o real
real
trunc(x)
Truncamiento de x
real
entero


8.3 Manipulación de cadenas

Ejercicio 1:
Contar el número de letras 'i' de una frase terminada en un punto. Se supone que las letras pueden leerse independientemente.

Algoritmo letras_i
var
N: entera
Letra: carácter
Inicio
N0
repetir
leer(Letra)
si Letra = 'i' entonces
NN+1
fin si
hasta que Letra = '.'
escribir('La frase tiene :', N,' letras i')
Fin


Ejercicio 2:
Aceptar un nombre y proporcionar la cantidad de caracteres que contiene.

Inicio
escribir('Cuál es el nombre : ')
Leer(nom)
escribir('Tu nombre tiene ', Longitud(nom),' letras')
Fin

Ejercicio 3:
Pedir una cadena que contenga una vez la letra F ('F'). Deberá informarse la posición donde fue encontrada, el carácter previo y el siguiente.

Inicio
escribir('Dame cadena que contenga [F] ')
leer(cad)
xPosición('F', cad)
escribir('La letra 'F' se encuentra en la posición : ',x)
escribir('El carácter anterior es : ' , Subcadena(cad, x-1,1))
escribir('El carácter siguiente es : ', Subcadena(cad, x+1, 1))
Fin

Ejercicio 4:
Leer dos caracteres y deducir si están en orden alfabético.
variables:
CAR1, CAR2 : carácter.
Algoritmo Comparación
Inicio
Leer CAR1, CAR2
Si CAR1 <= CAR2 entonces escribir('Si se encuentran en orden') sino escribir('Desordenados') Fin_si Fin Ejercicio 5: Se desea eliminar los blancos de una frase dada terminada en un punto. Se supone que es posible leer los caracteres de la frase de uno a uno. Análisis del problema Para poder efecturar la lectura de la frase almacena ésta en un arreglo de caracteres (F), de modo que F(1) contiene el primer carácter i-ésimo del a frase dada. Construiremos una frase nueva sin blancos en otro arreglo G. Algoritmo Los pasos a dar para la realización del algoritmo son: Inicializar contador de letras de la nueva frase G. Leer el primer carácter. Repetir Si el primer carácter no es en blanco, entonces escribir en el lugar siguiente del arreglo F leer carácter siguiente de la frase dada. Hasta que el último carácter se encuentre. Escribir la nueva frase (G), ya sin blancos. Variables: F : array de caracteres de la frase dada. G : array de caracteres de la nueva frase dada. i : Constador del array F. j : Constador del array G. Algoritmo Blanco Inicio i1 j0 leer F(i) Repetir Si F(i) <> ' ' entonces
jj+1
G(j) F(i)
Fin si
ii+1
leer F(i)
Hasta que F(i) = '.'
{escritura de la nueva frase G}
Desde i1 a j hacer
escribir G(i)
Fin Desde
Fin

Ejercicio 6:
Encontrar un espacio en blanco en una cadena.
variables:
x: entero
nom,a,b : cadena
Inicio
leer(nom)
xPosición (' ',nom)
a Subcadena (nom,1,x-1)
b Subcadena (nom, x+1, x)
Fin

Ejercicio 7:
Solicitar un nombre y mostrarlo con la inicial en mayúscula.
variables:
nom,a,b: cadena
x,y : carácter
z : entero

Inicio
escribir('Introduce nombre : ')
leer(nom)
x Subcadena(nom,1,1)
y MAYUSCULA(x)
z Longitud (nom)
a Subcadena (nom, 2, z-1)
Concatenación y+a
Escribir('Te llamas : ' , concatenación)
Fin

Nota: MAYUSCULA es una función para convertir letras minúsculas a mayúsculas.
"MANEJO DE MODULOS"

9.1 Concepto y características

Módulo:
Es aquél que está constituido por una o varias instrucciones físicamente contiguas y lógicamente encadenadas, las cuales se pueden referenciar mediante un nombre y pueden ser llamadas desde diferentes puntos de un programa.

Un módulo puede ser:
Un programa
Una función
Una subrutina (o procedimiento)

Características de un Módulo
Los módulos deben tener la máxima cohesión y el mínimo acoplamiento. Es decir, deben tener la máxima independencia entre ellos.
La salida del módulo debe ser función de la entrada, pero no de ningún estado interno. En la creación de los módulos deben cumplirse tres aspectos básicos: descripción, rendimiento y diseño.

En la descripción se definen las funciones y objetivos del programa. Para obtener el máximo rendimiento se ha de comprobar que el programa realice el proceso aprovechando al máximo todos los recursos de los que dispone. En cuanto al diseño, se debe comprobar la estructura que sigue el módulo, así como la estructura de los datos y la forma de comunicaciones entre los diversos y diferentes módulos.
Conforme se extiende el tamaño de los algoritmos, se hace más difícil su revisión, actualización y/o corrección.
Una política común para solventar este problema consiste en la modularización. Esto significa que el algoritmo se fragmenta en partes llamadas módulos. En realidad, es un método de diseño que tiende a dividir el problema, de forma lógica, en partes perfectamente diferenciadas que pueden ser analizadas, programadas y puestas a punto independiente.
Realmente la programación modular es un intento para diseñar programas, de forma tal que cualquier función lógica pueda ser intercambiada sin afectar a otras partes del programa.

Algunas ventajas de utilizar módulos son:
Un programa modular es fácil de mantener y modificar.
Un programa modular es más fácil de escribir y depurar (ejecutar, probar y poner a punto).
Un programa modular es más fácil de controlar. El desglose de un problema en módulos permite encomendar los módulos más complejos a los programadores más experimentados y los más sencillos a los programadores nóveles.
Posibilita el uso repetitivo de las rutinas en el mismo o en diferentes programas.

Desventajas del uso de módulos:
No se dispone de algoritmos formales de modularidad, por lo que a veces los programadores no tienen claras las ideas de los módulos.
La programación modular requiere más memoria y tiempo de ejecución.


Objetivos de la programación modular:
Disminuir la complejidad.
Aumentar la claridad y fiabilidad.
Disminuir el coste.
Aumentar el control del proyecto.
Facilitar la ampliación del programa mediante nuevos módulos.
Facilitar las modificaciones y correcciones al quedar automáticamente localizadas en un módulo.
9.2 Clasificación de los módulos

Pueden ser de dos tipos:
Funciones
Procedimientos

Estas funciones y procedimientos se escriben solamente una vez, pero pueden ser referenciados (invocadas) en diferentes puntos de un programa, tantas veces como se requiera de modo que se puede evitar la duplicación innecesaria del código.

Funciones
Las funciones son bloques de instrucciones que tienen por objeto el alcanzar un resultado que sustituirá a la función en el punto de invocación (las funciones devuelven un resultado).
Cada función se evoca utilizando su nombre en una expresión con los argumentos actuales o reales encerrados entre paréntesis.
Para hacer una referencia a una función se invoca mediante un nombre y en caso de existir, una lista de parámetros actuales necesarios (argumentos). Los argumentos deben coincidir en cantidad, tipo y orden con los de la función que fue definida. La función devuelve un valor único.
Las funciones a que se hace referencia, se conocen como funciones de usuario puesto que son definidas por él mismo y permiten su uso en forma idéntica a las funciones estándares. Para coordinar e iniciar el procesamiento, se utiliza un módulo principal que es colocado al final del algoritmo.


Declaración de funciones
función nombre_función (par1, par2,par3,...) : tipo_del_resultado

Inicio
acción1
acción2
:
nombre_función Resultado_Obtenido
Fin


Donde:
par1,par2 .... Lista de parámetros formales o argumentos.
nombre_función Nombre asociado de la función, que será un nombre de identificador válido.

acción1, acción2,.. Instrucciones que constituyen la definición de las función, y que debe contener una acción sola de asignación que asigne un valor al nombre de la función.


Ejemplo:
Obtener el sexto carácter de un nombre y si dicho carácter no existe, se asumirá un asterisco como tal.

Función SEXTO(n:string):carácter
Inicio
si longitud(n) >= 6 entonces
SEXTO Subcadena(n,6,1)
en caso contrario
SEXTO ‘*’
Fin



Invocación a las funciones
Una función puede ser llamada sólo mediante referencia de la forma siguiente:
nombre_función (lista de parámetros actuales)

Donde:
nombre_función Función que llama.
Lista de param. actuales Constantes, variables, expresiones, valores de funciones,
nombres de funciones o procedimientos.

Una llamada a la función implica los siguientes pasos:
A cada parámetro formal se le asigna el valor real de su correspondiente parámetro actual (esta correspondencia se verá más tarde y se denomina llamada por valor).

Se ejecuta el cuerpo de acciones de la función.

Se devuelve el valor de la función y se retorna al punto de llamada.

Ejercicio:
Calcular la potencia de un número.
funcion POTENCIA(x,n :entero): entero
Inicio
y 1
Desde i 1 hasta abs(n) hacer
y y*x
fin Desde
si n < 0 entonces
y 1/y
Fin si
POTENCIA y
Fin

9.3 Operación de Módulos y sus Parámetros

PASO DE PARAMETROS
Existen diferentes métodos para el paso de parámetros a subprogramas, un mismo programa puede producir diferentes resultados bajo diferentes sistemas de paso de parámetros.

Los parámetros se clasifican de la siguiente manera:
1. Entradas: Las entradas proporcionan valores desde el programa que llama y que se utilizan dentro de un procedimiento. En los subprogramas función las entradas son los argumentos en el sentido tradicional.
2. Salidas: Las salidas producen los resultados del subprograma; de nuevo si se utiliza el caso una función, mientras que con procedimientos pueden calcularse cero, una o varias salidas.
3. Entradas/Salidas: Un solo parámetro se utiliza para mandar argumentos a un programa y para devolver resultados.

Los métodos más empleados para realizar el paso de parámetros son:
· Paso por valor (parámetro valor).
· Paso por referencia o dirección (parámetro variable).

PASO POR VALOR
Se utiliza en muchos lenguajes de programación (pascal, basic, modula-2, algol, etc), debido a su analogía con los argumentos de una función, donde los valores se proporcionan en el orden de cálculo de resultados. Los parámetros se tratan como variables locales y los valores iniciales se proporcionan copiando los valores de los correspondientes argumentos.
Los parámetros formales (locales a la función), reciben como valores iniciales los valores de los parámetros actuales y con ello se ejecutan las acciones descritas en el subprograma.

La llamada por valor no devuelve información al programa que llama.

PASO POR REFERENCIA
Se utiliza cuando se requiere que ciertos parámetros sirvan como parámetros de salida, es decir, devuelvan los resultados a la unidad o programas que llama. La unidad que llama pasa a la unidad llamada la dirección del parámetro actual (que está en el ámbito de la unidad llamante). Una referencia al correspondiente parámetro formal se tratra como una referncia 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 subprograma. Si el parámetro actual es una expresión, el subprograma recibe la dirección de la posición temporal que contiene el valor de la expresión.

9.4 Criterios de Modularización

Criterios de la programación modular
Con independencia de las técnicas, los requisitos que debe cumplir la programación modular son:

Establecimiento de un organigrama modular: Se realiza mediante bloques, en el que cada bloque corresponde a un módulo y muestra gráficamente la comunicación entre el módulo principal y los secundarios.

Descripción del módulo principal: Debe ser claro y conciso, reflejando los punto fundamentales del programa.

Descripción de los módulos básicos o secundarios: Los módulos básicos deben resolver partes bien definidas del problema. Solo pueden tener un punto de entrada y un punto de salida. Si un módulo es complejo de resolver, conviene se subdivida en submódulos. Ningún módulo puede ser llamado desde distintos puntos del módulo principal.

Normas de la programación : Dependerán del análisis de cada problema y de las normas generales o particulares que haya recibido el programador.