CADP Resumen
CADP Resumen
com/ssofiaavila
Introducción
La informática es una ciencia que estudia el análisis y resolución de problemas utilizando
computadoras.
Para solucionar problemas del mundo real con una computadora, es necesario atravesar una
serie de etapas:
Problema del
Analisis Disenio Implementacion Verificacion
mundo real
1. Análisis: se analiza el problema en su contacto del mundo real. Deben obtenerse los
requerimientos del usuario. El resultado es un modelo preciso del ambiente del
problema y el objetivo a resolver. Se simplifican los requerimientos del problema y el
contexto y datos a usar por el programa en la computadora.
2. Diseño: la descomposición funcional nos ayudara a reducir la complejidad, a distribuir
el trabajo y en el futuro a reutilizar los módulos. Esta etapa involucra la especificación
de algoritmos. Cada uno de los módulos diseñados tienen una función que podemos
traducir en un algoritmo. La elección del algoritmo adecuado es muy importante para
la eficiencia del sist. de software.
3. Involucra escribir los programas, los algoritmos escritos en la etapa de diseño se
convierten en programas escritos e un lenguaje de programación concreto.
4. Una vez que se tienen los programas escritos y depurados de errores de sintaxis, se
debe verificar que su ejecución conduce al resultado deseado usando datos
representativos del problema real.
Concepto de algoritmo
Un algoritmo es una especificación rigurosa de la secuencia de pasos a realizar sobre un
autómata para alcanzar un resultado en tiempo finito.
Concepto de programa
Programa: conjunto de instrucciones u órdenes ejecutables sobre una computadora, que
permite cumplir con una función específica cuyas órdenes se expresan en un lenguaje de
programación concreto.
Programación imperativa
El modelo que siguen los lenguajes de programación para definir y operar la información,
permite asociarlos a un paradigma de programación en particular.
Concepto de dato
DATO= representación de un objeto del mundo real. Los datos permiten modelizar aspectos
del problema que se quieren resolver mediante un programa ejecutable en una computadora.
TIPO DE DATO
es una clase de objetos de datos ligados a un conjunto de operaciones para crearlos y
manipularlos.
Cada tipo de dato se caracteriza por presentar: un rango de valores posibles, conjunto de
operaciones realizables sobre ese tipo, una representación interna.
CLASIFICACION DE DATOS:
El tipo de dato entero es un tipo de dato simple y ordinar que pesa 2 bytes.
El tipo de dato real permite representar números decimales. Es un tipo de dato simple. Pesa 6
bytes.
Operaciones del tipo de dato numérico: +, -, *, división real /, división entera div, módulo mod,
operación de asignación:= y operaciones de comparación = <> < <= =>.
Operaciones permitidas del tipo de dato lógico: asignación :=, negación not, conjunción and,
disyunción or.
Operaciones permitidas del tipo de dato carácter: asignación :=, comparación > => < <=.
• Tipo puntero*
DATO SUBRNGO DEFINIDO POR EL USUARIO: tipo simple y ordinal que consiste de una
sucesión de valores extraídos de un ordinal base. Los ordinales base permitidos son los enteros
y caracteres. La ocupación en memoria se condiciona por el tipo base. Y sus operaciones se
heredan del tipo base.
Facilitan el chequeo de posibles errores ya que permite al lenguaje verificar si los valores
asignados están en el rango establecido y ayudan al mantenimiento del programa.
Compuestos: tipo de dato el cual puede tomar varios valores a la vez que guardan una
relación lógica entre ellos.
github.com/ssofiaavila
Operaciones permitidas: asignación :=, entrada/salida read/write, relación < <= = > =>
CLASIFICACION
Selección Iterativas
Repetitiva for
Selección múltiple: puede ocurrir que en un problema real sea necesario elegir una entre
varias alternativas en función del problema a resolver. Permite realizar distintas acciones (o
bloque de acciones) dependiendo del valor de una variable de tipo ordinal.
Iterativa post condicional: primero ejecuta el bloque de acciones y luego evalúan la condición.
El bloque se ejecutará 1 o más veces, pero SIEMPRE mínimamente una vez.
github.com/ssofiaavila
Modularización
La tarea de modularización implica dividir un problema en partes. Se busca que cada parte
realice una tarea simple y pueda resolverse de manera independiente a las otras tareas.
Al descomponer un problema se debe tener en cuenta que cada sub problema resuelva una
parte “bien” simple, pueda resolverse independientemente, y la solución del sub problema
debe combinarse para resolver el problema original. Cada módulo resuelve un sub problema
particular (define conjunto de acciones y los datos necesarios).
Resultado de la etapa de diseño: cuales son los módulos, objetivo de cada uno, datos propios
de cada uno, datos compartidos con otros módulos, conjunto de acciones para alcanzar ese
objetivo.
Procedimientos y funciones
Se debe elegir el lenguaje de programación para escribir los algoritmos de cada módulo y la
declaración de sus datos. Los lenguajes de programación ofrecen <> opciones para
implementar la modularización.
Definición del módulo: ¿qué hace cuando se ejecuta?, encabezamiento, tipo de modulo,
identificación, datos de comunicación, declaración de tipos, variables, sección de instrucciones
ejecutables.
Invocación del módulo: ¿qué se hace cuando se quiere usar el modulo? Se debe conocer de
qué manera se invoca al módulo para que ejecute sus acciones.
Pascal ofrece procedure y función. Los cuales tienen características comunes pero algunas
particularidades determinan el más adecuado. Se diferencian en el encabezado, la forma de
invocación y lugar donde retorna el flujo de control una vez ejecutado el modulo.
Procedure puede retornar 0,1 o más valores. Puede ocurrir que un módulo Procedure
contenga además otros módulos. Esto se lo denomina procedimiento con módulos anidados.
Function retorna un único valor de tipo simple. Luego ejecutado el modulo, el flujo de control
retorna a la misma instrucción donde fue invocado el modulo.
Variable local al módulo: declaración hecha en un módulo particular y solo podrá ser usada
por ese modulo. Si este módulo contiene a su vez otros módulos, entonces esa variable podría
ser también usada por todos los módulos interiores, si está declarada previo a ellos.
El uso de parámetros significa que los datos compartidos se deben especificar como
parámetros que se transmiten entre módulos. Los datos compartidos se declararán como
parámetros.
Parámetros: datos utilizados para la comunicación entre programa y los módulos, de una
manera explícita. Un parámetro es una variable que representa un dato compartido entre
módulos o entre un módulo y programa principal.
Por lo tanto, el dato compartido se especificará como un parámetro que se transmite entre los
módulos.
PARAMETROS
POR VALOR: datos de entrada al módulo. Es un dato que significa que el modulo recibe
una copia de un valor proveniente de otro modulo o del programa principal. Con ese D el
modulo puede hacer operaciones y/o cálculos, pero fuera del módulo ese dato no reflejará
cambios. Debe ser tratado como una variable local del módulo, puede significar gran
utilización de memoria.
Estructura de datos
Conjunto de variables que poseen relación lógica entre si y que se pueden reconocer como un
todo, bajo un único nombre. Permite representar objetos del mundo real que son más
complejos que un dato simple
CLASIFICACION:
SEGÚN ELEMENTOS
• Homogénea: todos los elementos que la componen pertenecen al mismo tipo de dato
• Heterogénea: los elementos que la componen son de <> tipo de dato.
github.com/ssofiaavila
SEGÚN ACCESO
• Directo: se puede acceder a un elem. en particular sin necesidad de pasar por los
otros.
• Secuencial: para llegar a un elemento, puede ser necesario pasar por sus otros
elementos.
SEGÚN LINEALIDAD
Permite agrupar un conjunto de campos, con igual o diferente tipo de dato, bajo un único
nombre. Debo especificar el nombre de cada campo y tipo de dato, cada campo se puede
referenciar individualmente. Estructura heterogénea, de acceso directo, estática.
Operaciones permitidas: asignación := (solo valida si ambas variables son del mismo tipo de
registro) y acceso a cada campo en particular .; cada campo tiene su tipo de dato por lo tanto
cada campo hereda las operaciones de su tipo base.
Estructura de datos que permite acceder a cada componente a través de índices, que indican
la posición de cada componente dentro de una estructura de datos.
La operación de recorrido total implica analizar TODOS los elementos del vector
La operación de recorrido parcial implica analizar los elementos del vector HASTA encontrar
aquel que cumple con lo pedido. Puede ocurrir que se recorra todo el vector
cantidad de elementos no supere la dimensión física. DimL: cant de elementos del vector,
dimF: dim física del vector, espacio suficiente: verificar dimL<dimF, condición corte: el ingreso
de datos debe tener un fin.
OPERACIÓN INSERTAR UN
ELEMENTO:
OPERACIÓN BORRAR UN
ELEMENTO: consiste en eliminar
un elemento determinado, si es
borrar de una posición
determinada debo verificar que
la posición sea válida. Si es
eliminar un elemento
determinado, hay que verificar
que exista dicho elemento.
Secuencial: comienza desde el principio y se avanza por el vector uno por uno, la
solución debería recorrer el vector y detenerse al encontrar el elemento.
Dicotómica: se aplica para elementos con orden, compara el valor buscado X con el
ubicado en el medio del vector. Si el elemento ubicado al medio es = a X entonces la búsqueda
termina, si no es el buscado, debe quedarse con la mitad del vector que conviene para seguir
la búsqueda.
Aplicado cuando los elementos tienen orden. Caso contrario, debería ordenarse el vector
previamente. Las comparaciones con (1+log2(dimL+1))/2. Cuando dimL crece el número de
comparaciones es log2(dimL+1)/2.
github.com/ssofiaavila
8 Búsqueda dicotómica
Lineal: aplicado para elementos sin orden, excesivo tiempo, comparaciones dimL+1/2, es
ineficiente si el arreglo crece.
Alocación en memoria
Hasta ahora se trabajó con la alocación estática(stack) de la memoria, donde las estructuras
de datos vistas hasta ahora se almacenan estáticamente en la memoria física del ordenador. El
espacio se reserva con anticipación y no cambia durante la ejecución del rograma. Permite una
comprobación de tipos en tiempo de compilación. Pero uno de los inconvenientes es su
rigidez, porque estas estructuras no pueden crecer o decrecer durante la ejecución del
programa.
Un puntero es un tipo de dato simple que contiene la dirección de otro dato. Los punteros
pueden apuntar solamente a variables dinámicas, o sea datos almacenados en heap. Un
puntero ocupa 4 bytes. Cada variable de tipo puntero puede apuntar a un único tipo de dato,
puede apuntar a una variable de cualquier tipo, incluso estructurados.
15 Asignación de punteros
CARACTERISTICAS:
• Compuesto por nodos, los cuales se conectan por medio de enlaces o punteros.
• Cuando necesito agregar un nodo a la estructura, debo solicitar espacio adicional.
github.com/ssofiaavila
OPERACIONES VALIDAS: recorrer una lista, borrar un elemento, crear lista vacía, agregar un
elemento al principio o final, buscar un elemento, insertar un nuevo elemento en una lista
ordenada.
Arreglos Listas
Menoría Almacenados en memoria Almacenados en memoria dinámica
estática
Ocupación Ocupación de memoria Ocupación de memoria resuelta en
resuelta en tiempo de ejecución
compilación
Posiciones Ocupan posiciones Los elementos se disponen
consecutivas de memoria a aleatoriamente en memoria y se
partir de la posición inicial relacionan lógicamente
Acceso El acceso a un elemento es de Debo recorrer desde principio hasta
forma directa llegar a la posición del elemento
buscado
Si no conozco la cantidad de datos que contendrá cada estructura, habría que haber un análisis
github.com/ssofiaavila
Tiempo: referido al tiempo que toma almacenar o recuperar datos. Se tendrá que analizar el
tiempo que toma almacenar o recuperar datos, etc.
Parámetros: analizar cuál es el costo del pasaje de parámetros por valor y por referencia en
arreglos o listas.
OPERACIONES
Corrección y eficiencia
Corrección: técnicas para medir la corrección de un programa
Cuando debemos tomar decisiones, existe siempre una serie de factores que se deben analizar
y buscar optimizar. En algunos casos, debemos buscar optimizar algunos en pos de sacrificar
otros, según contexto y necesidades de la situación
CALIDAD DE UN PROGRAMA:
• Corrección ¿hace lo que se pide?: es el grado en que una aplicación satisface sus
especificaciones y consigue los objetivos esperados por el cliente
• Fiabilidad ¿lo hace de forma fiable todo el tiempo? Grado que se puede esperar que
una aplicación lleve a cabo las operaciones especificadas y con la precisión requerida
• Eficiencia ¿Qué RR de hardware y software necesito?: cantidad de RR de hardware y
software que necesita una aplicación para realizar las operaciones con los tiempos de
respuesta adecuados
• Integridad ¿puedo controlar su uso?: grado con que puede controlarse el acceso al
software o a los datos a personal no autorizado
• Facilidad de uso ¿es fácil y cómodo de manejar? El esfuerzo requerido para aprender
el manejo de una aplicación, trabajar con ella, introducir datos y conseguir resultados
• Facilidad de mantenimiento ¿puedo localizar los fallos?: esfuerzo requerido para
localizar y reparar errores. Vinculado con la modularización y con cuestiones de
legibilidad y documentación.
• Flexibilidad ¿puedo añadir nuevas opciones?: esfuerzo requerido para modificar una
aplicación en funcionamiento
• Facilidad de prueba ¿puedo probar todas las opciones? Esfuerzo requerido para probar
una aplicación de forma que cumpla con lo especificado en los requisitos
github.com/ssofiaavila
Al hacer un mantenimiento, no solo se actualiza el código sino también los comentarios del
programa
Los comentarios intercalados deben hacerse con criterio para contribuir a la claridad del
programa.
Una vez escrita una posible solución es necesario verificar que cumple con el objetivo
propuesto, conocido como corrección del programa.
Un programa es correcto si cumple con las especificaciones del problema a resolver. Por esta
razón, es que la especificación debe ser completa, precisa y no ambigua.
TECNICA DE TESTING
Proceso mediante el cual se proveen evidencias convincentes respecto a que el programa hace
el trabajo esperado.
Durante este proceso es importante analizar las pos condiciones en función de las
precondiciones establecidas en el programa
Las precondiciones junto con las pos condiciones, permiten describir la función que realiza un
programa, sin especificar un algoritmo determinado.
TECNICA DE DEBUGGING
Los errores pueden provenir de varios caminos, por ejemplo: el diseño del programa puede ser
defectuoso, el programa puede usar un algoritmo defectuoso.
TECNICA DE WALKTHROUGHS
Consiste en recorrer el programa ante una audiencia. La lectura del programa a alguna otra
persona provee un buen medio para detectar errores. Esta persona no comparte preconceptos
y está dispuesta a descubrir errores u omisiones. A menudo, cuando no se detecta un error, el
programador trata de probar que no existe, pero mientras lo hace, puede detectar el error, o
bien puede que el otro lo encuentre
EFICIENCIA DE PROGRAMAS
Una vez que se encuentra con una solución correcta es necesario medir cuantos recursos se
utilizan. En particular aquí se analizan: tiempo de ejecución y memoria utilizada.
Para cada problema se pueden tener varias soluciones, algorítmicas correctas. Sin embargo, el
uso de recursos de cada una de esas soluciones puede ser diferente.
EFICIENCIA métrica de calidad de los algoritmos, asociada con una utilización óptima de los
recursos del sistema de cómputo donde se ejecutará el programa, principalmente la memoria
utilizada y el tiempo de ejecución empleado.
Si quiero optimizar los RR de memoria y tiempo, debo preguntarme: cómo calcular el espacio
ocupado por un programa, cómo calcular el tiempo requerido por un programa. En caso de ser
necesario, podré analizar: cómo reducir el espacio ocupado por un programa, cómo reducir el
tiempo de ejecución de un programa.
github.com/ssofiaavila
Para este análisis, se hace un cálculo teórico en el que: considera el número de operaciones
elementales que emplea el algoritmo, considera que una operación elemental usa un tiempo
constante para su ejecución, independiente al tipo de dato con el que trabaja, supone que
cada operación elemental se ejecutara en una unidad de tiempo, supone que una operación
elemental es una asignación, comparación u operación aritmética simple
26 Regla FOR
github.com/ssofiaavila
27 Regla if then/else
Calculo del tiempo de ejecución en una solución modularizada: si se tiene un programa con
módulos, es posible calcular el tiempo de ejecución de <> procesos, uno a la vez, partiendo de
aquellos que no llaman a otros. Debe haber al menos un módulo con esa característica.
Después puede evaluarse el tiempo de ejecución de los procesos que llamaron a los módulos
anteriores y así sucesivamente.