Cap 1
Cap 1
Cap 1
1 INTRODUCCION
Muchas veces, la mitad del trabajo es saber exactamente qué problema hay que
resolver. Si al tratar de resolver un problema este no tiene una descripción simple o
precisa resulta complejo modelar, simular o programar su solución en un computador.
En este punto hay que dar importancia de ciertos aspectos relacionados con la
resolución de problemas entre los que podemos mencionar estrategias, notaciones de
representación, relaciones entre problemas.
Esta fase está dada por el enunciado del problema, el cual requiere una definición clara
y precisa.
Tomar en cuenta que la solución del problema debe estar en función de lo que el
problema requiera y no en función de lo que el programador quiera.
Al comenzar a abordar un problema hay que tener en cuenta que para la mayoría de
ellos hay muchas maneras de resolver y pueden existir muchas soluciones, se plantean
algunos criterios o estrategias generales que se deben tomar en cuenta, las cuales son
útiles en el análisis del problema.
El propósito del análisis del problema es ayudar al programador para llegar a una
cierta comprensión de la naturaleza del problema. Una buena definición del problema
junto con una descripción detallada de las especificaciones de entrada y de salida, son
los requisitos más importantes para llegar a una solución eficaz.
Análisis del
problema
Una vez modelado el problema puede buscarse una solución en forma de algoritmo.
¨Algoritmo es una secuencia finita de instrucciones, cada una de las cuales tiene un
significado preciso y puede ejecutarse con una cantidad finita de esfuerzo en un tiempo
finito. Ha de tener las siguientes características: legible, correcto, modular, eficiente,
estructurado, no ambiguo y a ser posible se ha de desarrollar en el menor tiempo
posible
Por lo que para llegar a ser un programador eficaz se necesita aprender a resolver
problemas de un modo riguroso y sistemático.
2.1. Definición
Modelo Resultados
Análisis
Fig.:.2.2 Representación de un algoritmo como un sistema de Información
Secuenciales
Condicionales
Repetitivos
Cualitativos: Son aquellos en los que se describen los pasos utilizando palabras.
Cuantitativos: Son aquellos en los que se utilizan cálculos numéricos para definir los
pasos del proceso.
Es una serie de símbolos y reglas que se utilizan para describir de manera explícita un
proceso.
Una receta de un plato de cocina se puede expresar en español, ingles o francés pero
cualquiera sea el lenguaje los pasos para la elaboración del plato se realizarán sin
importar el cocinero.
Normalmente los pasos diseñados en un primer esbozo del algoritmo son incompletos
e indican solo unos pocos pasos, tras esta primera descripción estos se amplían en una
descripción más detallada con pasos específicos este proceso se denomina
refinamiento del algoritmo.
Calculo de la superficie
Entrada de datos Salida de resultados
Entrar el Radio S = PI * R ^2 S
Una vez que el algoritmo está diseñado, representado gráficamente mediante una
herramienta y verificado se debe pasar a la fase de codificación, traducir el algoritmo a
un determinado lenguaje de programación que deberá ser completada con la ejecución
y verificación de resultado en el computador.
2.10 Codificación
La depuración o prueba resulta una tarea tan creativa como el mismo desarrollo de la
solución, por ello se debe considerar con el mismo interés y entusiasmo.
2.12 Documentación
A menudo un programa escrito por una persona, es usado por otra. Por ello la
documentación sirve para ayudar a comprender o usar un programa o para facilitar
futuras modificaciones (mantenimiento).
Documentación Interna
Documentación Externa
Manual del Usuario
Manual del Usuario: Describe paso a paso la manera como funciona el programa, con
el fin de que el usuario obtenga el resultado deseado.
Para representar una algoritmo se debe utilizar algún método que permita
independizar dicho algoritmo del lenguaje de programación elegido. Ello permitirá que
un algoritmo pueda ser codificado inmediatamente en cualquier lenguaje.
Pseudocodigo
Diagrama de Flujo.
Diagramas Nassi/Shneiderman-S (Chapin)
Método Warnier
Método Jackson
Método Bertini
Método Tabourier
2.13.1Pseudocodigo
Es la representación narrativa de los pasos que debe seguir un algoritmo para dar
solución a un problema determinado. El pseudocodigo utiliza palabras que indican el
proceso a realizar.
Inicio
Leer (lado)
A lado * lado
Imprimir( A)
Fin
2.13.2Diagrama De Flujo
Características
Toda representación gráfica, de cualquier tipo sea, debe cumplir las siguientes
cualidades.
Subprogramas
comentarios
NO
Ciclo repetitivo Mientras SI
No si
Acciones simples
Las acciones simples, también denominadas instrucciones primitivas, son aquellas que
el procesador ejecuta de forma inmediata.
A = a+3
Leer A,C
Escribir a,b
Sentencias de control
condicion
True False
Condicion
1 2 3 4 5 6 7 8
Mientras
MIentras
Repetir
repetir
Para
Para
Acciones simples
Las acciones simples, también denominadas instrucciones primitivas, son aquellas que
el procesador ejecuta de forma inmediata.
Variable expresión
Leer (Variable)
Imprimir (variable)
Sentencias de control
I1
I2
...
I3
Si I1
Condición
No I2
Expresión = V1 A
Expresión = V2 A
Expresión = V3 A
Expresión = Otros A
Mientras
Proceso A
Mientras condición
Repetir
Proceso A
Hasta condición
Para
Proceso A
N veces
O *
Acciones simples
Las acciones simples, también denominadas instrucciones primitivas, son aquellas que
el procesador ejecuta de forma inmediata.
Variable expresión
Leer (Variable)
Imprimir (variable)
Sentencias de control
Proceso
A B C
Condición
Si O No O
A B
Expresión
= V1 O = V2 O = V3 O = VN O
A B C D
*
Condición
Mientras
En el bloque condición se escribe mientras condición
Repetir
En el bloque condición se escribe hasta condición
Para
En el bloque condición se escribe N veces
Acciones simples
Las acciones simples, también denominadas instrucciones primitivas, son aquellas que
el procesador ejecuta de forma inmediata.
Variable expresión
Leer (Variable)
Imprimir (variable)
Sentencias de control
C B A
COND COND
A B
EXPRESION
A B C D
CONDICION
Mientras
Repetir
Para
Acciones simples
Las acciones simples, también denominadas instrucciones primitivas, son aquellas que
el procesador ejecuta de forma inmediata.
Variable expresión
Leer (Variable)
Imprimir (variable)
Sentencias de control
Boque
A B C
Si entonces Sino
Condi. A B
Expresión En caso de
= V1 = V2 = V3 = VN
A B C D
Mientras
Mientras
A
Condi.
Repetir
Repetir
A
Condi.
Para
Para
A
Condi.
Diagramas de flujo
Pseudocodigo
Diagramas N-S
Leer Leer
(lista de variables) (lista de variables)
Escribir Escribir
(lista de variables) (lista de variables)
Instrucción
compuesta S1 S1
S1
S2 S2 S2
S3
... ... ...
SN
Sn Sn
Comentarios
{ FASE DESCRIPTIVA DE
COMENTARIO}
Selectiva alternativa
simple Si condición entonces condicion
S1 True False
S2
...
S3
Finsi
Selectiva alternativa
doble Si condición entonces
S1 condicion
S2 True False
...
S3
Sino
S1
S2
...
S3
Finsi
Selectiva alternativa
múltiple Según_sea expresión hacer
E1 : S1,S2,...Sn Condicion
1 2 3 4 5 6 7 8
E2 : S1,S2,...Sn
E3 : S1,S2,...Sn
.....
EN : S1,S2,...Sn
En_otro_caso
EN : S1,S2,...Sn
Fin_según_sea
Repetitiva mientras
Mientras condición
S1 no Mientras
S2
... Si
S3
Fin_Mientras
Repetitiva repetir
Repetir
S1
S2
...
S3
Hasta condición
No Si
Repetir
Repetitiva para
(desde) Para Var de ValInc Hasta ValFin
[incremento x] hacer Para V de Para
S1 inic fin hacer
S2
...
Sn
Fin_Para
3. Sintaxis y Semántica
El enfoque cambió cuando los investigadores comprobaron que el ser humano procesa
la información con muy poco cálculo, pero con gran cantidad de conocimiento
estructural: es decir, con conocimiento de los objetos relacionados con el problema.
Este nuevo paradigma, que tuvo su expresión práctica con la creación a mediados de
los 70 del primer sistema experto, fue denominado el paradigma del conocimiento: "Un
problema se resuelve según el conocimiento que se tenga de él".
Esa estructura conceptual de modelos está pensada de forma que esos modelos
determinan la forma correcta de los programas y controlan el modo en que pensamos
y formulamos soluciones, y al llegar a la solución, ésta se debe de expresar mediante
un lenguaje de programación. Para que este proceso sea efectivo las características del
lenguaje deben reflejar adecuadamente los modelos conceptuales de ese paradigma.
5. Tipos de Paradigmas
Los que soportan técnicas de programación de bajo nivel (ej.: copia de ficheros
frente estructuras de datos compartidos)
Los que soportan métodos de diseño de algoritmos (ej.: divide y vencerás,
programación dinámica, etc.)
Los que soportan soluciones de programación de alto nivel, como los descritos
en el punto anterior
Floyd también señala lo diferentes que resultan los lenguajes de programación que
soportan cada una de estas categorías de paradigmas. Sólo comentaremos los
paradigmas relacionados con la programación de alto nivel.
Pueden ser de dos tipos básicos: Los que actúan modificando repetidamente la
representación de sus datos (efecto de lado); y los que actúan creando nuevos
datos continuamente (sin efecto de lado).
Los paradigmas con efecto de lado utilizan un modelo en el que las variables están
estrechamente relacionadas con direcciones de la memoria del ordenador.
Cuando se ejecuta el programa, el contenido de estas direcciones se actualiza
repetidamente, pues las variables reciben múltiples asignaciones, y al finalizar
el trabajo, los valores finales de las variables representan el resultado.
El imperativo
El orientado a objetos
Los paradigmas sin efecto de lado no incluyen a los que tradicionalmente son
denominados paradigmas funcionales. Sin embargo es importante distinguir la
solución funcional procedimental de la solución funcional declarativa.
Paradigmas declarativos
Dado que estos paradigmas especifican la solución sin indicar cómo construirla,
en principio eliminan la necesidad de probar que el valor calculado es el valor
solución. En la práctica, mientras que muchos de los paradigmas secuencia de
control y efecto de lado que requiera la noción de estado, las soluciones son
todavía producidas como construcciones más bien que cómo especificaciones.
Por lo que los paradigmas resultantes y los lenguajes que los soportan no son
verdaderamente declarativos, sino pseudodeclarativos. En este grupo se
encuentran: el funcional, el lógico y el de transformación.
Paradigmas demostrativos
Los resultados más satisfactorios de los sistemas de inferencia son en áreas limitadas,
donde el sistema tenía un conocimiento semántico importante de la aplicación.
F(x) = z
Historia
Sus orígenes provienen del Cálculo Lambda (o λ-cálculo), una teoría matemática
elaborada por Alonzo Church como apoyo a sus estudios sobre computabilidad. Un
lenguaje funcional es, a grandes rasgos, un azúcar sintáctico del Cálculo Lambda.
Su obra más conocida es el desarrollo del cálculo lambda, y su trabajo de 1936 que
muestra la existencia de problemas indecidibles. Este trabajo precedió el famoso
trabajo de su alumno Alan Turing sobre el problema de parada que también
demostró la existencia de problemas irresolubles por dispositivos mecánicos. Luego
de revisar la tesis doctoral de Turing, demostraron que el cálculo lambda y la
máquina de Turing utilizada para expresar el problema de parada tenían igual
poder de expresión; posteriormente demostraron que una variedad de procesos
mecánicos alternos para realizar cálculos tenían poder de cómputo equivalente.
Como resultado se postuló la Tesis de Church-Turing.
Entre los más conocidos estudiantes de doctorado de Church están Stephen Kleene,
J. Barkley Rosser, Leon Henkin, John George Kemeny, Michael O. Rabin, Dana
Scott, Simon Kochen, Raymond Smullyan y otros.
El cálculo lambda influenció el diseño del lenguaje Lisp así como los lenguajes de
programación funcional.
Utilidad
Características
Entre los lenguajes funcionales puros, cabe destacar a Haskell y Miranda*. Los
lenguajes funcionales híbridos más conocidos son Lisp, Scheme, Ocaml y Standard
ML (estos dos últimos, descendientes del lenguaje ML).
Entonces sacamos como conclusión que la programación funcional tiene como objeto
imitar las funciones matemáticas lo mas posible. Un lenguaje funcional posee la
propiedad matemática de transparencia referencial, lo que significa que una expresión
representa siempre el mismo valor. Esto permite razonar sobre la ejecución de un
programa y demostrar matemáticamente que es correcto. Las variables de un lenguaje
funcional son como las variables en álgebra. Inicialmente representan un valor
desconocido que, una vez calculado, ya no cambia.
En su forma pura este paradigma sólo soporta sentencias simples que modifican
la memoria y efectúan bifurcaciones condicionales e incondicionales. Incluso
cuando se añade una forma simple de abstracción procedimental, el modelo
permanece básicamente sin cambiar. Los parámetros de los procedimientos son
"alias" de las zonas de memoria, por lo que pueden alterar su valor, y no
retorna ningún tipo de cálculo. La memoria también se puede actualizar
directamente mediante referencias globales.
Las expresiones se han encontrado útiles principalmente porque son simples y jerárquicas y
pueden combinarse uniformemente para construir expresiones más complejas. Sí
pues, las expresiones no sufren influencias de la arquitectura de Von Neumann.
Números Primos
Const n=50;
Var i: 2..n;
j: 2..25;
iprimo: boolean;
Begin
for i:=2 to n do
Begin (* ¿ Es primo i ? *)
j:=2; iprimo:=true;
While iprimo and (j<=i div 2) do
if ( (i mod j) <>0)
then j:=j+1 else iprimo:=false;
(* Si es primo imprime su valor *)
if iprimo then write (i:3)
End
End.
Ordenar
/* Ordena un conjunto de datos leídos desde el dispositivo de entrada,
utilizando el método de la burbuja */
#include
/* función ordenar */
Algunas personas también diferencian la POO sin clases, la cual es llamada a veces
programación basada en objetos.
Origen
diversas clases de objetos, siendo responsable cada clase de objetos de definir sus
propios datos y comportamiento. Fueron refinados más tarde en Smalltalk, que fue
desarrollado en Simula en Xerox PARC (y cuya primera vesión fue escrita sobre
Basic) pero diseñado para ser un sistema completamente dinámico en el cual los
objetos se podrían crear y modificar "en marcha" en lugar de tener un sistema
basado en programas estáticos.
Modelo mental anómalo. Nuestra imagen del mundo se apoya en los seres, a
los que asignamos nombres sustantivos, mientras la programación clásica se
basa en el comportamiento, representado usualmente por verbos.
Es difícil modificar y extender los programas, pues suele haber datos
compartidos por varios subprogramas, que introducen interacciones ocultas
entre ellos.
Es difícil mantener los programas. Casi todos los sistemas informáticos grandes
tienen errores ocultos, que no surgen a la luz hasta después de muchas horas
de funcionamiento.
Es difícil reutilizar los programas. Es prácticamente imposible aprovechar en
una aplicación nueva las subrutinas que se diseñaron para otra.
Por ello, a veces recibe el nombre de programación sin CALL, igual que la
programación estructurada se llama también programación sin GOTO.
Evento: un suceso en el sistema (tal como una interacción del usuario con la
máquina, o un mensaje enviado por un objeto). El sistema maneja el evento
enviando el mensaje adecuado al objeto pertinente.
Mensaje: una comunicación dirigida a un objeto, que le ordena que ejecute uno de
sus métodos con ciertos parámetros asociados al evento que lo generó.
Estado interno: es una propiedad invisible de los objetos, que puede ser
únicamente accedida y alterada por un método del objeto, y que se utiliza para
indicar distintas situaciones posibles para el objeto (o clase de objetos).
contenedor interno del atributo del objeto o de un estado interno, así como la
"función" es un procedimiento interno del método del objeto.
Características de la POO
Herencia: las clases no están aisladas, sino que se relacionan entre sí, formando
una jerarquía de clasificación. Los objetos heredan las propiedades y el
comportamiento de todas las clases a las que pertenecen. La herencia organiza y
facilita el polimorfismo y la encapsulación permitiendo a los objetos ser definidos y
creados como tipos especializados de objetos preexistentes. Estos pueden
compartir (y extender) su comportamiento sin tener que reimplementar su
comportamiento. Esto suele hacerse habitualmente agrupando los objetos en clases
y estas en árboles o enrejados que reflejan un comportamiento común. Cuando un
objeto pertenece a más de una clase se llama herencia múltiple; esta característica
no está soportada por algunos lenguajes (como Java).
ActionScript
Ada 95
C++
C#
Clarion
Delphi
Eiffel
Java
Lexico (en castellano)
Objective-C
Ocaml
PHP 5
PowerBuilder
Python
Ruby
Smalltalk
Visual Basic
Motivación
Campos de aplicación
Fundamentos
La programación lógica permite formalizar hechos del mundo real, por ejemplo:
Ante dicho "programa" es posible establecer hipótesis que no son mas que
preguntas o incógnitas, por ejemplo:
¿ "pichurri" vuela ?
¿ qué mascotas vuelan ?
El estado de cada uno de los semáforos (verde, rojo o ámbar) constituye los
hechos del mundo real. El programa en sí consiste en unas pocas reglas de sentido
común: determinados semáforos no pueden permanecer simultáneamente en
verde, un semáforo solamente puede transitar de verde a ambar y de ambar a
rojo, etc. La hipótesis es el estado en el que deberían estar cada uno de los
semaforos en el siguiente instante de tiempo.
Lenguajes
Para entender la programación dirigida por eventos, podemos oponerla a lo que no es:
mientras en la programación secuencial es el programador el que define cuál va a ser
el flujo del programa, en la programación dirigida por eventos será el propio usuario
--o lo que sea que esté accionando el programa-- el que dirija el flujo del programa.
serie de eventos que generará dicho elemento, como la pulsación de un botón del
ratón sobre él o el redibujado del control.
Un aumento del primero cada lenguaje ensamblador está asociado a una maquina
concreta los valores manipulados ya o son abstractos sino se maneja su representación
binaria en la memoria del computador los elementos clave son:
o modos de direccionamiento
o etiquetas
o subrutinas
o interrupciones
Por otra parte, la Programación Heurística se presenta y utiliza desde diferentes puntos
de vista:
Como técnica de búsqueda para la obtención de metas en problemas no
algorítmicos, o con algoritmos que generan explosión combinatoria (ej. damas.
ajedrez, etc.).
Como un método aproximado de resolución de problemas utilizando funciones
de evaluación de tipo heurístico (ej. algoritmos A*, AO*)